diff --git a/dist/mz-react-round-slider.esm.js b/dist/mz-react-round-slider.esm.js index 7439dd7..4e1a825 100644 --- a/dist/mz-react-round-slider.esm.js +++ b/dist/mz-react-round-slider.esm.js @@ -4,5 +4,5 @@ https://github.com/mzusin/react-round-slider MIT License Copyright (c) 2023-present, Miriam Zusin */ -var Ke=Object.defineProperty;var ce=Object.getOwnPropertySymbols;var We=Object.prototype.hasOwnProperty,Ze=Object.prototype.propertyIsEnumerable;var me=(e,t,n)=>t in e?Ke(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,$=(e,t)=>{for(var n in t||(t={}))We.call(t,n)&&me(e,n,t[n]);if(ce)for(var n of ce(t))Ze.call(t,n)&&me(e,n,t[n]);return e};import{useEffect as le,useRef as $t,useState as ue}from"react";var Qe=Math.pow,I=(e,t=1/0)=>{if(t===1/0)return e;t<0&&(t=0);let n=Qe(10,t);return Math.round(e*n)/n},v=(e,t)=>(e%t+t)%t,S=(e,t,n,o,r)=>(r-o)*(e-t)/(n-t)+o;var ge=e=>!isNaN(parseFloat(e))&&isFinite(e);var de=(e,t=1/0)=>{let n=e*(180/Math.PI);return I(n,t)},C=(e,t=1/0)=>{let n=e*(Math.PI/180);return I(n,t)};var fe=(e,t,n=1/0)=>{let o=[];for(let r=0;rfe(e,t,n);var je=(e,t,n=1/0)=>{let o=[];for(let r=0;rje(e,t,n);var pe=(e,t=1/0)=>{let n=0;for(let o=0;o{let o=fe(e,t);return pe(o,n)};var Je=(e,t=1/0)=>{let n=pe(e),o=[];for(let r=0;rJe(e,t);var M=(e,t,n)=>(t=t%Math.PI*2,[e[0]+Math.cos(t)*n,e[1]+Math.sin(t)*n]);var ee=()=>Math.random().toString(36).substring(2)+new Date().getTime().toString(36);var xe=(e,t,n,o,r,a)=>{let s=t+n*2,i=Math.max(0,o*2-s),c=e*2+s+i,[u,l]=et(e,o,t,n);return{cx:u,cy:l,radius:e,size:c,thickness:t,border:n,startAngleDeg:r,endAngleDeg:a}},et=(e,t,n,o)=>{let r=tt(e,t,n,o),a=I(r/2,2);return[a,a]},tt=(e,t,n,o)=>{let r=n+o*2,a=Math.max(0,t*2-r);return e*2+r+a};var De="#efefef";var ve="#444444";var te="#163a86",ne="#000",re="#a8a8a8";var oe="#000",Te="#5daed2",Se="#97b0bb",Ie="#000";var Ae="#efefef",Ee="#000";var d=(e,t)=>ge(e)?Number(e):t,b=(e,t)=>e==null?t:e,P=(e,t)=>e==null?t:e;var q=(e,t,n)=>(e>t&&(t+=360),n>=e&&n<=t||n+360>=e&&n+360<=t),U=(e,t)=>{t0?360:o},Ce=(e,t,n)=>{e>t&&(t+=360);let o=2*Math.PI*n;e>t&&(t+=360);let r=t-e,a=-(e/360)*o,s=r/360*o,i=o-s;return{strokeDasharray:[s,i].join(" "),strokeOffset:a}};var w=(e,t,n,o,r,a,s)=>{let{left:i,top:c}=e.getBoundingClientRect(),u=[t-i,n-c],l=he(u,[o,r]),h=Math.atan2(l[1]/s,l[0]/a);return h<0&&(h+=2*Math.PI),de(h)},F=(e,t,n,o)=>{o0){let a=Math.round(r);r=e.data[a]}else r=I(r,e.round);return r},nt=(e,t,n,o)=>{let r;if(o0){let a=e.data.findIndex(s=>s===t);r=a===-1?0:a}else r=typeof t!="number"?e.min:t;return v(S(r,e.min,e.max,n,o),360)},rt=(e,t)=>{if(!e||!e.pointers||e.pointers.length<0||!t)return[{id:ee(),index:0,radius:10,angleDeg:v(d(e.pathStartAngle,0),360),bgColor:b(e.pointerBgColor,te),bgColorSelected:b(e.pointerBgColorSelected,ne),bgColorDisabled:b(e.pointerBgColorDisabled,re),border:d(e.pointerBorder,0),borderColor:b(e.pointerBorderColor,oe),disabled:!!e.disabled}];let n=[];for(let o=0;o{let n=rt(e,t);return{pointers:n,maxRadius:ot(n)}},ot=e=>{if(e.length<=0)return 0;let t=-1/0;for(let n of e)t=Math.max(t,Math.max(0,n.radius+n.border/2));return t},Y=(e,t,n,o,r)=>{if(!e||e.length<=0)return null;if(e.length===1)return e[0];let a=S(C(t),0,Math.PI*2,0,Math.PI),s=M([n,o],a,r),i,c=null,u=e.filter(l=>!l.disabled);for(let l of u){let h=S(C(l.angleDeg),0,Math.PI*2,0,Math.PI),f=M([n,o],h,r),g=X(s,f);(i===void 0||g{let s=S(C(n),0,Math.PI*2,0,Math.PI),i=M([o,r],s,a),c=S(C(e),0,Math.PI*2,0,Math.PI),u=M([o,r],c,a),l=S(C(t),0,Math.PI*2,0,Math.PI),h=M([o,r],l,a),f=X(i,u),g=X(i,h);return f<=g?e:t},W=(e,t)=>{if(!e||e.length<=0)return null;let n,o,r=null,a=null;for(let s of e){let i=U(t,s.angleDeg);(n===void 0||io)&&(a=s,o=i)}return r===null||a===null?null:[r,a]},ae=(e,t)=>t===0?0:Math.round(e/t)*t;import{useEffect as se,useState as _e,useRef as at,useCallback as st}from"react";var Z={outline:"none"};import{Fragment as ut,jsx as ie}from"react/jsx-runtime";var it=(e,t,n,o,r)=>e.disabled?r:document.activeElement===t.current&&o||n,lt=e=>{let t=at(null),{pointer:n,svg:o,$svg:r,setPointer:a,data:s,settings:i}=e,{radius:c,angleDeg:u,bgColor:l,bgColorSelected:h,bgColorDisabled:f,border:g,borderColor:m}=e.pointer,{cx:D,cy:x}=o,[A,L]=_e(null),[R,j]=_e("");se(()=>{let p=F(s,n.angleDeg,o.startAngleDeg,o.endAngleDeg);j(p===void 0?"":p.toString())},[s,n.angleDeg,o.startAngleDeg,o.endAngleDeg]),se(()=>{let p=S(C(u),0,Math.PI*2,0,Math.PI),T=M([D,x],p,o.radius);L(T)},[u,D,x,o.radius]);let k=st(p=>{if(!r||i.disabled||n.disabled)return;let T=p.type.indexOf("mouse")!==-1?p.clientX:p.touches[0].clientX,_=p.type.indexOf("mouse")!==-1?p.clientY:p.touches[0].clientY,E=w(r,T,_,o.cx,o.cy,o.radius,o.radius),B;q(o.startAngleDeg,o.endAngleDeg,E)?B=E:B=K(o.startAngleDeg,o.endAngleDeg,n.angleDeg,o.cx,o.cy,o.radius),a(n,B)},[r,n,a,o.cx,o.cy,o.endAngleDeg,o.radius,o.startAngleDeg,i.disabled]),N=()=>{window.removeEventListener("mousemove",k),window.removeEventListener("mouseup",k)},H=p=>{i.disabled||n.disabled||(k(p),window.addEventListener("mousemove",k),window.addEventListener("mouseup",N))},G=p=>{if(!(i.disabled||n.disabled||i.keyboardDisabled))switch(p.key){case"ArrowLeft":{p.preventDefault(),a(n,n.angleDeg+s.stepAngleDeg);break}case"ArrowRight":{p.preventDefault(),a(n,n.angleDeg-s.stepAngleDeg);break}case"ArrowUp":{p.preventDefault(),a(n,n.angleDeg-s.stepAngleDeg);break}case"ArrowDown":{p.preventDefault(),a(n,n.angleDeg+s.stepAngleDeg);break}}};return se(()=>{let p=t.current,T=E=>{i.disabled||n.disabled||(E.preventDefault(),E.stopPropagation(),k(E))},_=E=>{if(i.disabled||n.disabled||i.mousewheelDisabled||document.activeElement!==p)return;E.stopPropagation(),E.preventDefault();let B=E.deltaY<0,J;B?J=n.angleDeg+s.stepAngleDeg:J=n.angleDeg-s.stepAngleDeg,a(n,J)};return p==null||p.addEventListener("touchmove",T,{passive:!1}),document.addEventListener("wheel",_,{passive:!1}),()=>{p==null||p.removeEventListener("touchmove",T),document.removeEventListener("wheel",_)}},[A,k,s.stepAngleDeg,n,a,i.disabled,i.mousewheelDisabled]),ie(ut,{children:A&&ie("g",{ref:t,transform:`translate(${A[0]-c/2}, ${A[1]-c/2})`,role:"slider","aria-disabled":n.disabled?!0:void 0,"aria-valuenow":n.angleDeg,"aria-valuetext":R,"aria-label":n.ariaLabel,"data-type":"pointer","data-angle":n.angleDeg,"data-id":n.id,"data-index":n.index,onMouseDown:H,onKeyDown:G,tabIndex:0,cursor:n.disabled?"default":"pointer",style:Z,children:ie("circle",{cx:c/2,cy:c/2,r:c,fill:it(n,t,l,h,f),strokeWidth:g,stroke:m})})})},Le=lt;import{Fragment as mt,jsx as ke}from"react/jsx-runtime";var ct=e=>{let{pointers:t,settings:n,svg:o,$svg:r,setPointer:a,data:s}=e;return ke(mt,{children:t.pointers.map(i=>ke(Le,{pointer:i,svg:o,settings:n,$svg:r,setPointer:a,data:s},i.id))})},we=ct;var Oe=e=>{let t=d(e.min,0),n=d(e.max,100),o=d(e.step,1),r=d(e.arrowStep,1),a=d(e.round,0),s=e.data||[];if(s.length>0){let f=s.findIndex(m=>m===t),g=s.findIndex(m=>m===n);t=f===-1?0:f,n=g===-1?s.length:g}else t>n&&(t=n+100);let i=d(e.pathStartAngle,0),c=d(e.pathEndAngle,360),u=v(i,360)===v(c,360),l=o*360/(n-t),h=r*360/(n-t);return{min:t,max:n,round:a,data:s,stepAngleDeg:l,arrowStepAngleDeg:h,isClosedShape:u}};import{useCallback as pt,useEffect as bt,useRef as xt,useState as Dt}from"react";var Fe=(e,t,n,o,r,a)=>{if(!e.pointers||e.pointers.length<=0)return null;let s={radius:t,cx:n,cy:o,startAngleDeg:r,endAngleDeg:r,strokeDasharray:[0,0],strokeOffset:0};if(e.pointers.length===1)s.startAngleDeg=r,s.endAngleDeg=e.pointers[0].angleDeg;else{let m=W(e.pointers,r);if(!m)return null;let[D,x]=m;s.startAngleDeg=D.angleDeg,s.endAngleDeg=x.angleDeg}let i=U(r,a);s.startAngleDeg>s.endAngleDeg&&(s.endAngleDeg+=360);let c=U(s.startAngleDeg,s.endAngleDeg);c>i&&(c=360-c,[s.startAngleDeg,s.endAngleDeg]=[s.endAngleDeg,s.startAngleDeg]);let l=2*Math.PI*t,h=-(s.startAngleDeg/360)*l,f=c/360*l,g=l-f;return s.strokeDasharray=[f,g],s.strokeOffset=h,s};import{Fragment as Tt,jsx as Ne}from"react/jsx-runtime";var vt=e=>{let{settings:t,pointers:n,$svg:o,svg:r,data:a,setPointer:s}=e,[i,c]=Dt(null),u=xt();bt(()=>{c(Fe(n,r.radius,r.cx,r.cy,r.startAngleDeg,r.endAngleDeg))},[n,r.radius,r.cx,r.cy,r.startAngleDeg,r.endAngleDeg]);let l=m=>{if(!o||t.disabled)return;let D=w(o,m.clientX,m.clientY,r.cx,r.cy,r.radius,r.radius),x=Y(n.pointers,D,r.cx,r.cy,r.radius);x&&s(x,D)},h=pt(m=>{if(!o||t.disabled||!t.rangeDragging)return;let D=W(n.pointers,r.startAngleDeg);if(!D)return;let[x,A]=D,L=w(o,m.clientX,m.clientY,r.cx,r.cy,r.radius,r.radius);if(u.current===void 0){u.current=L;return}let R=L-u.current;R===0||Math.abs(R){window.removeEventListener("mousemove",h),window.removeEventListener("mouseup",h),u.current=void 0},g=m=>{!t.rangeDragging||t.disabled||n.pointers.length<=1||(h(m),window.addEventListener("mousemove",h),window.addEventListener("mouseup",f))};return Ne(Tt,{children:!P(t.hideConnection,!1)&&i&&Ne("circle",{"data-type":"connection",cx:i.cx,cy:i.cy,r:i.radius,strokeDasharray:i.strokeDasharray.join(" "),strokeDashoffset:i.strokeOffset,stroke:t.disabled?b(t.connectionBgColorDisabled,Se):b(t.connectionBgColor,Te),strokeWidth:r.thickness+1,fill:"none",shapeRendering:"geometricPrecision",strokeLinecap:"round",cursor:t.disabled?"default":"pointer",onClick:l,onMouseDown:g})})},Be=vt;import{useEffect as It,useState as At}from"react";import{Fragment as Ct,jsx as Ue}from"react/jsx-runtime";var Et=e=>{let{settings:t,pointers:n,svg:o,data:r}=e,{cx:a,cy:s}=o,[i,c]=At("");It(()=>{let l=n.pointers.map(f=>F(r,f.angleDeg,o.startAngleDeg,o.endAngleDeg));l.sort((f,g)=>f.toString().localeCompare(g.toString(),"en",{numeric:!0}));let h=l.map(f=>`${t.textPrefix||""}${f}${t.textSuffix||""}`);c(h.join(" "))},[r,n.pointers,o.startAngleDeg,o.endAngleDeg,t.textPrefix,t.textSuffix]);let u=P(t.hideText,!1);return Ue(Ct,{children:!u&&Ue("text",{x:a,y:s,fill:b(t.textColor,Ie),fontSize:d(t.textFontSize,16),fontFamily:t.textFontFamily,style:{userSelect:"none"},textAnchor:"middle",children:i})})},Ve=Et;import{useEffect as $e,useState as ze,Fragment as kt}from"react";var He=(e,t)=>{let n=d(e.ticsCount,0);n||(t.data&&t.data.length>0?n=t.data.length:n=t.max);let o=d(e.ticksHeight,20);return{ticksCount:n,disableTicks:P(e.disableTicks,!1),ticksWidth:d(e.ticksWidth,3),ticksHeight:o,longerTicksHeight:d(e.longerTicksHeight,o*2),ticksDistanceToPanel:d(e.ticksDistanceToPanel,0),tickValuesDistance:d(e.tickValuesDistance,15),ticksColor:b(e.ticksColor,Ae),tickValuesColor:b(e.tickValuesColor,Ee),tickValuesFontSize:d(e.tickValuesFontSize,12),ticksGroupSize:d(e.ticksGroupSize,10),longerTickValuesOnly:P(e.longerTickValuesOnly,!0),showTickValues:P(e.showTickValues,!0)}},Ge=(e,t,n,o,r,a)=>{let s=[],i=Math.abs(o-n),c=t===0?0:i/t,u=t;a.isClosedShape||u++;for(let l=0;l0){let _=Math.round(T);T=a.data[_]}else T=I(T,a.round);N=(T!=null?T:"").toString()}let H=0,G=0,p=N!==void 0;if(p){let T=d(x+e.tickValuesDistance,x*1.5),_=z(A,T);H=g+_[0],G=m+_[1]}s.push({x:g,y:m,x1:j,y1:k,textX:H,textY:G,isLonger:D,tickValue:N,showText:p})}return s};import{Fragment as Ot,jsx as Q,jsxs as yt}from"react/jsx-runtime";var wt=e=>{let{settings:t,svg:n,data:o}=e,[r,a]=ze(null),[s,i]=ze([]);return $e(()=>{a(He(t,o))},[t,o]),$e(()=>{if(!r)return;let c=n.endAngleDeg;c{let{x:l,y:h,x1:f,y1:g,textX:m,textY:D,showText:x}=c;return yt(kt,{children:[Q("line",{x1:l,y1:h,x2:f,y2:g,strokeWidth:r.ticksWidth,stroke:r.ticksColor}),x&&Q("text",{x:m,y:D,textAnchor:"middle",dominantBaseline:"middle",fill:r.tickValuesColor,fontSize:r.tickValuesFontSize,fontFamily:t.tickValuesFontFamily,style:{userSelect:"none"},children:c.tickValue})]},u)})})})},Xe=wt;import{useEffect as Ft,useState as Nt}from"react";import{jsx as qe,jsxs as Ut}from"react/jsx-runtime";var Bt=e=>{let{settings:t,pointers:n,$svg:o,svg:r,setPointer:a}=e,[s,i]=Nt({strokeDasharray:"0 1000000",strokeOffset:0});return Ft(()=>{i(Ce(r.startAngleDeg,r.endAngleDeg,r.radius))},[r.startAngleDeg,r.endAngleDeg,r.radius]),Ut("g",{onClick:u=>{if(!o||t.disabled)return;let l=w(o,u.clientX,u.clientY,r.cx,r.cy,r.radius,r.radius),h=Y(n.pointers,l,r.cx,r.cy,r.radius);h&&a(h,l)},children:[r.border>0&&qe("circle",{strokeDasharray:s.strokeDasharray,strokeDashoffset:s.strokeOffset,cx:r.cx,cy:r.cy,r:r.radius,stroke:b(t.pathBorderColor,ve),strokeWidth:r.thickness+r.border*2,fill:"none",shapeRendering:"geometricPrecision",strokeLinecap:"round",cursor:"pointer","data-type":"path-border"}),qe("circle",{strokeDasharray:s.strokeDasharray,strokeDashoffset:s.strokeOffset,cx:r.cx,cy:r.cy,r:r.radius,stroke:b(t.pathBgColor,De),strokeWidth:r.thickness,fill:"none",shapeRendering:"geometricPrecision",strokeLinecap:"round",cursor:"pointer","data-type":"path"})]})},Ye=Bt;import{Fragment as Xt,jsx as y,jsxs as zt}from"react/jsx-runtime";var Ur=e=>{let[t,n]=ue(null),[o,r]=ue(null),[a,s]=ue(null),i=$t(null);le(()=>{n(Oe(e))},[e]),le(()=>{s(Re(e,t))},[e,t]),le(()=>{if(!a)return;let u=d(e.pathStartAngle,0),l=d(e.pathEndAngle,360);l<=u&&(l+=360),r(xe(d(e.pathRadius,150),d(e.pathThickness,5),d(e.pathBorder,0),a.maxRadius,u,l))},[e.pathRadius,e.pathThickness,e.pathBorder,e.pathStartAngle,e.pathEndAngle,a]);let c=(u,l)=>{if(e.disabled||!a.pointers||!u||u.disabled||(l=ae(l,t.stepAngleDeg),t.isClosedShape&&v(l,360)===v(o.endAngleDeg,360)&&(l=o.startAngleDeg),u.angleDeg===l))return;if(!e.pointersOverlap){let g,m;if(t.isClosedShape){let D=v(u.index-1,a.pointers.length),x=v(u.index+1,a.pointers.length);g=a.pointers[D].angleDeg,m=a.pointers[x].angleDeg}else g=u.index===0?o.startAngleDeg:a.pointers[u.index-1].angleDeg,m=u.index===a.pointers.length-1?o.endAngleDeg:a.pointers[u.index+1].angleDeg;m<=g&&(m+=360),q(g,m,l)||(l=K(g,m,l,o.cx,o.cy,o.radius))}if(u.angleDeg===l)return;let f=$({},a);if(f.pointers=[...a.pointers],f.pointers[u.index].angleDeg=l,a.pointers=f.pointers,s(f),typeof e.onChange=="function"){let g=f.pointers.map(m=>F(t,m.angleDeg,o.startAngleDeg,o.endAngleDeg));e.onChange(g)}};return y(Xt,{children:o&&zt("svg",{ref:i,xmlns:"http://www.w3.org/2000/svg",width:o.size,height:o.size,tabIndex:0,focusable:!0,"aria-disabled":e.disabled?!0:void 0,style:Z,children:[e.SvgDefs&&y("defs",{children:e.SvgDefs}),y(Xe,{settings:e,svg:o,data:t}),y(Ye,{settings:e,pointers:a,svg:o,$svg:i.current,setPointer:c}),y(Be,{settings:e,pointers:a,svg:o,$svg:i.current,data:t,setPointer:c}),y(we,{settings:e,pointers:a,svg:o,$svg:i.current,setPointer:c,data:t}),y(Ve,{settings:e,pointers:a,svg:o,data:t})]})})};export{Ur as RoundSlider}; +var Ke=Object.defineProperty;var ce=Object.getOwnPropertySymbols;var We=Object.prototype.hasOwnProperty,Ze=Object.prototype.propertyIsEnumerable;var me=(e,t,n)=>t in e?Ke(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,$=(e,t)=>{for(var n in t||(t={}))We.call(t,n)&&me(e,n,t[n]);if(ce)for(var n of ce(t))Ze.call(t,n)&&me(e,n,t[n]);return e};import{useEffect as le,useRef as zt,useState as ue}from"react";var Qe=Math.pow,I=(e,t=1/0)=>{if(t===1/0)return e;t<0&&(t=0);let n=Qe(10,t);return Math.round(e*n)/n},v=(e,t)=>(e%t+t)%t,S=(e,t,n,o,r)=>(r-o)*(e-t)/(n-t)+o;var ge=e=>!isNaN(parseFloat(e))&&isFinite(e);var de=(e,t=1/0)=>{let n=e*(180/Math.PI);return I(n,t)},C=(e,t=1/0)=>{let n=e*(Math.PI/180);return I(n,t)};var fe=(e,t,n=1/0)=>{let o=[];for(let r=0;rfe(e,t,n);var je=(e,t,n=1/0)=>{let o=[];for(let r=0;rje(e,t,n);var pe=(e,t=1/0)=>{let n=0;for(let o=0;o{let o=fe(e,t);return pe(o,n)};var Je=(e,t=1/0)=>{let n=pe(e),o=[];for(let r=0;rJe(e,t);var M=(e,t,n)=>(t=t%Math.PI*2,[e[0]+Math.cos(t)*n,e[1]+Math.sin(t)*n]);var ee=()=>Math.random().toString(36).substring(2)+new Date().getTime().toString(36);var xe=(e,t,n,o,r,a)=>{let s=t+n*2,i=Math.max(0,o*2-s),c=e*2+s+i,[u,l]=et(e,o,t,n);return{cx:u,cy:l,radius:e,size:c,thickness:t,border:n,startAngleDeg:r,endAngleDeg:a}},et=(e,t,n,o)=>{let r=tt(e,t,n,o),a=I(r/2,2);return[a,a]},tt=(e,t,n,o)=>{let r=n+o*2,a=Math.max(0,t*2-r);return e*2+r+a};var De="#efefef";var ve="#444444";var te="#163a86",ne="#000",re="#a8a8a8";var oe="#000",Te="#5daed2",Se="#97b0bb",Ie="#000";var Ae="#efefef",Ee="#000";var d=(e,t)=>ge(e)?Number(e):t,x=(e,t)=>e==null?t:e,P=(e,t)=>e==null?t:e;var q=(e,t,n)=>(e>t&&(t+=360),n>=e&&n<=t||n+360>=e&&n+360<=t),U=(e,t)=>{t0?360:o},Ce=(e,t,n)=>{e>t&&(t+=360);let o=2*Math.PI*n;e>t&&(t+=360);let r=t-e,a=-(e/360)*o,s=r/360*o,i=o-s;return{strokeDasharray:[s,i].join(" "),strokeOffset:a}};var w=(e,t,n,o,r,a,s)=>{let{left:i,top:c}=e.getBoundingClientRect(),u=[t-i,n-c],l=he(u,[o,r]),h=Math.atan2(l[1]/s,l[0]/a);return h<0&&(h+=2*Math.PI),de(h)},F=(e,t,n,o)=>{o0){let a=Math.round(r);r=e.data[a]}else r=I(r,e.round);return r},nt=(e,t,n,o)=>{let r;if(o0){let a=e.data.findIndex(s=>s===t);r=a===-1?0:a}else r=typeof t!="number"?e.min:t;return v(S(r,e.min,e.max,n,o),360)},rt=(e,t)=>{if(!e||!e.pointers||e.pointers.length<0||!t)return[{id:ee(),index:0,radius:d(e.pointerRadius,10),angleDeg:v(d(e.pathStartAngle,0),360),bgColor:x(e.pointerBgColor,te),bgColorSelected:x(e.pointerBgColorSelected,ne),bgColorDisabled:x(e.pointerBgColorDisabled,re),border:d(e.pointerBorder,0),borderColor:x(e.pointerBorderColor,oe),disabled:!!e.disabled}];let n=[];for(let o=0;o{let n=rt(e,t);return{pointers:n,maxRadius:ot(n)}},ot=e=>{if(e.length<=0)return 0;let t=-1/0;for(let n of e)t=Math.max(t,Math.max(0,n.radius+n.border/2));return t},Y=(e,t,n,o,r)=>{if(!e||e.length<=0)return null;if(e.length===1)return e[0];let a=S(C(t),0,Math.PI*2,0,Math.PI),s=M([n,o],a,r),i,c=null,u=e.filter(l=>!l.disabled);for(let l of u){let h=S(C(l.angleDeg),0,Math.PI*2,0,Math.PI),f=M([n,o],h,r),g=X(s,f);(i===void 0||g{let s=S(C(n),0,Math.PI*2,0,Math.PI),i=M([o,r],s,a),c=S(C(e),0,Math.PI*2,0,Math.PI),u=M([o,r],c,a),l=S(C(t),0,Math.PI*2,0,Math.PI),h=M([o,r],l,a),f=X(i,u),g=X(i,h);return f<=g?e:t},W=(e,t)=>{if(!e||e.length<=0)return null;let n,o,r=null,a=null;for(let s of e){let i=U(t,s.angleDeg);(n===void 0||io)&&(a=s,o=i)}return r===null||a===null?null:[r,a]},ae=(e,t)=>t===0?0:Math.round(e/t)*t;import{useEffect as se,useState as _e,useRef as at,useCallback as st}from"react";var Z={outline:"none"};import{Fragment as ct,jsx as ie,jsxs as ut}from"react/jsx-runtime";var it=(e,t,n,o,r)=>e.disabled?r:document.activeElement===t.current&&o||n,lt=e=>{let t=at(null),{pointer:n,svg:o,$svg:r,setPointer:a,data:s,settings:i}=e,{radius:c,angleDeg:u,bgColor:l,bgColorSelected:h,bgColorDisabled:f,border:g,borderColor:m}=e.pointer,{cx:b,cy:D}=o,[A,L]=_e(null),[R,j]=_e("");se(()=>{let p=F(s,n.angleDeg,o.startAngleDeg,o.endAngleDeg);j(p===void 0?"":p.toString())},[s,n.angleDeg,o.startAngleDeg,o.endAngleDeg]),se(()=>{let p=S(C(u),0,Math.PI*2,0,Math.PI),T=M([b,D],p,o.radius);L(T)},[u,b,D,o.radius]);let k=st(p=>{if(!r||i.disabled||n.disabled)return;let T=p.type.indexOf("mouse")!==-1?p.clientX:p.touches[0].clientX,_=p.type.indexOf("mouse")!==-1?p.clientY:p.touches[0].clientY,E=w(r,T,_,o.cx,o.cy,o.radius,o.radius),B;q(o.startAngleDeg,o.endAngleDeg,E)?B=E:B=K(o.startAngleDeg,o.endAngleDeg,n.angleDeg,o.cx,o.cy,o.radius),a(n,B)},[r,n,a,o.cx,o.cy,o.endAngleDeg,o.radius,o.startAngleDeg,i.disabled]),N=()=>{window.removeEventListener("mousemove",k),window.removeEventListener("mouseup",k)},H=p=>{i.disabled||n.disabled||(k(p),window.addEventListener("mousemove",k),window.addEventListener("mouseup",N))},G=p=>{if(!(i.disabled||n.disabled||i.keyboardDisabled))switch(p.key){case"ArrowLeft":{p.preventDefault(),a(n,n.angleDeg+s.stepAngleDeg);break}case"ArrowRight":{p.preventDefault(),a(n,n.angleDeg-s.stepAngleDeg);break}case"ArrowUp":{p.preventDefault(),a(n,n.angleDeg-s.stepAngleDeg);break}case"ArrowDown":{p.preventDefault(),a(n,n.angleDeg+s.stepAngleDeg);break}}};return se(()=>{let p=t.current,T=E=>{i.disabled||n.disabled||(E.preventDefault(),E.stopPropagation(),k(E))},_=E=>{if(i.disabled||n.disabled||i.mousewheelDisabled||document.activeElement!==p)return;E.stopPropagation(),E.preventDefault();let B=E.deltaY<0,J;B?J=n.angleDeg+s.stepAngleDeg:J=n.angleDeg-s.stepAngleDeg,a(n,J)};return p==null||p.addEventListener("touchmove",T,{passive:!1}),document.addEventListener("wheel",_,{passive:!1}),()=>{p==null||p.removeEventListener("touchmove",T),document.removeEventListener("wheel",_)}},[A,k,s.stepAngleDeg,n,a,i.disabled,i.mousewheelDisabled]),ie(ct,{children:A&&ut("g",{ref:t,transform:`translate(${A[0]-c/2}, ${A[1]-c/2})`,role:"slider","aria-disabled":n.disabled?!0:void 0,"aria-valuenow":n.angleDeg,"aria-valuetext":R,"aria-label":n.ariaLabel,"data-type":"pointer","data-angle":n.angleDeg,"data-id":n.id,"data-index":n.index,onMouseDown:H,onKeyDown:G,tabIndex:0,cursor:n.disabled?"default":"pointer",style:Z,children:[!i.pointerSVG&&ie("circle",{cx:c/2,cy:c/2,r:c,fill:it(n,t,l,h,f),strokeWidth:g,stroke:m}),i.pointerSVG&&ie("g",{children:i.pointerSVG})]})})},Le=lt;import{Fragment as gt,jsx as ke}from"react/jsx-runtime";var mt=e=>{let{pointers:t,settings:n,svg:o,$svg:r,setPointer:a,data:s}=e;return ke(gt,{children:t.pointers.map(i=>ke(Le,{pointer:i,svg:o,settings:n,$svg:r,setPointer:a,data:s},i.id))})},we=mt;var Oe=e=>{let t=d(e.min,0),n=d(e.max,100),o=d(e.step,1),r=d(e.arrowStep,1),a=d(e.round,0),s=e.data||[];if(s.length>0){let f=s.findIndex(m=>m===t),g=s.findIndex(m=>m===n);t=f===-1?0:f,n=g===-1?s.length:g}else t>n&&(t=n+100);let i=d(e.pathStartAngle,0),c=d(e.pathEndAngle,360),u=v(i,360)===v(c,360),l=o*360/(n-t),h=r*360/(n-t);return{min:t,max:n,round:a,data:s,stepAngleDeg:l,arrowStepAngleDeg:h,isClosedShape:u}};import{useCallback as bt,useEffect as xt,useRef as Dt,useState as vt}from"react";var Fe=(e,t,n,o,r,a)=>{if(!e.pointers||e.pointers.length<=0)return null;let s={radius:t,cx:n,cy:o,startAngleDeg:r,endAngleDeg:r,strokeDasharray:[0,0],strokeOffset:0};if(e.pointers.length===1)s.startAngleDeg=r,s.endAngleDeg=e.pointers[0].angleDeg;else{let m=W(e.pointers,r);if(!m)return null;let[b,D]=m;s.startAngleDeg=b.angleDeg,s.endAngleDeg=D.angleDeg}let i=U(r,a);s.startAngleDeg>s.endAngleDeg&&(s.endAngleDeg+=360);let c=U(s.startAngleDeg,s.endAngleDeg);c>i&&(c=360-c,[s.startAngleDeg,s.endAngleDeg]=[s.endAngleDeg,s.startAngleDeg]);let l=2*Math.PI*t,h=-(s.startAngleDeg/360)*l,f=c/360*l,g=l-f;return s.strokeDasharray=[f,g],s.strokeOffset=h,s};import{Fragment as St,jsx as Ne}from"react/jsx-runtime";var Tt=e=>{let{settings:t,pointers:n,$svg:o,svg:r,data:a,setPointer:s}=e,[i,c]=vt(null),u=Dt();xt(()=>{c(Fe(n,r.radius,r.cx,r.cy,r.startAngleDeg,r.endAngleDeg))},[n,r.radius,r.cx,r.cy,r.startAngleDeg,r.endAngleDeg]);let l=m=>{if(!o||t.disabled)return;let b=w(o,m.clientX,m.clientY,r.cx,r.cy,r.radius,r.radius),D=Y(n.pointers,b,r.cx,r.cy,r.radius);D&&s(D,b)},h=bt(m=>{if(!o||t.disabled||!t.rangeDragging)return;let b=W(n.pointers,r.startAngleDeg);if(!b)return;let[D,A]=b,L=w(o,m.clientX,m.clientY,r.cx,r.cy,r.radius,r.radius);if(u.current===void 0){u.current=L;return}let R=L-u.current;R===0||Math.abs(R){window.removeEventListener("mousemove",h),window.removeEventListener("mouseup",h),u.current=void 0},g=m=>{!t.rangeDragging||t.disabled||n.pointers.length<=1||(h(m),window.addEventListener("mousemove",h),window.addEventListener("mouseup",f))};return Ne(St,{children:!P(t.hideConnection,!1)&&i&&Ne("circle",{"data-type":"connection",cx:i.cx,cy:i.cy,r:i.radius,strokeDasharray:i.strokeDasharray.join(" "),strokeDashoffset:i.strokeOffset,stroke:t.disabled?x(t.connectionBgColorDisabled,Se):x(t.connectionBgColor,Te),strokeWidth:r.thickness+1,fill:"none",shapeRendering:"geometricPrecision",strokeLinecap:"round",cursor:t.disabled?"default":"pointer",onClick:l,onMouseDown:g})})},Be=Tt;import{useEffect as At,useState as Et}from"react";import{Fragment as Mt,jsx as Ue}from"react/jsx-runtime";var Ct=e=>{let{settings:t,pointers:n,svg:o,data:r}=e,{cx:a,cy:s}=o,[i,c]=Et("");At(()=>{let l=n.pointers.map(f=>F(r,f.angleDeg,o.startAngleDeg,o.endAngleDeg));l.sort((f,g)=>f.toString().localeCompare(g.toString(),"en",{numeric:!0}));let h=l.map(f=>`${t.textPrefix||""}${f}${t.textSuffix||""}`);c(h.join(" "))},[r,n.pointers,o.startAngleDeg,o.endAngleDeg,t.textPrefix,t.textSuffix]);let u=P(t.hideText,!1);return Ue(Mt,{children:!u&&Ue("text",{x:a,y:s,fill:x(t.textColor,Ie),fontSize:d(t.textFontSize,16),fontFamily:t.textFontFamily,style:{userSelect:"none"},textAnchor:"middle",children:i})})},Ve=Ct;import{useEffect as $e,useState as ze,Fragment as wt}from"react";var He=(e,t)=>{let n=d(e.ticsCount,0);n||(t.data&&t.data.length>0?n=t.data.length:n=t.max);let o=d(e.ticksHeight,20);return{ticksCount:n,disableTicks:P(e.disableTicks,!1),ticksWidth:d(e.ticksWidth,3),ticksHeight:o,longerTicksHeight:d(e.longerTicksHeight,o*2),ticksDistanceToPanel:d(e.ticksDistanceToPanel,0),tickValuesDistance:d(e.tickValuesDistance,15),ticksColor:x(e.ticksColor,Ae),tickValuesColor:x(e.tickValuesColor,Ee),tickValuesFontSize:d(e.tickValuesFontSize,12),ticksGroupSize:d(e.ticksGroupSize,10),longerTickValuesOnly:P(e.longerTickValuesOnly,!0),showTickValues:P(e.showTickValues,!0)}},Ge=(e,t,n,o,r,a)=>{let s=[],i=Math.abs(o-n),c=t===0?0:i/t,u=t;a.isClosedShape||u++;for(let l=0;l0){let _=Math.round(T);T=a.data[_]}else T=I(T,a.round);N=(T!=null?T:"").toString()}let H=0,G=0,p=N!==void 0;if(p){let T=d(D+e.tickValuesDistance,D*1.5),_=z(A,T);H=g+_[0],G=m+_[1]}s.push({x:g,y:m,x1:j,y1:k,textX:H,textY:G,isLonger:b,tickValue:N,showText:p})}return s};import{Fragment as Ft,jsx as Q,jsxs as Ot}from"react/jsx-runtime";var yt=e=>{let{settings:t,svg:n,data:o}=e,[r,a]=ze(null),[s,i]=ze([]);return $e(()=>{a(He(t,o))},[t,o]),$e(()=>{if(!r)return;let c=n.endAngleDeg;c{let{x:l,y:h,x1:f,y1:g,textX:m,textY:b,showText:D}=c;return Ot(wt,{children:[Q("line",{x1:l,y1:h,x2:f,y2:g,strokeWidth:r.ticksWidth,stroke:r.ticksColor}),D&&Q("text",{x:m,y:b,textAnchor:"middle",dominantBaseline:"middle",fill:r.tickValuesColor,fontSize:r.tickValuesFontSize,fontFamily:t.tickValuesFontFamily,style:{userSelect:"none"},children:c.tickValue})]},u)})})})},Xe=yt;import{useEffect as Nt,useState as Bt}from"react";import{jsx as qe,jsxs as Vt}from"react/jsx-runtime";var Ut=e=>{let{settings:t,pointers:n,$svg:o,svg:r,setPointer:a}=e,[s,i]=Bt({strokeDasharray:"0 1000000",strokeOffset:0});return Nt(()=>{i(Ce(r.startAngleDeg,r.endAngleDeg,r.radius))},[r.startAngleDeg,r.endAngleDeg,r.radius]),Vt("g",{onClick:u=>{if(!o||t.disabled)return;let l=w(o,u.clientX,u.clientY,r.cx,r.cy,r.radius,r.radius),h=Y(n.pointers,l,r.cx,r.cy,r.radius);h&&a(h,l)},children:[r.border>0&&qe("circle",{strokeDasharray:s.strokeDasharray,strokeDashoffset:s.strokeOffset,cx:r.cx,cy:r.cy,r:r.radius,stroke:x(t.pathBorderColor,ve),strokeWidth:r.thickness+r.border*2,fill:"none",shapeRendering:"geometricPrecision",strokeLinecap:"round",cursor:"pointer","data-type":"path-border"}),qe("circle",{strokeDasharray:s.strokeDasharray,strokeDashoffset:s.strokeOffset,cx:r.cx,cy:r.cy,r:r.radius,stroke:x(t.pathBgColor,De),strokeWidth:r.thickness,fill:"none",shapeRendering:"geometricPrecision",strokeLinecap:"round",cursor:"pointer","data-type":"path"})]})},Ye=Ut;import{Fragment as qt,jsx as y,jsxs as Xt}from"react/jsx-runtime";var Vr=e=>{let[t,n]=ue(null),[o,r]=ue(null),[a,s]=ue(null),i=zt(null);le(()=>{n(Oe(e))},[e]),le(()=>{s(Re(e,t))},[e,t]),le(()=>{if(!a)return;let u=d(e.pathStartAngle,0),l=d(e.pathEndAngle,360);l<=u&&(l+=360),r(xe(d(e.pathRadius,150),d(e.pathThickness,5),d(e.pathBorder,0),a.maxRadius,u,l))},[e.pathRadius,e.pathThickness,e.pathBorder,e.pathStartAngle,e.pathEndAngle,a]);let c=(u,l)=>{if(e.disabled||!a.pointers||!u||u.disabled||(l=ae(l,t.stepAngleDeg),t.isClosedShape&&v(l,360)===v(o.endAngleDeg,360)&&(l=o.startAngleDeg),u.angleDeg===l))return;if(!e.pointersOverlap){let g,m;if(t.isClosedShape){let b=v(u.index-1,a.pointers.length),D=v(u.index+1,a.pointers.length);g=a.pointers[b].angleDeg,m=a.pointers[D].angleDeg}else g=u.index===0?o.startAngleDeg:a.pointers[u.index-1].angleDeg,m=u.index===a.pointers.length-1?o.endAngleDeg:a.pointers[u.index+1].angleDeg;m<=g&&(m+=360),q(g,m,l)||(l=K(g,m,l,o.cx,o.cy,o.radius))}if(u.angleDeg===l)return;let f=$({},a);if(f.pointers=[...a.pointers],f.pointers[u.index].angleDeg=l,a.pointers=f.pointers,s(f),typeof e.onChange=="function"){let g=f.pointers.map(m=>F(t,m.angleDeg,o.startAngleDeg,o.endAngleDeg));e.onChange(g)}};return y(qt,{children:o&&Xt("svg",{ref:i,xmlns:"http://www.w3.org/2000/svg",width:o.size,height:o.size,tabIndex:0,focusable:!0,"aria-disabled":e.disabled?!0:void 0,style:Z,children:[e.SvgDefs&&y("defs",{children:e.SvgDefs}),y(Xe,{settings:e,svg:o,data:t}),y(Ye,{settings:e,pointers:a,svg:o,$svg:i.current,setPointer:c}),y(Be,{settings:e,pointers:a,svg:o,$svg:i.current,data:t,setPointer:c}),y(we,{settings:e,pointers:a,svg:o,$svg:i.current,setPointer:c,data:t}),y(Ve,{settings:e,pointers:a,svg:o,data:t})]})})};export{Vr as RoundSlider}; //# sourceMappingURL=mz-react-round-slider.esm.js.map diff --git a/dist/mz-react-round-slider.esm.js.map b/dist/mz-react-round-slider.esm.js.map index fcb13c0..9eb7c73 100644 --- a/dist/mz-react-round-slider.esm.js.map +++ b/dist/mz-react-round-slider.esm.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../src/core/index.tsx", "../node_modules/mz-math/src/main/format.ts", "../node_modules/mz-math/src/main/other.ts", "../node_modules/mz-math/src/main/angle.ts", "../node_modules/mz-math/src/main/linear-algebra/vector.ts", "../node_modules/mz-math/src/main/linear-algebra/matrix.ts", "../node_modules/mz-math/src/main/linear-algebra/matrix-transformations.ts", "../node_modules/mz-math/src/main/random.ts", "../node_modules/mz-math/src/main/convert.ts", "../node_modules/mz-math/src/main/derivative.ts", "../node_modules/mz-math/src/main/equations/linear-equations.ts", "../node_modules/mz-math/src/main/equations/quadratic-equations.ts", "../node_modules/mz-math/src/main/bezier-curves/bezier-curve.ts", "../node_modules/mz-math/src/main/path-movement.ts", "../node_modules/mz-math/src/main/color.ts", "../node_modules/mz-math/src/main/id.ts", "../node_modules/mz-math/src/main/shapes.ts", "../node_modules/mz-math/src/main/collision-detection.ts", "../node_modules/mz-math/src/main/animation.ts", "../src/core/domain/svg-provider.ts", "../src/core/domain/defaults-provider.ts", "../src/core/domain/common-provider.ts", "../src/core/domain/circle-provider.ts", "../src/core/domain/pointers-provider.ts", "../src/core/ui/Pointer.tsx", "../src/core/domain/style-provider.ts", "../src/core/ui/Pointers.tsx", "../src/core/domain/data-provider.ts", "../src/core/ui/Connection.tsx", "../src/core/domain/connection-provider.ts", "../src/core/ui/Text.tsx", "../src/core/ui/Ticks.tsx", "../src/core/domain/ticks-provider.ts", "../src/core/ui/Circle.tsx"], - "sourcesContent": ["import { useEffect, useRef, useState } from 'react';\nimport { getSvg, ISvg } from './domain/svg-provider';\nimport { angle2value, getClosestEdge, getPointers, IPointer, IPointers, roundToStep } from './domain/pointers-provider';\nimport { ISettings } from './domain/settings-provider';\nimport { getNumber } from './domain/common-provider';\nimport {\n DEFAULT_PATH_BORDER, DEFAULT_PATH_END_ANGLE, DEFAULT_PATH_RADIUS, DEFAULT_PATH_START_ANGLE,\n DEFAULT_PATH_THICKNESS\n} from './domain/defaults-provider';\nimport Pointers from './ui/Pointers';\nimport { getData, IData } from './domain/data-provider';\nimport Connection from './ui/Connection';\nimport Text from './ui/Text';\nimport Ticks from './ui/Ticks';\nimport Circle from './ui/Circle';\nimport { mod } from 'mz-math';\nimport { isAngleInArc } from './domain/circle-provider';\nimport { outlineNoneStyle } from './domain/style-provider';\n\nexport const RoundSlider = (props: ISettings) => {\n\n const [ data, setData ] = useState(null);\n const [ svg, setSvg ] = useState(null);\n const [ pointers, setPointers ] = useState(null);\n\n const svgRef = useRef(null);\n\n useEffect(() => {\n setData(getData(props));\n }, [ props ]);\n\n useEffect(() => {\n setPointers(getPointers(props, data));\n }, [\n props,\n data,\n ]);\n\n useEffect(() => {\n if(!pointers) return;\n\n const pathStartAngle = getNumber(props.pathStartAngle, DEFAULT_PATH_START_ANGLE);\n let pathEndAngle = getNumber(props.pathEndAngle, DEFAULT_PATH_END_ANGLE);\n\n if(pathEndAngle <= pathStartAngle) {\n pathEndAngle += 360;\n }\n\n setSvg(getSvg(\n getNumber(props.pathRadius, DEFAULT_PATH_RADIUS),\n getNumber(props.pathThickness, DEFAULT_PATH_THICKNESS),\n getNumber(props.pathBorder, DEFAULT_PATH_BORDER),\n pointers.maxRadius,\n pathStartAngle,\n pathEndAngle,\n ));\n }, [\n props.pathRadius,\n props.pathThickness,\n props.pathBorder,\n props.pathStartAngle,\n props.pathEndAngle,\n pointers,\n ]);\n\n const setPointersCallback = (pointer: IPointer, newAngleDeg: number) => {\n if(props.disabled || !pointers.pointers || !pointer || pointer.disabled) return;\n\n newAngleDeg = roundToStep(newAngleDeg, data.stepAngleDeg);\n if(data.isClosedShape && mod(newAngleDeg, 360) === mod(svg.endAngleDeg, 360)){\n newAngleDeg = svg.startAngleDeg;\n }\n\n if(pointer.angleDeg === newAngleDeg) return;\n\n const handleOverlap = !props.pointersOverlap;\n if(handleOverlap) {\n\n let prevAngle, nextAngle;\n\n if(data.isClosedShape) {\n const prevIndex = mod(pointer.index - 1, pointers.pointers.length);\n const nextIndex = mod(pointer.index + 1, pointers.pointers.length);\n\n prevAngle = pointers.pointers[prevIndex].angleDeg;\n nextAngle = pointers.pointers[nextIndex].angleDeg;\n }\n else{\n prevAngle = pointer.index === 0 ? svg.startAngleDeg : pointers.pointers[pointer.index - 1].angleDeg;\n nextAngle = pointer.index === pointers.pointers.length - 1 ? svg.endAngleDeg : pointers.pointers[pointer.index + 1].angleDeg;\n }\n\n if(nextAngle <= prevAngle) {\n nextAngle += 360;\n }\n\n if(!isAngleInArc(prevAngle, nextAngle, newAngleDeg)){\n newAngleDeg = getClosestEdge(\n prevAngle,\n nextAngle,\n newAngleDeg,\n svg.cx,\n svg.cy,\n svg.radius\n );\n }\n }\n\n if(pointer.angleDeg === newAngleDeg) return;\n\n const _pointers = { ...pointers };\n _pointers.pointers = [...pointers.pointers];\n _pointers.pointers[pointer.index].angleDeg = newAngleDeg;\n pointers.pointers = _pointers.pointers;\n\n setPointers(_pointers);\n\n if(typeof props.onChange === 'function') {\n const values = _pointers.pointers.map(pointer => angle2value(\n data,\n pointer.angleDeg,\n svg.startAngleDeg,\n svg.endAngleDeg\n ));\n\n props.onChange(values);\n }\n };\n\n return (\n <>\n {\n svg &&\n \n\n {\n (props.SvgDefs) &&\n \n { props.SvgDefs }\n \n }\n\n \n\n \n\n \n\n \n\n \n \n }\n \n )\n};", "export const setDecimalPlaces = (num: number, decimalPlaces: number | undefined = Infinity) => {\n if(decimalPlaces === Infinity) return num;\n\n if(decimalPlaces < 0){\n decimalPlaces = 0;\n }\n\n const coefficient = 10 ** decimalPlaces;\n return Math.round(num * coefficient) / coefficient;\n};", "import { Vector2 } from '../types';\nimport { setDecimalPlaces } from './format';\n\nexport const mod = (n: number, m: number) => {\n return ((n % m) + m) % m;\n};\n\n/**\n * Convert range [a, b] to [c, d].\n * f(x) = (d - c) * (x - a) / (b - a) + c\n */\nexport const convertRange = (x: number, a: number, b: number, c: number, d: number) => {\n return (d - c) * (x - a) / (b - a) + c;\n};\n\n/**\n * Check if 2 ranges [a,b] and [c,d] overlap.\n */\nexport const doRangesOverlap = (a: number, b: number, c: number, d: number) => {\n return Math.max(a, c) <= Math.min(b, d) ;\n};\n\n// eslint-disable-next-line\nexport const isNumber = (value: any) => {\n return !isNaN(parseFloat(value)) && isFinite(value);\n};\n\n/**\n * Convert polar coordinates to cartesian coordinates.\n */\nexport const polarToCartesian = (center: Vector2, radii: Vector2, angleInRad: number, decimalPlaces = Infinity) : Vector2 => {\n const [cx, cy] = center;\n const [rx, ry] = radii;\n\n return [\n setDecimalPlaces(cx + (rx * Math.cos(angleInRad)), decimalPlaces),\n setDecimalPlaces(cy + (ry * Math.sin(angleInRad)), decimalPlaces),\n ];\n};", "import { Vector, Vector2, Vector3 } from '../types';\nimport { setDecimalPlaces } from './format';\nimport { v2Length, vNormalize, vDotProduct, vSub } from './linear-algebra/vector';\nimport { mod } from './other';\n\nexport const getV2Angle = (v2: Vector2, decimalPlaces = Infinity) => {\n const angle = Math.atan2(v2[1], v2[0]);\n return setDecimalPlaces(angle, decimalPlaces);\n};\n\nexport const getV2AngleInEllipse = (v2: Vector2, radii: Vector2, decimalPlaces = Infinity) => {\n const angle = Math.atan2(v2[1]/radii[1], v2[0]/radii[0]);\n return setDecimalPlaces(angle, decimalPlaces);\n};\n\nexport const setV2Angle = (v2: Vector2, newAngleRad: number, decimalPlaces = Infinity): Vector2 => {\n const length = v2Length(v2);\n return [\n setDecimalPlaces(Math.cos(newAngleRad) * length, decimalPlaces),\n setDecimalPlaces(Math.sin(newAngleRad) * length, decimalPlaces),\n ];\n};\n\nexport const radiansToDegrees = (radians: number, decimalPlaces = Infinity) => {\n const res = radians * (180 / Math.PI);\n return setDecimalPlaces(res, decimalPlaces);\n};\n\nexport const degreesToRadians = (degrees: number, decimalPlaces = Infinity) => {\n const res = degrees * (Math.PI / 180);\n return setDecimalPlaces(res, decimalPlaces);\n};\n\n/**\n * Returns the range [0, Math.PI]\n * A = Math.acos( dot(v1, v2)/(v1.length()*v2.length()) );\n */\nexport const getVNAngleBetween = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) : number => {\n const unitVector1 = vNormalize(vector1);\n const unitVector2 = vNormalize(vector2);\n const dotProduct = vDotProduct(unitVector1, unitVector2);\n const angle = Math.acos(dotProduct);\n return setDecimalPlaces(angle, decimalPlaces);\n};\n\nexport const getV2AngleBetween = (vector1: Vector2, vector2: Vector2, decimalPlaces = Infinity) : number => {\n // return getVNAngleBetween(vector1, vector2, decimalPlaces);\n const diff = vSub(vector1, vector2);\n const angle = Math.atan2(diff[1], diff[0]);\n return setDecimalPlaces(angle, decimalPlaces);\n};\n\nexport const getV3AngleBetween = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) : number => {\n return getVNAngleBetween(vector1, vector2, decimalPlaces);\n};\n\n/**\n * Shortest distance (angular) between two angles.\n */\nexport const getAnglesSub = (angleDegrees1: number, angleDegrees2: number, decimalPlaces = Infinity) : number => {\n const angleDistance = Math.abs(mod(angleDegrees1, 360) - mod(angleDegrees2, 360));\n return setDecimalPlaces(angleDistance <= 180 ? angleDistance : 360 - angleDistance, decimalPlaces);\n};\n\nexport const isAngleBetween = (angleDegrees: number, startAngleDegrees: number, endAngleDegrees: number) : boolean => {\n const distance = getAnglesSub(startAngleDegrees, endAngleDegrees);\n const distance1 = getAnglesSub(startAngleDegrees, angleDegrees);\n const distance2 = getAnglesSub(endAngleDegrees, angleDegrees);\n const totalDistance = distance1 + distance2;\n\n // Use a small threshold for floating point errors\n return Math.abs(totalDistance - distance) <= 0.001;\n}", "import { Vector, Vector2, Vector3, Vector4 } from '../../types';\nimport { setDecimalPlaces } from '../format';\nimport { getV2Angle, setV2Angle } from '../angle';\n\n// ------------ SUM ------------------------\n\nexport const vSum = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) : Vector => {\n\n const vector: Vector = [];\n\n for(let i=0; i {\n return vSum(vector1, vector2, decimalPlaces) as Vector2;\n};\n\nexport const v3Sum = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) : Vector3 => {\n return vSum(vector1, vector2, decimalPlaces) as Vector3;\n};\n\n// ------------ SUB ------------------------\n\nexport const vSub = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) : Vector => {\n\n const vector: Vector = [];\n\n for(let i=0; i {\n return vSub(vector1, vector2, decimalPlaces) as Vector2;\n};\n\nexport const v3Sub = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) : Vector3 => {\n return vSub(vector1, vector2, decimalPlaces) as Vector3;\n};\n\n// ------------ MUL SCALAR ------------------------\n\nexport const vMulScalar = (v: Vector, scalar: number, decimalPlaces = Infinity): Vector => {\n const vector: Vector = [];\n\n for(let i=0; i {\n return vMulScalar(v2, scalar, decimalPlaces) as Vector2;\n};\n\nexport const v3MulScalar = (v3: Vector3, scalar: number, decimalPlaces = Infinity): Vector3 => {\n return vMulScalar(v3, scalar, decimalPlaces) as Vector3;\n};\n\n// ------------ DIVIDE ------------------------\n\nexport const vDivideScalar = (v: Vector, scalar: number, decimalPlaces = Infinity): Vector => {\n if(scalar === 0){\n throw new Error('Division by zero error.');\n }\n\n const vector: Vector = [];\n\n for(let i=0; i {\n return vDivideScalar(v2, scalar, decimalPlaces) as Vector2;\n};\n\nexport const v3DivideScalar = (v3: Vector3, scalar: number, decimalPlaces = Infinity): Vector3 => {\n return vDivideScalar(v3, scalar, decimalPlaces) as Vector3;\n};\n\n// ------------ LENGTH ------------------------\n\nexport const vLength = (vector: Vector, decimalPlaces = Infinity) => {\n let sum = 0;\n\n for(let i=0; i {\n return vLength(vector, decimalPlaces);\n};\n\nexport const v3Length = (vector: Vector3, decimalPlaces = Infinity) => {\n return vLength(vector, decimalPlaces);\n};\n\nexport const v2SetLength = (v2: Vector2, newLength: number, decimalPlaces = Infinity): Vector2 => {\n const angle = getV2Angle(v2);\n return [\n setDecimalPlaces(Math.cos(angle) * newLength, decimalPlaces),\n setDecimalPlaces(Math.sin(angle) * newLength, decimalPlaces),\n ];\n};\n\n// ----------- DISTANCE ------------------------\n\nexport const vDistance = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) => {\n const diff = vSub(vector1, vector2);\n return vLength(diff, decimalPlaces);\n};\n\nexport const v2Distance = (vector1: Vector2, vector2: Vector2, decimalPlaces = Infinity) => {\n const diff = vSub(vector1, vector2);\n return vLength(diff, decimalPlaces);\n};\n\nexport const v3Distance = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) => {\n const diff = vSub(vector1, vector2);\n return vLength(diff, decimalPlaces);\n};\n\n// ------------ NORMALIZE ------------------------\n\n/**\n * Normalization creates a unit vector, which is a vector of length 1.\n */\nexport const vNormalize = (v: Vector, decimalPlaces = Infinity) : Vector => {\n const length = vLength(v);\n const unitVector: Vector = [];\n\n for(let i=0; i {\n return vNormalize(v2, decimalPlaces) as Vector2;\n};\n\nexport const v3Normalize = (v3: Vector3, decimalPlaces = Infinity) : Vector3 => {\n return vNormalize(v3, decimalPlaces) as Vector3;\n};\n\n// ------------ DOT PRODUCT ------------------------\n\nexport const vDotProduct = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) : number => {\n let sum = 0;\n\n for(let i=0; i {\n return vDotProduct(vector1, vector2, decimalPlaces);\n};\n\nexport const v3DotProduct = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) : number => {\n return vDotProduct(vector1, vector2, decimalPlaces);\n};\n\n// ------------ CROSS PRODUCT ------------------------\n\n/**\n * Cross product is possible on 3D vectors only.\n * The cross product a \u00D7 b is defined as a vector c that is perpendicular (orthogonal) to both a and b.\n */\nexport const v3CrossProduct = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity): Vector3 => {\n return [\n setDecimalPlaces(vector1[1] * vector2[2] - vector1[2] * vector2[1], decimalPlaces),\n setDecimalPlaces(vector1[2] * vector2[0] - vector1[0] * vector2[2], decimalPlaces),\n setDecimalPlaces(vector1[0] * vector2[1] - vector1[1] * vector2[0], decimalPlaces),\n ];\n};\n\n// --------------- INIT VECTOR HELPER -----------------\n\nexport const v2 = (defaultValue = 0): Vector2 => {\n return [defaultValue, defaultValue];\n};\n\nexport const v3 = (defaultValue = 0): Vector3 => {\n return [defaultValue, defaultValue, defaultValue];\n};\n\nexport const v4 = (defaultValue = 0): Vector4 => {\n return [defaultValue, defaultValue, defaultValue, defaultValue];\n};\n\nexport const vN = (N: number, defaultValue = 0): Vector => {\n\n if(N < 0){\n throw new Error('N must be a non-negative number.');\n }\n\n const vector: Vector = [];\n for(let i=0; i {\n let vector: Vector2 = [0, 0];\n vector = v2SetLength(vector, distance);\n return setV2Angle(vector, angleRad);\n};\n\n// --------------- EQUALITY -------------------------\n\nexport const vEqual = (vector1: Vector, vector2: Vector): boolean => {\n if(vector1.length !== vector2.length) return false;\n\n for(let i=0; i {\n const sub = v2Sub(vector2, vector1);\n return [\n -setDecimalPlaces(sub[1], decimalPlaces),\n setDecimalPlaces(sub[0], decimalPlaces)\n ];\n};", "import { Matrix2, Matrix3, Matrix4, Matrix, Vector, Vector2, Vector3 } from '../../types';\nimport { vMulScalar, vSum, vSub, vDotProduct, vN, vEqual, vDivideScalar } from './vector';\n\n// --------------- SUM ----------------------\n\nexport const mSum = (matrix1: Matrix, matrix2: Matrix, decimalPlaces = Infinity): Matrix => {\n const matrix: Matrix = [];\n\n for(let i=0; i {\n return mSum(matrix1, matrix2, decimalPlaces) as Matrix2;\n};\n\nexport const m3Sum = (matrix1: Matrix3, matrix2: Matrix3, decimalPlaces = Infinity): Matrix3 => {\n return mSum(matrix1, matrix2, decimalPlaces) as Matrix3;\n};\n\n// --------------- SUB ----------------------\n\nexport const mSub = (matrix1: Matrix, matrix2: Matrix, decimalPlaces = Infinity): Matrix => {\n const matrix: Matrix = [];\n\n for(let i=0; i {\n return mSub(matrix1, matrix2, decimalPlaces) as Matrix2;\n};\n\nexport const m3Sub = (matrix1: Matrix3, matrix2: Matrix3, decimalPlaces = Infinity): Matrix3 => {\n return mSub(matrix1, matrix2, decimalPlaces) as Matrix3;\n};\n\n// --------------- MUL SCALAR ----------------------\n\nexport const mMulScalar = (m: Matrix, scalar: number, decimalPlaces = Infinity): Matrix => {\n const matrix: Matrix = [];\n\n for(const v of m){\n matrix.push(vMulScalar(v, scalar, decimalPlaces));\n }\n\n return matrix;\n};\n\nexport const m2MulScalar = (m2: Matrix2, scalar: number, decimalPlaces = Infinity): Matrix2 => {\n return mMulScalar(m2, scalar, decimalPlaces) as Matrix2;\n};\n\nexport const m3MulScalar = (m3: Matrix3, scalar: number, decimalPlaces = Infinity): Matrix3 => {\n return mMulScalar(m3, scalar, decimalPlaces) as Matrix3;\n};\n\n// --------------- DIVIDE SCALAR ----------------------\n\nexport const mDivideScalar = (m: Matrix, scalar: number, decimalPlaces = Infinity): Matrix => {\n if(scalar === 0){\n throw new Error('Division by zero error.');\n }\n\n const matrix: Matrix = [];\n\n for(const v of m){\n matrix.push(vDivideScalar(v, scalar, decimalPlaces));\n }\n\n return matrix;\n};\n\nexport const m2DivideScalar = (m2: Matrix2, scalar: number, decimalPlaces = Infinity): Matrix2 => {\n return mDivideScalar(m2, scalar, decimalPlaces) as Matrix2;\n};\n\nexport const m3DivideScalar = (m3: Matrix3, scalar: number, decimalPlaces = Infinity): Matrix3 => {\n return mDivideScalar(m3, scalar, decimalPlaces) as Matrix3;\n};\n\n\n// --------------- TRANSPOSE ----------------------\n\nexport const mTranspose = (m: Matrix): Matrix => {\n\n const vectorsCount = m.length;\n if(vectorsCount <= 0) return m;\n\n const vectorLength = m[0].length;\n if(vectorLength <= 0) return m;\n\n const matrix: Matrix = [];\n for(let i=0; i {\n return mTranspose(m2);\n};\n\nexport const m3Transpose = (m3: Matrix3): Matrix => {\n return mTranspose(m3);\n};\n\n// ----------------- RESET ----------------------\n\nexport const mReset = (m: Matrix, defaultValue = 0): Matrix => {\n\n if(m.length <= 0) return [];\n\n const res: Matrix = [];\n\n for(let i=0; i {\n return mReset(m2, defaultValue) as Matrix2;\n};\n\nexport const m3Reset = (m3: Matrix3, defaultValue = 0): Matrix3 => {\n return mReset(m3, defaultValue) as Matrix3;\n};\n\n// --------------- MATRIX INIT HELPERS -----------------\n\nexport const m2x2 = (defaultValue = 0): Matrix2 => {\n return [\n [defaultValue, defaultValue],\n [defaultValue, defaultValue],\n ];\n};\n\nexport const m3x3 = (defaultValue = 0): Matrix3 => {\n return [\n [defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue],\n ];\n};\n\nexport const m4x4 = (defaultValue = 0): Matrix4 => {\n return [\n [defaultValue, defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue, defaultValue],\n ];\n};\n\nexport const mNxM = (N: number, M: number, defaultValue = 0): Matrix => {\n if(N <= 0 || M <= 0){\n throw new Error('M and N must be positive numbers.');\n }\n\n const matrix: Matrix = [];\n\n for(let i=0; i {\n return [\n [1, 0],\n [0, 1],\n ];\n};\n\nexport const identity3 = (): Matrix3 => {\n return [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\nexport const identity4 = (): Matrix4 => {\n return [\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Identity Matrix (I).\n * M x I = I x M = M for any matrix M.\n * Identity Matrix is a special case of scale matrix.\n */\nexport const identityN = (N: number): Matrix => {\n if(N < 0){\n throw new Error('N must be a non-negative number.');\n }\n\n if(N === 0) return [];\n\n const matrix: Matrix = [];\n\n for(let i=0; i {\n const matrix: Matrix = [];\n\n for(let i=0; i {\n return mDeepCopy(m2) as Matrix2;\n};\n\nexport const m3DeepCopy = (m3: Matrix3): Matrix3 => {\n return mDeepCopy(m3) as Matrix3;\n};\n\n// -------------- APPEND / PREPEND ROW OR COLUMN ---------------\n\nexport const mAppendCol = (m: Matrix, col: Vector): Matrix => {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n for(let i=0; i {\n const copy = mDeepCopy(m);\n copy.push(row);\n return copy;\n};\n\nexport const m2AppendRow = (m2: Matrix2, row: Vector2) : Matrix2 => {\n const copy = m2DeepCopy(m2);\n copy.push(row);\n return copy;\n};\n\nexport const m3AppendRow = (m3: Matrix3, row: Vector3) : Matrix3 => {\n const copy = m3DeepCopy(m3);\n copy.push(row);\n return copy;\n};\n\nexport const mPrependRow = (m: Matrix, row: Vector) : Matrix => {\n const copy = mDeepCopy(m);\n copy.unshift(row);\n return copy;\n};\n\nexport const m2PrependRow = (m2: Matrix2, row: Vector2) : Matrix2 => {\n const copy = m2DeepCopy(m2);\n copy.unshift(row);\n return copy;\n};\n\nexport const m3PrependRow = (m3: Matrix3, row: Vector3) : Matrix3 => {\n const copy = m3DeepCopy(m3);\n copy.unshift(row);\n return copy;\n};\n\n// ------------ DELETE ROW OR COLUMN ----------------------------\n\nexport const mDelLastRow = (m: Matrix): Matrix => {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n copy.pop();\n return copy;\n};\n\nexport const mDelFirstRow = (m: Matrix): Matrix => {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n copy.shift();\n return copy;\n};\n\nexport const mDelLastColumn = (m: Matrix): Matrix => {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const vector: Vector = [];\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const size = m[0].length;\n\n const vector: Vector = [];\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const vector: Vector = [];\n for(let i=0; i {\n\n const matrix: Matrix = [];\n for(let i=0; i {\n\n if(matrix.length < 0) return [];\n\n if(matrix[0].length !== vector.length){\n throw new Error('The number of columns in the matrix must be equal to the length of the vector.');\n }\n\n const res: Vector = [];\n\n for(let i=0; i {\n if(matrix1.length !== matrix2.length) return false;\n\n for(let i=0; i returns matrix N (m-1 x m-1)\n * The matrix must be square.\n */\nconst mMinorHelper = (m: Matrix, row: number, col: number) => {\n const size = m.length;\n\n if(size <= 0){\n throw new Error('The matrix should not be empty.');\n }\n\n if(size !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n const matrix: Matrix = [];\n\n for(let i=0; i {\n const size = m.length;\n\n if(size <= 0){\n throw new Error('The matrix should not be empty.');\n }\n\n if(size !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n // prepare the matrix without provided row and column\n const matrix = mMinorHelper(m, row, col);\n\n // calculate the matrix determinant\n return mDeterminant(matrix);\n};\n\n/**\n * Calculate determinant for NxN matrix.\n * Matrix should be square.\n */\nexport const mDeterminant = (matrix: Matrix): number => {\n const size = matrix.length;\n if(size === 0) return 1;\n\n if(size !== matrix[0].length){\n throw new Error('The matrix must be square.');\n }\n\n if(size === 1) return matrix[0][0];\n if(size === 2) return m2Determinant(matrix as Matrix2);\n\n let d = 0;\n\n for(let i=0; i {\n if(m2.length !== m2[0].length){\n throw new Error('The matrix must be square.');\n }\n\n return m2[0][0] * m2[1][1] - m2[1][0] * m2[0][1];\n};\n\n/**\n * Calculate determinant for 3x3 matrix.\n * Matrix should be square.\n */\nexport const m3Determinant = (m3: Matrix3): number => {\n if(m3.length !== m3[0].length){\n throw new Error('The matrix must be square.');\n }\n\n return mDeterminant(m3);\n};\n\n// ------------------ INVERSE -----------------------\n\nexport const m2Adjugate = (m2: Matrix2): Matrix2|null => {\n if(m2.length !== m2[0].length){\n throw new Error('The matrix must be square.');\n }\n\n return [\n [m2[1][1], -m2[0][1]],\n [-m2[1][0], m2[0][0]],\n ];\n};\n\nexport const m3Adjugate = (m3: Matrix3) : Matrix3|null => {\n return mAdjugate(m3) as (Matrix3|null);\n};\n\n/**\n * Adjugate is a transpose of a cofactor matrix\n */\nexport const mAdjugate = (m: Matrix): Matrix|null => {\n\n const size = m.length;\n if(size <= 0) return null;\n\n if(size !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n if(size === 1) return m;\n\n if(size === 2) return m2Adjugate(m as Matrix2);\n\n // build a cofactor matrix ----------------\n const cofactors: Matrix = [];\n\n for(let i=0; i {\n if(m.length > 0 && m.length !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n const d = mDeterminant(m);\n return d === 0;\n};\n\n/**\n * Square matrix A (nxn) is invertible is there is another square matrix B (nxn) so AxB = BxA = I\n * For A (2x2) matrix, the inverse is:\n * (1 / (determinant(A))) * adj(A)\n */\nexport const m2Inverse = (m2: Matrix2, decimalPlaces = Infinity): (Matrix2 | null) => {\n if(m2.length > 0 && m2.length !== m2[0].length){\n throw new Error('The matrix must be square.');\n }\n\n const d = m2Determinant(m2);\n if(d === 0) return null;\n\n const adj = m2Adjugate(m2);\n if(adj === null) return null;\n\n return m2DivideScalar(adj, d, decimalPlaces);\n};\n\nexport const m3Inverse = (m3: Matrix3, decimalPlaces = Infinity): (Matrix3 | null) => {\n return mInverse(m3, decimalPlaces) as (Matrix3|null);\n};\n\nexport const mInverse = (m: Matrix, decimalPlaces = Infinity): (Matrix | null) => {\n const size = m.length;\n\n if(size > 0 && size !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n // find a determinant ----------------------\n const d = mDeterminant(m);\n\n // find an Adjugate - a transpose of a cofactor matrix\n const adj = mAdjugate(m);\n if(adj === null) return null;\n\n return mDivideScalar(adj, d, decimalPlaces);\n};", "import { Matrix2, Matrix3, Matrix4, Matrix, Vector2, Vector3, Vector4 } from '../../types';\nimport { v2Normalize, v3MulScalar, v3Normalize } from './vector';\nimport { mMulVector, mMul } from './matrix';\nimport { setDecimalPlaces } from '../format';\n\n/*\nAny 2D affine transformation can be decomposed\ninto a rotation, followed by a scaling, followed by a\nshearing, and followed by a translation.\n---------------------------------------------------------\nAffine matrix = translation x shearing x scaling x rotation\n */\n\n// ----------------- CSS -------------------------------------\n\n/**\n * Matrix 2D in non-homogeneous coordinates to CSS matrix() function\n * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix\n */\nexport const m2ToCSS = (m: Matrix2) : string => {\n const a = m[0][0];\n const b = m[1][0];\n const c = m[0][1];\n const d = m[1][1];\n\n return `matrix(${ a }, ${ b }, ${ c }, ${ d }, 0, 0)`;\n};\n\n/**\n * Matrix 2D in homogeneous coordinates to CSS matrix() function\n * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix\n */\nexport const m2hToCSS = (m: Matrix3) : string => {\n const a = m[0][0];\n const b = m[1][0];\n const c = m[0][1];\n const d = m[1][1];\n const tx = m[0][2];\n const ty = m[1][2];\n\n return `matrix(${ a }, ${ b }, ${ c }, ${ d }, ${ tx }, ${ ty })`;\n};\n\n/**\n * Matrix 2D in homogeneous coordinates to CSS matrix3d() function\n * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix3d\n */\nexport const m2hToCSS3d = (m: Matrix3) : string => {\n const a = m[0][0];\n const b = m[1][0];\n const c = m[0][1];\n const d = m[1][1];\n const tx = m[0][2];\n const ty = m[1][2];\n\n return `matrix3d(${ a }, ${ b }, 0, 0, ${ c }, ${ d }, 0, 0, 0, 0, 1, 0, ${ tx }, ${ ty }, 0, 1)`;\n};\n\n/**\n * Matrix 3D in homogeneous coordinates to CSS matrix3d() function\n * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix3d\n */\nexport const m3hToCSS3d = (m: Matrix4) : string => {\n\n return `matrix3d(\n ${ m[0][0] }, ${ m[0][1] }, ${ m[0][2] }, ${ m[0][3] },\n ${ m[1][0] }, ${ m[1][1] }, ${ m[1][2] }, ${ m[1][3] },\n ${ m[2][0] }, ${ m[2][1] }, ${ m[2][2] }, ${ m[2][3] },\n ${ m[3][0] }, ${ m[3][1] }, ${ m[3][2] }, ${ m[3][3] }\n )`;\n};\n\n// ---------------- TRANSLATION MATRICES ----------------------\n\nexport const m2Translation = (position: Vector2, decimalPlaces = Infinity): Matrix2 => {\n\n return [\n [1, 0],\n [0, 1],\n [setDecimalPlaces(position[0], decimalPlaces), setDecimalPlaces(position[1], decimalPlaces)],\n ];\n};\n\nexport const m3Translation = (position: Vector3, decimalPlaces = Infinity): Matrix3 => {\n\n return [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n [\n setDecimalPlaces(position[0], decimalPlaces),\n setDecimalPlaces(position[1], decimalPlaces),\n setDecimalPlaces(position[2], decimalPlaces)\n ],\n ];\n};\n\n/**\n * 2D Translation matrix in homogeneous coordinates.\n */\nexport const m2TranslationH = (position: Vector3, decimalPlaces = Infinity): Matrix3 => {\n\n return [\n [1, 0, setDecimalPlaces(position[0], decimalPlaces)],\n [0, 1, setDecimalPlaces(position[1], decimalPlaces)],\n [0, 0, 1],\n ];\n};\n\n/**\n * 3D Translation matrix in homogeneous coordinates.\n */\nexport const m3TranslationH = (position: Vector4, decimalPlaces = Infinity): Matrix4 => {\n\n return [\n [1, 0, 0, setDecimalPlaces(position[0], decimalPlaces)],\n [0, 1, 0, setDecimalPlaces(position[1], decimalPlaces)],\n [0, 0, 1, setDecimalPlaces(position[2], decimalPlaces)],\n [0, 0, 0, 1],\n ];\n};\n\n// ---------------- ROTATION MATRICES -------------------------\n\n/**\n * Rotation of an angle about the origin.\n */\nexport const m2Rotation = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix2 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, -sin],\n [sin, cos],\n ] :\n [\n [cos, sin],\n [-sin, cos],\n ];\n};\n\n/**\n * Rotation of an angle about the origin in homogeneous coordinates (clockwise).\n */\nexport const m2RotationH = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix3 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, -sin, 0],\n [sin, cos, 0],\n [0, 0, 1],\n ]:\n [\n [cos, sin, 0],\n [-sin, cos, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Rotation of an angle \"angleRad\" around the given point (transformOrigin) in homogeneous coordinates (clockwise).\n * result_vector = TranslationMatrix(x, y) * RotationMatrix() * TranslationMatrix(-x, -y) * position_vector\n */\nexport const m2RotationAroundPointH = (\n angleRad: number,\n transformOrigin: Vector3,\n isClockwise = true,\n decimalPlaces = Infinity): Matrix3 => {\n\n const translation = m2TranslationH(transformOrigin, decimalPlaces);\n const rotation = m2RotationH(angleRad, isClockwise, decimalPlaces);\n const translationBack = m2TranslationH(v3MulScalar(transformOrigin, -1), decimalPlaces);\n const temp1 = mMul(translation, rotation);\n return mMul(temp1, translationBack) as Matrix3;\n};\n\nexport const m2RotateAroundPointH = (\n angleRad: number,\n transformOrigin: Vector3,\n position: Vector3,\n isClockwise = true,\n decimalPlaces = Infinity): Vector3 => {\n\n const mat3h = m2RotationAroundPointH(angleRad, transformOrigin, isClockwise, decimalPlaces);\n return mMulVector(mat3h, position) as Vector3;\n};\n\n/**\n * Rotate vector around the origin by angle \"angleRad\" (clockwise).\n */\nexport const v2Rotate = (angleRad: number, vector: Vector2, isClockwise = true, decimalPlaces = Infinity): Vector2 => {\n const unitVector = v2Normalize(vector);\n return mMulVector(m2Rotation(angleRad, isClockwise, decimalPlaces), unitVector) as Vector2;\n};\n\n/**\n * Rotate vector around the origin by angle \"angleRad\" (clockwise).\n */\nexport const v2RotateH = (angleRad: number, vector: Vector3, isClockwise = true, decimalPlaces = Infinity): Vector3 => {\n const unitVector = v3Normalize(vector);\n return mMulVector(m2RotationH(angleRad, isClockwise, decimalPlaces), unitVector) as Vector3;\n};\n\n/**\n * Rotation around the X axis (clockwise).\n */\nexport const m3RotationX = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix3 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [1, 0, 0],\n [0, cos, -sin],\n [0, sin, cos],\n ] :\n [\n [1, 0, 0],\n [0, cos, sin],\n [0, -sin, cos],\n ];\n};\n\n/**\n * Rotation around the X axis (clockwise) - in homogeneous coordinates\n */\nexport const m3RotationXH = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix4 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [1, 0, 0, 0],\n [0, cos, -sin, 0],\n [0, sin, cos, 0],\n [0, 0, 0, 1],\n ] :\n [\n [1, 0, 0, 0],\n [0, cos, sin, 0],\n [0, -sin, cos, 0],\n [0, 0, 0, 1],\n ];\n};\n\nexport const v3RotateX = (angleRad: number, vector: Vector3, isClockwise = true, decimalPlaces = Infinity): Vector3 => {\n const unitVector = v3Normalize(vector);\n return mMulVector(m3RotationX(angleRad, isClockwise, decimalPlaces), unitVector) as Vector3;\n};\n\n/**\n * Rotation around the Y axis (clockwise).\n */\nexport const m3RotationY = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix3 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, 0, sin],\n [0, 1, 0],\n [-sin, 0, cos],\n ] :\n [\n [cos, 0, -sin],\n [0, 1, 0],\n [sin, 0, cos],\n ];\n};\n\n/**\n * Rotation around the Y axis (clockwise) - in homogeneous coordinates\n */\nexport const m3RotationYH = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix4 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, 0, sin, 0],\n [0, 1, 0, 0],\n [-sin, 0, cos, 0],\n [0, 0, 0, 1],\n ] :\n [\n [cos, 0, -sin, 0],\n [0, 1, 0, 0],\n [sin, 0, cos, 0],\n [0, 0, 0, 1],\n ];\n};\n\nexport const v3RotateY = (angleRad: number, vector: Vector3, isClockwise = true, decimalPlaces = Infinity): Vector3 => {\n const unitVector = v3Normalize(vector);\n return mMulVector(m3RotationY(angleRad, isClockwise, decimalPlaces), unitVector) as Vector3;\n};\n\n/**\n * Rotation around the Z axis (clockwise).\n */\nexport const m3RotationZ = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix3 => {\n\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, -sin, 0],\n [sin, cos, 0],\n [0, 0, 1],\n ] : [\n [cos, sin, 0],\n [-sin, cos, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Rotation around the Z axis (clockwise)- in homogeneous coordinates\n */\nexport const m3RotationZH = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix4 => {\n\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, -sin, 0, 0],\n [sin, cos, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ] : [\n [cos, sin, 0, 0],\n [-sin, cos, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\nexport const v3RotateZ = (angleRad: number, vector: Vector3, isClockwise = true, decimalPlaces = Infinity): Vector3 => {\n const unitVector = v3Normalize(vector);\n return mMulVector(m3RotationZ(angleRad, isClockwise, decimalPlaces), unitVector) as Vector3;\n};\n\n// ---------------- SCALE MATRICES -------------\n\n/**\n * Get matrix for arbitrary scaling pivot point.\n * result_vector = TranslationMatrix(x, y) * ScaleMatrix() * TranslationMatrix(-x, -y) * scale_vector\n */\nexport const m2ScaleAtPointHMatrix = (\n scaleVector: Vector3,\n transformOrigin: Vector3,\n decimalPlaces = Infinity): Matrix3 => {\n\n const translation = m2TranslationH(transformOrigin, decimalPlaces);\n const scale = m2ScaleH(scaleVector);\n const translationBack = m2TranslationH(v3MulScalar(transformOrigin, -1), decimalPlaces);\n const temp1 = mMul(translation, scale);\n return mMul(temp1, translationBack) as Matrix3;\n};\n\nexport const m2ScaleAtPointH = (\n scaleVector: Vector3,\n transformOrigin: Vector3,\n point: Vector3,\n decimalPlaces = Infinity): Vector3 => {\n\n const mat3h = m2ScaleAtPointHMatrix(scaleVector, transformOrigin, decimalPlaces);\n return mMulVector(mat3h, point) as Vector3;\n};\n\nexport const m2Scale = (scaleVector: Vector2): Matrix2 => {\n return [\n [scaleVector[0], 0],\n [0, scaleVector[1]],\n ];\n};\n\nexport const v2Scale = (scaleVector: Vector2, vector: Vector2): Vector2 => {\n return mMulVector(m2Scale(scaleVector), vector) as Vector2;\n};\n\n/**\n * homogeneous coordinates\n */\nexport const m2ScaleH = (scaleVector: Vector3): Matrix3 => {\n return [\n [scaleVector[0], 0, 0],\n [0, scaleVector[1], 0],\n [0, 0, 1],\n ];\n};\n\nexport const m3Scale = (scaleVector: Vector3): Matrix3 => {\n return [\n [scaleVector[0], 0, 0],\n [0, scaleVector[1], 0],\n [0, 0, scaleVector[2]],\n ];\n};\n\nexport const m3ScaleH = (scaleVector: Vector4): Matrix4 => {\n return [\n [scaleVector[0], 0, 0, 0],\n [0, scaleVector[1], 0, 0],\n [0, 0, scaleVector[2], 0],\n [0, 0, 0, 1]\n ];\n};\n\nexport const v3Scale = (scaleVector: Vector3, vector: Vector3): Vector3 => {\n return mMulVector(m3Scale(scaleVector), vector) as Vector3;\n};\n\n/**\n * Stretch, parallel to the x-axis.\n */\nexport const m2ScaleX = (scale: number): Matrix2 => {\n return [\n [scale, 0],\n [0, 1],\n ];\n};\n\n/**\n * Stretch, parallel to the x-axis - homogeneous coordinates\n */\nexport const m2ScaleXH = (scale: number): Matrix3 => {\n return [\n [scale, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Stretch in x-direction\n */\nexport const m3ScaleX = (scale: number): Matrix3 => {\n return [\n [scale, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Stretch in x-direction\n */\nexport const m3ScaleXH = (scale: number): Matrix4 => {\n return [\n [scale, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Stretch in y-direction\n */\nexport const m3ScaleY = (scale: number): Matrix3 => {\n return [\n [1, 0, 0],\n [0, scale, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Stretch in y-direction\n */\nexport const m3ScaleYH = (scale: number): Matrix => {\n return [\n [1, 0, 0, 0],\n [0, scale, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Stretch in z-direction\n */\nexport const m3ScaleZ = (scale: number): Matrix3 => {\n return [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, scale],\n ];\n};\n\n/**\n * Stretch in z-direction\n */\nexport const m3ScaleZH = (scale: number): Matrix4 => {\n return [\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, scale, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Stretch, parallel to the y-axis.\n */\nexport const m2ScaleY = (scale: number): Matrix2 => {\n return [\n [1, 0],\n [0, scale],\n ];\n};\n\n/**\n * Stretch, parallel to the y-axis - homogeneous coordinates\n */\nexport const m2ScaleYH = (scale: number): Matrix3 => {\n return [\n [1, 0, 0],\n [0, scale, 0],\n [0, 0, 1],\n ];\n};\n\n// ---------------- REFLECTION MATRICES -------------------------\n\n/**\n * Reflection about the origin.\n */\nexport const m2ReflectionOrigin = (): Matrix2 => {\n\n return [\n [-1, 0],\n [0, -1],\n ];\n};\n\n/**\n * Reflection about the origin.\n */\nexport const m2ReflectionOriginH = (): Matrix3 => {\n\n return [\n [-1, 0, 0],\n [0, -1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection about the origin in non-homogeneous coordinates\n */\nexport const m3ReflectionOrigin = (): Matrix3 => {\n\n return [\n [-1, 0, 0],\n [0, -1, 0],\n [0, 0, -1],\n ];\n};\n\n/**\n * Reflection about the origin in homogeneous coordinates\n */\nexport const m3ReflectionOriginH = (): Matrix4 => {\n\n return [\n [-1, 0, 0, 0],\n [0, -1, 0, 0],\n [0, 0, -1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Reflection about y=-x\n */\nexport const m2ReflectionYmX = (): Matrix2 => {\n\n return [\n [0, -1],\n [-1, 0],\n ];\n};\n\n/**\n * Reflection in the x-axis.\n */\nexport const m2ReflectionX = (): Matrix2 => {\n\n return [\n [1, 0],\n [0, -1],\n ];\n};\n\n/**\n * Reflection in the x-axis.\n */\nexport const m2ReflectionXH = (): Matrix3 => {\n\n return [\n [1, 0, 0],\n [0, -1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection in the y-axis.\n */\nexport const m2ReflectionY = (): Matrix2 => {\n\n return [\n [-1, 0],\n [0, 1],\n ];\n};\n\nexport const m2ReflectionYH = (): Matrix3 => {\n\n return [\n [-1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to YZ plane in non-homogeneous coordinates\n */\nexport const m3ReflectionYZ = (): Matrix3 => {\n\n return [\n [-1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to YZ plane in homogeneous coordinates\n */\nexport const m3ReflectionYZH = (): Matrix4 => {\n\n return [\n [-1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to XZ plane in non-homogeneous coordinates\n */\nexport const m3ReflectionXZ = (): Matrix3 => {\n\n return [\n [1, 0, 0],\n [0, -1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to XZ plane in homogeneous coordinates\n */\nexport const m3ReflectionXZH = (): Matrix4 => {\n\n return [\n [1, 0, 0, 0],\n [0, -1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to XY plane in non-homogeneous coordinates\n */\nexport const m3ReflectionXY = (): Matrix3 => {\n\n return [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, -1],\n ];\n};\n\n/**\n * Reflection relative to XY plane in homogeneous coordinates\n */\nexport const m3ReflectionXYH = (): Matrix4 => {\n\n return [\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, -1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n// ---------------- SHEARING MATRICES -------------------------\n\n\n/**\n * Shearing in y-axis, with x-axis fixed with (0,1) moving to (factor, 1)\n */\nexport const m2ShearingY = (factor: number): Matrix2 => {\n\n return [\n [1, factor],\n [0, 1],\n ];\n};\n\n/**\n * Shearing in x-axis, with y-axis fixed with (1,0) moving to (1, factor)\n */\nexport const m2ShearingX = (factor: number): Matrix2 => {\n\n return [\n [1, 0],\n [factor, 1],\n ];\n};", "import { setDecimalPlaces } from './format';\n\n/**\n * Returns a random number in the [min,max] range.\n */\nexport const getRandom = (min: number, max: number, decimalPlaces = Infinity): number => {\n return setDecimalPlaces(Math.random() * (max - min) + min, decimalPlaces);\n};\n\n/**\n * Returns a random integer number in the [min,max] range.\n */\nexport const getRandomInt = (min: number, max: number): number => {\n return Math.floor(Math.random() * (max - min + 1) + min);\n};\n\nexport const getRandomBoolean = () => Math.random() < 0.5;\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nexport const getRandomItemFromArray = (array: any[]) => {\n const randomIndex = getRandomInt(0, array.length - 1);\n return array[randomIndex];\n};", "export const stringToNumber = (value: string|undefined|null|number, defaultNumber: number) => {\n if(value === undefined || value === null) return defaultNumber;\n const res = Number(value) ?? defaultNumber;\n return isNaN(res) ? defaultNumber : res;\n};", "import { setDecimalPlaces } from './format';\nimport { Vector2, Vector3 } from '../types';\n\n/**\n * u(x) and v(x) are functions ---------->\n *\n * dx(u + v) = dx(u) + dx(v)\n * dx(u - v) = dx(u) - dx(v)\n * dx(u * v) = dx(u) * v + u * dx(v)\n * dx(u / v) = (dx(u) * v - u * dx(v)) / (v ^ 2), when v(x) != 0\n */\n\n// ------------------ Derivatives of Polynomial ---------------------------\n\n/**\n * y = 3x+2\n * dxPolynomial(10, [[3, 1], [2, 0]])\n */\nexport const dxPolynomial = (x: number, polynomial: number[][], decimalPlaces = Infinity) => {\n let res = 0;\n\n for(const part of polynomial){\n if(part.length !== 2) return NaN;\n\n const coeff = part[0];\n const power = part[1];\n res += coeff * power * Math.pow(x, power - 1);\n }\n\n return setDecimalPlaces(res, decimalPlaces);\n}\n\n// ---------------------- Bezier Curves ---------------------------\n\n/**\n * Derivative of Bezier Curve is another Bezier Curve.\n * t must min in range [0, 1]\n */\nexport const dxV2QuadraticBezierCurve = (\n t: number,\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n // The derivative: P1 * (2t-2) + (2*P3-4*P2) * t + 2 * P2\n\n const temp1 = -2 * (1 - t); // Math.pow(1 - t, 2)\n const temp2 = 2 - 4 * t; // (1 - t) * 2 * t\n const temp3 = 2 * t; //t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * centerControlPoint[0] + temp3 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * centerControlPoint[1] + temp3 * endControlPoint[1], decimalPlaces),\n ];\n};\n\nexport const dxV3QuadraticBezierCurve = (\n t: number,\n startControlPoint: Vector3,\n centerControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n\n const temp1 = -2 * (1 - t); // Math.pow(1 - t, 2)\n const temp2 = 2 - 4 * t; // (1 - t) * 2 * t\n const temp3 = 2 * t; //t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * centerControlPoint[0] + temp3 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * centerControlPoint[1] + temp3 * endControlPoint[1], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[2] + temp2 * centerControlPoint[2] + temp3 * endControlPoint[2], decimalPlaces),\n ];\n};\n\nexport const dxV2CubicBezierCurve = (\n t: number,\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const temp1 = -3 * Math.pow(1 - t, 2); //Math.pow(1 - t, 3);\n const temp2 = 3 * (t - 1) * (3 * t - 1); //Math.pow(1 - t, 2) * 3 * t;\n const temp3 = 6 * t - 9 * t * t; // (1 - t) * 3 * t * t;\n const temp4 = 3 * t * t; //t * t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * center1ControlPoint[0] + temp3 * center2ControlPoint[0] + temp4 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * center1ControlPoint[1] + temp3 * center2ControlPoint[1] + temp4 * endControlPoint[1], decimalPlaces),\n ];\n};\n\nexport const dxV3CubicBezierCurve = (\n t: number,\n startControlPoint: Vector3,\n center1ControlPoint: Vector3,\n center2ControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n\n const temp1 = -3 * Math.pow(1 - t, 2); //Math.pow(1 - t, 3);\n const temp2 = 3 * (t - 1) * (3 * t - 1); //Math.pow(1 - t, 2) * 3 * t;\n const temp3 = 6 * t - 9 * t * t; // (1 - t) * 3 * t * t;\n const temp4 = 3 * t * t; //t * t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * center1ControlPoint[0] + temp3 * center2ControlPoint[0] + temp4 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * center1ControlPoint[1] + temp3 * center2ControlPoint[1] + temp4 * endControlPoint[1], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[2] + temp2 * center1ControlPoint[2] + temp3 * center2ControlPoint[2] + temp4 * endControlPoint[2], decimalPlaces),\n ];\n};\n\n\n// ----------------- Derivatives of trigonometry functions ---------------------------\n\nexport const dxSin = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(Math.cos(x), decimalPlaces);\n};\n\nexport const dxCos = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(-Math.sin(x), decimalPlaces);\n};\n\nexport const dxTan = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(1 / (Math.cos(x) ** 2), decimalPlaces);\n};\n\n/**\n * x != Math.PI * n, where n is an integer\n */\nexport const dxCot = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(-1 / (Math.sin(x) ** 2), decimalPlaces);\n};\n\n/**\n * -1 < x < 1\n */\nexport const dxArcSin = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(1 / (Math.sqrt(1 - x ** 2)), decimalPlaces);\n};\n\n/**\n * -1 < x < 1\n */\nexport const dxArcCos = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(-1 / (Math.sqrt(1 - x ** 2)), decimalPlaces);\n};\n\nexport const dxArcTan = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(1 / (1 + x ** 2), decimalPlaces);\n};\n\nexport const dxArcCot = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(-1 / (1 + x ** 2), decimalPlaces);\n};\n", "import { Matrix, Matrix2, Matrix3, Vector, Vector2, Vector3 } from '../../types';\nimport { m2Inverse, m3Inverse, mInverse, mMulVector, mDelLastColumn, mGetLastColumn } from '../linear-algebra/matrix';\nimport { setDecimalPlaces } from '../format';\nimport { v2Sub } from '../linear-algebra/vector';\n\n/**\n * Linear equation\n * ax + b = c\n * x = (c - b) / a; a != 0\n */\nexport const linearEquation = (equation: Vector3, decimalPlaces = Infinity) : number => {\n const a = equation[0];\n const b = equation[1];\n const c = equation[2];\n\n const diff = c - b;\n\n if(a === 0 && diff === 0) return Infinity; // any number is a solution\n if(a === 0) return NaN; // no solution\n\n return setDecimalPlaces(diff / a, decimalPlaces);\n};\n\n/**\n * System of 2 linear equations.\n * [x, y] = inverse(Matrix of equation parameters) x (vector of equation results)\n * ---------------\n * 3x + 2y = 7\n * -6x + 6y = 6\n */\nexport const linearEquationSystem2 = (equation1: Vector3, equation2: Vector3, decimalPlaces = Infinity) : Vector2 | null => {\n const equationParams: Matrix2 = [\n [equation1[0], equation1[1]],\n [equation2[0], equation2[1]],\n ];\n\n const inversed = m2Inverse(equationParams);\n if(inversed === null) return null; // no results\n\n const equationResults: Vector2 = [\n equation1[2],\n equation2[2]\n ];\n\n return mMulVector(inversed, equationResults, decimalPlaces) as Vector2;\n};\n\n/**\n * System of 3 linear equations.\n * ---------------------------------------\n * 3x + 2y + 5z = 7\n * -6x + 6y + 6z = 6\n * 2x + 7y - z = 4\n */\nexport const linearEquationSystem3 = (\n equation1: Vector,\n equation2: Vector,\n equation3: Vector,\n decimalPlaces = Infinity) : Vector3 | null => {\n const equationParams: Matrix3 = [\n [equation1[0], equation1[1], equation1[2]],\n [equation2[0], equation2[1], equation2[2]],\n [equation3[0], equation3[1], equation3[2]],\n ];\n\n const inversed = m3Inverse(equationParams);\n if(inversed === null) return null; // no results\n\n const equationResults: Vector3 = [\n equation1[3],\n equation2[3],\n equation3[3]\n ];\n\n return mMulVector(inversed, equationResults, decimalPlaces) as Vector3;\n};\n\n/**\n * System of N linear equations.\n */\nexport const linearEquationSystemN = (equations: Matrix, decimalPlaces = Infinity) : Vector | null => {\n if(equations.length <= 0) return null;\n\n const equationParams = mDelLastColumn(equations);\n\n const inversed = mInverse(equationParams);\n if(inversed === null) return null; // no results\n\n // the last column of the equations matrix\n const equationResults = mGetLastColumn(equations);\n\n return mMulVector(inversed, equationResults, decimalPlaces) as Vector;\n};\n\n/**\n * Calculate the equation of a line given two points in a 2D space.\n * y = ax + b\n * y - y1 = m(x - x1)\n * m = (y2 - y1) / (x2 - x1)\n */\nexport const getLinearEquationBy2Points = (point1: Vector2, point2: Vector2) : {\n slope: number|undefined,\n yIntercept: number|undefined,\n xIntercept: number|undefined,\n formula: string,\n} => {\n const [deltaX, deltaY] = v2Sub(point2, point1);\n const [x, y] = point1;\n\n if(deltaX === 0) {\n return {\n slope: undefined,\n xIntercept: x,\n yIntercept: undefined,\n formula: `x = ${ x }`,\n };\n }\n\n const m = deltaY / deltaX;\n const b = y - m * x;\n let formula = '';\n\n if(m === 0) {\n formula = `y = ${ b }`;\n }\n else{\n formula = `y = ${ m === 1 ? '' : m }x`;\n\n if(b !== 0) {\n formula += ` ${ b < 0 ? '-' : '+' } ${ Math.abs(b) }`;\n }\n }\n\n return {\n slope: m,\n xIntercept: undefined,\n yIntercept: b,\n formula,\n };\n};", "import { Vector } from '../../types';\nimport { setDecimalPlaces } from '../format';\nimport { linearEquation } from './linear-equations';\nimport { isNumber } from '../other';\n\n/**\n * Quadratic Equation.\n * ax^2 + bx + c = d\n */\nexport const quadraticEquation = (equation: Vector, decimalPlaces = Infinity) : Vector => {\n const a = equation[0];\n const b = equation[1];\n const c = equation[2];\n const d = equation[3];\n\n if(a === 0){\n // it's a linear equation -------------------------------------------\n const res = linearEquation([b, c, d], decimalPlaces);\n if(isNumber(res)) return [res];\n return [];\n }\n\n const diff = c - d;\n\n const discriminant = b * b - (4 * a * diff);\n\n if(discriminant < 0){\n return []; // no results\n }\n\n if(discriminant === 0){\n return [ setDecimalPlaces(-b / (2 * a), decimalPlaces) ]; // 1 result\n }\n\n // if(determinant > 0) ---> 2 results\n const t1 = 2 * a;\n const t2 = Math.sqrt(discriminant);\n\n return [\n setDecimalPlaces((-b + t2) / t1, decimalPlaces),\n setDecimalPlaces((-b - t2) / t1, decimalPlaces),\n ];\n};", "import { IBBox, Vector, Vector2, Vector3 } from '../../types';\nimport { setDecimalPlaces } from '../format';\nimport {\n dxV2CubicBezierCurve,\n dxV2QuadraticBezierCurve,\n dxV3CubicBezierCurve,\n dxV3QuadraticBezierCurve\n} from '../derivative';\nimport { v2Normalize, v3Normalize } from '../linear-algebra/vector';\nimport { linearEquation } from '../equations/linear-equations';\nimport { quadraticEquation } from '../equations/quadratic-equations';\nimport { isNumber } from '../other';\n\n/**\n * B\u00E9zier Curves\n * quadratic: y = P1 * (1-t)\u00B2 + P2 * 2 * (1-t)t + P3 * t\u00B2\n * t in range [0, 1]\n */\n\n// -------------------- GET POINT ON CURVE --------------------------\n\n/**\n * Get a point on a quadratic B\u00E9zier curve as a function of time.\n */\nexport const v2QuadraticBezierCurve = (\n t: number,\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const temp1 = Math.pow(1 - t, 2);\n const temp2 = (1 - t) * 2 * t;\n const temp3 = t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * centerControlPoint[0] + temp3 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * centerControlPoint[1] + temp3 * endControlPoint[1], decimalPlaces),\n ];\n};\n\nexport const v3QuadraticBezierCurve = (\n t: number,\n startControlPoint: Vector3,\n centerControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n\n const temp1 = Math.pow(1 - t, 2);\n const temp2 = (1 - t) * 2 * t;\n const temp3 = t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * centerControlPoint[0] + temp3 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * centerControlPoint[1] + temp3 * endControlPoint[1], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[2] + temp2 * centerControlPoint[2] + temp3 * endControlPoint[2], decimalPlaces),\n ];\n};\n\n/**\n * Get a point on a cubic B\u00E9zier curve as a function of time.\n */\nexport const v2CubicBezierCurve = (\n t: number,\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const temp1 = Math.pow(1 - t, 3);\n const temp2 = Math.pow(1 - t, 2) * 3 * t;\n const temp3 = (1 - t) * 3 * t * t;\n const temp4 = t * t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * center1ControlPoint[0] + temp3 * center2ControlPoint[0] + temp4 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * center1ControlPoint[1] + temp3 * center2ControlPoint[1] + temp4 * endControlPoint[1], decimalPlaces),\n ];\n};\n\nexport const v3CubicBezierCurve = (\n t: number,\n startControlPoint: Vector3,\n center1ControlPoint: Vector3,\n center2ControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n\n const temp1 = Math.pow(1 - t, 3);\n const temp2 = Math.pow(1 - t, 2) * 3 * t;\n const temp3 = (1 - t) * 3 * t * t;\n const temp4 = t * t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * center1ControlPoint[0] + temp3 * center2ControlPoint[0] + temp4 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * center1ControlPoint[1] + temp3 * center2ControlPoint[1] + temp4 * endControlPoint[1], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[2] + temp2 * center1ControlPoint[2] + temp3 * center2ControlPoint[2] + temp4 * endControlPoint[2], decimalPlaces),\n ];\n};\n\n// -------------------- TANGENT --------------------------\n\n/**\n * Tangent indicates the direction of travel at specific points along the B\u00E9zier curve,\n * and is literally just the first derivative of our curve.\n */\nexport const v2QuadraticBezierCurveTangent = (\n t: number,\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n const dxVector = dxV2QuadraticBezierCurve(t, startControlPoint, centerControlPoint, endControlPoint);\n return v2Normalize(dxVector, decimalPlaces);\n};\n\nexport const v3QuadraticBezierCurveTangent = (\n t: number,\n startControlPoint: Vector3,\n centerControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n const dxVector = dxV3QuadraticBezierCurve(t, startControlPoint, centerControlPoint, endControlPoint);\n return v3Normalize(dxVector, decimalPlaces);\n};\n\nexport const v2CubicBezierCurveTangent = (\n t: number,\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n const dxVector = dxV2CubicBezierCurve(t, startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint);\n return v2Normalize(dxVector, decimalPlaces);\n};\n\nexport const v3CubicBezierCurveTangent = (\n t: number,\n startControlPoint: Vector3,\n center1ControlPoint: Vector3,\n center2ControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n const dxVector = dxV3CubicBezierCurve(t, startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint);\n return v3Normalize(dxVector, decimalPlaces);\n};\n\n// -------------------- NORMAL --------------------------\n\n/**\n * Normal is a vector that runs at a right angle to the direction of the curve, and is typically of length 1.\n * To find it, we take the normalised tangent vector, and then rotate it by a 90 degrees.\n */\nexport const v2QuadraticBezierCurveNormal = (\n t: number,\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const tangent = v2QuadraticBezierCurveTangent(t, startControlPoint, centerControlPoint, endControlPoint, decimalPlaces);\n return [-tangent[1], tangent[0]];\n};\n\nexport const v2CubicBezierCurveNormal = (\n t: number,\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const tangent = v2CubicBezierCurveTangent(t, startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint, decimalPlaces);\n return [-tangent[1], tangent[0]];\n};\n\n// -------------------- EXTREMA --------------------------\n\n/**\n * Find maxima and minima by solving the equation B'(t) = 0\n * Returns result in [0, 1] range.\n */\nexport const v2QuadraticBezierCurveExtrema = (\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector => {\n\n /*\n (-2 * (1 - t)) * startControlPoint[0] + (2 - 4 * t) * centerControlPoint[0] + (2 * t) * endControlPoint[0]\n 2 * t * startControlPoint[0] - 4 * t * centerControlPoint[0] + 2 * t * endControlPoint[0] - 2 * startControlPoint[0] + 2 * centerControlPoint[0]\n t * (2 * startControlPoint[0] - 4 * centerControlPoint[0] + 2 * endControlPoint[0]) + (- 2 * startControlPoint[0] + 2 * centerControlPoint[0])\n */\n\n const a1 = 2 * startControlPoint[0] - 4 * centerControlPoint[0] + 2 * endControlPoint[0];\n const b1 = -2 * startControlPoint[0] + 2 * centerControlPoint[0];\n const equation1: Vector3 = [a1, b1, 0];\n const res1 = linearEquation(equation1, decimalPlaces);\n\n const a2 = 2 * startControlPoint[1] - 4 * centerControlPoint[1] + 2 * endControlPoint[1];\n const b2 = -2 * startControlPoint[1] + 2 * centerControlPoint[1];\n const equation2: Vector3 = [a2, b2, 0];\n const res2 = linearEquation(equation2, decimalPlaces);\n\n const res: Vector = [];\n\n if(isNumber(res1)){\n res.push(res1);\n }\n\n if(isNumber(res2)){\n res.push(res2);\n }\n\n return res;\n};\n\n/**\n * Find maxima and minima by solving the equation B'(t) = 0\n * Returns result in [0, 1] range.\n */\nexport const v2CubicBezierCurveExtrema = (\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2|null => {\n\n const a1 = -3 * startControlPoint[0] + 9 * center1ControlPoint[0] - 9 * center2ControlPoint[0] + 3 * endControlPoint[0];\n const b1 = 6 * startControlPoint[0] - 12 * center1ControlPoint[0] + 6 * center2ControlPoint[0];\n const c1 = -3 * startControlPoint[0] + 3 * center1ControlPoint[0];\n const equation1: Vector = [a1, b1, c1, 0];\n\n const a2 = -3 * startControlPoint[1] + 9 * center1ControlPoint[1] - 9 * center2ControlPoint[1] + 3 * endControlPoint[1];\n const b2 = 6 * startControlPoint[1] - 12 * center1ControlPoint[1] + 6 * center2ControlPoint[1];\n const c2 = -3 * startControlPoint[1] + 3 * center1ControlPoint[1];\n const equation2: Vector = [a2, b2, c2, 0];\n\n // Any value between 0 and 1 is a root that matters for B\u00E9zier curves, anything below or above that is irrelevant (because B\u00E9zier curves are only defined over the interval [0,1]).\n const res1 = quadraticEquation(equation1, decimalPlaces).filter(num => num >= 0 && num <= 1);\n const res2 = quadraticEquation(equation2, decimalPlaces).filter(num => num >= 0 && num <= 1);\n\n const res = [...res1, ...res2];\n if(res.length === 2){\n return [...res1, ...res2] as Vector2;\n }\n\n return null;\n};\n\n// -------------------- BOUNDING BOX --------------------------\n\nexport const v2QuadraticBezierBBox = (\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : IBBox => {\n\n const extrema = v2QuadraticBezierCurveExtrema(startControlPoint, centerControlPoint, endControlPoint);\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for(const percent of extrema){\n const point = v2QuadraticBezierCurve(percent, startControlPoint, centerControlPoint, endControlPoint);\n\n const x = point[0];\n const y = point[1];\n\n minX = Math.min(minX, x);\n maxX = Math.max(maxX, x);\n\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y);\n }\n\n minX = setDecimalPlaces(Math.min(minX, startControlPoint[0], endControlPoint[0]), decimalPlaces);\n maxX = setDecimalPlaces(Math.max(maxX, startControlPoint[0], endControlPoint[0]), decimalPlaces);\n minY = setDecimalPlaces(Math.min(minY, startControlPoint[1], endControlPoint[1]), decimalPlaces);\n maxY = setDecimalPlaces(Math.max(maxY, startControlPoint[1], endControlPoint[1]), decimalPlaces);\n\n return {\n x: minX,\n y: minY,\n w: Math.abs(maxX - minX),\n h: Math.abs(maxY - minY),\n x2: maxX,\n y2: maxY,\n }\n};\n\nexport const v2CubicBezierBBox = (\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : IBBox => {\n\n const extrema = v2CubicBezierCurveExtrema(startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint) || [];\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for(const percent of extrema){\n const point = v2CubicBezierCurve(percent, startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint);\n\n const x = point[0];\n const y = point[1];\n\n minX = Math.min(minX, x ?? Infinity);\n maxX = Math.max(maxX, x ?? -Infinity);\n\n minY = Math.min(minY, y ?? Infinity);\n maxY = Math.max(maxY, y ?? -Infinity);\n }\n\n minX = setDecimalPlaces(Math.min(minX, startControlPoint[0], endControlPoint[0]), decimalPlaces);\n maxX = setDecimalPlaces(Math.max(maxX, startControlPoint[0], endControlPoint[0]), decimalPlaces);\n minY = setDecimalPlaces(Math.min(minY, startControlPoint[1], endControlPoint[1]), decimalPlaces);\n maxY = setDecimalPlaces(Math.max(maxY, startControlPoint[1], endControlPoint[1]), decimalPlaces);\n\n return {\n x: minX,\n y: minY,\n w: Math.abs(maxX - minX),\n h: Math.abs(maxY - minY),\n x2: maxX,\n y2: maxY,\n }\n};\n\n\n", "import { Vector2 } from '../types';\nimport { v2Sub } from './linear-algebra/vector';\nimport { getV2Angle } from './angle';\nimport { convertRange } from './other';\n\n/**\n * Circle Equation\n * x^2 + y^2 = radius^2\n * ----------------------\n * Circle Parametric Equation\n * x(t) = radius * cos(t)\n * y(t) = radius * sin(t)\n * t is the parameter = angle\n *\n * Angle should be in the range [0, Math.PI]\n */\nexport const circleMovement = (center: Vector2, angle: number, radius: number): Vector2 => {\n angle = angle % Math.PI * 2;\n\n return [\n center[0] + Math.cos(angle) * radius,\n center[1] + Math.sin(angle) * radius\n ];\n};\n\n/**\n * Circle Movement After Mouse.\n * Mouse Positions:\n * - pageX/Y coordinates are relative to the top left corner of the whole rendered page (including parts hidden by scrolling),\n * - screenX and screenY: Relative to the top left of the physical screen/monitor, this reference point only moves if you increase or decrease the number of monitors or the monitor resolution.\n * - clientX/Y coordinates are relative to the top left corner of the visible part of the page, \"seen\" through browser window.\n * - offsetX and offsetY are relative to the parent container,\n */\nexport const circleMovementAfterMouse = (\n mouse: Vector2,\n center: Vector2,\n radius: number\n): Vector2 => {\n\n const vector = v2Sub(mouse, center);\n\n let angle = getV2Angle(vector);\n\n // convert the angle from the range [0, Math.PI*2] to the range [0, Math.PI]\n angle = convertRange(angle, 0, Math.PI*2, 0, Math.PI);\n\n return circleMovement(center, angle, radius);\n};\n\n/**\n * Ellipse Equation\n * (x - centerX)^2 / (radius1^2) + (y - centerY)^2 / (radius2^2) = 1\n * -----------------------------------------------------------------\n * Ellipse Parametric Equation\n * x(t) = radius1 * cos(t)\n * y(t) = radius2 * sin(t)\n * t is the parameter = angle\n *\n * Angle should be in the range [0, Math.PI]\n */\nexport const ellipseMovement = (center: Vector2, angle: number, radius1: number, radius2: number): Vector2 => {\n angle = angle % Math.PI * 2;\n\n return [\n center[0] + Math.cos(angle) * radius1,\n center[1] + Math.sin(angle) * radius2\n ];\n};\n\n/**\n * Ellipse Movement After Mouse.\n * Mouse Positions:\n * - pageX/Y coordinates are relative to the top left corner of the whole rendered page (including parts hidden by scrolling),\n * - screenX and screenY: Relative to the top left of the physical screen/monitor, this reference point only moves if you increase or decrease the number of monitors or the monitor resolution.\n * - clientX/Y coordinates are relative to the top left corner of the visible part of the page, \"seen\" through browser window.\n * - offsetX and offsetY are relative to the parent container,\n */\nexport const ellipseMovementAfterMouse = (\n mouse: Vector2,\n center: Vector2,\n radii: Vector2\n): Vector2 => {\n\n const vector = v2Sub(mouse, center);\n\n let angle = getV2Angle(vector);\n\n // convert the angle from the range [0, Math.PI*2] to the range [0, Math.PI]\n angle = convertRange(angle, 0, Math.PI*2, 0, Math.PI);\n\n return ellipseMovement(center, angle, radii[0], radii[1]);\n};\n\n/**\n * Sine Wave Equation (Sinusoid)\n * -----------------------------\n * const y = amplitude * Math.sin(2 * Math.PI * frequency * x + phase);\n * amplitude = the peak deviation of the function from zero\n * frequency = number of cycles\n * phase = specifies (in radians) where in its cycle the oscillation is at t = 0.\n * think of it as \"shifting\" the starting point of the function to the right (positive p) or left (negative)\n */\nexport const sineWaveMovement = (x: number, amplitude: number, frequency: number, phase: number) : Vector2 => {\n /*\n example values:\n const amplitude = 50;\n const frequency = 0.005;\n const phase = 0;\n x: [0, 1000]\n */\n const y = amplitude * Math.sin(2 * Math.PI * frequency * x + phase);\n\n return [x, y];\n};\n\n/**\n * Lissajous curve (Lissajous figure or Bowditch curve)\n * Parametric equation #1\n * f(t) = A * sin(k * t + m)\n * f(t) = B * sin(n * t)\n * 0 <= m <= PI/2\n * k, n >= 1\n * -----------------------\n * Parametric equation #2\n * f(t) = A * cos(k * t - m)\n * f(t) = B * cos(n * t - p)\n * -----------------------------\n * Shapes:\n * k = 1, n = 1, m = 0, p = 0 ---> line\n * A = B, k = 1, n = 1, m = PI/2, p = PI/2 ----> circle\n * A != B, k = 1, n = 1, m = PI/2, p = PI/2 ----> ellipse\n * k = 2, n = 2, m = PI/2, p = PI/2 ----> section of a parabola\n */\nexport const lissajousCurve = (\n width: number,\n height: number,\n t: number,\n k: number,\n n: number,\n m: number,\n p: number\n) :Vector2 => {\n return [\n width * Math.cos(k * t - m),\n height * Math.cos(n * t - p),\n ];\n};\n", "import { getRandom } from './random';\nimport { HSLColor, RGBColor } from '../types';\nimport { mod } from './other';\nimport { setDecimalPlaces } from './format';\n\n// ------------------------ RANDOM COLOR -------------------------------------\n\nexport const getRandomRGBColor = () : RGBColor => {\n const hslColor = getRandomHSLColor();\n return hslToRgb(hslColor);\n};\n\nexport const getRandomHexColor = () : string => {\n const hslColor = getRandomHSLColor();\n return hslToHex(hslColor);\n};\n\nexport const getRandomHSLColor = () : HSLColor => {\n const h = getRandom(1, 360);\n const s = getRandom(0, 100);\n const l = getRandom(0, 100);\n return [h, s, l];\n};\n\n/**\n * generate random color with the given hue\n */\nexport const getRandomHSLColorWithHue = (h: number) : HSLColor => {\n const s = getRandom(0, 100);\n const l = getRandom(0, 100);\n return [h, s, l];\n};\n\n/**\n * generate random color with the given saturation\n */\nexport const getRandomHSLColorWithSaturation = (s: number) : HSLColor => {\n const h = getRandom(1, 360);\n const l = getRandom(0, 100);\n return [h, s, l];\n};\n\n/**\n * generate random color with the given lightness\n */\nexport const getRandomHSLColorWithLightness = (l: number) : HSLColor => {\n const h = getRandom(1, 360);\n const s = getRandom(0, 100);\n return [h, s, l];\n};\n\nexport const getRandomGrayscaleHSLColor = () : HSLColor => {\n const l = getRandom(0, 100);\n return [0, 0, l];\n};\n\nexport const getRandomHSLColorWithinRanges = (\n hueStart = 1, hueEnd = 360,\n saturationStart = 0, saturationEnd = 100,\n lightStart = 0, lightEnd = 100\n) : HSLColor => {\n const h = getRandom(hueStart, hueEnd);\n const s = getRandom(saturationStart, saturationEnd);\n const l = getRandom(lightStart, lightEnd);\n return [h, s, l];\n};\n\n// ----------------------- CONVERT COLORS --------------------------------------\n\n/**\n * helper: convert hue value to %\n * @param {number} h\n * @return {number} [0, 100] %\n */\nconst convertHueToPercent = (h : number) : number => {\n\n // the hue value needs to be multiplied by 60 to convert it to degrees\n h *= 60;\n\n // if hue becomes negative, you need to add 360 to, because a circle has 360 degrees\n if(h < 0){\n h += 360;\n }\n\n // convert huw to %\n return h * 100 / 360;\n};\n\n/**\n * get hue from RGB\n * @param {number} r [0, 255]\n * @param {number} g [0, 255]\n * @param {number} b [0, 255]\n * @param {number|undefined=} min - min number of [r, g, b]\n * @param {number|undefined=} max - max number of [r, g, b]\n * @return {number} [0, 100] % - we use here % instead of [0, 359] degrees\n */\nconst getHue = (r : number, g : number, b : number, min : number | undefined = undefined, max : number | undefined = undefined) : number => {\n\n // find the minimum and maximum values of r, g, and b if they are not provided\n min = (min === undefined) ? Math.min(r, g, b) : min;\n max = (min === undefined) ? Math.max(r, g, b) : max;\n\n // if the min and max value are the same -> no hue, as it's gray\n if(min === max) return 0;\n\n // if red is max\n if(max === r){\n return convertHueToPercent((g - b) / (max - min));\n }\n\n // if green is max\n if(max === g){\n return convertHueToPercent(2.0 + (b - r) / (max - min));\n }\n\n // if blue is max\n if(max === b){\n return convertHueToPercent(4.0 + (r - g) / (max - min));\n }\n\n return 0;\n};\n\n/**\n * get luminance from RGB\n * @param {number} r [0, 255]\n * @param {number} g [0, 255]\n * @param {number} b [0, 255]\n * @param {number|undefined=} min - min number of [r, g, b]\n * @param {number|undefined=} max - max number of [r, g, b]\n * @return {number} [0, 100] %\n */\nconst getLuminance = (\n r : number,\n g : number,\n b : number,\n min : number | undefined = undefined,\n max : number | undefined = undefined) : number => {\n\n // find the minimum and maximum values of r, g, and b if they are not provided\n min = (min === undefined) ? Math.min(r, g, b) : min;\n max = (min === undefined) ? Math.max(r, g, b) : max;\n\n // calculate the luminance value\n // @ts-ignore\n const l = (min + max) / 2; // [0, 1]\n\n // return l value in %\n return l * 100;\n};\n\n/**\n * get saturation from RGB\n * @param {number} r [0, 255]\n * @param {number} g [0, 255]\n * @param {number} b [0, 255]\n * @param {number|undefined=} min - min number of [r, g, b]\n * @param {number|undefined=} max - max number of [r, g, b]\n * @param {number|undefined=} l - luminance in [0, 100] %\n * @return {number} [0, 100] %\n */\nconst getSaturation = (\n r : number,\n g : number,\n b : number,\n min : number | undefined = undefined,\n max : number | undefined = undefined,\n l : number | undefined = undefined) : number => {\n\n // find the minimum and maximum values of r, g, and b if they are not provided\n min = (min === undefined) ? Math.min(r, g, b) : min;\n max = (min === undefined) ? Math.max(r, g, b) : max;\n\n // if the min and max value are the same -> no saturation, as it's gray\n if(min === max) return 0;\n\n // calculate luminance if it's not provided\n l = (l === undefined) ? getLuminance(r, g, b) : l;\n\n // check the level of luminance\n const s = (l <= 50) ?\n // @ts-ignore\n ((max - min) / (max + min)) : // this formula is used when luminance <= 50%\n // @ts-ignore\n (max - min) / (2.0 - max - min); // this formula is used when luminance > 50%\n\n // return saturation in %\n return s * 100;\n};\n\nexport const rgbToHsl = (rgb: RGBColor, decimalPlaces = Infinity): HSLColor => {\n\n // convert rgb values to the range [0, 1]\n const r = rgb[0] / 255;\n const g = rgb[1] / 255;\n const b = rgb[2] / 255;\n\n // find the minimum and maximum values of r, g, and b\n const min = Math.min(r, g, b);\n const max = Math.max(r, g, b);\n\n // calculate the luminance value in %\n const l = getLuminance(r, g, b, min, max);\n\n // calculate the saturation in %\n const s = getSaturation(r, g, b, min, max, l);\n\n // calculate the hue in % (not in degrees!)\n const h = getHue(r, g, b, min, max);\n\n if(h > 360 || s > 100 || l > 100){\n return [0, 0, 100];\n }\n\n if(h < 0 || s < 0 || l < 0){\n return [0, 0, 0];\n }\n\n return [\n setDecimalPlaces(h, decimalPlaces),\n setDecimalPlaces(s, decimalPlaces),\n setDecimalPlaces(l, decimalPlaces),\n ];\n};\n\n/**\n * helper: HSL to RGB\n */\nconst hslToRgbHelper = (helper1 : number, helper2 : number, colorHelper : number) : number => {\n\n // all values need to be between 0 and 1\n // if you get a negative value you need to add 1 to it\n if(colorHelper < 0) colorHelper += 1;\n\n // if you get a value above 1 you need to subtract 1 from it.\n if(colorHelper > 1) colorHelper -= 1;\n\n if(colorHelper * 6 < 1) return helper2 + (helper1 - helper2) * 6 * colorHelper;\n\n if(colorHelper * 2 < 1) return helper1;\n\n if(colorHelper * 3 < 2){\n return helper2 + (helper1 - helper2) * (0.666 - colorHelper) * 6;\n }\n else{\n return helper2;\n }\n};\n\nexport const hslToRgb = (hsl: HSLColor, decimalPlaces = Infinity): RGBColor => {\n\n // convert all values to [0, 1] from %\n const h = hsl[0] / 100;\n const s = hsl[1] / 100;\n const l = hsl[2] / 100;\n\n // if there is no saturation -> it\u2019s grey\n if(s === 0){\n // convert the luminance from [0, 1] to [0, 255]\n const gray = l * 255;\n return [gray, gray, gray];\n }\n\n // check the level of luminance\n const helper1 = (l < 0.5) ?\n (l * (1.0 + s)) :\n (l + s - l * s);\n\n const helper2 = 2 * l - helper1;\n\n const rHelper = h + 0.333;\n const gHelper = h;\n const bHelper = h - 0.333;\n\n let r = hslToRgbHelper(helper1, helper2, rHelper);\n let g = hslToRgbHelper(helper1, helper2, gHelper);\n let b = hslToRgbHelper(helper1, helper2, bHelper);\n\n // convert rgb to [0, 255]\n r *= 255;\n g *= 255;\n b *= 255;\n\n if(r > 255 || g > 255 || b > 255){\n return [255, 255, 255];\n }\n\n if(r < 0 || g < 0 || b < 0){\n return [0, 0, 0];\n }\n\n return [\n setDecimalPlaces(r, decimalPlaces),\n setDecimalPlaces(g, decimalPlaces),\n setDecimalPlaces(b, decimalPlaces),\n ];\n};\n\n/**\n * HSL to hex\n * hslToHex(360, 100, 50) // [360, 100, 5] ==> \"#ff0000\" (red)\n */\nexport const hslToHex = (hsl: HSLColor) => {\n\n if(hsl[0] > 360 || hsl[1] > 100 || hsl[2] > 100){\n return '#ffffff';\n }\n\n if(hsl[0] < 0 || hsl[1] < 0 || hsl[2] < 0){\n return '#000000';\n }\n\n const h = hsl[0] / 360;\n const s = hsl[1] / 100;\n const l = hsl[2] / 100;\n\n let r, g, b;\n if (s === 0) {\n r = g = b = l; // achromatic\n } else {\n const hue2rgb = (p: number, q: number, t: number) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n const toHex = (x: number) => {\n const hex = Math.round(x * 255).toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n };\n\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n};\n\n// ----------------------- GET SHIFTED COLORS --------------------------------------\n\nexport const getShiftedHue = (color: HSLColor, shift = 180) : HSLColor => {\n let hue = color[0];\n hue += shift;\n\n if (hue > 360 || hue < 0) {\n hue = mod(hue, 360);\n }\n\n return [hue, color[1], color[2]];\n};\n\nexport const getShiftedLightness = (color: HSLColor, shift = 10) : HSLColor => {\n let lightness = color[2];\n lightness += shift;\n\n if (lightness > 100 || lightness < 0) {\n lightness = mod(lightness, 100);\n }\n\n return [color[0], color[1], lightness];\n};\n\nexport const getShiftedSaturation = (color: HSLColor, shift = 10) : HSLColor => {\n let saturation = color[1];\n saturation += shift;\n\n if (saturation > 100) {\n saturation -= 100;\n }\n\n if(saturation < 0){\n saturation += 100;\n }\n\n return [color[0], saturation, color[2]];\n};\n", "/**\n * guid like '932ade5e-c515-4807-ac01-73b20ab3fb66'\n */\nexport const guid = () => {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = Math.random() * 16 | 0;\n return (c == 'x' ? r : r & 0x3 | 0x8).toString(16);\n });\n};\n\n/**\n * id like 'df4unio1opulby2uqh4'\n */\nexport const newId = () => {\n return Math.random().toString(36).substring(2) + (new Date()).getTime().toString(36);\n};\n", "import { setDecimalPlaces } from './format';\n\n/**\n * get the side of a square inscribed in a circle\n */\nexport const getSquareInCircleSide = (radius: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(radius * 2 / Math.sqrt(2), decimalPlaces);\n};\n", "import { ICircle, IPolygon, IRect, Matrix2, Vector2 } from '../types';\nimport { mod } from './other';\nimport { v2GetNormal, v2DotProduct } from './linear-algebra/vector';\n\n/**\n * Rectangles collision detection.\n * Rectangles should not be rotated.\n * The algorithm works by ensuring there is no gap between any of the 4 sides of the rectangles.\n * Any gap means a collision does not exist.\n * Returns true if collision is detected.\n */\nexport const rectCollide = (rect1: IRect, rect2: IRect) : boolean => {\n return rect1.x <= rect2.x + rect2.w &&\n rect1.x + rect1.w >= rect2.x &&\n rect1.y <= rect2.y + rect2.h &&\n rect1.h + rect1.y >= rect2.y;\n};\n\n/**\n * Circles collision detection.\n * This algorithm works by taking the center points of the two circles\n * and ensuring the distance between the center points\n * are less than the two radii added together.\n * Returns true if collision is detected.\n */\nexport const circleCollide = (circle1: ICircle, circle2: ICircle) => {\n const dx = Math.abs(circle1.cx - circle2.cx);\n const dy = Math.abs(circle1.cy - circle2.cy);\n const distance = Math.sqrt(dx * dx + dy * dy);\n return distance <= circle1.r + circle2.r;\n};\n\n//-------------------- Separating Axis Theorem (SAT) Collision detection -------------------------\n\nconst getEdges = (poly: IPolygon) : Matrix2[] => {\n const edges: Matrix2[] = [];\n\n for(let i= 0; i {\n const edges: Matrix2[] = [];\n\n // collect polygon edges, and combine then into a single array\n edges.push(...getEdges(poly1));\n edges.push(...getEdges(poly2));\n\n // for each edge, find the normal vector and project both polygons onto it\n for (const edge of edges) {\n const normal = v2GetNormal(edge[0], edge[1]);\n const p1Proj = projectPolygon(poly1, normal);\n const p2Proj = projectPolygon(poly2, normal);\n\n // Check if the projections overlap\n const isOverlap = p1Proj.max >= p2Proj.min && p2Proj.max >= p1Proj.min;\n\n // Check if the projections overlap; if not, the polygons do not collide\n if (!isOverlap) return false;\n }\n\n // If all tests pass, the polygons overlap and collide\n return true;\n};\n\n/**\n * Project every polygon point onto the normal.\n * Then find min and max.\n */\nconst projectPolygon = (polygon: IPolygon, normal: Vector2): { min: number, max: number } => {\n let min = Infinity;\n let max = -Infinity;\n\n // Project each vertex of the polygon onto the axis\n for (const vertex of polygon) {\n const projection = v2DotProduct(vertex, normal);\n min = Math.min(min, projection);\n max = Math.max(max, projection);\n }\n\n return { min, max };\n};", "export interface IAnimationProps {\n duration?: number;\n callback: (result: IAnimationResult) => void;\n restartOnResize?: boolean;\n resizeCallback?: (_entries: ResizeObserverEntry[], _observer: ResizeObserver) => void;\n}\n\nexport interface IAnimationResult {\n start: () => void;\n stop: () => void;\n pause: () => void;\n resume: () => void;\n restart: () => void;\n isAnimating: () => boolean;\n getStartTime: () => number|undefined;\n getElapsedTime: () => number|undefined;\n getPercent: () => number|undefined;\n getResizeObserver: () => ResizeObserver|undefined;\n}\n\nexport const animate = (props: IAnimationProps) : IAnimationResult => {\n\n const _duration = props.duration !== undefined ? props.duration : Infinity;\n\n let startTime: number|undefined = undefined; // in milliseconds\n let animationId: number|undefined = undefined;\n\n // the time elapsed since the start of the animation (in milliseconds)\n let elapsed: number|undefined = undefined;\n let previousTimeStamp: number|undefined = undefined;\n\n let animating = false;\n let observer: ResizeObserver|undefined = undefined;\n\n // -------------------- COMMANDS ---------------------\n\n const stop = () => {\n startTime = undefined;\n elapsed = undefined;\n previousTimeStamp = undefined;\n animating = false;\n\n /*if(observer !== undefined){\n observer.disconnect();\n observer = undefined;\n }*/\n\n if(animationId === undefined) return;\n window.cancelAnimationFrame(animationId);\n };\n\n const restart = () => {\n stop();\n start();\n };\n\n const pause = () => {\n animating = false;\n };\n\n const resume = () => {\n animating = true;\n };\n\n /**\n * Animation Step.\n * @param {number} timeStamp in milliseconds\n */\n const step = (timeStamp: DOMHighResTimeStamp) => {\n\n if (startTime === undefined) {\n startTime = timeStamp;\n }\n\n // the time elapsed since the start of the animation (in milliseconds)\n elapsed = timeStamp - startTime;\n\n if (animating && previousTimeStamp !== timeStamp && typeof props.callback === 'function') {\n\n // do the rendering .............\n props.callback(getResult());\n }\n\n if(elapsed <= _duration){\n previousTimeStamp = timeStamp;\n animationId = window.requestAnimationFrame(step);\n }\n else{\n stop();\n }\n };\n\n const observerHandler = (_entries: ResizeObserverEntry[], _observer: ResizeObserver) => {\n restart();\n\n if(typeof props.resizeCallback === 'function'){\n props.resizeCallback(_entries, _observer);\n }\n };\n\n const start = () => {\n startTime = undefined;\n elapsed = undefined;\n previousTimeStamp = undefined;\n animating = true;\n\n if(props.restartOnResize && window.ResizeObserver && observer === undefined){\n observer = new ResizeObserver(observerHandler);\n observer.observe(document.body, { box: 'border-box' });\n }\n else{\n animationId = window.requestAnimationFrame(step);\n }\n };\n\n // --------------- GET INFO ----------------------\n\n /**\n * the time elapsed since the start of the animation (in milliseconds)\n */\n const getElapsedTime = () : number|undefined => {\n return elapsed;\n };\n\n const isAnimating = () => {\n return animating;\n };\n\n const getStartTime = () => {\n return startTime;\n };\n\n const getPercent = () => {\n if(_duration === Infinity || elapsed === undefined) return undefined;\n return elapsed * 100 / _duration;\n };\n\n const getResizeObserver = () => {\n return observer;\n };\n\n const getResult = () : IAnimationResult => {\n return {\n\n // commands --------------\n start,\n stop,\n pause,\n resume,\n restart,\n\n // information -------\n isAnimating,\n getElapsedTime,\n getStartTime,\n getPercent,\n getResizeObserver,\n };\n };\n\n return getResult();\n};\n", "import { setDecimalPlaces, Vector2 } from 'mz-math';\n\nexport interface ISvg {\n cx: number;\n cy: number;\n radius: number;\n size: number;\n thickness: number;\n border: number;\n startAngleDeg: number;\n endAngleDeg: number;\n}\n\nexport const getSvg = (\n circleRadius: number,\n circleThickness: number,\n circleBorder: number,\n maxPointerRadius: number,\n startAngleDeg: number,\n endAngleDeg: number\n) : ISvg => {\n\n const thickness = circleThickness + circleBorder * 2;\n\n const diff = Math.max(0, maxPointerRadius * 2 - thickness);\n const size = circleRadius * 2 + thickness + diff;\n\n const [ cx, cy ] = getSVGCenter(\n circleRadius,\n maxPointerRadius,\n circleThickness,\n circleBorder\n );\n\n return {\n cx,\n cy,\n radius: circleRadius,\n size,\n thickness: circleThickness,\n border: circleBorder,\n startAngleDeg,\n endAngleDeg\n } as ISvg;\n};\n\nconst getSVGCenter = (\n circleRadius: number,\n maxPointerRadius: number,\n circleThickness: number,\n circleBorder: number\n) : Vector2 => {\n\n const size = getSVGSize(\n circleRadius,\n maxPointerRadius,\n circleThickness,\n circleBorder\n );\n\n const val = setDecimalPlaces(size/2, 2);\n\n return [\n val,\n val,\n ];\n};\n\nconst getSVGSize = (\n circleRadius: number,\n maxPointerRadius: number,\n circleThickness: number,\n circleBorder: number\n) : number => {\n const thickness = circleThickness + circleBorder * 2;\n const diff = Math.max(0, maxPointerRadius * 2 - thickness);\n return circleRadius * 2 + thickness + diff;\n};", "// Data Defaults --------------------\nexport const DEFAULT_MIN = 0;\nexport const DEFAULT_MAX = 100;\nexport const DEFAULT_STEP = 1;\nexport const DEFAULT_ARROW_STEP = 1;\nexport const DEFAULT_ROUND = 0;\n\n// Path Defaults ---------------------\nexport const DEFAULT_PATH_START_ANGLE = 0;\nexport const DEFAULT_PATH_END_ANGLE = 360;\nexport const DEFAULT_PATH_RADIUS = 150;\nexport const DEFAULT_PATH_THICKNESS = 5;\nexport const DEFAULT_PATH_BG_COLOR = '#efefef';\nexport const DEFAULT_PATH_BORDER = 0;\nexport const DEFAULT_PATH_BORDER_COLOR = '#444444';\n\n// Pointer Defaults ------------------\nexport const DEFAULT_POINTER_RADIUS = 10;\nexport const DEFAULT_POINTER_BG_COLOR = '#163a86';\nexport const DEFAULT_POINTER_BG_COLOR_SELECTED = '#000';\nexport const DEFAULT_POINTER_BG_COLOR_DISABLED = '#a8a8a8';\nexport const DEFAULT_POINTER_BORDER = 0;\nexport const DEFAULT_POINTER_BORDER_COLOR = '#000';\n\n// Connection Defaults ------------------\nexport const DEFAULT_CONNECTION_BG_COLOR = '#5daed2';\nexport const DEFAULT_CONNECTION_BG_COLOR_DISABLED = '#97b0bb';\n\n// Text Defaults ------------------------\nexport const DEFAULT_TEXT_COLOR = '#000';\nexport const DEFAULT_TEXT_FONT_SIZE = 16;\n\n// Ticks Defaults -----------------------\nexport const DEFAULT_TICKS_WIDTH = 3;\nexport const DEFAULT_TICKS_HEIGHT = 20;\nexport const DEFAULT_TICKS_COLOR = '#efefef';\nexport const DEFAULT_TICKS_VALUES_COLOR = '#000';\nexport const DEFAULT_TICKS_VALUES_FONT_SIZE = 12;\nexport const DEFAULT_TICKS_GROUP_SIZE = 10;\nexport const DEFAULT_TICKS_VALUES_DISTANCE = 15;\n\n\n", "import { isNumber } from 'mz-math';\n\nexport const getNumber = (value: number|string|undefined|null, defaultValue: number) : number => {\n return isNumber(value) ? Number(value) : defaultValue;\n};\n\nexport const getString = (value: string|undefined|null, defaultValue: string) : string => {\n return value === undefined || value === null ? defaultValue : value;\n};\n\nexport const getBoolean = (value: boolean|undefined|null, defaultValue: boolean) : boolean => {\n return value === undefined || value === null ? defaultValue : value;\n};", "import { mod } from 'mz-math';\n\nexport interface ICircle {\n strokeDasharray: string;\n strokeOffset: number;\n}\n\nexport const isAngleInArc = (startAngleDeg: number, endAngleDeg: number, currentDegrees: number) : boolean => {\n\n if(startAngleDeg > endAngleDeg) {\n endAngleDeg += 360;\n }\n\n return currentDegrees >= startAngleDeg && currentDegrees <= endAngleDeg ||\n (currentDegrees + 360) >= startAngleDeg && (currentDegrees + 360) <= endAngleDeg;\n};\n\nexport const getAnglesDistance = (startAngle: number, endAngle: number) => {\n if(endAngle < startAngle) {\n endAngle += 360;\n }\n\n const diff = endAngle - startAngle;\n const diffMod = mod(diff, 360);\n\n return diffMod === 0 && diff > 0 ? 360 : diffMod;\n};\n\nexport const getCircle = (\n startAngleDeg: number,\n endAngleDeg: number,\n radius: number,\n) : ICircle => {\n\n if(startAngleDeg > endAngleDeg) {\n endAngleDeg += 360;\n }\n\n const circumference = 2 * Math.PI *radius;\n\n if(startAngleDeg > endAngleDeg) {\n endAngleDeg += 360;\n }\n\n const angleDiff = endAngleDeg - startAngleDeg;\n const strokeOffset = -(startAngleDeg / 360) * circumference;\n const strokeDasharray = (angleDiff / 360) * circumference;\n const complement = circumference - strokeDasharray;\n\n return {\n strokeDasharray: [ strokeDasharray, complement ].join(' '),\n strokeOffset,\n } as ICircle;\n};", "import {\n Vector2,\n newId,\n convertRange,\n mod,\n setDecimalPlaces,\n v2Sub,\n radiansToDegrees,\n degreesToRadians, circleMovement, v2Distance\n} from 'mz-math';\nimport { ISettings } from './settings-provider';\nimport {\n DEFAULT_PATH_END_ANGLE,\n DEFAULT_PATH_START_ANGLE,\n DEFAULT_POINTER_BG_COLOR, DEFAULT_POINTER_BG_COLOR_DISABLED, DEFAULT_POINTER_BG_COLOR_SELECTED,\n DEFAULT_POINTER_BORDER,\n DEFAULT_POINTER_BORDER_COLOR,\n DEFAULT_POINTER_RADIUS,\n} from './defaults-provider';\nimport { getBoolean, getNumber, getString } from './common-provider';\nimport { IData } from './data-provider';\nimport { getAnglesDistance } from './circle-provider';\n\nexport interface IPointer {\n id: string;\n index: number;\n radius: number;\n angleDeg: number;\n bgColor: string;\n bgColorSelected: string;\n bgColorDisabled: string;\n border: number;\n borderColor: string;\n disabled: boolean;\n ariaLabel?: string;\n}\n\nexport interface IPointers {\n pointers: IPointer[];\n maxRadius: number;\n}\n\nexport const getAngleByMouse = (\n $svg: SVGSVGElement,\n clientX: number,\n clientY: number,\n cx: number,\n cy: number,\n rx: number,\n ry: number\n) => {\n const { left, top } = $svg.getBoundingClientRect();\n\n const relativeMouse: Vector2 = [\n clientX - left,\n clientY - top,\n ];\n\n const vector = v2Sub(relativeMouse, [ cx, cy ]);\n\n let angleRad = Math.atan2(vector[1] / ry, vector[0] / rx);\n if(angleRad < 0){\n angleRad += 2 * Math.PI;\n }\n\n return radiansToDegrees(angleRad);\n};\n\nexport const angle2value = (data: IData, angle: number, pathStartAngle: number, pathEndAngle: number) : string | number => {\n\n if(pathEndAngle < pathStartAngle) {\n pathEndAngle += 360;\n }\n\n if(angle < pathStartAngle){\n angle += 360;\n }\n\n let value: string|number = convertRange(angle, pathStartAngle, pathEndAngle, data.min, data.max);\n\n if(data.data.length > 0) {\n const index = Math.round(value);\n value = data.data[index];\n }\n else{\n value = setDecimalPlaces(value, data.round);\n }\n\n return value;\n};\n\nconst value2angle = (data: IData, value: string | number, pathStartAngle: number, pathEndAngle: number) => {\n let _value: number;\n\n if(pathEndAngle < pathStartAngle) {\n pathEndAngle += 360;\n }\n\n if(data.data.length > 0) {\n const valueIndex = data.data.findIndex(item => item === value);\n _value = valueIndex === -1 ? 0 : valueIndex;\n }\n else{\n _value = typeof value !== 'number' ? data.min : value;\n }\n\n return mod(convertRange(_value, data.min, data.max, pathStartAngle, pathEndAngle), 360);\n};\n\nconst initPointers = (\n settings: ISettings,\n data: IData\n) : IPointer[] => {\n\n if(!settings || !settings.pointers || settings.pointers.length < 0 || !data) {\n return [{\n id: newId(),\n index: 0,\n radius: DEFAULT_POINTER_RADIUS,\n angleDeg: mod(getNumber(settings.pathStartAngle, DEFAULT_PATH_START_ANGLE), 360),\n bgColor: getString(settings.pointerBgColor, DEFAULT_POINTER_BG_COLOR),\n bgColorSelected: getString(settings.pointerBgColorSelected, DEFAULT_POINTER_BG_COLOR_SELECTED),\n bgColorDisabled: getString(settings.pointerBgColorDisabled, DEFAULT_POINTER_BG_COLOR_DISABLED),\n border: getNumber(settings.pointerBorder, DEFAULT_POINTER_BORDER),\n borderColor: getString(settings.pointerBorderColor, DEFAULT_POINTER_BORDER_COLOR),\n disabled: !!settings.disabled,\n }]\n }\n\n const pointers: IPointer[] = [];\n\n for(let i=0; i {\n\n const pointers = initPointers(settings, data);\n\n return {\n pointers,\n maxRadius: getMaxRadius(pointers),\n }\n};\n\nconst getMaxRadius = (pointers: IPointer[]) : number => {\n if(pointers.length <= 0) return 0;\n\n let max = -Infinity;\n\n for(const pointer of pointers){\n max = Math.max(max, Math.max(0, pointer.radius + pointer.border/2));\n }\n\n return max;\n};\n\nexport const getClosestPointer = (\n pointers: IPointer[],\n currentPlaceDegrees: number,\n cx: number,\n cy: number,\n pathRadius: number\n) => {\n if(!pointers || pointers.length <= 0) return null;\n\n if(pointers.length === 1) return pointers[0];\n\n const angleRad = convertRange(degreesToRadians(currentPlaceDegrees), 0, Math.PI * 2, 0, Math.PI); // [0, Math.PI*2] ---> [0, Math.PI]\n const currentPointOnArc = circleMovement([ cx, cy ], angleRad, pathRadius);\n\n let min: number|undefined = undefined;\n let closestPointer: IPointer = null;\n\n const enabledPointers = pointers.filter(p => !p.disabled);\n\n for(const pointer of enabledPointers) {\n const pointerAngleRad = convertRange(degreesToRadians(pointer.angleDeg), 0, Math.PI * 2, 0, Math.PI);\n const pointOnArc = circleMovement([ cx, cy ], pointerAngleRad, pathRadius);\n const distance = v2Distance(currentPointOnArc, pointOnArc);\n\n if(min === undefined || distance < min) {\n min = distance;\n closestPointer = pointer;\n }\n }\n\n return { ...closestPointer };\n};\n\nexport const getClosestEdge = (\n startAngleDegrees: number,\n endAngleDegrees: number,\n currentPlaceDegrees: number,\n cx: number,\n cy: number,\n pathRadius: number\n) => {\n\n const angleRad = convertRange(degreesToRadians(currentPlaceDegrees), 0, Math.PI * 2, 0, Math.PI); // [0, Math.PI*2] ---> [0, Math.PI]\n const currentPointOnArc = circleMovement([ cx, cy ], angleRad, pathRadius);\n\n const startAngleRad = convertRange(degreesToRadians(startAngleDegrees), 0, Math.PI * 2, 0, Math.PI); // [0, Math.PI*2] ---> [0, Math.PI]\n const startPointOnArc = circleMovement([ cx, cy ], startAngleRad, pathRadius);\n\n const endAngleRad = convertRange(degreesToRadians(endAngleDegrees), 0, Math.PI * 2, 0, Math.PI); // [0, Math.PI*2] ---> [0, Math.PI]\n const endPointOnArc = circleMovement([ cx, cy ], endAngleRad, pathRadius);\n\n const distance1 = v2Distance(currentPointOnArc, startPointOnArc);\n const distance2 = v2Distance(currentPointOnArc, endPointOnArc);\n\n return distance1 <= distance2 ? startAngleDegrees : endAngleDegrees;\n};\n\nexport const getMinMaxDistancePointers = (pointers: IPointer[], pathStartAngle: number) : [IPointer, IPointer] | null => {\n if(!pointers || pointers.length <= 0) return null;\n\n let minDistance = undefined;\n let maxDistance = undefined;\n let minPointer = null;\n let maxPointer = null;\n\n for(const pointer of pointers) {\n\n const distance = getAnglesDistance(pathStartAngle, pointer.angleDeg);\n\n if(minDistance === undefined || distance < minDistance) {\n minPointer = pointer;\n minDistance = distance;\n }\n\n if(maxDistance === undefined || distance > maxDistance) {\n maxPointer = pointer;\n maxDistance = distance;\n }\n }\n\n if(minPointer === null || maxPointer === null) return null;\n\n return [\n minPointer,\n maxPointer\n ];\n};\n\nexport const roundToStep = (num: number, step: number) : number => {\n return step === 0 ? 0 : Math.round(num / step) * step;\n};\n", "import { angle2value, getAngleByMouse, getClosestEdge, IPointer } from '../domain/pointers-provider';\nimport {\n useEffect,\n useState,\n MouseEvent as ReactMouseEvent,\n TouchEvent as ReactTouchEvent,\n KeyboardEvent,\n useRef, useCallback, MutableRefObject\n} from 'react';\nimport { circleMovement, convertRange, degreesToRadians, Vector2 } from 'mz-math';\nimport { ISettings } from '../domain/settings-provider';\nimport { ISvg } from '../domain/svg-provider';\nimport { isAngleInArc } from '../domain/circle-provider';\nimport { IData } from '../domain/data-provider';\nimport { outlineNoneStyle } from '../domain/style-provider';\n\nexport interface IPointerProps {\n settings: ISettings;\n pointer: IPointer;\n svg: ISvg;\n $svg: SVGSVGElement;\n setPointer: (pointer: IPointer, newAngleDeg: number) => void;\n data: IData;\n}\n\nconst getPointerFill = (\n pointer: IPointer,\n pointerRef: MutableRefObject,\n bgColor: string,\n bgColorSelected: string,\n bgColorDisabled: string\n) => {\n if(pointer.disabled) return bgColorDisabled;\n\n if(document.activeElement === pointerRef.current) {\n return bgColorSelected || bgColor;\n }\n\n return bgColor;\n};\n\nconst Pointer = (props: IPointerProps) => {\n\n const pointerRef = useRef(null);\n\n const {\n pointer, svg, $svg,\n setPointer, data, settings,\n } = props;\n\n const {\n radius,\n angleDeg,\n bgColor,\n bgColorSelected,\n bgColorDisabled,\n border,\n borderColor,\n } = props.pointer;\n\n const { cx, cy } = svg;\n\n const [ center, setCenter ] = useState(null);\n const [ value, setValue ] = useState('');\n\n useEffect(() => {\n const value = angle2value(\n data,\n pointer.angleDeg,\n svg.startAngleDeg,\n svg.endAngleDeg\n );\n setValue(value === undefined ? '' : value.toString())\n }, [\n data,\n pointer.angleDeg,\n svg.startAngleDeg,\n svg.endAngleDeg,\n ]);\n\n useEffect(() => {\n const angleRad = convertRange(degreesToRadians(angleDeg), 0, Math.PI * 2, 0, Math.PI); // [0, Math.PI*2] ---> [0, Math.PI]\n const pointerCenter = circleMovement([cx, cy], angleRad, svg.radius);\n setCenter(pointerCenter);\n }, [\n angleDeg,\n cx,\n cy,\n svg.radius,\n ]);\n\n const onValueChange = useCallback((evt: MouseEvent | ReactMouseEvent | TouchEvent | ReactTouchEvent) => {\n if(!$svg || settings.disabled || pointer.disabled) return;\n\n const mouseX = evt.type.indexOf('mouse') !== -1 ? (evt as MouseEvent).clientX : (evt as TouchEvent).touches[0].clientX;\n const mouseY = evt.type.indexOf('mouse') !== -1 ? (evt as MouseEvent).clientY : (evt as TouchEvent).touches[0].clientY;\n\n const degrees = getAngleByMouse(\n $svg,\n mouseX,\n mouseY,\n svg.cx,\n svg.cy,\n svg.radius,\n svg.radius\n );\n\n let newAngleDeg;\n\n if(!isAngleInArc(\n svg.startAngleDeg,\n svg.endAngleDeg,\n degrees\n )){\n newAngleDeg = getClosestEdge(\n svg.startAngleDeg,\n svg.endAngleDeg,\n pointer.angleDeg,\n svg.cx,\n svg.cy,\n svg.radius\n );\n }\n else{\n newAngleDeg = degrees;\n }\n\n setPointer(pointer, newAngleDeg);\n }, [\n $svg,\n pointer,\n setPointer,\n svg.cx,\n svg.cy,\n svg.endAngleDeg,\n svg.radius,\n svg.startAngleDeg,\n settings.disabled,\n ]);\n\n const onMouseUp = () => {\n window.removeEventListener('mousemove', onValueChange);\n window.removeEventListener('mouseup', onValueChange);\n };\n\n const onMouseDown = (evt: ReactMouseEvent) => {\n if(settings.disabled || pointer.disabled) return;\n\n onValueChange(evt);\n\n window.addEventListener('mousemove', onValueChange);\n window.addEventListener('mouseup', onMouseUp);\n };\n\n const onKeyDown = (evt: KeyboardEvent) => {\n\n if(settings.disabled || pointer.disabled || settings.keyboardDisabled) return;\n\n switch (evt.key) {\n case 'ArrowLeft': {\n evt.preventDefault();\n setPointer(pointer, pointer.angleDeg + data.stepAngleDeg);\n break;\n }\n\n case 'ArrowRight': {\n evt.preventDefault();\n setPointer(pointer, pointer.angleDeg - data.stepAngleDeg);\n break;\n }\n\n case 'ArrowUp': {\n evt.preventDefault();\n setPointer(pointer, pointer.angleDeg - data.stepAngleDeg);\n break;\n }\n\n case 'ArrowDown': {\n evt.preventDefault();\n setPointer(pointer, pointer.angleDeg + data.stepAngleDeg);\n break;\n }\n }\n };\n\n useEffect(() => {\n const $current = pointerRef.current;\n\n const onTouch = (evt: TouchEvent | ReactTouchEvent) => {\n if(settings.disabled || pointer.disabled) return;\n\n evt.preventDefault();\n evt.stopPropagation();\n onValueChange(evt);\n };\n\n const onWheel = (evt: WheelEvent) => {\n\n if(settings.disabled || pointer.disabled || settings.mousewheelDisabled || document.activeElement !== $current) return;\n\n evt.stopPropagation();\n evt.preventDefault();\n\n const scrollTop = evt.deltaY < 0;\n\n let newAngleDeg;\n if(scrollTop) {\n newAngleDeg = pointer.angleDeg + data.stepAngleDeg;\n }\n else{\n newAngleDeg = pointer.angleDeg - data.stepAngleDeg;\n }\n\n setPointer(pointer, newAngleDeg);\n };\n\n $current?.addEventListener('touchmove', onTouch, {\n passive: false,\n });\n\n document.addEventListener('wheel', onWheel, {\n passive: false,\n });\n\n return () => {\n $current?.removeEventListener('touchmove', onTouch);\n document.removeEventListener('wheel', onWheel);\n };\n }, [\n center,\n onValueChange,\n data.stepAngleDeg,\n pointer,\n setPointer,\n settings.disabled,\n settings.mousewheelDisabled,\n ]);\n\n return (\n <>\n {\n center &&\n \n \n \n }\n \n )\n};\n\nexport default Pointer;", "export const outlineNoneStyle = {\n outline: 'none',\n};", "import { IPointer, IPointers } from '../domain/pointers-provider';\nimport Pointer from './Pointer';\nimport { ISettings } from '../domain/settings-provider';\nimport { ISvg } from '../domain/svg-provider';\nimport { IData } from '../domain/data-provider';\n\nexport interface IPointersProps {\n pointers: IPointers;\n settings: ISettings;\n svg: ISvg;\n $svg: SVGSVGElement;\n setPointer: (pointer: IPointer, newAngleDeg: number) => void;\n data: IData;\n}\n\nconst Pointers = (props: IPointersProps) => {\n\n const { pointers, settings, svg, $svg, setPointer, data } = props;\n\n return (\n <>\n {\n pointers.pointers.map(pointer => {\n\n return (\n \n )\n })\n }\n \n )\n};\n\nexport default Pointers;", "import { ISettings } from './settings-provider';\nimport { getNumber } from './common-provider';\nimport {\n DEFAULT_ARROW_STEP,\n DEFAULT_MAX,\n DEFAULT_MIN,\n DEFAULT_PATH_END_ANGLE,\n DEFAULT_PATH_START_ANGLE,\n DEFAULT_ROUND,\n DEFAULT_STEP\n} from './defaults-provider';\nimport { mod } from 'mz-math';\n\nexport interface IData {\n min: number;\n max: number;\n stepAngleDeg: number;\n arrowStepAngleDeg: number;\n round: number;\n data: (string | number)[];\n isClosedShape: boolean;\n}\n\nexport const getData = (setting: ISettings) : IData => {\n\n let min = getNumber(setting.min, DEFAULT_MIN);\n let max = getNumber(setting.max, DEFAULT_MAX);\n const step = getNumber(setting.step, DEFAULT_STEP);\n const arrowStep = getNumber(setting.arrowStep, DEFAULT_ARROW_STEP);\n const round = getNumber(setting.round, DEFAULT_ROUND);\n const data = setting.data || [];\n\n if(data.length > 0) {\n const minIndex = data.findIndex(item => item === min);\n const maxIndex = data.findIndex(item => item === max);\n\n min = minIndex === -1 ? 0 : minIndex;\n max = maxIndex === -1 ? data.length : maxIndex;\n }\n else{\n if(min > max) {\n min = max + DEFAULT_MAX;\n }\n }\n\n const pathStartAngle = getNumber(setting.pathStartAngle, DEFAULT_PATH_START_ANGLE);\n const pathEndAngle = getNumber(setting.pathEndAngle, DEFAULT_PATH_END_ANGLE);\n const isClosedShape = mod(pathStartAngle, 360) === mod(pathEndAngle, 360);\n\n const stepAngleDeg = step * 360 / (max - min);\n const arrowStepAngleDeg = arrowStep * 360 / (max - min);\n\n return {\n min,\n max,\n round,\n data,\n stepAngleDeg,\n arrowStepAngleDeg,\n isClosedShape,\n }\n};", "import { ISettings } from '../domain/settings-provider';\nimport { getBoolean, getString } from '../domain/common-provider';\nimport { DEFAULT_CONNECTION_BG_COLOR, DEFAULT_CONNECTION_BG_COLOR_DISABLED } from '../domain/defaults-provider';\nimport {\n getAngleByMouse,\n getClosestPointer,\n getMinMaxDistancePointers,\n IPointer,\n IPointers\n} from '../domain/pointers-provider';\nimport {\n MouseEvent as ReactMouseEvent,\n useCallback,\n useEffect, useRef,\n useState\n} from 'react';\nimport { getConnection, IConnection } from '../domain/connection-provider';\nimport { ISvg } from '../domain/svg-provider';\nimport { IData } from '../domain/data-provider';\nimport { mod } from 'mz-math';\n\ninterface IConnectionProps {\n settings: ISettings;\n pointers: IPointers;\n svg: ISvg;\n $svg: SVGSVGElement;\n data: IData;\n setPointer: (pointer: IPointer, newAngleDeg: number) => void;\n}\n\nconst Connection = (props: IConnectionProps) => {\n\n const { settings, pointers, $svg, svg, data, setPointer } = props;\n\n const [ connection, setConnection ] = useState(null);\n\n const rangeDraggingLastAngle = useRef();\n\n useEffect(() => {\n setConnection(getConnection(\n pointers,\n svg.radius,\n svg.cx,\n svg.cy,\n svg.startAngleDeg,\n svg.endAngleDeg\n ));\n }, [\n pointers,\n svg.radius,\n svg.cx,\n svg.cy,\n svg.startAngleDeg,\n svg.endAngleDeg\n ]);\n\n const onClick = (evt: ReactMouseEvent) => {\n if(!$svg || settings.disabled) return;\n\n const degrees = getAngleByMouse(\n $svg,\n evt.clientX,\n evt.clientY,\n svg.cx,\n svg.cy,\n svg.radius,\n svg.radius\n );\n\n const closestPointer = getClosestPointer(\n pointers.pointers,\n degrees,\n svg.cx,\n svg.cy,\n svg.radius\n );\n\n if(!closestPointer) return;\n\n setPointer(closestPointer, degrees);\n };\n\n const onValueChange = useCallback((evt: MouseEvent | ReactMouseEvent) => {\n if(!$svg || settings.disabled || !settings.rangeDragging) return;\n\n const minMaxResult = getMinMaxDistancePointers(pointers.pointers, svg.startAngleDeg);\n if(!minMaxResult) return;\n\n const [ minPointer, maxPointer ] = minMaxResult;\n\n const mouseDegrees = getAngleByMouse(\n $svg,\n evt.clientX,\n evt.clientY,\n svg.cx,\n svg.cy,\n svg.radius,\n svg.radius\n );\n\n if(rangeDraggingLastAngle.current === undefined) {\n rangeDraggingLastAngle.current = mouseDegrees;\n return;\n }\n\n const diff = (mouseDegrees - rangeDraggingLastAngle.current);\n if(diff === 0 || Math.abs(diff) < data.stepAngleDeg) return;\n\n setPointer(minPointer, mod(minPointer.angleDeg + diff, 360));\n setPointer(maxPointer, mod(maxPointer.angleDeg + diff, 360));\n\n rangeDraggingLastAngle.current = mouseDegrees;\n }, [\n $svg,\n svg.cx,\n svg.cy,\n svg.radius,\n data.stepAngleDeg,\n pointers.pointers,\n setPointer,\n settings.disabled,\n settings.rangeDragging,\n svg.startAngleDeg,\n ]);\n\n const onMouseUp = () => {\n window.removeEventListener('mousemove', onValueChange);\n window.removeEventListener('mouseup', onValueChange);\n\n rangeDraggingLastAngle.current = undefined;\n };\n\n const onMouseDown = (evt: ReactMouseEvent) => {\n if(!settings.rangeDragging || settings.disabled || pointers.pointers.length <= 1) return;\n\n onValueChange(evt);\n\n window.addEventListener('mousemove', onValueChange);\n window.addEventListener('mouseup', onMouseUp);\n };\n\n return (\n <>\n {\n !getBoolean(settings.hideConnection, false) && connection &&\n \n }\n \n )\n};\n\nexport default Connection;", "import { getMinMaxDistancePointers, IPointers } from './pointers-provider';\nimport { getAnglesDistance } from './circle-provider';\n\nexport interface IConnection {\n radius: number;\n cx: number;\n cy: number;\n\n // calculated properties ---------\n startAngleDeg: number;\n endAngleDeg: number;\n strokeDasharray: number[];\n strokeOffset: number;\n}\n\nexport const getConnection = (\n pointers: IPointers,\n radius: number,\n cx: number,\n cy: number,\n pathStartAngle: number,\n pathEndAngle: number,\n) : IConnection => {\n\n if(!pointers.pointers || pointers.pointers.length <= 0) return null;\n\n const result : IConnection = {\n radius,\n cx,\n cy,\n\n // calculated properties ---------\n startAngleDeg: pathStartAngle,\n endAngleDeg: pathStartAngle,\n strokeDasharray: [0, 0],\n strokeOffset: 0,\n };\n\n // Define start/end angles.\n if(pointers.pointers.length === 1) {\n result.startAngleDeg = pathStartAngle;\n result.endAngleDeg = pointers.pointers[0].angleDeg;\n }\n else{\n const minMaxResult = getMinMaxDistancePointers(pointers.pointers, pathStartAngle);\n if(!minMaxResult) return null;\n\n const [ minPointer, maxPointer ] = minMaxResult;\n\n result.startAngleDeg = minPointer.angleDeg;\n result.endAngleDeg = maxPointer.angleDeg;\n }\n\n const pathAnglesDistance = getAnglesDistance(pathStartAngle, pathEndAngle);\n\n if(result.startAngleDeg > result.endAngleDeg) {\n result.endAngleDeg += 360;\n }\n\n let angleDistance = getAnglesDistance(result.startAngleDeg, result.endAngleDeg);\n\n const shouldSwitch = angleDistance > pathAnglesDistance;\n\n if(shouldSwitch) {\n angleDistance = 360 - angleDistance;\n [result.startAngleDeg, result.endAngleDeg] = [result.endAngleDeg, result.startAngleDeg];\n }\n\n const circumference = 2 * Math.PI * radius;\n const strokeOffset = -(result.startAngleDeg / 360) * circumference;\n const strokeDasharray = (angleDistance / 360) * circumference;\n const complement = circumference - strokeDasharray;\n\n result.strokeDasharray = [ strokeDasharray, complement ];\n result.strokeOffset = strokeOffset;\n\n return result;\n};", "import { ISettings } from '../domain/settings-provider';\nimport { angle2value, IPointers } from '../domain/pointers-provider';\nimport { getBoolean, getNumber, getString } from '../domain/common-provider';\nimport {\n DEFAULT_TEXT_COLOR,\n DEFAULT_TEXT_FONT_SIZE\n} from '../domain/defaults-provider';\nimport { useEffect, useState } from 'react';\nimport { ISvg } from '../domain/svg-provider';\nimport { IData } from '../domain/data-provider';\n\ninterface ITextProps {\n settings: ISettings;\n pointers: IPointers;\n svg: ISvg;\n data: IData;\n}\n\nconst Text = (props: ITextProps) => {\n\n const { settings, pointers, svg, data } = props;\n\n const { cx, cy } = svg;\n const [ value, setValue ] = useState('');\n\n useEffect(() => {\n\n const values = pointers.pointers.map(pointer => angle2value(\n data,\n pointer.angleDeg,\n svg.startAngleDeg,\n svg.endAngleDeg\n ));\n\n values.sort((value1, value2) => {\n return value1.toString().localeCompare(\n value2.toString(),\n 'en',\n { numeric: true }\n );\n });\n\n const texts = values.map(value => `${ settings.textPrefix || '' }${ value }${ settings.textSuffix || '' }`);\n setValue(texts.join(' '));\n\n }, [\n data,\n pointers.pointers,\n svg.startAngleDeg,\n svg.endAngleDeg,\n settings.textPrefix,\n settings.textSuffix,\n ]);\n\n const hideText = getBoolean(settings.hideText, false);\n\n return (\n <>\n {\n !hideText &&\n \n\n { value }\n\n \n }\n \n )\n};\n\nexport default Text;", "import { useEffect, useState, Fragment } from 'react';\nimport { getTicks, getTicksSettings, ITick, ITicks } from '../domain/ticks-provider';\nimport { ISettings } from '../domain/settings-provider';\nimport { ISvg } from '../domain/svg-provider';\nimport { IData } from '../domain/data-provider';\n\ninterface ITicksProps {\n settings: ISettings;\n svg: ISvg;\n data: IData;\n}\n\nconst Ticks = (props: ITicksProps) => {\n\n const { settings, svg, data } = props;\n\n const [ ticksSettings, setTicksSettings ] = useState(null);\n const [ ticks, setTicks ] = useState([]);\n\n useEffect(() => {\n setTicksSettings(getTicksSettings(settings, data));\n }, [\n settings,\n data,\n ]);\n\n useEffect(() => {\n if(!ticksSettings) return;\n\n let endAngleDeg = svg.endAngleDeg;\n if(endAngleDeg < svg.startAngleDeg) {\n endAngleDeg += 360;\n }\n\n setTicks(getTicks(\n ticksSettings,\n ticksSettings.ticksCount,\n svg.startAngleDeg,\n endAngleDeg,\n svg,\n data\n ));\n }, [\n data,\n svg,\n ticksSettings,\n ]);\n\n return (\n <>\n {\n ticksSettings && !ticksSettings.disableTicks &&\n \n {\n ticks.map((tick, i) => {\n const { x, y, x1, y1, textX, textY, showText } = tick;\n\n return (\n \n \n\n {\n showText &&\n \n { tick.tickValue }\n \n }\n \n );\n })\n }\n \n }\n \n )\n};\n\nexport default Ticks;", "import {\n circleMovement,\n convertRange,\n degreesToRadians,\n setDecimalPlaces,\n v2MulScalar,\n v2Normalize\n} from 'mz-math';\nimport { ISvg } from './svg-provider';\nimport { IData } from './data-provider';\nimport { ISettings } from './settings-provider';\nimport { getBoolean, getNumber, getString } from './common-provider';\nimport {\n DEFAULT_TICKS_COLOR, DEFAULT_TICKS_GROUP_SIZE,\n DEFAULT_TICKS_HEIGHT, DEFAULT_TICKS_VALUES_COLOR,\n DEFAULT_TICKS_VALUES_DISTANCE, DEFAULT_TICKS_VALUES_FONT_SIZE,\n DEFAULT_TICKS_WIDTH\n} from './defaults-provider';\n\nexport interface ITicks {\n ticksCount: number;\n disableTicks: boolean;\n ticksWidth: number;\n ticksHeight: number;\n longerTicksHeight: number;\n ticksDistanceToPanel: number;\n tickValuesDistance: number;\n ticksColor: string;\n tickValuesColor: string;\n tickValuesFontSize: number;\n ticksGroupSize: number;\n longerTickValuesOnly: boolean;\n showTickValues: boolean;\n}\n\nexport interface ITick {\n x: number;\n y: number;\n x1: number;\n y1: number;\n textX: number;\n textY: number;\n isLonger: boolean;\n showText: boolean;\n tickValue?: string;\n}\n\nexport const getTicksSettings = (settings: ISettings, data: IData) : ITicks => {\n\n let ticksCount = getNumber(settings.ticsCount, 0);\n if(!ticksCount) {\n if(data.data && data.data.length > 0) {\n ticksCount = data.data.length;\n }\n else{\n ticksCount = data.max;\n }\n }\n\n const ticksHeight = getNumber(settings.ticksHeight, DEFAULT_TICKS_HEIGHT);\n\n return {\n ticksCount,\n disableTicks: getBoolean(settings.disableTicks, false),\n ticksWidth: getNumber(settings.ticksWidth, DEFAULT_TICKS_WIDTH),\n ticksHeight,\n longerTicksHeight: getNumber(settings.longerTicksHeight, ticksHeight * 2),\n ticksDistanceToPanel: getNumber(settings.ticksDistanceToPanel, 0),\n tickValuesDistance: getNumber(settings.tickValuesDistance, DEFAULT_TICKS_VALUES_DISTANCE),\n ticksColor: getString(settings.ticksColor, DEFAULT_TICKS_COLOR),\n tickValuesColor: getString(settings.tickValuesColor, DEFAULT_TICKS_VALUES_COLOR),\n tickValuesFontSize: getNumber(settings.tickValuesFontSize, DEFAULT_TICKS_VALUES_FONT_SIZE),\n ticksGroupSize: getNumber(settings.ticksGroupSize, DEFAULT_TICKS_GROUP_SIZE),\n longerTickValuesOnly: getBoolean(settings.longerTickValuesOnly, true),\n showTickValues: getBoolean(settings.showTickValues, true),\n };\n};\n\nexport const getTicks = (\n ticksSettings: ITicks,\n ticsCount: number,\n pathStartAngle: number,\n pathEndAngle: number,\n svg: ISvg,\n data: IData\n) : ITick[] => {\n\n const ticks: ITick[] = [];\n\n const deltaAngle = Math.abs(pathEndAngle - pathStartAngle);\n const oneTickAngleSize = ticsCount === 0 ? 0 : deltaAngle / ticsCount;\n\n let count = ticsCount;\n if(!data.isClosedShape) {\n count++;\n }\n\n for(let i=0; i [0, Math.PI]\n\n let [x, y] = circleMovement([svg.cx, svg.cy], angleRad, svg.radius);\n\n const isLonger = ticksSettings.ticksGroupSize !== undefined && (i % ticksSettings.ticksGroupSize === 0 );\n\n let desiredDistance = ticksSettings.ticksHeight;\n\n if(isLonger) {\n desiredDistance = ticksSettings.longerTicksHeight;\n }\n\n const normalizedDirectionVector = v2Normalize([svg.cx - x, svg.cy - y]);\n const tickEndVector = v2MulScalar(normalizedDirectionVector, desiredDistance);\n\n const tickStartVector = v2MulScalar(normalizedDirectionVector, ticksSettings.ticksDistanceToPanel);\n x += tickStartVector[0];\n y += tickStartVector[1];\n\n const x1 = x + tickEndVector[0];\n const y1 = y + tickEndVector[1];\n\n // ------- Define tick value. ---------------------\n let tickValue: string|undefined = undefined;\n if(ticksSettings.showTickValues && (!ticksSettings.longerTickValuesOnly || ticksSettings.longerTickValuesOnly && (isLonger || ticksSettings.ticksGroupSize === undefined))) {\n\n let value: string|number = convertRange(i, 0, ticsCount, data.min, data.max);\n\n if(data.data.length > 0) {\n const index = Math.round(value);\n value = data.data[index];\n }\n else{\n value = setDecimalPlaces(value, data.round);\n }\n\n tickValue = (value ?? '').toString();\n }\n\n let textX = 0;\n let textY = 0;\n const showText = tickValue !== undefined;\n\n if(showText) {\n const _tickValuesDistance = getNumber(desiredDistance + ticksSettings.tickValuesDistance, desiredDistance * 1.5);\n const tickTextVector = v2MulScalar(normalizedDirectionVector, _tickValuesDistance);\n textX = x + tickTextVector[0];\n textY = y + tickTextVector[1];\n }\n\n ticks.push({\n x,\n y,\n x1,\n y1,\n textX,\n textY,\n isLonger,\n tickValue,\n showText,\n });\n }\n\n return ticks;\n};", "import { useEffect, useState, MouseEvent } from 'react';\nimport { getCircle, ICircle } from '../domain/circle-provider';\nimport { getString } from '../domain/common-provider';\nimport { ISettings } from '../domain/settings-provider';\nimport {\n DEFAULT_PATH_BG_COLOR,\n DEFAULT_PATH_BORDER_COLOR,\n} from '../domain/defaults-provider';\nimport { ISvg } from '../domain/svg-provider';\nimport { getAngleByMouse, getClosestPointer, IPointer, IPointers } from '../domain/pointers-provider';\n\ninterface ICircleProps {\n settings: ISettings;\n pointers: IPointers;\n svg: ISvg;\n $svg: SVGSVGElement;\n setPointer: (pointer: IPointer, newAngleDeg: number) => void;\n}\n\nconst Circle = (props: ICircleProps) => {\n\n const { settings, pointers, $svg, svg, setPointer } = props;\n const [ circle, setCircle ] = useState({\n strokeDasharray: '0 1000000',\n strokeOffset: 0,\n });\n\n useEffect(() => {\n setCircle(getCircle(\n svg.startAngleDeg,\n svg.endAngleDeg,\n svg.radius\n ));\n }, [\n svg.startAngleDeg,\n svg.endAngleDeg,\n svg.radius,\n ]);\n\n const onClick = (evt: MouseEvent) => {\n if(!$svg || settings.disabled) return;\n\n const degrees = getAngleByMouse(\n $svg,\n evt.clientX,\n evt.clientY,\n svg.cx,\n svg.cy,\n svg.radius,\n svg.radius\n );\n\n const closestPointer = getClosestPointer(\n pointers.pointers,\n degrees,\n svg.cx,\n svg.cy,\n svg.radius\n );\n\n if(!closestPointer) return;\n\n setPointer(closestPointer, degrees);\n };\n\n return (\n \n {\n svg.border > 0 &&\n \n }\n\n \n \n )\n};\n\nexport default Circle;\n"], - "mappings": "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", - "names": ["useEffect", "useRef", "useState", "setDecimalPlaces", "num", "decimalPlaces", "coefficient", "__pow", "mod", "n", "m", "convertRange", "x", "a", "b", "c", "d", "isNumber", "value", "radiansToDegrees", "radians", "decimalPlaces", "res", "setDecimalPlaces", "degreesToRadians", "degrees", "vSub", "vector1", "vector2", "decimalPlaces", "vector", "i", "setDecimalPlaces", "v2Sub", "vMulScalar", "v", "scalar", "decimalPlaces", "vector", "i", "setDecimalPlaces", "v2MulScalar", "v2", "vLength", "vector", "decimalPlaces", "sum", "i", "setDecimalPlaces", "v2Distance", "vector1", "vector2", "decimalPlaces", "diff", "vSub", "vLength", "vNormalize", "v", "decimalPlaces", "length", "vLength", "unitVector", "i", "setDecimalPlaces", "v2Normalize", "v2", "circleMovement", "center", "angle", "radius", "newId", "getSvg", "circleRadius", "circleThickness", "circleBorder", "maxPointerRadius", "startAngleDeg", "endAngleDeg", "thickness", "diff", "size", "cx", "cy", "getSVGCenter", "getSVGSize", "val", "s", "DEFAULT_PATH_BG_COLOR", "DEFAULT_PATH_BORDER_COLOR", "DEFAULT_POINTER_BG_COLOR", "DEFAULT_POINTER_BG_COLOR_SELECTED", "DEFAULT_POINTER_BG_COLOR_DISABLED", "DEFAULT_POINTER_BORDER_COLOR", "DEFAULT_CONNECTION_BG_COLOR", "DEFAULT_CONNECTION_BG_COLOR_DISABLED", "DEFAULT_TEXT_COLOR", "DEFAULT_TICKS_COLOR", "DEFAULT_TICKS_VALUES_COLOR", "getNumber", "value", "defaultValue", "H", "getString", "getBoolean", "isAngleInArc", "startAngleDeg", "endAngleDeg", "currentDegrees", "getAnglesDistance", "startAngle", "endAngle", "diff", "diffMod", "I", "getCircle", "radius", "circumference", "angleDiff", "strokeOffset", "strokeDasharray", "complement", "getAngleByMouse", "$svg", "clientX", "clientY", "cx", "cy", "rx", "ry", "left", "top", "relativeMouse", "vector", "R", "angleRad", "fr", "angle2value", "data", "angle", "pathStartAngle", "pathEndAngle", "value", "O", "index", "s", "value2angle", "_value", "valueIndex", "item", "I", "initPointers", "settings", "Lo", "getNumber", "getString", "DEFAULT_POINTER_BG_COLOR", "DEFAULT_POINTER_BG_COLOR_SELECTED", "DEFAULT_POINTER_BG_COLOR_DISABLED", "DEFAULT_POINTER_BORDER_COLOR", "pointers", "i", "settingPointer", "bgColor", "bgColorSelected", "bgColorDisabled", "border", "borderColor", "disabled", "getBoolean", "angleDeg", "angleAfterStep", "roundToStep", "getPointers", "getMaxRadius", "max", "pointer", "getClosestPointer", "currentPlaceDegrees", "pathRadius", "pr", "currentPointOnArc", "_t", "min", "closestPointer", "enabledPointers", "p", "pointerAngleRad", "pointOnArc", "distance", "Hr", "__spreadValues", "getClosestEdge", "startAngleDegrees", "endAngleDegrees", "startAngleRad", "startPointOnArc", "endAngleRad", "endPointOnArc", "distance1", "distance2", "getMinMaxDistancePointers", "minDistance", "maxDistance", "minPointer", "maxPointer", "getAnglesDistance", "num", "step", "useEffect", "useState", "useRef", "useCallback", "outlineNoneStyle", "Fragment", "jsx", "getPointerFill", "pointer", "pointerRef", "bgColor", "bgColorSelected", "bgColorDisabled", "Pointer", "props", "useRef", "svg", "$svg", "setPointer", "data", "settings", "radius", "angleDeg", "border", "borderColor", "cx", "cy", "center", "setCenter", "useState", "value", "setValue", "useEffect", "angle2value", "angleRad", "O", "pr", "pointerCenter", "_t", "onValueChange", "useCallback", "evt", "mouseX", "mouseY", "degrees", "getAngleByMouse", "newAngleDeg", "isAngleInArc", "getClosestEdge", "onMouseUp", "onMouseDown", "onKeyDown", "$current", "onTouch", "onWheel", "scrollTop", "outlineNoneStyle", "Pointer_default", "Fragment", "jsx", "Pointers", "props", "pointers", "settings", "svg", "$svg", "setPointer", "data", "pointer", "Pointer_default", "Pointers_default", "getData", "setting", "min", "getNumber", "max", "step", "arrowStep", "round", "data", "minIndex", "item", "maxIndex", "pathStartAngle", "pathEndAngle", "isClosedShape", "I", "stepAngleDeg", "arrowStepAngleDeg", "useCallback", "useEffect", "useRef", "useState", "getConnection", "pointers", "radius", "cx", "cy", "pathStartAngle", "pathEndAngle", "result", "minMaxResult", "getMinMaxDistancePointers", "minPointer", "maxPointer", "pathAnglesDistance", "getAnglesDistance", "angleDistance", "circumference", "strokeOffset", "strokeDasharray", "complement", "Fragment", "jsx", "Connection", "props", "settings", "pointers", "$svg", "svg", "data", "setPointer", "connection", "setConnection", "useState", "rangeDraggingLastAngle", "useRef", "useEffect", "getConnection", "onClick", "evt", "degrees", "getAngleByMouse", "closestPointer", "getClosestPointer", "onValueChange", "useCallback", "minMaxResult", "getMinMaxDistancePointers", "minPointer", "maxPointer", "mouseDegrees", "diff", "I", "onMouseUp", "onMouseDown", "getBoolean", "getString", "DEFAULT_CONNECTION_BG_COLOR_DISABLED", "DEFAULT_CONNECTION_BG_COLOR", "Connection_default", "useEffect", "useState", "Fragment", "jsx", "Text", "props", "settings", "pointers", "svg", "data", "cx", "cy", "value", "setValue", "values", "pointer", "angle2value", "value1", "value2", "texts", "hideText", "getBoolean", "getString", "DEFAULT_TEXT_COLOR", "getNumber", "Text_default", "useEffect", "useState", "Fragment", "getTicksSettings", "settings", "data", "ticksCount", "getNumber", "ticksHeight", "getBoolean", "getString", "DEFAULT_TICKS_COLOR", "DEFAULT_TICKS_VALUES_COLOR", "getTicks", "ticksSettings", "ticsCount", "pathStartAngle", "pathEndAngle", "svg", "ticks", "deltaAngle", "oneTickAngleSize", "count", "i", "currentAngle", "angleRad", "O", "pr", "x", "y", "_t", "isLonger", "desiredDistance", "normalizedDirectionVector", "D", "tickEndVector", "vr", "tickStartVector", "x1", "y1", "tickValue", "value", "index", "s", "textX", "textY", "showText", "_tickValuesDistance", "tickTextVector", "Fragment", "jsx", "jsxs", "Ticks", "props", "settings", "svg", "data", "ticksSettings", "setTicksSettings", "useState", "ticks", "setTicks", "useEffect", "getTicksSettings", "endAngleDeg", "getTicks", "tick", "i", "x", "y", "x1", "y1", "textX", "textY", "showText", "Ticks_default", "useEffect", "useState", "jsx", "jsxs", "Circle", "props", "settings", "pointers", "$svg", "svg", "setPointer", "circle", "setCircle", "useState", "useEffect", "getCircle", "evt", "degrees", "getAngleByMouse", "closestPointer", "getClosestPointer", "getString", "DEFAULT_PATH_BORDER_COLOR", "DEFAULT_PATH_BG_COLOR", "Circle_default", "Fragment", "jsx", "jsxs", "RoundSlider", "props", "data", "setData", "useState", "svg", "setSvg", "pointers", "setPointers", "svgRef", "useRef", "useEffect", "getData", "getPointers", "pathStartAngle", "getNumber", "pathEndAngle", "getSvg", "setPointersCallback", "pointer", "newAngleDeg", "roundToStep", "I", "prevAngle", "nextAngle", "prevIndex", "nextIndex", "isAngleInArc", "getClosestEdge", "_pointers", "__spreadValues", "values", "angle2value", "outlineNoneStyle", "Ticks_default", "Circle_default", "Connection_default", "Pointers_default", "Text_default"] + "sourcesContent": ["import { useEffect, useRef, useState } from 'react';\nimport { getSvg, ISvg } from './domain/svg-provider';\nimport { angle2value, getClosestEdge, getPointers, IPointer, IPointers, roundToStep } from './domain/pointers-provider';\nimport { ISettings } from './domain/settings-provider';\nimport { getNumber } from './domain/common-provider';\nimport {\n DEFAULT_PATH_BORDER, DEFAULT_PATH_END_ANGLE, DEFAULT_PATH_RADIUS, DEFAULT_PATH_START_ANGLE,\n DEFAULT_PATH_THICKNESS\n} from './domain/defaults-provider';\nimport Pointers from './ui/Pointers';\nimport { getData, IData } from './domain/data-provider';\nimport Connection from './ui/Connection';\nimport Text from './ui/Text';\nimport Ticks from './ui/Ticks';\nimport Circle from './ui/Circle';\nimport { mod } from 'mz-math';\nimport { isAngleInArc } from './domain/circle-provider';\nimport { outlineNoneStyle } from './domain/style-provider';\n\nexport const RoundSlider = (props: ISettings) => {\n\n const [ data, setData ] = useState(null);\n const [ svg, setSvg ] = useState(null);\n const [ pointers, setPointers ] = useState(null);\n\n const svgRef = useRef(null);\n\n useEffect(() => {\n setData(getData(props));\n }, [ props ]);\n\n useEffect(() => {\n setPointers(getPointers(props, data));\n }, [\n props,\n data,\n ]);\n\n useEffect(() => {\n if(!pointers) return;\n\n const pathStartAngle = getNumber(props.pathStartAngle, DEFAULT_PATH_START_ANGLE);\n let pathEndAngle = getNumber(props.pathEndAngle, DEFAULT_PATH_END_ANGLE);\n\n if(pathEndAngle <= pathStartAngle) {\n pathEndAngle += 360;\n }\n\n setSvg(getSvg(\n getNumber(props.pathRadius, DEFAULT_PATH_RADIUS),\n getNumber(props.pathThickness, DEFAULT_PATH_THICKNESS),\n getNumber(props.pathBorder, DEFAULT_PATH_BORDER),\n pointers.maxRadius,\n pathStartAngle,\n pathEndAngle,\n ));\n }, [\n props.pathRadius,\n props.pathThickness,\n props.pathBorder,\n props.pathStartAngle,\n props.pathEndAngle,\n pointers,\n ]);\n\n const setPointersCallback = (pointer: IPointer, newAngleDeg: number) => {\n if(props.disabled || !pointers.pointers || !pointer || pointer.disabled) return;\n\n newAngleDeg = roundToStep(newAngleDeg, data.stepAngleDeg);\n if(data.isClosedShape && mod(newAngleDeg, 360) === mod(svg.endAngleDeg, 360)){\n newAngleDeg = svg.startAngleDeg;\n }\n\n if(pointer.angleDeg === newAngleDeg) return;\n\n const handleOverlap = !props.pointersOverlap;\n if(handleOverlap) {\n\n let prevAngle, nextAngle;\n\n if(data.isClosedShape) {\n const prevIndex = mod(pointer.index - 1, pointers.pointers.length);\n const nextIndex = mod(pointer.index + 1, pointers.pointers.length);\n\n prevAngle = pointers.pointers[prevIndex].angleDeg;\n nextAngle = pointers.pointers[nextIndex].angleDeg;\n }\n else{\n prevAngle = pointer.index === 0 ? svg.startAngleDeg : pointers.pointers[pointer.index - 1].angleDeg;\n nextAngle = pointer.index === pointers.pointers.length - 1 ? svg.endAngleDeg : pointers.pointers[pointer.index + 1].angleDeg;\n }\n\n if(nextAngle <= prevAngle) {\n nextAngle += 360;\n }\n\n if(!isAngleInArc(prevAngle, nextAngle, newAngleDeg)){\n newAngleDeg = getClosestEdge(\n prevAngle,\n nextAngle,\n newAngleDeg,\n svg.cx,\n svg.cy,\n svg.radius\n );\n }\n }\n\n if(pointer.angleDeg === newAngleDeg) return;\n\n const _pointers = { ...pointers };\n _pointers.pointers = [...pointers.pointers];\n _pointers.pointers[pointer.index].angleDeg = newAngleDeg;\n pointers.pointers = _pointers.pointers;\n\n setPointers(_pointers);\n\n if(typeof props.onChange === 'function') {\n const values = _pointers.pointers.map(pointer => angle2value(\n data,\n pointer.angleDeg,\n svg.startAngleDeg,\n svg.endAngleDeg\n ));\n\n props.onChange(values);\n }\n };\n\n return (\n <>\n {\n svg &&\n \n\n {\n (props.SvgDefs) &&\n \n { props.SvgDefs }\n \n }\n\n \n\n \n\n \n\n \n\n \n \n }\n \n )\n};", "export const setDecimalPlaces = (num: number, decimalPlaces: number | undefined = Infinity) => {\n if(decimalPlaces === Infinity) return num;\n\n if(decimalPlaces < 0){\n decimalPlaces = 0;\n }\n\n const coefficient = 10 ** decimalPlaces;\n return Math.round(num * coefficient) / coefficient;\n};", "import { Vector2 } from '../types';\nimport { setDecimalPlaces } from './format';\n\nexport const mod = (n: number, m: number) => {\n return ((n % m) + m) % m;\n};\n\n/**\n * Convert range [a, b] to [c, d].\n * f(x) = (d - c) * (x - a) / (b - a) + c\n */\nexport const convertRange = (x: number, a: number, b: number, c: number, d: number) => {\n return (d - c) * (x - a) / (b - a) + c;\n};\n\n/**\n * Check if 2 ranges [a,b] and [c,d] overlap.\n */\nexport const doRangesOverlap = (a: number, b: number, c: number, d: number) => {\n return Math.max(a, c) <= Math.min(b, d) ;\n};\n\n// eslint-disable-next-line\nexport const isNumber = (value: any) => {\n return !isNaN(parseFloat(value)) && isFinite(value);\n};\n\n/**\n * Convert polar coordinates to cartesian coordinates.\n */\nexport const polarToCartesian = (center: Vector2, radii: Vector2, angleInRad: number, decimalPlaces = Infinity) : Vector2 => {\n const [cx, cy] = center;\n const [rx, ry] = radii;\n\n return [\n setDecimalPlaces(cx + (rx * Math.cos(angleInRad)), decimalPlaces),\n setDecimalPlaces(cy + (ry * Math.sin(angleInRad)), decimalPlaces),\n ];\n};", "import { Vector, Vector2, Vector3 } from '../types';\nimport { setDecimalPlaces } from './format';\nimport { v2Length, vNormalize, vDotProduct, vSub } from './linear-algebra/vector';\nimport { mod } from './other';\n\nexport const getV2Angle = (v2: Vector2, decimalPlaces = Infinity) => {\n const angle = Math.atan2(v2[1], v2[0]);\n return setDecimalPlaces(angle, decimalPlaces);\n};\n\nexport const getV2AngleInEllipse = (v2: Vector2, radii: Vector2, decimalPlaces = Infinity) => {\n const angle = Math.atan2(v2[1]/radii[1], v2[0]/radii[0]);\n return setDecimalPlaces(angle, decimalPlaces);\n};\n\nexport const setV2Angle = (v2: Vector2, newAngleRad: number, decimalPlaces = Infinity): Vector2 => {\n const length = v2Length(v2);\n return [\n setDecimalPlaces(Math.cos(newAngleRad) * length, decimalPlaces),\n setDecimalPlaces(Math.sin(newAngleRad) * length, decimalPlaces),\n ];\n};\n\nexport const radiansToDegrees = (radians: number, decimalPlaces = Infinity) => {\n const res = radians * (180 / Math.PI);\n return setDecimalPlaces(res, decimalPlaces);\n};\n\nexport const degreesToRadians = (degrees: number, decimalPlaces = Infinity) => {\n const res = degrees * (Math.PI / 180);\n return setDecimalPlaces(res, decimalPlaces);\n};\n\n/**\n * Returns the range [0, Math.PI]\n * A = Math.acos( dot(v1, v2)/(v1.length()*v2.length()) );\n */\nexport const getVNAngleBetween = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) : number => {\n const unitVector1 = vNormalize(vector1);\n const unitVector2 = vNormalize(vector2);\n const dotProduct = vDotProduct(unitVector1, unitVector2);\n const angle = Math.acos(dotProduct);\n return setDecimalPlaces(angle, decimalPlaces);\n};\n\nexport const getV2AngleBetween = (vector1: Vector2, vector2: Vector2, decimalPlaces = Infinity) : number => {\n // return getVNAngleBetween(vector1, vector2, decimalPlaces);\n const diff = vSub(vector1, vector2);\n const angle = Math.atan2(diff[1], diff[0]);\n return setDecimalPlaces(angle, decimalPlaces);\n};\n\nexport const getV3AngleBetween = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) : number => {\n return getVNAngleBetween(vector1, vector2, decimalPlaces);\n};\n\n/**\n * Shortest distance (angular) between two angles.\n */\nexport const getAnglesSub = (angleDegrees1: number, angleDegrees2: number, decimalPlaces = Infinity) : number => {\n const angleDistance = Math.abs(mod(angleDegrees1, 360) - mod(angleDegrees2, 360));\n return setDecimalPlaces(angleDistance <= 180 ? angleDistance : 360 - angleDistance, decimalPlaces);\n};\n\nexport const isAngleBetween = (angleDegrees: number, startAngleDegrees: number, endAngleDegrees: number) : boolean => {\n const distance = getAnglesSub(startAngleDegrees, endAngleDegrees);\n const distance1 = getAnglesSub(startAngleDegrees, angleDegrees);\n const distance2 = getAnglesSub(endAngleDegrees, angleDegrees);\n const totalDistance = distance1 + distance2;\n\n // Use a small threshold for floating point errors\n return Math.abs(totalDistance - distance) <= 0.001;\n}", "import { Vector, Vector2, Vector3, Vector4 } from '../../types';\nimport { setDecimalPlaces } from '../format';\nimport { getV2Angle, setV2Angle } from '../angle';\n\n// ------------ SUM ------------------------\n\nexport const vSum = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) : Vector => {\n\n const vector: Vector = [];\n\n for(let i=0; i {\n return vSum(vector1, vector2, decimalPlaces) as Vector2;\n};\n\nexport const v3Sum = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) : Vector3 => {\n return vSum(vector1, vector2, decimalPlaces) as Vector3;\n};\n\n// ------------ SUB ------------------------\n\nexport const vSub = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) : Vector => {\n\n const vector: Vector = [];\n\n for(let i=0; i {\n return vSub(vector1, vector2, decimalPlaces) as Vector2;\n};\n\nexport const v3Sub = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) : Vector3 => {\n return vSub(vector1, vector2, decimalPlaces) as Vector3;\n};\n\n// ------------ MUL SCALAR ------------------------\n\nexport const vMulScalar = (v: Vector, scalar: number, decimalPlaces = Infinity): Vector => {\n const vector: Vector = [];\n\n for(let i=0; i {\n return vMulScalar(v2, scalar, decimalPlaces) as Vector2;\n};\n\nexport const v3MulScalar = (v3: Vector3, scalar: number, decimalPlaces = Infinity): Vector3 => {\n return vMulScalar(v3, scalar, decimalPlaces) as Vector3;\n};\n\n// ------------ DIVIDE ------------------------\n\nexport const vDivideScalar = (v: Vector, scalar: number, decimalPlaces = Infinity): Vector => {\n if(scalar === 0){\n throw new Error('Division by zero error.');\n }\n\n const vector: Vector = [];\n\n for(let i=0; i {\n return vDivideScalar(v2, scalar, decimalPlaces) as Vector2;\n};\n\nexport const v3DivideScalar = (v3: Vector3, scalar: number, decimalPlaces = Infinity): Vector3 => {\n return vDivideScalar(v3, scalar, decimalPlaces) as Vector3;\n};\n\n// ------------ LENGTH ------------------------\n\nexport const vLength = (vector: Vector, decimalPlaces = Infinity) => {\n let sum = 0;\n\n for(let i=0; i {\n return vLength(vector, decimalPlaces);\n};\n\nexport const v3Length = (vector: Vector3, decimalPlaces = Infinity) => {\n return vLength(vector, decimalPlaces);\n};\n\nexport const v2SetLength = (v2: Vector2, newLength: number, decimalPlaces = Infinity): Vector2 => {\n const angle = getV2Angle(v2);\n return [\n setDecimalPlaces(Math.cos(angle) * newLength, decimalPlaces),\n setDecimalPlaces(Math.sin(angle) * newLength, decimalPlaces),\n ];\n};\n\n// ----------- DISTANCE ------------------------\n\nexport const vDistance = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) => {\n const diff = vSub(vector1, vector2);\n return vLength(diff, decimalPlaces);\n};\n\nexport const v2Distance = (vector1: Vector2, vector2: Vector2, decimalPlaces = Infinity) => {\n const diff = vSub(vector1, vector2);\n return vLength(diff, decimalPlaces);\n};\n\nexport const v3Distance = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) => {\n const diff = vSub(vector1, vector2);\n return vLength(diff, decimalPlaces);\n};\n\n// ------------ NORMALIZE ------------------------\n\n/**\n * Normalization creates a unit vector, which is a vector of length 1.\n */\nexport const vNormalize = (v: Vector, decimalPlaces = Infinity) : Vector => {\n const length = vLength(v);\n const unitVector: Vector = [];\n\n for(let i=0; i {\n return vNormalize(v2, decimalPlaces) as Vector2;\n};\n\nexport const v3Normalize = (v3: Vector3, decimalPlaces = Infinity) : Vector3 => {\n return vNormalize(v3, decimalPlaces) as Vector3;\n};\n\n// ------------ DOT PRODUCT ------------------------\n\nexport const vDotProduct = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) : number => {\n let sum = 0;\n\n for(let i=0; i {\n return vDotProduct(vector1, vector2, decimalPlaces);\n};\n\nexport const v3DotProduct = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) : number => {\n return vDotProduct(vector1, vector2, decimalPlaces);\n};\n\n// ------------ CROSS PRODUCT ------------------------\n\n/**\n * Cross product is possible on 3D vectors only.\n * The cross product a \u00D7 b is defined as a vector c that is perpendicular (orthogonal) to both a and b.\n */\nexport const v3CrossProduct = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity): Vector3 => {\n return [\n setDecimalPlaces(vector1[1] * vector2[2] - vector1[2] * vector2[1], decimalPlaces),\n setDecimalPlaces(vector1[2] * vector2[0] - vector1[0] * vector2[2], decimalPlaces),\n setDecimalPlaces(vector1[0] * vector2[1] - vector1[1] * vector2[0], decimalPlaces),\n ];\n};\n\n// --------------- INIT VECTOR HELPER -----------------\n\nexport const v2 = (defaultValue = 0): Vector2 => {\n return [defaultValue, defaultValue];\n};\n\nexport const v3 = (defaultValue = 0): Vector3 => {\n return [defaultValue, defaultValue, defaultValue];\n};\n\nexport const v4 = (defaultValue = 0): Vector4 => {\n return [defaultValue, defaultValue, defaultValue, defaultValue];\n};\n\nexport const vN = (N: number, defaultValue = 0): Vector => {\n\n if(N < 0){\n throw new Error('N must be a non-negative number.');\n }\n\n const vector: Vector = [];\n for(let i=0; i {\n let vector: Vector2 = [0, 0];\n vector = v2SetLength(vector, distance);\n return setV2Angle(vector, angleRad);\n};\n\n// --------------- EQUALITY -------------------------\n\nexport const vEqual = (vector1: Vector, vector2: Vector): boolean => {\n if(vector1.length !== vector2.length) return false;\n\n for(let i=0; i {\n const sub = v2Sub(vector2, vector1);\n return [\n -setDecimalPlaces(sub[1], decimalPlaces),\n setDecimalPlaces(sub[0], decimalPlaces)\n ];\n};", "import { Matrix2, Matrix3, Matrix4, Matrix, Vector, Vector2, Vector3 } from '../../types';\nimport { vMulScalar, vSum, vSub, vDotProduct, vN, vEqual, vDivideScalar } from './vector';\n\n// --------------- SUM ----------------------\n\nexport const mSum = (matrix1: Matrix, matrix2: Matrix, decimalPlaces = Infinity): Matrix => {\n const matrix: Matrix = [];\n\n for(let i=0; i {\n return mSum(matrix1, matrix2, decimalPlaces) as Matrix2;\n};\n\nexport const m3Sum = (matrix1: Matrix3, matrix2: Matrix3, decimalPlaces = Infinity): Matrix3 => {\n return mSum(matrix1, matrix2, decimalPlaces) as Matrix3;\n};\n\n// --------------- SUB ----------------------\n\nexport const mSub = (matrix1: Matrix, matrix2: Matrix, decimalPlaces = Infinity): Matrix => {\n const matrix: Matrix = [];\n\n for(let i=0; i {\n return mSub(matrix1, matrix2, decimalPlaces) as Matrix2;\n};\n\nexport const m3Sub = (matrix1: Matrix3, matrix2: Matrix3, decimalPlaces = Infinity): Matrix3 => {\n return mSub(matrix1, matrix2, decimalPlaces) as Matrix3;\n};\n\n// --------------- MUL SCALAR ----------------------\n\nexport const mMulScalar = (m: Matrix, scalar: number, decimalPlaces = Infinity): Matrix => {\n const matrix: Matrix = [];\n\n for(const v of m){\n matrix.push(vMulScalar(v, scalar, decimalPlaces));\n }\n\n return matrix;\n};\n\nexport const m2MulScalar = (m2: Matrix2, scalar: number, decimalPlaces = Infinity): Matrix2 => {\n return mMulScalar(m2, scalar, decimalPlaces) as Matrix2;\n};\n\nexport const m3MulScalar = (m3: Matrix3, scalar: number, decimalPlaces = Infinity): Matrix3 => {\n return mMulScalar(m3, scalar, decimalPlaces) as Matrix3;\n};\n\n// --------------- DIVIDE SCALAR ----------------------\n\nexport const mDivideScalar = (m: Matrix, scalar: number, decimalPlaces = Infinity): Matrix => {\n if(scalar === 0){\n throw new Error('Division by zero error.');\n }\n\n const matrix: Matrix = [];\n\n for(const v of m){\n matrix.push(vDivideScalar(v, scalar, decimalPlaces));\n }\n\n return matrix;\n};\n\nexport const m2DivideScalar = (m2: Matrix2, scalar: number, decimalPlaces = Infinity): Matrix2 => {\n return mDivideScalar(m2, scalar, decimalPlaces) as Matrix2;\n};\n\nexport const m3DivideScalar = (m3: Matrix3, scalar: number, decimalPlaces = Infinity): Matrix3 => {\n return mDivideScalar(m3, scalar, decimalPlaces) as Matrix3;\n};\n\n\n// --------------- TRANSPOSE ----------------------\n\nexport const mTranspose = (m: Matrix): Matrix => {\n\n const vectorsCount = m.length;\n if(vectorsCount <= 0) return m;\n\n const vectorLength = m[0].length;\n if(vectorLength <= 0) return m;\n\n const matrix: Matrix = [];\n for(let i=0; i {\n return mTranspose(m2);\n};\n\nexport const m3Transpose = (m3: Matrix3): Matrix => {\n return mTranspose(m3);\n};\n\n// ----------------- RESET ----------------------\n\nexport const mReset = (m: Matrix, defaultValue = 0): Matrix => {\n\n if(m.length <= 0) return [];\n\n const res: Matrix = [];\n\n for(let i=0; i {\n return mReset(m2, defaultValue) as Matrix2;\n};\n\nexport const m3Reset = (m3: Matrix3, defaultValue = 0): Matrix3 => {\n return mReset(m3, defaultValue) as Matrix3;\n};\n\n// --------------- MATRIX INIT HELPERS -----------------\n\nexport const m2x2 = (defaultValue = 0): Matrix2 => {\n return [\n [defaultValue, defaultValue],\n [defaultValue, defaultValue],\n ];\n};\n\nexport const m3x3 = (defaultValue = 0): Matrix3 => {\n return [\n [defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue],\n ];\n};\n\nexport const m4x4 = (defaultValue = 0): Matrix4 => {\n return [\n [defaultValue, defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue, defaultValue],\n ];\n};\n\nexport const mNxM = (N: number, M: number, defaultValue = 0): Matrix => {\n if(N <= 0 || M <= 0){\n throw new Error('M and N must be positive numbers.');\n }\n\n const matrix: Matrix = [];\n\n for(let i=0; i {\n return [\n [1, 0],\n [0, 1],\n ];\n};\n\nexport const identity3 = (): Matrix3 => {\n return [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\nexport const identity4 = (): Matrix4 => {\n return [\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Identity Matrix (I).\n * M x I = I x M = M for any matrix M.\n * Identity Matrix is a special case of scale matrix.\n */\nexport const identityN = (N: number): Matrix => {\n if(N < 0){\n throw new Error('N must be a non-negative number.');\n }\n\n if(N === 0) return [];\n\n const matrix: Matrix = [];\n\n for(let i=0; i {\n const matrix: Matrix = [];\n\n for(let i=0; i {\n return mDeepCopy(m2) as Matrix2;\n};\n\nexport const m3DeepCopy = (m3: Matrix3): Matrix3 => {\n return mDeepCopy(m3) as Matrix3;\n};\n\n// -------------- APPEND / PREPEND ROW OR COLUMN ---------------\n\nexport const mAppendCol = (m: Matrix, col: Vector): Matrix => {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n for(let i=0; i {\n const copy = mDeepCopy(m);\n copy.push(row);\n return copy;\n};\n\nexport const m2AppendRow = (m2: Matrix2, row: Vector2) : Matrix2 => {\n const copy = m2DeepCopy(m2);\n copy.push(row);\n return copy;\n};\n\nexport const m3AppendRow = (m3: Matrix3, row: Vector3) : Matrix3 => {\n const copy = m3DeepCopy(m3);\n copy.push(row);\n return copy;\n};\n\nexport const mPrependRow = (m: Matrix, row: Vector) : Matrix => {\n const copy = mDeepCopy(m);\n copy.unshift(row);\n return copy;\n};\n\nexport const m2PrependRow = (m2: Matrix2, row: Vector2) : Matrix2 => {\n const copy = m2DeepCopy(m2);\n copy.unshift(row);\n return copy;\n};\n\nexport const m3PrependRow = (m3: Matrix3, row: Vector3) : Matrix3 => {\n const copy = m3DeepCopy(m3);\n copy.unshift(row);\n return copy;\n};\n\n// ------------ DELETE ROW OR COLUMN ----------------------------\n\nexport const mDelLastRow = (m: Matrix): Matrix => {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n copy.pop();\n return copy;\n};\n\nexport const mDelFirstRow = (m: Matrix): Matrix => {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n copy.shift();\n return copy;\n};\n\nexport const mDelLastColumn = (m: Matrix): Matrix => {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const vector: Vector = [];\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const size = m[0].length;\n\n const vector: Vector = [];\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const vector: Vector = [];\n for(let i=0; i {\n\n const matrix: Matrix = [];\n for(let i=0; i {\n\n if(matrix.length < 0) return [];\n\n if(matrix[0].length !== vector.length){\n throw new Error('The number of columns in the matrix must be equal to the length of the vector.');\n }\n\n const res: Vector = [];\n\n for(let i=0; i {\n if(matrix1.length !== matrix2.length) return false;\n\n for(let i=0; i returns matrix N (m-1 x m-1)\n * The matrix must be square.\n */\nconst mMinorHelper = (m: Matrix, row: number, col: number) => {\n const size = m.length;\n\n if(size <= 0){\n throw new Error('The matrix should not be empty.');\n }\n\n if(size !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n const matrix: Matrix = [];\n\n for(let i=0; i {\n const size = m.length;\n\n if(size <= 0){\n throw new Error('The matrix should not be empty.');\n }\n\n if(size !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n // prepare the matrix without provided row and column\n const matrix = mMinorHelper(m, row, col);\n\n // calculate the matrix determinant\n return mDeterminant(matrix);\n};\n\n/**\n * Calculate determinant for NxN matrix.\n * Matrix should be square.\n */\nexport const mDeterminant = (matrix: Matrix): number => {\n const size = matrix.length;\n if(size === 0) return 1;\n\n if(size !== matrix[0].length){\n throw new Error('The matrix must be square.');\n }\n\n if(size === 1) return matrix[0][0];\n if(size === 2) return m2Determinant(matrix as Matrix2);\n\n let d = 0;\n\n for(let i=0; i {\n if(m2.length !== m2[0].length){\n throw new Error('The matrix must be square.');\n }\n\n return m2[0][0] * m2[1][1] - m2[1][0] * m2[0][1];\n};\n\n/**\n * Calculate determinant for 3x3 matrix.\n * Matrix should be square.\n */\nexport const m3Determinant = (m3: Matrix3): number => {\n if(m3.length !== m3[0].length){\n throw new Error('The matrix must be square.');\n }\n\n return mDeterminant(m3);\n};\n\n// ------------------ INVERSE -----------------------\n\nexport const m2Adjugate = (m2: Matrix2): Matrix2|null => {\n if(m2.length !== m2[0].length){\n throw new Error('The matrix must be square.');\n }\n\n return [\n [m2[1][1], -m2[0][1]],\n [-m2[1][0], m2[0][0]],\n ];\n};\n\nexport const m3Adjugate = (m3: Matrix3) : Matrix3|null => {\n return mAdjugate(m3) as (Matrix3|null);\n};\n\n/**\n * Adjugate is a transpose of a cofactor matrix\n */\nexport const mAdjugate = (m: Matrix): Matrix|null => {\n\n const size = m.length;\n if(size <= 0) return null;\n\n if(size !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n if(size === 1) return m;\n\n if(size === 2) return m2Adjugate(m as Matrix2);\n\n // build a cofactor matrix ----------------\n const cofactors: Matrix = [];\n\n for(let i=0; i {\n if(m.length > 0 && m.length !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n const d = mDeterminant(m);\n return d === 0;\n};\n\n/**\n * Square matrix A (nxn) is invertible is there is another square matrix B (nxn) so AxB = BxA = I\n * For A (2x2) matrix, the inverse is:\n * (1 / (determinant(A))) * adj(A)\n */\nexport const m2Inverse = (m2: Matrix2, decimalPlaces = Infinity): (Matrix2 | null) => {\n if(m2.length > 0 && m2.length !== m2[0].length){\n throw new Error('The matrix must be square.');\n }\n\n const d = m2Determinant(m2);\n if(d === 0) return null;\n\n const adj = m2Adjugate(m2);\n if(adj === null) return null;\n\n return m2DivideScalar(adj, d, decimalPlaces);\n};\n\nexport const m3Inverse = (m3: Matrix3, decimalPlaces = Infinity): (Matrix3 | null) => {\n return mInverse(m3, decimalPlaces) as (Matrix3|null);\n};\n\nexport const mInverse = (m: Matrix, decimalPlaces = Infinity): (Matrix | null) => {\n const size = m.length;\n\n if(size > 0 && size !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n // find a determinant ----------------------\n const d = mDeterminant(m);\n\n // find an Adjugate - a transpose of a cofactor matrix\n const adj = mAdjugate(m);\n if(adj === null) return null;\n\n return mDivideScalar(adj, d, decimalPlaces);\n};", "import { Matrix2, Matrix3, Matrix4, Matrix, Vector2, Vector3, Vector4 } from '../../types';\nimport { v2Normalize, v3MulScalar, v3Normalize } from './vector';\nimport { mMulVector, mMul } from './matrix';\nimport { setDecimalPlaces } from '../format';\n\n/*\nAny 2D affine transformation can be decomposed\ninto a rotation, followed by a scaling, followed by a\nshearing, and followed by a translation.\n---------------------------------------------------------\nAffine matrix = translation x shearing x scaling x rotation\n */\n\n// ----------------- CSS -------------------------------------\n\n/**\n * Matrix 2D in non-homogeneous coordinates to CSS matrix() function\n * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix\n */\nexport const m2ToCSS = (m: Matrix2) : string => {\n const a = m[0][0];\n const b = m[1][0];\n const c = m[0][1];\n const d = m[1][1];\n\n return `matrix(${ a }, ${ b }, ${ c }, ${ d }, 0, 0)`;\n};\n\n/**\n * Matrix 2D in homogeneous coordinates to CSS matrix() function\n * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix\n */\nexport const m2hToCSS = (m: Matrix3) : string => {\n const a = m[0][0];\n const b = m[1][0];\n const c = m[0][1];\n const d = m[1][1];\n const tx = m[0][2];\n const ty = m[1][2];\n\n return `matrix(${ a }, ${ b }, ${ c }, ${ d }, ${ tx }, ${ ty })`;\n};\n\n/**\n * Matrix 2D in homogeneous coordinates to CSS matrix3d() function\n * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix3d\n */\nexport const m2hToCSS3d = (m: Matrix3) : string => {\n const a = m[0][0];\n const b = m[1][0];\n const c = m[0][1];\n const d = m[1][1];\n const tx = m[0][2];\n const ty = m[1][2];\n\n return `matrix3d(${ a }, ${ b }, 0, 0, ${ c }, ${ d }, 0, 0, 0, 0, 1, 0, ${ tx }, ${ ty }, 0, 1)`;\n};\n\n/**\n * Matrix 3D in homogeneous coordinates to CSS matrix3d() function\n * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix3d\n */\nexport const m3hToCSS3d = (m: Matrix4) : string => {\n\n return `matrix3d(\n ${ m[0][0] }, ${ m[0][1] }, ${ m[0][2] }, ${ m[0][3] },\n ${ m[1][0] }, ${ m[1][1] }, ${ m[1][2] }, ${ m[1][3] },\n ${ m[2][0] }, ${ m[2][1] }, ${ m[2][2] }, ${ m[2][3] },\n ${ m[3][0] }, ${ m[3][1] }, ${ m[3][2] }, ${ m[3][3] }\n )`;\n};\n\n// ---------------- TRANSLATION MATRICES ----------------------\n\nexport const m2Translation = (position: Vector2, decimalPlaces = Infinity): Matrix2 => {\n\n return [\n [1, 0],\n [0, 1],\n [setDecimalPlaces(position[0], decimalPlaces), setDecimalPlaces(position[1], decimalPlaces)],\n ];\n};\n\nexport const m3Translation = (position: Vector3, decimalPlaces = Infinity): Matrix3 => {\n\n return [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n [\n setDecimalPlaces(position[0], decimalPlaces),\n setDecimalPlaces(position[1], decimalPlaces),\n setDecimalPlaces(position[2], decimalPlaces)\n ],\n ];\n};\n\n/**\n * 2D Translation matrix in homogeneous coordinates.\n */\nexport const m2TranslationH = (position: Vector3, decimalPlaces = Infinity): Matrix3 => {\n\n return [\n [1, 0, setDecimalPlaces(position[0], decimalPlaces)],\n [0, 1, setDecimalPlaces(position[1], decimalPlaces)],\n [0, 0, 1],\n ];\n};\n\n/**\n * 3D Translation matrix in homogeneous coordinates.\n */\nexport const m3TranslationH = (position: Vector4, decimalPlaces = Infinity): Matrix4 => {\n\n return [\n [1, 0, 0, setDecimalPlaces(position[0], decimalPlaces)],\n [0, 1, 0, setDecimalPlaces(position[1], decimalPlaces)],\n [0, 0, 1, setDecimalPlaces(position[2], decimalPlaces)],\n [0, 0, 0, 1],\n ];\n};\n\n// ---------------- ROTATION MATRICES -------------------------\n\n/**\n * Rotation of an angle about the origin.\n */\nexport const m2Rotation = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix2 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, -sin],\n [sin, cos],\n ] :\n [\n [cos, sin],\n [-sin, cos],\n ];\n};\n\n/**\n * Rotation of an angle about the origin in homogeneous coordinates (clockwise).\n */\nexport const m2RotationH = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix3 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, -sin, 0],\n [sin, cos, 0],\n [0, 0, 1],\n ]:\n [\n [cos, sin, 0],\n [-sin, cos, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Rotation of an angle \"angleRad\" around the given point (transformOrigin) in homogeneous coordinates (clockwise).\n * result_vector = TranslationMatrix(x, y) * RotationMatrix() * TranslationMatrix(-x, -y) * position_vector\n */\nexport const m2RotationAroundPointH = (\n angleRad: number,\n transformOrigin: Vector3,\n isClockwise = true,\n decimalPlaces = Infinity): Matrix3 => {\n\n const translation = m2TranslationH(transformOrigin, decimalPlaces);\n const rotation = m2RotationH(angleRad, isClockwise, decimalPlaces);\n const translationBack = m2TranslationH(v3MulScalar(transformOrigin, -1), decimalPlaces);\n const temp1 = mMul(translation, rotation);\n return mMul(temp1, translationBack) as Matrix3;\n};\n\nexport const m2RotateAroundPointH = (\n angleRad: number,\n transformOrigin: Vector3,\n position: Vector3,\n isClockwise = true,\n decimalPlaces = Infinity): Vector3 => {\n\n const mat3h = m2RotationAroundPointH(angleRad, transformOrigin, isClockwise, decimalPlaces);\n return mMulVector(mat3h, position) as Vector3;\n};\n\n/**\n * Rotate vector around the origin by angle \"angleRad\" (clockwise).\n */\nexport const v2Rotate = (angleRad: number, vector: Vector2, isClockwise = true, decimalPlaces = Infinity): Vector2 => {\n const unitVector = v2Normalize(vector);\n return mMulVector(m2Rotation(angleRad, isClockwise, decimalPlaces), unitVector) as Vector2;\n};\n\n/**\n * Rotate vector around the origin by angle \"angleRad\" (clockwise).\n */\nexport const v2RotateH = (angleRad: number, vector: Vector3, isClockwise = true, decimalPlaces = Infinity): Vector3 => {\n const unitVector = v3Normalize(vector);\n return mMulVector(m2RotationH(angleRad, isClockwise, decimalPlaces), unitVector) as Vector3;\n};\n\n/**\n * Rotation around the X axis (clockwise).\n */\nexport const m3RotationX = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix3 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [1, 0, 0],\n [0, cos, -sin],\n [0, sin, cos],\n ] :\n [\n [1, 0, 0],\n [0, cos, sin],\n [0, -sin, cos],\n ];\n};\n\n/**\n * Rotation around the X axis (clockwise) - in homogeneous coordinates\n */\nexport const m3RotationXH = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix4 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [1, 0, 0, 0],\n [0, cos, -sin, 0],\n [0, sin, cos, 0],\n [0, 0, 0, 1],\n ] :\n [\n [1, 0, 0, 0],\n [0, cos, sin, 0],\n [0, -sin, cos, 0],\n [0, 0, 0, 1],\n ];\n};\n\nexport const v3RotateX = (angleRad: number, vector: Vector3, isClockwise = true, decimalPlaces = Infinity): Vector3 => {\n const unitVector = v3Normalize(vector);\n return mMulVector(m3RotationX(angleRad, isClockwise, decimalPlaces), unitVector) as Vector3;\n};\n\n/**\n * Rotation around the Y axis (clockwise).\n */\nexport const m3RotationY = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix3 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, 0, sin],\n [0, 1, 0],\n [-sin, 0, cos],\n ] :\n [\n [cos, 0, -sin],\n [0, 1, 0],\n [sin, 0, cos],\n ];\n};\n\n/**\n * Rotation around the Y axis (clockwise) - in homogeneous coordinates\n */\nexport const m3RotationYH = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix4 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, 0, sin, 0],\n [0, 1, 0, 0],\n [-sin, 0, cos, 0],\n [0, 0, 0, 1],\n ] :\n [\n [cos, 0, -sin, 0],\n [0, 1, 0, 0],\n [sin, 0, cos, 0],\n [0, 0, 0, 1],\n ];\n};\n\nexport const v3RotateY = (angleRad: number, vector: Vector3, isClockwise = true, decimalPlaces = Infinity): Vector3 => {\n const unitVector = v3Normalize(vector);\n return mMulVector(m3RotationY(angleRad, isClockwise, decimalPlaces), unitVector) as Vector3;\n};\n\n/**\n * Rotation around the Z axis (clockwise).\n */\nexport const m3RotationZ = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix3 => {\n\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, -sin, 0],\n [sin, cos, 0],\n [0, 0, 1],\n ] : [\n [cos, sin, 0],\n [-sin, cos, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Rotation around the Z axis (clockwise)- in homogeneous coordinates\n */\nexport const m3RotationZH = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix4 => {\n\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, -sin, 0, 0],\n [sin, cos, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ] : [\n [cos, sin, 0, 0],\n [-sin, cos, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\nexport const v3RotateZ = (angleRad: number, vector: Vector3, isClockwise = true, decimalPlaces = Infinity): Vector3 => {\n const unitVector = v3Normalize(vector);\n return mMulVector(m3RotationZ(angleRad, isClockwise, decimalPlaces), unitVector) as Vector3;\n};\n\n// ---------------- SCALE MATRICES -------------\n\n/**\n * Get matrix for arbitrary scaling pivot point.\n * result_vector = TranslationMatrix(x, y) * ScaleMatrix() * TranslationMatrix(-x, -y) * scale_vector\n */\nexport const m2ScaleAtPointHMatrix = (\n scaleVector: Vector3,\n transformOrigin: Vector3,\n decimalPlaces = Infinity): Matrix3 => {\n\n const translation = m2TranslationH(transformOrigin, decimalPlaces);\n const scale = m2ScaleH(scaleVector);\n const translationBack = m2TranslationH(v3MulScalar(transformOrigin, -1), decimalPlaces);\n const temp1 = mMul(translation, scale);\n return mMul(temp1, translationBack) as Matrix3;\n};\n\nexport const m2ScaleAtPointH = (\n scaleVector: Vector3,\n transformOrigin: Vector3,\n point: Vector3,\n decimalPlaces = Infinity): Vector3 => {\n\n const mat3h = m2ScaleAtPointHMatrix(scaleVector, transformOrigin, decimalPlaces);\n return mMulVector(mat3h, point) as Vector3;\n};\n\nexport const m2Scale = (scaleVector: Vector2): Matrix2 => {\n return [\n [scaleVector[0], 0],\n [0, scaleVector[1]],\n ];\n};\n\nexport const v2Scale = (scaleVector: Vector2, vector: Vector2): Vector2 => {\n return mMulVector(m2Scale(scaleVector), vector) as Vector2;\n};\n\n/**\n * homogeneous coordinates\n */\nexport const m2ScaleH = (scaleVector: Vector3): Matrix3 => {\n return [\n [scaleVector[0], 0, 0],\n [0, scaleVector[1], 0],\n [0, 0, 1],\n ];\n};\n\nexport const m3Scale = (scaleVector: Vector3): Matrix3 => {\n return [\n [scaleVector[0], 0, 0],\n [0, scaleVector[1], 0],\n [0, 0, scaleVector[2]],\n ];\n};\n\nexport const m3ScaleH = (scaleVector: Vector4): Matrix4 => {\n return [\n [scaleVector[0], 0, 0, 0],\n [0, scaleVector[1], 0, 0],\n [0, 0, scaleVector[2], 0],\n [0, 0, 0, 1]\n ];\n};\n\nexport const v3Scale = (scaleVector: Vector3, vector: Vector3): Vector3 => {\n return mMulVector(m3Scale(scaleVector), vector) as Vector3;\n};\n\n/**\n * Stretch, parallel to the x-axis.\n */\nexport const m2ScaleX = (scale: number): Matrix2 => {\n return [\n [scale, 0],\n [0, 1],\n ];\n};\n\n/**\n * Stretch, parallel to the x-axis - homogeneous coordinates\n */\nexport const m2ScaleXH = (scale: number): Matrix3 => {\n return [\n [scale, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Stretch in x-direction\n */\nexport const m3ScaleX = (scale: number): Matrix3 => {\n return [\n [scale, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Stretch in x-direction\n */\nexport const m3ScaleXH = (scale: number): Matrix4 => {\n return [\n [scale, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Stretch in y-direction\n */\nexport const m3ScaleY = (scale: number): Matrix3 => {\n return [\n [1, 0, 0],\n [0, scale, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Stretch in y-direction\n */\nexport const m3ScaleYH = (scale: number): Matrix => {\n return [\n [1, 0, 0, 0],\n [0, scale, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Stretch in z-direction\n */\nexport const m3ScaleZ = (scale: number): Matrix3 => {\n return [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, scale],\n ];\n};\n\n/**\n * Stretch in z-direction\n */\nexport const m3ScaleZH = (scale: number): Matrix4 => {\n return [\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, scale, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Stretch, parallel to the y-axis.\n */\nexport const m2ScaleY = (scale: number): Matrix2 => {\n return [\n [1, 0],\n [0, scale],\n ];\n};\n\n/**\n * Stretch, parallel to the y-axis - homogeneous coordinates\n */\nexport const m2ScaleYH = (scale: number): Matrix3 => {\n return [\n [1, 0, 0],\n [0, scale, 0],\n [0, 0, 1],\n ];\n};\n\n// ---------------- REFLECTION MATRICES -------------------------\n\n/**\n * Reflection about the origin.\n */\nexport const m2ReflectionOrigin = (): Matrix2 => {\n\n return [\n [-1, 0],\n [0, -1],\n ];\n};\n\n/**\n * Reflection about the origin.\n */\nexport const m2ReflectionOriginH = (): Matrix3 => {\n\n return [\n [-1, 0, 0],\n [0, -1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection about the origin in non-homogeneous coordinates\n */\nexport const m3ReflectionOrigin = (): Matrix3 => {\n\n return [\n [-1, 0, 0],\n [0, -1, 0],\n [0, 0, -1],\n ];\n};\n\n/**\n * Reflection about the origin in homogeneous coordinates\n */\nexport const m3ReflectionOriginH = (): Matrix4 => {\n\n return [\n [-1, 0, 0, 0],\n [0, -1, 0, 0],\n [0, 0, -1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Reflection about y=-x\n */\nexport const m2ReflectionYmX = (): Matrix2 => {\n\n return [\n [0, -1],\n [-1, 0],\n ];\n};\n\n/**\n * Reflection in the x-axis.\n */\nexport const m2ReflectionX = (): Matrix2 => {\n\n return [\n [1, 0],\n [0, -1],\n ];\n};\n\n/**\n * Reflection in the x-axis.\n */\nexport const m2ReflectionXH = (): Matrix3 => {\n\n return [\n [1, 0, 0],\n [0, -1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection in the y-axis.\n */\nexport const m2ReflectionY = (): Matrix2 => {\n\n return [\n [-1, 0],\n [0, 1],\n ];\n};\n\nexport const m2ReflectionYH = (): Matrix3 => {\n\n return [\n [-1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to YZ plane in non-homogeneous coordinates\n */\nexport const m3ReflectionYZ = (): Matrix3 => {\n\n return [\n [-1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to YZ plane in homogeneous coordinates\n */\nexport const m3ReflectionYZH = (): Matrix4 => {\n\n return [\n [-1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to XZ plane in non-homogeneous coordinates\n */\nexport const m3ReflectionXZ = (): Matrix3 => {\n\n return [\n [1, 0, 0],\n [0, -1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to XZ plane in homogeneous coordinates\n */\nexport const m3ReflectionXZH = (): Matrix4 => {\n\n return [\n [1, 0, 0, 0],\n [0, -1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to XY plane in non-homogeneous coordinates\n */\nexport const m3ReflectionXY = (): Matrix3 => {\n\n return [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, -1],\n ];\n};\n\n/**\n * Reflection relative to XY plane in homogeneous coordinates\n */\nexport const m3ReflectionXYH = (): Matrix4 => {\n\n return [\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, -1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n// ---------------- SHEARING MATRICES -------------------------\n\n\n/**\n * Shearing in y-axis, with x-axis fixed with (0,1) moving to (factor, 1)\n */\nexport const m2ShearingY = (factor: number): Matrix2 => {\n\n return [\n [1, factor],\n [0, 1],\n ];\n};\n\n/**\n * Shearing in x-axis, with y-axis fixed with (1,0) moving to (1, factor)\n */\nexport const m2ShearingX = (factor: number): Matrix2 => {\n\n return [\n [1, 0],\n [factor, 1],\n ];\n};", "import { setDecimalPlaces } from './format';\n\n/**\n * Returns a random number in the [min,max] range.\n */\nexport const getRandom = (min: number, max: number, decimalPlaces = Infinity): number => {\n return setDecimalPlaces(Math.random() * (max - min) + min, decimalPlaces);\n};\n\n/**\n * Returns a random integer number in the [min,max] range.\n */\nexport const getRandomInt = (min: number, max: number): number => {\n return Math.floor(Math.random() * (max - min + 1) + min);\n};\n\nexport const getRandomBoolean = () => Math.random() < 0.5;\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nexport const getRandomItemFromArray = (array: any[]) => {\n const randomIndex = getRandomInt(0, array.length - 1);\n return array[randomIndex];\n};", "export const stringToNumber = (value: string|undefined|null|number, defaultNumber: number) => {\n if(value === undefined || value === null) return defaultNumber;\n const res = Number(value) ?? defaultNumber;\n return isNaN(res) ? defaultNumber : res;\n};", "import { setDecimalPlaces } from './format';\nimport { Vector2, Vector3 } from '../types';\n\n/**\n * u(x) and v(x) are functions ---------->\n *\n * dx(u + v) = dx(u) + dx(v)\n * dx(u - v) = dx(u) - dx(v)\n * dx(u * v) = dx(u) * v + u * dx(v)\n * dx(u / v) = (dx(u) * v - u * dx(v)) / (v ^ 2), when v(x) != 0\n */\n\n// ------------------ Derivatives of Polynomial ---------------------------\n\n/**\n * y = 3x+2\n * dxPolynomial(10, [[3, 1], [2, 0]])\n */\nexport const dxPolynomial = (x: number, polynomial: number[][], decimalPlaces = Infinity) => {\n let res = 0;\n\n for(const part of polynomial){\n if(part.length !== 2) return NaN;\n\n const coeff = part[0];\n const power = part[1];\n res += coeff * power * Math.pow(x, power - 1);\n }\n\n return setDecimalPlaces(res, decimalPlaces);\n}\n\n// ---------------------- Bezier Curves ---------------------------\n\n/**\n * Derivative of Bezier Curve is another Bezier Curve.\n * t must min in range [0, 1]\n */\nexport const dxV2QuadraticBezierCurve = (\n t: number,\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n // The derivative: P1 * (2t-2) + (2*P3-4*P2) * t + 2 * P2\n\n const temp1 = -2 * (1 - t); // Math.pow(1 - t, 2)\n const temp2 = 2 - 4 * t; // (1 - t) * 2 * t\n const temp3 = 2 * t; //t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * centerControlPoint[0] + temp3 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * centerControlPoint[1] + temp3 * endControlPoint[1], decimalPlaces),\n ];\n};\n\nexport const dxV3QuadraticBezierCurve = (\n t: number,\n startControlPoint: Vector3,\n centerControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n\n const temp1 = -2 * (1 - t); // Math.pow(1 - t, 2)\n const temp2 = 2 - 4 * t; // (1 - t) * 2 * t\n const temp3 = 2 * t; //t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * centerControlPoint[0] + temp3 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * centerControlPoint[1] + temp3 * endControlPoint[1], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[2] + temp2 * centerControlPoint[2] + temp3 * endControlPoint[2], decimalPlaces),\n ];\n};\n\nexport const dxV2CubicBezierCurve = (\n t: number,\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const temp1 = -3 * Math.pow(1 - t, 2); //Math.pow(1 - t, 3);\n const temp2 = 3 * (t - 1) * (3 * t - 1); //Math.pow(1 - t, 2) * 3 * t;\n const temp3 = 6 * t - 9 * t * t; // (1 - t) * 3 * t * t;\n const temp4 = 3 * t * t; //t * t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * center1ControlPoint[0] + temp3 * center2ControlPoint[0] + temp4 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * center1ControlPoint[1] + temp3 * center2ControlPoint[1] + temp4 * endControlPoint[1], decimalPlaces),\n ];\n};\n\nexport const dxV3CubicBezierCurve = (\n t: number,\n startControlPoint: Vector3,\n center1ControlPoint: Vector3,\n center2ControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n\n const temp1 = -3 * Math.pow(1 - t, 2); //Math.pow(1 - t, 3);\n const temp2 = 3 * (t - 1) * (3 * t - 1); //Math.pow(1 - t, 2) * 3 * t;\n const temp3 = 6 * t - 9 * t * t; // (1 - t) * 3 * t * t;\n const temp4 = 3 * t * t; //t * t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * center1ControlPoint[0] + temp3 * center2ControlPoint[0] + temp4 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * center1ControlPoint[1] + temp3 * center2ControlPoint[1] + temp4 * endControlPoint[1], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[2] + temp2 * center1ControlPoint[2] + temp3 * center2ControlPoint[2] + temp4 * endControlPoint[2], decimalPlaces),\n ];\n};\n\n\n// ----------------- Derivatives of trigonometry functions ---------------------------\n\nexport const dxSin = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(Math.cos(x), decimalPlaces);\n};\n\nexport const dxCos = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(-Math.sin(x), decimalPlaces);\n};\n\nexport const dxTan = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(1 / (Math.cos(x) ** 2), decimalPlaces);\n};\n\n/**\n * x != Math.PI * n, where n is an integer\n */\nexport const dxCot = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(-1 / (Math.sin(x) ** 2), decimalPlaces);\n};\n\n/**\n * -1 < x < 1\n */\nexport const dxArcSin = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(1 / (Math.sqrt(1 - x ** 2)), decimalPlaces);\n};\n\n/**\n * -1 < x < 1\n */\nexport const dxArcCos = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(-1 / (Math.sqrt(1 - x ** 2)), decimalPlaces);\n};\n\nexport const dxArcTan = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(1 / (1 + x ** 2), decimalPlaces);\n};\n\nexport const dxArcCot = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(-1 / (1 + x ** 2), decimalPlaces);\n};\n", "import { Matrix, Matrix2, Matrix3, Vector, Vector2, Vector3 } from '../../types';\nimport { m2Inverse, m3Inverse, mInverse, mMulVector, mDelLastColumn, mGetLastColumn } from '../linear-algebra/matrix';\nimport { setDecimalPlaces } from '../format';\nimport { v2Sub } from '../linear-algebra/vector';\n\n/**\n * Linear equation\n * ax + b = c\n * x = (c - b) / a; a != 0\n */\nexport const linearEquation = (equation: Vector3, decimalPlaces = Infinity) : number => {\n const a = equation[0];\n const b = equation[1];\n const c = equation[2];\n\n const diff = c - b;\n\n if(a === 0 && diff === 0) return Infinity; // any number is a solution\n if(a === 0) return NaN; // no solution\n\n return setDecimalPlaces(diff / a, decimalPlaces);\n};\n\n/**\n * System of 2 linear equations.\n * [x, y] = inverse(Matrix of equation parameters) x (vector of equation results)\n * ---------------\n * 3x + 2y = 7\n * -6x + 6y = 6\n */\nexport const linearEquationSystem2 = (equation1: Vector3, equation2: Vector3, decimalPlaces = Infinity) : Vector2 | null => {\n const equationParams: Matrix2 = [\n [equation1[0], equation1[1]],\n [equation2[0], equation2[1]],\n ];\n\n const inversed = m2Inverse(equationParams);\n if(inversed === null) return null; // no results\n\n const equationResults: Vector2 = [\n equation1[2],\n equation2[2]\n ];\n\n return mMulVector(inversed, equationResults, decimalPlaces) as Vector2;\n};\n\n/**\n * System of 3 linear equations.\n * ---------------------------------------\n * 3x + 2y + 5z = 7\n * -6x + 6y + 6z = 6\n * 2x + 7y - z = 4\n */\nexport const linearEquationSystem3 = (\n equation1: Vector,\n equation2: Vector,\n equation3: Vector,\n decimalPlaces = Infinity) : Vector3 | null => {\n const equationParams: Matrix3 = [\n [equation1[0], equation1[1], equation1[2]],\n [equation2[0], equation2[1], equation2[2]],\n [equation3[0], equation3[1], equation3[2]],\n ];\n\n const inversed = m3Inverse(equationParams);\n if(inversed === null) return null; // no results\n\n const equationResults: Vector3 = [\n equation1[3],\n equation2[3],\n equation3[3]\n ];\n\n return mMulVector(inversed, equationResults, decimalPlaces) as Vector3;\n};\n\n/**\n * System of N linear equations.\n */\nexport const linearEquationSystemN = (equations: Matrix, decimalPlaces = Infinity) : Vector | null => {\n if(equations.length <= 0) return null;\n\n const equationParams = mDelLastColumn(equations);\n\n const inversed = mInverse(equationParams);\n if(inversed === null) return null; // no results\n\n // the last column of the equations matrix\n const equationResults = mGetLastColumn(equations);\n\n return mMulVector(inversed, equationResults, decimalPlaces) as Vector;\n};\n\n/**\n * Calculate the equation of a line given two points in a 2D space.\n * y = ax + b\n * y - y1 = m(x - x1)\n * m = (y2 - y1) / (x2 - x1)\n */\nexport const getLinearEquationBy2Points = (point1: Vector2, point2: Vector2) : {\n slope: number|undefined,\n yIntercept: number|undefined,\n xIntercept: number|undefined,\n formula: string,\n} => {\n const [deltaX, deltaY] = v2Sub(point2, point1);\n const [x, y] = point1;\n\n if(deltaX === 0) {\n return {\n slope: undefined,\n xIntercept: x,\n yIntercept: undefined,\n formula: `x = ${ x }`,\n };\n }\n\n const m = deltaY / deltaX;\n const b = y - m * x;\n let formula = '';\n\n if(m === 0) {\n formula = `y = ${ b }`;\n }\n else{\n formula = `y = ${ m === 1 ? '' : m }x`;\n\n if(b !== 0) {\n formula += ` ${ b < 0 ? '-' : '+' } ${ Math.abs(b) }`;\n }\n }\n\n return {\n slope: m,\n xIntercept: undefined,\n yIntercept: b,\n formula,\n };\n};", "import { Vector } from '../../types';\nimport { setDecimalPlaces } from '../format';\nimport { linearEquation } from './linear-equations';\nimport { isNumber } from '../other';\n\n/**\n * Quadratic Equation.\n * ax^2 + bx + c = d\n */\nexport const quadraticEquation = (equation: Vector, decimalPlaces = Infinity) : Vector => {\n const a = equation[0];\n const b = equation[1];\n const c = equation[2];\n const d = equation[3];\n\n if(a === 0){\n // it's a linear equation -------------------------------------------\n const res = linearEquation([b, c, d], decimalPlaces);\n if(isNumber(res)) return [res];\n return [];\n }\n\n const diff = c - d;\n\n const discriminant = b * b - (4 * a * diff);\n\n if(discriminant < 0){\n return []; // no results\n }\n\n if(discriminant === 0){\n return [ setDecimalPlaces(-b / (2 * a), decimalPlaces) ]; // 1 result\n }\n\n // if(determinant > 0) ---> 2 results\n const t1 = 2 * a;\n const t2 = Math.sqrt(discriminant);\n\n return [\n setDecimalPlaces((-b + t2) / t1, decimalPlaces),\n setDecimalPlaces((-b - t2) / t1, decimalPlaces),\n ];\n};", "import { IBBox, Vector, Vector2, Vector3 } from '../../types';\nimport { setDecimalPlaces } from '../format';\nimport {\n dxV2CubicBezierCurve,\n dxV2QuadraticBezierCurve,\n dxV3CubicBezierCurve,\n dxV3QuadraticBezierCurve\n} from '../derivative';\nimport { v2Normalize, v3Normalize } from '../linear-algebra/vector';\nimport { linearEquation } from '../equations/linear-equations';\nimport { quadraticEquation } from '../equations/quadratic-equations';\nimport { isNumber } from '../other';\n\n/**\n * B\u00E9zier Curves\n * quadratic: y = P1 * (1-t)\u00B2 + P2 * 2 * (1-t)t + P3 * t\u00B2\n * t in range [0, 1]\n */\n\n// -------------------- GET POINT ON CURVE --------------------------\n\n/**\n * Get a point on a quadratic B\u00E9zier curve as a function of time.\n */\nexport const v2QuadraticBezierCurve = (\n t: number,\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const temp1 = Math.pow(1 - t, 2);\n const temp2 = (1 - t) * 2 * t;\n const temp3 = t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * centerControlPoint[0] + temp3 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * centerControlPoint[1] + temp3 * endControlPoint[1], decimalPlaces),\n ];\n};\n\nexport const v3QuadraticBezierCurve = (\n t: number,\n startControlPoint: Vector3,\n centerControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n\n const temp1 = Math.pow(1 - t, 2);\n const temp2 = (1 - t) * 2 * t;\n const temp3 = t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * centerControlPoint[0] + temp3 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * centerControlPoint[1] + temp3 * endControlPoint[1], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[2] + temp2 * centerControlPoint[2] + temp3 * endControlPoint[2], decimalPlaces),\n ];\n};\n\n/**\n * Get a point on a cubic B\u00E9zier curve as a function of time.\n */\nexport const v2CubicBezierCurve = (\n t: number,\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const temp1 = Math.pow(1 - t, 3);\n const temp2 = Math.pow(1 - t, 2) * 3 * t;\n const temp3 = (1 - t) * 3 * t * t;\n const temp4 = t * t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * center1ControlPoint[0] + temp3 * center2ControlPoint[0] + temp4 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * center1ControlPoint[1] + temp3 * center2ControlPoint[1] + temp4 * endControlPoint[1], decimalPlaces),\n ];\n};\n\nexport const v3CubicBezierCurve = (\n t: number,\n startControlPoint: Vector3,\n center1ControlPoint: Vector3,\n center2ControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n\n const temp1 = Math.pow(1 - t, 3);\n const temp2 = Math.pow(1 - t, 2) * 3 * t;\n const temp3 = (1 - t) * 3 * t * t;\n const temp4 = t * t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * center1ControlPoint[0] + temp3 * center2ControlPoint[0] + temp4 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * center1ControlPoint[1] + temp3 * center2ControlPoint[1] + temp4 * endControlPoint[1], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[2] + temp2 * center1ControlPoint[2] + temp3 * center2ControlPoint[2] + temp4 * endControlPoint[2], decimalPlaces),\n ];\n};\n\n// -------------------- TANGENT --------------------------\n\n/**\n * Tangent indicates the direction of travel at specific points along the B\u00E9zier curve,\n * and is literally just the first derivative of our curve.\n */\nexport const v2QuadraticBezierCurveTangent = (\n t: number,\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n const dxVector = dxV2QuadraticBezierCurve(t, startControlPoint, centerControlPoint, endControlPoint);\n return v2Normalize(dxVector, decimalPlaces);\n};\n\nexport const v3QuadraticBezierCurveTangent = (\n t: number,\n startControlPoint: Vector3,\n centerControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n const dxVector = dxV3QuadraticBezierCurve(t, startControlPoint, centerControlPoint, endControlPoint);\n return v3Normalize(dxVector, decimalPlaces);\n};\n\nexport const v2CubicBezierCurveTangent = (\n t: number,\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n const dxVector = dxV2CubicBezierCurve(t, startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint);\n return v2Normalize(dxVector, decimalPlaces);\n};\n\nexport const v3CubicBezierCurveTangent = (\n t: number,\n startControlPoint: Vector3,\n center1ControlPoint: Vector3,\n center2ControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n const dxVector = dxV3CubicBezierCurve(t, startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint);\n return v3Normalize(dxVector, decimalPlaces);\n};\n\n// -------------------- NORMAL --------------------------\n\n/**\n * Normal is a vector that runs at a right angle to the direction of the curve, and is typically of length 1.\n * To find it, we take the normalised tangent vector, and then rotate it by a 90 degrees.\n */\nexport const v2QuadraticBezierCurveNormal = (\n t: number,\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const tangent = v2QuadraticBezierCurveTangent(t, startControlPoint, centerControlPoint, endControlPoint, decimalPlaces);\n return [-tangent[1], tangent[0]];\n};\n\nexport const v2CubicBezierCurveNormal = (\n t: number,\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const tangent = v2CubicBezierCurveTangent(t, startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint, decimalPlaces);\n return [-tangent[1], tangent[0]];\n};\n\n// -------------------- EXTREMA --------------------------\n\n/**\n * Find maxima and minima by solving the equation B'(t) = 0\n * Returns result in [0, 1] range.\n */\nexport const v2QuadraticBezierCurveExtrema = (\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector => {\n\n /*\n (-2 * (1 - t)) * startControlPoint[0] + (2 - 4 * t) * centerControlPoint[0] + (2 * t) * endControlPoint[0]\n 2 * t * startControlPoint[0] - 4 * t * centerControlPoint[0] + 2 * t * endControlPoint[0] - 2 * startControlPoint[0] + 2 * centerControlPoint[0]\n t * (2 * startControlPoint[0] - 4 * centerControlPoint[0] + 2 * endControlPoint[0]) + (- 2 * startControlPoint[0] + 2 * centerControlPoint[0])\n */\n\n const a1 = 2 * startControlPoint[0] - 4 * centerControlPoint[0] + 2 * endControlPoint[0];\n const b1 = -2 * startControlPoint[0] + 2 * centerControlPoint[0];\n const equation1: Vector3 = [a1, b1, 0];\n const res1 = linearEquation(equation1, decimalPlaces);\n\n const a2 = 2 * startControlPoint[1] - 4 * centerControlPoint[1] + 2 * endControlPoint[1];\n const b2 = -2 * startControlPoint[1] + 2 * centerControlPoint[1];\n const equation2: Vector3 = [a2, b2, 0];\n const res2 = linearEquation(equation2, decimalPlaces);\n\n const res: Vector = [];\n\n if(isNumber(res1)){\n res.push(res1);\n }\n\n if(isNumber(res2)){\n res.push(res2);\n }\n\n return res;\n};\n\n/**\n * Find maxima and minima by solving the equation B'(t) = 0\n * Returns result in [0, 1] range.\n */\nexport const v2CubicBezierCurveExtrema = (\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2|null => {\n\n const a1 = -3 * startControlPoint[0] + 9 * center1ControlPoint[0] - 9 * center2ControlPoint[0] + 3 * endControlPoint[0];\n const b1 = 6 * startControlPoint[0] - 12 * center1ControlPoint[0] + 6 * center2ControlPoint[0];\n const c1 = -3 * startControlPoint[0] + 3 * center1ControlPoint[0];\n const equation1: Vector = [a1, b1, c1, 0];\n\n const a2 = -3 * startControlPoint[1] + 9 * center1ControlPoint[1] - 9 * center2ControlPoint[1] + 3 * endControlPoint[1];\n const b2 = 6 * startControlPoint[1] - 12 * center1ControlPoint[1] + 6 * center2ControlPoint[1];\n const c2 = -3 * startControlPoint[1] + 3 * center1ControlPoint[1];\n const equation2: Vector = [a2, b2, c2, 0];\n\n // Any value between 0 and 1 is a root that matters for B\u00E9zier curves, anything below or above that is irrelevant (because B\u00E9zier curves are only defined over the interval [0,1]).\n const res1 = quadraticEquation(equation1, decimalPlaces).filter(num => num >= 0 && num <= 1);\n const res2 = quadraticEquation(equation2, decimalPlaces).filter(num => num >= 0 && num <= 1);\n\n const res = [...res1, ...res2];\n if(res.length === 2){\n return [...res1, ...res2] as Vector2;\n }\n\n return null;\n};\n\n// -------------------- BOUNDING BOX --------------------------\n\nexport const v2QuadraticBezierBBox = (\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : IBBox => {\n\n const extrema = v2QuadraticBezierCurveExtrema(startControlPoint, centerControlPoint, endControlPoint);\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for(const percent of extrema){\n const point = v2QuadraticBezierCurve(percent, startControlPoint, centerControlPoint, endControlPoint);\n\n const x = point[0];\n const y = point[1];\n\n minX = Math.min(minX, x);\n maxX = Math.max(maxX, x);\n\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y);\n }\n\n minX = setDecimalPlaces(Math.min(minX, startControlPoint[0], endControlPoint[0]), decimalPlaces);\n maxX = setDecimalPlaces(Math.max(maxX, startControlPoint[0], endControlPoint[0]), decimalPlaces);\n minY = setDecimalPlaces(Math.min(minY, startControlPoint[1], endControlPoint[1]), decimalPlaces);\n maxY = setDecimalPlaces(Math.max(maxY, startControlPoint[1], endControlPoint[1]), decimalPlaces);\n\n return {\n x: minX,\n y: minY,\n w: Math.abs(maxX - minX),\n h: Math.abs(maxY - minY),\n x2: maxX,\n y2: maxY,\n }\n};\n\nexport const v2CubicBezierBBox = (\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : IBBox => {\n\n const extrema = v2CubicBezierCurveExtrema(startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint) || [];\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for(const percent of extrema){\n const point = v2CubicBezierCurve(percent, startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint);\n\n const x = point[0];\n const y = point[1];\n\n minX = Math.min(minX, x ?? Infinity);\n maxX = Math.max(maxX, x ?? -Infinity);\n\n minY = Math.min(minY, y ?? Infinity);\n maxY = Math.max(maxY, y ?? -Infinity);\n }\n\n minX = setDecimalPlaces(Math.min(minX, startControlPoint[0], endControlPoint[0]), decimalPlaces);\n maxX = setDecimalPlaces(Math.max(maxX, startControlPoint[0], endControlPoint[0]), decimalPlaces);\n minY = setDecimalPlaces(Math.min(minY, startControlPoint[1], endControlPoint[1]), decimalPlaces);\n maxY = setDecimalPlaces(Math.max(maxY, startControlPoint[1], endControlPoint[1]), decimalPlaces);\n\n return {\n x: minX,\n y: minY,\n w: Math.abs(maxX - minX),\n h: Math.abs(maxY - minY),\n x2: maxX,\n y2: maxY,\n }\n};\n\n\n", "import { Vector2 } from '../types';\nimport { v2Sub } from './linear-algebra/vector';\nimport { getV2Angle } from './angle';\nimport { convertRange } from './other';\n\n/**\n * Circle Equation\n * x^2 + y^2 = radius^2\n * ----------------------\n * Circle Parametric Equation\n * x(t) = radius * cos(t)\n * y(t) = radius * sin(t)\n * t is the parameter = angle\n *\n * Angle should be in the range [0, Math.PI]\n */\nexport const circleMovement = (center: Vector2, angle: number, radius: number): Vector2 => {\n angle = angle % Math.PI * 2;\n\n return [\n center[0] + Math.cos(angle) * radius,\n center[1] + Math.sin(angle) * radius\n ];\n};\n\n/**\n * Circle Movement After Mouse.\n * Mouse Positions:\n * - pageX/Y coordinates are relative to the top left corner of the whole rendered page (including parts hidden by scrolling),\n * - screenX and screenY: Relative to the top left of the physical screen/monitor, this reference point only moves if you increase or decrease the number of monitors or the monitor resolution.\n * - clientX/Y coordinates are relative to the top left corner of the visible part of the page, \"seen\" through browser window.\n * - offsetX and offsetY are relative to the parent container,\n */\nexport const circleMovementAfterMouse = (\n mouse: Vector2,\n center: Vector2,\n radius: number\n): Vector2 => {\n\n const vector = v2Sub(mouse, center);\n\n let angle = getV2Angle(vector);\n\n // convert the angle from the range [0, Math.PI*2] to the range [0, Math.PI]\n angle = convertRange(angle, 0, Math.PI*2, 0, Math.PI);\n\n return circleMovement(center, angle, radius);\n};\n\n/**\n * Ellipse Equation\n * (x - centerX)^2 / (radius1^2) + (y - centerY)^2 / (radius2^2) = 1\n * -----------------------------------------------------------------\n * Ellipse Parametric Equation\n * x(t) = radius1 * cos(t)\n * y(t) = radius2 * sin(t)\n * t is the parameter = angle\n *\n * Angle should be in the range [0, Math.PI]\n */\nexport const ellipseMovement = (center: Vector2, angle: number, radius1: number, radius2: number): Vector2 => {\n angle = angle % Math.PI * 2;\n\n return [\n center[0] + Math.cos(angle) * radius1,\n center[1] + Math.sin(angle) * radius2\n ];\n};\n\n/**\n * Ellipse Movement After Mouse.\n * Mouse Positions:\n * - pageX/Y coordinates are relative to the top left corner of the whole rendered page (including parts hidden by scrolling),\n * - screenX and screenY: Relative to the top left of the physical screen/monitor, this reference point only moves if you increase or decrease the number of monitors or the monitor resolution.\n * - clientX/Y coordinates are relative to the top left corner of the visible part of the page, \"seen\" through browser window.\n * - offsetX and offsetY are relative to the parent container,\n */\nexport const ellipseMovementAfterMouse = (\n mouse: Vector2,\n center: Vector2,\n radii: Vector2\n): Vector2 => {\n\n const vector = v2Sub(mouse, center);\n\n let angle = getV2Angle(vector);\n\n // convert the angle from the range [0, Math.PI*2] to the range [0, Math.PI]\n angle = convertRange(angle, 0, Math.PI*2, 0, Math.PI);\n\n return ellipseMovement(center, angle, radii[0], radii[1]);\n};\n\n/**\n * Sine Wave Equation (Sinusoid)\n * -----------------------------\n * const y = amplitude * Math.sin(2 * Math.PI * frequency * x + phase);\n * amplitude = the peak deviation of the function from zero\n * frequency = number of cycles\n * phase = specifies (in radians) where in its cycle the oscillation is at t = 0.\n * think of it as \"shifting\" the starting point of the function to the right (positive p) or left (negative)\n */\nexport const sineWaveMovement = (x: number, amplitude: number, frequency: number, phase: number) : Vector2 => {\n /*\n example values:\n const amplitude = 50;\n const frequency = 0.005;\n const phase = 0;\n x: [0, 1000]\n */\n const y = amplitude * Math.sin(2 * Math.PI * frequency * x + phase);\n\n return [x, y];\n};\n\n/**\n * Lissajous curve (Lissajous figure or Bowditch curve)\n * Parametric equation #1\n * f(t) = A * sin(k * t + m)\n * f(t) = B * sin(n * t)\n * 0 <= m <= PI/2\n * k, n >= 1\n * -----------------------\n * Parametric equation #2\n * f(t) = A * cos(k * t - m)\n * f(t) = B * cos(n * t - p)\n * -----------------------------\n * Shapes:\n * k = 1, n = 1, m = 0, p = 0 ---> line\n * A = B, k = 1, n = 1, m = PI/2, p = PI/2 ----> circle\n * A != B, k = 1, n = 1, m = PI/2, p = PI/2 ----> ellipse\n * k = 2, n = 2, m = PI/2, p = PI/2 ----> section of a parabola\n */\nexport const lissajousCurve = (\n width: number,\n height: number,\n t: number,\n k: number,\n n: number,\n m: number,\n p: number\n) :Vector2 => {\n return [\n width * Math.cos(k * t - m),\n height * Math.cos(n * t - p),\n ];\n};\n", "import { getRandom } from './random';\nimport { HSLColor, RGBColor } from '../types';\nimport { mod } from './other';\nimport { setDecimalPlaces } from './format';\n\n// ------------------------ RANDOM COLOR -------------------------------------\n\nexport const getRandomRGBColor = () : RGBColor => {\n const hslColor = getRandomHSLColor();\n return hslToRgb(hslColor);\n};\n\nexport const getRandomHexColor = () : string => {\n const hslColor = getRandomHSLColor();\n return hslToHex(hslColor);\n};\n\nexport const getRandomHSLColor = () : HSLColor => {\n const h = getRandom(1, 360);\n const s = getRandom(0, 100);\n const l = getRandom(0, 100);\n return [h, s, l];\n};\n\n/**\n * generate random color with the given hue\n */\nexport const getRandomHSLColorWithHue = (h: number) : HSLColor => {\n const s = getRandom(0, 100);\n const l = getRandom(0, 100);\n return [h, s, l];\n};\n\n/**\n * generate random color with the given saturation\n */\nexport const getRandomHSLColorWithSaturation = (s: number) : HSLColor => {\n const h = getRandom(1, 360);\n const l = getRandom(0, 100);\n return [h, s, l];\n};\n\n/**\n * generate random color with the given lightness\n */\nexport const getRandomHSLColorWithLightness = (l: number) : HSLColor => {\n const h = getRandom(1, 360);\n const s = getRandom(0, 100);\n return [h, s, l];\n};\n\nexport const getRandomGrayscaleHSLColor = () : HSLColor => {\n const l = getRandom(0, 100);\n return [0, 0, l];\n};\n\nexport const getRandomHSLColorWithinRanges = (\n hueStart = 1, hueEnd = 360,\n saturationStart = 0, saturationEnd = 100,\n lightStart = 0, lightEnd = 100\n) : HSLColor => {\n const h = getRandom(hueStart, hueEnd);\n const s = getRandom(saturationStart, saturationEnd);\n const l = getRandom(lightStart, lightEnd);\n return [h, s, l];\n};\n\n// ----------------------- CONVERT COLORS --------------------------------------\n\n/**\n * helper: convert hue value to %\n * @param {number} h\n * @return {number} [0, 100] %\n */\nconst convertHueToPercent = (h : number) : number => {\n\n // the hue value needs to be multiplied by 60 to convert it to degrees\n h *= 60;\n\n // if hue becomes negative, you need to add 360 to, because a circle has 360 degrees\n if(h < 0){\n h += 360;\n }\n\n // convert huw to %\n return h * 100 / 360;\n};\n\n/**\n * get hue from RGB\n * @param {number} r [0, 255]\n * @param {number} g [0, 255]\n * @param {number} b [0, 255]\n * @param {number|undefined=} min - min number of [r, g, b]\n * @param {number|undefined=} max - max number of [r, g, b]\n * @return {number} [0, 100] % - we use here % instead of [0, 359] degrees\n */\nconst getHue = (r : number, g : number, b : number, min : number | undefined = undefined, max : number | undefined = undefined) : number => {\n\n // find the minimum and maximum values of r, g, and b if they are not provided\n min = (min === undefined) ? Math.min(r, g, b) : min;\n max = (min === undefined) ? Math.max(r, g, b) : max;\n\n // if the min and max value are the same -> no hue, as it's gray\n if(min === max) return 0;\n\n // if red is max\n if(max === r){\n return convertHueToPercent((g - b) / (max - min));\n }\n\n // if green is max\n if(max === g){\n return convertHueToPercent(2.0 + (b - r) / (max - min));\n }\n\n // if blue is max\n if(max === b){\n return convertHueToPercent(4.0 + (r - g) / (max - min));\n }\n\n return 0;\n};\n\n/**\n * get luminance from RGB\n * @param {number} r [0, 255]\n * @param {number} g [0, 255]\n * @param {number} b [0, 255]\n * @param {number|undefined=} min - min number of [r, g, b]\n * @param {number|undefined=} max - max number of [r, g, b]\n * @return {number} [0, 100] %\n */\nconst getLuminance = (\n r : number,\n g : number,\n b : number,\n min : number | undefined = undefined,\n max : number | undefined = undefined) : number => {\n\n // find the minimum and maximum values of r, g, and b if they are not provided\n min = (min === undefined) ? Math.min(r, g, b) : min;\n max = (min === undefined) ? Math.max(r, g, b) : max;\n\n // calculate the luminance value\n // @ts-ignore\n const l = (min + max) / 2; // [0, 1]\n\n // return l value in %\n return l * 100;\n};\n\n/**\n * get saturation from RGB\n * @param {number} r [0, 255]\n * @param {number} g [0, 255]\n * @param {number} b [0, 255]\n * @param {number|undefined=} min - min number of [r, g, b]\n * @param {number|undefined=} max - max number of [r, g, b]\n * @param {number|undefined=} l - luminance in [0, 100] %\n * @return {number} [0, 100] %\n */\nconst getSaturation = (\n r : number,\n g : number,\n b : number,\n min : number | undefined = undefined,\n max : number | undefined = undefined,\n l : number | undefined = undefined) : number => {\n\n // find the minimum and maximum values of r, g, and b if they are not provided\n min = (min === undefined) ? Math.min(r, g, b) : min;\n max = (min === undefined) ? Math.max(r, g, b) : max;\n\n // if the min and max value are the same -> no saturation, as it's gray\n if(min === max) return 0;\n\n // calculate luminance if it's not provided\n l = (l === undefined) ? getLuminance(r, g, b) : l;\n\n // check the level of luminance\n const s = (l <= 50) ?\n // @ts-ignore\n ((max - min) / (max + min)) : // this formula is used when luminance <= 50%\n // @ts-ignore\n (max - min) / (2.0 - max - min); // this formula is used when luminance > 50%\n\n // return saturation in %\n return s * 100;\n};\n\nexport const rgbToHsl = (rgb: RGBColor, decimalPlaces = Infinity): HSLColor => {\n\n // convert rgb values to the range [0, 1]\n const r = rgb[0] / 255;\n const g = rgb[1] / 255;\n const b = rgb[2] / 255;\n\n // find the minimum and maximum values of r, g, and b\n const min = Math.min(r, g, b);\n const max = Math.max(r, g, b);\n\n // calculate the luminance value in %\n const l = getLuminance(r, g, b, min, max);\n\n // calculate the saturation in %\n const s = getSaturation(r, g, b, min, max, l);\n\n // calculate the hue in % (not in degrees!)\n const h = getHue(r, g, b, min, max);\n\n if(h > 360 || s > 100 || l > 100){\n return [0, 0, 100];\n }\n\n if(h < 0 || s < 0 || l < 0){\n return [0, 0, 0];\n }\n\n return [\n setDecimalPlaces(h, decimalPlaces),\n setDecimalPlaces(s, decimalPlaces),\n setDecimalPlaces(l, decimalPlaces),\n ];\n};\n\n/**\n * helper: HSL to RGB\n */\nconst hslToRgbHelper = (helper1 : number, helper2 : number, colorHelper : number) : number => {\n\n // all values need to be between 0 and 1\n // if you get a negative value you need to add 1 to it\n if(colorHelper < 0) colorHelper += 1;\n\n // if you get a value above 1 you need to subtract 1 from it.\n if(colorHelper > 1) colorHelper -= 1;\n\n if(colorHelper * 6 < 1) return helper2 + (helper1 - helper2) * 6 * colorHelper;\n\n if(colorHelper * 2 < 1) return helper1;\n\n if(colorHelper * 3 < 2){\n return helper2 + (helper1 - helper2) * (0.666 - colorHelper) * 6;\n }\n else{\n return helper2;\n }\n};\n\nexport const hslToRgb = (hsl: HSLColor, decimalPlaces = Infinity): RGBColor => {\n\n // convert all values to [0, 1] from %\n const h = hsl[0] / 100;\n const s = hsl[1] / 100;\n const l = hsl[2] / 100;\n\n // if there is no saturation -> it\u2019s grey\n if(s === 0){\n // convert the luminance from [0, 1] to [0, 255]\n const gray = l * 255;\n return [gray, gray, gray];\n }\n\n // check the level of luminance\n const helper1 = (l < 0.5) ?\n (l * (1.0 + s)) :\n (l + s - l * s);\n\n const helper2 = 2 * l - helper1;\n\n const rHelper = h + 0.333;\n const gHelper = h;\n const bHelper = h - 0.333;\n\n let r = hslToRgbHelper(helper1, helper2, rHelper);\n let g = hslToRgbHelper(helper1, helper2, gHelper);\n let b = hslToRgbHelper(helper1, helper2, bHelper);\n\n // convert rgb to [0, 255]\n r *= 255;\n g *= 255;\n b *= 255;\n\n if(r > 255 || g > 255 || b > 255){\n return [255, 255, 255];\n }\n\n if(r < 0 || g < 0 || b < 0){\n return [0, 0, 0];\n }\n\n return [\n setDecimalPlaces(r, decimalPlaces),\n setDecimalPlaces(g, decimalPlaces),\n setDecimalPlaces(b, decimalPlaces),\n ];\n};\n\n/**\n * HSL to hex\n * hslToHex(360, 100, 50) // [360, 100, 5] ==> \"#ff0000\" (red)\n */\nexport const hslToHex = (hsl: HSLColor) => {\n\n if(hsl[0] > 360 || hsl[1] > 100 || hsl[2] > 100){\n return '#ffffff';\n }\n\n if(hsl[0] < 0 || hsl[1] < 0 || hsl[2] < 0){\n return '#000000';\n }\n\n const h = hsl[0] / 360;\n const s = hsl[1] / 100;\n const l = hsl[2] / 100;\n\n let r, g, b;\n if (s === 0) {\n r = g = b = l; // achromatic\n } else {\n const hue2rgb = (p: number, q: number, t: number) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n const toHex = (x: number) => {\n const hex = Math.round(x * 255).toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n };\n\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n};\n\n// ----------------------- GET SHIFTED COLORS --------------------------------------\n\nexport const getShiftedHue = (color: HSLColor, shift = 180) : HSLColor => {\n let hue = color[0];\n hue += shift;\n\n if (hue > 360 || hue < 0) {\n hue = mod(hue, 360);\n }\n\n return [hue, color[1], color[2]];\n};\n\nexport const getShiftedLightness = (color: HSLColor, shift = 10) : HSLColor => {\n let lightness = color[2];\n lightness += shift;\n\n if (lightness > 100 || lightness < 0) {\n lightness = mod(lightness, 100);\n }\n\n return [color[0], color[1], lightness];\n};\n\nexport const getShiftedSaturation = (color: HSLColor, shift = 10) : HSLColor => {\n let saturation = color[1];\n saturation += shift;\n\n if (saturation > 100) {\n saturation -= 100;\n }\n\n if(saturation < 0){\n saturation += 100;\n }\n\n return [color[0], saturation, color[2]];\n};\n", "/**\n * guid like '932ade5e-c515-4807-ac01-73b20ab3fb66'\n */\nexport const guid = () => {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = Math.random() * 16 | 0;\n return (c == 'x' ? r : r & 0x3 | 0x8).toString(16);\n });\n};\n\n/**\n * id like 'df4unio1opulby2uqh4'\n */\nexport const newId = () => {\n return Math.random().toString(36).substring(2) + (new Date()).getTime().toString(36);\n};\n", "import { setDecimalPlaces } from './format';\n\n/**\n * get the side of a square inscribed in a circle\n */\nexport const getSquareInCircleSide = (radius: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(radius * 2 / Math.sqrt(2), decimalPlaces);\n};\n", "import { ICircle, IPolygon, IRect, Matrix2, Vector2 } from '../types';\nimport { mod } from './other';\nimport { v2GetNormal, v2DotProduct } from './linear-algebra/vector';\n\n/**\n * Rectangles collision detection.\n * Rectangles should not be rotated.\n * The algorithm works by ensuring there is no gap between any of the 4 sides of the rectangles.\n * Any gap means a collision does not exist.\n * Returns true if collision is detected.\n */\nexport const rectCollide = (rect1: IRect, rect2: IRect) : boolean => {\n return rect1.x <= rect2.x + rect2.w &&\n rect1.x + rect1.w >= rect2.x &&\n rect1.y <= rect2.y + rect2.h &&\n rect1.h + rect1.y >= rect2.y;\n};\n\n/**\n * Circles collision detection.\n * This algorithm works by taking the center points of the two circles\n * and ensuring the distance between the center points\n * are less than the two radii added together.\n * Returns true if collision is detected.\n */\nexport const circleCollide = (circle1: ICircle, circle2: ICircle) => {\n const dx = Math.abs(circle1.cx - circle2.cx);\n const dy = Math.abs(circle1.cy - circle2.cy);\n const distance = Math.sqrt(dx * dx + dy * dy);\n return distance <= circle1.r + circle2.r;\n};\n\n//-------------------- Separating Axis Theorem (SAT) Collision detection -------------------------\n\nconst getEdges = (poly: IPolygon) : Matrix2[] => {\n const edges: Matrix2[] = [];\n\n for(let i= 0; i {\n const edges: Matrix2[] = [];\n\n // collect polygon edges, and combine then into a single array\n edges.push(...getEdges(poly1));\n edges.push(...getEdges(poly2));\n\n // for each edge, find the normal vector and project both polygons onto it\n for (const edge of edges) {\n const normal = v2GetNormal(edge[0], edge[1]);\n const p1Proj = projectPolygon(poly1, normal);\n const p2Proj = projectPolygon(poly2, normal);\n\n // Check if the projections overlap\n const isOverlap = p1Proj.max >= p2Proj.min && p2Proj.max >= p1Proj.min;\n\n // Check if the projections overlap; if not, the polygons do not collide\n if (!isOverlap) return false;\n }\n\n // If all tests pass, the polygons overlap and collide\n return true;\n};\n\n/**\n * Project every polygon point onto the normal.\n * Then find min and max.\n */\nconst projectPolygon = (polygon: IPolygon, normal: Vector2): { min: number, max: number } => {\n let min = Infinity;\n let max = -Infinity;\n\n // Project each vertex of the polygon onto the axis\n for (const vertex of polygon) {\n const projection = v2DotProduct(vertex, normal);\n min = Math.min(min, projection);\n max = Math.max(max, projection);\n }\n\n return { min, max };\n};", "export interface IAnimationProps {\n duration?: number;\n callback: (result: IAnimationResult) => void;\n restartOnResize?: boolean;\n resizeCallback?: (_entries: ResizeObserverEntry[], _observer: ResizeObserver) => void;\n}\n\nexport interface IAnimationResult {\n start: () => void;\n stop: () => void;\n pause: () => void;\n resume: () => void;\n restart: () => void;\n isAnimating: () => boolean;\n getStartTime: () => number|undefined;\n getElapsedTime: () => number|undefined;\n getPercent: () => number|undefined;\n getResizeObserver: () => ResizeObserver|undefined;\n}\n\nexport const animate = (props: IAnimationProps) : IAnimationResult => {\n\n const _duration = props.duration !== undefined ? props.duration : Infinity;\n\n let startTime: number|undefined = undefined; // in milliseconds\n let animationId: number|undefined = undefined;\n\n // the time elapsed since the start of the animation (in milliseconds)\n let elapsed: number|undefined = undefined;\n let previousTimeStamp: number|undefined = undefined;\n\n let animating = false;\n let observer: ResizeObserver|undefined = undefined;\n\n // -------------------- COMMANDS ---------------------\n\n const stop = () => {\n startTime = undefined;\n elapsed = undefined;\n previousTimeStamp = undefined;\n animating = false;\n\n /*if(observer !== undefined){\n observer.disconnect();\n observer = undefined;\n }*/\n\n if(animationId === undefined) return;\n window.cancelAnimationFrame(animationId);\n };\n\n const restart = () => {\n stop();\n start();\n };\n\n const pause = () => {\n animating = false;\n };\n\n const resume = () => {\n animating = true;\n };\n\n /**\n * Animation Step.\n * @param {number} timeStamp in milliseconds\n */\n const step = (timeStamp: DOMHighResTimeStamp) => {\n\n if (startTime === undefined) {\n startTime = timeStamp;\n }\n\n // the time elapsed since the start of the animation (in milliseconds)\n elapsed = timeStamp - startTime;\n\n if (animating && previousTimeStamp !== timeStamp && typeof props.callback === 'function') {\n\n // do the rendering .............\n props.callback(getResult());\n }\n\n if(elapsed <= _duration){\n previousTimeStamp = timeStamp;\n animationId = window.requestAnimationFrame(step);\n }\n else{\n stop();\n }\n };\n\n const observerHandler = (_entries: ResizeObserverEntry[], _observer: ResizeObserver) => {\n restart();\n\n if(typeof props.resizeCallback === 'function'){\n props.resizeCallback(_entries, _observer);\n }\n };\n\n const start = () => {\n startTime = undefined;\n elapsed = undefined;\n previousTimeStamp = undefined;\n animating = true;\n\n if(props.restartOnResize && window.ResizeObserver && observer === undefined){\n observer = new ResizeObserver(observerHandler);\n observer.observe(document.body, { box: 'border-box' });\n }\n else{\n animationId = window.requestAnimationFrame(step);\n }\n };\n\n // --------------- GET INFO ----------------------\n\n /**\n * the time elapsed since the start of the animation (in milliseconds)\n */\n const getElapsedTime = () : number|undefined => {\n return elapsed;\n };\n\n const isAnimating = () => {\n return animating;\n };\n\n const getStartTime = () => {\n return startTime;\n };\n\n const getPercent = () => {\n if(_duration === Infinity || elapsed === undefined) return undefined;\n return elapsed * 100 / _duration;\n };\n\n const getResizeObserver = () => {\n return observer;\n };\n\n const getResult = () : IAnimationResult => {\n return {\n\n // commands --------------\n start,\n stop,\n pause,\n resume,\n restart,\n\n // information -------\n isAnimating,\n getElapsedTime,\n getStartTime,\n getPercent,\n getResizeObserver,\n };\n };\n\n return getResult();\n};\n", "import { setDecimalPlaces, Vector2 } from 'mz-math';\n\nexport interface ISvg {\n cx: number;\n cy: number;\n radius: number;\n size: number;\n thickness: number;\n border: number;\n startAngleDeg: number;\n endAngleDeg: number;\n}\n\nexport const getSvg = (\n circleRadius: number,\n circleThickness: number,\n circleBorder: number,\n maxPointerRadius: number,\n startAngleDeg: number,\n endAngleDeg: number\n) : ISvg => {\n\n const thickness = circleThickness + circleBorder * 2;\n\n const diff = Math.max(0, maxPointerRadius * 2 - thickness);\n const size = circleRadius * 2 + thickness + diff;\n\n const [ cx, cy ] = getSVGCenter(\n circleRadius,\n maxPointerRadius,\n circleThickness,\n circleBorder\n );\n\n return {\n cx,\n cy,\n radius: circleRadius,\n size,\n thickness: circleThickness,\n border: circleBorder,\n startAngleDeg,\n endAngleDeg\n } as ISvg;\n};\n\nconst getSVGCenter = (\n circleRadius: number,\n maxPointerRadius: number,\n circleThickness: number,\n circleBorder: number\n) : Vector2 => {\n\n const size = getSVGSize(\n circleRadius,\n maxPointerRadius,\n circleThickness,\n circleBorder\n );\n\n const val = setDecimalPlaces(size/2, 2);\n\n return [\n val,\n val,\n ];\n};\n\nconst getSVGSize = (\n circleRadius: number,\n maxPointerRadius: number,\n circleThickness: number,\n circleBorder: number\n) : number => {\n const thickness = circleThickness + circleBorder * 2;\n const diff = Math.max(0, maxPointerRadius * 2 - thickness);\n return circleRadius * 2 + thickness + diff;\n};", "// Data Defaults --------------------\nexport const DEFAULT_MIN = 0;\nexport const DEFAULT_MAX = 100;\nexport const DEFAULT_STEP = 1;\nexport const DEFAULT_ARROW_STEP = 1;\nexport const DEFAULT_ROUND = 0;\n\n// Path Defaults ---------------------\nexport const DEFAULT_PATH_START_ANGLE = 0;\nexport const DEFAULT_PATH_END_ANGLE = 360;\nexport const DEFAULT_PATH_RADIUS = 150;\nexport const DEFAULT_PATH_THICKNESS = 5;\nexport const DEFAULT_PATH_BG_COLOR = '#efefef';\nexport const DEFAULT_PATH_BORDER = 0;\nexport const DEFAULT_PATH_BORDER_COLOR = '#444444';\n\n// Pointer Defaults ------------------\nexport const DEFAULT_POINTER_RADIUS = 10;\nexport const DEFAULT_POINTER_BG_COLOR = '#163a86';\nexport const DEFAULT_POINTER_BG_COLOR_SELECTED = '#000';\nexport const DEFAULT_POINTER_BG_COLOR_DISABLED = '#a8a8a8';\nexport const DEFAULT_POINTER_BORDER = 0;\nexport const DEFAULT_POINTER_BORDER_COLOR = '#000';\n\n// Connection Defaults ------------------\nexport const DEFAULT_CONNECTION_BG_COLOR = '#5daed2';\nexport const DEFAULT_CONNECTION_BG_COLOR_DISABLED = '#97b0bb';\n\n// Text Defaults ------------------------\nexport const DEFAULT_TEXT_COLOR = '#000';\nexport const DEFAULT_TEXT_FONT_SIZE = 16;\n\n// Ticks Defaults -----------------------\nexport const DEFAULT_TICKS_WIDTH = 3;\nexport const DEFAULT_TICKS_HEIGHT = 20;\nexport const DEFAULT_TICKS_COLOR = '#efefef';\nexport const DEFAULT_TICKS_VALUES_COLOR = '#000';\nexport const DEFAULT_TICKS_VALUES_FONT_SIZE = 12;\nexport const DEFAULT_TICKS_GROUP_SIZE = 10;\nexport const DEFAULT_TICKS_VALUES_DISTANCE = 15;\n\n\n", "import { isNumber } from 'mz-math';\n\nexport const getNumber = (value: number|string|undefined|null, defaultValue: number) : number => {\n return isNumber(value) ? Number(value) : defaultValue;\n};\n\nexport const getString = (value: string|undefined|null, defaultValue: string) : string => {\n return value === undefined || value === null ? defaultValue : value;\n};\n\nexport const getBoolean = (value: boolean|undefined|null, defaultValue: boolean) : boolean => {\n return value === undefined || value === null ? defaultValue : value;\n};", "import { mod } from 'mz-math';\n\nexport interface ICircle {\n strokeDasharray: string;\n strokeOffset: number;\n}\n\nexport const isAngleInArc = (startAngleDeg: number, endAngleDeg: number, currentDegrees: number) : boolean => {\n\n if(startAngleDeg > endAngleDeg) {\n endAngleDeg += 360;\n }\n\n return currentDegrees >= startAngleDeg && currentDegrees <= endAngleDeg ||\n (currentDegrees + 360) >= startAngleDeg && (currentDegrees + 360) <= endAngleDeg;\n};\n\nexport const getAnglesDistance = (startAngle: number, endAngle: number) => {\n if(endAngle < startAngle) {\n endAngle += 360;\n }\n\n const diff = endAngle - startAngle;\n const diffMod = mod(diff, 360);\n\n return diffMod === 0 && diff > 0 ? 360 : diffMod;\n};\n\nexport const getCircle = (\n startAngleDeg: number,\n endAngleDeg: number,\n radius: number,\n) : ICircle => {\n\n if(startAngleDeg > endAngleDeg) {\n endAngleDeg += 360;\n }\n\n const circumference = 2 * Math.PI *radius;\n\n if(startAngleDeg > endAngleDeg) {\n endAngleDeg += 360;\n }\n\n const angleDiff = endAngleDeg - startAngleDeg;\n const strokeOffset = -(startAngleDeg / 360) * circumference;\n const strokeDasharray = (angleDiff / 360) * circumference;\n const complement = circumference - strokeDasharray;\n\n return {\n strokeDasharray: [ strokeDasharray, complement ].join(' '),\n strokeOffset,\n } as ICircle;\n};", "import {\n Vector2,\n newId,\n convertRange,\n mod,\n setDecimalPlaces,\n v2Sub,\n radiansToDegrees,\n degreesToRadians, circleMovement, v2Distance\n} from 'mz-math';\nimport { ISettings } from './settings-provider';\nimport {\n DEFAULT_PATH_END_ANGLE,\n DEFAULT_PATH_START_ANGLE,\n DEFAULT_POINTER_BG_COLOR, DEFAULT_POINTER_BG_COLOR_DISABLED, DEFAULT_POINTER_BG_COLOR_SELECTED,\n DEFAULT_POINTER_BORDER,\n DEFAULT_POINTER_BORDER_COLOR,\n DEFAULT_POINTER_RADIUS,\n} from './defaults-provider';\nimport { getBoolean, getNumber, getString } from './common-provider';\nimport { IData } from './data-provider';\nimport { getAnglesDistance } from './circle-provider';\n\nexport interface IPointer {\n id: string;\n index: number;\n radius: number;\n angleDeg: number;\n bgColor: string;\n bgColorSelected: string;\n bgColorDisabled: string;\n border: number;\n borderColor: string;\n disabled: boolean;\n ariaLabel?: string;\n}\n\nexport interface IPointers {\n pointers: IPointer[];\n maxRadius: number;\n}\n\nexport const getAngleByMouse = (\n $svg: SVGSVGElement,\n clientX: number,\n clientY: number,\n cx: number,\n cy: number,\n rx: number,\n ry: number\n) => {\n const { left, top } = $svg.getBoundingClientRect();\n\n const relativeMouse: Vector2 = [\n clientX - left,\n clientY - top,\n ];\n\n const vector = v2Sub(relativeMouse, [ cx, cy ]);\n\n let angleRad = Math.atan2(vector[1] / ry, vector[0] / rx);\n if(angleRad < 0){\n angleRad += 2 * Math.PI;\n }\n\n return radiansToDegrees(angleRad);\n};\n\nexport const angle2value = (data: IData, angle: number, pathStartAngle: number, pathEndAngle: number) : string | number => {\n\n if(pathEndAngle < pathStartAngle) {\n pathEndAngle += 360;\n }\n\n if(angle < pathStartAngle){\n angle += 360;\n }\n\n let value: string|number = convertRange(angle, pathStartAngle, pathEndAngle, data.min, data.max);\n\n if(data.data.length > 0) {\n const index = Math.round(value);\n value = data.data[index];\n }\n else{\n value = setDecimalPlaces(value, data.round);\n }\n\n return value;\n};\n\nconst value2angle = (data: IData, value: string | number, pathStartAngle: number, pathEndAngle: number) => {\n let _value: number;\n\n if(pathEndAngle < pathStartAngle) {\n pathEndAngle += 360;\n }\n\n if(data.data.length > 0) {\n const valueIndex = data.data.findIndex(item => item === value);\n _value = valueIndex === -1 ? 0 : valueIndex;\n }\n else{\n _value = typeof value !== 'number' ? data.min : value;\n }\n\n return mod(convertRange(_value, data.min, data.max, pathStartAngle, pathEndAngle), 360);\n};\n\nconst initPointers = (\n settings: ISettings,\n data: IData\n) : IPointer[] => {\n\n if(!settings || !settings.pointers || settings.pointers.length < 0 || !data) {\n return [{\n id: newId(),\n index: 0,\n radius: getNumber(settings.pointerRadius, DEFAULT_POINTER_RADIUS),\n angleDeg: mod(getNumber(settings.pathStartAngle, DEFAULT_PATH_START_ANGLE), 360),\n bgColor: getString(settings.pointerBgColor, DEFAULT_POINTER_BG_COLOR),\n bgColorSelected: getString(settings.pointerBgColorSelected, DEFAULT_POINTER_BG_COLOR_SELECTED),\n bgColorDisabled: getString(settings.pointerBgColorDisabled, DEFAULT_POINTER_BG_COLOR_DISABLED),\n border: getNumber(settings.pointerBorder, DEFAULT_POINTER_BORDER),\n borderColor: getString(settings.pointerBorderColor, DEFAULT_POINTER_BORDER_COLOR),\n disabled: !!settings.disabled,\n }]\n }\n\n const pointers: IPointer[] = [];\n\n for(let i=0; i {\n\n const pointers = initPointers(settings, data);\n\n return {\n pointers,\n maxRadius: getMaxRadius(pointers),\n }\n};\n\nconst getMaxRadius = (pointers: IPointer[]) : number => {\n if(pointers.length <= 0) return 0;\n\n let max = -Infinity;\n\n for(const pointer of pointers){\n max = Math.max(max, Math.max(0, pointer.radius + pointer.border/2));\n }\n\n return max;\n};\n\nexport const getClosestPointer = (\n pointers: IPointer[],\n currentPlaceDegrees: number,\n cx: number,\n cy: number,\n pathRadius: number\n) => {\n if(!pointers || pointers.length <= 0) return null;\n\n if(pointers.length === 1) return pointers[0];\n\n const angleRad = convertRange(degreesToRadians(currentPlaceDegrees), 0, Math.PI * 2, 0, Math.PI); // [0, Math.PI*2] ---> [0, Math.PI]\n const currentPointOnArc = circleMovement([ cx, cy ], angleRad, pathRadius);\n\n let min: number|undefined = undefined;\n let closestPointer: IPointer = null;\n\n const enabledPointers = pointers.filter(p => !p.disabled);\n\n for(const pointer of enabledPointers) {\n const pointerAngleRad = convertRange(degreesToRadians(pointer.angleDeg), 0, Math.PI * 2, 0, Math.PI);\n const pointOnArc = circleMovement([ cx, cy ], pointerAngleRad, pathRadius);\n const distance = v2Distance(currentPointOnArc, pointOnArc);\n\n if(min === undefined || distance < min) {\n min = distance;\n closestPointer = pointer;\n }\n }\n\n return { ...closestPointer };\n};\n\nexport const getClosestEdge = (\n startAngleDegrees: number,\n endAngleDegrees: number,\n currentPlaceDegrees: number,\n cx: number,\n cy: number,\n pathRadius: number\n) => {\n\n const angleRad = convertRange(degreesToRadians(currentPlaceDegrees), 0, Math.PI * 2, 0, Math.PI); // [0, Math.PI*2] ---> [0, Math.PI]\n const currentPointOnArc = circleMovement([ cx, cy ], angleRad, pathRadius);\n\n const startAngleRad = convertRange(degreesToRadians(startAngleDegrees), 0, Math.PI * 2, 0, Math.PI); // [0, Math.PI*2] ---> [0, Math.PI]\n const startPointOnArc = circleMovement([ cx, cy ], startAngleRad, pathRadius);\n\n const endAngleRad = convertRange(degreesToRadians(endAngleDegrees), 0, Math.PI * 2, 0, Math.PI); // [0, Math.PI*2] ---> [0, Math.PI]\n const endPointOnArc = circleMovement([ cx, cy ], endAngleRad, pathRadius);\n\n const distance1 = v2Distance(currentPointOnArc, startPointOnArc);\n const distance2 = v2Distance(currentPointOnArc, endPointOnArc);\n\n return distance1 <= distance2 ? startAngleDegrees : endAngleDegrees;\n};\n\nexport const getMinMaxDistancePointers = (pointers: IPointer[], pathStartAngle: number) : [IPointer, IPointer] | null => {\n if(!pointers || pointers.length <= 0) return null;\n\n let minDistance = undefined;\n let maxDistance = undefined;\n let minPointer = null;\n let maxPointer = null;\n\n for(const pointer of pointers) {\n\n const distance = getAnglesDistance(pathStartAngle, pointer.angleDeg);\n\n if(minDistance === undefined || distance < minDistance) {\n minPointer = pointer;\n minDistance = distance;\n }\n\n if(maxDistance === undefined || distance > maxDistance) {\n maxPointer = pointer;\n maxDistance = distance;\n }\n }\n\n if(minPointer === null || maxPointer === null) return null;\n\n return [\n minPointer,\n maxPointer\n ];\n};\n\nexport const roundToStep = (num: number, step: number) : number => {\n return step === 0 ? 0 : Math.round(num / step) * step;\n};\n", "import { angle2value, getAngleByMouse, getClosestEdge, IPointer } from '../domain/pointers-provider';\nimport {\n useEffect,\n useState,\n MouseEvent as ReactMouseEvent,\n TouchEvent as ReactTouchEvent,\n KeyboardEvent,\n useRef, useCallback, MutableRefObject\n} from 'react';\nimport { circleMovement, convertRange, degreesToRadians, Vector2 } from 'mz-math';\nimport { ISettings } from '../domain/settings-provider';\nimport { ISvg } from '../domain/svg-provider';\nimport { isAngleInArc } from '../domain/circle-provider';\nimport { IData } from '../domain/data-provider';\nimport { outlineNoneStyle } from '../domain/style-provider';\n\nexport interface IPointerProps {\n settings: ISettings;\n pointer: IPointer;\n svg: ISvg;\n $svg: SVGSVGElement;\n setPointer: (pointer: IPointer, newAngleDeg: number) => void;\n data: IData;\n}\n\nconst getPointerFill = (\n pointer: IPointer,\n pointerRef: MutableRefObject,\n bgColor: string,\n bgColorSelected: string,\n bgColorDisabled: string\n) => {\n if(pointer.disabled) return bgColorDisabled;\n\n if(document.activeElement === pointerRef.current) {\n return bgColorSelected || bgColor;\n }\n\n return bgColor;\n};\n\nconst Pointer = (props: IPointerProps) => {\n\n const pointerRef = useRef(null);\n\n const {\n pointer, svg, $svg,\n setPointer, data, settings,\n } = props;\n\n const {\n radius,\n angleDeg,\n bgColor,\n bgColorSelected,\n bgColorDisabled,\n border,\n borderColor,\n } = props.pointer;\n\n const { cx, cy } = svg;\n\n const [ center, setCenter ] = useState(null);\n const [ value, setValue ] = useState('');\n\n useEffect(() => {\n const value = angle2value(\n data,\n pointer.angleDeg,\n svg.startAngleDeg,\n svg.endAngleDeg\n );\n setValue(value === undefined ? '' : value.toString())\n }, [\n data,\n pointer.angleDeg,\n svg.startAngleDeg,\n svg.endAngleDeg,\n ]);\n\n useEffect(() => {\n const angleRad = convertRange(degreesToRadians(angleDeg), 0, Math.PI * 2, 0, Math.PI); // [0, Math.PI*2] ---> [0, Math.PI]\n const pointerCenter = circleMovement([cx, cy], angleRad, svg.radius);\n setCenter(pointerCenter);\n }, [\n angleDeg,\n cx,\n cy,\n svg.radius,\n ]);\n\n const onValueChange = useCallback((evt: MouseEvent | ReactMouseEvent | TouchEvent | ReactTouchEvent) => {\n if(!$svg || settings.disabled || pointer.disabled) return;\n\n const mouseX = evt.type.indexOf('mouse') !== -1 ? (evt as MouseEvent).clientX : (evt as TouchEvent).touches[0].clientX;\n const mouseY = evt.type.indexOf('mouse') !== -1 ? (evt as MouseEvent).clientY : (evt as TouchEvent).touches[0].clientY;\n\n const degrees = getAngleByMouse(\n $svg,\n mouseX,\n mouseY,\n svg.cx,\n svg.cy,\n svg.radius,\n svg.radius\n );\n\n let newAngleDeg;\n\n if(!isAngleInArc(\n svg.startAngleDeg,\n svg.endAngleDeg,\n degrees\n )){\n newAngleDeg = getClosestEdge(\n svg.startAngleDeg,\n svg.endAngleDeg,\n pointer.angleDeg,\n svg.cx,\n svg.cy,\n svg.radius\n );\n }\n else{\n newAngleDeg = degrees;\n }\n\n setPointer(pointer, newAngleDeg);\n }, [\n $svg,\n pointer,\n setPointer,\n svg.cx,\n svg.cy,\n svg.endAngleDeg,\n svg.radius,\n svg.startAngleDeg,\n settings.disabled,\n ]);\n\n const onMouseUp = () => {\n window.removeEventListener('mousemove', onValueChange);\n window.removeEventListener('mouseup', onValueChange);\n };\n\n const onMouseDown = (evt: ReactMouseEvent) => {\n if(settings.disabled || pointer.disabled) return;\n\n onValueChange(evt);\n\n window.addEventListener('mousemove', onValueChange);\n window.addEventListener('mouseup', onMouseUp);\n };\n\n const onKeyDown = (evt: KeyboardEvent) => {\n\n if(settings.disabled || pointer.disabled || settings.keyboardDisabled) return;\n\n switch (evt.key) {\n case 'ArrowLeft': {\n evt.preventDefault();\n setPointer(pointer, pointer.angleDeg + data.stepAngleDeg);\n break;\n }\n\n case 'ArrowRight': {\n evt.preventDefault();\n setPointer(pointer, pointer.angleDeg - data.stepAngleDeg);\n break;\n }\n\n case 'ArrowUp': {\n evt.preventDefault();\n setPointer(pointer, pointer.angleDeg - data.stepAngleDeg);\n break;\n }\n\n case 'ArrowDown': {\n evt.preventDefault();\n setPointer(pointer, pointer.angleDeg + data.stepAngleDeg);\n break;\n }\n }\n };\n\n useEffect(() => {\n const $current = pointerRef.current;\n\n const onTouch = (evt: TouchEvent | ReactTouchEvent) => {\n if(settings.disabled || pointer.disabled) return;\n\n evt.preventDefault();\n evt.stopPropagation();\n onValueChange(evt);\n };\n\n const onWheel = (evt: WheelEvent) => {\n\n if(settings.disabled || pointer.disabled || settings.mousewheelDisabled || document.activeElement !== $current) return;\n\n evt.stopPropagation();\n evt.preventDefault();\n\n const scrollTop = evt.deltaY < 0;\n\n let newAngleDeg;\n if(scrollTop) {\n newAngleDeg = pointer.angleDeg + data.stepAngleDeg;\n }\n else{\n newAngleDeg = pointer.angleDeg - data.stepAngleDeg;\n }\n\n setPointer(pointer, newAngleDeg);\n };\n\n $current?.addEventListener('touchmove', onTouch, {\n passive: false,\n });\n\n document.addEventListener('wheel', onWheel, {\n passive: false,\n });\n\n return () => {\n $current?.removeEventListener('touchmove', onTouch);\n document.removeEventListener('wheel', onWheel);\n };\n }, [\n center,\n onValueChange,\n data.stepAngleDeg,\n pointer,\n setPointer,\n settings.disabled,\n settings.mousewheelDisabled,\n ]);\n\n return (\n <>\n {\n center &&\n \n\n {\n !settings.pointerSVG &&\n \n }\n\n {\n settings.pointerSVG &&\n \n { settings.pointerSVG }\n \n }\n \n }\n \n )\n};\n\nexport default Pointer;", "export const outlineNoneStyle = {\n outline: 'none',\n};", "import { IPointer, IPointers } from '../domain/pointers-provider';\nimport Pointer from './Pointer';\nimport { ISettings } from '../domain/settings-provider';\nimport { ISvg } from '../domain/svg-provider';\nimport { IData } from '../domain/data-provider';\n\nexport interface IPointersProps {\n pointers: IPointers;\n settings: ISettings;\n svg: ISvg;\n $svg: SVGSVGElement;\n setPointer: (pointer: IPointer, newAngleDeg: number) => void;\n data: IData;\n}\n\nconst Pointers = (props: IPointersProps) => {\n\n const { pointers, settings, svg, $svg, setPointer, data } = props;\n\n return (\n <>\n {\n pointers.pointers.map(pointer => {\n\n return (\n \n )\n })\n }\n \n )\n};\n\nexport default Pointers;", "import { ISettings } from './settings-provider';\nimport { getNumber } from './common-provider';\nimport {\n DEFAULT_ARROW_STEP,\n DEFAULT_MAX,\n DEFAULT_MIN,\n DEFAULT_PATH_END_ANGLE,\n DEFAULT_PATH_START_ANGLE,\n DEFAULT_ROUND,\n DEFAULT_STEP\n} from './defaults-provider';\nimport { mod } from 'mz-math';\n\nexport interface IData {\n min: number;\n max: number;\n stepAngleDeg: number;\n arrowStepAngleDeg: number;\n round: number;\n data: (string | number)[];\n isClosedShape: boolean;\n}\n\nexport const getData = (setting: ISettings) : IData => {\n\n let min = getNumber(setting.min, DEFAULT_MIN);\n let max = getNumber(setting.max, DEFAULT_MAX);\n const step = getNumber(setting.step, DEFAULT_STEP);\n const arrowStep = getNumber(setting.arrowStep, DEFAULT_ARROW_STEP);\n const round = getNumber(setting.round, DEFAULT_ROUND);\n const data = setting.data || [];\n\n if(data.length > 0) {\n const minIndex = data.findIndex(item => item === min);\n const maxIndex = data.findIndex(item => item === max);\n\n min = minIndex === -1 ? 0 : minIndex;\n max = maxIndex === -1 ? data.length : maxIndex;\n }\n else{\n if(min > max) {\n min = max + DEFAULT_MAX;\n }\n }\n\n const pathStartAngle = getNumber(setting.pathStartAngle, DEFAULT_PATH_START_ANGLE);\n const pathEndAngle = getNumber(setting.pathEndAngle, DEFAULT_PATH_END_ANGLE);\n const isClosedShape = mod(pathStartAngle, 360) === mod(pathEndAngle, 360);\n\n const stepAngleDeg = step * 360 / (max - min);\n const arrowStepAngleDeg = arrowStep * 360 / (max - min);\n\n return {\n min,\n max,\n round,\n data,\n stepAngleDeg,\n arrowStepAngleDeg,\n isClosedShape,\n }\n};", "import { ISettings } from '../domain/settings-provider';\nimport { getBoolean, getString } from '../domain/common-provider';\nimport { DEFAULT_CONNECTION_BG_COLOR, DEFAULT_CONNECTION_BG_COLOR_DISABLED } from '../domain/defaults-provider';\nimport {\n getAngleByMouse,\n getClosestPointer,\n getMinMaxDistancePointers,\n IPointer,\n IPointers\n} from '../domain/pointers-provider';\nimport {\n MouseEvent as ReactMouseEvent,\n useCallback,\n useEffect, useRef,\n useState\n} from 'react';\nimport { getConnection, IConnection } from '../domain/connection-provider';\nimport { ISvg } from '../domain/svg-provider';\nimport { IData } from '../domain/data-provider';\nimport { mod } from 'mz-math';\n\ninterface IConnectionProps {\n settings: ISettings;\n pointers: IPointers;\n svg: ISvg;\n $svg: SVGSVGElement;\n data: IData;\n setPointer: (pointer: IPointer, newAngleDeg: number) => void;\n}\n\nconst Connection = (props: IConnectionProps) => {\n\n const { settings, pointers, $svg, svg, data, setPointer } = props;\n\n const [ connection, setConnection ] = useState(null);\n\n const rangeDraggingLastAngle = useRef();\n\n useEffect(() => {\n setConnection(getConnection(\n pointers,\n svg.radius,\n svg.cx,\n svg.cy,\n svg.startAngleDeg,\n svg.endAngleDeg\n ));\n }, [\n pointers,\n svg.radius,\n svg.cx,\n svg.cy,\n svg.startAngleDeg,\n svg.endAngleDeg\n ]);\n\n const onClick = (evt: ReactMouseEvent) => {\n if(!$svg || settings.disabled) return;\n\n const degrees = getAngleByMouse(\n $svg,\n evt.clientX,\n evt.clientY,\n svg.cx,\n svg.cy,\n svg.radius,\n svg.radius\n );\n\n const closestPointer = getClosestPointer(\n pointers.pointers,\n degrees,\n svg.cx,\n svg.cy,\n svg.radius\n );\n\n if(!closestPointer) return;\n\n setPointer(closestPointer, degrees);\n };\n\n const onValueChange = useCallback((evt: MouseEvent | ReactMouseEvent) => {\n if(!$svg || settings.disabled || !settings.rangeDragging) return;\n\n const minMaxResult = getMinMaxDistancePointers(pointers.pointers, svg.startAngleDeg);\n if(!minMaxResult) return;\n\n const [ minPointer, maxPointer ] = minMaxResult;\n\n const mouseDegrees = getAngleByMouse(\n $svg,\n evt.clientX,\n evt.clientY,\n svg.cx,\n svg.cy,\n svg.radius,\n svg.radius\n );\n\n if(rangeDraggingLastAngle.current === undefined) {\n rangeDraggingLastAngle.current = mouseDegrees;\n return;\n }\n\n const diff = (mouseDegrees - rangeDraggingLastAngle.current);\n if(diff === 0 || Math.abs(diff) < data.stepAngleDeg) return;\n\n setPointer(minPointer, mod(minPointer.angleDeg + diff, 360));\n setPointer(maxPointer, mod(maxPointer.angleDeg + diff, 360));\n\n rangeDraggingLastAngle.current = mouseDegrees;\n }, [\n $svg,\n svg.cx,\n svg.cy,\n svg.radius,\n data.stepAngleDeg,\n pointers.pointers,\n setPointer,\n settings.disabled,\n settings.rangeDragging,\n svg.startAngleDeg,\n ]);\n\n const onMouseUp = () => {\n window.removeEventListener('mousemove', onValueChange);\n window.removeEventListener('mouseup', onValueChange);\n\n rangeDraggingLastAngle.current = undefined;\n };\n\n const onMouseDown = (evt: ReactMouseEvent) => {\n if(!settings.rangeDragging || settings.disabled || pointers.pointers.length <= 1) return;\n\n onValueChange(evt);\n\n window.addEventListener('mousemove', onValueChange);\n window.addEventListener('mouseup', onMouseUp);\n };\n\n return (\n <>\n {\n !getBoolean(settings.hideConnection, false) && connection &&\n \n }\n \n )\n};\n\nexport default Connection;", "import { getMinMaxDistancePointers, IPointers } from './pointers-provider';\nimport { getAnglesDistance } from './circle-provider';\n\nexport interface IConnection {\n radius: number;\n cx: number;\n cy: number;\n\n // calculated properties ---------\n startAngleDeg: number;\n endAngleDeg: number;\n strokeDasharray: number[];\n strokeOffset: number;\n}\n\nexport const getConnection = (\n pointers: IPointers,\n radius: number,\n cx: number,\n cy: number,\n pathStartAngle: number,\n pathEndAngle: number,\n) : IConnection => {\n\n if(!pointers.pointers || pointers.pointers.length <= 0) return null;\n\n const result : IConnection = {\n radius,\n cx,\n cy,\n\n // calculated properties ---------\n startAngleDeg: pathStartAngle,\n endAngleDeg: pathStartAngle,\n strokeDasharray: [0, 0],\n strokeOffset: 0,\n };\n\n // Define start/end angles.\n if(pointers.pointers.length === 1) {\n result.startAngleDeg = pathStartAngle;\n result.endAngleDeg = pointers.pointers[0].angleDeg;\n }\n else{\n const minMaxResult = getMinMaxDistancePointers(pointers.pointers, pathStartAngle);\n if(!minMaxResult) return null;\n\n const [ minPointer, maxPointer ] = minMaxResult;\n\n result.startAngleDeg = minPointer.angleDeg;\n result.endAngleDeg = maxPointer.angleDeg;\n }\n\n const pathAnglesDistance = getAnglesDistance(pathStartAngle, pathEndAngle);\n\n if(result.startAngleDeg > result.endAngleDeg) {\n result.endAngleDeg += 360;\n }\n\n let angleDistance = getAnglesDistance(result.startAngleDeg, result.endAngleDeg);\n\n const shouldSwitch = angleDistance > pathAnglesDistance;\n\n if(shouldSwitch) {\n angleDistance = 360 - angleDistance;\n [result.startAngleDeg, result.endAngleDeg] = [result.endAngleDeg, result.startAngleDeg];\n }\n\n const circumference = 2 * Math.PI * radius;\n const strokeOffset = -(result.startAngleDeg / 360) * circumference;\n const strokeDasharray = (angleDistance / 360) * circumference;\n const complement = circumference - strokeDasharray;\n\n result.strokeDasharray = [ strokeDasharray, complement ];\n result.strokeOffset = strokeOffset;\n\n return result;\n};", "import { ISettings } from '../domain/settings-provider';\nimport { angle2value, IPointers } from '../domain/pointers-provider';\nimport { getBoolean, getNumber, getString } from '../domain/common-provider';\nimport {\n DEFAULT_TEXT_COLOR,\n DEFAULT_TEXT_FONT_SIZE\n} from '../domain/defaults-provider';\nimport { useEffect, useState } from 'react';\nimport { ISvg } from '../domain/svg-provider';\nimport { IData } from '../domain/data-provider';\n\ninterface ITextProps {\n settings: ISettings;\n pointers: IPointers;\n svg: ISvg;\n data: IData;\n}\n\nconst Text = (props: ITextProps) => {\n\n const { settings, pointers, svg, data } = props;\n\n const { cx, cy } = svg;\n const [ value, setValue ] = useState('');\n\n useEffect(() => {\n\n const values = pointers.pointers.map(pointer => angle2value(\n data,\n pointer.angleDeg,\n svg.startAngleDeg,\n svg.endAngleDeg\n ));\n\n values.sort((value1, value2) => {\n return value1.toString().localeCompare(\n value2.toString(),\n 'en',\n { numeric: true }\n );\n });\n\n const texts = values.map(value => `${ settings.textPrefix || '' }${ value }${ settings.textSuffix || '' }`);\n setValue(texts.join(' '));\n\n }, [\n data,\n pointers.pointers,\n svg.startAngleDeg,\n svg.endAngleDeg,\n settings.textPrefix,\n settings.textSuffix,\n ]);\n\n const hideText = getBoolean(settings.hideText, false);\n\n return (\n <>\n {\n !hideText &&\n \n\n { value }\n\n \n }\n \n )\n};\n\nexport default Text;", "import { useEffect, useState, Fragment } from 'react';\nimport { getTicks, getTicksSettings, ITick, ITicks } from '../domain/ticks-provider';\nimport { ISettings } from '../domain/settings-provider';\nimport { ISvg } from '../domain/svg-provider';\nimport { IData } from '../domain/data-provider';\n\ninterface ITicksProps {\n settings: ISettings;\n svg: ISvg;\n data: IData;\n}\n\nconst Ticks = (props: ITicksProps) => {\n\n const { settings, svg, data } = props;\n\n const [ ticksSettings, setTicksSettings ] = useState(null);\n const [ ticks, setTicks ] = useState([]);\n\n useEffect(() => {\n setTicksSettings(getTicksSettings(settings, data));\n }, [\n settings,\n data,\n ]);\n\n useEffect(() => {\n if(!ticksSettings) return;\n\n let endAngleDeg = svg.endAngleDeg;\n if(endAngleDeg < svg.startAngleDeg) {\n endAngleDeg += 360;\n }\n\n setTicks(getTicks(\n ticksSettings,\n ticksSettings.ticksCount,\n svg.startAngleDeg,\n endAngleDeg,\n svg,\n data\n ));\n }, [\n data,\n svg,\n ticksSettings,\n ]);\n\n return (\n <>\n {\n ticksSettings && !ticksSettings.disableTicks &&\n \n {\n ticks.map((tick, i) => {\n const { x, y, x1, y1, textX, textY, showText } = tick;\n\n return (\n \n \n\n {\n showText &&\n \n { tick.tickValue }\n \n }\n \n );\n })\n }\n \n }\n \n )\n};\n\nexport default Ticks;", "import {\n circleMovement,\n convertRange,\n degreesToRadians,\n setDecimalPlaces,\n v2MulScalar,\n v2Normalize\n} from 'mz-math';\nimport { ISvg } from './svg-provider';\nimport { IData } from './data-provider';\nimport { ISettings } from './settings-provider';\nimport { getBoolean, getNumber, getString } from './common-provider';\nimport {\n DEFAULT_TICKS_COLOR, DEFAULT_TICKS_GROUP_SIZE,\n DEFAULT_TICKS_HEIGHT, DEFAULT_TICKS_VALUES_COLOR,\n DEFAULT_TICKS_VALUES_DISTANCE, DEFAULT_TICKS_VALUES_FONT_SIZE,\n DEFAULT_TICKS_WIDTH\n} from './defaults-provider';\n\nexport interface ITicks {\n ticksCount: number;\n disableTicks: boolean;\n ticksWidth: number;\n ticksHeight: number;\n longerTicksHeight: number;\n ticksDistanceToPanel: number;\n tickValuesDistance: number;\n ticksColor: string;\n tickValuesColor: string;\n tickValuesFontSize: number;\n ticksGroupSize: number;\n longerTickValuesOnly: boolean;\n showTickValues: boolean;\n}\n\nexport interface ITick {\n x: number;\n y: number;\n x1: number;\n y1: number;\n textX: number;\n textY: number;\n isLonger: boolean;\n showText: boolean;\n tickValue?: string;\n}\n\nexport const getTicksSettings = (settings: ISettings, data: IData) : ITicks => {\n\n let ticksCount = getNumber(settings.ticsCount, 0);\n if(!ticksCount) {\n if(data.data && data.data.length > 0) {\n ticksCount = data.data.length;\n }\n else{\n ticksCount = data.max;\n }\n }\n\n const ticksHeight = getNumber(settings.ticksHeight, DEFAULT_TICKS_HEIGHT);\n\n return {\n ticksCount,\n disableTicks: getBoolean(settings.disableTicks, false),\n ticksWidth: getNumber(settings.ticksWidth, DEFAULT_TICKS_WIDTH),\n ticksHeight,\n longerTicksHeight: getNumber(settings.longerTicksHeight, ticksHeight * 2),\n ticksDistanceToPanel: getNumber(settings.ticksDistanceToPanel, 0),\n tickValuesDistance: getNumber(settings.tickValuesDistance, DEFAULT_TICKS_VALUES_DISTANCE),\n ticksColor: getString(settings.ticksColor, DEFAULT_TICKS_COLOR),\n tickValuesColor: getString(settings.tickValuesColor, DEFAULT_TICKS_VALUES_COLOR),\n tickValuesFontSize: getNumber(settings.tickValuesFontSize, DEFAULT_TICKS_VALUES_FONT_SIZE),\n ticksGroupSize: getNumber(settings.ticksGroupSize, DEFAULT_TICKS_GROUP_SIZE),\n longerTickValuesOnly: getBoolean(settings.longerTickValuesOnly, true),\n showTickValues: getBoolean(settings.showTickValues, true),\n };\n};\n\nexport const getTicks = (\n ticksSettings: ITicks,\n ticsCount: number,\n pathStartAngle: number,\n pathEndAngle: number,\n svg: ISvg,\n data: IData\n) : ITick[] => {\n\n const ticks: ITick[] = [];\n\n const deltaAngle = Math.abs(pathEndAngle - pathStartAngle);\n const oneTickAngleSize = ticsCount === 0 ? 0 : deltaAngle / ticsCount;\n\n let count = ticsCount;\n if(!data.isClosedShape) {\n count++;\n }\n\n for(let i=0; i [0, Math.PI]\n\n let [x, y] = circleMovement([svg.cx, svg.cy], angleRad, svg.radius);\n\n const isLonger = ticksSettings.ticksGroupSize !== undefined && (i % ticksSettings.ticksGroupSize === 0 );\n\n let desiredDistance = ticksSettings.ticksHeight;\n\n if(isLonger) {\n desiredDistance = ticksSettings.longerTicksHeight;\n }\n\n const normalizedDirectionVector = v2Normalize([svg.cx - x, svg.cy - y]);\n const tickEndVector = v2MulScalar(normalizedDirectionVector, desiredDistance);\n\n const tickStartVector = v2MulScalar(normalizedDirectionVector, ticksSettings.ticksDistanceToPanel);\n x += tickStartVector[0];\n y += tickStartVector[1];\n\n const x1 = x + tickEndVector[0];\n const y1 = y + tickEndVector[1];\n\n // ------- Define tick value. ---------------------\n let tickValue: string|undefined = undefined;\n if(ticksSettings.showTickValues && (!ticksSettings.longerTickValuesOnly || ticksSettings.longerTickValuesOnly && (isLonger || ticksSettings.ticksGroupSize === undefined))) {\n\n let value: string|number = convertRange(i, 0, ticsCount, data.min, data.max);\n\n if(data.data.length > 0) {\n const index = Math.round(value);\n value = data.data[index];\n }\n else{\n value = setDecimalPlaces(value, data.round);\n }\n\n tickValue = (value ?? '').toString();\n }\n\n let textX = 0;\n let textY = 0;\n const showText = tickValue !== undefined;\n\n if(showText) {\n const _tickValuesDistance = getNumber(desiredDistance + ticksSettings.tickValuesDistance, desiredDistance * 1.5);\n const tickTextVector = v2MulScalar(normalizedDirectionVector, _tickValuesDistance);\n textX = x + tickTextVector[0];\n textY = y + tickTextVector[1];\n }\n\n ticks.push({\n x,\n y,\n x1,\n y1,\n textX,\n textY,\n isLonger,\n tickValue,\n showText,\n });\n }\n\n return ticks;\n};", "import { useEffect, useState, MouseEvent } from 'react';\nimport { getCircle, ICircle } from '../domain/circle-provider';\nimport { getString } from '../domain/common-provider';\nimport { ISettings } from '../domain/settings-provider';\nimport {\n DEFAULT_PATH_BG_COLOR,\n DEFAULT_PATH_BORDER_COLOR,\n} from '../domain/defaults-provider';\nimport { ISvg } from '../domain/svg-provider';\nimport { getAngleByMouse, getClosestPointer, IPointer, IPointers } from '../domain/pointers-provider';\n\ninterface ICircleProps {\n settings: ISettings;\n pointers: IPointers;\n svg: ISvg;\n $svg: SVGSVGElement;\n setPointer: (pointer: IPointer, newAngleDeg: number) => void;\n}\n\nconst Circle = (props: ICircleProps) => {\n\n const { settings, pointers, $svg, svg, setPointer } = props;\n const [ circle, setCircle ] = useState({\n strokeDasharray: '0 1000000',\n strokeOffset: 0,\n });\n\n useEffect(() => {\n setCircle(getCircle(\n svg.startAngleDeg,\n svg.endAngleDeg,\n svg.radius\n ));\n }, [\n svg.startAngleDeg,\n svg.endAngleDeg,\n svg.radius,\n ]);\n\n const onClick = (evt: MouseEvent) => {\n if(!$svg || settings.disabled) return;\n\n const degrees = getAngleByMouse(\n $svg,\n evt.clientX,\n evt.clientY,\n svg.cx,\n svg.cy,\n svg.radius,\n svg.radius\n );\n\n const closestPointer = getClosestPointer(\n pointers.pointers,\n degrees,\n svg.cx,\n svg.cy,\n svg.radius\n );\n\n if(!closestPointer) return;\n\n setPointer(closestPointer, degrees);\n };\n\n return (\n \n {\n svg.border > 0 &&\n \n }\n\n \n \n )\n};\n\nexport default Circle;\n"], + "mappings": "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", + "names": ["useEffect", "useRef", "useState", "setDecimalPlaces", "num", "decimalPlaces", "coefficient", "__pow", "mod", "n", "m", "convertRange", "x", "a", "b", "c", "d", "isNumber", "value", "radiansToDegrees", "radians", "decimalPlaces", "res", "setDecimalPlaces", "degreesToRadians", "degrees", "vSub", "vector1", "vector2", "decimalPlaces", "vector", "i", "setDecimalPlaces", "v2Sub", "vMulScalar", "v", "scalar", "decimalPlaces", "vector", "i", "setDecimalPlaces", "v2MulScalar", "v2", "vLength", "vector", "decimalPlaces", "sum", "i", "setDecimalPlaces", "v2Distance", "vector1", "vector2", "decimalPlaces", "diff", "vSub", "vLength", "vNormalize", "v", "decimalPlaces", "length", "vLength", "unitVector", "i", "setDecimalPlaces", "v2Normalize", "v2", "circleMovement", "center", "angle", "radius", "newId", "getSvg", "circleRadius", "circleThickness", "circleBorder", "maxPointerRadius", "startAngleDeg", "endAngleDeg", "thickness", "diff", "size", "cx", "cy", "getSVGCenter", "getSVGSize", "val", "s", "DEFAULT_PATH_BG_COLOR", "DEFAULT_PATH_BORDER_COLOR", "DEFAULT_POINTER_BG_COLOR", "DEFAULT_POINTER_BG_COLOR_SELECTED", "DEFAULT_POINTER_BG_COLOR_DISABLED", "DEFAULT_POINTER_BORDER_COLOR", "DEFAULT_CONNECTION_BG_COLOR", "DEFAULT_CONNECTION_BG_COLOR_DISABLED", "DEFAULT_TEXT_COLOR", "DEFAULT_TICKS_COLOR", "DEFAULT_TICKS_VALUES_COLOR", "getNumber", "value", "defaultValue", "H", "getString", "getBoolean", "isAngleInArc", "startAngleDeg", "endAngleDeg", "currentDegrees", "getAnglesDistance", "startAngle", "endAngle", "diff", "diffMod", "I", "getCircle", "radius", "circumference", "angleDiff", "strokeOffset", "strokeDasharray", "complement", "getAngleByMouse", "$svg", "clientX", "clientY", "cx", "cy", "rx", "ry", "left", "top", "relativeMouse", "vector", "R", "angleRad", "fr", "angle2value", "data", "angle", "pathStartAngle", "pathEndAngle", "value", "O", "index", "s", "value2angle", "_value", "valueIndex", "item", "I", "initPointers", "settings", "Lo", "getNumber", "getString", "DEFAULT_POINTER_BG_COLOR", "DEFAULT_POINTER_BG_COLOR_SELECTED", "DEFAULT_POINTER_BG_COLOR_DISABLED", "DEFAULT_POINTER_BORDER_COLOR", "pointers", "i", "settingPointer", "radius", "bgColor", "bgColorSelected", "bgColorDisabled", "border", "borderColor", "disabled", "getBoolean", "angleDeg", "angleAfterStep", "roundToStep", "getPointers", "getMaxRadius", "max", "pointer", "getClosestPointer", "currentPlaceDegrees", "pathRadius", "pr", "currentPointOnArc", "_t", "min", "closestPointer", "enabledPointers", "p", "pointerAngleRad", "pointOnArc", "distance", "Hr", "__spreadValues", "getClosestEdge", "startAngleDegrees", "endAngleDegrees", "startAngleRad", "startPointOnArc", "endAngleRad", "endPointOnArc", "distance1", "distance2", "getMinMaxDistancePointers", "minDistance", "maxDistance", "minPointer", "maxPointer", "getAnglesDistance", "num", "step", "useEffect", "useState", "useRef", "useCallback", "outlineNoneStyle", "Fragment", "jsx", "jsxs", "getPointerFill", "pointer", "pointerRef", "bgColor", "bgColorSelected", "bgColorDisabled", "Pointer", "props", "useRef", "svg", "$svg", "setPointer", "data", "settings", "radius", "angleDeg", "border", "borderColor", "cx", "cy", "center", "setCenter", "useState", "value", "setValue", "useEffect", "angle2value", "angleRad", "O", "pr", "pointerCenter", "_t", "onValueChange", "useCallback", "evt", "mouseX", "mouseY", "degrees", "getAngleByMouse", "newAngleDeg", "isAngleInArc", "getClosestEdge", "onMouseUp", "onMouseDown", "onKeyDown", "$current", "onTouch", "onWheel", "scrollTop", "outlineNoneStyle", "Pointer_default", "Fragment", "jsx", "Pointers", "props", "pointers", "settings", "svg", "$svg", "setPointer", "data", "pointer", "Pointer_default", "Pointers_default", "getData", "setting", "min", "getNumber", "max", "step", "arrowStep", "round", "data", "minIndex", "item", "maxIndex", "pathStartAngle", "pathEndAngle", "isClosedShape", "I", "stepAngleDeg", "arrowStepAngleDeg", "useCallback", "useEffect", "useRef", "useState", "getConnection", "pointers", "radius", "cx", "cy", "pathStartAngle", "pathEndAngle", "result", "minMaxResult", "getMinMaxDistancePointers", "minPointer", "maxPointer", "pathAnglesDistance", "getAnglesDistance", "angleDistance", "circumference", "strokeOffset", "strokeDasharray", "complement", "Fragment", "jsx", "Connection", "props", "settings", "pointers", "$svg", "svg", "data", "setPointer", "connection", "setConnection", "useState", "rangeDraggingLastAngle", "useRef", "useEffect", "getConnection", "onClick", "evt", "degrees", "getAngleByMouse", "closestPointer", "getClosestPointer", "onValueChange", "useCallback", "minMaxResult", "getMinMaxDistancePointers", "minPointer", "maxPointer", "mouseDegrees", "diff", "I", "onMouseUp", "onMouseDown", "getBoolean", "getString", "DEFAULT_CONNECTION_BG_COLOR_DISABLED", "DEFAULT_CONNECTION_BG_COLOR", "Connection_default", "useEffect", "useState", "Fragment", "jsx", "Text", "props", "settings", "pointers", "svg", "data", "cx", "cy", "value", "setValue", "values", "pointer", "angle2value", "value1", "value2", "texts", "hideText", "getBoolean", "getString", "DEFAULT_TEXT_COLOR", "getNumber", "Text_default", "useEffect", "useState", "Fragment", "getTicksSettings", "settings", "data", "ticksCount", "getNumber", "ticksHeight", "getBoolean", "getString", "DEFAULT_TICKS_COLOR", "DEFAULT_TICKS_VALUES_COLOR", "getTicks", "ticksSettings", "ticsCount", "pathStartAngle", "pathEndAngle", "svg", "ticks", "deltaAngle", "oneTickAngleSize", "count", "i", "currentAngle", "angleRad", "O", "pr", "x", "y", "_t", "isLonger", "desiredDistance", "normalizedDirectionVector", "D", "tickEndVector", "vr", "tickStartVector", "x1", "y1", "tickValue", "value", "index", "s", "textX", "textY", "showText", "_tickValuesDistance", "tickTextVector", "Fragment", "jsx", "jsxs", "Ticks", "props", "settings", "svg", "data", "ticksSettings", "setTicksSettings", "useState", "ticks", "setTicks", "useEffect", "getTicksSettings", "endAngleDeg", "getTicks", "tick", "i", "x", "y", "x1", "y1", "textX", "textY", "showText", "Ticks_default", "useEffect", "useState", "jsx", "jsxs", "Circle", "props", "settings", "pointers", "$svg", "svg", "setPointer", "circle", "setCircle", "useState", "useEffect", "getCircle", "evt", "degrees", "getAngleByMouse", "closestPointer", "getClosestPointer", "getString", "DEFAULT_PATH_BORDER_COLOR", "DEFAULT_PATH_BG_COLOR", "Circle_default", "Fragment", "jsx", "jsxs", "RoundSlider", "props", "data", "setData", "useState", "svg", "setSvg", "pointers", "setPointers", "svgRef", "useRef", "useEffect", "getData", "getPointers", "pathStartAngle", "getNumber", "pathEndAngle", "getSvg", "setPointersCallback", "pointer", "newAngleDeg", "roundToStep", "I", "prevAngle", "nextAngle", "prevIndex", "nextIndex", "isAngleInArc", "getClosestEdge", "_pointers", "__spreadValues", "values", "angle2value", "outlineNoneStyle", "Ticks_default", "Circle_default", "Connection_default", "Pointers_default", "Text_default"] } diff --git a/dist/mz-react-round-slider.min.js b/dist/mz-react-round-slider.min.js index d82a2b8..b2839a1 100644 --- a/dist/mz-react-round-slider.min.js +++ b/dist/mz-react-round-slider.min.js @@ -4,7 +4,7 @@ https://github.com/mzusin/react-round-slider MIT License Copyright (c) 2023-present, Miriam Zusin */ -(()=>{var yt=Object.create;var Ee=Object.defineProperty;var Mt=Object.getOwnPropertyDescriptor;var Pt=Object.getOwnPropertyNames,Oe=Object.getOwnPropertySymbols,Rt=Object.getPrototypeOf,Ne=Object.prototype.hasOwnProperty,kt=Object.prototype.propertyIsEnumerable;var Fe=(e,t,r)=>t in e?Ee(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,ae=(e,t)=>{for(var r in t||(t={}))Ne.call(t,r)&&Fe(e,r,t[r]);if(Oe)for(var r of Oe(t))kt.call(t,r)&&Fe(e,r,t[r]);return e};var ie=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var wt=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Pt(t))!Ne.call(e,n)&&n!==r&&Ee(e,n,{get:()=>t[n],enumerable:!(o=Mt(t,n))||o.enumerable});return e};var v=(e,t,r)=>(r=e!=null?yt(Rt(e)):{},wt(t||!e||!e.__esModule?Ee(r,"default",{value:e,enumerable:!0}):r,e));var Ye=ie(f=>{"use strict";var Z=Symbol.for("react.element"),Lt=Symbol.for("react.portal"),Ot=Symbol.for("react.fragment"),Ft=Symbol.for("react.strict_mode"),Nt=Symbol.for("react.profiler"),Ut=Symbol.for("react.provider"),Vt=Symbol.for("react.context"),Bt=Symbol.for("react.forward_ref"),$t=Symbol.for("react.suspense"),Ht=Symbol.for("react.memo"),zt=Symbol.for("react.lazy"),Ue=Symbol.iterator;function Gt(e){return e===null||typeof e!="object"?null:(e=Ue&&e[Ue]||e["@@iterator"],typeof e=="function"?e:null)}var $e={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},He=Object.assign,ze={};function q(e,t,r){this.props=e,this.context=t,this.refs=ze,this.updater=r||$e}q.prototype.isReactComponent={};q.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};q.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function Ge(){}Ge.prototype=q.prototype;function Ae(e,t,r){this.props=e,this.context=t,this.refs=ze,this.updater=r||$e}var Ce=Ae.prototype=new Ge;Ce.constructor=Ae;He(Ce,q.prototype);Ce.isPureReactComponent=!0;var Ve=Array.isArray,qe=Object.prototype.hasOwnProperty,_e={current:null},Xe={key:!0,ref:!0,__self:!0,__source:!0};function je(e,t,r){var o,n={},s=null,a=null;if(t!=null)for(o in t.ref!==void 0&&(a=t.ref),t.key!==void 0&&(s=""+t.key),t)qe.call(t,o)&&!Xe.hasOwnProperty(o)&&(n[o]=t[o]);var i=arguments.length-2;if(i===1)n.children=r;else if(1{"use strict";We.exports=Ye()});var ht=ie(ve=>{"use strict";var nr=$(),or=Symbol.for("react.element"),sr=Symbol.for("react.fragment"),ar=Object.prototype.hasOwnProperty,ir=nr.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,lr={key:!0,ref:!0,__self:!0,__source:!0};function dt(e,t,r){var o,n={},s=null,a=null;r!==void 0&&(s=""+r),t.key!==void 0&&(s=""+t.key),t.ref!==void 0&&(a=t.ref);for(o in t)ar.call(t,o)&&!lr.hasOwnProperty(o)&&(n[o]=t[o]);if(e&&e.defaultProps)for(o in t=e.defaultProps,t)n[o]===void 0&&(n[o]=t[o]);return{$$typeof:or,type:e,key:s,ref:a,props:n,_owner:ir.current}}ve.Fragment=sr;ve.jsx=dt;ve.jsxs=dt});var A=ie((Kr,pt)=>{"use strict";pt.exports=ht()});var O=v($(),1);var Wt=Math.pow,_=(e,t=1/0)=>{if(t===1/0)return e;t<0&&(t=0);let r=Wt(10,t);return Math.round(e*r)/r},T=(e,t)=>(e%t+t)%t,C=(e,t,r,o,n)=>(n-o)*(e-t)/(r-t)+o;var Ke=e=>!isNaN(parseFloat(e))&&isFinite(e);var Ze=(e,t=1/0)=>{let r=e*(180/Math.PI);return _(r,t)},k=(e,t=1/0)=>{let r=e*(Math.PI/180);return _(r,t)};var Qe=(e,t,r=1/0)=>{let o=[];for(let n=0;nQe(e,t,r);var Kt=(e,t,r=1/0)=>{let o=[];for(let n=0;nKt(e,t,r);var et=(e,t=1/0)=>{let r=0;for(let o=0;o{let o=Qe(e,t);return et(o,r)};var Zt=(e,t=1/0)=>{let r=et(e),o=[];for(let n=0;nZt(e,t);var w=(e,t,r)=>(t=t%Math.PI*2,[e[0]+Math.cos(t)*r,e[1]+Math.sin(t)*r]);var Me=()=>Math.random().toString(36).substring(2)+new Date().getTime().toString(36);var rt=(e,t,r,o,n,s)=>{let a=t+r*2,i=Math.max(0,o*2-a),l=e*2+a+i,[u,c]=Qt(e,o,t,r);return{cx:u,cy:c,radius:e,size:l,thickness:t,border:r,startAngleDeg:n,endAngleDeg:s}},Qt=(e,t,r,o)=>{let n=Jt(e,t,r,o),s=_(n/2,2);return[s,s]},Jt=(e,t,r,o)=>{let n=r+o*2,s=Math.max(0,t*2-n);return e*2+n+s};var nt="#efefef";var ot="#444444";var Pe="#163a86",Re="#000",ke="#a8a8a8";var we="#000",st="#5daed2",at="#97b0bb",it="#000";var lt="#efefef",ut="#000";var d=(e,t)=>Ke(e)?Number(e):t,x=(e,t)=>e==null?t:e,L=(e,t)=>e==null?t:e;var ge=(e,t,r)=>(e>t&&(t+=360),r>=e&&r<=t||r+360>=e&&r+360<=t),Q=(e,t)=>{t0?360:o},ct=(e,t,r)=>{e>t&&(t+=360);let o=2*Math.PI*r;e>t&&(t+=360);let n=t-e,s=-(e/360)*o,a=n/360*o,i=o-a;return{strokeDasharray:[a,i].join(" "),strokeOffset:s}};var G=(e,t,r,o,n,s,a)=>{let{left:i,top:l}=e.getBoundingClientRect(),u=[t-i,r-l],c=Je(u,[o,n]),p=Math.atan2(c[1]/a,c[0]/s);return p<0&&(p+=2*Math.PI),Ze(p)},j=(e,t,r,o)=>{o0){let s=Math.round(n);n=e.data[s]}else n=_(n,e.round);return n},er=(e,t,r,o)=>{let n;if(o0){let s=e.data.findIndex(a=>a===t);n=s===-1?0:s}else n=typeof t!="number"?e.min:t;return T(C(n,e.min,e.max,r,o),360)},tr=(e,t)=>{if(!e||!e.pointers||e.pointers.length<0||!t)return[{id:Me(),index:0,radius:10,angleDeg:T(d(e.pathStartAngle,0),360),bgColor:x(e.pointerBgColor,Pe),bgColorSelected:x(e.pointerBgColorSelected,Re),bgColorDisabled:x(e.pointerBgColorDisabled,ke),border:d(e.pointerBorder,0),borderColor:x(e.pointerBorderColor,we),disabled:!!e.disabled}];let r=[];for(let o=0;o{let r=tr(e,t);return{pointers:r,maxRadius:rr(r)}},rr=e=>{if(e.length<=0)return 0;let t=-1/0;for(let r of e)t=Math.max(t,Math.max(0,r.radius+r.border/2));return t},de=(e,t,r,o,n)=>{if(!e||e.length<=0)return null;if(e.length===1)return e[0];let s=C(k(t),0,Math.PI*2,0,Math.PI),a=w([r,o],s,n),i,l=null,u=e.filter(c=>!c.disabled);for(let c of u){let p=C(k(c.angleDeg),0,Math.PI*2,0,Math.PI),h=w([r,o],p,n),g=fe(a,h);(i===void 0||g{let a=C(k(r),0,Math.PI*2,0,Math.PI),i=w([o,n],a,s),l=C(k(e),0,Math.PI*2,0,Math.PI),u=w([o,n],l,s),c=C(k(t),0,Math.PI*2,0,Math.PI),p=w([o,n],c,s),h=fe(i,u),g=fe(i,p);return h<=g?e:t},pe=(e,t)=>{if(!e||e.length<=0)return null;let r,o,n=null,s=null;for(let a of e){let i=Q(t,a.angleDeg);(r===void 0||io)&&(s=a,o=i)}return n===null||s===null?null:[n,s]},Le=(e,t)=>t===0?0:Math.round(e/t)*t;var P=v($(),1);var be={outline:"none"};var Y=v(A(),1),ur=(e,t,r,o,n)=>e.disabled?n:document.activeElement===t.current&&o||r,cr=e=>{let t=(0,P.useRef)(null),{pointer:r,svg:o,$svg:n,setPointer:s,data:a,settings:i}=e,{radius:l,angleDeg:u,bgColor:c,bgColorSelected:p,bgColorDisabled:h,border:g,borderColor:m}=e.pointer,{cx:S,cy:D}=o,[M,V]=(0,P.useState)(null),[F,Se]=(0,P.useState)("");(0,P.useEffect)(()=>{let b=j(a,r.angleDeg,o.startAngleDeg,o.endAngleDeg);Se(b===void 0?"":b.toString())},[a,r.angleDeg,o.startAngleDeg,o.endAngleDeg]),(0,P.useEffect)(()=>{let b=C(k(u),0,Math.PI*2,0,Math.PI),E=w([S,D],b,o.radius);V(E)},[u,S,D,o.radius]);let B=(0,P.useCallback)(b=>{if(!n||i.disabled||r.disabled)return;let E=b.type.indexOf("mouse")!==-1?b.clientX:b.touches[0].clientX,N=b.type.indexOf("mouse")!==-1?b.clientY:b.touches[0].clientY,R=G(n,E,N,o.cx,o.cy,o.radius,o.radius),K;ge(o.startAngleDeg,o.endAngleDeg,R)?K=R:K=he(o.startAngleDeg,o.endAngleDeg,r.angleDeg,o.cx,o.cy,o.radius),s(r,K)},[n,r,s,o.cx,o.cy,o.endAngleDeg,o.radius,o.startAngleDeg,i.disabled]),W=()=>{window.removeEventListener("mousemove",B),window.removeEventListener("mouseup",B)},oe=b=>{i.disabled||r.disabled||(B(b),window.addEventListener("mousemove",B),window.addEventListener("mouseup",W))},se=b=>{if(!(i.disabled||r.disabled||i.keyboardDisabled))switch(b.key){case"ArrowLeft":{b.preventDefault(),s(r,r.angleDeg+a.stepAngleDeg);break}case"ArrowRight":{b.preventDefault(),s(r,r.angleDeg-a.stepAngleDeg);break}case"ArrowUp":{b.preventDefault(),s(r,r.angleDeg-a.stepAngleDeg);break}case"ArrowDown":{b.preventDefault(),s(r,r.angleDeg+a.stepAngleDeg);break}}};return(0,P.useEffect)(()=>{let b=t.current,E=R=>{i.disabled||r.disabled||(R.preventDefault(),R.stopPropagation(),B(R))},N=R=>{if(i.disabled||r.disabled||i.mousewheelDisabled||document.activeElement!==b)return;R.stopPropagation(),R.preventDefault();let K=R.deltaY<0,Te;K?Te=r.angleDeg+a.stepAngleDeg:Te=r.angleDeg-a.stepAngleDeg,s(r,Te)};return b==null||b.addEventListener("touchmove",E,{passive:!1}),document.addEventListener("wheel",N,{passive:!1}),()=>{b==null||b.removeEventListener("touchmove",E),document.removeEventListener("wheel",N)}},[M,B,a.stepAngleDeg,r,s,i.disabled,i.mousewheelDisabled]),(0,Y.jsx)(Y.Fragment,{children:M&&(0,Y.jsx)("g",{ref:t,transform:`translate(${M[0]-l/2}, ${M[1]-l/2})`,role:"slider","aria-disabled":r.disabled?!0:void 0,"aria-valuenow":r.angleDeg,"aria-valuetext":F,"aria-label":r.ariaLabel,"data-type":"pointer","data-angle":r.angleDeg,"data-id":r.id,"data-index":r.index,onMouseDown:oe,onKeyDown:se,tabIndex:0,cursor:r.disabled?"default":"pointer",style:be,children:(0,Y.jsx)("circle",{cx:l/2,cy:l/2,r:l,fill:ur(r,t,c,p,h),strokeWidth:g,stroke:m})})})},bt=cr;var ee=v(A(),1),mr=e=>{let{pointers:t,settings:r,svg:o,$svg:n,setPointer:s,data:a}=e;return(0,ee.jsx)(ee.Fragment,{children:t.pointers.map(i=>(0,ee.jsx)(bt,{pointer:i,svg:o,settings:r,$svg:n,setPointer:s,data:a},i.id))})},vt=mr;var Dt=e=>{let t=d(e.min,0),r=d(e.max,100),o=d(e.step,1),n=d(e.arrowStep,1),s=d(e.round,0),a=e.data||[];if(a.length>0){let h=a.findIndex(m=>m===t),g=a.findIndex(m=>m===r);t=h===-1?0:h,r=g===-1?a.length:g}else t>r&&(t=r+100);let i=d(e.pathStartAngle,0),l=d(e.pathEndAngle,360),u=T(i,360)===T(l,360),c=o*360/(r-t),p=n*360/(r-t);return{min:t,max:r,round:s,data:a,stepAngleDeg:c,arrowStepAngleDeg:p,isClosedShape:u}};var H=v($(),1);var St=(e,t,r,o,n,s)=>{if(!e.pointers||e.pointers.length<=0)return null;let a={radius:t,cx:r,cy:o,startAngleDeg:n,endAngleDeg:n,strokeDasharray:[0,0],strokeOffset:0};if(e.pointers.length===1)a.startAngleDeg=n,a.endAngleDeg=e.pointers[0].angleDeg;else{let m=pe(e.pointers,n);if(!m)return null;let[S,D]=m;a.startAngleDeg=S.angleDeg,a.endAngleDeg=D.angleDeg}let i=Q(n,s);a.startAngleDeg>a.endAngleDeg&&(a.endAngleDeg+=360);let l=Q(a.startAngleDeg,a.endAngleDeg);l>i&&(l=360-l,[a.startAngleDeg,a.endAngleDeg]=[a.endAngleDeg,a.startAngleDeg]);let c=2*Math.PI*t,p=-(a.startAngleDeg/360)*c,h=l/360*c,g=c-h;return a.strokeDasharray=[h,g],a.strokeOffset=p,a};var te=v(A(),1),pr=e=>{let{settings:t,pointers:r,$svg:o,svg:n,data:s,setPointer:a}=e,[i,l]=(0,H.useState)(null),u=(0,H.useRef)();(0,H.useEffect)(()=>{l(St(r,n.radius,n.cx,n.cy,n.startAngleDeg,n.endAngleDeg))},[r,n.radius,n.cx,n.cy,n.startAngleDeg,n.endAngleDeg]);let c=m=>{if(!o||t.disabled)return;let S=G(o,m.clientX,m.clientY,n.cx,n.cy,n.radius,n.radius),D=de(r.pointers,S,n.cx,n.cy,n.radius);D&&a(D,S)},p=(0,H.useCallback)(m=>{if(!o||t.disabled||!t.rangeDragging)return;let S=pe(r.pointers,n.startAngleDeg);if(!S)return;let[D,M]=S,V=G(o,m.clientX,m.clientY,n.cx,n.cy,n.radius,n.radius);if(u.current===void 0){u.current=V;return}let F=V-u.current;F===0||Math.abs(F){window.removeEventListener("mousemove",p),window.removeEventListener("mouseup",p),u.current=void 0},g=m=>{!t.rangeDragging||t.disabled||r.pointers.length<=1||(p(m),window.addEventListener("mousemove",p),window.addEventListener("mouseup",h))};return(0,te.jsx)(te.Fragment,{children:!L(t.hideConnection,!1)&&i&&(0,te.jsx)("circle",{"data-type":"connection",cx:i.cx,cy:i.cy,r:i.radius,strokeDasharray:i.strokeDasharray.join(" "),strokeDashoffset:i.strokeOffset,stroke:t.disabled?x(t.connectionBgColorDisabled,at):x(t.connectionBgColor,st),strokeWidth:n.thickness+1,fill:"none",shapeRendering:"geometricPrecision",strokeLinecap:"round",cursor:t.disabled?"default":"pointer",onClick:c,onMouseDown:g})})},Tt=pr;var xe=v($(),1),re=v(A(),1),vr=e=>{let{settings:t,pointers:r,svg:o,data:n}=e,{cx:s,cy:a}=o,[i,l]=(0,xe.useState)("");(0,xe.useEffect)(()=>{let c=r.pointers.map(h=>j(n,h.angleDeg,o.startAngleDeg,o.endAngleDeg));c.sort((h,g)=>h.toString().localeCompare(g.toString(),"en",{numeric:!0}));let p=c.map(h=>`${t.textPrefix||""}${h}${t.textSuffix||""}`);l(p.join(" "))},[n,r.pointers,o.startAngleDeg,o.endAngleDeg,t.textPrefix,t.textSuffix]);let u=L(t.hideText,!1);return(0,re.jsx)(re.Fragment,{children:!u&&(0,re.jsx)("text",{x:s,y:a,fill:x(t.textColor,it),fontSize:d(t.textFontSize,16),fontFamily:t.textFontFamily,style:{userSelect:"none"},textAnchor:"middle",children:i})})},Et=vr;var z=v($(),1);var It=(e,t)=>{let r=d(e.ticsCount,0);r||(t.data&&t.data.length>0?r=t.data.length:r=t.max);let o=d(e.ticksHeight,20);return{ticksCount:r,disableTicks:L(e.disableTicks,!1),ticksWidth:d(e.ticksWidth,3),ticksHeight:o,longerTicksHeight:d(e.longerTicksHeight,o*2),ticksDistanceToPanel:d(e.ticksDistanceToPanel,0),tickValuesDistance:d(e.tickValuesDistance,15),ticksColor:x(e.ticksColor,lt),tickValuesColor:x(e.tickValuesColor,ut),tickValuesFontSize:d(e.tickValuesFontSize,12),ticksGroupSize:d(e.ticksGroupSize,10),longerTickValuesOnly:L(e.longerTickValuesOnly,!0),showTickValues:L(e.showTickValues,!0)}},At=(e,t,r,o,n,s)=>{let a=[],i=Math.abs(o-r),l=t===0?0:i/t,u=t;s.isClosedShape||u++;for(let c=0;c0){let N=Math.round(E);E=s.data[N]}else E=_(E,s.round);W=(E!=null?E:"").toString()}let oe=0,se=0,b=W!==void 0;if(b){let E=d(D+e.tickValuesDistance,D*1.5),N=me(M,E);oe=g+N[0],se=m+N[1]}a.push({x:g,y:m,x1:Se,y1:B,textX:oe,textY:se,isLonger:S,tickValue:W,showText:b})}return a};var U=v(A(),1),Ir=e=>{let{settings:t,svg:r,data:o}=e,[n,s]=(0,z.useState)(null),[a,i]=(0,z.useState)([]);return(0,z.useEffect)(()=>{s(It(t,o))},[t,o]),(0,z.useEffect)(()=>{if(!n)return;let l=r.endAngleDeg;l{let{x:c,y:p,x1:h,y1:g,textX:m,textY:S,showText:D}=l;return(0,U.jsxs)(z.Fragment,{children:[(0,U.jsx)("line",{x1:c,y1:p,x2:h,y2:g,strokeWidth:n.ticksWidth,stroke:n.ticksColor}),D&&(0,U.jsx)("text",{x:m,y:S,textAnchor:"middle",dominantBaseline:"middle",fill:n.tickValuesColor,fontSize:n.tickValuesFontSize,fontFamily:t.tickValuesFontFamily,style:{userSelect:"none"},children:l.tickValue})]},u)})})})},Ct=Ir;var De=v($(),1);var ne=v(A(),1),Ar=e=>{let{settings:t,pointers:r,$svg:o,svg:n,setPointer:s}=e,[a,i]=(0,De.useState)({strokeDasharray:"0 1000000",strokeOffset:0});return(0,De.useEffect)(()=>{i(ct(n.startAngleDeg,n.endAngleDeg,n.radius))},[n.startAngleDeg,n.endAngleDeg,n.radius]),(0,ne.jsxs)("g",{onClick:u=>{if(!o||t.disabled)return;let c=G(o,u.clientX,u.clientY,n.cx,n.cy,n.radius,n.radius),p=de(r.pointers,c,n.cx,n.cy,n.radius);p&&s(p,c)},children:[n.border>0&&(0,ne.jsx)("circle",{strokeDasharray:a.strokeDasharray,strokeDashoffset:a.strokeOffset,cx:n.cx,cy:n.cy,r:n.radius,stroke:x(t.pathBorderColor,ot),strokeWidth:n.thickness+n.border*2,fill:"none",shapeRendering:"geometricPrecision",strokeLinecap:"round",cursor:"pointer","data-type":"path-border"}),(0,ne.jsx)("circle",{strokeDasharray:a.strokeDasharray,strokeDashoffset:a.strokeOffset,cx:n.cx,cy:n.cy,r:n.radius,stroke:x(t.pathBgColor,nt),strokeWidth:n.thickness,fill:"none",shapeRendering:"geometricPrecision",strokeLinecap:"round",cursor:"pointer","data-type":"path"})]})},_t=Ar;var y=v(A(),1),ho=e=>{let[t,r]=(0,O.useState)(null),[o,n]=(0,O.useState)(null),[s,a]=(0,O.useState)(null),i=(0,O.useRef)(null);(0,O.useEffect)(()=>{r(Dt(e))},[e]),(0,O.useEffect)(()=>{a(gt(e,t))},[e,t]),(0,O.useEffect)(()=>{if(!s)return;let u=d(e.pathStartAngle,0),c=d(e.pathEndAngle,360);c<=u&&(c+=360),n(rt(d(e.pathRadius,150),d(e.pathThickness,5),d(e.pathBorder,0),s.maxRadius,u,c))},[e.pathRadius,e.pathThickness,e.pathBorder,e.pathStartAngle,e.pathEndAngle,s]);let l=(u,c)=>{if(e.disabled||!s.pointers||!u||u.disabled||(c=Le(c,t.stepAngleDeg),t.isClosedShape&&T(c,360)===T(o.endAngleDeg,360)&&(c=o.startAngleDeg),u.angleDeg===c))return;if(!e.pointersOverlap){let g,m;if(t.isClosedShape){let S=T(u.index-1,s.pointers.length),D=T(u.index+1,s.pointers.length);g=s.pointers[S].angleDeg,m=s.pointers[D].angleDeg}else g=u.index===0?o.startAngleDeg:s.pointers[u.index-1].angleDeg,m=u.index===s.pointers.length-1?o.endAngleDeg:s.pointers[u.index+1].angleDeg;m<=g&&(m+=360),ge(g,m,c)||(c=he(g,m,c,o.cx,o.cy,o.radius))}if(u.angleDeg===c)return;let h=ae({},s);if(h.pointers=[...s.pointers],h.pointers[u.index].angleDeg=c,s.pointers=h.pointers,a(h),typeof e.onChange=="function"){let g=h.pointers.map(m=>j(t,m.angleDeg,o.startAngleDeg,o.endAngleDeg));e.onChange(g)}};return(0,y.jsx)(y.Fragment,{children:o&&(0,y.jsxs)("svg",{ref:i,xmlns:"http://www.w3.org/2000/svg",width:o.size,height:o.size,tabIndex:0,focusable:!0,"aria-disabled":e.disabled?!0:void 0,style:be,children:[e.SvgDefs&&(0,y.jsx)("defs",{children:e.SvgDefs}),(0,y.jsx)(Ct,{settings:e,svg:o,data:t}),(0,y.jsx)(_t,{settings:e,pointers:s,svg:o,$svg:i.current,setPointer:l}),(0,y.jsx)(Tt,{settings:e,pointers:s,svg:o,$svg:i.current,data:t,setPointer:l}),(0,y.jsx)(vt,{settings:e,pointers:s,svg:o,$svg:i.current,setPointer:l,data:t}),(0,y.jsx)(Et,{settings:e,pointers:s,svg:o,data:t})]})})};})(); +(()=>{var yt=Object.create;var Ee=Object.defineProperty;var Mt=Object.getOwnPropertyDescriptor;var Pt=Object.getOwnPropertyNames,Oe=Object.getOwnPropertySymbols,Rt=Object.getPrototypeOf,Ne=Object.prototype.hasOwnProperty,kt=Object.prototype.propertyIsEnumerable;var Fe=(e,t,r)=>t in e?Ee(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,ae=(e,t)=>{for(var r in t||(t={}))Ne.call(t,r)&&Fe(e,r,t[r]);if(Oe)for(var r of Oe(t))kt.call(t,r)&&Fe(e,r,t[r]);return e};var ie=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var wt=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Pt(t))!Ne.call(e,n)&&n!==r&&Ee(e,n,{get:()=>t[n],enumerable:!(o=Mt(t,n))||o.enumerable});return e};var x=(e,t,r)=>(r=e!=null?yt(Rt(e)):{},wt(t||!e||!e.__esModule?Ee(r,"default",{value:e,enumerable:!0}):r,e));var Ye=ie(m=>{"use strict";var Z=Symbol.for("react.element"),Lt=Symbol.for("react.portal"),Ot=Symbol.for("react.fragment"),Ft=Symbol.for("react.strict_mode"),Nt=Symbol.for("react.profiler"),Ut=Symbol.for("react.provider"),Vt=Symbol.for("react.context"),Bt=Symbol.for("react.forward_ref"),$t=Symbol.for("react.suspense"),Ht=Symbol.for("react.memo"),Gt=Symbol.for("react.lazy"),Ue=Symbol.iterator;function zt(e){return e===null||typeof e!="object"?null:(e=Ue&&e[Ue]||e["@@iterator"],typeof e=="function"?e:null)}var $e={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},He=Object.assign,Ge={};function X(e,t,r){this.props=e,this.context=t,this.refs=Ge,this.updater=r||$e}X.prototype.isReactComponent={};X.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};X.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function ze(){}ze.prototype=X.prototype;function Ae(e,t,r){this.props=e,this.context=t,this.refs=Ge,this.updater=r||$e}var Ce=Ae.prototype=new ze;Ce.constructor=Ae;He(Ce,X.prototype);Ce.isPureReactComponent=!0;var Ve=Array.isArray,qe=Object.prototype.hasOwnProperty,_e={current:null},Xe={key:!0,ref:!0,__self:!0,__source:!0};function je(e,t,r){var o,n={},s=null,a=null;if(t!=null)for(o in t.ref!==void 0&&(a=t.ref),t.key!==void 0&&(s=""+t.key),t)qe.call(t,o)&&!Xe.hasOwnProperty(o)&&(n[o]=t[o]);var i=arguments.length-2;if(i===1)n.children=r;else if(1{"use strict";We.exports=Ye()});var ht=ie(ve=>{"use strict";var nr=$(),or=Symbol.for("react.element"),sr=Symbol.for("react.fragment"),ar=Object.prototype.hasOwnProperty,ir=nr.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,lr={key:!0,ref:!0,__self:!0,__source:!0};function dt(e,t,r){var o,n={},s=null,a=null;r!==void 0&&(s=""+r),t.key!==void 0&&(s=""+t.key),t.ref!==void 0&&(a=t.ref);for(o in t)ar.call(t,o)&&!lr.hasOwnProperty(o)&&(n[o]=t[o]);if(e&&e.defaultProps)for(o in t=e.defaultProps,t)n[o]===void 0&&(n[o]=t[o]);return{$$typeof:or,type:e,key:s,ref:a,props:n,_owner:ir.current}}ve.Fragment=sr;ve.jsx=dt;ve.jsxs=dt});var A=ie((Kr,pt)=>{"use strict";pt.exports=ht()});var O=x($(),1);var Wt=Math.pow,_=(e,t=1/0)=>{if(t===1/0)return e;t<0&&(t=0);let r=Wt(10,t);return Math.round(e*r)/r},T=(e,t)=>(e%t+t)%t,C=(e,t,r,o,n)=>(n-o)*(e-t)/(r-t)+o;var Ke=e=>!isNaN(parseFloat(e))&&isFinite(e);var Ze=(e,t=1/0)=>{let r=e*(180/Math.PI);return _(r,t)},k=(e,t=1/0)=>{let r=e*(Math.PI/180);return _(r,t)};var Qe=(e,t,r=1/0)=>{let o=[];for(let n=0;nQe(e,t,r);var Kt=(e,t,r=1/0)=>{let o=[];for(let n=0;nKt(e,t,r);var et=(e,t=1/0)=>{let r=0;for(let o=0;o{let o=Qe(e,t);return et(o,r)};var Zt=(e,t=1/0)=>{let r=et(e),o=[];for(let n=0;nZt(e,t);var w=(e,t,r)=>(t=t%Math.PI*2,[e[0]+Math.cos(t)*r,e[1]+Math.sin(t)*r]);var Me=()=>Math.random().toString(36).substring(2)+new Date().getTime().toString(36);var rt=(e,t,r,o,n,s)=>{let a=t+r*2,i=Math.max(0,o*2-a),l=e*2+a+i,[u,c]=Qt(e,o,t,r);return{cx:u,cy:c,radius:e,size:l,thickness:t,border:r,startAngleDeg:n,endAngleDeg:s}},Qt=(e,t,r,o)=>{let n=Jt(e,t,r,o),s=_(n/2,2);return[s,s]},Jt=(e,t,r,o)=>{let n=r+o*2,s=Math.max(0,t*2-n);return e*2+n+s};var nt="#efefef";var ot="#444444";var Pe="#163a86",Re="#000",ke="#a8a8a8";var we="#000",st="#5daed2",at="#97b0bb",it="#000";var lt="#efefef",ut="#000";var d=(e,t)=>Ke(e)?Number(e):t,D=(e,t)=>e==null?t:e,L=(e,t)=>e==null?t:e;var ge=(e,t,r)=>(e>t&&(t+=360),r>=e&&r<=t||r+360>=e&&r+360<=t),Q=(e,t)=>{t0?360:o},ct=(e,t,r)=>{e>t&&(t+=360);let o=2*Math.PI*r;e>t&&(t+=360);let n=t-e,s=-(e/360)*o,a=n/360*o,i=o-a;return{strokeDasharray:[a,i].join(" "),strokeOffset:s}};var q=(e,t,r,o,n,s,a)=>{let{left:i,top:l}=e.getBoundingClientRect(),u=[t-i,r-l],c=Je(u,[o,n]),p=Math.atan2(c[1]/a,c[0]/s);return p<0&&(p+=2*Math.PI),Ze(p)},Y=(e,t,r,o)=>{o0){let s=Math.round(n);n=e.data[s]}else n=_(n,e.round);return n},er=(e,t,r,o)=>{let n;if(o0){let s=e.data.findIndex(a=>a===t);n=s===-1?0:s}else n=typeof t!="number"?e.min:t;return T(C(n,e.min,e.max,r,o),360)},tr=(e,t)=>{if(!e||!e.pointers||e.pointers.length<0||!t)return[{id:Me(),index:0,radius:d(e.pointerRadius,10),angleDeg:T(d(e.pathStartAngle,0),360),bgColor:D(e.pointerBgColor,Pe),bgColorSelected:D(e.pointerBgColorSelected,Re),bgColorDisabled:D(e.pointerBgColorDisabled,ke),border:d(e.pointerBorder,0),borderColor:D(e.pointerBorderColor,we),disabled:!!e.disabled}];let r=[];for(let o=0;o{let r=tr(e,t);return{pointers:r,maxRadius:rr(r)}},rr=e=>{if(e.length<=0)return 0;let t=-1/0;for(let r of e)t=Math.max(t,Math.max(0,r.radius+r.border/2));return t},de=(e,t,r,o,n)=>{if(!e||e.length<=0)return null;if(e.length===1)return e[0];let s=C(k(t),0,Math.PI*2,0,Math.PI),a=w([r,o],s,n),i,l=null,u=e.filter(c=>!c.disabled);for(let c of u){let p=C(k(c.angleDeg),0,Math.PI*2,0,Math.PI),h=w([r,o],p,n),g=fe(a,h);(i===void 0||g{let a=C(k(r),0,Math.PI*2,0,Math.PI),i=w([o,n],a,s),l=C(k(e),0,Math.PI*2,0,Math.PI),u=w([o,n],l,s),c=C(k(t),0,Math.PI*2,0,Math.PI),p=w([o,n],c,s),h=fe(i,u),g=fe(i,p);return h<=g?e:t},pe=(e,t)=>{if(!e||e.length<=0)return null;let r,o,n=null,s=null;for(let a of e){let i=Q(t,a.angleDeg);(r===void 0||io)&&(s=a,o=i)}return n===null||s===null?null:[n,s]},Le=(e,t)=>t===0?0:Math.round(e/t)*t;var P=x($(),1);var be={outline:"none"};var H=x(A(),1),ur=(e,t,r,o,n)=>e.disabled?n:document.activeElement===t.current&&o||r,cr=e=>{let t=(0,P.useRef)(null),{pointer:r,svg:o,$svg:n,setPointer:s,data:a,settings:i}=e,{radius:l,angleDeg:u,bgColor:c,bgColorSelected:p,bgColorDisabled:h,border:g,borderColor:f}=e.pointer,{cx:v,cy:S}=o,[M,V]=(0,P.useState)(null),[F,Se]=(0,P.useState)("");(0,P.useEffect)(()=>{let b=Y(a,r.angleDeg,o.startAngleDeg,o.endAngleDeg);Se(b===void 0?"":b.toString())},[a,r.angleDeg,o.startAngleDeg,o.endAngleDeg]),(0,P.useEffect)(()=>{let b=C(k(u),0,Math.PI*2,0,Math.PI),E=w([v,S],b,o.radius);V(E)},[u,v,S,o.radius]);let B=(0,P.useCallback)(b=>{if(!n||i.disabled||r.disabled)return;let E=b.type.indexOf("mouse")!==-1?b.clientX:b.touches[0].clientX,N=b.type.indexOf("mouse")!==-1?b.clientY:b.touches[0].clientY,R=q(n,E,N,o.cx,o.cy,o.radius,o.radius),K;ge(o.startAngleDeg,o.endAngleDeg,R)?K=R:K=he(o.startAngleDeg,o.endAngleDeg,r.angleDeg,o.cx,o.cy,o.radius),s(r,K)},[n,r,s,o.cx,o.cy,o.endAngleDeg,o.radius,o.startAngleDeg,i.disabled]),W=()=>{window.removeEventListener("mousemove",B),window.removeEventListener("mouseup",B)},oe=b=>{i.disabled||r.disabled||(B(b),window.addEventListener("mousemove",B),window.addEventListener("mouseup",W))},se=b=>{if(!(i.disabled||r.disabled||i.keyboardDisabled))switch(b.key){case"ArrowLeft":{b.preventDefault(),s(r,r.angleDeg+a.stepAngleDeg);break}case"ArrowRight":{b.preventDefault(),s(r,r.angleDeg-a.stepAngleDeg);break}case"ArrowUp":{b.preventDefault(),s(r,r.angleDeg-a.stepAngleDeg);break}case"ArrowDown":{b.preventDefault(),s(r,r.angleDeg+a.stepAngleDeg);break}}};return(0,P.useEffect)(()=>{let b=t.current,E=R=>{i.disabled||r.disabled||(R.preventDefault(),R.stopPropagation(),B(R))},N=R=>{if(i.disabled||r.disabled||i.mousewheelDisabled||document.activeElement!==b)return;R.stopPropagation(),R.preventDefault();let K=R.deltaY<0,Te;K?Te=r.angleDeg+a.stepAngleDeg:Te=r.angleDeg-a.stepAngleDeg,s(r,Te)};return b==null||b.addEventListener("touchmove",E,{passive:!1}),document.addEventListener("wheel",N,{passive:!1}),()=>{b==null||b.removeEventListener("touchmove",E),document.removeEventListener("wheel",N)}},[M,B,a.stepAngleDeg,r,s,i.disabled,i.mousewheelDisabled]),(0,H.jsx)(H.Fragment,{children:M&&(0,H.jsxs)("g",{ref:t,transform:`translate(${M[0]-l/2}, ${M[1]-l/2})`,role:"slider","aria-disabled":r.disabled?!0:void 0,"aria-valuenow":r.angleDeg,"aria-valuetext":F,"aria-label":r.ariaLabel,"data-type":"pointer","data-angle":r.angleDeg,"data-id":r.id,"data-index":r.index,onMouseDown:oe,onKeyDown:se,tabIndex:0,cursor:r.disabled?"default":"pointer",style:be,children:[!i.pointerSVG&&(0,H.jsx)("circle",{cx:l/2,cy:l/2,r:l,fill:ur(r,t,c,p,h),strokeWidth:g,stroke:f}),i.pointerSVG&&(0,H.jsx)("g",{children:i.pointerSVG})]})})},bt=cr;var ee=x(A(),1),mr=e=>{let{pointers:t,settings:r,svg:o,$svg:n,setPointer:s,data:a}=e;return(0,ee.jsx)(ee.Fragment,{children:t.pointers.map(i=>(0,ee.jsx)(bt,{pointer:i,svg:o,settings:r,$svg:n,setPointer:s,data:a},i.id))})},vt=mr;var Dt=e=>{let t=d(e.min,0),r=d(e.max,100),o=d(e.step,1),n=d(e.arrowStep,1),s=d(e.round,0),a=e.data||[];if(a.length>0){let h=a.findIndex(f=>f===t),g=a.findIndex(f=>f===r);t=h===-1?0:h,r=g===-1?a.length:g}else t>r&&(t=r+100);let i=d(e.pathStartAngle,0),l=d(e.pathEndAngle,360),u=T(i,360)===T(l,360),c=o*360/(r-t),p=n*360/(r-t);return{min:t,max:r,round:s,data:a,stepAngleDeg:c,arrowStepAngleDeg:p,isClosedShape:u}};var G=x($(),1);var St=(e,t,r,o,n,s)=>{if(!e.pointers||e.pointers.length<=0)return null;let a={radius:t,cx:r,cy:o,startAngleDeg:n,endAngleDeg:n,strokeDasharray:[0,0],strokeOffset:0};if(e.pointers.length===1)a.startAngleDeg=n,a.endAngleDeg=e.pointers[0].angleDeg;else{let f=pe(e.pointers,n);if(!f)return null;let[v,S]=f;a.startAngleDeg=v.angleDeg,a.endAngleDeg=S.angleDeg}let i=Q(n,s);a.startAngleDeg>a.endAngleDeg&&(a.endAngleDeg+=360);let l=Q(a.startAngleDeg,a.endAngleDeg);l>i&&(l=360-l,[a.startAngleDeg,a.endAngleDeg]=[a.endAngleDeg,a.startAngleDeg]);let c=2*Math.PI*t,p=-(a.startAngleDeg/360)*c,h=l/360*c,g=c-h;return a.strokeDasharray=[h,g],a.strokeOffset=p,a};var te=x(A(),1),pr=e=>{let{settings:t,pointers:r,$svg:o,svg:n,data:s,setPointer:a}=e,[i,l]=(0,G.useState)(null),u=(0,G.useRef)();(0,G.useEffect)(()=>{l(St(r,n.radius,n.cx,n.cy,n.startAngleDeg,n.endAngleDeg))},[r,n.radius,n.cx,n.cy,n.startAngleDeg,n.endAngleDeg]);let c=f=>{if(!o||t.disabled)return;let v=q(o,f.clientX,f.clientY,n.cx,n.cy,n.radius,n.radius),S=de(r.pointers,v,n.cx,n.cy,n.radius);S&&a(S,v)},p=(0,G.useCallback)(f=>{if(!o||t.disabled||!t.rangeDragging)return;let v=pe(r.pointers,n.startAngleDeg);if(!v)return;let[S,M]=v,V=q(o,f.clientX,f.clientY,n.cx,n.cy,n.radius,n.radius);if(u.current===void 0){u.current=V;return}let F=V-u.current;F===0||Math.abs(F){window.removeEventListener("mousemove",p),window.removeEventListener("mouseup",p),u.current=void 0},g=f=>{!t.rangeDragging||t.disabled||r.pointers.length<=1||(p(f),window.addEventListener("mousemove",p),window.addEventListener("mouseup",h))};return(0,te.jsx)(te.Fragment,{children:!L(t.hideConnection,!1)&&i&&(0,te.jsx)("circle",{"data-type":"connection",cx:i.cx,cy:i.cy,r:i.radius,strokeDasharray:i.strokeDasharray.join(" "),strokeDashoffset:i.strokeOffset,stroke:t.disabled?D(t.connectionBgColorDisabled,at):D(t.connectionBgColor,st),strokeWidth:n.thickness+1,fill:"none",shapeRendering:"geometricPrecision",strokeLinecap:"round",cursor:t.disabled?"default":"pointer",onClick:c,onMouseDown:g})})},Tt=pr;var xe=x($(),1),re=x(A(),1),vr=e=>{let{settings:t,pointers:r,svg:o,data:n}=e,{cx:s,cy:a}=o,[i,l]=(0,xe.useState)("");(0,xe.useEffect)(()=>{let c=r.pointers.map(h=>Y(n,h.angleDeg,o.startAngleDeg,o.endAngleDeg));c.sort((h,g)=>h.toString().localeCompare(g.toString(),"en",{numeric:!0}));let p=c.map(h=>`${t.textPrefix||""}${h}${t.textSuffix||""}`);l(p.join(" "))},[n,r.pointers,o.startAngleDeg,o.endAngleDeg,t.textPrefix,t.textSuffix]);let u=L(t.hideText,!1);return(0,re.jsx)(re.Fragment,{children:!u&&(0,re.jsx)("text",{x:s,y:a,fill:D(t.textColor,it),fontSize:d(t.textFontSize,16),fontFamily:t.textFontFamily,style:{userSelect:"none"},textAnchor:"middle",children:i})})},Et=vr;var z=x($(),1);var It=(e,t)=>{let r=d(e.ticsCount,0);r||(t.data&&t.data.length>0?r=t.data.length:r=t.max);let o=d(e.ticksHeight,20);return{ticksCount:r,disableTicks:L(e.disableTicks,!1),ticksWidth:d(e.ticksWidth,3),ticksHeight:o,longerTicksHeight:d(e.longerTicksHeight,o*2),ticksDistanceToPanel:d(e.ticksDistanceToPanel,0),tickValuesDistance:d(e.tickValuesDistance,15),ticksColor:D(e.ticksColor,lt),tickValuesColor:D(e.tickValuesColor,ut),tickValuesFontSize:d(e.tickValuesFontSize,12),ticksGroupSize:d(e.ticksGroupSize,10),longerTickValuesOnly:L(e.longerTickValuesOnly,!0),showTickValues:L(e.showTickValues,!0)}},At=(e,t,r,o,n,s)=>{let a=[],i=Math.abs(o-r),l=t===0?0:i/t,u=t;s.isClosedShape||u++;for(let c=0;c0){let N=Math.round(E);E=s.data[N]}else E=_(E,s.round);W=(E!=null?E:"").toString()}let oe=0,se=0,b=W!==void 0;if(b){let E=d(S+e.tickValuesDistance,S*1.5),N=me(M,E);oe=g+N[0],se=f+N[1]}a.push({x:g,y:f,x1:Se,y1:B,textX:oe,textY:se,isLonger:v,tickValue:W,showText:b})}return a};var U=x(A(),1),Ir=e=>{let{settings:t,svg:r,data:o}=e,[n,s]=(0,z.useState)(null),[a,i]=(0,z.useState)([]);return(0,z.useEffect)(()=>{s(It(t,o))},[t,o]),(0,z.useEffect)(()=>{if(!n)return;let l=r.endAngleDeg;l{let{x:c,y:p,x1:h,y1:g,textX:f,textY:v,showText:S}=l;return(0,U.jsxs)(z.Fragment,{children:[(0,U.jsx)("line",{x1:c,y1:p,x2:h,y2:g,strokeWidth:n.ticksWidth,stroke:n.ticksColor}),S&&(0,U.jsx)("text",{x:f,y:v,textAnchor:"middle",dominantBaseline:"middle",fill:n.tickValuesColor,fontSize:n.tickValuesFontSize,fontFamily:t.tickValuesFontFamily,style:{userSelect:"none"},children:l.tickValue})]},u)})})})},Ct=Ir;var De=x($(),1);var ne=x(A(),1),Ar=e=>{let{settings:t,pointers:r,$svg:o,svg:n,setPointer:s}=e,[a,i]=(0,De.useState)({strokeDasharray:"0 1000000",strokeOffset:0});return(0,De.useEffect)(()=>{i(ct(n.startAngleDeg,n.endAngleDeg,n.radius))},[n.startAngleDeg,n.endAngleDeg,n.radius]),(0,ne.jsxs)("g",{onClick:u=>{if(!o||t.disabled)return;let c=q(o,u.clientX,u.clientY,n.cx,n.cy,n.radius,n.radius),p=de(r.pointers,c,n.cx,n.cy,n.radius);p&&s(p,c)},children:[n.border>0&&(0,ne.jsx)("circle",{strokeDasharray:a.strokeDasharray,strokeDashoffset:a.strokeOffset,cx:n.cx,cy:n.cy,r:n.radius,stroke:D(t.pathBorderColor,ot),strokeWidth:n.thickness+n.border*2,fill:"none",shapeRendering:"geometricPrecision",strokeLinecap:"round",cursor:"pointer","data-type":"path-border"}),(0,ne.jsx)("circle",{strokeDasharray:a.strokeDasharray,strokeDashoffset:a.strokeOffset,cx:n.cx,cy:n.cy,r:n.radius,stroke:D(t.pathBgColor,nt),strokeWidth:n.thickness,fill:"none",shapeRendering:"geometricPrecision",strokeLinecap:"round",cursor:"pointer","data-type":"path"})]})},_t=Ar;var y=x(A(),1),ho=e=>{let[t,r]=(0,O.useState)(null),[o,n]=(0,O.useState)(null),[s,a]=(0,O.useState)(null),i=(0,O.useRef)(null);(0,O.useEffect)(()=>{r(Dt(e))},[e]),(0,O.useEffect)(()=>{a(gt(e,t))},[e,t]),(0,O.useEffect)(()=>{if(!s)return;let u=d(e.pathStartAngle,0),c=d(e.pathEndAngle,360);c<=u&&(c+=360),n(rt(d(e.pathRadius,150),d(e.pathThickness,5),d(e.pathBorder,0),s.maxRadius,u,c))},[e.pathRadius,e.pathThickness,e.pathBorder,e.pathStartAngle,e.pathEndAngle,s]);let l=(u,c)=>{if(e.disabled||!s.pointers||!u||u.disabled||(c=Le(c,t.stepAngleDeg),t.isClosedShape&&T(c,360)===T(o.endAngleDeg,360)&&(c=o.startAngleDeg),u.angleDeg===c))return;if(!e.pointersOverlap){let g,f;if(t.isClosedShape){let v=T(u.index-1,s.pointers.length),S=T(u.index+1,s.pointers.length);g=s.pointers[v].angleDeg,f=s.pointers[S].angleDeg}else g=u.index===0?o.startAngleDeg:s.pointers[u.index-1].angleDeg,f=u.index===s.pointers.length-1?o.endAngleDeg:s.pointers[u.index+1].angleDeg;f<=g&&(f+=360),ge(g,f,c)||(c=he(g,f,c,o.cx,o.cy,o.radius))}if(u.angleDeg===c)return;let h=ae({},s);if(h.pointers=[...s.pointers],h.pointers[u.index].angleDeg=c,s.pointers=h.pointers,a(h),typeof e.onChange=="function"){let g=h.pointers.map(f=>Y(t,f.angleDeg,o.startAngleDeg,o.endAngleDeg));e.onChange(g)}};return(0,y.jsx)(y.Fragment,{children:o&&(0,y.jsxs)("svg",{ref:i,xmlns:"http://www.w3.org/2000/svg",width:o.size,height:o.size,tabIndex:0,focusable:!0,"aria-disabled":e.disabled?!0:void 0,style:be,children:[e.SvgDefs&&(0,y.jsx)("defs",{children:e.SvgDefs}),(0,y.jsx)(Ct,{settings:e,svg:o,data:t}),(0,y.jsx)(_t,{settings:e,pointers:s,svg:o,$svg:i.current,setPointer:l}),(0,y.jsx)(Tt,{settings:e,pointers:s,svg:o,$svg:i.current,data:t,setPointer:l}),(0,y.jsx)(vt,{settings:e,pointers:s,svg:o,$svg:i.current,setPointer:l,data:t}),(0,y.jsx)(Et,{settings:e,pointers:s,svg:o,data:t})]})})};})(); /*! Bundled license information: react/cjs/react.production.min.js: diff --git a/dist/mz-react-round-slider.min.js.map b/dist/mz-react-round-slider.min.js.map index a070a96..38c7b62 100644 --- a/dist/mz-react-round-slider.min.js.map +++ b/dist/mz-react-round-slider.min.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../node_modules/react/cjs/react.production.min.js", "../node_modules/react/index.js", "../node_modules/react/cjs/react-jsx-runtime.production.min.js", "../node_modules/react/jsx-runtime.js", "../src/core/index.tsx", "../node_modules/mz-math/src/main/format.ts", "../node_modules/mz-math/src/main/other.ts", "../node_modules/mz-math/src/main/angle.ts", "../node_modules/mz-math/src/main/linear-algebra/vector.ts", "../node_modules/mz-math/src/main/linear-algebra/matrix.ts", "../node_modules/mz-math/src/main/linear-algebra/matrix-transformations.ts", "../node_modules/mz-math/src/main/random.ts", "../node_modules/mz-math/src/main/convert.ts", "../node_modules/mz-math/src/main/derivative.ts", "../node_modules/mz-math/src/main/equations/linear-equations.ts", "../node_modules/mz-math/src/main/equations/quadratic-equations.ts", "../node_modules/mz-math/src/main/bezier-curves/bezier-curve.ts", "../node_modules/mz-math/src/main/path-movement.ts", "../node_modules/mz-math/src/main/color.ts", "../node_modules/mz-math/src/main/id.ts", "../node_modules/mz-math/src/main/shapes.ts", "../node_modules/mz-math/src/main/collision-detection.ts", "../node_modules/mz-math/src/main/animation.ts", "../src/core/domain/svg-provider.ts", "../src/core/domain/defaults-provider.ts", "../src/core/domain/common-provider.ts", "../src/core/domain/circle-provider.ts", "../src/core/domain/pointers-provider.ts", "../src/core/ui/Pointer.tsx", "../src/core/domain/style-provider.ts", "../src/core/ui/Pointers.tsx", "../src/core/domain/data-provider.ts", "../src/core/ui/Connection.tsx", "../src/core/domain/connection-provider.ts", "../src/core/ui/Text.tsx", "../src/core/ui/Ticks.tsx", "../src/core/domain/ticks-provider.ts", "../src/core/ui/Circle.tsx"], - "sourcesContent": ["/**\n * @license React\n * react.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var l=Symbol.for(\"react.element\"),n=Symbol.for(\"react.portal\"),p=Symbol.for(\"react.fragment\"),q=Symbol.for(\"react.strict_mode\"),r=Symbol.for(\"react.profiler\"),t=Symbol.for(\"react.provider\"),u=Symbol.for(\"react.context\"),v=Symbol.for(\"react.forward_ref\"),w=Symbol.for(\"react.suspense\"),x=Symbol.for(\"react.memo\"),y=Symbol.for(\"react.lazy\"),z=Symbol.iterator;function A(a){if(null===a||\"object\"!==typeof a)return null;a=z&&a[z]||a[\"@@iterator\"];return\"function\"===typeof a?a:null}\nvar B={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},C=Object.assign,D={};function E(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B}E.prototype.isReactComponent={};\nE.prototype.setState=function(a,b){if(\"object\"!==typeof a&&\"function\"!==typeof a&&null!=a)throw Error(\"setState(...): takes an object of state variables to update or a function which returns an object of state variables.\");this.updater.enqueueSetState(this,a,b,\"setState\")};E.prototype.forceUpdate=function(a){this.updater.enqueueForceUpdate(this,a,\"forceUpdate\")};function F(){}F.prototype=E.prototype;function G(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B}var H=G.prototype=new F;\nH.constructor=G;C(H,E.prototype);H.isPureReactComponent=!0;var I=Array.isArray,J=Object.prototype.hasOwnProperty,K={current:null},L={key:!0,ref:!0,__self:!0,__source:!0};\nfunction M(a,b,e){var d,c={},k=null,h=null;if(null!=b)for(d in void 0!==b.ref&&(h=b.ref),void 0!==b.key&&(k=\"\"+b.key),b)J.call(b,d)&&!L.hasOwnProperty(d)&&(c[d]=b[d]);var g=arguments.length-2;if(1===g)c.children=e;else if(1 {\n\n const [ data, setData ] = useState(null);\n const [ svg, setSvg ] = useState(null);\n const [ pointers, setPointers ] = useState(null);\n\n const svgRef = useRef(null);\n\n useEffect(() => {\n setData(getData(props));\n }, [ props ]);\n\n useEffect(() => {\n setPointers(getPointers(props, data));\n }, [\n props,\n data,\n ]);\n\n useEffect(() => {\n if(!pointers) return;\n\n const pathStartAngle = getNumber(props.pathStartAngle, DEFAULT_PATH_START_ANGLE);\n let pathEndAngle = getNumber(props.pathEndAngle, DEFAULT_PATH_END_ANGLE);\n\n if(pathEndAngle <= pathStartAngle) {\n pathEndAngle += 360;\n }\n\n setSvg(getSvg(\n getNumber(props.pathRadius, DEFAULT_PATH_RADIUS),\n getNumber(props.pathThickness, DEFAULT_PATH_THICKNESS),\n getNumber(props.pathBorder, DEFAULT_PATH_BORDER),\n pointers.maxRadius,\n pathStartAngle,\n pathEndAngle,\n ));\n }, [\n props.pathRadius,\n props.pathThickness,\n props.pathBorder,\n props.pathStartAngle,\n props.pathEndAngle,\n pointers,\n ]);\n\n const setPointersCallback = (pointer: IPointer, newAngleDeg: number) => {\n if(props.disabled || !pointers.pointers || !pointer || pointer.disabled) return;\n\n newAngleDeg = roundToStep(newAngleDeg, data.stepAngleDeg);\n if(data.isClosedShape && mod(newAngleDeg, 360) === mod(svg.endAngleDeg, 360)){\n newAngleDeg = svg.startAngleDeg;\n }\n\n if(pointer.angleDeg === newAngleDeg) return;\n\n const handleOverlap = !props.pointersOverlap;\n if(handleOverlap) {\n\n let prevAngle, nextAngle;\n\n if(data.isClosedShape) {\n const prevIndex = mod(pointer.index - 1, pointers.pointers.length);\n const nextIndex = mod(pointer.index + 1, pointers.pointers.length);\n\n prevAngle = pointers.pointers[prevIndex].angleDeg;\n nextAngle = pointers.pointers[nextIndex].angleDeg;\n }\n else{\n prevAngle = pointer.index === 0 ? svg.startAngleDeg : pointers.pointers[pointer.index - 1].angleDeg;\n nextAngle = pointer.index === pointers.pointers.length - 1 ? svg.endAngleDeg : pointers.pointers[pointer.index + 1].angleDeg;\n }\n\n if(nextAngle <= prevAngle) {\n nextAngle += 360;\n }\n\n if(!isAngleInArc(prevAngle, nextAngle, newAngleDeg)){\n newAngleDeg = getClosestEdge(\n prevAngle,\n nextAngle,\n newAngleDeg,\n svg.cx,\n svg.cy,\n svg.radius\n );\n }\n }\n\n if(pointer.angleDeg === newAngleDeg) return;\n\n const _pointers = { ...pointers };\n _pointers.pointers = [...pointers.pointers];\n _pointers.pointers[pointer.index].angleDeg = newAngleDeg;\n pointers.pointers = _pointers.pointers;\n\n setPointers(_pointers);\n\n if(typeof props.onChange === 'function') {\n const values = _pointers.pointers.map(pointer => angle2value(\n data,\n pointer.angleDeg,\n svg.startAngleDeg,\n svg.endAngleDeg\n ));\n\n props.onChange(values);\n }\n };\n\n return (\n <>\n {\n svg &&\n \n\n {\n (props.SvgDefs) &&\n \n { props.SvgDefs }\n \n }\n\n \n\n \n\n \n\n \n\n \n \n }\n \n )\n};", "export const setDecimalPlaces = (num: number, decimalPlaces: number | undefined = Infinity) => {\n if(decimalPlaces === Infinity) return num;\n\n if(decimalPlaces < 0){\n decimalPlaces = 0;\n }\n\n const coefficient = 10 ** decimalPlaces;\n return Math.round(num * coefficient) / coefficient;\n};", "import { Vector2 } from '../types';\nimport { setDecimalPlaces } from './format';\n\nexport const mod = (n: number, m: number) => {\n return ((n % m) + m) % m;\n};\n\n/**\n * Convert range [a, b] to [c, d].\n * f(x) = (d - c) * (x - a) / (b - a) + c\n */\nexport const convertRange = (x: number, a: number, b: number, c: number, d: number) => {\n return (d - c) * (x - a) / (b - a) + c;\n};\n\n/**\n * Check if 2 ranges [a,b] and [c,d] overlap.\n */\nexport const doRangesOverlap = (a: number, b: number, c: number, d: number) => {\n return Math.max(a, c) <= Math.min(b, d) ;\n};\n\n// eslint-disable-next-line\nexport const isNumber = (value: any) => {\n return !isNaN(parseFloat(value)) && isFinite(value);\n};\n\n/**\n * Convert polar coordinates to cartesian coordinates.\n */\nexport const polarToCartesian = (center: Vector2, radii: Vector2, angleInRad: number, decimalPlaces = Infinity) : Vector2 => {\n const [cx, cy] = center;\n const [rx, ry] = radii;\n\n return [\n setDecimalPlaces(cx + (rx * Math.cos(angleInRad)), decimalPlaces),\n setDecimalPlaces(cy + (ry * Math.sin(angleInRad)), decimalPlaces),\n ];\n};", "import { Vector, Vector2, Vector3 } from '../types';\nimport { setDecimalPlaces } from './format';\nimport { v2Length, vNormalize, vDotProduct, vSub } from './linear-algebra/vector';\nimport { mod } from './other';\n\nexport const getV2Angle = (v2: Vector2, decimalPlaces = Infinity) => {\n const angle = Math.atan2(v2[1], v2[0]);\n return setDecimalPlaces(angle, decimalPlaces);\n};\n\nexport const getV2AngleInEllipse = (v2: Vector2, radii: Vector2, decimalPlaces = Infinity) => {\n const angle = Math.atan2(v2[1]/radii[1], v2[0]/radii[0]);\n return setDecimalPlaces(angle, decimalPlaces);\n};\n\nexport const setV2Angle = (v2: Vector2, newAngleRad: number, decimalPlaces = Infinity): Vector2 => {\n const length = v2Length(v2);\n return [\n setDecimalPlaces(Math.cos(newAngleRad) * length, decimalPlaces),\n setDecimalPlaces(Math.sin(newAngleRad) * length, decimalPlaces),\n ];\n};\n\nexport const radiansToDegrees = (radians: number, decimalPlaces = Infinity) => {\n const res = radians * (180 / Math.PI);\n return setDecimalPlaces(res, decimalPlaces);\n};\n\nexport const degreesToRadians = (degrees: number, decimalPlaces = Infinity) => {\n const res = degrees * (Math.PI / 180);\n return setDecimalPlaces(res, decimalPlaces);\n};\n\n/**\n * Returns the range [0, Math.PI]\n * A = Math.acos( dot(v1, v2)/(v1.length()*v2.length()) );\n */\nexport const getVNAngleBetween = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) : number => {\n const unitVector1 = vNormalize(vector1);\n const unitVector2 = vNormalize(vector2);\n const dotProduct = vDotProduct(unitVector1, unitVector2);\n const angle = Math.acos(dotProduct);\n return setDecimalPlaces(angle, decimalPlaces);\n};\n\nexport const getV2AngleBetween = (vector1: Vector2, vector2: Vector2, decimalPlaces = Infinity) : number => {\n // return getVNAngleBetween(vector1, vector2, decimalPlaces);\n const diff = vSub(vector1, vector2);\n const angle = Math.atan2(diff[1], diff[0]);\n return setDecimalPlaces(angle, decimalPlaces);\n};\n\nexport const getV3AngleBetween = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) : number => {\n return getVNAngleBetween(vector1, vector2, decimalPlaces);\n};\n\n/**\n * Shortest distance (angular) between two angles.\n */\nexport const getAnglesSub = (angleDegrees1: number, angleDegrees2: number, decimalPlaces = Infinity) : number => {\n const angleDistance = Math.abs(mod(angleDegrees1, 360) - mod(angleDegrees2, 360));\n return setDecimalPlaces(angleDistance <= 180 ? angleDistance : 360 - angleDistance, decimalPlaces);\n};\n\nexport const isAngleBetween = (angleDegrees: number, startAngleDegrees: number, endAngleDegrees: number) : boolean => {\n const distance = getAnglesSub(startAngleDegrees, endAngleDegrees);\n const distance1 = getAnglesSub(startAngleDegrees, angleDegrees);\n const distance2 = getAnglesSub(endAngleDegrees, angleDegrees);\n const totalDistance = distance1 + distance2;\n\n // Use a small threshold for floating point errors\n return Math.abs(totalDistance - distance) <= 0.001;\n}", "import { Vector, Vector2, Vector3, Vector4 } from '../../types';\nimport { setDecimalPlaces } from '../format';\nimport { getV2Angle, setV2Angle } from '../angle';\n\n// ------------ SUM ------------------------\n\nexport const vSum = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) : Vector => {\n\n const vector: Vector = [];\n\n for(let i=0; i {\n return vSum(vector1, vector2, decimalPlaces) as Vector2;\n};\n\nexport const v3Sum = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) : Vector3 => {\n return vSum(vector1, vector2, decimalPlaces) as Vector3;\n};\n\n// ------------ SUB ------------------------\n\nexport const vSub = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) : Vector => {\n\n const vector: Vector = [];\n\n for(let i=0; i {\n return vSub(vector1, vector2, decimalPlaces) as Vector2;\n};\n\nexport const v3Sub = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) : Vector3 => {\n return vSub(vector1, vector2, decimalPlaces) as Vector3;\n};\n\n// ------------ MUL SCALAR ------------------------\n\nexport const vMulScalar = (v: Vector, scalar: number, decimalPlaces = Infinity): Vector => {\n const vector: Vector = [];\n\n for(let i=0; i {\n return vMulScalar(v2, scalar, decimalPlaces) as Vector2;\n};\n\nexport const v3MulScalar = (v3: Vector3, scalar: number, decimalPlaces = Infinity): Vector3 => {\n return vMulScalar(v3, scalar, decimalPlaces) as Vector3;\n};\n\n// ------------ DIVIDE ------------------------\n\nexport const vDivideScalar = (v: Vector, scalar: number, decimalPlaces = Infinity): Vector => {\n if(scalar === 0){\n throw new Error('Division by zero error.');\n }\n\n const vector: Vector = [];\n\n for(let i=0; i {\n return vDivideScalar(v2, scalar, decimalPlaces) as Vector2;\n};\n\nexport const v3DivideScalar = (v3: Vector3, scalar: number, decimalPlaces = Infinity): Vector3 => {\n return vDivideScalar(v3, scalar, decimalPlaces) as Vector3;\n};\n\n// ------------ LENGTH ------------------------\n\nexport const vLength = (vector: Vector, decimalPlaces = Infinity) => {\n let sum = 0;\n\n for(let i=0; i {\n return vLength(vector, decimalPlaces);\n};\n\nexport const v3Length = (vector: Vector3, decimalPlaces = Infinity) => {\n return vLength(vector, decimalPlaces);\n};\n\nexport const v2SetLength = (v2: Vector2, newLength: number, decimalPlaces = Infinity): Vector2 => {\n const angle = getV2Angle(v2);\n return [\n setDecimalPlaces(Math.cos(angle) * newLength, decimalPlaces),\n setDecimalPlaces(Math.sin(angle) * newLength, decimalPlaces),\n ];\n};\n\n// ----------- DISTANCE ------------------------\n\nexport const vDistance = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) => {\n const diff = vSub(vector1, vector2);\n return vLength(diff, decimalPlaces);\n};\n\nexport const v2Distance = (vector1: Vector2, vector2: Vector2, decimalPlaces = Infinity) => {\n const diff = vSub(vector1, vector2);\n return vLength(diff, decimalPlaces);\n};\n\nexport const v3Distance = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) => {\n const diff = vSub(vector1, vector2);\n return vLength(diff, decimalPlaces);\n};\n\n// ------------ NORMALIZE ------------------------\n\n/**\n * Normalization creates a unit vector, which is a vector of length 1.\n */\nexport const vNormalize = (v: Vector, decimalPlaces = Infinity) : Vector => {\n const length = vLength(v);\n const unitVector: Vector = [];\n\n for(let i=0; i {\n return vNormalize(v2, decimalPlaces) as Vector2;\n};\n\nexport const v3Normalize = (v3: Vector3, decimalPlaces = Infinity) : Vector3 => {\n return vNormalize(v3, decimalPlaces) as Vector3;\n};\n\n// ------------ DOT PRODUCT ------------------------\n\nexport const vDotProduct = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) : number => {\n let sum = 0;\n\n for(let i=0; i {\n return vDotProduct(vector1, vector2, decimalPlaces);\n};\n\nexport const v3DotProduct = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) : number => {\n return vDotProduct(vector1, vector2, decimalPlaces);\n};\n\n// ------------ CROSS PRODUCT ------------------------\n\n/**\n * Cross product is possible on 3D vectors only.\n * The cross product a \u00D7 b is defined as a vector c that is perpendicular (orthogonal) to both a and b.\n */\nexport const v3CrossProduct = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity): Vector3 => {\n return [\n setDecimalPlaces(vector1[1] * vector2[2] - vector1[2] * vector2[1], decimalPlaces),\n setDecimalPlaces(vector1[2] * vector2[0] - vector1[0] * vector2[2], decimalPlaces),\n setDecimalPlaces(vector1[0] * vector2[1] - vector1[1] * vector2[0], decimalPlaces),\n ];\n};\n\n// --------------- INIT VECTOR HELPER -----------------\n\nexport const v2 = (defaultValue = 0): Vector2 => {\n return [defaultValue, defaultValue];\n};\n\nexport const v3 = (defaultValue = 0): Vector3 => {\n return [defaultValue, defaultValue, defaultValue];\n};\n\nexport const v4 = (defaultValue = 0): Vector4 => {\n return [defaultValue, defaultValue, defaultValue, defaultValue];\n};\n\nexport const vN = (N: number, defaultValue = 0): Vector => {\n\n if(N < 0){\n throw new Error('N must be a non-negative number.');\n }\n\n const vector: Vector = [];\n for(let i=0; i {\n let vector: Vector2 = [0, 0];\n vector = v2SetLength(vector, distance);\n return setV2Angle(vector, angleRad);\n};\n\n// --------------- EQUALITY -------------------------\n\nexport const vEqual = (vector1: Vector, vector2: Vector): boolean => {\n if(vector1.length !== vector2.length) return false;\n\n for(let i=0; i {\n const sub = v2Sub(vector2, vector1);\n return [\n -setDecimalPlaces(sub[1], decimalPlaces),\n setDecimalPlaces(sub[0], decimalPlaces)\n ];\n};", "import { Matrix2, Matrix3, Matrix4, Matrix, Vector, Vector2, Vector3 } from '../../types';\nimport { vMulScalar, vSum, vSub, vDotProduct, vN, vEqual, vDivideScalar } from './vector';\n\n// --------------- SUM ----------------------\n\nexport const mSum = (matrix1: Matrix, matrix2: Matrix, decimalPlaces = Infinity): Matrix => {\n const matrix: Matrix = [];\n\n for(let i=0; i {\n return mSum(matrix1, matrix2, decimalPlaces) as Matrix2;\n};\n\nexport const m3Sum = (matrix1: Matrix3, matrix2: Matrix3, decimalPlaces = Infinity): Matrix3 => {\n return mSum(matrix1, matrix2, decimalPlaces) as Matrix3;\n};\n\n// --------------- SUB ----------------------\n\nexport const mSub = (matrix1: Matrix, matrix2: Matrix, decimalPlaces = Infinity): Matrix => {\n const matrix: Matrix = [];\n\n for(let i=0; i {\n return mSub(matrix1, matrix2, decimalPlaces) as Matrix2;\n};\n\nexport const m3Sub = (matrix1: Matrix3, matrix2: Matrix3, decimalPlaces = Infinity): Matrix3 => {\n return mSub(matrix1, matrix2, decimalPlaces) as Matrix3;\n};\n\n// --------------- MUL SCALAR ----------------------\n\nexport const mMulScalar = (m: Matrix, scalar: number, decimalPlaces = Infinity): Matrix => {\n const matrix: Matrix = [];\n\n for(const v of m){\n matrix.push(vMulScalar(v, scalar, decimalPlaces));\n }\n\n return matrix;\n};\n\nexport const m2MulScalar = (m2: Matrix2, scalar: number, decimalPlaces = Infinity): Matrix2 => {\n return mMulScalar(m2, scalar, decimalPlaces) as Matrix2;\n};\n\nexport const m3MulScalar = (m3: Matrix3, scalar: number, decimalPlaces = Infinity): Matrix3 => {\n return mMulScalar(m3, scalar, decimalPlaces) as Matrix3;\n};\n\n// --------------- DIVIDE SCALAR ----------------------\n\nexport const mDivideScalar = (m: Matrix, scalar: number, decimalPlaces = Infinity): Matrix => {\n if(scalar === 0){\n throw new Error('Division by zero error.');\n }\n\n const matrix: Matrix = [];\n\n for(const v of m){\n matrix.push(vDivideScalar(v, scalar, decimalPlaces));\n }\n\n return matrix;\n};\n\nexport const m2DivideScalar = (m2: Matrix2, scalar: number, decimalPlaces = Infinity): Matrix2 => {\n return mDivideScalar(m2, scalar, decimalPlaces) as Matrix2;\n};\n\nexport const m3DivideScalar = (m3: Matrix3, scalar: number, decimalPlaces = Infinity): Matrix3 => {\n return mDivideScalar(m3, scalar, decimalPlaces) as Matrix3;\n};\n\n\n// --------------- TRANSPOSE ----------------------\n\nexport const mTranspose = (m: Matrix): Matrix => {\n\n const vectorsCount = m.length;\n if(vectorsCount <= 0) return m;\n\n const vectorLength = m[0].length;\n if(vectorLength <= 0) return m;\n\n const matrix: Matrix = [];\n for(let i=0; i {\n return mTranspose(m2);\n};\n\nexport const m3Transpose = (m3: Matrix3): Matrix => {\n return mTranspose(m3);\n};\n\n// ----------------- RESET ----------------------\n\nexport const mReset = (m: Matrix, defaultValue = 0): Matrix => {\n\n if(m.length <= 0) return [];\n\n const res: Matrix = [];\n\n for(let i=0; i {\n return mReset(m2, defaultValue) as Matrix2;\n};\n\nexport const m3Reset = (m3: Matrix3, defaultValue = 0): Matrix3 => {\n return mReset(m3, defaultValue) as Matrix3;\n};\n\n// --------------- MATRIX INIT HELPERS -----------------\n\nexport const m2x2 = (defaultValue = 0): Matrix2 => {\n return [\n [defaultValue, defaultValue],\n [defaultValue, defaultValue],\n ];\n};\n\nexport const m3x3 = (defaultValue = 0): Matrix3 => {\n return [\n [defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue],\n ];\n};\n\nexport const m4x4 = (defaultValue = 0): Matrix4 => {\n return [\n [defaultValue, defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue, defaultValue],\n ];\n};\n\nexport const mNxM = (N: number, M: number, defaultValue = 0): Matrix => {\n if(N <= 0 || M <= 0){\n throw new Error('M and N must be positive numbers.');\n }\n\n const matrix: Matrix = [];\n\n for(let i=0; i {\n return [\n [1, 0],\n [0, 1],\n ];\n};\n\nexport const identity3 = (): Matrix3 => {\n return [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\nexport const identity4 = (): Matrix4 => {\n return [\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Identity Matrix (I).\n * M x I = I x M = M for any matrix M.\n * Identity Matrix is a special case of scale matrix.\n */\nexport const identityN = (N: number): Matrix => {\n if(N < 0){\n throw new Error('N must be a non-negative number.');\n }\n\n if(N === 0) return [];\n\n const matrix: Matrix = [];\n\n for(let i=0; i {\n const matrix: Matrix = [];\n\n for(let i=0; i {\n return mDeepCopy(m2) as Matrix2;\n};\n\nexport const m3DeepCopy = (m3: Matrix3): Matrix3 => {\n return mDeepCopy(m3) as Matrix3;\n};\n\n// -------------- APPEND / PREPEND ROW OR COLUMN ---------------\n\nexport const mAppendCol = (m: Matrix, col: Vector): Matrix => {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n for(let i=0; i {\n const copy = mDeepCopy(m);\n copy.push(row);\n return copy;\n};\n\nexport const m2AppendRow = (m2: Matrix2, row: Vector2) : Matrix2 => {\n const copy = m2DeepCopy(m2);\n copy.push(row);\n return copy;\n};\n\nexport const m3AppendRow = (m3: Matrix3, row: Vector3) : Matrix3 => {\n const copy = m3DeepCopy(m3);\n copy.push(row);\n return copy;\n};\n\nexport const mPrependRow = (m: Matrix, row: Vector) : Matrix => {\n const copy = mDeepCopy(m);\n copy.unshift(row);\n return copy;\n};\n\nexport const m2PrependRow = (m2: Matrix2, row: Vector2) : Matrix2 => {\n const copy = m2DeepCopy(m2);\n copy.unshift(row);\n return copy;\n};\n\nexport const m3PrependRow = (m3: Matrix3, row: Vector3) : Matrix3 => {\n const copy = m3DeepCopy(m3);\n copy.unshift(row);\n return copy;\n};\n\n// ------------ DELETE ROW OR COLUMN ----------------------------\n\nexport const mDelLastRow = (m: Matrix): Matrix => {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n copy.pop();\n return copy;\n};\n\nexport const mDelFirstRow = (m: Matrix): Matrix => {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n copy.shift();\n return copy;\n};\n\nexport const mDelLastColumn = (m: Matrix): Matrix => {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const vector: Vector = [];\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const size = m[0].length;\n\n const vector: Vector = [];\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const vector: Vector = [];\n for(let i=0; i {\n\n const matrix: Matrix = [];\n for(let i=0; i {\n\n if(matrix.length < 0) return [];\n\n if(matrix[0].length !== vector.length){\n throw new Error('The number of columns in the matrix must be equal to the length of the vector.');\n }\n\n const res: Vector = [];\n\n for(let i=0; i {\n if(matrix1.length !== matrix2.length) return false;\n\n for(let i=0; i returns matrix N (m-1 x m-1)\n * The matrix must be square.\n */\nconst mMinorHelper = (m: Matrix, row: number, col: number) => {\n const size = m.length;\n\n if(size <= 0){\n throw new Error('The matrix should not be empty.');\n }\n\n if(size !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n const matrix: Matrix = [];\n\n for(let i=0; i {\n const size = m.length;\n\n if(size <= 0){\n throw new Error('The matrix should not be empty.');\n }\n\n if(size !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n // prepare the matrix without provided row and column\n const matrix = mMinorHelper(m, row, col);\n\n // calculate the matrix determinant\n return mDeterminant(matrix);\n};\n\n/**\n * Calculate determinant for NxN matrix.\n * Matrix should be square.\n */\nexport const mDeterminant = (matrix: Matrix): number => {\n const size = matrix.length;\n if(size === 0) return 1;\n\n if(size !== matrix[0].length){\n throw new Error('The matrix must be square.');\n }\n\n if(size === 1) return matrix[0][0];\n if(size === 2) return m2Determinant(matrix as Matrix2);\n\n let d = 0;\n\n for(let i=0; i {\n if(m2.length !== m2[0].length){\n throw new Error('The matrix must be square.');\n }\n\n return m2[0][0] * m2[1][1] - m2[1][0] * m2[0][1];\n};\n\n/**\n * Calculate determinant for 3x3 matrix.\n * Matrix should be square.\n */\nexport const m3Determinant = (m3: Matrix3): number => {\n if(m3.length !== m3[0].length){\n throw new Error('The matrix must be square.');\n }\n\n return mDeterminant(m3);\n};\n\n// ------------------ INVERSE -----------------------\n\nexport const m2Adjugate = (m2: Matrix2): Matrix2|null => {\n if(m2.length !== m2[0].length){\n throw new Error('The matrix must be square.');\n }\n\n return [\n [m2[1][1], -m2[0][1]],\n [-m2[1][0], m2[0][0]],\n ];\n};\n\nexport const m3Adjugate = (m3: Matrix3) : Matrix3|null => {\n return mAdjugate(m3) as (Matrix3|null);\n};\n\n/**\n * Adjugate is a transpose of a cofactor matrix\n */\nexport const mAdjugate = (m: Matrix): Matrix|null => {\n\n const size = m.length;\n if(size <= 0) return null;\n\n if(size !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n if(size === 1) return m;\n\n if(size === 2) return m2Adjugate(m as Matrix2);\n\n // build a cofactor matrix ----------------\n const cofactors: Matrix = [];\n\n for(let i=0; i {\n if(m.length > 0 && m.length !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n const d = mDeterminant(m);\n return d === 0;\n};\n\n/**\n * Square matrix A (nxn) is invertible is there is another square matrix B (nxn) so AxB = BxA = I\n * For A (2x2) matrix, the inverse is:\n * (1 / (determinant(A))) * adj(A)\n */\nexport const m2Inverse = (m2: Matrix2, decimalPlaces = Infinity): (Matrix2 | null) => {\n if(m2.length > 0 && m2.length !== m2[0].length){\n throw new Error('The matrix must be square.');\n }\n\n const d = m2Determinant(m2);\n if(d === 0) return null;\n\n const adj = m2Adjugate(m2);\n if(adj === null) return null;\n\n return m2DivideScalar(adj, d, decimalPlaces);\n};\n\nexport const m3Inverse = (m3: Matrix3, decimalPlaces = Infinity): (Matrix3 | null) => {\n return mInverse(m3, decimalPlaces) as (Matrix3|null);\n};\n\nexport const mInverse = (m: Matrix, decimalPlaces = Infinity): (Matrix | null) => {\n const size = m.length;\n\n if(size > 0 && size !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n // find a determinant ----------------------\n const d = mDeterminant(m);\n\n // find an Adjugate - a transpose of a cofactor matrix\n const adj = mAdjugate(m);\n if(adj === null) return null;\n\n return mDivideScalar(adj, d, decimalPlaces);\n};", "import { Matrix2, Matrix3, Matrix4, Matrix, Vector2, Vector3, Vector4 } from '../../types';\nimport { v2Normalize, v3MulScalar, v3Normalize } from './vector';\nimport { mMulVector, mMul } from './matrix';\nimport { setDecimalPlaces } from '../format';\n\n/*\nAny 2D affine transformation can be decomposed\ninto a rotation, followed by a scaling, followed by a\nshearing, and followed by a translation.\n---------------------------------------------------------\nAffine matrix = translation x shearing x scaling x rotation\n */\n\n// ----------------- CSS -------------------------------------\n\n/**\n * Matrix 2D in non-homogeneous coordinates to CSS matrix() function\n * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix\n */\nexport const m2ToCSS = (m: Matrix2) : string => {\n const a = m[0][0];\n const b = m[1][0];\n const c = m[0][1];\n const d = m[1][1];\n\n return `matrix(${ a }, ${ b }, ${ c }, ${ d }, 0, 0)`;\n};\n\n/**\n * Matrix 2D in homogeneous coordinates to CSS matrix() function\n * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix\n */\nexport const m2hToCSS = (m: Matrix3) : string => {\n const a = m[0][0];\n const b = m[1][0];\n const c = m[0][1];\n const d = m[1][1];\n const tx = m[0][2];\n const ty = m[1][2];\n\n return `matrix(${ a }, ${ b }, ${ c }, ${ d }, ${ tx }, ${ ty })`;\n};\n\n/**\n * Matrix 2D in homogeneous coordinates to CSS matrix3d() function\n * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix3d\n */\nexport const m2hToCSS3d = (m: Matrix3) : string => {\n const a = m[0][0];\n const b = m[1][0];\n const c = m[0][1];\n const d = m[1][1];\n const tx = m[0][2];\n const ty = m[1][2];\n\n return `matrix3d(${ a }, ${ b }, 0, 0, ${ c }, ${ d }, 0, 0, 0, 0, 1, 0, ${ tx }, ${ ty }, 0, 1)`;\n};\n\n/**\n * Matrix 3D in homogeneous coordinates to CSS matrix3d() function\n * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix3d\n */\nexport const m3hToCSS3d = (m: Matrix4) : string => {\n\n return `matrix3d(\n ${ m[0][0] }, ${ m[0][1] }, ${ m[0][2] }, ${ m[0][3] },\n ${ m[1][0] }, ${ m[1][1] }, ${ m[1][2] }, ${ m[1][3] },\n ${ m[2][0] }, ${ m[2][1] }, ${ m[2][2] }, ${ m[2][3] },\n ${ m[3][0] }, ${ m[3][1] }, ${ m[3][2] }, ${ m[3][3] }\n )`;\n};\n\n// ---------------- TRANSLATION MATRICES ----------------------\n\nexport const m2Translation = (position: Vector2, decimalPlaces = Infinity): Matrix2 => {\n\n return [\n [1, 0],\n [0, 1],\n [setDecimalPlaces(position[0], decimalPlaces), setDecimalPlaces(position[1], decimalPlaces)],\n ];\n};\n\nexport const m3Translation = (position: Vector3, decimalPlaces = Infinity): Matrix3 => {\n\n return [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n [\n setDecimalPlaces(position[0], decimalPlaces),\n setDecimalPlaces(position[1], decimalPlaces),\n setDecimalPlaces(position[2], decimalPlaces)\n ],\n ];\n};\n\n/**\n * 2D Translation matrix in homogeneous coordinates.\n */\nexport const m2TranslationH = (position: Vector3, decimalPlaces = Infinity): Matrix3 => {\n\n return [\n [1, 0, setDecimalPlaces(position[0], decimalPlaces)],\n [0, 1, setDecimalPlaces(position[1], decimalPlaces)],\n [0, 0, 1],\n ];\n};\n\n/**\n * 3D Translation matrix in homogeneous coordinates.\n */\nexport const m3TranslationH = (position: Vector4, decimalPlaces = Infinity): Matrix4 => {\n\n return [\n [1, 0, 0, setDecimalPlaces(position[0], decimalPlaces)],\n [0, 1, 0, setDecimalPlaces(position[1], decimalPlaces)],\n [0, 0, 1, setDecimalPlaces(position[2], decimalPlaces)],\n [0, 0, 0, 1],\n ];\n};\n\n// ---------------- ROTATION MATRICES -------------------------\n\n/**\n * Rotation of an angle about the origin.\n */\nexport const m2Rotation = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix2 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, -sin],\n [sin, cos],\n ] :\n [\n [cos, sin],\n [-sin, cos],\n ];\n};\n\n/**\n * Rotation of an angle about the origin in homogeneous coordinates (clockwise).\n */\nexport const m2RotationH = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix3 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, -sin, 0],\n [sin, cos, 0],\n [0, 0, 1],\n ]:\n [\n [cos, sin, 0],\n [-sin, cos, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Rotation of an angle \"angleRad\" around the given point (transformOrigin) in homogeneous coordinates (clockwise).\n * result_vector = TranslationMatrix(x, y) * RotationMatrix() * TranslationMatrix(-x, -y) * position_vector\n */\nexport const m2RotationAroundPointH = (\n angleRad: number,\n transformOrigin: Vector3,\n isClockwise = true,\n decimalPlaces = Infinity): Matrix3 => {\n\n const translation = m2TranslationH(transformOrigin, decimalPlaces);\n const rotation = m2RotationH(angleRad, isClockwise, decimalPlaces);\n const translationBack = m2TranslationH(v3MulScalar(transformOrigin, -1), decimalPlaces);\n const temp1 = mMul(translation, rotation);\n return mMul(temp1, translationBack) as Matrix3;\n};\n\nexport const m2RotateAroundPointH = (\n angleRad: number,\n transformOrigin: Vector3,\n position: Vector3,\n isClockwise = true,\n decimalPlaces = Infinity): Vector3 => {\n\n const mat3h = m2RotationAroundPointH(angleRad, transformOrigin, isClockwise, decimalPlaces);\n return mMulVector(mat3h, position) as Vector3;\n};\n\n/**\n * Rotate vector around the origin by angle \"angleRad\" (clockwise).\n */\nexport const v2Rotate = (angleRad: number, vector: Vector2, isClockwise = true, decimalPlaces = Infinity): Vector2 => {\n const unitVector = v2Normalize(vector);\n return mMulVector(m2Rotation(angleRad, isClockwise, decimalPlaces), unitVector) as Vector2;\n};\n\n/**\n * Rotate vector around the origin by angle \"angleRad\" (clockwise).\n */\nexport const v2RotateH = (angleRad: number, vector: Vector3, isClockwise = true, decimalPlaces = Infinity): Vector3 => {\n const unitVector = v3Normalize(vector);\n return mMulVector(m2RotationH(angleRad, isClockwise, decimalPlaces), unitVector) as Vector3;\n};\n\n/**\n * Rotation around the X axis (clockwise).\n */\nexport const m3RotationX = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix3 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [1, 0, 0],\n [0, cos, -sin],\n [0, sin, cos],\n ] :\n [\n [1, 0, 0],\n [0, cos, sin],\n [0, -sin, cos],\n ];\n};\n\n/**\n * Rotation around the X axis (clockwise) - in homogeneous coordinates\n */\nexport const m3RotationXH = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix4 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [1, 0, 0, 0],\n [0, cos, -sin, 0],\n [0, sin, cos, 0],\n [0, 0, 0, 1],\n ] :\n [\n [1, 0, 0, 0],\n [0, cos, sin, 0],\n [0, -sin, cos, 0],\n [0, 0, 0, 1],\n ];\n};\n\nexport const v3RotateX = (angleRad: number, vector: Vector3, isClockwise = true, decimalPlaces = Infinity): Vector3 => {\n const unitVector = v3Normalize(vector);\n return mMulVector(m3RotationX(angleRad, isClockwise, decimalPlaces), unitVector) as Vector3;\n};\n\n/**\n * Rotation around the Y axis (clockwise).\n */\nexport const m3RotationY = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix3 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, 0, sin],\n [0, 1, 0],\n [-sin, 0, cos],\n ] :\n [\n [cos, 0, -sin],\n [0, 1, 0],\n [sin, 0, cos],\n ];\n};\n\n/**\n * Rotation around the Y axis (clockwise) - in homogeneous coordinates\n */\nexport const m3RotationYH = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix4 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, 0, sin, 0],\n [0, 1, 0, 0],\n [-sin, 0, cos, 0],\n [0, 0, 0, 1],\n ] :\n [\n [cos, 0, -sin, 0],\n [0, 1, 0, 0],\n [sin, 0, cos, 0],\n [0, 0, 0, 1],\n ];\n};\n\nexport const v3RotateY = (angleRad: number, vector: Vector3, isClockwise = true, decimalPlaces = Infinity): Vector3 => {\n const unitVector = v3Normalize(vector);\n return mMulVector(m3RotationY(angleRad, isClockwise, decimalPlaces), unitVector) as Vector3;\n};\n\n/**\n * Rotation around the Z axis (clockwise).\n */\nexport const m3RotationZ = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix3 => {\n\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, -sin, 0],\n [sin, cos, 0],\n [0, 0, 1],\n ] : [\n [cos, sin, 0],\n [-sin, cos, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Rotation around the Z axis (clockwise)- in homogeneous coordinates\n */\nexport const m3RotationZH = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix4 => {\n\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, -sin, 0, 0],\n [sin, cos, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ] : [\n [cos, sin, 0, 0],\n [-sin, cos, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\nexport const v3RotateZ = (angleRad: number, vector: Vector3, isClockwise = true, decimalPlaces = Infinity): Vector3 => {\n const unitVector = v3Normalize(vector);\n return mMulVector(m3RotationZ(angleRad, isClockwise, decimalPlaces), unitVector) as Vector3;\n};\n\n// ---------------- SCALE MATRICES -------------\n\n/**\n * Get matrix for arbitrary scaling pivot point.\n * result_vector = TranslationMatrix(x, y) * ScaleMatrix() * TranslationMatrix(-x, -y) * scale_vector\n */\nexport const m2ScaleAtPointHMatrix = (\n scaleVector: Vector3,\n transformOrigin: Vector3,\n decimalPlaces = Infinity): Matrix3 => {\n\n const translation = m2TranslationH(transformOrigin, decimalPlaces);\n const scale = m2ScaleH(scaleVector);\n const translationBack = m2TranslationH(v3MulScalar(transformOrigin, -1), decimalPlaces);\n const temp1 = mMul(translation, scale);\n return mMul(temp1, translationBack) as Matrix3;\n};\n\nexport const m2ScaleAtPointH = (\n scaleVector: Vector3,\n transformOrigin: Vector3,\n point: Vector3,\n decimalPlaces = Infinity): Vector3 => {\n\n const mat3h = m2ScaleAtPointHMatrix(scaleVector, transformOrigin, decimalPlaces);\n return mMulVector(mat3h, point) as Vector3;\n};\n\nexport const m2Scale = (scaleVector: Vector2): Matrix2 => {\n return [\n [scaleVector[0], 0],\n [0, scaleVector[1]],\n ];\n};\n\nexport const v2Scale = (scaleVector: Vector2, vector: Vector2): Vector2 => {\n return mMulVector(m2Scale(scaleVector), vector) as Vector2;\n};\n\n/**\n * homogeneous coordinates\n */\nexport const m2ScaleH = (scaleVector: Vector3): Matrix3 => {\n return [\n [scaleVector[0], 0, 0],\n [0, scaleVector[1], 0],\n [0, 0, 1],\n ];\n};\n\nexport const m3Scale = (scaleVector: Vector3): Matrix3 => {\n return [\n [scaleVector[0], 0, 0],\n [0, scaleVector[1], 0],\n [0, 0, scaleVector[2]],\n ];\n};\n\nexport const m3ScaleH = (scaleVector: Vector4): Matrix4 => {\n return [\n [scaleVector[0], 0, 0, 0],\n [0, scaleVector[1], 0, 0],\n [0, 0, scaleVector[2], 0],\n [0, 0, 0, 1]\n ];\n};\n\nexport const v3Scale = (scaleVector: Vector3, vector: Vector3): Vector3 => {\n return mMulVector(m3Scale(scaleVector), vector) as Vector3;\n};\n\n/**\n * Stretch, parallel to the x-axis.\n */\nexport const m2ScaleX = (scale: number): Matrix2 => {\n return [\n [scale, 0],\n [0, 1],\n ];\n};\n\n/**\n * Stretch, parallel to the x-axis - homogeneous coordinates\n */\nexport const m2ScaleXH = (scale: number): Matrix3 => {\n return [\n [scale, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Stretch in x-direction\n */\nexport const m3ScaleX = (scale: number): Matrix3 => {\n return [\n [scale, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Stretch in x-direction\n */\nexport const m3ScaleXH = (scale: number): Matrix4 => {\n return [\n [scale, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Stretch in y-direction\n */\nexport const m3ScaleY = (scale: number): Matrix3 => {\n return [\n [1, 0, 0],\n [0, scale, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Stretch in y-direction\n */\nexport const m3ScaleYH = (scale: number): Matrix => {\n return [\n [1, 0, 0, 0],\n [0, scale, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Stretch in z-direction\n */\nexport const m3ScaleZ = (scale: number): Matrix3 => {\n return [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, scale],\n ];\n};\n\n/**\n * Stretch in z-direction\n */\nexport const m3ScaleZH = (scale: number): Matrix4 => {\n return [\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, scale, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Stretch, parallel to the y-axis.\n */\nexport const m2ScaleY = (scale: number): Matrix2 => {\n return [\n [1, 0],\n [0, scale],\n ];\n};\n\n/**\n * Stretch, parallel to the y-axis - homogeneous coordinates\n */\nexport const m2ScaleYH = (scale: number): Matrix3 => {\n return [\n [1, 0, 0],\n [0, scale, 0],\n [0, 0, 1],\n ];\n};\n\n// ---------------- REFLECTION MATRICES -------------------------\n\n/**\n * Reflection about the origin.\n */\nexport const m2ReflectionOrigin = (): Matrix2 => {\n\n return [\n [-1, 0],\n [0, -1],\n ];\n};\n\n/**\n * Reflection about the origin.\n */\nexport const m2ReflectionOriginH = (): Matrix3 => {\n\n return [\n [-1, 0, 0],\n [0, -1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection about the origin in non-homogeneous coordinates\n */\nexport const m3ReflectionOrigin = (): Matrix3 => {\n\n return [\n [-1, 0, 0],\n [0, -1, 0],\n [0, 0, -1],\n ];\n};\n\n/**\n * Reflection about the origin in homogeneous coordinates\n */\nexport const m3ReflectionOriginH = (): Matrix4 => {\n\n return [\n [-1, 0, 0, 0],\n [0, -1, 0, 0],\n [0, 0, -1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Reflection about y=-x\n */\nexport const m2ReflectionYmX = (): Matrix2 => {\n\n return [\n [0, -1],\n [-1, 0],\n ];\n};\n\n/**\n * Reflection in the x-axis.\n */\nexport const m2ReflectionX = (): Matrix2 => {\n\n return [\n [1, 0],\n [0, -1],\n ];\n};\n\n/**\n * Reflection in the x-axis.\n */\nexport const m2ReflectionXH = (): Matrix3 => {\n\n return [\n [1, 0, 0],\n [0, -1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection in the y-axis.\n */\nexport const m2ReflectionY = (): Matrix2 => {\n\n return [\n [-1, 0],\n [0, 1],\n ];\n};\n\nexport const m2ReflectionYH = (): Matrix3 => {\n\n return [\n [-1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to YZ plane in non-homogeneous coordinates\n */\nexport const m3ReflectionYZ = (): Matrix3 => {\n\n return [\n [-1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to YZ plane in homogeneous coordinates\n */\nexport const m3ReflectionYZH = (): Matrix4 => {\n\n return [\n [-1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to XZ plane in non-homogeneous coordinates\n */\nexport const m3ReflectionXZ = (): Matrix3 => {\n\n return [\n [1, 0, 0],\n [0, -1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to XZ plane in homogeneous coordinates\n */\nexport const m3ReflectionXZH = (): Matrix4 => {\n\n return [\n [1, 0, 0, 0],\n [0, -1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to XY plane in non-homogeneous coordinates\n */\nexport const m3ReflectionXY = (): Matrix3 => {\n\n return [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, -1],\n ];\n};\n\n/**\n * Reflection relative to XY plane in homogeneous coordinates\n */\nexport const m3ReflectionXYH = (): Matrix4 => {\n\n return [\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, -1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n// ---------------- SHEARING MATRICES -------------------------\n\n\n/**\n * Shearing in y-axis, with x-axis fixed with (0,1) moving to (factor, 1)\n */\nexport const m2ShearingY = (factor: number): Matrix2 => {\n\n return [\n [1, factor],\n [0, 1],\n ];\n};\n\n/**\n * Shearing in x-axis, with y-axis fixed with (1,0) moving to (1, factor)\n */\nexport const m2ShearingX = (factor: number): Matrix2 => {\n\n return [\n [1, 0],\n [factor, 1],\n ];\n};", "import { setDecimalPlaces } from './format';\n\n/**\n * Returns a random number in the [min,max] range.\n */\nexport const getRandom = (min: number, max: number, decimalPlaces = Infinity): number => {\n return setDecimalPlaces(Math.random() * (max - min) + min, decimalPlaces);\n};\n\n/**\n * Returns a random integer number in the [min,max] range.\n */\nexport const getRandomInt = (min: number, max: number): number => {\n return Math.floor(Math.random() * (max - min + 1) + min);\n};\n\nexport const getRandomBoolean = () => Math.random() < 0.5;\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nexport const getRandomItemFromArray = (array: any[]) => {\n const randomIndex = getRandomInt(0, array.length - 1);\n return array[randomIndex];\n};", "export const stringToNumber = (value: string|undefined|null|number, defaultNumber: number) => {\n if(value === undefined || value === null) return defaultNumber;\n const res = Number(value) ?? defaultNumber;\n return isNaN(res) ? defaultNumber : res;\n};", "import { setDecimalPlaces } from './format';\nimport { Vector2, Vector3 } from '../types';\n\n/**\n * u(x) and v(x) are functions ---------->\n *\n * dx(u + v) = dx(u) + dx(v)\n * dx(u - v) = dx(u) - dx(v)\n * dx(u * v) = dx(u) * v + u * dx(v)\n * dx(u / v) = (dx(u) * v - u * dx(v)) / (v ^ 2), when v(x) != 0\n */\n\n// ------------------ Derivatives of Polynomial ---------------------------\n\n/**\n * y = 3x+2\n * dxPolynomial(10, [[3, 1], [2, 0]])\n */\nexport const dxPolynomial = (x: number, polynomial: number[][], decimalPlaces = Infinity) => {\n let res = 0;\n\n for(const part of polynomial){\n if(part.length !== 2) return NaN;\n\n const coeff = part[0];\n const power = part[1];\n res += coeff * power * Math.pow(x, power - 1);\n }\n\n return setDecimalPlaces(res, decimalPlaces);\n}\n\n// ---------------------- Bezier Curves ---------------------------\n\n/**\n * Derivative of Bezier Curve is another Bezier Curve.\n * t must min in range [0, 1]\n */\nexport const dxV2QuadraticBezierCurve = (\n t: number,\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n // The derivative: P1 * (2t-2) + (2*P3-4*P2) * t + 2 * P2\n\n const temp1 = -2 * (1 - t); // Math.pow(1 - t, 2)\n const temp2 = 2 - 4 * t; // (1 - t) * 2 * t\n const temp3 = 2 * t; //t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * centerControlPoint[0] + temp3 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * centerControlPoint[1] + temp3 * endControlPoint[1], decimalPlaces),\n ];\n};\n\nexport const dxV3QuadraticBezierCurve = (\n t: number,\n startControlPoint: Vector3,\n centerControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n\n const temp1 = -2 * (1 - t); // Math.pow(1 - t, 2)\n const temp2 = 2 - 4 * t; // (1 - t) * 2 * t\n const temp3 = 2 * t; //t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * centerControlPoint[0] + temp3 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * centerControlPoint[1] + temp3 * endControlPoint[1], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[2] + temp2 * centerControlPoint[2] + temp3 * endControlPoint[2], decimalPlaces),\n ];\n};\n\nexport const dxV2CubicBezierCurve = (\n t: number,\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const temp1 = -3 * Math.pow(1 - t, 2); //Math.pow(1 - t, 3);\n const temp2 = 3 * (t - 1) * (3 * t - 1); //Math.pow(1 - t, 2) * 3 * t;\n const temp3 = 6 * t - 9 * t * t; // (1 - t) * 3 * t * t;\n const temp4 = 3 * t * t; //t * t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * center1ControlPoint[0] + temp3 * center2ControlPoint[0] + temp4 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * center1ControlPoint[1] + temp3 * center2ControlPoint[1] + temp4 * endControlPoint[1], decimalPlaces),\n ];\n};\n\nexport const dxV3CubicBezierCurve = (\n t: number,\n startControlPoint: Vector3,\n center1ControlPoint: Vector3,\n center2ControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n\n const temp1 = -3 * Math.pow(1 - t, 2); //Math.pow(1 - t, 3);\n const temp2 = 3 * (t - 1) * (3 * t - 1); //Math.pow(1 - t, 2) * 3 * t;\n const temp3 = 6 * t - 9 * t * t; // (1 - t) * 3 * t * t;\n const temp4 = 3 * t * t; //t * t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * center1ControlPoint[0] + temp3 * center2ControlPoint[0] + temp4 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * center1ControlPoint[1] + temp3 * center2ControlPoint[1] + temp4 * endControlPoint[1], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[2] + temp2 * center1ControlPoint[2] + temp3 * center2ControlPoint[2] + temp4 * endControlPoint[2], decimalPlaces),\n ];\n};\n\n\n// ----------------- Derivatives of trigonometry functions ---------------------------\n\nexport const dxSin = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(Math.cos(x), decimalPlaces);\n};\n\nexport const dxCos = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(-Math.sin(x), decimalPlaces);\n};\n\nexport const dxTan = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(1 / (Math.cos(x) ** 2), decimalPlaces);\n};\n\n/**\n * x != Math.PI * n, where n is an integer\n */\nexport const dxCot = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(-1 / (Math.sin(x) ** 2), decimalPlaces);\n};\n\n/**\n * -1 < x < 1\n */\nexport const dxArcSin = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(1 / (Math.sqrt(1 - x ** 2)), decimalPlaces);\n};\n\n/**\n * -1 < x < 1\n */\nexport const dxArcCos = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(-1 / (Math.sqrt(1 - x ** 2)), decimalPlaces);\n};\n\nexport const dxArcTan = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(1 / (1 + x ** 2), decimalPlaces);\n};\n\nexport const dxArcCot = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(-1 / (1 + x ** 2), decimalPlaces);\n};\n", "import { Matrix, Matrix2, Matrix3, Vector, Vector2, Vector3 } from '../../types';\nimport { m2Inverse, m3Inverse, mInverse, mMulVector, mDelLastColumn, mGetLastColumn } from '../linear-algebra/matrix';\nimport { setDecimalPlaces } from '../format';\nimport { v2Sub } from '../linear-algebra/vector';\n\n/**\n * Linear equation\n * ax + b = c\n * x = (c - b) / a; a != 0\n */\nexport const linearEquation = (equation: Vector3, decimalPlaces = Infinity) : number => {\n const a = equation[0];\n const b = equation[1];\n const c = equation[2];\n\n const diff = c - b;\n\n if(a === 0 && diff === 0) return Infinity; // any number is a solution\n if(a === 0) return NaN; // no solution\n\n return setDecimalPlaces(diff / a, decimalPlaces);\n};\n\n/**\n * System of 2 linear equations.\n * [x, y] = inverse(Matrix of equation parameters) x (vector of equation results)\n * ---------------\n * 3x + 2y = 7\n * -6x + 6y = 6\n */\nexport const linearEquationSystem2 = (equation1: Vector3, equation2: Vector3, decimalPlaces = Infinity) : Vector2 | null => {\n const equationParams: Matrix2 = [\n [equation1[0], equation1[1]],\n [equation2[0], equation2[1]],\n ];\n\n const inversed = m2Inverse(equationParams);\n if(inversed === null) return null; // no results\n\n const equationResults: Vector2 = [\n equation1[2],\n equation2[2]\n ];\n\n return mMulVector(inversed, equationResults, decimalPlaces) as Vector2;\n};\n\n/**\n * System of 3 linear equations.\n * ---------------------------------------\n * 3x + 2y + 5z = 7\n * -6x + 6y + 6z = 6\n * 2x + 7y - z = 4\n */\nexport const linearEquationSystem3 = (\n equation1: Vector,\n equation2: Vector,\n equation3: Vector,\n decimalPlaces = Infinity) : Vector3 | null => {\n const equationParams: Matrix3 = [\n [equation1[0], equation1[1], equation1[2]],\n [equation2[0], equation2[1], equation2[2]],\n [equation3[0], equation3[1], equation3[2]],\n ];\n\n const inversed = m3Inverse(equationParams);\n if(inversed === null) return null; // no results\n\n const equationResults: Vector3 = [\n equation1[3],\n equation2[3],\n equation3[3]\n ];\n\n return mMulVector(inversed, equationResults, decimalPlaces) as Vector3;\n};\n\n/**\n * System of N linear equations.\n */\nexport const linearEquationSystemN = (equations: Matrix, decimalPlaces = Infinity) : Vector | null => {\n if(equations.length <= 0) return null;\n\n const equationParams = mDelLastColumn(equations);\n\n const inversed = mInverse(equationParams);\n if(inversed === null) return null; // no results\n\n // the last column of the equations matrix\n const equationResults = mGetLastColumn(equations);\n\n return mMulVector(inversed, equationResults, decimalPlaces) as Vector;\n};\n\n/**\n * Calculate the equation of a line given two points in a 2D space.\n * y = ax + b\n * y - y1 = m(x - x1)\n * m = (y2 - y1) / (x2 - x1)\n */\nexport const getLinearEquationBy2Points = (point1: Vector2, point2: Vector2) : {\n slope: number|undefined,\n yIntercept: number|undefined,\n xIntercept: number|undefined,\n formula: string,\n} => {\n const [deltaX, deltaY] = v2Sub(point2, point1);\n const [x, y] = point1;\n\n if(deltaX === 0) {\n return {\n slope: undefined,\n xIntercept: x,\n yIntercept: undefined,\n formula: `x = ${ x }`,\n };\n }\n\n const m = deltaY / deltaX;\n const b = y - m * x;\n let formula = '';\n\n if(m === 0) {\n formula = `y = ${ b }`;\n }\n else{\n formula = `y = ${ m === 1 ? '' : m }x`;\n\n if(b !== 0) {\n formula += ` ${ b < 0 ? '-' : '+' } ${ Math.abs(b) }`;\n }\n }\n\n return {\n slope: m,\n xIntercept: undefined,\n yIntercept: b,\n formula,\n };\n};", "import { Vector } from '../../types';\nimport { setDecimalPlaces } from '../format';\nimport { linearEquation } from './linear-equations';\nimport { isNumber } from '../other';\n\n/**\n * Quadratic Equation.\n * ax^2 + bx + c = d\n */\nexport const quadraticEquation = (equation: Vector, decimalPlaces = Infinity) : Vector => {\n const a = equation[0];\n const b = equation[1];\n const c = equation[2];\n const d = equation[3];\n\n if(a === 0){\n // it's a linear equation -------------------------------------------\n const res = linearEquation([b, c, d], decimalPlaces);\n if(isNumber(res)) return [res];\n return [];\n }\n\n const diff = c - d;\n\n const discriminant = b * b - (4 * a * diff);\n\n if(discriminant < 0){\n return []; // no results\n }\n\n if(discriminant === 0){\n return [ setDecimalPlaces(-b / (2 * a), decimalPlaces) ]; // 1 result\n }\n\n // if(determinant > 0) ---> 2 results\n const t1 = 2 * a;\n const t2 = Math.sqrt(discriminant);\n\n return [\n setDecimalPlaces((-b + t2) / t1, decimalPlaces),\n setDecimalPlaces((-b - t2) / t1, decimalPlaces),\n ];\n};", "import { IBBox, Vector, Vector2, Vector3 } from '../../types';\nimport { setDecimalPlaces } from '../format';\nimport {\n dxV2CubicBezierCurve,\n dxV2QuadraticBezierCurve,\n dxV3CubicBezierCurve,\n dxV3QuadraticBezierCurve\n} from '../derivative';\nimport { v2Normalize, v3Normalize } from '../linear-algebra/vector';\nimport { linearEquation } from '../equations/linear-equations';\nimport { quadraticEquation } from '../equations/quadratic-equations';\nimport { isNumber } from '../other';\n\n/**\n * B\u00E9zier Curves\n * quadratic: y = P1 * (1-t)\u00B2 + P2 * 2 * (1-t)t + P3 * t\u00B2\n * t in range [0, 1]\n */\n\n// -------------------- GET POINT ON CURVE --------------------------\n\n/**\n * Get a point on a quadratic B\u00E9zier curve as a function of time.\n */\nexport const v2QuadraticBezierCurve = (\n t: number,\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const temp1 = Math.pow(1 - t, 2);\n const temp2 = (1 - t) * 2 * t;\n const temp3 = t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * centerControlPoint[0] + temp3 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * centerControlPoint[1] + temp3 * endControlPoint[1], decimalPlaces),\n ];\n};\n\nexport const v3QuadraticBezierCurve = (\n t: number,\n startControlPoint: Vector3,\n centerControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n\n const temp1 = Math.pow(1 - t, 2);\n const temp2 = (1 - t) * 2 * t;\n const temp3 = t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * centerControlPoint[0] + temp3 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * centerControlPoint[1] + temp3 * endControlPoint[1], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[2] + temp2 * centerControlPoint[2] + temp3 * endControlPoint[2], decimalPlaces),\n ];\n};\n\n/**\n * Get a point on a cubic B\u00E9zier curve as a function of time.\n */\nexport const v2CubicBezierCurve = (\n t: number,\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const temp1 = Math.pow(1 - t, 3);\n const temp2 = Math.pow(1 - t, 2) * 3 * t;\n const temp3 = (1 - t) * 3 * t * t;\n const temp4 = t * t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * center1ControlPoint[0] + temp3 * center2ControlPoint[0] + temp4 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * center1ControlPoint[1] + temp3 * center2ControlPoint[1] + temp4 * endControlPoint[1], decimalPlaces),\n ];\n};\n\nexport const v3CubicBezierCurve = (\n t: number,\n startControlPoint: Vector3,\n center1ControlPoint: Vector3,\n center2ControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n\n const temp1 = Math.pow(1 - t, 3);\n const temp2 = Math.pow(1 - t, 2) * 3 * t;\n const temp3 = (1 - t) * 3 * t * t;\n const temp4 = t * t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * center1ControlPoint[0] + temp3 * center2ControlPoint[0] + temp4 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * center1ControlPoint[1] + temp3 * center2ControlPoint[1] + temp4 * endControlPoint[1], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[2] + temp2 * center1ControlPoint[2] + temp3 * center2ControlPoint[2] + temp4 * endControlPoint[2], decimalPlaces),\n ];\n};\n\n// -------------------- TANGENT --------------------------\n\n/**\n * Tangent indicates the direction of travel at specific points along the B\u00E9zier curve,\n * and is literally just the first derivative of our curve.\n */\nexport const v2QuadraticBezierCurveTangent = (\n t: number,\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n const dxVector = dxV2QuadraticBezierCurve(t, startControlPoint, centerControlPoint, endControlPoint);\n return v2Normalize(dxVector, decimalPlaces);\n};\n\nexport const v3QuadraticBezierCurveTangent = (\n t: number,\n startControlPoint: Vector3,\n centerControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n const dxVector = dxV3QuadraticBezierCurve(t, startControlPoint, centerControlPoint, endControlPoint);\n return v3Normalize(dxVector, decimalPlaces);\n};\n\nexport const v2CubicBezierCurveTangent = (\n t: number,\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n const dxVector = dxV2CubicBezierCurve(t, startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint);\n return v2Normalize(dxVector, decimalPlaces);\n};\n\nexport const v3CubicBezierCurveTangent = (\n t: number,\n startControlPoint: Vector3,\n center1ControlPoint: Vector3,\n center2ControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n const dxVector = dxV3CubicBezierCurve(t, startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint);\n return v3Normalize(dxVector, decimalPlaces);\n};\n\n// -------------------- NORMAL --------------------------\n\n/**\n * Normal is a vector that runs at a right angle to the direction of the curve, and is typically of length 1.\n * To find it, we take the normalised tangent vector, and then rotate it by a 90 degrees.\n */\nexport const v2QuadraticBezierCurveNormal = (\n t: number,\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const tangent = v2QuadraticBezierCurveTangent(t, startControlPoint, centerControlPoint, endControlPoint, decimalPlaces);\n return [-tangent[1], tangent[0]];\n};\n\nexport const v2CubicBezierCurveNormal = (\n t: number,\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const tangent = v2CubicBezierCurveTangent(t, startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint, decimalPlaces);\n return [-tangent[1], tangent[0]];\n};\n\n// -------------------- EXTREMA --------------------------\n\n/**\n * Find maxima and minima by solving the equation B'(t) = 0\n * Returns result in [0, 1] range.\n */\nexport const v2QuadraticBezierCurveExtrema = (\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector => {\n\n /*\n (-2 * (1 - t)) * startControlPoint[0] + (2 - 4 * t) * centerControlPoint[0] + (2 * t) * endControlPoint[0]\n 2 * t * startControlPoint[0] - 4 * t * centerControlPoint[0] + 2 * t * endControlPoint[0] - 2 * startControlPoint[0] + 2 * centerControlPoint[0]\n t * (2 * startControlPoint[0] - 4 * centerControlPoint[0] + 2 * endControlPoint[0]) + (- 2 * startControlPoint[0] + 2 * centerControlPoint[0])\n */\n\n const a1 = 2 * startControlPoint[0] - 4 * centerControlPoint[0] + 2 * endControlPoint[0];\n const b1 = -2 * startControlPoint[0] + 2 * centerControlPoint[0];\n const equation1: Vector3 = [a1, b1, 0];\n const res1 = linearEquation(equation1, decimalPlaces);\n\n const a2 = 2 * startControlPoint[1] - 4 * centerControlPoint[1] + 2 * endControlPoint[1];\n const b2 = -2 * startControlPoint[1] + 2 * centerControlPoint[1];\n const equation2: Vector3 = [a2, b2, 0];\n const res2 = linearEquation(equation2, decimalPlaces);\n\n const res: Vector = [];\n\n if(isNumber(res1)){\n res.push(res1);\n }\n\n if(isNumber(res2)){\n res.push(res2);\n }\n\n return res;\n};\n\n/**\n * Find maxima and minima by solving the equation B'(t) = 0\n * Returns result in [0, 1] range.\n */\nexport const v2CubicBezierCurveExtrema = (\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2|null => {\n\n const a1 = -3 * startControlPoint[0] + 9 * center1ControlPoint[0] - 9 * center2ControlPoint[0] + 3 * endControlPoint[0];\n const b1 = 6 * startControlPoint[0] - 12 * center1ControlPoint[0] + 6 * center2ControlPoint[0];\n const c1 = -3 * startControlPoint[0] + 3 * center1ControlPoint[0];\n const equation1: Vector = [a1, b1, c1, 0];\n\n const a2 = -3 * startControlPoint[1] + 9 * center1ControlPoint[1] - 9 * center2ControlPoint[1] + 3 * endControlPoint[1];\n const b2 = 6 * startControlPoint[1] - 12 * center1ControlPoint[1] + 6 * center2ControlPoint[1];\n const c2 = -3 * startControlPoint[1] + 3 * center1ControlPoint[1];\n const equation2: Vector = [a2, b2, c2, 0];\n\n // Any value between 0 and 1 is a root that matters for B\u00E9zier curves, anything below or above that is irrelevant (because B\u00E9zier curves are only defined over the interval [0,1]).\n const res1 = quadraticEquation(equation1, decimalPlaces).filter(num => num >= 0 && num <= 1);\n const res2 = quadraticEquation(equation2, decimalPlaces).filter(num => num >= 0 && num <= 1);\n\n const res = [...res1, ...res2];\n if(res.length === 2){\n return [...res1, ...res2] as Vector2;\n }\n\n return null;\n};\n\n// -------------------- BOUNDING BOX --------------------------\n\nexport const v2QuadraticBezierBBox = (\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : IBBox => {\n\n const extrema = v2QuadraticBezierCurveExtrema(startControlPoint, centerControlPoint, endControlPoint);\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for(const percent of extrema){\n const point = v2QuadraticBezierCurve(percent, startControlPoint, centerControlPoint, endControlPoint);\n\n const x = point[0];\n const y = point[1];\n\n minX = Math.min(minX, x);\n maxX = Math.max(maxX, x);\n\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y);\n }\n\n minX = setDecimalPlaces(Math.min(minX, startControlPoint[0], endControlPoint[0]), decimalPlaces);\n maxX = setDecimalPlaces(Math.max(maxX, startControlPoint[0], endControlPoint[0]), decimalPlaces);\n minY = setDecimalPlaces(Math.min(minY, startControlPoint[1], endControlPoint[1]), decimalPlaces);\n maxY = setDecimalPlaces(Math.max(maxY, startControlPoint[1], endControlPoint[1]), decimalPlaces);\n\n return {\n x: minX,\n y: minY,\n w: Math.abs(maxX - minX),\n h: Math.abs(maxY - minY),\n x2: maxX,\n y2: maxY,\n }\n};\n\nexport const v2CubicBezierBBox = (\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : IBBox => {\n\n const extrema = v2CubicBezierCurveExtrema(startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint) || [];\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for(const percent of extrema){\n const point = v2CubicBezierCurve(percent, startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint);\n\n const x = point[0];\n const y = point[1];\n\n minX = Math.min(minX, x ?? Infinity);\n maxX = Math.max(maxX, x ?? -Infinity);\n\n minY = Math.min(minY, y ?? Infinity);\n maxY = Math.max(maxY, y ?? -Infinity);\n }\n\n minX = setDecimalPlaces(Math.min(minX, startControlPoint[0], endControlPoint[0]), decimalPlaces);\n maxX = setDecimalPlaces(Math.max(maxX, startControlPoint[0], endControlPoint[0]), decimalPlaces);\n minY = setDecimalPlaces(Math.min(minY, startControlPoint[1], endControlPoint[1]), decimalPlaces);\n maxY = setDecimalPlaces(Math.max(maxY, startControlPoint[1], endControlPoint[1]), decimalPlaces);\n\n return {\n x: minX,\n y: minY,\n w: Math.abs(maxX - minX),\n h: Math.abs(maxY - minY),\n x2: maxX,\n y2: maxY,\n }\n};\n\n\n", "import { Vector2 } from '../types';\nimport { v2Sub } from './linear-algebra/vector';\nimport { getV2Angle } from './angle';\nimport { convertRange } from './other';\n\n/**\n * Circle Equation\n * x^2 + y^2 = radius^2\n * ----------------------\n * Circle Parametric Equation\n * x(t) = radius * cos(t)\n * y(t) = radius * sin(t)\n * t is the parameter = angle\n *\n * Angle should be in the range [0, Math.PI]\n */\nexport const circleMovement = (center: Vector2, angle: number, radius: number): Vector2 => {\n angle = angle % Math.PI * 2;\n\n return [\n center[0] + Math.cos(angle) * radius,\n center[1] + Math.sin(angle) * radius\n ];\n};\n\n/**\n * Circle Movement After Mouse.\n * Mouse Positions:\n * - pageX/Y coordinates are relative to the top left corner of the whole rendered page (including parts hidden by scrolling),\n * - screenX and screenY: Relative to the top left of the physical screen/monitor, this reference point only moves if you increase or decrease the number of monitors or the monitor resolution.\n * - clientX/Y coordinates are relative to the top left corner of the visible part of the page, \"seen\" through browser window.\n * - offsetX and offsetY are relative to the parent container,\n */\nexport const circleMovementAfterMouse = (\n mouse: Vector2,\n center: Vector2,\n radius: number\n): Vector2 => {\n\n const vector = v2Sub(mouse, center);\n\n let angle = getV2Angle(vector);\n\n // convert the angle from the range [0, Math.PI*2] to the range [0, Math.PI]\n angle = convertRange(angle, 0, Math.PI*2, 0, Math.PI);\n\n return circleMovement(center, angle, radius);\n};\n\n/**\n * Ellipse Equation\n * (x - centerX)^2 / (radius1^2) + (y - centerY)^2 / (radius2^2) = 1\n * -----------------------------------------------------------------\n * Ellipse Parametric Equation\n * x(t) = radius1 * cos(t)\n * y(t) = radius2 * sin(t)\n * t is the parameter = angle\n *\n * Angle should be in the range [0, Math.PI]\n */\nexport const ellipseMovement = (center: Vector2, angle: number, radius1: number, radius2: number): Vector2 => {\n angle = angle % Math.PI * 2;\n\n return [\n center[0] + Math.cos(angle) * radius1,\n center[1] + Math.sin(angle) * radius2\n ];\n};\n\n/**\n * Ellipse Movement After Mouse.\n * Mouse Positions:\n * - pageX/Y coordinates are relative to the top left corner of the whole rendered page (including parts hidden by scrolling),\n * - screenX and screenY: Relative to the top left of the physical screen/monitor, this reference point only moves if you increase or decrease the number of monitors or the monitor resolution.\n * - clientX/Y coordinates are relative to the top left corner of the visible part of the page, \"seen\" through browser window.\n * - offsetX and offsetY are relative to the parent container,\n */\nexport const ellipseMovementAfterMouse = (\n mouse: Vector2,\n center: Vector2,\n radii: Vector2\n): Vector2 => {\n\n const vector = v2Sub(mouse, center);\n\n let angle = getV2Angle(vector);\n\n // convert the angle from the range [0, Math.PI*2] to the range [0, Math.PI]\n angle = convertRange(angle, 0, Math.PI*2, 0, Math.PI);\n\n return ellipseMovement(center, angle, radii[0], radii[1]);\n};\n\n/**\n * Sine Wave Equation (Sinusoid)\n * -----------------------------\n * const y = amplitude * Math.sin(2 * Math.PI * frequency * x + phase);\n * amplitude = the peak deviation of the function from zero\n * frequency = number of cycles\n * phase = specifies (in radians) where in its cycle the oscillation is at t = 0.\n * think of it as \"shifting\" the starting point of the function to the right (positive p) or left (negative)\n */\nexport const sineWaveMovement = (x: number, amplitude: number, frequency: number, phase: number) : Vector2 => {\n /*\n example values:\n const amplitude = 50;\n const frequency = 0.005;\n const phase = 0;\n x: [0, 1000]\n */\n const y = amplitude * Math.sin(2 * Math.PI * frequency * x + phase);\n\n return [x, y];\n};\n\n/**\n * Lissajous curve (Lissajous figure or Bowditch curve)\n * Parametric equation #1\n * f(t) = A * sin(k * t + m)\n * f(t) = B * sin(n * t)\n * 0 <= m <= PI/2\n * k, n >= 1\n * -----------------------\n * Parametric equation #2\n * f(t) = A * cos(k * t - m)\n * f(t) = B * cos(n * t - p)\n * -----------------------------\n * Shapes:\n * k = 1, n = 1, m = 0, p = 0 ---> line\n * A = B, k = 1, n = 1, m = PI/2, p = PI/2 ----> circle\n * A != B, k = 1, n = 1, m = PI/2, p = PI/2 ----> ellipse\n * k = 2, n = 2, m = PI/2, p = PI/2 ----> section of a parabola\n */\nexport const lissajousCurve = (\n width: number,\n height: number,\n t: number,\n k: number,\n n: number,\n m: number,\n p: number\n) :Vector2 => {\n return [\n width * Math.cos(k * t - m),\n height * Math.cos(n * t - p),\n ];\n};\n", "import { getRandom } from './random';\nimport { HSLColor, RGBColor } from '../types';\nimport { mod } from './other';\nimport { setDecimalPlaces } from './format';\n\n// ------------------------ RANDOM COLOR -------------------------------------\n\nexport const getRandomRGBColor = () : RGBColor => {\n const hslColor = getRandomHSLColor();\n return hslToRgb(hslColor);\n};\n\nexport const getRandomHexColor = () : string => {\n const hslColor = getRandomHSLColor();\n return hslToHex(hslColor);\n};\n\nexport const getRandomHSLColor = () : HSLColor => {\n const h = getRandom(1, 360);\n const s = getRandom(0, 100);\n const l = getRandom(0, 100);\n return [h, s, l];\n};\n\n/**\n * generate random color with the given hue\n */\nexport const getRandomHSLColorWithHue = (h: number) : HSLColor => {\n const s = getRandom(0, 100);\n const l = getRandom(0, 100);\n return [h, s, l];\n};\n\n/**\n * generate random color with the given saturation\n */\nexport const getRandomHSLColorWithSaturation = (s: number) : HSLColor => {\n const h = getRandom(1, 360);\n const l = getRandom(0, 100);\n return [h, s, l];\n};\n\n/**\n * generate random color with the given lightness\n */\nexport const getRandomHSLColorWithLightness = (l: number) : HSLColor => {\n const h = getRandom(1, 360);\n const s = getRandom(0, 100);\n return [h, s, l];\n};\n\nexport const getRandomGrayscaleHSLColor = () : HSLColor => {\n const l = getRandom(0, 100);\n return [0, 0, l];\n};\n\nexport const getRandomHSLColorWithinRanges = (\n hueStart = 1, hueEnd = 360,\n saturationStart = 0, saturationEnd = 100,\n lightStart = 0, lightEnd = 100\n) : HSLColor => {\n const h = getRandom(hueStart, hueEnd);\n const s = getRandom(saturationStart, saturationEnd);\n const l = getRandom(lightStart, lightEnd);\n return [h, s, l];\n};\n\n// ----------------------- CONVERT COLORS --------------------------------------\n\n/**\n * helper: convert hue value to %\n * @param {number} h\n * @return {number} [0, 100] %\n */\nconst convertHueToPercent = (h : number) : number => {\n\n // the hue value needs to be multiplied by 60 to convert it to degrees\n h *= 60;\n\n // if hue becomes negative, you need to add 360 to, because a circle has 360 degrees\n if(h < 0){\n h += 360;\n }\n\n // convert huw to %\n return h * 100 / 360;\n};\n\n/**\n * get hue from RGB\n * @param {number} r [0, 255]\n * @param {number} g [0, 255]\n * @param {number} b [0, 255]\n * @param {number|undefined=} min - min number of [r, g, b]\n * @param {number|undefined=} max - max number of [r, g, b]\n * @return {number} [0, 100] % - we use here % instead of [0, 359] degrees\n */\nconst getHue = (r : number, g : number, b : number, min : number | undefined = undefined, max : number | undefined = undefined) : number => {\n\n // find the minimum and maximum values of r, g, and b if they are not provided\n min = (min === undefined) ? Math.min(r, g, b) : min;\n max = (min === undefined) ? Math.max(r, g, b) : max;\n\n // if the min and max value are the same -> no hue, as it's gray\n if(min === max) return 0;\n\n // if red is max\n if(max === r){\n return convertHueToPercent((g - b) / (max - min));\n }\n\n // if green is max\n if(max === g){\n return convertHueToPercent(2.0 + (b - r) / (max - min));\n }\n\n // if blue is max\n if(max === b){\n return convertHueToPercent(4.0 + (r - g) / (max - min));\n }\n\n return 0;\n};\n\n/**\n * get luminance from RGB\n * @param {number} r [0, 255]\n * @param {number} g [0, 255]\n * @param {number} b [0, 255]\n * @param {number|undefined=} min - min number of [r, g, b]\n * @param {number|undefined=} max - max number of [r, g, b]\n * @return {number} [0, 100] %\n */\nconst getLuminance = (\n r : number,\n g : number,\n b : number,\n min : number | undefined = undefined,\n max : number | undefined = undefined) : number => {\n\n // find the minimum and maximum values of r, g, and b if they are not provided\n min = (min === undefined) ? Math.min(r, g, b) : min;\n max = (min === undefined) ? Math.max(r, g, b) : max;\n\n // calculate the luminance value\n // @ts-ignore\n const l = (min + max) / 2; // [0, 1]\n\n // return l value in %\n return l * 100;\n};\n\n/**\n * get saturation from RGB\n * @param {number} r [0, 255]\n * @param {number} g [0, 255]\n * @param {number} b [0, 255]\n * @param {number|undefined=} min - min number of [r, g, b]\n * @param {number|undefined=} max - max number of [r, g, b]\n * @param {number|undefined=} l - luminance in [0, 100] %\n * @return {number} [0, 100] %\n */\nconst getSaturation = (\n r : number,\n g : number,\n b : number,\n min : number | undefined = undefined,\n max : number | undefined = undefined,\n l : number | undefined = undefined) : number => {\n\n // find the minimum and maximum values of r, g, and b if they are not provided\n min = (min === undefined) ? Math.min(r, g, b) : min;\n max = (min === undefined) ? Math.max(r, g, b) : max;\n\n // if the min and max value are the same -> no saturation, as it's gray\n if(min === max) return 0;\n\n // calculate luminance if it's not provided\n l = (l === undefined) ? getLuminance(r, g, b) : l;\n\n // check the level of luminance\n const s = (l <= 50) ?\n // @ts-ignore\n ((max - min) / (max + min)) : // this formula is used when luminance <= 50%\n // @ts-ignore\n (max - min) / (2.0 - max - min); // this formula is used when luminance > 50%\n\n // return saturation in %\n return s * 100;\n};\n\nexport const rgbToHsl = (rgb: RGBColor, decimalPlaces = Infinity): HSLColor => {\n\n // convert rgb values to the range [0, 1]\n const r = rgb[0] / 255;\n const g = rgb[1] / 255;\n const b = rgb[2] / 255;\n\n // find the minimum and maximum values of r, g, and b\n const min = Math.min(r, g, b);\n const max = Math.max(r, g, b);\n\n // calculate the luminance value in %\n const l = getLuminance(r, g, b, min, max);\n\n // calculate the saturation in %\n const s = getSaturation(r, g, b, min, max, l);\n\n // calculate the hue in % (not in degrees!)\n const h = getHue(r, g, b, min, max);\n\n if(h > 360 || s > 100 || l > 100){\n return [0, 0, 100];\n }\n\n if(h < 0 || s < 0 || l < 0){\n return [0, 0, 0];\n }\n\n return [\n setDecimalPlaces(h, decimalPlaces),\n setDecimalPlaces(s, decimalPlaces),\n setDecimalPlaces(l, decimalPlaces),\n ];\n};\n\n/**\n * helper: HSL to RGB\n */\nconst hslToRgbHelper = (helper1 : number, helper2 : number, colorHelper : number) : number => {\n\n // all values need to be between 0 and 1\n // if you get a negative value you need to add 1 to it\n if(colorHelper < 0) colorHelper += 1;\n\n // if you get a value above 1 you need to subtract 1 from it.\n if(colorHelper > 1) colorHelper -= 1;\n\n if(colorHelper * 6 < 1) return helper2 + (helper1 - helper2) * 6 * colorHelper;\n\n if(colorHelper * 2 < 1) return helper1;\n\n if(colorHelper * 3 < 2){\n return helper2 + (helper1 - helper2) * (0.666 - colorHelper) * 6;\n }\n else{\n return helper2;\n }\n};\n\nexport const hslToRgb = (hsl: HSLColor, decimalPlaces = Infinity): RGBColor => {\n\n // convert all values to [0, 1] from %\n const h = hsl[0] / 100;\n const s = hsl[1] / 100;\n const l = hsl[2] / 100;\n\n // if there is no saturation -> it\u2019s grey\n if(s === 0){\n // convert the luminance from [0, 1] to [0, 255]\n const gray = l * 255;\n return [gray, gray, gray];\n }\n\n // check the level of luminance\n const helper1 = (l < 0.5) ?\n (l * (1.0 + s)) :\n (l + s - l * s);\n\n const helper2 = 2 * l - helper1;\n\n const rHelper = h + 0.333;\n const gHelper = h;\n const bHelper = h - 0.333;\n\n let r = hslToRgbHelper(helper1, helper2, rHelper);\n let g = hslToRgbHelper(helper1, helper2, gHelper);\n let b = hslToRgbHelper(helper1, helper2, bHelper);\n\n // convert rgb to [0, 255]\n r *= 255;\n g *= 255;\n b *= 255;\n\n if(r > 255 || g > 255 || b > 255){\n return [255, 255, 255];\n }\n\n if(r < 0 || g < 0 || b < 0){\n return [0, 0, 0];\n }\n\n return [\n setDecimalPlaces(r, decimalPlaces),\n setDecimalPlaces(g, decimalPlaces),\n setDecimalPlaces(b, decimalPlaces),\n ];\n};\n\n/**\n * HSL to hex\n * hslToHex(360, 100, 50) // [360, 100, 5] ==> \"#ff0000\" (red)\n */\nexport const hslToHex = (hsl: HSLColor) => {\n\n if(hsl[0] > 360 || hsl[1] > 100 || hsl[2] > 100){\n return '#ffffff';\n }\n\n if(hsl[0] < 0 || hsl[1] < 0 || hsl[2] < 0){\n return '#000000';\n }\n\n const h = hsl[0] / 360;\n const s = hsl[1] / 100;\n const l = hsl[2] / 100;\n\n let r, g, b;\n if (s === 0) {\n r = g = b = l; // achromatic\n } else {\n const hue2rgb = (p: number, q: number, t: number) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n const toHex = (x: number) => {\n const hex = Math.round(x * 255).toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n };\n\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n};\n\n// ----------------------- GET SHIFTED COLORS --------------------------------------\n\nexport const getShiftedHue = (color: HSLColor, shift = 180) : HSLColor => {\n let hue = color[0];\n hue += shift;\n\n if (hue > 360 || hue < 0) {\n hue = mod(hue, 360);\n }\n\n return [hue, color[1], color[2]];\n};\n\nexport const getShiftedLightness = (color: HSLColor, shift = 10) : HSLColor => {\n let lightness = color[2];\n lightness += shift;\n\n if (lightness > 100 || lightness < 0) {\n lightness = mod(lightness, 100);\n }\n\n return [color[0], color[1], lightness];\n};\n\nexport const getShiftedSaturation = (color: HSLColor, shift = 10) : HSLColor => {\n let saturation = color[1];\n saturation += shift;\n\n if (saturation > 100) {\n saturation -= 100;\n }\n\n if(saturation < 0){\n saturation += 100;\n }\n\n return [color[0], saturation, color[2]];\n};\n", "/**\n * guid like '932ade5e-c515-4807-ac01-73b20ab3fb66'\n */\nexport const guid = () => {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = Math.random() * 16 | 0;\n return (c == 'x' ? r : r & 0x3 | 0x8).toString(16);\n });\n};\n\n/**\n * id like 'df4unio1opulby2uqh4'\n */\nexport const newId = () => {\n return Math.random().toString(36).substring(2) + (new Date()).getTime().toString(36);\n};\n", "import { setDecimalPlaces } from './format';\n\n/**\n * get the side of a square inscribed in a circle\n */\nexport const getSquareInCircleSide = (radius: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(radius * 2 / Math.sqrt(2), decimalPlaces);\n};\n", "import { ICircle, IPolygon, IRect, Matrix2, Vector2 } from '../types';\nimport { mod } from './other';\nimport { v2GetNormal, v2DotProduct } from './linear-algebra/vector';\n\n/**\n * Rectangles collision detection.\n * Rectangles should not be rotated.\n * The algorithm works by ensuring there is no gap between any of the 4 sides of the rectangles.\n * Any gap means a collision does not exist.\n * Returns true if collision is detected.\n */\nexport const rectCollide = (rect1: IRect, rect2: IRect) : boolean => {\n return rect1.x <= rect2.x + rect2.w &&\n rect1.x + rect1.w >= rect2.x &&\n rect1.y <= rect2.y + rect2.h &&\n rect1.h + rect1.y >= rect2.y;\n};\n\n/**\n * Circles collision detection.\n * This algorithm works by taking the center points of the two circles\n * and ensuring the distance between the center points\n * are less than the two radii added together.\n * Returns true if collision is detected.\n */\nexport const circleCollide = (circle1: ICircle, circle2: ICircle) => {\n const dx = Math.abs(circle1.cx - circle2.cx);\n const dy = Math.abs(circle1.cy - circle2.cy);\n const distance = Math.sqrt(dx * dx + dy * dy);\n return distance <= circle1.r + circle2.r;\n};\n\n//-------------------- Separating Axis Theorem (SAT) Collision detection -------------------------\n\nconst getEdges = (poly: IPolygon) : Matrix2[] => {\n const edges: Matrix2[] = [];\n\n for(let i= 0; i {\n const edges: Matrix2[] = [];\n\n // collect polygon edges, and combine then into a single array\n edges.push(...getEdges(poly1));\n edges.push(...getEdges(poly2));\n\n // for each edge, find the normal vector and project both polygons onto it\n for (const edge of edges) {\n const normal = v2GetNormal(edge[0], edge[1]);\n const p1Proj = projectPolygon(poly1, normal);\n const p2Proj = projectPolygon(poly2, normal);\n\n // Check if the projections overlap\n const isOverlap = p1Proj.max >= p2Proj.min && p2Proj.max >= p1Proj.min;\n\n // Check if the projections overlap; if not, the polygons do not collide\n if (!isOverlap) return false;\n }\n\n // If all tests pass, the polygons overlap and collide\n return true;\n};\n\n/**\n * Project every polygon point onto the normal.\n * Then find min and max.\n */\nconst projectPolygon = (polygon: IPolygon, normal: Vector2): { min: number, max: number } => {\n let min = Infinity;\n let max = -Infinity;\n\n // Project each vertex of the polygon onto the axis\n for (const vertex of polygon) {\n const projection = v2DotProduct(vertex, normal);\n min = Math.min(min, projection);\n max = Math.max(max, projection);\n }\n\n return { min, max };\n};", "export interface IAnimationProps {\n duration?: number;\n callback: (result: IAnimationResult) => void;\n restartOnResize?: boolean;\n resizeCallback?: (_entries: ResizeObserverEntry[], _observer: ResizeObserver) => void;\n}\n\nexport interface IAnimationResult {\n start: () => void;\n stop: () => void;\n pause: () => void;\n resume: () => void;\n restart: () => void;\n isAnimating: () => boolean;\n getStartTime: () => number|undefined;\n getElapsedTime: () => number|undefined;\n getPercent: () => number|undefined;\n getResizeObserver: () => ResizeObserver|undefined;\n}\n\nexport const animate = (props: IAnimationProps) : IAnimationResult => {\n\n const _duration = props.duration !== undefined ? props.duration : Infinity;\n\n let startTime: number|undefined = undefined; // in milliseconds\n let animationId: number|undefined = undefined;\n\n // the time elapsed since the start of the animation (in milliseconds)\n let elapsed: number|undefined = undefined;\n let previousTimeStamp: number|undefined = undefined;\n\n let animating = false;\n let observer: ResizeObserver|undefined = undefined;\n\n // -------------------- COMMANDS ---------------------\n\n const stop = () => {\n startTime = undefined;\n elapsed = undefined;\n previousTimeStamp = undefined;\n animating = false;\n\n /*if(observer !== undefined){\n observer.disconnect();\n observer = undefined;\n }*/\n\n if(animationId === undefined) return;\n window.cancelAnimationFrame(animationId);\n };\n\n const restart = () => {\n stop();\n start();\n };\n\n const pause = () => {\n animating = false;\n };\n\n const resume = () => {\n animating = true;\n };\n\n /**\n * Animation Step.\n * @param {number} timeStamp in milliseconds\n */\n const step = (timeStamp: DOMHighResTimeStamp) => {\n\n if (startTime === undefined) {\n startTime = timeStamp;\n }\n\n // the time elapsed since the start of the animation (in milliseconds)\n elapsed = timeStamp - startTime;\n\n if (animating && previousTimeStamp !== timeStamp && typeof props.callback === 'function') {\n\n // do the rendering .............\n props.callback(getResult());\n }\n\n if(elapsed <= _duration){\n previousTimeStamp = timeStamp;\n animationId = window.requestAnimationFrame(step);\n }\n else{\n stop();\n }\n };\n\n const observerHandler = (_entries: ResizeObserverEntry[], _observer: ResizeObserver) => {\n restart();\n\n if(typeof props.resizeCallback === 'function'){\n props.resizeCallback(_entries, _observer);\n }\n };\n\n const start = () => {\n startTime = undefined;\n elapsed = undefined;\n previousTimeStamp = undefined;\n animating = true;\n\n if(props.restartOnResize && window.ResizeObserver && observer === undefined){\n observer = new ResizeObserver(observerHandler);\n observer.observe(document.body, { box: 'border-box' });\n }\n else{\n animationId = window.requestAnimationFrame(step);\n }\n };\n\n // --------------- GET INFO ----------------------\n\n /**\n * the time elapsed since the start of the animation (in milliseconds)\n */\n const getElapsedTime = () : number|undefined => {\n return elapsed;\n };\n\n const isAnimating = () => {\n return animating;\n };\n\n const getStartTime = () => {\n return startTime;\n };\n\n const getPercent = () => {\n if(_duration === Infinity || elapsed === undefined) return undefined;\n return elapsed * 100 / _duration;\n };\n\n const getResizeObserver = () => {\n return observer;\n };\n\n const getResult = () : IAnimationResult => {\n return {\n\n // commands --------------\n start,\n stop,\n pause,\n resume,\n restart,\n\n // information -------\n isAnimating,\n getElapsedTime,\n getStartTime,\n getPercent,\n getResizeObserver,\n };\n };\n\n return getResult();\n};\n", "import { setDecimalPlaces, Vector2 } from 'mz-math';\n\nexport interface ISvg {\n cx: number;\n cy: number;\n radius: number;\n size: number;\n thickness: number;\n border: number;\n startAngleDeg: number;\n endAngleDeg: number;\n}\n\nexport const getSvg = (\n circleRadius: number,\n circleThickness: number,\n circleBorder: number,\n maxPointerRadius: number,\n startAngleDeg: number,\n endAngleDeg: number\n) : ISvg => {\n\n const thickness = circleThickness + circleBorder * 2;\n\n const diff = Math.max(0, maxPointerRadius * 2 - thickness);\n const size = circleRadius * 2 + thickness + diff;\n\n const [ cx, cy ] = getSVGCenter(\n circleRadius,\n maxPointerRadius,\n circleThickness,\n circleBorder\n );\n\n return {\n cx,\n cy,\n radius: circleRadius,\n size,\n thickness: circleThickness,\n border: circleBorder,\n startAngleDeg,\n endAngleDeg\n } as ISvg;\n};\n\nconst getSVGCenter = (\n circleRadius: number,\n maxPointerRadius: number,\n circleThickness: number,\n circleBorder: number\n) : Vector2 => {\n\n const size = getSVGSize(\n circleRadius,\n maxPointerRadius,\n circleThickness,\n circleBorder\n );\n\n const val = setDecimalPlaces(size/2, 2);\n\n return [\n val,\n val,\n ];\n};\n\nconst getSVGSize = (\n circleRadius: number,\n maxPointerRadius: number,\n circleThickness: number,\n circleBorder: number\n) : number => {\n const thickness = circleThickness + circleBorder * 2;\n const diff = Math.max(0, maxPointerRadius * 2 - thickness);\n return circleRadius * 2 + thickness + diff;\n};", "// Data Defaults --------------------\nexport const DEFAULT_MIN = 0;\nexport const DEFAULT_MAX = 100;\nexport const DEFAULT_STEP = 1;\nexport const DEFAULT_ARROW_STEP = 1;\nexport const DEFAULT_ROUND = 0;\n\n// Path Defaults ---------------------\nexport const DEFAULT_PATH_START_ANGLE = 0;\nexport const DEFAULT_PATH_END_ANGLE = 360;\nexport const DEFAULT_PATH_RADIUS = 150;\nexport const DEFAULT_PATH_THICKNESS = 5;\nexport const DEFAULT_PATH_BG_COLOR = '#efefef';\nexport const DEFAULT_PATH_BORDER = 0;\nexport const DEFAULT_PATH_BORDER_COLOR = '#444444';\n\n// Pointer Defaults ------------------\nexport const DEFAULT_POINTER_RADIUS = 10;\nexport const DEFAULT_POINTER_BG_COLOR = '#163a86';\nexport const DEFAULT_POINTER_BG_COLOR_SELECTED = '#000';\nexport const DEFAULT_POINTER_BG_COLOR_DISABLED = '#a8a8a8';\nexport const DEFAULT_POINTER_BORDER = 0;\nexport const DEFAULT_POINTER_BORDER_COLOR = '#000';\n\n// Connection Defaults ------------------\nexport const DEFAULT_CONNECTION_BG_COLOR = '#5daed2';\nexport const DEFAULT_CONNECTION_BG_COLOR_DISABLED = '#97b0bb';\n\n// Text Defaults ------------------------\nexport const DEFAULT_TEXT_COLOR = '#000';\nexport const DEFAULT_TEXT_FONT_SIZE = 16;\n\n// Ticks Defaults -----------------------\nexport const DEFAULT_TICKS_WIDTH = 3;\nexport const DEFAULT_TICKS_HEIGHT = 20;\nexport const DEFAULT_TICKS_COLOR = '#efefef';\nexport const DEFAULT_TICKS_VALUES_COLOR = '#000';\nexport const DEFAULT_TICKS_VALUES_FONT_SIZE = 12;\nexport const DEFAULT_TICKS_GROUP_SIZE = 10;\nexport const DEFAULT_TICKS_VALUES_DISTANCE = 15;\n\n\n", "import { isNumber } from 'mz-math';\n\nexport const getNumber = (value: number|string|undefined|null, defaultValue: number) : number => {\n return isNumber(value) ? Number(value) : defaultValue;\n};\n\nexport const getString = (value: string|undefined|null, defaultValue: string) : string => {\n return value === undefined || value === null ? defaultValue : value;\n};\n\nexport const getBoolean = (value: boolean|undefined|null, defaultValue: boolean) : boolean => {\n return value === undefined || value === null ? defaultValue : value;\n};", "import { mod } from 'mz-math';\n\nexport interface ICircle {\n strokeDasharray: string;\n strokeOffset: number;\n}\n\nexport const isAngleInArc = (startAngleDeg: number, endAngleDeg: number, currentDegrees: number) : boolean => {\n\n if(startAngleDeg > endAngleDeg) {\n endAngleDeg += 360;\n }\n\n return currentDegrees >= startAngleDeg && currentDegrees <= endAngleDeg ||\n (currentDegrees + 360) >= startAngleDeg && (currentDegrees + 360) <= endAngleDeg;\n};\n\nexport const getAnglesDistance = (startAngle: number, endAngle: number) => {\n if(endAngle < startAngle) {\n endAngle += 360;\n }\n\n const diff = endAngle - startAngle;\n const diffMod = mod(diff, 360);\n\n return diffMod === 0 && diff > 0 ? 360 : diffMod;\n};\n\nexport const getCircle = (\n startAngleDeg: number,\n endAngleDeg: number,\n radius: number,\n) : ICircle => {\n\n if(startAngleDeg > endAngleDeg) {\n endAngleDeg += 360;\n }\n\n const circumference = 2 * Math.PI *radius;\n\n if(startAngleDeg > endAngleDeg) {\n endAngleDeg += 360;\n }\n\n const angleDiff = endAngleDeg - startAngleDeg;\n const strokeOffset = -(startAngleDeg / 360) * circumference;\n const strokeDasharray = (angleDiff / 360) * circumference;\n const complement = circumference - strokeDasharray;\n\n return {\n strokeDasharray: [ strokeDasharray, complement ].join(' '),\n strokeOffset,\n } as ICircle;\n};", "import {\n Vector2,\n newId,\n convertRange,\n mod,\n setDecimalPlaces,\n v2Sub,\n radiansToDegrees,\n degreesToRadians, circleMovement, v2Distance\n} from 'mz-math';\nimport { ISettings } from './settings-provider';\nimport {\n DEFAULT_PATH_END_ANGLE,\n DEFAULT_PATH_START_ANGLE,\n DEFAULT_POINTER_BG_COLOR, DEFAULT_POINTER_BG_COLOR_DISABLED, DEFAULT_POINTER_BG_COLOR_SELECTED,\n DEFAULT_POINTER_BORDER,\n DEFAULT_POINTER_BORDER_COLOR,\n DEFAULT_POINTER_RADIUS,\n} from './defaults-provider';\nimport { getBoolean, getNumber, getString } from './common-provider';\nimport { IData } from './data-provider';\nimport { getAnglesDistance } from './circle-provider';\n\nexport interface IPointer {\n id: string;\n index: number;\n radius: number;\n angleDeg: number;\n bgColor: string;\n bgColorSelected: string;\n bgColorDisabled: string;\n border: number;\n borderColor: string;\n disabled: boolean;\n ariaLabel?: string;\n}\n\nexport interface IPointers {\n pointers: IPointer[];\n maxRadius: number;\n}\n\nexport const getAngleByMouse = (\n $svg: SVGSVGElement,\n clientX: number,\n clientY: number,\n cx: number,\n cy: number,\n rx: number,\n ry: number\n) => {\n const { left, top } = $svg.getBoundingClientRect();\n\n const relativeMouse: Vector2 = [\n clientX - left,\n clientY - top,\n ];\n\n const vector = v2Sub(relativeMouse, [ cx, cy ]);\n\n let angleRad = Math.atan2(vector[1] / ry, vector[0] / rx);\n if(angleRad < 0){\n angleRad += 2 * Math.PI;\n }\n\n return radiansToDegrees(angleRad);\n};\n\nexport const angle2value = (data: IData, angle: number, pathStartAngle: number, pathEndAngle: number) : string | number => {\n\n if(pathEndAngle < pathStartAngle) {\n pathEndAngle += 360;\n }\n\n if(angle < pathStartAngle){\n angle += 360;\n }\n\n let value: string|number = convertRange(angle, pathStartAngle, pathEndAngle, data.min, data.max);\n\n if(data.data.length > 0) {\n const index = Math.round(value);\n value = data.data[index];\n }\n else{\n value = setDecimalPlaces(value, data.round);\n }\n\n return value;\n};\n\nconst value2angle = (data: IData, value: string | number, pathStartAngle: number, pathEndAngle: number) => {\n let _value: number;\n\n if(pathEndAngle < pathStartAngle) {\n pathEndAngle += 360;\n }\n\n if(data.data.length > 0) {\n const valueIndex = data.data.findIndex(item => item === value);\n _value = valueIndex === -1 ? 0 : valueIndex;\n }\n else{\n _value = typeof value !== 'number' ? data.min : value;\n }\n\n return mod(convertRange(_value, data.min, data.max, pathStartAngle, pathEndAngle), 360);\n};\n\nconst initPointers = (\n settings: ISettings,\n data: IData\n) : IPointer[] => {\n\n if(!settings || !settings.pointers || settings.pointers.length < 0 || !data) {\n return [{\n id: newId(),\n index: 0,\n radius: DEFAULT_POINTER_RADIUS,\n angleDeg: mod(getNumber(settings.pathStartAngle, DEFAULT_PATH_START_ANGLE), 360),\n bgColor: getString(settings.pointerBgColor, DEFAULT_POINTER_BG_COLOR),\n bgColorSelected: getString(settings.pointerBgColorSelected, DEFAULT_POINTER_BG_COLOR_SELECTED),\n bgColorDisabled: getString(settings.pointerBgColorDisabled, DEFAULT_POINTER_BG_COLOR_DISABLED),\n border: getNumber(settings.pointerBorder, DEFAULT_POINTER_BORDER),\n borderColor: getString(settings.pointerBorderColor, DEFAULT_POINTER_BORDER_COLOR),\n disabled: !!settings.disabled,\n }]\n }\n\n const pointers: IPointer[] = [];\n\n for(let i=0; i {\n\n const pointers = initPointers(settings, data);\n\n return {\n pointers,\n maxRadius: getMaxRadius(pointers),\n }\n};\n\nconst getMaxRadius = (pointers: IPointer[]) : number => {\n if(pointers.length <= 0) return 0;\n\n let max = -Infinity;\n\n for(const pointer of pointers){\n max = Math.max(max, Math.max(0, pointer.radius + pointer.border/2));\n }\n\n return max;\n};\n\nexport const getClosestPointer = (\n pointers: IPointer[],\n currentPlaceDegrees: number,\n cx: number,\n cy: number,\n pathRadius: number\n) => {\n if(!pointers || pointers.length <= 0) return null;\n\n if(pointers.length === 1) return pointers[0];\n\n const angleRad = convertRange(degreesToRadians(currentPlaceDegrees), 0, Math.PI * 2, 0, Math.PI); // [0, Math.PI*2] ---> [0, Math.PI]\n const currentPointOnArc = circleMovement([ cx, cy ], angleRad, pathRadius);\n\n let min: number|undefined = undefined;\n let closestPointer: IPointer = null;\n\n const enabledPointers = pointers.filter(p => !p.disabled);\n\n for(const pointer of enabledPointers) {\n const pointerAngleRad = convertRange(degreesToRadians(pointer.angleDeg), 0, Math.PI * 2, 0, Math.PI);\n const pointOnArc = circleMovement([ cx, cy ], pointerAngleRad, pathRadius);\n const distance = v2Distance(currentPointOnArc, pointOnArc);\n\n if(min === undefined || distance < min) {\n min = distance;\n closestPointer = pointer;\n }\n }\n\n return { ...closestPointer };\n};\n\nexport const getClosestEdge = (\n startAngleDegrees: number,\n endAngleDegrees: number,\n currentPlaceDegrees: number,\n cx: number,\n cy: number,\n pathRadius: number\n) => {\n\n const angleRad = convertRange(degreesToRadians(currentPlaceDegrees), 0, Math.PI * 2, 0, Math.PI); // [0, Math.PI*2] ---> [0, Math.PI]\n const currentPointOnArc = circleMovement([ cx, cy ], angleRad, pathRadius);\n\n const startAngleRad = convertRange(degreesToRadians(startAngleDegrees), 0, Math.PI * 2, 0, Math.PI); // [0, Math.PI*2] ---> [0, Math.PI]\n const startPointOnArc = circleMovement([ cx, cy ], startAngleRad, pathRadius);\n\n const endAngleRad = convertRange(degreesToRadians(endAngleDegrees), 0, Math.PI * 2, 0, Math.PI); // [0, Math.PI*2] ---> [0, Math.PI]\n const endPointOnArc = circleMovement([ cx, cy ], endAngleRad, pathRadius);\n\n const distance1 = v2Distance(currentPointOnArc, startPointOnArc);\n const distance2 = v2Distance(currentPointOnArc, endPointOnArc);\n\n return distance1 <= distance2 ? startAngleDegrees : endAngleDegrees;\n};\n\nexport const getMinMaxDistancePointers = (pointers: IPointer[], pathStartAngle: number) : [IPointer, IPointer] | null => {\n if(!pointers || pointers.length <= 0) return null;\n\n let minDistance = undefined;\n let maxDistance = undefined;\n let minPointer = null;\n let maxPointer = null;\n\n for(const pointer of pointers) {\n\n const distance = getAnglesDistance(pathStartAngle, pointer.angleDeg);\n\n if(minDistance === undefined || distance < minDistance) {\n minPointer = pointer;\n minDistance = distance;\n }\n\n if(maxDistance === undefined || distance > maxDistance) {\n maxPointer = pointer;\n maxDistance = distance;\n }\n }\n\n if(minPointer === null || maxPointer === null) return null;\n\n return [\n minPointer,\n maxPointer\n ];\n};\n\nexport const roundToStep = (num: number, step: number) : number => {\n return step === 0 ? 0 : Math.round(num / step) * step;\n};\n", "import { angle2value, getAngleByMouse, getClosestEdge, IPointer } from '../domain/pointers-provider';\nimport {\n useEffect,\n useState,\n MouseEvent as ReactMouseEvent,\n TouchEvent as ReactTouchEvent,\n KeyboardEvent,\n useRef, useCallback, MutableRefObject\n} from 'react';\nimport { circleMovement, convertRange, degreesToRadians, Vector2 } from 'mz-math';\nimport { ISettings } from '../domain/settings-provider';\nimport { ISvg } from '../domain/svg-provider';\nimport { isAngleInArc } from '../domain/circle-provider';\nimport { IData } from '../domain/data-provider';\nimport { outlineNoneStyle } from '../domain/style-provider';\n\nexport interface IPointerProps {\n settings: ISettings;\n pointer: IPointer;\n svg: ISvg;\n $svg: SVGSVGElement;\n setPointer: (pointer: IPointer, newAngleDeg: number) => void;\n data: IData;\n}\n\nconst getPointerFill = (\n pointer: IPointer,\n pointerRef: MutableRefObject,\n bgColor: string,\n bgColorSelected: string,\n bgColorDisabled: string\n) => {\n if(pointer.disabled) return bgColorDisabled;\n\n if(document.activeElement === pointerRef.current) {\n return bgColorSelected || bgColor;\n }\n\n return bgColor;\n};\n\nconst Pointer = (props: IPointerProps) => {\n\n const pointerRef = useRef(null);\n\n const {\n pointer, svg, $svg,\n setPointer, data, settings,\n } = props;\n\n const {\n radius,\n angleDeg,\n bgColor,\n bgColorSelected,\n bgColorDisabled,\n border,\n borderColor,\n } = props.pointer;\n\n const { cx, cy } = svg;\n\n const [ center, setCenter ] = useState(null);\n const [ value, setValue ] = useState('');\n\n useEffect(() => {\n const value = angle2value(\n data,\n pointer.angleDeg,\n svg.startAngleDeg,\n svg.endAngleDeg\n );\n setValue(value === undefined ? '' : value.toString())\n }, [\n data,\n pointer.angleDeg,\n svg.startAngleDeg,\n svg.endAngleDeg,\n ]);\n\n useEffect(() => {\n const angleRad = convertRange(degreesToRadians(angleDeg), 0, Math.PI * 2, 0, Math.PI); // [0, Math.PI*2] ---> [0, Math.PI]\n const pointerCenter = circleMovement([cx, cy], angleRad, svg.radius);\n setCenter(pointerCenter);\n }, [\n angleDeg,\n cx,\n cy,\n svg.radius,\n ]);\n\n const onValueChange = useCallback((evt: MouseEvent | ReactMouseEvent | TouchEvent | ReactTouchEvent) => {\n if(!$svg || settings.disabled || pointer.disabled) return;\n\n const mouseX = evt.type.indexOf('mouse') !== -1 ? (evt as MouseEvent).clientX : (evt as TouchEvent).touches[0].clientX;\n const mouseY = evt.type.indexOf('mouse') !== -1 ? (evt as MouseEvent).clientY : (evt as TouchEvent).touches[0].clientY;\n\n const degrees = getAngleByMouse(\n $svg,\n mouseX,\n mouseY,\n svg.cx,\n svg.cy,\n svg.radius,\n svg.radius\n );\n\n let newAngleDeg;\n\n if(!isAngleInArc(\n svg.startAngleDeg,\n svg.endAngleDeg,\n degrees\n )){\n newAngleDeg = getClosestEdge(\n svg.startAngleDeg,\n svg.endAngleDeg,\n pointer.angleDeg,\n svg.cx,\n svg.cy,\n svg.radius\n );\n }\n else{\n newAngleDeg = degrees;\n }\n\n setPointer(pointer, newAngleDeg);\n }, [\n $svg,\n pointer,\n setPointer,\n svg.cx,\n svg.cy,\n svg.endAngleDeg,\n svg.radius,\n svg.startAngleDeg,\n settings.disabled,\n ]);\n\n const onMouseUp = () => {\n window.removeEventListener('mousemove', onValueChange);\n window.removeEventListener('mouseup', onValueChange);\n };\n\n const onMouseDown = (evt: ReactMouseEvent) => {\n if(settings.disabled || pointer.disabled) return;\n\n onValueChange(evt);\n\n window.addEventListener('mousemove', onValueChange);\n window.addEventListener('mouseup', onMouseUp);\n };\n\n const onKeyDown = (evt: KeyboardEvent) => {\n\n if(settings.disabled || pointer.disabled || settings.keyboardDisabled) return;\n\n switch (evt.key) {\n case 'ArrowLeft': {\n evt.preventDefault();\n setPointer(pointer, pointer.angleDeg + data.stepAngleDeg);\n break;\n }\n\n case 'ArrowRight': {\n evt.preventDefault();\n setPointer(pointer, pointer.angleDeg - data.stepAngleDeg);\n break;\n }\n\n case 'ArrowUp': {\n evt.preventDefault();\n setPointer(pointer, pointer.angleDeg - data.stepAngleDeg);\n break;\n }\n\n case 'ArrowDown': {\n evt.preventDefault();\n setPointer(pointer, pointer.angleDeg + data.stepAngleDeg);\n break;\n }\n }\n };\n\n useEffect(() => {\n const $current = pointerRef.current;\n\n const onTouch = (evt: TouchEvent | ReactTouchEvent) => {\n if(settings.disabled || pointer.disabled) return;\n\n evt.preventDefault();\n evt.stopPropagation();\n onValueChange(evt);\n };\n\n const onWheel = (evt: WheelEvent) => {\n\n if(settings.disabled || pointer.disabled || settings.mousewheelDisabled || document.activeElement !== $current) return;\n\n evt.stopPropagation();\n evt.preventDefault();\n\n const scrollTop = evt.deltaY < 0;\n\n let newAngleDeg;\n if(scrollTop) {\n newAngleDeg = pointer.angleDeg + data.stepAngleDeg;\n }\n else{\n newAngleDeg = pointer.angleDeg - data.stepAngleDeg;\n }\n\n setPointer(pointer, newAngleDeg);\n };\n\n $current?.addEventListener('touchmove', onTouch, {\n passive: false,\n });\n\n document.addEventListener('wheel', onWheel, {\n passive: false,\n });\n\n return () => {\n $current?.removeEventListener('touchmove', onTouch);\n document.removeEventListener('wheel', onWheel);\n };\n }, [\n center,\n onValueChange,\n data.stepAngleDeg,\n pointer,\n setPointer,\n settings.disabled,\n settings.mousewheelDisabled,\n ]);\n\n return (\n <>\n {\n center &&\n \n \n \n }\n \n )\n};\n\nexport default Pointer;", "export const outlineNoneStyle = {\n outline: 'none',\n};", "import { IPointer, IPointers } from '../domain/pointers-provider';\nimport Pointer from './Pointer';\nimport { ISettings } from '../domain/settings-provider';\nimport { ISvg } from '../domain/svg-provider';\nimport { IData } from '../domain/data-provider';\n\nexport interface IPointersProps {\n pointers: IPointers;\n settings: ISettings;\n svg: ISvg;\n $svg: SVGSVGElement;\n setPointer: (pointer: IPointer, newAngleDeg: number) => void;\n data: IData;\n}\n\nconst Pointers = (props: IPointersProps) => {\n\n const { pointers, settings, svg, $svg, setPointer, data } = props;\n\n return (\n <>\n {\n pointers.pointers.map(pointer => {\n\n return (\n \n )\n })\n }\n \n )\n};\n\nexport default Pointers;", "import { ISettings } from './settings-provider';\nimport { getNumber } from './common-provider';\nimport {\n DEFAULT_ARROW_STEP,\n DEFAULT_MAX,\n DEFAULT_MIN,\n DEFAULT_PATH_END_ANGLE,\n DEFAULT_PATH_START_ANGLE,\n DEFAULT_ROUND,\n DEFAULT_STEP\n} from './defaults-provider';\nimport { mod } from 'mz-math';\n\nexport interface IData {\n min: number;\n max: number;\n stepAngleDeg: number;\n arrowStepAngleDeg: number;\n round: number;\n data: (string | number)[];\n isClosedShape: boolean;\n}\n\nexport const getData = (setting: ISettings) : IData => {\n\n let min = getNumber(setting.min, DEFAULT_MIN);\n let max = getNumber(setting.max, DEFAULT_MAX);\n const step = getNumber(setting.step, DEFAULT_STEP);\n const arrowStep = getNumber(setting.arrowStep, DEFAULT_ARROW_STEP);\n const round = getNumber(setting.round, DEFAULT_ROUND);\n const data = setting.data || [];\n\n if(data.length > 0) {\n const minIndex = data.findIndex(item => item === min);\n const maxIndex = data.findIndex(item => item === max);\n\n min = minIndex === -1 ? 0 : minIndex;\n max = maxIndex === -1 ? data.length : maxIndex;\n }\n else{\n if(min > max) {\n min = max + DEFAULT_MAX;\n }\n }\n\n const pathStartAngle = getNumber(setting.pathStartAngle, DEFAULT_PATH_START_ANGLE);\n const pathEndAngle = getNumber(setting.pathEndAngle, DEFAULT_PATH_END_ANGLE);\n const isClosedShape = mod(pathStartAngle, 360) === mod(pathEndAngle, 360);\n\n const stepAngleDeg = step * 360 / (max - min);\n const arrowStepAngleDeg = arrowStep * 360 / (max - min);\n\n return {\n min,\n max,\n round,\n data,\n stepAngleDeg,\n arrowStepAngleDeg,\n isClosedShape,\n }\n};", "import { ISettings } from '../domain/settings-provider';\nimport { getBoolean, getString } from '../domain/common-provider';\nimport { DEFAULT_CONNECTION_BG_COLOR, DEFAULT_CONNECTION_BG_COLOR_DISABLED } from '../domain/defaults-provider';\nimport {\n getAngleByMouse,\n getClosestPointer,\n getMinMaxDistancePointers,\n IPointer,\n IPointers\n} from '../domain/pointers-provider';\nimport {\n MouseEvent as ReactMouseEvent,\n useCallback,\n useEffect, useRef,\n useState\n} from 'react';\nimport { getConnection, IConnection } from '../domain/connection-provider';\nimport { ISvg } from '../domain/svg-provider';\nimport { IData } from '../domain/data-provider';\nimport { mod } from 'mz-math';\n\ninterface IConnectionProps {\n settings: ISettings;\n pointers: IPointers;\n svg: ISvg;\n $svg: SVGSVGElement;\n data: IData;\n setPointer: (pointer: IPointer, newAngleDeg: number) => void;\n}\n\nconst Connection = (props: IConnectionProps) => {\n\n const { settings, pointers, $svg, svg, data, setPointer } = props;\n\n const [ connection, setConnection ] = useState(null);\n\n const rangeDraggingLastAngle = useRef();\n\n useEffect(() => {\n setConnection(getConnection(\n pointers,\n svg.radius,\n svg.cx,\n svg.cy,\n svg.startAngleDeg,\n svg.endAngleDeg\n ));\n }, [\n pointers,\n svg.radius,\n svg.cx,\n svg.cy,\n svg.startAngleDeg,\n svg.endAngleDeg\n ]);\n\n const onClick = (evt: ReactMouseEvent) => {\n if(!$svg || settings.disabled) return;\n\n const degrees = getAngleByMouse(\n $svg,\n evt.clientX,\n evt.clientY,\n svg.cx,\n svg.cy,\n svg.radius,\n svg.radius\n );\n\n const closestPointer = getClosestPointer(\n pointers.pointers,\n degrees,\n svg.cx,\n svg.cy,\n svg.radius\n );\n\n if(!closestPointer) return;\n\n setPointer(closestPointer, degrees);\n };\n\n const onValueChange = useCallback((evt: MouseEvent | ReactMouseEvent) => {\n if(!$svg || settings.disabled || !settings.rangeDragging) return;\n\n const minMaxResult = getMinMaxDistancePointers(pointers.pointers, svg.startAngleDeg);\n if(!minMaxResult) return;\n\n const [ minPointer, maxPointer ] = minMaxResult;\n\n const mouseDegrees = getAngleByMouse(\n $svg,\n evt.clientX,\n evt.clientY,\n svg.cx,\n svg.cy,\n svg.radius,\n svg.radius\n );\n\n if(rangeDraggingLastAngle.current === undefined) {\n rangeDraggingLastAngle.current = mouseDegrees;\n return;\n }\n\n const diff = (mouseDegrees - rangeDraggingLastAngle.current);\n if(diff === 0 || Math.abs(diff) < data.stepAngleDeg) return;\n\n setPointer(minPointer, mod(minPointer.angleDeg + diff, 360));\n setPointer(maxPointer, mod(maxPointer.angleDeg + diff, 360));\n\n rangeDraggingLastAngle.current = mouseDegrees;\n }, [\n $svg,\n svg.cx,\n svg.cy,\n svg.radius,\n data.stepAngleDeg,\n pointers.pointers,\n setPointer,\n settings.disabled,\n settings.rangeDragging,\n svg.startAngleDeg,\n ]);\n\n const onMouseUp = () => {\n window.removeEventListener('mousemove', onValueChange);\n window.removeEventListener('mouseup', onValueChange);\n\n rangeDraggingLastAngle.current = undefined;\n };\n\n const onMouseDown = (evt: ReactMouseEvent) => {\n if(!settings.rangeDragging || settings.disabled || pointers.pointers.length <= 1) return;\n\n onValueChange(evt);\n\n window.addEventListener('mousemove', onValueChange);\n window.addEventListener('mouseup', onMouseUp);\n };\n\n return (\n <>\n {\n !getBoolean(settings.hideConnection, false) && connection &&\n \n }\n \n )\n};\n\nexport default Connection;", "import { getMinMaxDistancePointers, IPointers } from './pointers-provider';\nimport { getAnglesDistance } from './circle-provider';\n\nexport interface IConnection {\n radius: number;\n cx: number;\n cy: number;\n\n // calculated properties ---------\n startAngleDeg: number;\n endAngleDeg: number;\n strokeDasharray: number[];\n strokeOffset: number;\n}\n\nexport const getConnection = (\n pointers: IPointers,\n radius: number,\n cx: number,\n cy: number,\n pathStartAngle: number,\n pathEndAngle: number,\n) : IConnection => {\n\n if(!pointers.pointers || pointers.pointers.length <= 0) return null;\n\n const result : IConnection = {\n radius,\n cx,\n cy,\n\n // calculated properties ---------\n startAngleDeg: pathStartAngle,\n endAngleDeg: pathStartAngle,\n strokeDasharray: [0, 0],\n strokeOffset: 0,\n };\n\n // Define start/end angles.\n if(pointers.pointers.length === 1) {\n result.startAngleDeg = pathStartAngle;\n result.endAngleDeg = pointers.pointers[0].angleDeg;\n }\n else{\n const minMaxResult = getMinMaxDistancePointers(pointers.pointers, pathStartAngle);\n if(!minMaxResult) return null;\n\n const [ minPointer, maxPointer ] = minMaxResult;\n\n result.startAngleDeg = minPointer.angleDeg;\n result.endAngleDeg = maxPointer.angleDeg;\n }\n\n const pathAnglesDistance = getAnglesDistance(pathStartAngle, pathEndAngle);\n\n if(result.startAngleDeg > result.endAngleDeg) {\n result.endAngleDeg += 360;\n }\n\n let angleDistance = getAnglesDistance(result.startAngleDeg, result.endAngleDeg);\n\n const shouldSwitch = angleDistance > pathAnglesDistance;\n\n if(shouldSwitch) {\n angleDistance = 360 - angleDistance;\n [result.startAngleDeg, result.endAngleDeg] = [result.endAngleDeg, result.startAngleDeg];\n }\n\n const circumference = 2 * Math.PI * radius;\n const strokeOffset = -(result.startAngleDeg / 360) * circumference;\n const strokeDasharray = (angleDistance / 360) * circumference;\n const complement = circumference - strokeDasharray;\n\n result.strokeDasharray = [ strokeDasharray, complement ];\n result.strokeOffset = strokeOffset;\n\n return result;\n};", "import { ISettings } from '../domain/settings-provider';\nimport { angle2value, IPointers } from '../domain/pointers-provider';\nimport { getBoolean, getNumber, getString } from '../domain/common-provider';\nimport {\n DEFAULT_TEXT_COLOR,\n DEFAULT_TEXT_FONT_SIZE\n} from '../domain/defaults-provider';\nimport { useEffect, useState } from 'react';\nimport { ISvg } from '../domain/svg-provider';\nimport { IData } from '../domain/data-provider';\n\ninterface ITextProps {\n settings: ISettings;\n pointers: IPointers;\n svg: ISvg;\n data: IData;\n}\n\nconst Text = (props: ITextProps) => {\n\n const { settings, pointers, svg, data } = props;\n\n const { cx, cy } = svg;\n const [ value, setValue ] = useState('');\n\n useEffect(() => {\n\n const values = pointers.pointers.map(pointer => angle2value(\n data,\n pointer.angleDeg,\n svg.startAngleDeg,\n svg.endAngleDeg\n ));\n\n values.sort((value1, value2) => {\n return value1.toString().localeCompare(\n value2.toString(),\n 'en',\n { numeric: true }\n );\n });\n\n const texts = values.map(value => `${ settings.textPrefix || '' }${ value }${ settings.textSuffix || '' }`);\n setValue(texts.join(' '));\n\n }, [\n data,\n pointers.pointers,\n svg.startAngleDeg,\n svg.endAngleDeg,\n settings.textPrefix,\n settings.textSuffix,\n ]);\n\n const hideText = getBoolean(settings.hideText, false);\n\n return (\n <>\n {\n !hideText &&\n \n\n { value }\n\n \n }\n \n )\n};\n\nexport default Text;", "import { useEffect, useState, Fragment } from 'react';\nimport { getTicks, getTicksSettings, ITick, ITicks } from '../domain/ticks-provider';\nimport { ISettings } from '../domain/settings-provider';\nimport { ISvg } from '../domain/svg-provider';\nimport { IData } from '../domain/data-provider';\n\ninterface ITicksProps {\n settings: ISettings;\n svg: ISvg;\n data: IData;\n}\n\nconst Ticks = (props: ITicksProps) => {\n\n const { settings, svg, data } = props;\n\n const [ ticksSettings, setTicksSettings ] = useState(null);\n const [ ticks, setTicks ] = useState([]);\n\n useEffect(() => {\n setTicksSettings(getTicksSettings(settings, data));\n }, [\n settings,\n data,\n ]);\n\n useEffect(() => {\n if(!ticksSettings) return;\n\n let endAngleDeg = svg.endAngleDeg;\n if(endAngleDeg < svg.startAngleDeg) {\n endAngleDeg += 360;\n }\n\n setTicks(getTicks(\n ticksSettings,\n ticksSettings.ticksCount,\n svg.startAngleDeg,\n endAngleDeg,\n svg,\n data\n ));\n }, [\n data,\n svg,\n ticksSettings,\n ]);\n\n return (\n <>\n {\n ticksSettings && !ticksSettings.disableTicks &&\n \n {\n ticks.map((tick, i) => {\n const { x, y, x1, y1, textX, textY, showText } = tick;\n\n return (\n \n \n\n {\n showText &&\n \n { tick.tickValue }\n \n }\n \n );\n })\n }\n \n }\n \n )\n};\n\nexport default Ticks;", "import {\n circleMovement,\n convertRange,\n degreesToRadians,\n setDecimalPlaces,\n v2MulScalar,\n v2Normalize\n} from 'mz-math';\nimport { ISvg } from './svg-provider';\nimport { IData } from './data-provider';\nimport { ISettings } from './settings-provider';\nimport { getBoolean, getNumber, getString } from './common-provider';\nimport {\n DEFAULT_TICKS_COLOR, DEFAULT_TICKS_GROUP_SIZE,\n DEFAULT_TICKS_HEIGHT, DEFAULT_TICKS_VALUES_COLOR,\n DEFAULT_TICKS_VALUES_DISTANCE, DEFAULT_TICKS_VALUES_FONT_SIZE,\n DEFAULT_TICKS_WIDTH\n} from './defaults-provider';\n\nexport interface ITicks {\n ticksCount: number;\n disableTicks: boolean;\n ticksWidth: number;\n ticksHeight: number;\n longerTicksHeight: number;\n ticksDistanceToPanel: number;\n tickValuesDistance: number;\n ticksColor: string;\n tickValuesColor: string;\n tickValuesFontSize: number;\n ticksGroupSize: number;\n longerTickValuesOnly: boolean;\n showTickValues: boolean;\n}\n\nexport interface ITick {\n x: number;\n y: number;\n x1: number;\n y1: number;\n textX: number;\n textY: number;\n isLonger: boolean;\n showText: boolean;\n tickValue?: string;\n}\n\nexport const getTicksSettings = (settings: ISettings, data: IData) : ITicks => {\n\n let ticksCount = getNumber(settings.ticsCount, 0);\n if(!ticksCount) {\n if(data.data && data.data.length > 0) {\n ticksCount = data.data.length;\n }\n else{\n ticksCount = data.max;\n }\n }\n\n const ticksHeight = getNumber(settings.ticksHeight, DEFAULT_TICKS_HEIGHT);\n\n return {\n ticksCount,\n disableTicks: getBoolean(settings.disableTicks, false),\n ticksWidth: getNumber(settings.ticksWidth, DEFAULT_TICKS_WIDTH),\n ticksHeight,\n longerTicksHeight: getNumber(settings.longerTicksHeight, ticksHeight * 2),\n ticksDistanceToPanel: getNumber(settings.ticksDistanceToPanel, 0),\n tickValuesDistance: getNumber(settings.tickValuesDistance, DEFAULT_TICKS_VALUES_DISTANCE),\n ticksColor: getString(settings.ticksColor, DEFAULT_TICKS_COLOR),\n tickValuesColor: getString(settings.tickValuesColor, DEFAULT_TICKS_VALUES_COLOR),\n tickValuesFontSize: getNumber(settings.tickValuesFontSize, DEFAULT_TICKS_VALUES_FONT_SIZE),\n ticksGroupSize: getNumber(settings.ticksGroupSize, DEFAULT_TICKS_GROUP_SIZE),\n longerTickValuesOnly: getBoolean(settings.longerTickValuesOnly, true),\n showTickValues: getBoolean(settings.showTickValues, true),\n };\n};\n\nexport const getTicks = (\n ticksSettings: ITicks,\n ticsCount: number,\n pathStartAngle: number,\n pathEndAngle: number,\n svg: ISvg,\n data: IData\n) : ITick[] => {\n\n const ticks: ITick[] = [];\n\n const deltaAngle = Math.abs(pathEndAngle - pathStartAngle);\n const oneTickAngleSize = ticsCount === 0 ? 0 : deltaAngle / ticsCount;\n\n let count = ticsCount;\n if(!data.isClosedShape) {\n count++;\n }\n\n for(let i=0; i [0, Math.PI]\n\n let [x, y] = circleMovement([svg.cx, svg.cy], angleRad, svg.radius);\n\n const isLonger = ticksSettings.ticksGroupSize !== undefined && (i % ticksSettings.ticksGroupSize === 0 );\n\n let desiredDistance = ticksSettings.ticksHeight;\n\n if(isLonger) {\n desiredDistance = ticksSettings.longerTicksHeight;\n }\n\n const normalizedDirectionVector = v2Normalize([svg.cx - x, svg.cy - y]);\n const tickEndVector = v2MulScalar(normalizedDirectionVector, desiredDistance);\n\n const tickStartVector = v2MulScalar(normalizedDirectionVector, ticksSettings.ticksDistanceToPanel);\n x += tickStartVector[0];\n y += tickStartVector[1];\n\n const x1 = x + tickEndVector[0];\n const y1 = y + tickEndVector[1];\n\n // ------- Define tick value. ---------------------\n let tickValue: string|undefined = undefined;\n if(ticksSettings.showTickValues && (!ticksSettings.longerTickValuesOnly || ticksSettings.longerTickValuesOnly && (isLonger || ticksSettings.ticksGroupSize === undefined))) {\n\n let value: string|number = convertRange(i, 0, ticsCount, data.min, data.max);\n\n if(data.data.length > 0) {\n const index = Math.round(value);\n value = data.data[index];\n }\n else{\n value = setDecimalPlaces(value, data.round);\n }\n\n tickValue = (value ?? '').toString();\n }\n\n let textX = 0;\n let textY = 0;\n const showText = tickValue !== undefined;\n\n if(showText) {\n const _tickValuesDistance = getNumber(desiredDistance + ticksSettings.tickValuesDistance, desiredDistance * 1.5);\n const tickTextVector = v2MulScalar(normalizedDirectionVector, _tickValuesDistance);\n textX = x + tickTextVector[0];\n textY = y + tickTextVector[1];\n }\n\n ticks.push({\n x,\n y,\n x1,\n y1,\n textX,\n textY,\n isLonger,\n tickValue,\n showText,\n });\n }\n\n return ticks;\n};", "import { useEffect, useState, MouseEvent } from 'react';\nimport { getCircle, ICircle } from '../domain/circle-provider';\nimport { getString } from '../domain/common-provider';\nimport { ISettings } from '../domain/settings-provider';\nimport {\n DEFAULT_PATH_BG_COLOR,\n DEFAULT_PATH_BORDER_COLOR,\n} from '../domain/defaults-provider';\nimport { ISvg } from '../domain/svg-provider';\nimport { getAngleByMouse, getClosestPointer, IPointer, IPointers } from '../domain/pointers-provider';\n\ninterface ICircleProps {\n settings: ISettings;\n pointers: IPointers;\n svg: ISvg;\n $svg: SVGSVGElement;\n setPointer: (pointer: IPointer, newAngleDeg: number) => void;\n}\n\nconst Circle = (props: ICircleProps) => {\n\n const { settings, pointers, $svg, svg, setPointer } = props;\n const [ circle, setCircle ] = useState({\n strokeDasharray: '0 1000000',\n strokeOffset: 0,\n });\n\n useEffect(() => {\n setCircle(getCircle(\n svg.startAngleDeg,\n svg.endAngleDeg,\n svg.radius\n ));\n }, [\n svg.startAngleDeg,\n svg.endAngleDeg,\n svg.radius,\n ]);\n\n const onClick = (evt: MouseEvent) => {\n if(!$svg || settings.disabled) return;\n\n const degrees = getAngleByMouse(\n $svg,\n evt.clientX,\n evt.clientY,\n svg.cx,\n svg.cy,\n svg.radius,\n svg.radius\n );\n\n const closestPointer = getClosestPointer(\n pointers.pointers,\n degrees,\n svg.cx,\n svg.cy,\n svg.radius\n );\n\n if(!closestPointer) return;\n\n setPointer(closestPointer, degrees);\n };\n\n return (\n \n {\n svg.border > 0 &&\n \n }\n\n \n \n )\n};\n\nexport default Circle;\n"], - "mappings": "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", - "names": ["require_react_production_min", "__commonJSMin", "exports", "l", "n", "p", "q", "r", "t", "u", "v", "w", "x", "y", "z", "A", "a", "B", "C", "D", "E", "b", "e", "F", "G", "H", "I", "J", "K", "L", "M", "d", "c", "k", "h", "g", "f", "m", "N", "O", "escape", "P", "Q", "R", "S", "T", "U", "V", "W", "require_react", "__commonJSMin", "exports", "module", "require_react_jsx_runtime_production_min", "__commonJSMin", "exports", "f", "k", "l", "m", "n", "p", "q", "c", "a", "g", "b", "d", "e", "h", "require_jsx_runtime", "__commonJSMin", "exports", "module", "import_react", "setDecimalPlaces", "num", "decimalPlaces", "coefficient", "__pow", "mod", "n", "m", "convertRange", "x", "a", "b", "c", "d", "isNumber", "value", "radiansToDegrees", "radians", "decimalPlaces", "res", "setDecimalPlaces", "degreesToRadians", "degrees", "vSub", "vector1", "vector2", "decimalPlaces", "vector", "i", "setDecimalPlaces", "v2Sub", "vMulScalar", "v", "scalar", "decimalPlaces", "vector", "i", "setDecimalPlaces", "v2MulScalar", "v2", "vLength", "vector", "decimalPlaces", "sum", "i", "setDecimalPlaces", "v2Distance", "vector1", "vector2", "decimalPlaces", "diff", "vSub", "vLength", "vNormalize", "v", "decimalPlaces", "length", "vLength", "unitVector", "i", "setDecimalPlaces", "v2Normalize", "v2", "circleMovement", "center", "angle", "radius", "newId", "getSvg", "circleRadius", "circleThickness", "circleBorder", "maxPointerRadius", "startAngleDeg", "endAngleDeg", "thickness", "diff", "size", "cx", "cy", "getSVGCenter", "getSVGSize", "val", "s", "DEFAULT_PATH_BG_COLOR", "DEFAULT_PATH_BORDER_COLOR", "DEFAULT_POINTER_BG_COLOR", "DEFAULT_POINTER_BG_COLOR_SELECTED", "DEFAULT_POINTER_BG_COLOR_DISABLED", "DEFAULT_POINTER_BORDER_COLOR", "DEFAULT_CONNECTION_BG_COLOR", "DEFAULT_CONNECTION_BG_COLOR_DISABLED", "DEFAULT_TEXT_COLOR", "DEFAULT_TICKS_COLOR", "DEFAULT_TICKS_VALUES_COLOR", "getNumber", "value", "defaultValue", "H", "getString", "getBoolean", "isAngleInArc", "startAngleDeg", "endAngleDeg", "currentDegrees", "getAnglesDistance", "startAngle", "endAngle", "diff", "diffMod", "I", "getCircle", "radius", "circumference", "angleDiff", "strokeOffset", "strokeDasharray", "complement", "getAngleByMouse", "$svg", "clientX", "clientY", "cx", "cy", "rx", "ry", "left", "top", "relativeMouse", "vector", "R", "angleRad", "fr", "angle2value", "data", "angle", "pathStartAngle", "pathEndAngle", "value", "O", "index", "s", "value2angle", "_value", "valueIndex", "item", "I", "initPointers", "settings", "Lo", "getNumber", "getString", "DEFAULT_POINTER_BG_COLOR", "DEFAULT_POINTER_BG_COLOR_SELECTED", "DEFAULT_POINTER_BG_COLOR_DISABLED", "DEFAULT_POINTER_BORDER_COLOR", "pointers", "i", "settingPointer", "bgColor", "bgColorSelected", "bgColorDisabled", "border", "borderColor", "disabled", "getBoolean", "angleDeg", "angleAfterStep", "roundToStep", "getPointers", "getMaxRadius", "max", "pointer", "getClosestPointer", "currentPlaceDegrees", "pathRadius", "pr", "currentPointOnArc", "_t", "min", "closestPointer", "enabledPointers", "p", "pointerAngleRad", "pointOnArc", "distance", "Hr", "__spreadValues", "getClosestEdge", "startAngleDegrees", "endAngleDegrees", "startAngleRad", "startPointOnArc", "endAngleRad", "endPointOnArc", "distance1", "distance2", "getMinMaxDistancePointers", "minDistance", "maxDistance", "minPointer", "maxPointer", "getAnglesDistance", "num", "step", "import_react", "outlineNoneStyle", "import_jsx_runtime", "getPointerFill", "pointer", "pointerRef", "bgColor", "bgColorSelected", "bgColorDisabled", "Pointer", "props", "svg", "$svg", "setPointer", "data", "settings", "radius", "angleDeg", "border", "borderColor", "cx", "cy", "center", "setCenter", "value", "setValue", "angle2value", "angleRad", "O", "pr", "pointerCenter", "_t", "onValueChange", "evt", "mouseX", "mouseY", "degrees", "getAngleByMouse", "newAngleDeg", "isAngleInArc", "getClosestEdge", "onMouseUp", "onMouseDown", "onKeyDown", "$current", "onTouch", "onWheel", "scrollTop", "outlineNoneStyle", "Pointer_default", "import_jsx_runtime", "Pointers", "props", "pointers", "settings", "svg", "$svg", "setPointer", "data", "pointer", "Pointer_default", "Pointers_default", "getData", "setting", "min", "getNumber", "max", "step", "arrowStep", "round", "data", "minIndex", "item", "maxIndex", "pathStartAngle", "pathEndAngle", "isClosedShape", "I", "stepAngleDeg", "arrowStepAngleDeg", "import_react", "getConnection", "pointers", "radius", "cx", "cy", "pathStartAngle", "pathEndAngle", "result", "minMaxResult", "getMinMaxDistancePointers", "minPointer", "maxPointer", "pathAnglesDistance", "getAnglesDistance", "angleDistance", "circumference", "strokeOffset", "strokeDasharray", "complement", "import_jsx_runtime", "Connection", "props", "settings", "pointers", "$svg", "svg", "data", "setPointer", "connection", "setConnection", "rangeDraggingLastAngle", "getConnection", "onClick", "evt", "degrees", "getAngleByMouse", "closestPointer", "getClosestPointer", "onValueChange", "minMaxResult", "getMinMaxDistancePointers", "minPointer", "maxPointer", "mouseDegrees", "diff", "I", "onMouseUp", "onMouseDown", "getBoolean", "getString", "DEFAULT_CONNECTION_BG_COLOR_DISABLED", "DEFAULT_CONNECTION_BG_COLOR", "Connection_default", "import_react", "import_jsx_runtime", "Text", "props", "settings", "pointers", "svg", "data", "cx", "cy", "value", "setValue", "values", "pointer", "angle2value", "value1", "value2", "texts", "hideText", "getBoolean", "getString", "DEFAULT_TEXT_COLOR", "getNumber", "Text_default", "import_react", "getTicksSettings", "settings", "data", "ticksCount", "getNumber", "ticksHeight", "getBoolean", "getString", "DEFAULT_TICKS_COLOR", "DEFAULT_TICKS_VALUES_COLOR", "getTicks", "ticksSettings", "ticsCount", "pathStartAngle", "pathEndAngle", "svg", "ticks", "deltaAngle", "oneTickAngleSize", "count", "i", "currentAngle", "angleRad", "O", "pr", "x", "y", "_t", "isLonger", "desiredDistance", "normalizedDirectionVector", "D", "tickEndVector", "vr", "tickStartVector", "x1", "y1", "tickValue", "value", "index", "s", "textX", "textY", "showText", "_tickValuesDistance", "tickTextVector", "import_jsx_runtime", "Ticks", "props", "settings", "svg", "data", "ticksSettings", "setTicksSettings", "ticks", "setTicks", "getTicksSettings", "endAngleDeg", "getTicks", "tick", "i", "x", "y", "x1", "y1", "textX", "textY", "showText", "Ticks_default", "import_react", "import_jsx_runtime", "Circle", "props", "settings", "pointers", "$svg", "svg", "setPointer", "circle", "setCircle", "getCircle", "evt", "degrees", "getAngleByMouse", "closestPointer", "getClosestPointer", "getString", "DEFAULT_PATH_BORDER_COLOR", "DEFAULT_PATH_BG_COLOR", "Circle_default", "import_jsx_runtime", "RoundSlider", "props", "data", "setData", "svg", "setSvg", "pointers", "setPointers", "svgRef", "getData", "getPointers", "pathStartAngle", "getNumber", "pathEndAngle", "getSvg", "setPointersCallback", "pointer", "newAngleDeg", "roundToStep", "I", "prevAngle", "nextAngle", "prevIndex", "nextIndex", "isAngleInArc", "getClosestEdge", "_pointers", "__spreadValues", "values", "angle2value", "outlineNoneStyle", "Ticks_default", "Circle_default", "Connection_default", "Pointers_default", "Text_default"] + "sourcesContent": ["/**\n * @license React\n * react.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var l=Symbol.for(\"react.element\"),n=Symbol.for(\"react.portal\"),p=Symbol.for(\"react.fragment\"),q=Symbol.for(\"react.strict_mode\"),r=Symbol.for(\"react.profiler\"),t=Symbol.for(\"react.provider\"),u=Symbol.for(\"react.context\"),v=Symbol.for(\"react.forward_ref\"),w=Symbol.for(\"react.suspense\"),x=Symbol.for(\"react.memo\"),y=Symbol.for(\"react.lazy\"),z=Symbol.iterator;function A(a){if(null===a||\"object\"!==typeof a)return null;a=z&&a[z]||a[\"@@iterator\"];return\"function\"===typeof a?a:null}\nvar B={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},C=Object.assign,D={};function E(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B}E.prototype.isReactComponent={};\nE.prototype.setState=function(a,b){if(\"object\"!==typeof a&&\"function\"!==typeof a&&null!=a)throw Error(\"setState(...): takes an object of state variables to update or a function which returns an object of state variables.\");this.updater.enqueueSetState(this,a,b,\"setState\")};E.prototype.forceUpdate=function(a){this.updater.enqueueForceUpdate(this,a,\"forceUpdate\")};function F(){}F.prototype=E.prototype;function G(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B}var H=G.prototype=new F;\nH.constructor=G;C(H,E.prototype);H.isPureReactComponent=!0;var I=Array.isArray,J=Object.prototype.hasOwnProperty,K={current:null},L={key:!0,ref:!0,__self:!0,__source:!0};\nfunction M(a,b,e){var d,c={},k=null,h=null;if(null!=b)for(d in void 0!==b.ref&&(h=b.ref),void 0!==b.key&&(k=\"\"+b.key),b)J.call(b,d)&&!L.hasOwnProperty(d)&&(c[d]=b[d]);var g=arguments.length-2;if(1===g)c.children=e;else if(1 {\n\n const [ data, setData ] = useState(null);\n const [ svg, setSvg ] = useState(null);\n const [ pointers, setPointers ] = useState(null);\n\n const svgRef = useRef(null);\n\n useEffect(() => {\n setData(getData(props));\n }, [ props ]);\n\n useEffect(() => {\n setPointers(getPointers(props, data));\n }, [\n props,\n data,\n ]);\n\n useEffect(() => {\n if(!pointers) return;\n\n const pathStartAngle = getNumber(props.pathStartAngle, DEFAULT_PATH_START_ANGLE);\n let pathEndAngle = getNumber(props.pathEndAngle, DEFAULT_PATH_END_ANGLE);\n\n if(pathEndAngle <= pathStartAngle) {\n pathEndAngle += 360;\n }\n\n setSvg(getSvg(\n getNumber(props.pathRadius, DEFAULT_PATH_RADIUS),\n getNumber(props.pathThickness, DEFAULT_PATH_THICKNESS),\n getNumber(props.pathBorder, DEFAULT_PATH_BORDER),\n pointers.maxRadius,\n pathStartAngle,\n pathEndAngle,\n ));\n }, [\n props.pathRadius,\n props.pathThickness,\n props.pathBorder,\n props.pathStartAngle,\n props.pathEndAngle,\n pointers,\n ]);\n\n const setPointersCallback = (pointer: IPointer, newAngleDeg: number) => {\n if(props.disabled || !pointers.pointers || !pointer || pointer.disabled) return;\n\n newAngleDeg = roundToStep(newAngleDeg, data.stepAngleDeg);\n if(data.isClosedShape && mod(newAngleDeg, 360) === mod(svg.endAngleDeg, 360)){\n newAngleDeg = svg.startAngleDeg;\n }\n\n if(pointer.angleDeg === newAngleDeg) return;\n\n const handleOverlap = !props.pointersOverlap;\n if(handleOverlap) {\n\n let prevAngle, nextAngle;\n\n if(data.isClosedShape) {\n const prevIndex = mod(pointer.index - 1, pointers.pointers.length);\n const nextIndex = mod(pointer.index + 1, pointers.pointers.length);\n\n prevAngle = pointers.pointers[prevIndex].angleDeg;\n nextAngle = pointers.pointers[nextIndex].angleDeg;\n }\n else{\n prevAngle = pointer.index === 0 ? svg.startAngleDeg : pointers.pointers[pointer.index - 1].angleDeg;\n nextAngle = pointer.index === pointers.pointers.length - 1 ? svg.endAngleDeg : pointers.pointers[pointer.index + 1].angleDeg;\n }\n\n if(nextAngle <= prevAngle) {\n nextAngle += 360;\n }\n\n if(!isAngleInArc(prevAngle, nextAngle, newAngleDeg)){\n newAngleDeg = getClosestEdge(\n prevAngle,\n nextAngle,\n newAngleDeg,\n svg.cx,\n svg.cy,\n svg.radius\n );\n }\n }\n\n if(pointer.angleDeg === newAngleDeg) return;\n\n const _pointers = { ...pointers };\n _pointers.pointers = [...pointers.pointers];\n _pointers.pointers[pointer.index].angleDeg = newAngleDeg;\n pointers.pointers = _pointers.pointers;\n\n setPointers(_pointers);\n\n if(typeof props.onChange === 'function') {\n const values = _pointers.pointers.map(pointer => angle2value(\n data,\n pointer.angleDeg,\n svg.startAngleDeg,\n svg.endAngleDeg\n ));\n\n props.onChange(values);\n }\n };\n\n return (\n <>\n {\n svg &&\n \n\n {\n (props.SvgDefs) &&\n \n { props.SvgDefs }\n \n }\n\n \n\n \n\n \n\n \n\n \n \n }\n \n )\n};", "export const setDecimalPlaces = (num: number, decimalPlaces: number | undefined = Infinity) => {\n if(decimalPlaces === Infinity) return num;\n\n if(decimalPlaces < 0){\n decimalPlaces = 0;\n }\n\n const coefficient = 10 ** decimalPlaces;\n return Math.round(num * coefficient) / coefficient;\n};", "import { Vector2 } from '../types';\nimport { setDecimalPlaces } from './format';\n\nexport const mod = (n: number, m: number) => {\n return ((n % m) + m) % m;\n};\n\n/**\n * Convert range [a, b] to [c, d].\n * f(x) = (d - c) * (x - a) / (b - a) + c\n */\nexport const convertRange = (x: number, a: number, b: number, c: number, d: number) => {\n return (d - c) * (x - a) / (b - a) + c;\n};\n\n/**\n * Check if 2 ranges [a,b] and [c,d] overlap.\n */\nexport const doRangesOverlap = (a: number, b: number, c: number, d: number) => {\n return Math.max(a, c) <= Math.min(b, d) ;\n};\n\n// eslint-disable-next-line\nexport const isNumber = (value: any) => {\n return !isNaN(parseFloat(value)) && isFinite(value);\n};\n\n/**\n * Convert polar coordinates to cartesian coordinates.\n */\nexport const polarToCartesian = (center: Vector2, radii: Vector2, angleInRad: number, decimalPlaces = Infinity) : Vector2 => {\n const [cx, cy] = center;\n const [rx, ry] = radii;\n\n return [\n setDecimalPlaces(cx + (rx * Math.cos(angleInRad)), decimalPlaces),\n setDecimalPlaces(cy + (ry * Math.sin(angleInRad)), decimalPlaces),\n ];\n};", "import { Vector, Vector2, Vector3 } from '../types';\nimport { setDecimalPlaces } from './format';\nimport { v2Length, vNormalize, vDotProduct, vSub } from './linear-algebra/vector';\nimport { mod } from './other';\n\nexport const getV2Angle = (v2: Vector2, decimalPlaces = Infinity) => {\n const angle = Math.atan2(v2[1], v2[0]);\n return setDecimalPlaces(angle, decimalPlaces);\n};\n\nexport const getV2AngleInEllipse = (v2: Vector2, radii: Vector2, decimalPlaces = Infinity) => {\n const angle = Math.atan2(v2[1]/radii[1], v2[0]/radii[0]);\n return setDecimalPlaces(angle, decimalPlaces);\n};\n\nexport const setV2Angle = (v2: Vector2, newAngleRad: number, decimalPlaces = Infinity): Vector2 => {\n const length = v2Length(v2);\n return [\n setDecimalPlaces(Math.cos(newAngleRad) * length, decimalPlaces),\n setDecimalPlaces(Math.sin(newAngleRad) * length, decimalPlaces),\n ];\n};\n\nexport const radiansToDegrees = (radians: number, decimalPlaces = Infinity) => {\n const res = radians * (180 / Math.PI);\n return setDecimalPlaces(res, decimalPlaces);\n};\n\nexport const degreesToRadians = (degrees: number, decimalPlaces = Infinity) => {\n const res = degrees * (Math.PI / 180);\n return setDecimalPlaces(res, decimalPlaces);\n};\n\n/**\n * Returns the range [0, Math.PI]\n * A = Math.acos( dot(v1, v2)/(v1.length()*v2.length()) );\n */\nexport const getVNAngleBetween = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) : number => {\n const unitVector1 = vNormalize(vector1);\n const unitVector2 = vNormalize(vector2);\n const dotProduct = vDotProduct(unitVector1, unitVector2);\n const angle = Math.acos(dotProduct);\n return setDecimalPlaces(angle, decimalPlaces);\n};\n\nexport const getV2AngleBetween = (vector1: Vector2, vector2: Vector2, decimalPlaces = Infinity) : number => {\n // return getVNAngleBetween(vector1, vector2, decimalPlaces);\n const diff = vSub(vector1, vector2);\n const angle = Math.atan2(diff[1], diff[0]);\n return setDecimalPlaces(angle, decimalPlaces);\n};\n\nexport const getV3AngleBetween = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) : number => {\n return getVNAngleBetween(vector1, vector2, decimalPlaces);\n};\n\n/**\n * Shortest distance (angular) between two angles.\n */\nexport const getAnglesSub = (angleDegrees1: number, angleDegrees2: number, decimalPlaces = Infinity) : number => {\n const angleDistance = Math.abs(mod(angleDegrees1, 360) - mod(angleDegrees2, 360));\n return setDecimalPlaces(angleDistance <= 180 ? angleDistance : 360 - angleDistance, decimalPlaces);\n};\n\nexport const isAngleBetween = (angleDegrees: number, startAngleDegrees: number, endAngleDegrees: number) : boolean => {\n const distance = getAnglesSub(startAngleDegrees, endAngleDegrees);\n const distance1 = getAnglesSub(startAngleDegrees, angleDegrees);\n const distance2 = getAnglesSub(endAngleDegrees, angleDegrees);\n const totalDistance = distance1 + distance2;\n\n // Use a small threshold for floating point errors\n return Math.abs(totalDistance - distance) <= 0.001;\n}", "import { Vector, Vector2, Vector3, Vector4 } from '../../types';\nimport { setDecimalPlaces } from '../format';\nimport { getV2Angle, setV2Angle } from '../angle';\n\n// ------------ SUM ------------------------\n\nexport const vSum = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) : Vector => {\n\n const vector: Vector = [];\n\n for(let i=0; i {\n return vSum(vector1, vector2, decimalPlaces) as Vector2;\n};\n\nexport const v3Sum = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) : Vector3 => {\n return vSum(vector1, vector2, decimalPlaces) as Vector3;\n};\n\n// ------------ SUB ------------------------\n\nexport const vSub = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) : Vector => {\n\n const vector: Vector = [];\n\n for(let i=0; i {\n return vSub(vector1, vector2, decimalPlaces) as Vector2;\n};\n\nexport const v3Sub = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) : Vector3 => {\n return vSub(vector1, vector2, decimalPlaces) as Vector3;\n};\n\n// ------------ MUL SCALAR ------------------------\n\nexport const vMulScalar = (v: Vector, scalar: number, decimalPlaces = Infinity): Vector => {\n const vector: Vector = [];\n\n for(let i=0; i {\n return vMulScalar(v2, scalar, decimalPlaces) as Vector2;\n};\n\nexport const v3MulScalar = (v3: Vector3, scalar: number, decimalPlaces = Infinity): Vector3 => {\n return vMulScalar(v3, scalar, decimalPlaces) as Vector3;\n};\n\n// ------------ DIVIDE ------------------------\n\nexport const vDivideScalar = (v: Vector, scalar: number, decimalPlaces = Infinity): Vector => {\n if(scalar === 0){\n throw new Error('Division by zero error.');\n }\n\n const vector: Vector = [];\n\n for(let i=0; i {\n return vDivideScalar(v2, scalar, decimalPlaces) as Vector2;\n};\n\nexport const v3DivideScalar = (v3: Vector3, scalar: number, decimalPlaces = Infinity): Vector3 => {\n return vDivideScalar(v3, scalar, decimalPlaces) as Vector3;\n};\n\n// ------------ LENGTH ------------------------\n\nexport const vLength = (vector: Vector, decimalPlaces = Infinity) => {\n let sum = 0;\n\n for(let i=0; i {\n return vLength(vector, decimalPlaces);\n};\n\nexport const v3Length = (vector: Vector3, decimalPlaces = Infinity) => {\n return vLength(vector, decimalPlaces);\n};\n\nexport const v2SetLength = (v2: Vector2, newLength: number, decimalPlaces = Infinity): Vector2 => {\n const angle = getV2Angle(v2);\n return [\n setDecimalPlaces(Math.cos(angle) * newLength, decimalPlaces),\n setDecimalPlaces(Math.sin(angle) * newLength, decimalPlaces),\n ];\n};\n\n// ----------- DISTANCE ------------------------\n\nexport const vDistance = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) => {\n const diff = vSub(vector1, vector2);\n return vLength(diff, decimalPlaces);\n};\n\nexport const v2Distance = (vector1: Vector2, vector2: Vector2, decimalPlaces = Infinity) => {\n const diff = vSub(vector1, vector2);\n return vLength(diff, decimalPlaces);\n};\n\nexport const v3Distance = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) => {\n const diff = vSub(vector1, vector2);\n return vLength(diff, decimalPlaces);\n};\n\n// ------------ NORMALIZE ------------------------\n\n/**\n * Normalization creates a unit vector, which is a vector of length 1.\n */\nexport const vNormalize = (v: Vector, decimalPlaces = Infinity) : Vector => {\n const length = vLength(v);\n const unitVector: Vector = [];\n\n for(let i=0; i {\n return vNormalize(v2, decimalPlaces) as Vector2;\n};\n\nexport const v3Normalize = (v3: Vector3, decimalPlaces = Infinity) : Vector3 => {\n return vNormalize(v3, decimalPlaces) as Vector3;\n};\n\n// ------------ DOT PRODUCT ------------------------\n\nexport const vDotProduct = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) : number => {\n let sum = 0;\n\n for(let i=0; i {\n return vDotProduct(vector1, vector2, decimalPlaces);\n};\n\nexport const v3DotProduct = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) : number => {\n return vDotProduct(vector1, vector2, decimalPlaces);\n};\n\n// ------------ CROSS PRODUCT ------------------------\n\n/**\n * Cross product is possible on 3D vectors only.\n * The cross product a \u00D7 b is defined as a vector c that is perpendicular (orthogonal) to both a and b.\n */\nexport const v3CrossProduct = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity): Vector3 => {\n return [\n setDecimalPlaces(vector1[1] * vector2[2] - vector1[2] * vector2[1], decimalPlaces),\n setDecimalPlaces(vector1[2] * vector2[0] - vector1[0] * vector2[2], decimalPlaces),\n setDecimalPlaces(vector1[0] * vector2[1] - vector1[1] * vector2[0], decimalPlaces),\n ];\n};\n\n// --------------- INIT VECTOR HELPER -----------------\n\nexport const v2 = (defaultValue = 0): Vector2 => {\n return [defaultValue, defaultValue];\n};\n\nexport const v3 = (defaultValue = 0): Vector3 => {\n return [defaultValue, defaultValue, defaultValue];\n};\n\nexport const v4 = (defaultValue = 0): Vector4 => {\n return [defaultValue, defaultValue, defaultValue, defaultValue];\n};\n\nexport const vN = (N: number, defaultValue = 0): Vector => {\n\n if(N < 0){\n throw new Error('N must be a non-negative number.');\n }\n\n const vector: Vector = [];\n for(let i=0; i {\n let vector: Vector2 = [0, 0];\n vector = v2SetLength(vector, distance);\n return setV2Angle(vector, angleRad);\n};\n\n// --------------- EQUALITY -------------------------\n\nexport const vEqual = (vector1: Vector, vector2: Vector): boolean => {\n if(vector1.length !== vector2.length) return false;\n\n for(let i=0; i {\n const sub = v2Sub(vector2, vector1);\n return [\n -setDecimalPlaces(sub[1], decimalPlaces),\n setDecimalPlaces(sub[0], decimalPlaces)\n ];\n};", "import { Matrix2, Matrix3, Matrix4, Matrix, Vector, Vector2, Vector3 } from '../../types';\nimport { vMulScalar, vSum, vSub, vDotProduct, vN, vEqual, vDivideScalar } from './vector';\n\n// --------------- SUM ----------------------\n\nexport const mSum = (matrix1: Matrix, matrix2: Matrix, decimalPlaces = Infinity): Matrix => {\n const matrix: Matrix = [];\n\n for(let i=0; i {\n return mSum(matrix1, matrix2, decimalPlaces) as Matrix2;\n};\n\nexport const m3Sum = (matrix1: Matrix3, matrix2: Matrix3, decimalPlaces = Infinity): Matrix3 => {\n return mSum(matrix1, matrix2, decimalPlaces) as Matrix3;\n};\n\n// --------------- SUB ----------------------\n\nexport const mSub = (matrix1: Matrix, matrix2: Matrix, decimalPlaces = Infinity): Matrix => {\n const matrix: Matrix = [];\n\n for(let i=0; i {\n return mSub(matrix1, matrix2, decimalPlaces) as Matrix2;\n};\n\nexport const m3Sub = (matrix1: Matrix3, matrix2: Matrix3, decimalPlaces = Infinity): Matrix3 => {\n return mSub(matrix1, matrix2, decimalPlaces) as Matrix3;\n};\n\n// --------------- MUL SCALAR ----------------------\n\nexport const mMulScalar = (m: Matrix, scalar: number, decimalPlaces = Infinity): Matrix => {\n const matrix: Matrix = [];\n\n for(const v of m){\n matrix.push(vMulScalar(v, scalar, decimalPlaces));\n }\n\n return matrix;\n};\n\nexport const m2MulScalar = (m2: Matrix2, scalar: number, decimalPlaces = Infinity): Matrix2 => {\n return mMulScalar(m2, scalar, decimalPlaces) as Matrix2;\n};\n\nexport const m3MulScalar = (m3: Matrix3, scalar: number, decimalPlaces = Infinity): Matrix3 => {\n return mMulScalar(m3, scalar, decimalPlaces) as Matrix3;\n};\n\n// --------------- DIVIDE SCALAR ----------------------\n\nexport const mDivideScalar = (m: Matrix, scalar: number, decimalPlaces = Infinity): Matrix => {\n if(scalar === 0){\n throw new Error('Division by zero error.');\n }\n\n const matrix: Matrix = [];\n\n for(const v of m){\n matrix.push(vDivideScalar(v, scalar, decimalPlaces));\n }\n\n return matrix;\n};\n\nexport const m2DivideScalar = (m2: Matrix2, scalar: number, decimalPlaces = Infinity): Matrix2 => {\n return mDivideScalar(m2, scalar, decimalPlaces) as Matrix2;\n};\n\nexport const m3DivideScalar = (m3: Matrix3, scalar: number, decimalPlaces = Infinity): Matrix3 => {\n return mDivideScalar(m3, scalar, decimalPlaces) as Matrix3;\n};\n\n\n// --------------- TRANSPOSE ----------------------\n\nexport const mTranspose = (m: Matrix): Matrix => {\n\n const vectorsCount = m.length;\n if(vectorsCount <= 0) return m;\n\n const vectorLength = m[0].length;\n if(vectorLength <= 0) return m;\n\n const matrix: Matrix = [];\n for(let i=0; i {\n return mTranspose(m2);\n};\n\nexport const m3Transpose = (m3: Matrix3): Matrix => {\n return mTranspose(m3);\n};\n\n// ----------------- RESET ----------------------\n\nexport const mReset = (m: Matrix, defaultValue = 0): Matrix => {\n\n if(m.length <= 0) return [];\n\n const res: Matrix = [];\n\n for(let i=0; i {\n return mReset(m2, defaultValue) as Matrix2;\n};\n\nexport const m3Reset = (m3: Matrix3, defaultValue = 0): Matrix3 => {\n return mReset(m3, defaultValue) as Matrix3;\n};\n\n// --------------- MATRIX INIT HELPERS -----------------\n\nexport const m2x2 = (defaultValue = 0): Matrix2 => {\n return [\n [defaultValue, defaultValue],\n [defaultValue, defaultValue],\n ];\n};\n\nexport const m3x3 = (defaultValue = 0): Matrix3 => {\n return [\n [defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue],\n ];\n};\n\nexport const m4x4 = (defaultValue = 0): Matrix4 => {\n return [\n [defaultValue, defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue, defaultValue],\n ];\n};\n\nexport const mNxM = (N: number, M: number, defaultValue = 0): Matrix => {\n if(N <= 0 || M <= 0){\n throw new Error('M and N must be positive numbers.');\n }\n\n const matrix: Matrix = [];\n\n for(let i=0; i {\n return [\n [1, 0],\n [0, 1],\n ];\n};\n\nexport const identity3 = (): Matrix3 => {\n return [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\nexport const identity4 = (): Matrix4 => {\n return [\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Identity Matrix (I).\n * M x I = I x M = M for any matrix M.\n * Identity Matrix is a special case of scale matrix.\n */\nexport const identityN = (N: number): Matrix => {\n if(N < 0){\n throw new Error('N must be a non-negative number.');\n }\n\n if(N === 0) return [];\n\n const matrix: Matrix = [];\n\n for(let i=0; i {\n const matrix: Matrix = [];\n\n for(let i=0; i {\n return mDeepCopy(m2) as Matrix2;\n};\n\nexport const m3DeepCopy = (m3: Matrix3): Matrix3 => {\n return mDeepCopy(m3) as Matrix3;\n};\n\n// -------------- APPEND / PREPEND ROW OR COLUMN ---------------\n\nexport const mAppendCol = (m: Matrix, col: Vector): Matrix => {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n for(let i=0; i {\n const copy = mDeepCopy(m);\n copy.push(row);\n return copy;\n};\n\nexport const m2AppendRow = (m2: Matrix2, row: Vector2) : Matrix2 => {\n const copy = m2DeepCopy(m2);\n copy.push(row);\n return copy;\n};\n\nexport const m3AppendRow = (m3: Matrix3, row: Vector3) : Matrix3 => {\n const copy = m3DeepCopy(m3);\n copy.push(row);\n return copy;\n};\n\nexport const mPrependRow = (m: Matrix, row: Vector) : Matrix => {\n const copy = mDeepCopy(m);\n copy.unshift(row);\n return copy;\n};\n\nexport const m2PrependRow = (m2: Matrix2, row: Vector2) : Matrix2 => {\n const copy = m2DeepCopy(m2);\n copy.unshift(row);\n return copy;\n};\n\nexport const m3PrependRow = (m3: Matrix3, row: Vector3) : Matrix3 => {\n const copy = m3DeepCopy(m3);\n copy.unshift(row);\n return copy;\n};\n\n// ------------ DELETE ROW OR COLUMN ----------------------------\n\nexport const mDelLastRow = (m: Matrix): Matrix => {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n copy.pop();\n return copy;\n};\n\nexport const mDelFirstRow = (m: Matrix): Matrix => {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n copy.shift();\n return copy;\n};\n\nexport const mDelLastColumn = (m: Matrix): Matrix => {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const vector: Vector = [];\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const size = m[0].length;\n\n const vector: Vector = [];\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const vector: Vector = [];\n for(let i=0; i {\n\n const matrix: Matrix = [];\n for(let i=0; i {\n\n if(matrix.length < 0) return [];\n\n if(matrix[0].length !== vector.length){\n throw new Error('The number of columns in the matrix must be equal to the length of the vector.');\n }\n\n const res: Vector = [];\n\n for(let i=0; i {\n if(matrix1.length !== matrix2.length) return false;\n\n for(let i=0; i returns matrix N (m-1 x m-1)\n * The matrix must be square.\n */\nconst mMinorHelper = (m: Matrix, row: number, col: number) => {\n const size = m.length;\n\n if(size <= 0){\n throw new Error('The matrix should not be empty.');\n }\n\n if(size !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n const matrix: Matrix = [];\n\n for(let i=0; i {\n const size = m.length;\n\n if(size <= 0){\n throw new Error('The matrix should not be empty.');\n }\n\n if(size !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n // prepare the matrix without provided row and column\n const matrix = mMinorHelper(m, row, col);\n\n // calculate the matrix determinant\n return mDeterminant(matrix);\n};\n\n/**\n * Calculate determinant for NxN matrix.\n * Matrix should be square.\n */\nexport const mDeterminant = (matrix: Matrix): number => {\n const size = matrix.length;\n if(size === 0) return 1;\n\n if(size !== matrix[0].length){\n throw new Error('The matrix must be square.');\n }\n\n if(size === 1) return matrix[0][0];\n if(size === 2) return m2Determinant(matrix as Matrix2);\n\n let d = 0;\n\n for(let i=0; i {\n if(m2.length !== m2[0].length){\n throw new Error('The matrix must be square.');\n }\n\n return m2[0][0] * m2[1][1] - m2[1][0] * m2[0][1];\n};\n\n/**\n * Calculate determinant for 3x3 matrix.\n * Matrix should be square.\n */\nexport const m3Determinant = (m3: Matrix3): number => {\n if(m3.length !== m3[0].length){\n throw new Error('The matrix must be square.');\n }\n\n return mDeterminant(m3);\n};\n\n// ------------------ INVERSE -----------------------\n\nexport const m2Adjugate = (m2: Matrix2): Matrix2|null => {\n if(m2.length !== m2[0].length){\n throw new Error('The matrix must be square.');\n }\n\n return [\n [m2[1][1], -m2[0][1]],\n [-m2[1][0], m2[0][0]],\n ];\n};\n\nexport const m3Adjugate = (m3: Matrix3) : Matrix3|null => {\n return mAdjugate(m3) as (Matrix3|null);\n};\n\n/**\n * Adjugate is a transpose of a cofactor matrix\n */\nexport const mAdjugate = (m: Matrix): Matrix|null => {\n\n const size = m.length;\n if(size <= 0) return null;\n\n if(size !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n if(size === 1) return m;\n\n if(size === 2) return m2Adjugate(m as Matrix2);\n\n // build a cofactor matrix ----------------\n const cofactors: Matrix = [];\n\n for(let i=0; i {\n if(m.length > 0 && m.length !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n const d = mDeterminant(m);\n return d === 0;\n};\n\n/**\n * Square matrix A (nxn) is invertible is there is another square matrix B (nxn) so AxB = BxA = I\n * For A (2x2) matrix, the inverse is:\n * (1 / (determinant(A))) * adj(A)\n */\nexport const m2Inverse = (m2: Matrix2, decimalPlaces = Infinity): (Matrix2 | null) => {\n if(m2.length > 0 && m2.length !== m2[0].length){\n throw new Error('The matrix must be square.');\n }\n\n const d = m2Determinant(m2);\n if(d === 0) return null;\n\n const adj = m2Adjugate(m2);\n if(adj === null) return null;\n\n return m2DivideScalar(adj, d, decimalPlaces);\n};\n\nexport const m3Inverse = (m3: Matrix3, decimalPlaces = Infinity): (Matrix3 | null) => {\n return mInverse(m3, decimalPlaces) as (Matrix3|null);\n};\n\nexport const mInverse = (m: Matrix, decimalPlaces = Infinity): (Matrix | null) => {\n const size = m.length;\n\n if(size > 0 && size !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n // find a determinant ----------------------\n const d = mDeterminant(m);\n\n // find an Adjugate - a transpose of a cofactor matrix\n const adj = mAdjugate(m);\n if(adj === null) return null;\n\n return mDivideScalar(adj, d, decimalPlaces);\n};", "import { Matrix2, Matrix3, Matrix4, Matrix, Vector2, Vector3, Vector4 } from '../../types';\nimport { v2Normalize, v3MulScalar, v3Normalize } from './vector';\nimport { mMulVector, mMul } from './matrix';\nimport { setDecimalPlaces } from '../format';\n\n/*\nAny 2D affine transformation can be decomposed\ninto a rotation, followed by a scaling, followed by a\nshearing, and followed by a translation.\n---------------------------------------------------------\nAffine matrix = translation x shearing x scaling x rotation\n */\n\n// ----------------- CSS -------------------------------------\n\n/**\n * Matrix 2D in non-homogeneous coordinates to CSS matrix() function\n * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix\n */\nexport const m2ToCSS = (m: Matrix2) : string => {\n const a = m[0][0];\n const b = m[1][0];\n const c = m[0][1];\n const d = m[1][1];\n\n return `matrix(${ a }, ${ b }, ${ c }, ${ d }, 0, 0)`;\n};\n\n/**\n * Matrix 2D in homogeneous coordinates to CSS matrix() function\n * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix\n */\nexport const m2hToCSS = (m: Matrix3) : string => {\n const a = m[0][0];\n const b = m[1][0];\n const c = m[0][1];\n const d = m[1][1];\n const tx = m[0][2];\n const ty = m[1][2];\n\n return `matrix(${ a }, ${ b }, ${ c }, ${ d }, ${ tx }, ${ ty })`;\n};\n\n/**\n * Matrix 2D in homogeneous coordinates to CSS matrix3d() function\n * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix3d\n */\nexport const m2hToCSS3d = (m: Matrix3) : string => {\n const a = m[0][0];\n const b = m[1][0];\n const c = m[0][1];\n const d = m[1][1];\n const tx = m[0][2];\n const ty = m[1][2];\n\n return `matrix3d(${ a }, ${ b }, 0, 0, ${ c }, ${ d }, 0, 0, 0, 0, 1, 0, ${ tx }, ${ ty }, 0, 1)`;\n};\n\n/**\n * Matrix 3D in homogeneous coordinates to CSS matrix3d() function\n * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix3d\n */\nexport const m3hToCSS3d = (m: Matrix4) : string => {\n\n return `matrix3d(\n ${ m[0][0] }, ${ m[0][1] }, ${ m[0][2] }, ${ m[0][3] },\n ${ m[1][0] }, ${ m[1][1] }, ${ m[1][2] }, ${ m[1][3] },\n ${ m[2][0] }, ${ m[2][1] }, ${ m[2][2] }, ${ m[2][3] },\n ${ m[3][0] }, ${ m[3][1] }, ${ m[3][2] }, ${ m[3][3] }\n )`;\n};\n\n// ---------------- TRANSLATION MATRICES ----------------------\n\nexport const m2Translation = (position: Vector2, decimalPlaces = Infinity): Matrix2 => {\n\n return [\n [1, 0],\n [0, 1],\n [setDecimalPlaces(position[0], decimalPlaces), setDecimalPlaces(position[1], decimalPlaces)],\n ];\n};\n\nexport const m3Translation = (position: Vector3, decimalPlaces = Infinity): Matrix3 => {\n\n return [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n [\n setDecimalPlaces(position[0], decimalPlaces),\n setDecimalPlaces(position[1], decimalPlaces),\n setDecimalPlaces(position[2], decimalPlaces)\n ],\n ];\n};\n\n/**\n * 2D Translation matrix in homogeneous coordinates.\n */\nexport const m2TranslationH = (position: Vector3, decimalPlaces = Infinity): Matrix3 => {\n\n return [\n [1, 0, setDecimalPlaces(position[0], decimalPlaces)],\n [0, 1, setDecimalPlaces(position[1], decimalPlaces)],\n [0, 0, 1],\n ];\n};\n\n/**\n * 3D Translation matrix in homogeneous coordinates.\n */\nexport const m3TranslationH = (position: Vector4, decimalPlaces = Infinity): Matrix4 => {\n\n return [\n [1, 0, 0, setDecimalPlaces(position[0], decimalPlaces)],\n [0, 1, 0, setDecimalPlaces(position[1], decimalPlaces)],\n [0, 0, 1, setDecimalPlaces(position[2], decimalPlaces)],\n [0, 0, 0, 1],\n ];\n};\n\n// ---------------- ROTATION MATRICES -------------------------\n\n/**\n * Rotation of an angle about the origin.\n */\nexport const m2Rotation = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix2 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, -sin],\n [sin, cos],\n ] :\n [\n [cos, sin],\n [-sin, cos],\n ];\n};\n\n/**\n * Rotation of an angle about the origin in homogeneous coordinates (clockwise).\n */\nexport const m2RotationH = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix3 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, -sin, 0],\n [sin, cos, 0],\n [0, 0, 1],\n ]:\n [\n [cos, sin, 0],\n [-sin, cos, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Rotation of an angle \"angleRad\" around the given point (transformOrigin) in homogeneous coordinates (clockwise).\n * result_vector = TranslationMatrix(x, y) * RotationMatrix() * TranslationMatrix(-x, -y) * position_vector\n */\nexport const m2RotationAroundPointH = (\n angleRad: number,\n transformOrigin: Vector3,\n isClockwise = true,\n decimalPlaces = Infinity): Matrix3 => {\n\n const translation = m2TranslationH(transformOrigin, decimalPlaces);\n const rotation = m2RotationH(angleRad, isClockwise, decimalPlaces);\n const translationBack = m2TranslationH(v3MulScalar(transformOrigin, -1), decimalPlaces);\n const temp1 = mMul(translation, rotation);\n return mMul(temp1, translationBack) as Matrix3;\n};\n\nexport const m2RotateAroundPointH = (\n angleRad: number,\n transformOrigin: Vector3,\n position: Vector3,\n isClockwise = true,\n decimalPlaces = Infinity): Vector3 => {\n\n const mat3h = m2RotationAroundPointH(angleRad, transformOrigin, isClockwise, decimalPlaces);\n return mMulVector(mat3h, position) as Vector3;\n};\n\n/**\n * Rotate vector around the origin by angle \"angleRad\" (clockwise).\n */\nexport const v2Rotate = (angleRad: number, vector: Vector2, isClockwise = true, decimalPlaces = Infinity): Vector2 => {\n const unitVector = v2Normalize(vector);\n return mMulVector(m2Rotation(angleRad, isClockwise, decimalPlaces), unitVector) as Vector2;\n};\n\n/**\n * Rotate vector around the origin by angle \"angleRad\" (clockwise).\n */\nexport const v2RotateH = (angleRad: number, vector: Vector3, isClockwise = true, decimalPlaces = Infinity): Vector3 => {\n const unitVector = v3Normalize(vector);\n return mMulVector(m2RotationH(angleRad, isClockwise, decimalPlaces), unitVector) as Vector3;\n};\n\n/**\n * Rotation around the X axis (clockwise).\n */\nexport const m3RotationX = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix3 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [1, 0, 0],\n [0, cos, -sin],\n [0, sin, cos],\n ] :\n [\n [1, 0, 0],\n [0, cos, sin],\n [0, -sin, cos],\n ];\n};\n\n/**\n * Rotation around the X axis (clockwise) - in homogeneous coordinates\n */\nexport const m3RotationXH = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix4 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [1, 0, 0, 0],\n [0, cos, -sin, 0],\n [0, sin, cos, 0],\n [0, 0, 0, 1],\n ] :\n [\n [1, 0, 0, 0],\n [0, cos, sin, 0],\n [0, -sin, cos, 0],\n [0, 0, 0, 1],\n ];\n};\n\nexport const v3RotateX = (angleRad: number, vector: Vector3, isClockwise = true, decimalPlaces = Infinity): Vector3 => {\n const unitVector = v3Normalize(vector);\n return mMulVector(m3RotationX(angleRad, isClockwise, decimalPlaces), unitVector) as Vector3;\n};\n\n/**\n * Rotation around the Y axis (clockwise).\n */\nexport const m3RotationY = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix3 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, 0, sin],\n [0, 1, 0],\n [-sin, 0, cos],\n ] :\n [\n [cos, 0, -sin],\n [0, 1, 0],\n [sin, 0, cos],\n ];\n};\n\n/**\n * Rotation around the Y axis (clockwise) - in homogeneous coordinates\n */\nexport const m3RotationYH = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix4 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, 0, sin, 0],\n [0, 1, 0, 0],\n [-sin, 0, cos, 0],\n [0, 0, 0, 1],\n ] :\n [\n [cos, 0, -sin, 0],\n [0, 1, 0, 0],\n [sin, 0, cos, 0],\n [0, 0, 0, 1],\n ];\n};\n\nexport const v3RotateY = (angleRad: number, vector: Vector3, isClockwise = true, decimalPlaces = Infinity): Vector3 => {\n const unitVector = v3Normalize(vector);\n return mMulVector(m3RotationY(angleRad, isClockwise, decimalPlaces), unitVector) as Vector3;\n};\n\n/**\n * Rotation around the Z axis (clockwise).\n */\nexport const m3RotationZ = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix3 => {\n\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, -sin, 0],\n [sin, cos, 0],\n [0, 0, 1],\n ] : [\n [cos, sin, 0],\n [-sin, cos, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Rotation around the Z axis (clockwise)- in homogeneous coordinates\n */\nexport const m3RotationZH = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix4 => {\n\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, -sin, 0, 0],\n [sin, cos, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ] : [\n [cos, sin, 0, 0],\n [-sin, cos, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\nexport const v3RotateZ = (angleRad: number, vector: Vector3, isClockwise = true, decimalPlaces = Infinity): Vector3 => {\n const unitVector = v3Normalize(vector);\n return mMulVector(m3RotationZ(angleRad, isClockwise, decimalPlaces), unitVector) as Vector3;\n};\n\n// ---------------- SCALE MATRICES -------------\n\n/**\n * Get matrix for arbitrary scaling pivot point.\n * result_vector = TranslationMatrix(x, y) * ScaleMatrix() * TranslationMatrix(-x, -y) * scale_vector\n */\nexport const m2ScaleAtPointHMatrix = (\n scaleVector: Vector3,\n transformOrigin: Vector3,\n decimalPlaces = Infinity): Matrix3 => {\n\n const translation = m2TranslationH(transformOrigin, decimalPlaces);\n const scale = m2ScaleH(scaleVector);\n const translationBack = m2TranslationH(v3MulScalar(transformOrigin, -1), decimalPlaces);\n const temp1 = mMul(translation, scale);\n return mMul(temp1, translationBack) as Matrix3;\n};\n\nexport const m2ScaleAtPointH = (\n scaleVector: Vector3,\n transformOrigin: Vector3,\n point: Vector3,\n decimalPlaces = Infinity): Vector3 => {\n\n const mat3h = m2ScaleAtPointHMatrix(scaleVector, transformOrigin, decimalPlaces);\n return mMulVector(mat3h, point) as Vector3;\n};\n\nexport const m2Scale = (scaleVector: Vector2): Matrix2 => {\n return [\n [scaleVector[0], 0],\n [0, scaleVector[1]],\n ];\n};\n\nexport const v2Scale = (scaleVector: Vector2, vector: Vector2): Vector2 => {\n return mMulVector(m2Scale(scaleVector), vector) as Vector2;\n};\n\n/**\n * homogeneous coordinates\n */\nexport const m2ScaleH = (scaleVector: Vector3): Matrix3 => {\n return [\n [scaleVector[0], 0, 0],\n [0, scaleVector[1], 0],\n [0, 0, 1],\n ];\n};\n\nexport const m3Scale = (scaleVector: Vector3): Matrix3 => {\n return [\n [scaleVector[0], 0, 0],\n [0, scaleVector[1], 0],\n [0, 0, scaleVector[2]],\n ];\n};\n\nexport const m3ScaleH = (scaleVector: Vector4): Matrix4 => {\n return [\n [scaleVector[0], 0, 0, 0],\n [0, scaleVector[1], 0, 0],\n [0, 0, scaleVector[2], 0],\n [0, 0, 0, 1]\n ];\n};\n\nexport const v3Scale = (scaleVector: Vector3, vector: Vector3): Vector3 => {\n return mMulVector(m3Scale(scaleVector), vector) as Vector3;\n};\n\n/**\n * Stretch, parallel to the x-axis.\n */\nexport const m2ScaleX = (scale: number): Matrix2 => {\n return [\n [scale, 0],\n [0, 1],\n ];\n};\n\n/**\n * Stretch, parallel to the x-axis - homogeneous coordinates\n */\nexport const m2ScaleXH = (scale: number): Matrix3 => {\n return [\n [scale, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Stretch in x-direction\n */\nexport const m3ScaleX = (scale: number): Matrix3 => {\n return [\n [scale, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Stretch in x-direction\n */\nexport const m3ScaleXH = (scale: number): Matrix4 => {\n return [\n [scale, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Stretch in y-direction\n */\nexport const m3ScaleY = (scale: number): Matrix3 => {\n return [\n [1, 0, 0],\n [0, scale, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Stretch in y-direction\n */\nexport const m3ScaleYH = (scale: number): Matrix => {\n return [\n [1, 0, 0, 0],\n [0, scale, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Stretch in z-direction\n */\nexport const m3ScaleZ = (scale: number): Matrix3 => {\n return [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, scale],\n ];\n};\n\n/**\n * Stretch in z-direction\n */\nexport const m3ScaleZH = (scale: number): Matrix4 => {\n return [\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, scale, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Stretch, parallel to the y-axis.\n */\nexport const m2ScaleY = (scale: number): Matrix2 => {\n return [\n [1, 0],\n [0, scale],\n ];\n};\n\n/**\n * Stretch, parallel to the y-axis - homogeneous coordinates\n */\nexport const m2ScaleYH = (scale: number): Matrix3 => {\n return [\n [1, 0, 0],\n [0, scale, 0],\n [0, 0, 1],\n ];\n};\n\n// ---------------- REFLECTION MATRICES -------------------------\n\n/**\n * Reflection about the origin.\n */\nexport const m2ReflectionOrigin = (): Matrix2 => {\n\n return [\n [-1, 0],\n [0, -1],\n ];\n};\n\n/**\n * Reflection about the origin.\n */\nexport const m2ReflectionOriginH = (): Matrix3 => {\n\n return [\n [-1, 0, 0],\n [0, -1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection about the origin in non-homogeneous coordinates\n */\nexport const m3ReflectionOrigin = (): Matrix3 => {\n\n return [\n [-1, 0, 0],\n [0, -1, 0],\n [0, 0, -1],\n ];\n};\n\n/**\n * Reflection about the origin in homogeneous coordinates\n */\nexport const m3ReflectionOriginH = (): Matrix4 => {\n\n return [\n [-1, 0, 0, 0],\n [0, -1, 0, 0],\n [0, 0, -1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Reflection about y=-x\n */\nexport const m2ReflectionYmX = (): Matrix2 => {\n\n return [\n [0, -1],\n [-1, 0],\n ];\n};\n\n/**\n * Reflection in the x-axis.\n */\nexport const m2ReflectionX = (): Matrix2 => {\n\n return [\n [1, 0],\n [0, -1],\n ];\n};\n\n/**\n * Reflection in the x-axis.\n */\nexport const m2ReflectionXH = (): Matrix3 => {\n\n return [\n [1, 0, 0],\n [0, -1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection in the y-axis.\n */\nexport const m2ReflectionY = (): Matrix2 => {\n\n return [\n [-1, 0],\n [0, 1],\n ];\n};\n\nexport const m2ReflectionYH = (): Matrix3 => {\n\n return [\n [-1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to YZ plane in non-homogeneous coordinates\n */\nexport const m3ReflectionYZ = (): Matrix3 => {\n\n return [\n [-1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to YZ plane in homogeneous coordinates\n */\nexport const m3ReflectionYZH = (): Matrix4 => {\n\n return [\n [-1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to XZ plane in non-homogeneous coordinates\n */\nexport const m3ReflectionXZ = (): Matrix3 => {\n\n return [\n [1, 0, 0],\n [0, -1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to XZ plane in homogeneous coordinates\n */\nexport const m3ReflectionXZH = (): Matrix4 => {\n\n return [\n [1, 0, 0, 0],\n [0, -1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to XY plane in non-homogeneous coordinates\n */\nexport const m3ReflectionXY = (): Matrix3 => {\n\n return [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, -1],\n ];\n};\n\n/**\n * Reflection relative to XY plane in homogeneous coordinates\n */\nexport const m3ReflectionXYH = (): Matrix4 => {\n\n return [\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, -1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n// ---------------- SHEARING MATRICES -------------------------\n\n\n/**\n * Shearing in y-axis, with x-axis fixed with (0,1) moving to (factor, 1)\n */\nexport const m2ShearingY = (factor: number): Matrix2 => {\n\n return [\n [1, factor],\n [0, 1],\n ];\n};\n\n/**\n * Shearing in x-axis, with y-axis fixed with (1,0) moving to (1, factor)\n */\nexport const m2ShearingX = (factor: number): Matrix2 => {\n\n return [\n [1, 0],\n [factor, 1],\n ];\n};", "import { setDecimalPlaces } from './format';\n\n/**\n * Returns a random number in the [min,max] range.\n */\nexport const getRandom = (min: number, max: number, decimalPlaces = Infinity): number => {\n return setDecimalPlaces(Math.random() * (max - min) + min, decimalPlaces);\n};\n\n/**\n * Returns a random integer number in the [min,max] range.\n */\nexport const getRandomInt = (min: number, max: number): number => {\n return Math.floor(Math.random() * (max - min + 1) + min);\n};\n\nexport const getRandomBoolean = () => Math.random() < 0.5;\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nexport const getRandomItemFromArray = (array: any[]) => {\n const randomIndex = getRandomInt(0, array.length - 1);\n return array[randomIndex];\n};", "export const stringToNumber = (value: string|undefined|null|number, defaultNumber: number) => {\n if(value === undefined || value === null) return defaultNumber;\n const res = Number(value) ?? defaultNumber;\n return isNaN(res) ? defaultNumber : res;\n};", "import { setDecimalPlaces } from './format';\nimport { Vector2, Vector3 } from '../types';\n\n/**\n * u(x) and v(x) are functions ---------->\n *\n * dx(u + v) = dx(u) + dx(v)\n * dx(u - v) = dx(u) - dx(v)\n * dx(u * v) = dx(u) * v + u * dx(v)\n * dx(u / v) = (dx(u) * v - u * dx(v)) / (v ^ 2), when v(x) != 0\n */\n\n// ------------------ Derivatives of Polynomial ---------------------------\n\n/**\n * y = 3x+2\n * dxPolynomial(10, [[3, 1], [2, 0]])\n */\nexport const dxPolynomial = (x: number, polynomial: number[][], decimalPlaces = Infinity) => {\n let res = 0;\n\n for(const part of polynomial){\n if(part.length !== 2) return NaN;\n\n const coeff = part[0];\n const power = part[1];\n res += coeff * power * Math.pow(x, power - 1);\n }\n\n return setDecimalPlaces(res, decimalPlaces);\n}\n\n// ---------------------- Bezier Curves ---------------------------\n\n/**\n * Derivative of Bezier Curve is another Bezier Curve.\n * t must min in range [0, 1]\n */\nexport const dxV2QuadraticBezierCurve = (\n t: number,\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n // The derivative: P1 * (2t-2) + (2*P3-4*P2) * t + 2 * P2\n\n const temp1 = -2 * (1 - t); // Math.pow(1 - t, 2)\n const temp2 = 2 - 4 * t; // (1 - t) * 2 * t\n const temp3 = 2 * t; //t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * centerControlPoint[0] + temp3 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * centerControlPoint[1] + temp3 * endControlPoint[1], decimalPlaces),\n ];\n};\n\nexport const dxV3QuadraticBezierCurve = (\n t: number,\n startControlPoint: Vector3,\n centerControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n\n const temp1 = -2 * (1 - t); // Math.pow(1 - t, 2)\n const temp2 = 2 - 4 * t; // (1 - t) * 2 * t\n const temp3 = 2 * t; //t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * centerControlPoint[0] + temp3 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * centerControlPoint[1] + temp3 * endControlPoint[1], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[2] + temp2 * centerControlPoint[2] + temp3 * endControlPoint[2], decimalPlaces),\n ];\n};\n\nexport const dxV2CubicBezierCurve = (\n t: number,\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const temp1 = -3 * Math.pow(1 - t, 2); //Math.pow(1 - t, 3);\n const temp2 = 3 * (t - 1) * (3 * t - 1); //Math.pow(1 - t, 2) * 3 * t;\n const temp3 = 6 * t - 9 * t * t; // (1 - t) * 3 * t * t;\n const temp4 = 3 * t * t; //t * t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * center1ControlPoint[0] + temp3 * center2ControlPoint[0] + temp4 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * center1ControlPoint[1] + temp3 * center2ControlPoint[1] + temp4 * endControlPoint[1], decimalPlaces),\n ];\n};\n\nexport const dxV3CubicBezierCurve = (\n t: number,\n startControlPoint: Vector3,\n center1ControlPoint: Vector3,\n center2ControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n\n const temp1 = -3 * Math.pow(1 - t, 2); //Math.pow(1 - t, 3);\n const temp2 = 3 * (t - 1) * (3 * t - 1); //Math.pow(1 - t, 2) * 3 * t;\n const temp3 = 6 * t - 9 * t * t; // (1 - t) * 3 * t * t;\n const temp4 = 3 * t * t; //t * t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * center1ControlPoint[0] + temp3 * center2ControlPoint[0] + temp4 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * center1ControlPoint[1] + temp3 * center2ControlPoint[1] + temp4 * endControlPoint[1], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[2] + temp2 * center1ControlPoint[2] + temp3 * center2ControlPoint[2] + temp4 * endControlPoint[2], decimalPlaces),\n ];\n};\n\n\n// ----------------- Derivatives of trigonometry functions ---------------------------\n\nexport const dxSin = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(Math.cos(x), decimalPlaces);\n};\n\nexport const dxCos = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(-Math.sin(x), decimalPlaces);\n};\n\nexport const dxTan = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(1 / (Math.cos(x) ** 2), decimalPlaces);\n};\n\n/**\n * x != Math.PI * n, where n is an integer\n */\nexport const dxCot = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(-1 / (Math.sin(x) ** 2), decimalPlaces);\n};\n\n/**\n * -1 < x < 1\n */\nexport const dxArcSin = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(1 / (Math.sqrt(1 - x ** 2)), decimalPlaces);\n};\n\n/**\n * -1 < x < 1\n */\nexport const dxArcCos = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(-1 / (Math.sqrt(1 - x ** 2)), decimalPlaces);\n};\n\nexport const dxArcTan = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(1 / (1 + x ** 2), decimalPlaces);\n};\n\nexport const dxArcCot = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(-1 / (1 + x ** 2), decimalPlaces);\n};\n", "import { Matrix, Matrix2, Matrix3, Vector, Vector2, Vector3 } from '../../types';\nimport { m2Inverse, m3Inverse, mInverse, mMulVector, mDelLastColumn, mGetLastColumn } from '../linear-algebra/matrix';\nimport { setDecimalPlaces } from '../format';\nimport { v2Sub } from '../linear-algebra/vector';\n\n/**\n * Linear equation\n * ax + b = c\n * x = (c - b) / a; a != 0\n */\nexport const linearEquation = (equation: Vector3, decimalPlaces = Infinity) : number => {\n const a = equation[0];\n const b = equation[1];\n const c = equation[2];\n\n const diff = c - b;\n\n if(a === 0 && diff === 0) return Infinity; // any number is a solution\n if(a === 0) return NaN; // no solution\n\n return setDecimalPlaces(diff / a, decimalPlaces);\n};\n\n/**\n * System of 2 linear equations.\n * [x, y] = inverse(Matrix of equation parameters) x (vector of equation results)\n * ---------------\n * 3x + 2y = 7\n * -6x + 6y = 6\n */\nexport const linearEquationSystem2 = (equation1: Vector3, equation2: Vector3, decimalPlaces = Infinity) : Vector2 | null => {\n const equationParams: Matrix2 = [\n [equation1[0], equation1[1]],\n [equation2[0], equation2[1]],\n ];\n\n const inversed = m2Inverse(equationParams);\n if(inversed === null) return null; // no results\n\n const equationResults: Vector2 = [\n equation1[2],\n equation2[2]\n ];\n\n return mMulVector(inversed, equationResults, decimalPlaces) as Vector2;\n};\n\n/**\n * System of 3 linear equations.\n * ---------------------------------------\n * 3x + 2y + 5z = 7\n * -6x + 6y + 6z = 6\n * 2x + 7y - z = 4\n */\nexport const linearEquationSystem3 = (\n equation1: Vector,\n equation2: Vector,\n equation3: Vector,\n decimalPlaces = Infinity) : Vector3 | null => {\n const equationParams: Matrix3 = [\n [equation1[0], equation1[1], equation1[2]],\n [equation2[0], equation2[1], equation2[2]],\n [equation3[0], equation3[1], equation3[2]],\n ];\n\n const inversed = m3Inverse(equationParams);\n if(inversed === null) return null; // no results\n\n const equationResults: Vector3 = [\n equation1[3],\n equation2[3],\n equation3[3]\n ];\n\n return mMulVector(inversed, equationResults, decimalPlaces) as Vector3;\n};\n\n/**\n * System of N linear equations.\n */\nexport const linearEquationSystemN = (equations: Matrix, decimalPlaces = Infinity) : Vector | null => {\n if(equations.length <= 0) return null;\n\n const equationParams = mDelLastColumn(equations);\n\n const inversed = mInverse(equationParams);\n if(inversed === null) return null; // no results\n\n // the last column of the equations matrix\n const equationResults = mGetLastColumn(equations);\n\n return mMulVector(inversed, equationResults, decimalPlaces) as Vector;\n};\n\n/**\n * Calculate the equation of a line given two points in a 2D space.\n * y = ax + b\n * y - y1 = m(x - x1)\n * m = (y2 - y1) / (x2 - x1)\n */\nexport const getLinearEquationBy2Points = (point1: Vector2, point2: Vector2) : {\n slope: number|undefined,\n yIntercept: number|undefined,\n xIntercept: number|undefined,\n formula: string,\n} => {\n const [deltaX, deltaY] = v2Sub(point2, point1);\n const [x, y] = point1;\n\n if(deltaX === 0) {\n return {\n slope: undefined,\n xIntercept: x,\n yIntercept: undefined,\n formula: `x = ${ x }`,\n };\n }\n\n const m = deltaY / deltaX;\n const b = y - m * x;\n let formula = '';\n\n if(m === 0) {\n formula = `y = ${ b }`;\n }\n else{\n formula = `y = ${ m === 1 ? '' : m }x`;\n\n if(b !== 0) {\n formula += ` ${ b < 0 ? '-' : '+' } ${ Math.abs(b) }`;\n }\n }\n\n return {\n slope: m,\n xIntercept: undefined,\n yIntercept: b,\n formula,\n };\n};", "import { Vector } from '../../types';\nimport { setDecimalPlaces } from '../format';\nimport { linearEquation } from './linear-equations';\nimport { isNumber } from '../other';\n\n/**\n * Quadratic Equation.\n * ax^2 + bx + c = d\n */\nexport const quadraticEquation = (equation: Vector, decimalPlaces = Infinity) : Vector => {\n const a = equation[0];\n const b = equation[1];\n const c = equation[2];\n const d = equation[3];\n\n if(a === 0){\n // it's a linear equation -------------------------------------------\n const res = linearEquation([b, c, d], decimalPlaces);\n if(isNumber(res)) return [res];\n return [];\n }\n\n const diff = c - d;\n\n const discriminant = b * b - (4 * a * diff);\n\n if(discriminant < 0){\n return []; // no results\n }\n\n if(discriminant === 0){\n return [ setDecimalPlaces(-b / (2 * a), decimalPlaces) ]; // 1 result\n }\n\n // if(determinant > 0) ---> 2 results\n const t1 = 2 * a;\n const t2 = Math.sqrt(discriminant);\n\n return [\n setDecimalPlaces((-b + t2) / t1, decimalPlaces),\n setDecimalPlaces((-b - t2) / t1, decimalPlaces),\n ];\n};", "import { IBBox, Vector, Vector2, Vector3 } from '../../types';\nimport { setDecimalPlaces } from '../format';\nimport {\n dxV2CubicBezierCurve,\n dxV2QuadraticBezierCurve,\n dxV3CubicBezierCurve,\n dxV3QuadraticBezierCurve\n} from '../derivative';\nimport { v2Normalize, v3Normalize } from '../linear-algebra/vector';\nimport { linearEquation } from '../equations/linear-equations';\nimport { quadraticEquation } from '../equations/quadratic-equations';\nimport { isNumber } from '../other';\n\n/**\n * B\u00E9zier Curves\n * quadratic: y = P1 * (1-t)\u00B2 + P2 * 2 * (1-t)t + P3 * t\u00B2\n * t in range [0, 1]\n */\n\n// -------------------- GET POINT ON CURVE --------------------------\n\n/**\n * Get a point on a quadratic B\u00E9zier curve as a function of time.\n */\nexport const v2QuadraticBezierCurve = (\n t: number,\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const temp1 = Math.pow(1 - t, 2);\n const temp2 = (1 - t) * 2 * t;\n const temp3 = t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * centerControlPoint[0] + temp3 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * centerControlPoint[1] + temp3 * endControlPoint[1], decimalPlaces),\n ];\n};\n\nexport const v3QuadraticBezierCurve = (\n t: number,\n startControlPoint: Vector3,\n centerControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n\n const temp1 = Math.pow(1 - t, 2);\n const temp2 = (1 - t) * 2 * t;\n const temp3 = t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * centerControlPoint[0] + temp3 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * centerControlPoint[1] + temp3 * endControlPoint[1], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[2] + temp2 * centerControlPoint[2] + temp3 * endControlPoint[2], decimalPlaces),\n ];\n};\n\n/**\n * Get a point on a cubic B\u00E9zier curve as a function of time.\n */\nexport const v2CubicBezierCurve = (\n t: number,\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const temp1 = Math.pow(1 - t, 3);\n const temp2 = Math.pow(1 - t, 2) * 3 * t;\n const temp3 = (1 - t) * 3 * t * t;\n const temp4 = t * t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * center1ControlPoint[0] + temp3 * center2ControlPoint[0] + temp4 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * center1ControlPoint[1] + temp3 * center2ControlPoint[1] + temp4 * endControlPoint[1], decimalPlaces),\n ];\n};\n\nexport const v3CubicBezierCurve = (\n t: number,\n startControlPoint: Vector3,\n center1ControlPoint: Vector3,\n center2ControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n\n const temp1 = Math.pow(1 - t, 3);\n const temp2 = Math.pow(1 - t, 2) * 3 * t;\n const temp3 = (1 - t) * 3 * t * t;\n const temp4 = t * t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * center1ControlPoint[0] + temp3 * center2ControlPoint[0] + temp4 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * center1ControlPoint[1] + temp3 * center2ControlPoint[1] + temp4 * endControlPoint[1], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[2] + temp2 * center1ControlPoint[2] + temp3 * center2ControlPoint[2] + temp4 * endControlPoint[2], decimalPlaces),\n ];\n};\n\n// -------------------- TANGENT --------------------------\n\n/**\n * Tangent indicates the direction of travel at specific points along the B\u00E9zier curve,\n * and is literally just the first derivative of our curve.\n */\nexport const v2QuadraticBezierCurveTangent = (\n t: number,\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n const dxVector = dxV2QuadraticBezierCurve(t, startControlPoint, centerControlPoint, endControlPoint);\n return v2Normalize(dxVector, decimalPlaces);\n};\n\nexport const v3QuadraticBezierCurveTangent = (\n t: number,\n startControlPoint: Vector3,\n centerControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n const dxVector = dxV3QuadraticBezierCurve(t, startControlPoint, centerControlPoint, endControlPoint);\n return v3Normalize(dxVector, decimalPlaces);\n};\n\nexport const v2CubicBezierCurveTangent = (\n t: number,\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n const dxVector = dxV2CubicBezierCurve(t, startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint);\n return v2Normalize(dxVector, decimalPlaces);\n};\n\nexport const v3CubicBezierCurveTangent = (\n t: number,\n startControlPoint: Vector3,\n center1ControlPoint: Vector3,\n center2ControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n const dxVector = dxV3CubicBezierCurve(t, startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint);\n return v3Normalize(dxVector, decimalPlaces);\n};\n\n// -------------------- NORMAL --------------------------\n\n/**\n * Normal is a vector that runs at a right angle to the direction of the curve, and is typically of length 1.\n * To find it, we take the normalised tangent vector, and then rotate it by a 90 degrees.\n */\nexport const v2QuadraticBezierCurveNormal = (\n t: number,\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const tangent = v2QuadraticBezierCurveTangent(t, startControlPoint, centerControlPoint, endControlPoint, decimalPlaces);\n return [-tangent[1], tangent[0]];\n};\n\nexport const v2CubicBezierCurveNormal = (\n t: number,\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const tangent = v2CubicBezierCurveTangent(t, startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint, decimalPlaces);\n return [-tangent[1], tangent[0]];\n};\n\n// -------------------- EXTREMA --------------------------\n\n/**\n * Find maxima and minima by solving the equation B'(t) = 0\n * Returns result in [0, 1] range.\n */\nexport const v2QuadraticBezierCurveExtrema = (\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector => {\n\n /*\n (-2 * (1 - t)) * startControlPoint[0] + (2 - 4 * t) * centerControlPoint[0] + (2 * t) * endControlPoint[0]\n 2 * t * startControlPoint[0] - 4 * t * centerControlPoint[0] + 2 * t * endControlPoint[0] - 2 * startControlPoint[0] + 2 * centerControlPoint[0]\n t * (2 * startControlPoint[0] - 4 * centerControlPoint[0] + 2 * endControlPoint[0]) + (- 2 * startControlPoint[0] + 2 * centerControlPoint[0])\n */\n\n const a1 = 2 * startControlPoint[0] - 4 * centerControlPoint[0] + 2 * endControlPoint[0];\n const b1 = -2 * startControlPoint[0] + 2 * centerControlPoint[0];\n const equation1: Vector3 = [a1, b1, 0];\n const res1 = linearEquation(equation1, decimalPlaces);\n\n const a2 = 2 * startControlPoint[1] - 4 * centerControlPoint[1] + 2 * endControlPoint[1];\n const b2 = -2 * startControlPoint[1] + 2 * centerControlPoint[1];\n const equation2: Vector3 = [a2, b2, 0];\n const res2 = linearEquation(equation2, decimalPlaces);\n\n const res: Vector = [];\n\n if(isNumber(res1)){\n res.push(res1);\n }\n\n if(isNumber(res2)){\n res.push(res2);\n }\n\n return res;\n};\n\n/**\n * Find maxima and minima by solving the equation B'(t) = 0\n * Returns result in [0, 1] range.\n */\nexport const v2CubicBezierCurveExtrema = (\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2|null => {\n\n const a1 = -3 * startControlPoint[0] + 9 * center1ControlPoint[0] - 9 * center2ControlPoint[0] + 3 * endControlPoint[0];\n const b1 = 6 * startControlPoint[0] - 12 * center1ControlPoint[0] + 6 * center2ControlPoint[0];\n const c1 = -3 * startControlPoint[0] + 3 * center1ControlPoint[0];\n const equation1: Vector = [a1, b1, c1, 0];\n\n const a2 = -3 * startControlPoint[1] + 9 * center1ControlPoint[1] - 9 * center2ControlPoint[1] + 3 * endControlPoint[1];\n const b2 = 6 * startControlPoint[1] - 12 * center1ControlPoint[1] + 6 * center2ControlPoint[1];\n const c2 = -3 * startControlPoint[1] + 3 * center1ControlPoint[1];\n const equation2: Vector = [a2, b2, c2, 0];\n\n // Any value between 0 and 1 is a root that matters for B\u00E9zier curves, anything below or above that is irrelevant (because B\u00E9zier curves are only defined over the interval [0,1]).\n const res1 = quadraticEquation(equation1, decimalPlaces).filter(num => num >= 0 && num <= 1);\n const res2 = quadraticEquation(equation2, decimalPlaces).filter(num => num >= 0 && num <= 1);\n\n const res = [...res1, ...res2];\n if(res.length === 2){\n return [...res1, ...res2] as Vector2;\n }\n\n return null;\n};\n\n// -------------------- BOUNDING BOX --------------------------\n\nexport const v2QuadraticBezierBBox = (\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : IBBox => {\n\n const extrema = v2QuadraticBezierCurveExtrema(startControlPoint, centerControlPoint, endControlPoint);\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for(const percent of extrema){\n const point = v2QuadraticBezierCurve(percent, startControlPoint, centerControlPoint, endControlPoint);\n\n const x = point[0];\n const y = point[1];\n\n minX = Math.min(minX, x);\n maxX = Math.max(maxX, x);\n\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y);\n }\n\n minX = setDecimalPlaces(Math.min(minX, startControlPoint[0], endControlPoint[0]), decimalPlaces);\n maxX = setDecimalPlaces(Math.max(maxX, startControlPoint[0], endControlPoint[0]), decimalPlaces);\n minY = setDecimalPlaces(Math.min(minY, startControlPoint[1], endControlPoint[1]), decimalPlaces);\n maxY = setDecimalPlaces(Math.max(maxY, startControlPoint[1], endControlPoint[1]), decimalPlaces);\n\n return {\n x: minX,\n y: minY,\n w: Math.abs(maxX - minX),\n h: Math.abs(maxY - minY),\n x2: maxX,\n y2: maxY,\n }\n};\n\nexport const v2CubicBezierBBox = (\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : IBBox => {\n\n const extrema = v2CubicBezierCurveExtrema(startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint) || [];\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for(const percent of extrema){\n const point = v2CubicBezierCurve(percent, startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint);\n\n const x = point[0];\n const y = point[1];\n\n minX = Math.min(minX, x ?? Infinity);\n maxX = Math.max(maxX, x ?? -Infinity);\n\n minY = Math.min(minY, y ?? Infinity);\n maxY = Math.max(maxY, y ?? -Infinity);\n }\n\n minX = setDecimalPlaces(Math.min(minX, startControlPoint[0], endControlPoint[0]), decimalPlaces);\n maxX = setDecimalPlaces(Math.max(maxX, startControlPoint[0], endControlPoint[0]), decimalPlaces);\n minY = setDecimalPlaces(Math.min(minY, startControlPoint[1], endControlPoint[1]), decimalPlaces);\n maxY = setDecimalPlaces(Math.max(maxY, startControlPoint[1], endControlPoint[1]), decimalPlaces);\n\n return {\n x: minX,\n y: minY,\n w: Math.abs(maxX - minX),\n h: Math.abs(maxY - minY),\n x2: maxX,\n y2: maxY,\n }\n};\n\n\n", "import { Vector2 } from '../types';\nimport { v2Sub } from './linear-algebra/vector';\nimport { getV2Angle } from './angle';\nimport { convertRange } from './other';\n\n/**\n * Circle Equation\n * x^2 + y^2 = radius^2\n * ----------------------\n * Circle Parametric Equation\n * x(t) = radius * cos(t)\n * y(t) = radius * sin(t)\n * t is the parameter = angle\n *\n * Angle should be in the range [0, Math.PI]\n */\nexport const circleMovement = (center: Vector2, angle: number, radius: number): Vector2 => {\n angle = angle % Math.PI * 2;\n\n return [\n center[0] + Math.cos(angle) * radius,\n center[1] + Math.sin(angle) * radius\n ];\n};\n\n/**\n * Circle Movement After Mouse.\n * Mouse Positions:\n * - pageX/Y coordinates are relative to the top left corner of the whole rendered page (including parts hidden by scrolling),\n * - screenX and screenY: Relative to the top left of the physical screen/monitor, this reference point only moves if you increase or decrease the number of monitors or the monitor resolution.\n * - clientX/Y coordinates are relative to the top left corner of the visible part of the page, \"seen\" through browser window.\n * - offsetX and offsetY are relative to the parent container,\n */\nexport const circleMovementAfterMouse = (\n mouse: Vector2,\n center: Vector2,\n radius: number\n): Vector2 => {\n\n const vector = v2Sub(mouse, center);\n\n let angle = getV2Angle(vector);\n\n // convert the angle from the range [0, Math.PI*2] to the range [0, Math.PI]\n angle = convertRange(angle, 0, Math.PI*2, 0, Math.PI);\n\n return circleMovement(center, angle, radius);\n};\n\n/**\n * Ellipse Equation\n * (x - centerX)^2 / (radius1^2) + (y - centerY)^2 / (radius2^2) = 1\n * -----------------------------------------------------------------\n * Ellipse Parametric Equation\n * x(t) = radius1 * cos(t)\n * y(t) = radius2 * sin(t)\n * t is the parameter = angle\n *\n * Angle should be in the range [0, Math.PI]\n */\nexport const ellipseMovement = (center: Vector2, angle: number, radius1: number, radius2: number): Vector2 => {\n angle = angle % Math.PI * 2;\n\n return [\n center[0] + Math.cos(angle) * radius1,\n center[1] + Math.sin(angle) * radius2\n ];\n};\n\n/**\n * Ellipse Movement After Mouse.\n * Mouse Positions:\n * - pageX/Y coordinates are relative to the top left corner of the whole rendered page (including parts hidden by scrolling),\n * - screenX and screenY: Relative to the top left of the physical screen/monitor, this reference point only moves if you increase or decrease the number of monitors or the monitor resolution.\n * - clientX/Y coordinates are relative to the top left corner of the visible part of the page, \"seen\" through browser window.\n * - offsetX and offsetY are relative to the parent container,\n */\nexport const ellipseMovementAfterMouse = (\n mouse: Vector2,\n center: Vector2,\n radii: Vector2\n): Vector2 => {\n\n const vector = v2Sub(mouse, center);\n\n let angle = getV2Angle(vector);\n\n // convert the angle from the range [0, Math.PI*2] to the range [0, Math.PI]\n angle = convertRange(angle, 0, Math.PI*2, 0, Math.PI);\n\n return ellipseMovement(center, angle, radii[0], radii[1]);\n};\n\n/**\n * Sine Wave Equation (Sinusoid)\n * -----------------------------\n * const y = amplitude * Math.sin(2 * Math.PI * frequency * x + phase);\n * amplitude = the peak deviation of the function from zero\n * frequency = number of cycles\n * phase = specifies (in radians) where in its cycle the oscillation is at t = 0.\n * think of it as \"shifting\" the starting point of the function to the right (positive p) or left (negative)\n */\nexport const sineWaveMovement = (x: number, amplitude: number, frequency: number, phase: number) : Vector2 => {\n /*\n example values:\n const amplitude = 50;\n const frequency = 0.005;\n const phase = 0;\n x: [0, 1000]\n */\n const y = amplitude * Math.sin(2 * Math.PI * frequency * x + phase);\n\n return [x, y];\n};\n\n/**\n * Lissajous curve (Lissajous figure or Bowditch curve)\n * Parametric equation #1\n * f(t) = A * sin(k * t + m)\n * f(t) = B * sin(n * t)\n * 0 <= m <= PI/2\n * k, n >= 1\n * -----------------------\n * Parametric equation #2\n * f(t) = A * cos(k * t - m)\n * f(t) = B * cos(n * t - p)\n * -----------------------------\n * Shapes:\n * k = 1, n = 1, m = 0, p = 0 ---> line\n * A = B, k = 1, n = 1, m = PI/2, p = PI/2 ----> circle\n * A != B, k = 1, n = 1, m = PI/2, p = PI/2 ----> ellipse\n * k = 2, n = 2, m = PI/2, p = PI/2 ----> section of a parabola\n */\nexport const lissajousCurve = (\n width: number,\n height: number,\n t: number,\n k: number,\n n: number,\n m: number,\n p: number\n) :Vector2 => {\n return [\n width * Math.cos(k * t - m),\n height * Math.cos(n * t - p),\n ];\n};\n", "import { getRandom } from './random';\nimport { HSLColor, RGBColor } from '../types';\nimport { mod } from './other';\nimport { setDecimalPlaces } from './format';\n\n// ------------------------ RANDOM COLOR -------------------------------------\n\nexport const getRandomRGBColor = () : RGBColor => {\n const hslColor = getRandomHSLColor();\n return hslToRgb(hslColor);\n};\n\nexport const getRandomHexColor = () : string => {\n const hslColor = getRandomHSLColor();\n return hslToHex(hslColor);\n};\n\nexport const getRandomHSLColor = () : HSLColor => {\n const h = getRandom(1, 360);\n const s = getRandom(0, 100);\n const l = getRandom(0, 100);\n return [h, s, l];\n};\n\n/**\n * generate random color with the given hue\n */\nexport const getRandomHSLColorWithHue = (h: number) : HSLColor => {\n const s = getRandom(0, 100);\n const l = getRandom(0, 100);\n return [h, s, l];\n};\n\n/**\n * generate random color with the given saturation\n */\nexport const getRandomHSLColorWithSaturation = (s: number) : HSLColor => {\n const h = getRandom(1, 360);\n const l = getRandom(0, 100);\n return [h, s, l];\n};\n\n/**\n * generate random color with the given lightness\n */\nexport const getRandomHSLColorWithLightness = (l: number) : HSLColor => {\n const h = getRandom(1, 360);\n const s = getRandom(0, 100);\n return [h, s, l];\n};\n\nexport const getRandomGrayscaleHSLColor = () : HSLColor => {\n const l = getRandom(0, 100);\n return [0, 0, l];\n};\n\nexport const getRandomHSLColorWithinRanges = (\n hueStart = 1, hueEnd = 360,\n saturationStart = 0, saturationEnd = 100,\n lightStart = 0, lightEnd = 100\n) : HSLColor => {\n const h = getRandom(hueStart, hueEnd);\n const s = getRandom(saturationStart, saturationEnd);\n const l = getRandom(lightStart, lightEnd);\n return [h, s, l];\n};\n\n// ----------------------- CONVERT COLORS --------------------------------------\n\n/**\n * helper: convert hue value to %\n * @param {number} h\n * @return {number} [0, 100] %\n */\nconst convertHueToPercent = (h : number) : number => {\n\n // the hue value needs to be multiplied by 60 to convert it to degrees\n h *= 60;\n\n // if hue becomes negative, you need to add 360 to, because a circle has 360 degrees\n if(h < 0){\n h += 360;\n }\n\n // convert huw to %\n return h * 100 / 360;\n};\n\n/**\n * get hue from RGB\n * @param {number} r [0, 255]\n * @param {number} g [0, 255]\n * @param {number} b [0, 255]\n * @param {number|undefined=} min - min number of [r, g, b]\n * @param {number|undefined=} max - max number of [r, g, b]\n * @return {number} [0, 100] % - we use here % instead of [0, 359] degrees\n */\nconst getHue = (r : number, g : number, b : number, min : number | undefined = undefined, max : number | undefined = undefined) : number => {\n\n // find the minimum and maximum values of r, g, and b if they are not provided\n min = (min === undefined) ? Math.min(r, g, b) : min;\n max = (min === undefined) ? Math.max(r, g, b) : max;\n\n // if the min and max value are the same -> no hue, as it's gray\n if(min === max) return 0;\n\n // if red is max\n if(max === r){\n return convertHueToPercent((g - b) / (max - min));\n }\n\n // if green is max\n if(max === g){\n return convertHueToPercent(2.0 + (b - r) / (max - min));\n }\n\n // if blue is max\n if(max === b){\n return convertHueToPercent(4.0 + (r - g) / (max - min));\n }\n\n return 0;\n};\n\n/**\n * get luminance from RGB\n * @param {number} r [0, 255]\n * @param {number} g [0, 255]\n * @param {number} b [0, 255]\n * @param {number|undefined=} min - min number of [r, g, b]\n * @param {number|undefined=} max - max number of [r, g, b]\n * @return {number} [0, 100] %\n */\nconst getLuminance = (\n r : number,\n g : number,\n b : number,\n min : number | undefined = undefined,\n max : number | undefined = undefined) : number => {\n\n // find the minimum and maximum values of r, g, and b if they are not provided\n min = (min === undefined) ? Math.min(r, g, b) : min;\n max = (min === undefined) ? Math.max(r, g, b) : max;\n\n // calculate the luminance value\n // @ts-ignore\n const l = (min + max) / 2; // [0, 1]\n\n // return l value in %\n return l * 100;\n};\n\n/**\n * get saturation from RGB\n * @param {number} r [0, 255]\n * @param {number} g [0, 255]\n * @param {number} b [0, 255]\n * @param {number|undefined=} min - min number of [r, g, b]\n * @param {number|undefined=} max - max number of [r, g, b]\n * @param {number|undefined=} l - luminance in [0, 100] %\n * @return {number} [0, 100] %\n */\nconst getSaturation = (\n r : number,\n g : number,\n b : number,\n min : number | undefined = undefined,\n max : number | undefined = undefined,\n l : number | undefined = undefined) : number => {\n\n // find the minimum and maximum values of r, g, and b if they are not provided\n min = (min === undefined) ? Math.min(r, g, b) : min;\n max = (min === undefined) ? Math.max(r, g, b) : max;\n\n // if the min and max value are the same -> no saturation, as it's gray\n if(min === max) return 0;\n\n // calculate luminance if it's not provided\n l = (l === undefined) ? getLuminance(r, g, b) : l;\n\n // check the level of luminance\n const s = (l <= 50) ?\n // @ts-ignore\n ((max - min) / (max + min)) : // this formula is used when luminance <= 50%\n // @ts-ignore\n (max - min) / (2.0 - max - min); // this formula is used when luminance > 50%\n\n // return saturation in %\n return s * 100;\n};\n\nexport const rgbToHsl = (rgb: RGBColor, decimalPlaces = Infinity): HSLColor => {\n\n // convert rgb values to the range [0, 1]\n const r = rgb[0] / 255;\n const g = rgb[1] / 255;\n const b = rgb[2] / 255;\n\n // find the minimum and maximum values of r, g, and b\n const min = Math.min(r, g, b);\n const max = Math.max(r, g, b);\n\n // calculate the luminance value in %\n const l = getLuminance(r, g, b, min, max);\n\n // calculate the saturation in %\n const s = getSaturation(r, g, b, min, max, l);\n\n // calculate the hue in % (not in degrees!)\n const h = getHue(r, g, b, min, max);\n\n if(h > 360 || s > 100 || l > 100){\n return [0, 0, 100];\n }\n\n if(h < 0 || s < 0 || l < 0){\n return [0, 0, 0];\n }\n\n return [\n setDecimalPlaces(h, decimalPlaces),\n setDecimalPlaces(s, decimalPlaces),\n setDecimalPlaces(l, decimalPlaces),\n ];\n};\n\n/**\n * helper: HSL to RGB\n */\nconst hslToRgbHelper = (helper1 : number, helper2 : number, colorHelper : number) : number => {\n\n // all values need to be between 0 and 1\n // if you get a negative value you need to add 1 to it\n if(colorHelper < 0) colorHelper += 1;\n\n // if you get a value above 1 you need to subtract 1 from it.\n if(colorHelper > 1) colorHelper -= 1;\n\n if(colorHelper * 6 < 1) return helper2 + (helper1 - helper2) * 6 * colorHelper;\n\n if(colorHelper * 2 < 1) return helper1;\n\n if(colorHelper * 3 < 2){\n return helper2 + (helper1 - helper2) * (0.666 - colorHelper) * 6;\n }\n else{\n return helper2;\n }\n};\n\nexport const hslToRgb = (hsl: HSLColor, decimalPlaces = Infinity): RGBColor => {\n\n // convert all values to [0, 1] from %\n const h = hsl[0] / 100;\n const s = hsl[1] / 100;\n const l = hsl[2] / 100;\n\n // if there is no saturation -> it\u2019s grey\n if(s === 0){\n // convert the luminance from [0, 1] to [0, 255]\n const gray = l * 255;\n return [gray, gray, gray];\n }\n\n // check the level of luminance\n const helper1 = (l < 0.5) ?\n (l * (1.0 + s)) :\n (l + s - l * s);\n\n const helper2 = 2 * l - helper1;\n\n const rHelper = h + 0.333;\n const gHelper = h;\n const bHelper = h - 0.333;\n\n let r = hslToRgbHelper(helper1, helper2, rHelper);\n let g = hslToRgbHelper(helper1, helper2, gHelper);\n let b = hslToRgbHelper(helper1, helper2, bHelper);\n\n // convert rgb to [0, 255]\n r *= 255;\n g *= 255;\n b *= 255;\n\n if(r > 255 || g > 255 || b > 255){\n return [255, 255, 255];\n }\n\n if(r < 0 || g < 0 || b < 0){\n return [0, 0, 0];\n }\n\n return [\n setDecimalPlaces(r, decimalPlaces),\n setDecimalPlaces(g, decimalPlaces),\n setDecimalPlaces(b, decimalPlaces),\n ];\n};\n\n/**\n * HSL to hex\n * hslToHex(360, 100, 50) // [360, 100, 5] ==> \"#ff0000\" (red)\n */\nexport const hslToHex = (hsl: HSLColor) => {\n\n if(hsl[0] > 360 || hsl[1] > 100 || hsl[2] > 100){\n return '#ffffff';\n }\n\n if(hsl[0] < 0 || hsl[1] < 0 || hsl[2] < 0){\n return '#000000';\n }\n\n const h = hsl[0] / 360;\n const s = hsl[1] / 100;\n const l = hsl[2] / 100;\n\n let r, g, b;\n if (s === 0) {\n r = g = b = l; // achromatic\n } else {\n const hue2rgb = (p: number, q: number, t: number) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n const toHex = (x: number) => {\n const hex = Math.round(x * 255).toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n };\n\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n};\n\n// ----------------------- GET SHIFTED COLORS --------------------------------------\n\nexport const getShiftedHue = (color: HSLColor, shift = 180) : HSLColor => {\n let hue = color[0];\n hue += shift;\n\n if (hue > 360 || hue < 0) {\n hue = mod(hue, 360);\n }\n\n return [hue, color[1], color[2]];\n};\n\nexport const getShiftedLightness = (color: HSLColor, shift = 10) : HSLColor => {\n let lightness = color[2];\n lightness += shift;\n\n if (lightness > 100 || lightness < 0) {\n lightness = mod(lightness, 100);\n }\n\n return [color[0], color[1], lightness];\n};\n\nexport const getShiftedSaturation = (color: HSLColor, shift = 10) : HSLColor => {\n let saturation = color[1];\n saturation += shift;\n\n if (saturation > 100) {\n saturation -= 100;\n }\n\n if(saturation < 0){\n saturation += 100;\n }\n\n return [color[0], saturation, color[2]];\n};\n", "/**\n * guid like '932ade5e-c515-4807-ac01-73b20ab3fb66'\n */\nexport const guid = () => {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = Math.random() * 16 | 0;\n return (c == 'x' ? r : r & 0x3 | 0x8).toString(16);\n });\n};\n\n/**\n * id like 'df4unio1opulby2uqh4'\n */\nexport const newId = () => {\n return Math.random().toString(36).substring(2) + (new Date()).getTime().toString(36);\n};\n", "import { setDecimalPlaces } from './format';\n\n/**\n * get the side of a square inscribed in a circle\n */\nexport const getSquareInCircleSide = (radius: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(radius * 2 / Math.sqrt(2), decimalPlaces);\n};\n", "import { ICircle, IPolygon, IRect, Matrix2, Vector2 } from '../types';\nimport { mod } from './other';\nimport { v2GetNormal, v2DotProduct } from './linear-algebra/vector';\n\n/**\n * Rectangles collision detection.\n * Rectangles should not be rotated.\n * The algorithm works by ensuring there is no gap between any of the 4 sides of the rectangles.\n * Any gap means a collision does not exist.\n * Returns true if collision is detected.\n */\nexport const rectCollide = (rect1: IRect, rect2: IRect) : boolean => {\n return rect1.x <= rect2.x + rect2.w &&\n rect1.x + rect1.w >= rect2.x &&\n rect1.y <= rect2.y + rect2.h &&\n rect1.h + rect1.y >= rect2.y;\n};\n\n/**\n * Circles collision detection.\n * This algorithm works by taking the center points of the two circles\n * and ensuring the distance between the center points\n * are less than the two radii added together.\n * Returns true if collision is detected.\n */\nexport const circleCollide = (circle1: ICircle, circle2: ICircle) => {\n const dx = Math.abs(circle1.cx - circle2.cx);\n const dy = Math.abs(circle1.cy - circle2.cy);\n const distance = Math.sqrt(dx * dx + dy * dy);\n return distance <= circle1.r + circle2.r;\n};\n\n//-------------------- Separating Axis Theorem (SAT) Collision detection -------------------------\n\nconst getEdges = (poly: IPolygon) : Matrix2[] => {\n const edges: Matrix2[] = [];\n\n for(let i= 0; i {\n const edges: Matrix2[] = [];\n\n // collect polygon edges, and combine then into a single array\n edges.push(...getEdges(poly1));\n edges.push(...getEdges(poly2));\n\n // for each edge, find the normal vector and project both polygons onto it\n for (const edge of edges) {\n const normal = v2GetNormal(edge[0], edge[1]);\n const p1Proj = projectPolygon(poly1, normal);\n const p2Proj = projectPolygon(poly2, normal);\n\n // Check if the projections overlap\n const isOverlap = p1Proj.max >= p2Proj.min && p2Proj.max >= p1Proj.min;\n\n // Check if the projections overlap; if not, the polygons do not collide\n if (!isOverlap) return false;\n }\n\n // If all tests pass, the polygons overlap and collide\n return true;\n};\n\n/**\n * Project every polygon point onto the normal.\n * Then find min and max.\n */\nconst projectPolygon = (polygon: IPolygon, normal: Vector2): { min: number, max: number } => {\n let min = Infinity;\n let max = -Infinity;\n\n // Project each vertex of the polygon onto the axis\n for (const vertex of polygon) {\n const projection = v2DotProduct(vertex, normal);\n min = Math.min(min, projection);\n max = Math.max(max, projection);\n }\n\n return { min, max };\n};", "export interface IAnimationProps {\n duration?: number;\n callback: (result: IAnimationResult) => void;\n restartOnResize?: boolean;\n resizeCallback?: (_entries: ResizeObserverEntry[], _observer: ResizeObserver) => void;\n}\n\nexport interface IAnimationResult {\n start: () => void;\n stop: () => void;\n pause: () => void;\n resume: () => void;\n restart: () => void;\n isAnimating: () => boolean;\n getStartTime: () => number|undefined;\n getElapsedTime: () => number|undefined;\n getPercent: () => number|undefined;\n getResizeObserver: () => ResizeObserver|undefined;\n}\n\nexport const animate = (props: IAnimationProps) : IAnimationResult => {\n\n const _duration = props.duration !== undefined ? props.duration : Infinity;\n\n let startTime: number|undefined = undefined; // in milliseconds\n let animationId: number|undefined = undefined;\n\n // the time elapsed since the start of the animation (in milliseconds)\n let elapsed: number|undefined = undefined;\n let previousTimeStamp: number|undefined = undefined;\n\n let animating = false;\n let observer: ResizeObserver|undefined = undefined;\n\n // -------------------- COMMANDS ---------------------\n\n const stop = () => {\n startTime = undefined;\n elapsed = undefined;\n previousTimeStamp = undefined;\n animating = false;\n\n /*if(observer !== undefined){\n observer.disconnect();\n observer = undefined;\n }*/\n\n if(animationId === undefined) return;\n window.cancelAnimationFrame(animationId);\n };\n\n const restart = () => {\n stop();\n start();\n };\n\n const pause = () => {\n animating = false;\n };\n\n const resume = () => {\n animating = true;\n };\n\n /**\n * Animation Step.\n * @param {number} timeStamp in milliseconds\n */\n const step = (timeStamp: DOMHighResTimeStamp) => {\n\n if (startTime === undefined) {\n startTime = timeStamp;\n }\n\n // the time elapsed since the start of the animation (in milliseconds)\n elapsed = timeStamp - startTime;\n\n if (animating && previousTimeStamp !== timeStamp && typeof props.callback === 'function') {\n\n // do the rendering .............\n props.callback(getResult());\n }\n\n if(elapsed <= _duration){\n previousTimeStamp = timeStamp;\n animationId = window.requestAnimationFrame(step);\n }\n else{\n stop();\n }\n };\n\n const observerHandler = (_entries: ResizeObserverEntry[], _observer: ResizeObserver) => {\n restart();\n\n if(typeof props.resizeCallback === 'function'){\n props.resizeCallback(_entries, _observer);\n }\n };\n\n const start = () => {\n startTime = undefined;\n elapsed = undefined;\n previousTimeStamp = undefined;\n animating = true;\n\n if(props.restartOnResize && window.ResizeObserver && observer === undefined){\n observer = new ResizeObserver(observerHandler);\n observer.observe(document.body, { box: 'border-box' });\n }\n else{\n animationId = window.requestAnimationFrame(step);\n }\n };\n\n // --------------- GET INFO ----------------------\n\n /**\n * the time elapsed since the start of the animation (in milliseconds)\n */\n const getElapsedTime = () : number|undefined => {\n return elapsed;\n };\n\n const isAnimating = () => {\n return animating;\n };\n\n const getStartTime = () => {\n return startTime;\n };\n\n const getPercent = () => {\n if(_duration === Infinity || elapsed === undefined) return undefined;\n return elapsed * 100 / _duration;\n };\n\n const getResizeObserver = () => {\n return observer;\n };\n\n const getResult = () : IAnimationResult => {\n return {\n\n // commands --------------\n start,\n stop,\n pause,\n resume,\n restart,\n\n // information -------\n isAnimating,\n getElapsedTime,\n getStartTime,\n getPercent,\n getResizeObserver,\n };\n };\n\n return getResult();\n};\n", "import { setDecimalPlaces, Vector2 } from 'mz-math';\n\nexport interface ISvg {\n cx: number;\n cy: number;\n radius: number;\n size: number;\n thickness: number;\n border: number;\n startAngleDeg: number;\n endAngleDeg: number;\n}\n\nexport const getSvg = (\n circleRadius: number,\n circleThickness: number,\n circleBorder: number,\n maxPointerRadius: number,\n startAngleDeg: number,\n endAngleDeg: number\n) : ISvg => {\n\n const thickness = circleThickness + circleBorder * 2;\n\n const diff = Math.max(0, maxPointerRadius * 2 - thickness);\n const size = circleRadius * 2 + thickness + diff;\n\n const [ cx, cy ] = getSVGCenter(\n circleRadius,\n maxPointerRadius,\n circleThickness,\n circleBorder\n );\n\n return {\n cx,\n cy,\n radius: circleRadius,\n size,\n thickness: circleThickness,\n border: circleBorder,\n startAngleDeg,\n endAngleDeg\n } as ISvg;\n};\n\nconst getSVGCenter = (\n circleRadius: number,\n maxPointerRadius: number,\n circleThickness: number,\n circleBorder: number\n) : Vector2 => {\n\n const size = getSVGSize(\n circleRadius,\n maxPointerRadius,\n circleThickness,\n circleBorder\n );\n\n const val = setDecimalPlaces(size/2, 2);\n\n return [\n val,\n val,\n ];\n};\n\nconst getSVGSize = (\n circleRadius: number,\n maxPointerRadius: number,\n circleThickness: number,\n circleBorder: number\n) : number => {\n const thickness = circleThickness + circleBorder * 2;\n const diff = Math.max(0, maxPointerRadius * 2 - thickness);\n return circleRadius * 2 + thickness + diff;\n};", "// Data Defaults --------------------\nexport const DEFAULT_MIN = 0;\nexport const DEFAULT_MAX = 100;\nexport const DEFAULT_STEP = 1;\nexport const DEFAULT_ARROW_STEP = 1;\nexport const DEFAULT_ROUND = 0;\n\n// Path Defaults ---------------------\nexport const DEFAULT_PATH_START_ANGLE = 0;\nexport const DEFAULT_PATH_END_ANGLE = 360;\nexport const DEFAULT_PATH_RADIUS = 150;\nexport const DEFAULT_PATH_THICKNESS = 5;\nexport const DEFAULT_PATH_BG_COLOR = '#efefef';\nexport const DEFAULT_PATH_BORDER = 0;\nexport const DEFAULT_PATH_BORDER_COLOR = '#444444';\n\n// Pointer Defaults ------------------\nexport const DEFAULT_POINTER_RADIUS = 10;\nexport const DEFAULT_POINTER_BG_COLOR = '#163a86';\nexport const DEFAULT_POINTER_BG_COLOR_SELECTED = '#000';\nexport const DEFAULT_POINTER_BG_COLOR_DISABLED = '#a8a8a8';\nexport const DEFAULT_POINTER_BORDER = 0;\nexport const DEFAULT_POINTER_BORDER_COLOR = '#000';\n\n// Connection Defaults ------------------\nexport const DEFAULT_CONNECTION_BG_COLOR = '#5daed2';\nexport const DEFAULT_CONNECTION_BG_COLOR_DISABLED = '#97b0bb';\n\n// Text Defaults ------------------------\nexport const DEFAULT_TEXT_COLOR = '#000';\nexport const DEFAULT_TEXT_FONT_SIZE = 16;\n\n// Ticks Defaults -----------------------\nexport const DEFAULT_TICKS_WIDTH = 3;\nexport const DEFAULT_TICKS_HEIGHT = 20;\nexport const DEFAULT_TICKS_COLOR = '#efefef';\nexport const DEFAULT_TICKS_VALUES_COLOR = '#000';\nexport const DEFAULT_TICKS_VALUES_FONT_SIZE = 12;\nexport const DEFAULT_TICKS_GROUP_SIZE = 10;\nexport const DEFAULT_TICKS_VALUES_DISTANCE = 15;\n\n\n", "import { isNumber } from 'mz-math';\n\nexport const getNumber = (value: number|string|undefined|null, defaultValue: number) : number => {\n return isNumber(value) ? Number(value) : defaultValue;\n};\n\nexport const getString = (value: string|undefined|null, defaultValue: string) : string => {\n return value === undefined || value === null ? defaultValue : value;\n};\n\nexport const getBoolean = (value: boolean|undefined|null, defaultValue: boolean) : boolean => {\n return value === undefined || value === null ? defaultValue : value;\n};", "import { mod } from 'mz-math';\n\nexport interface ICircle {\n strokeDasharray: string;\n strokeOffset: number;\n}\n\nexport const isAngleInArc = (startAngleDeg: number, endAngleDeg: number, currentDegrees: number) : boolean => {\n\n if(startAngleDeg > endAngleDeg) {\n endAngleDeg += 360;\n }\n\n return currentDegrees >= startAngleDeg && currentDegrees <= endAngleDeg ||\n (currentDegrees + 360) >= startAngleDeg && (currentDegrees + 360) <= endAngleDeg;\n};\n\nexport const getAnglesDistance = (startAngle: number, endAngle: number) => {\n if(endAngle < startAngle) {\n endAngle += 360;\n }\n\n const diff = endAngle - startAngle;\n const diffMod = mod(diff, 360);\n\n return diffMod === 0 && diff > 0 ? 360 : diffMod;\n};\n\nexport const getCircle = (\n startAngleDeg: number,\n endAngleDeg: number,\n radius: number,\n) : ICircle => {\n\n if(startAngleDeg > endAngleDeg) {\n endAngleDeg += 360;\n }\n\n const circumference = 2 * Math.PI *radius;\n\n if(startAngleDeg > endAngleDeg) {\n endAngleDeg += 360;\n }\n\n const angleDiff = endAngleDeg - startAngleDeg;\n const strokeOffset = -(startAngleDeg / 360) * circumference;\n const strokeDasharray = (angleDiff / 360) * circumference;\n const complement = circumference - strokeDasharray;\n\n return {\n strokeDasharray: [ strokeDasharray, complement ].join(' '),\n strokeOffset,\n } as ICircle;\n};", "import {\n Vector2,\n newId,\n convertRange,\n mod,\n setDecimalPlaces,\n v2Sub,\n radiansToDegrees,\n degreesToRadians, circleMovement, v2Distance\n} from 'mz-math';\nimport { ISettings } from './settings-provider';\nimport {\n DEFAULT_PATH_END_ANGLE,\n DEFAULT_PATH_START_ANGLE,\n DEFAULT_POINTER_BG_COLOR, DEFAULT_POINTER_BG_COLOR_DISABLED, DEFAULT_POINTER_BG_COLOR_SELECTED,\n DEFAULT_POINTER_BORDER,\n DEFAULT_POINTER_BORDER_COLOR,\n DEFAULT_POINTER_RADIUS,\n} from './defaults-provider';\nimport { getBoolean, getNumber, getString } from './common-provider';\nimport { IData } from './data-provider';\nimport { getAnglesDistance } from './circle-provider';\n\nexport interface IPointer {\n id: string;\n index: number;\n radius: number;\n angleDeg: number;\n bgColor: string;\n bgColorSelected: string;\n bgColorDisabled: string;\n border: number;\n borderColor: string;\n disabled: boolean;\n ariaLabel?: string;\n}\n\nexport interface IPointers {\n pointers: IPointer[];\n maxRadius: number;\n}\n\nexport const getAngleByMouse = (\n $svg: SVGSVGElement,\n clientX: number,\n clientY: number,\n cx: number,\n cy: number,\n rx: number,\n ry: number\n) => {\n const { left, top } = $svg.getBoundingClientRect();\n\n const relativeMouse: Vector2 = [\n clientX - left,\n clientY - top,\n ];\n\n const vector = v2Sub(relativeMouse, [ cx, cy ]);\n\n let angleRad = Math.atan2(vector[1] / ry, vector[0] / rx);\n if(angleRad < 0){\n angleRad += 2 * Math.PI;\n }\n\n return radiansToDegrees(angleRad);\n};\n\nexport const angle2value = (data: IData, angle: number, pathStartAngle: number, pathEndAngle: number) : string | number => {\n\n if(pathEndAngle < pathStartAngle) {\n pathEndAngle += 360;\n }\n\n if(angle < pathStartAngle){\n angle += 360;\n }\n\n let value: string|number = convertRange(angle, pathStartAngle, pathEndAngle, data.min, data.max);\n\n if(data.data.length > 0) {\n const index = Math.round(value);\n value = data.data[index];\n }\n else{\n value = setDecimalPlaces(value, data.round);\n }\n\n return value;\n};\n\nconst value2angle = (data: IData, value: string | number, pathStartAngle: number, pathEndAngle: number) => {\n let _value: number;\n\n if(pathEndAngle < pathStartAngle) {\n pathEndAngle += 360;\n }\n\n if(data.data.length > 0) {\n const valueIndex = data.data.findIndex(item => item === value);\n _value = valueIndex === -1 ? 0 : valueIndex;\n }\n else{\n _value = typeof value !== 'number' ? data.min : value;\n }\n\n return mod(convertRange(_value, data.min, data.max, pathStartAngle, pathEndAngle), 360);\n};\n\nconst initPointers = (\n settings: ISettings,\n data: IData\n) : IPointer[] => {\n\n if(!settings || !settings.pointers || settings.pointers.length < 0 || !data) {\n return [{\n id: newId(),\n index: 0,\n radius: getNumber(settings.pointerRadius, DEFAULT_POINTER_RADIUS),\n angleDeg: mod(getNumber(settings.pathStartAngle, DEFAULT_PATH_START_ANGLE), 360),\n bgColor: getString(settings.pointerBgColor, DEFAULT_POINTER_BG_COLOR),\n bgColorSelected: getString(settings.pointerBgColorSelected, DEFAULT_POINTER_BG_COLOR_SELECTED),\n bgColorDisabled: getString(settings.pointerBgColorDisabled, DEFAULT_POINTER_BG_COLOR_DISABLED),\n border: getNumber(settings.pointerBorder, DEFAULT_POINTER_BORDER),\n borderColor: getString(settings.pointerBorderColor, DEFAULT_POINTER_BORDER_COLOR),\n disabled: !!settings.disabled,\n }]\n }\n\n const pointers: IPointer[] = [];\n\n for(let i=0; i {\n\n const pointers = initPointers(settings, data);\n\n return {\n pointers,\n maxRadius: getMaxRadius(pointers),\n }\n};\n\nconst getMaxRadius = (pointers: IPointer[]) : number => {\n if(pointers.length <= 0) return 0;\n\n let max = -Infinity;\n\n for(const pointer of pointers){\n max = Math.max(max, Math.max(0, pointer.radius + pointer.border/2));\n }\n\n return max;\n};\n\nexport const getClosestPointer = (\n pointers: IPointer[],\n currentPlaceDegrees: number,\n cx: number,\n cy: number,\n pathRadius: number\n) => {\n if(!pointers || pointers.length <= 0) return null;\n\n if(pointers.length === 1) return pointers[0];\n\n const angleRad = convertRange(degreesToRadians(currentPlaceDegrees), 0, Math.PI * 2, 0, Math.PI); // [0, Math.PI*2] ---> [0, Math.PI]\n const currentPointOnArc = circleMovement([ cx, cy ], angleRad, pathRadius);\n\n let min: number|undefined = undefined;\n let closestPointer: IPointer = null;\n\n const enabledPointers = pointers.filter(p => !p.disabled);\n\n for(const pointer of enabledPointers) {\n const pointerAngleRad = convertRange(degreesToRadians(pointer.angleDeg), 0, Math.PI * 2, 0, Math.PI);\n const pointOnArc = circleMovement([ cx, cy ], pointerAngleRad, pathRadius);\n const distance = v2Distance(currentPointOnArc, pointOnArc);\n\n if(min === undefined || distance < min) {\n min = distance;\n closestPointer = pointer;\n }\n }\n\n return { ...closestPointer };\n};\n\nexport const getClosestEdge = (\n startAngleDegrees: number,\n endAngleDegrees: number,\n currentPlaceDegrees: number,\n cx: number,\n cy: number,\n pathRadius: number\n) => {\n\n const angleRad = convertRange(degreesToRadians(currentPlaceDegrees), 0, Math.PI * 2, 0, Math.PI); // [0, Math.PI*2] ---> [0, Math.PI]\n const currentPointOnArc = circleMovement([ cx, cy ], angleRad, pathRadius);\n\n const startAngleRad = convertRange(degreesToRadians(startAngleDegrees), 0, Math.PI * 2, 0, Math.PI); // [0, Math.PI*2] ---> [0, Math.PI]\n const startPointOnArc = circleMovement([ cx, cy ], startAngleRad, pathRadius);\n\n const endAngleRad = convertRange(degreesToRadians(endAngleDegrees), 0, Math.PI * 2, 0, Math.PI); // [0, Math.PI*2] ---> [0, Math.PI]\n const endPointOnArc = circleMovement([ cx, cy ], endAngleRad, pathRadius);\n\n const distance1 = v2Distance(currentPointOnArc, startPointOnArc);\n const distance2 = v2Distance(currentPointOnArc, endPointOnArc);\n\n return distance1 <= distance2 ? startAngleDegrees : endAngleDegrees;\n};\n\nexport const getMinMaxDistancePointers = (pointers: IPointer[], pathStartAngle: number) : [IPointer, IPointer] | null => {\n if(!pointers || pointers.length <= 0) return null;\n\n let minDistance = undefined;\n let maxDistance = undefined;\n let minPointer = null;\n let maxPointer = null;\n\n for(const pointer of pointers) {\n\n const distance = getAnglesDistance(pathStartAngle, pointer.angleDeg);\n\n if(minDistance === undefined || distance < minDistance) {\n minPointer = pointer;\n minDistance = distance;\n }\n\n if(maxDistance === undefined || distance > maxDistance) {\n maxPointer = pointer;\n maxDistance = distance;\n }\n }\n\n if(minPointer === null || maxPointer === null) return null;\n\n return [\n minPointer,\n maxPointer\n ];\n};\n\nexport const roundToStep = (num: number, step: number) : number => {\n return step === 0 ? 0 : Math.round(num / step) * step;\n};\n", "import { angle2value, getAngleByMouse, getClosestEdge, IPointer } from '../domain/pointers-provider';\nimport {\n useEffect,\n useState,\n MouseEvent as ReactMouseEvent,\n TouchEvent as ReactTouchEvent,\n KeyboardEvent,\n useRef, useCallback, MutableRefObject\n} from 'react';\nimport { circleMovement, convertRange, degreesToRadians, Vector2 } from 'mz-math';\nimport { ISettings } from '../domain/settings-provider';\nimport { ISvg } from '../domain/svg-provider';\nimport { isAngleInArc } from '../domain/circle-provider';\nimport { IData } from '../domain/data-provider';\nimport { outlineNoneStyle } from '../domain/style-provider';\n\nexport interface IPointerProps {\n settings: ISettings;\n pointer: IPointer;\n svg: ISvg;\n $svg: SVGSVGElement;\n setPointer: (pointer: IPointer, newAngleDeg: number) => void;\n data: IData;\n}\n\nconst getPointerFill = (\n pointer: IPointer,\n pointerRef: MutableRefObject,\n bgColor: string,\n bgColorSelected: string,\n bgColorDisabled: string\n) => {\n if(pointer.disabled) return bgColorDisabled;\n\n if(document.activeElement === pointerRef.current) {\n return bgColorSelected || bgColor;\n }\n\n return bgColor;\n};\n\nconst Pointer = (props: IPointerProps) => {\n\n const pointerRef = useRef(null);\n\n const {\n pointer, svg, $svg,\n setPointer, data, settings,\n } = props;\n\n const {\n radius,\n angleDeg,\n bgColor,\n bgColorSelected,\n bgColorDisabled,\n border,\n borderColor,\n } = props.pointer;\n\n const { cx, cy } = svg;\n\n const [ center, setCenter ] = useState(null);\n const [ value, setValue ] = useState('');\n\n useEffect(() => {\n const value = angle2value(\n data,\n pointer.angleDeg,\n svg.startAngleDeg,\n svg.endAngleDeg\n );\n setValue(value === undefined ? '' : value.toString())\n }, [\n data,\n pointer.angleDeg,\n svg.startAngleDeg,\n svg.endAngleDeg,\n ]);\n\n useEffect(() => {\n const angleRad = convertRange(degreesToRadians(angleDeg), 0, Math.PI * 2, 0, Math.PI); // [0, Math.PI*2] ---> [0, Math.PI]\n const pointerCenter = circleMovement([cx, cy], angleRad, svg.radius);\n setCenter(pointerCenter);\n }, [\n angleDeg,\n cx,\n cy,\n svg.radius,\n ]);\n\n const onValueChange = useCallback((evt: MouseEvent | ReactMouseEvent | TouchEvent | ReactTouchEvent) => {\n if(!$svg || settings.disabled || pointer.disabled) return;\n\n const mouseX = evt.type.indexOf('mouse') !== -1 ? (evt as MouseEvent).clientX : (evt as TouchEvent).touches[0].clientX;\n const mouseY = evt.type.indexOf('mouse') !== -1 ? (evt as MouseEvent).clientY : (evt as TouchEvent).touches[0].clientY;\n\n const degrees = getAngleByMouse(\n $svg,\n mouseX,\n mouseY,\n svg.cx,\n svg.cy,\n svg.radius,\n svg.radius\n );\n\n let newAngleDeg;\n\n if(!isAngleInArc(\n svg.startAngleDeg,\n svg.endAngleDeg,\n degrees\n )){\n newAngleDeg = getClosestEdge(\n svg.startAngleDeg,\n svg.endAngleDeg,\n pointer.angleDeg,\n svg.cx,\n svg.cy,\n svg.radius\n );\n }\n else{\n newAngleDeg = degrees;\n }\n\n setPointer(pointer, newAngleDeg);\n }, [\n $svg,\n pointer,\n setPointer,\n svg.cx,\n svg.cy,\n svg.endAngleDeg,\n svg.radius,\n svg.startAngleDeg,\n settings.disabled,\n ]);\n\n const onMouseUp = () => {\n window.removeEventListener('mousemove', onValueChange);\n window.removeEventListener('mouseup', onValueChange);\n };\n\n const onMouseDown = (evt: ReactMouseEvent) => {\n if(settings.disabled || pointer.disabled) return;\n\n onValueChange(evt);\n\n window.addEventListener('mousemove', onValueChange);\n window.addEventListener('mouseup', onMouseUp);\n };\n\n const onKeyDown = (evt: KeyboardEvent) => {\n\n if(settings.disabled || pointer.disabled || settings.keyboardDisabled) return;\n\n switch (evt.key) {\n case 'ArrowLeft': {\n evt.preventDefault();\n setPointer(pointer, pointer.angleDeg + data.stepAngleDeg);\n break;\n }\n\n case 'ArrowRight': {\n evt.preventDefault();\n setPointer(pointer, pointer.angleDeg - data.stepAngleDeg);\n break;\n }\n\n case 'ArrowUp': {\n evt.preventDefault();\n setPointer(pointer, pointer.angleDeg - data.stepAngleDeg);\n break;\n }\n\n case 'ArrowDown': {\n evt.preventDefault();\n setPointer(pointer, pointer.angleDeg + data.stepAngleDeg);\n break;\n }\n }\n };\n\n useEffect(() => {\n const $current = pointerRef.current;\n\n const onTouch = (evt: TouchEvent | ReactTouchEvent) => {\n if(settings.disabled || pointer.disabled) return;\n\n evt.preventDefault();\n evt.stopPropagation();\n onValueChange(evt);\n };\n\n const onWheel = (evt: WheelEvent) => {\n\n if(settings.disabled || pointer.disabled || settings.mousewheelDisabled || document.activeElement !== $current) return;\n\n evt.stopPropagation();\n evt.preventDefault();\n\n const scrollTop = evt.deltaY < 0;\n\n let newAngleDeg;\n if(scrollTop) {\n newAngleDeg = pointer.angleDeg + data.stepAngleDeg;\n }\n else{\n newAngleDeg = pointer.angleDeg - data.stepAngleDeg;\n }\n\n setPointer(pointer, newAngleDeg);\n };\n\n $current?.addEventListener('touchmove', onTouch, {\n passive: false,\n });\n\n document.addEventListener('wheel', onWheel, {\n passive: false,\n });\n\n return () => {\n $current?.removeEventListener('touchmove', onTouch);\n document.removeEventListener('wheel', onWheel);\n };\n }, [\n center,\n onValueChange,\n data.stepAngleDeg,\n pointer,\n setPointer,\n settings.disabled,\n settings.mousewheelDisabled,\n ]);\n\n return (\n <>\n {\n center &&\n \n\n {\n !settings.pointerSVG &&\n \n }\n\n {\n settings.pointerSVG &&\n \n { settings.pointerSVG }\n \n }\n \n }\n \n )\n};\n\nexport default Pointer;", "export const outlineNoneStyle = {\n outline: 'none',\n};", "import { IPointer, IPointers } from '../domain/pointers-provider';\nimport Pointer from './Pointer';\nimport { ISettings } from '../domain/settings-provider';\nimport { ISvg } from '../domain/svg-provider';\nimport { IData } from '../domain/data-provider';\n\nexport interface IPointersProps {\n pointers: IPointers;\n settings: ISettings;\n svg: ISvg;\n $svg: SVGSVGElement;\n setPointer: (pointer: IPointer, newAngleDeg: number) => void;\n data: IData;\n}\n\nconst Pointers = (props: IPointersProps) => {\n\n const { pointers, settings, svg, $svg, setPointer, data } = props;\n\n return (\n <>\n {\n pointers.pointers.map(pointer => {\n\n return (\n \n )\n })\n }\n \n )\n};\n\nexport default Pointers;", "import { ISettings } from './settings-provider';\nimport { getNumber } from './common-provider';\nimport {\n DEFAULT_ARROW_STEP,\n DEFAULT_MAX,\n DEFAULT_MIN,\n DEFAULT_PATH_END_ANGLE,\n DEFAULT_PATH_START_ANGLE,\n DEFAULT_ROUND,\n DEFAULT_STEP\n} from './defaults-provider';\nimport { mod } from 'mz-math';\n\nexport interface IData {\n min: number;\n max: number;\n stepAngleDeg: number;\n arrowStepAngleDeg: number;\n round: number;\n data: (string | number)[];\n isClosedShape: boolean;\n}\n\nexport const getData = (setting: ISettings) : IData => {\n\n let min = getNumber(setting.min, DEFAULT_MIN);\n let max = getNumber(setting.max, DEFAULT_MAX);\n const step = getNumber(setting.step, DEFAULT_STEP);\n const arrowStep = getNumber(setting.arrowStep, DEFAULT_ARROW_STEP);\n const round = getNumber(setting.round, DEFAULT_ROUND);\n const data = setting.data || [];\n\n if(data.length > 0) {\n const minIndex = data.findIndex(item => item === min);\n const maxIndex = data.findIndex(item => item === max);\n\n min = minIndex === -1 ? 0 : minIndex;\n max = maxIndex === -1 ? data.length : maxIndex;\n }\n else{\n if(min > max) {\n min = max + DEFAULT_MAX;\n }\n }\n\n const pathStartAngle = getNumber(setting.pathStartAngle, DEFAULT_PATH_START_ANGLE);\n const pathEndAngle = getNumber(setting.pathEndAngle, DEFAULT_PATH_END_ANGLE);\n const isClosedShape = mod(pathStartAngle, 360) === mod(pathEndAngle, 360);\n\n const stepAngleDeg = step * 360 / (max - min);\n const arrowStepAngleDeg = arrowStep * 360 / (max - min);\n\n return {\n min,\n max,\n round,\n data,\n stepAngleDeg,\n arrowStepAngleDeg,\n isClosedShape,\n }\n};", "import { ISettings } from '../domain/settings-provider';\nimport { getBoolean, getString } from '../domain/common-provider';\nimport { DEFAULT_CONNECTION_BG_COLOR, DEFAULT_CONNECTION_BG_COLOR_DISABLED } from '../domain/defaults-provider';\nimport {\n getAngleByMouse,\n getClosestPointer,\n getMinMaxDistancePointers,\n IPointer,\n IPointers\n} from '../domain/pointers-provider';\nimport {\n MouseEvent as ReactMouseEvent,\n useCallback,\n useEffect, useRef,\n useState\n} from 'react';\nimport { getConnection, IConnection } from '../domain/connection-provider';\nimport { ISvg } from '../domain/svg-provider';\nimport { IData } from '../domain/data-provider';\nimport { mod } from 'mz-math';\n\ninterface IConnectionProps {\n settings: ISettings;\n pointers: IPointers;\n svg: ISvg;\n $svg: SVGSVGElement;\n data: IData;\n setPointer: (pointer: IPointer, newAngleDeg: number) => void;\n}\n\nconst Connection = (props: IConnectionProps) => {\n\n const { settings, pointers, $svg, svg, data, setPointer } = props;\n\n const [ connection, setConnection ] = useState(null);\n\n const rangeDraggingLastAngle = useRef();\n\n useEffect(() => {\n setConnection(getConnection(\n pointers,\n svg.radius,\n svg.cx,\n svg.cy,\n svg.startAngleDeg,\n svg.endAngleDeg\n ));\n }, [\n pointers,\n svg.radius,\n svg.cx,\n svg.cy,\n svg.startAngleDeg,\n svg.endAngleDeg\n ]);\n\n const onClick = (evt: ReactMouseEvent) => {\n if(!$svg || settings.disabled) return;\n\n const degrees = getAngleByMouse(\n $svg,\n evt.clientX,\n evt.clientY,\n svg.cx,\n svg.cy,\n svg.radius,\n svg.radius\n );\n\n const closestPointer = getClosestPointer(\n pointers.pointers,\n degrees,\n svg.cx,\n svg.cy,\n svg.radius\n );\n\n if(!closestPointer) return;\n\n setPointer(closestPointer, degrees);\n };\n\n const onValueChange = useCallback((evt: MouseEvent | ReactMouseEvent) => {\n if(!$svg || settings.disabled || !settings.rangeDragging) return;\n\n const minMaxResult = getMinMaxDistancePointers(pointers.pointers, svg.startAngleDeg);\n if(!minMaxResult) return;\n\n const [ minPointer, maxPointer ] = minMaxResult;\n\n const mouseDegrees = getAngleByMouse(\n $svg,\n evt.clientX,\n evt.clientY,\n svg.cx,\n svg.cy,\n svg.radius,\n svg.radius\n );\n\n if(rangeDraggingLastAngle.current === undefined) {\n rangeDraggingLastAngle.current = mouseDegrees;\n return;\n }\n\n const diff = (mouseDegrees - rangeDraggingLastAngle.current);\n if(diff === 0 || Math.abs(diff) < data.stepAngleDeg) return;\n\n setPointer(minPointer, mod(minPointer.angleDeg + diff, 360));\n setPointer(maxPointer, mod(maxPointer.angleDeg + diff, 360));\n\n rangeDraggingLastAngle.current = mouseDegrees;\n }, [\n $svg,\n svg.cx,\n svg.cy,\n svg.radius,\n data.stepAngleDeg,\n pointers.pointers,\n setPointer,\n settings.disabled,\n settings.rangeDragging,\n svg.startAngleDeg,\n ]);\n\n const onMouseUp = () => {\n window.removeEventListener('mousemove', onValueChange);\n window.removeEventListener('mouseup', onValueChange);\n\n rangeDraggingLastAngle.current = undefined;\n };\n\n const onMouseDown = (evt: ReactMouseEvent) => {\n if(!settings.rangeDragging || settings.disabled || pointers.pointers.length <= 1) return;\n\n onValueChange(evt);\n\n window.addEventListener('mousemove', onValueChange);\n window.addEventListener('mouseup', onMouseUp);\n };\n\n return (\n <>\n {\n !getBoolean(settings.hideConnection, false) && connection &&\n \n }\n \n )\n};\n\nexport default Connection;", "import { getMinMaxDistancePointers, IPointers } from './pointers-provider';\nimport { getAnglesDistance } from './circle-provider';\n\nexport interface IConnection {\n radius: number;\n cx: number;\n cy: number;\n\n // calculated properties ---------\n startAngleDeg: number;\n endAngleDeg: number;\n strokeDasharray: number[];\n strokeOffset: number;\n}\n\nexport const getConnection = (\n pointers: IPointers,\n radius: number,\n cx: number,\n cy: number,\n pathStartAngle: number,\n pathEndAngle: number,\n) : IConnection => {\n\n if(!pointers.pointers || pointers.pointers.length <= 0) return null;\n\n const result : IConnection = {\n radius,\n cx,\n cy,\n\n // calculated properties ---------\n startAngleDeg: pathStartAngle,\n endAngleDeg: pathStartAngle,\n strokeDasharray: [0, 0],\n strokeOffset: 0,\n };\n\n // Define start/end angles.\n if(pointers.pointers.length === 1) {\n result.startAngleDeg = pathStartAngle;\n result.endAngleDeg = pointers.pointers[0].angleDeg;\n }\n else{\n const minMaxResult = getMinMaxDistancePointers(pointers.pointers, pathStartAngle);\n if(!minMaxResult) return null;\n\n const [ minPointer, maxPointer ] = minMaxResult;\n\n result.startAngleDeg = minPointer.angleDeg;\n result.endAngleDeg = maxPointer.angleDeg;\n }\n\n const pathAnglesDistance = getAnglesDistance(pathStartAngle, pathEndAngle);\n\n if(result.startAngleDeg > result.endAngleDeg) {\n result.endAngleDeg += 360;\n }\n\n let angleDistance = getAnglesDistance(result.startAngleDeg, result.endAngleDeg);\n\n const shouldSwitch = angleDistance > pathAnglesDistance;\n\n if(shouldSwitch) {\n angleDistance = 360 - angleDistance;\n [result.startAngleDeg, result.endAngleDeg] = [result.endAngleDeg, result.startAngleDeg];\n }\n\n const circumference = 2 * Math.PI * radius;\n const strokeOffset = -(result.startAngleDeg / 360) * circumference;\n const strokeDasharray = (angleDistance / 360) * circumference;\n const complement = circumference - strokeDasharray;\n\n result.strokeDasharray = [ strokeDasharray, complement ];\n result.strokeOffset = strokeOffset;\n\n return result;\n};", "import { ISettings } from '../domain/settings-provider';\nimport { angle2value, IPointers } from '../domain/pointers-provider';\nimport { getBoolean, getNumber, getString } from '../domain/common-provider';\nimport {\n DEFAULT_TEXT_COLOR,\n DEFAULT_TEXT_FONT_SIZE\n} from '../domain/defaults-provider';\nimport { useEffect, useState } from 'react';\nimport { ISvg } from '../domain/svg-provider';\nimport { IData } from '../domain/data-provider';\n\ninterface ITextProps {\n settings: ISettings;\n pointers: IPointers;\n svg: ISvg;\n data: IData;\n}\n\nconst Text = (props: ITextProps) => {\n\n const { settings, pointers, svg, data } = props;\n\n const { cx, cy } = svg;\n const [ value, setValue ] = useState('');\n\n useEffect(() => {\n\n const values = pointers.pointers.map(pointer => angle2value(\n data,\n pointer.angleDeg,\n svg.startAngleDeg,\n svg.endAngleDeg\n ));\n\n values.sort((value1, value2) => {\n return value1.toString().localeCompare(\n value2.toString(),\n 'en',\n { numeric: true }\n );\n });\n\n const texts = values.map(value => `${ settings.textPrefix || '' }${ value }${ settings.textSuffix || '' }`);\n setValue(texts.join(' '));\n\n }, [\n data,\n pointers.pointers,\n svg.startAngleDeg,\n svg.endAngleDeg,\n settings.textPrefix,\n settings.textSuffix,\n ]);\n\n const hideText = getBoolean(settings.hideText, false);\n\n return (\n <>\n {\n !hideText &&\n \n\n { value }\n\n \n }\n \n )\n};\n\nexport default Text;", "import { useEffect, useState, Fragment } from 'react';\nimport { getTicks, getTicksSettings, ITick, ITicks } from '../domain/ticks-provider';\nimport { ISettings } from '../domain/settings-provider';\nimport { ISvg } from '../domain/svg-provider';\nimport { IData } from '../domain/data-provider';\n\ninterface ITicksProps {\n settings: ISettings;\n svg: ISvg;\n data: IData;\n}\n\nconst Ticks = (props: ITicksProps) => {\n\n const { settings, svg, data } = props;\n\n const [ ticksSettings, setTicksSettings ] = useState(null);\n const [ ticks, setTicks ] = useState([]);\n\n useEffect(() => {\n setTicksSettings(getTicksSettings(settings, data));\n }, [\n settings,\n data,\n ]);\n\n useEffect(() => {\n if(!ticksSettings) return;\n\n let endAngleDeg = svg.endAngleDeg;\n if(endAngleDeg < svg.startAngleDeg) {\n endAngleDeg += 360;\n }\n\n setTicks(getTicks(\n ticksSettings,\n ticksSettings.ticksCount,\n svg.startAngleDeg,\n endAngleDeg,\n svg,\n data\n ));\n }, [\n data,\n svg,\n ticksSettings,\n ]);\n\n return (\n <>\n {\n ticksSettings && !ticksSettings.disableTicks &&\n \n {\n ticks.map((tick, i) => {\n const { x, y, x1, y1, textX, textY, showText } = tick;\n\n return (\n \n \n\n {\n showText &&\n \n { tick.tickValue }\n \n }\n \n );\n })\n }\n \n }\n \n )\n};\n\nexport default Ticks;", "import {\n circleMovement,\n convertRange,\n degreesToRadians,\n setDecimalPlaces,\n v2MulScalar,\n v2Normalize\n} from 'mz-math';\nimport { ISvg } from './svg-provider';\nimport { IData } from './data-provider';\nimport { ISettings } from './settings-provider';\nimport { getBoolean, getNumber, getString } from './common-provider';\nimport {\n DEFAULT_TICKS_COLOR, DEFAULT_TICKS_GROUP_SIZE,\n DEFAULT_TICKS_HEIGHT, DEFAULT_TICKS_VALUES_COLOR,\n DEFAULT_TICKS_VALUES_DISTANCE, DEFAULT_TICKS_VALUES_FONT_SIZE,\n DEFAULT_TICKS_WIDTH\n} from './defaults-provider';\n\nexport interface ITicks {\n ticksCount: number;\n disableTicks: boolean;\n ticksWidth: number;\n ticksHeight: number;\n longerTicksHeight: number;\n ticksDistanceToPanel: number;\n tickValuesDistance: number;\n ticksColor: string;\n tickValuesColor: string;\n tickValuesFontSize: number;\n ticksGroupSize: number;\n longerTickValuesOnly: boolean;\n showTickValues: boolean;\n}\n\nexport interface ITick {\n x: number;\n y: number;\n x1: number;\n y1: number;\n textX: number;\n textY: number;\n isLonger: boolean;\n showText: boolean;\n tickValue?: string;\n}\n\nexport const getTicksSettings = (settings: ISettings, data: IData) : ITicks => {\n\n let ticksCount = getNumber(settings.ticsCount, 0);\n if(!ticksCount) {\n if(data.data && data.data.length > 0) {\n ticksCount = data.data.length;\n }\n else{\n ticksCount = data.max;\n }\n }\n\n const ticksHeight = getNumber(settings.ticksHeight, DEFAULT_TICKS_HEIGHT);\n\n return {\n ticksCount,\n disableTicks: getBoolean(settings.disableTicks, false),\n ticksWidth: getNumber(settings.ticksWidth, DEFAULT_TICKS_WIDTH),\n ticksHeight,\n longerTicksHeight: getNumber(settings.longerTicksHeight, ticksHeight * 2),\n ticksDistanceToPanel: getNumber(settings.ticksDistanceToPanel, 0),\n tickValuesDistance: getNumber(settings.tickValuesDistance, DEFAULT_TICKS_VALUES_DISTANCE),\n ticksColor: getString(settings.ticksColor, DEFAULT_TICKS_COLOR),\n tickValuesColor: getString(settings.tickValuesColor, DEFAULT_TICKS_VALUES_COLOR),\n tickValuesFontSize: getNumber(settings.tickValuesFontSize, DEFAULT_TICKS_VALUES_FONT_SIZE),\n ticksGroupSize: getNumber(settings.ticksGroupSize, DEFAULT_TICKS_GROUP_SIZE),\n longerTickValuesOnly: getBoolean(settings.longerTickValuesOnly, true),\n showTickValues: getBoolean(settings.showTickValues, true),\n };\n};\n\nexport const getTicks = (\n ticksSettings: ITicks,\n ticsCount: number,\n pathStartAngle: number,\n pathEndAngle: number,\n svg: ISvg,\n data: IData\n) : ITick[] => {\n\n const ticks: ITick[] = [];\n\n const deltaAngle = Math.abs(pathEndAngle - pathStartAngle);\n const oneTickAngleSize = ticsCount === 0 ? 0 : deltaAngle / ticsCount;\n\n let count = ticsCount;\n if(!data.isClosedShape) {\n count++;\n }\n\n for(let i=0; i [0, Math.PI]\n\n let [x, y] = circleMovement([svg.cx, svg.cy], angleRad, svg.radius);\n\n const isLonger = ticksSettings.ticksGroupSize !== undefined && (i % ticksSettings.ticksGroupSize === 0 );\n\n let desiredDistance = ticksSettings.ticksHeight;\n\n if(isLonger) {\n desiredDistance = ticksSettings.longerTicksHeight;\n }\n\n const normalizedDirectionVector = v2Normalize([svg.cx - x, svg.cy - y]);\n const tickEndVector = v2MulScalar(normalizedDirectionVector, desiredDistance);\n\n const tickStartVector = v2MulScalar(normalizedDirectionVector, ticksSettings.ticksDistanceToPanel);\n x += tickStartVector[0];\n y += tickStartVector[1];\n\n const x1 = x + tickEndVector[0];\n const y1 = y + tickEndVector[1];\n\n // ------- Define tick value. ---------------------\n let tickValue: string|undefined = undefined;\n if(ticksSettings.showTickValues && (!ticksSettings.longerTickValuesOnly || ticksSettings.longerTickValuesOnly && (isLonger || ticksSettings.ticksGroupSize === undefined))) {\n\n let value: string|number = convertRange(i, 0, ticsCount, data.min, data.max);\n\n if(data.data.length > 0) {\n const index = Math.round(value);\n value = data.data[index];\n }\n else{\n value = setDecimalPlaces(value, data.round);\n }\n\n tickValue = (value ?? '').toString();\n }\n\n let textX = 0;\n let textY = 0;\n const showText = tickValue !== undefined;\n\n if(showText) {\n const _tickValuesDistance = getNumber(desiredDistance + ticksSettings.tickValuesDistance, desiredDistance * 1.5);\n const tickTextVector = v2MulScalar(normalizedDirectionVector, _tickValuesDistance);\n textX = x + tickTextVector[0];\n textY = y + tickTextVector[1];\n }\n\n ticks.push({\n x,\n y,\n x1,\n y1,\n textX,\n textY,\n isLonger,\n tickValue,\n showText,\n });\n }\n\n return ticks;\n};", "import { useEffect, useState, MouseEvent } from 'react';\nimport { getCircle, ICircle } from '../domain/circle-provider';\nimport { getString } from '../domain/common-provider';\nimport { ISettings } from '../domain/settings-provider';\nimport {\n DEFAULT_PATH_BG_COLOR,\n DEFAULT_PATH_BORDER_COLOR,\n} from '../domain/defaults-provider';\nimport { ISvg } from '../domain/svg-provider';\nimport { getAngleByMouse, getClosestPointer, IPointer, IPointers } from '../domain/pointers-provider';\n\ninterface ICircleProps {\n settings: ISettings;\n pointers: IPointers;\n svg: ISvg;\n $svg: SVGSVGElement;\n setPointer: (pointer: IPointer, newAngleDeg: number) => void;\n}\n\nconst Circle = (props: ICircleProps) => {\n\n const { settings, pointers, $svg, svg, setPointer } = props;\n const [ circle, setCircle ] = useState({\n strokeDasharray: '0 1000000',\n strokeOffset: 0,\n });\n\n useEffect(() => {\n setCircle(getCircle(\n svg.startAngleDeg,\n svg.endAngleDeg,\n svg.radius\n ));\n }, [\n svg.startAngleDeg,\n svg.endAngleDeg,\n svg.radius,\n ]);\n\n const onClick = (evt: MouseEvent) => {\n if(!$svg || settings.disabled) return;\n\n const degrees = getAngleByMouse(\n $svg,\n evt.clientX,\n evt.clientY,\n svg.cx,\n svg.cy,\n svg.radius,\n svg.radius\n );\n\n const closestPointer = getClosestPointer(\n pointers.pointers,\n degrees,\n svg.cx,\n svg.cy,\n svg.radius\n );\n\n if(!closestPointer) return;\n\n setPointer(closestPointer, degrees);\n };\n\n return (\n \n {\n svg.border > 0 &&\n \n }\n\n \n \n )\n};\n\nexport default Circle;\n"], + "mappings": "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", + "names": ["require_react_production_min", "__commonJSMin", "exports", "l", "n", "p", "q", "r", "t", "u", "v", "w", "x", "y", "z", "A", "a", "B", "C", "D", "E", "b", "e", "F", "G", "H", "I", "J", "K", "L", "M", "d", "c", "k", "h", "g", "f", "m", "N", "O", "escape", "P", "Q", "R", "S", "T", "U", "V", "W", "require_react", "__commonJSMin", "exports", "module", "require_react_jsx_runtime_production_min", "__commonJSMin", "exports", "f", "k", "l", "m", "n", "p", "q", "c", "a", "g", "b", "d", "e", "h", "require_jsx_runtime", "__commonJSMin", "exports", "module", "import_react", "setDecimalPlaces", "num", "decimalPlaces", "coefficient", "__pow", "mod", "n", "m", "convertRange", "x", "a", "b", "c", "d", "isNumber", "value", "radiansToDegrees", "radians", "decimalPlaces", "res", "setDecimalPlaces", "degreesToRadians", "degrees", "vSub", "vector1", "vector2", "decimalPlaces", "vector", "i", "setDecimalPlaces", "v2Sub", "vMulScalar", "v", "scalar", "decimalPlaces", "vector", "i", "setDecimalPlaces", "v2MulScalar", "v2", "vLength", "vector", "decimalPlaces", "sum", "i", "setDecimalPlaces", "v2Distance", "vector1", "vector2", "decimalPlaces", "diff", "vSub", "vLength", "vNormalize", "v", "decimalPlaces", "length", "vLength", "unitVector", "i", "setDecimalPlaces", "v2Normalize", "v2", "circleMovement", "center", "angle", "radius", "newId", "getSvg", "circleRadius", "circleThickness", "circleBorder", "maxPointerRadius", "startAngleDeg", "endAngleDeg", "thickness", "diff", "size", "cx", "cy", "getSVGCenter", "getSVGSize", "val", "s", "DEFAULT_PATH_BG_COLOR", "DEFAULT_PATH_BORDER_COLOR", "DEFAULT_POINTER_BG_COLOR", "DEFAULT_POINTER_BG_COLOR_SELECTED", "DEFAULT_POINTER_BG_COLOR_DISABLED", "DEFAULT_POINTER_BORDER_COLOR", "DEFAULT_CONNECTION_BG_COLOR", "DEFAULT_CONNECTION_BG_COLOR_DISABLED", "DEFAULT_TEXT_COLOR", "DEFAULT_TICKS_COLOR", "DEFAULT_TICKS_VALUES_COLOR", "getNumber", "value", "defaultValue", "H", "getString", "getBoolean", "isAngleInArc", "startAngleDeg", "endAngleDeg", "currentDegrees", "getAnglesDistance", "startAngle", "endAngle", "diff", "diffMod", "I", "getCircle", "radius", "circumference", "angleDiff", "strokeOffset", "strokeDasharray", "complement", "getAngleByMouse", "$svg", "clientX", "clientY", "cx", "cy", "rx", "ry", "left", "top", "relativeMouse", "vector", "R", "angleRad", "fr", "angle2value", "data", "angle", "pathStartAngle", "pathEndAngle", "value", "O", "index", "s", "value2angle", "_value", "valueIndex", "item", "I", "initPointers", "settings", "Lo", "getNumber", "getString", "DEFAULT_POINTER_BG_COLOR", "DEFAULT_POINTER_BG_COLOR_SELECTED", "DEFAULT_POINTER_BG_COLOR_DISABLED", "DEFAULT_POINTER_BORDER_COLOR", "pointers", "i", "settingPointer", "radius", "bgColor", "bgColorSelected", "bgColorDisabled", "border", "borderColor", "disabled", "getBoolean", "angleDeg", "angleAfterStep", "roundToStep", "getPointers", "getMaxRadius", "max", "pointer", "getClosestPointer", "currentPlaceDegrees", "pathRadius", "pr", "currentPointOnArc", "_t", "min", "closestPointer", "enabledPointers", "p", "pointerAngleRad", "pointOnArc", "distance", "Hr", "__spreadValues", "getClosestEdge", "startAngleDegrees", "endAngleDegrees", "startAngleRad", "startPointOnArc", "endAngleRad", "endPointOnArc", "distance1", "distance2", "getMinMaxDistancePointers", "minDistance", "maxDistance", "minPointer", "maxPointer", "getAnglesDistance", "num", "step", "import_react", "outlineNoneStyle", "import_jsx_runtime", "getPointerFill", "pointer", "pointerRef", "bgColor", "bgColorSelected", "bgColorDisabled", "Pointer", "props", "svg", "$svg", "setPointer", "data", "settings", "radius", "angleDeg", "border", "borderColor", "cx", "cy", "center", "setCenter", "value", "setValue", "angle2value", "angleRad", "O", "pr", "pointerCenter", "_t", "onValueChange", "evt", "mouseX", "mouseY", "degrees", "getAngleByMouse", "newAngleDeg", "isAngleInArc", "getClosestEdge", "onMouseUp", "onMouseDown", "onKeyDown", "$current", "onTouch", "onWheel", "scrollTop", "outlineNoneStyle", "Pointer_default", "import_jsx_runtime", "Pointers", "props", "pointers", "settings", "svg", "$svg", "setPointer", "data", "pointer", "Pointer_default", "Pointers_default", "getData", "setting", "min", "getNumber", "max", "step", "arrowStep", "round", "data", "minIndex", "item", "maxIndex", "pathStartAngle", "pathEndAngle", "isClosedShape", "I", "stepAngleDeg", "arrowStepAngleDeg", "import_react", "getConnection", "pointers", "radius", "cx", "cy", "pathStartAngle", "pathEndAngle", "result", "minMaxResult", "getMinMaxDistancePointers", "minPointer", "maxPointer", "pathAnglesDistance", "getAnglesDistance", "angleDistance", "circumference", "strokeOffset", "strokeDasharray", "complement", "import_jsx_runtime", "Connection", "props", "settings", "pointers", "$svg", "svg", "data", "setPointer", "connection", "setConnection", "rangeDraggingLastAngle", "getConnection", "onClick", "evt", "degrees", "getAngleByMouse", "closestPointer", "getClosestPointer", "onValueChange", "minMaxResult", "getMinMaxDistancePointers", "minPointer", "maxPointer", "mouseDegrees", "diff", "I", "onMouseUp", "onMouseDown", "getBoolean", "getString", "DEFAULT_CONNECTION_BG_COLOR_DISABLED", "DEFAULT_CONNECTION_BG_COLOR", "Connection_default", "import_react", "import_jsx_runtime", "Text", "props", "settings", "pointers", "svg", "data", "cx", "cy", "value", "setValue", "values", "pointer", "angle2value", "value1", "value2", "texts", "hideText", "getBoolean", "getString", "DEFAULT_TEXT_COLOR", "getNumber", "Text_default", "import_react", "getTicksSettings", "settings", "data", "ticksCount", "getNumber", "ticksHeight", "getBoolean", "getString", "DEFAULT_TICKS_COLOR", "DEFAULT_TICKS_VALUES_COLOR", "getTicks", "ticksSettings", "ticsCount", "pathStartAngle", "pathEndAngle", "svg", "ticks", "deltaAngle", "oneTickAngleSize", "count", "i", "currentAngle", "angleRad", "O", "pr", "x", "y", "_t", "isLonger", "desiredDistance", "normalizedDirectionVector", "D", "tickEndVector", "vr", "tickStartVector", "x1", "y1", "tickValue", "value", "index", "s", "textX", "textY", "showText", "_tickValuesDistance", "tickTextVector", "import_jsx_runtime", "Ticks", "props", "settings", "svg", "data", "ticksSettings", "setTicksSettings", "ticks", "setTicks", "getTicksSettings", "endAngleDeg", "getTicks", "tick", "i", "x", "y", "x1", "y1", "textX", "textY", "showText", "Ticks_default", "import_react", "import_jsx_runtime", "Circle", "props", "settings", "pointers", "$svg", "svg", "setPointer", "circle", "setCircle", "getCircle", "evt", "degrees", "getAngleByMouse", "closestPointer", "getClosestPointer", "getString", "DEFAULT_PATH_BORDER_COLOR", "DEFAULT_PATH_BG_COLOR", "Circle_default", "import_jsx_runtime", "RoundSlider", "props", "data", "setData", "svg", "setSvg", "pointers", "setPointers", "svgRef", "getData", "getPointers", "pathStartAngle", "getNumber", "pathEndAngle", "getSvg", "setPointersCallback", "pointer", "newAngleDeg", "roundToStep", "I", "prevAngle", "nextAngle", "prevIndex", "nextIndex", "isAngleInArc", "getClosestEdge", "_pointers", "__spreadValues", "values", "angle2value", "outlineNoneStyle", "Ticks_default", "Circle_default", "Connection_default", "Pointers_default", "Text_default"] } diff --git a/src/core/domain/pointers-provider.ts b/src/core/domain/pointers-provider.ts index 69ad2cb..ac67c2e 100644 --- a/src/core/domain/pointers-provider.ts +++ b/src/core/domain/pointers-provider.ts @@ -116,7 +116,7 @@ const initPointers = ( return [{ id: newId(), index: 0, - radius: DEFAULT_POINTER_RADIUS, + radius: getNumber(settings.pointerRadius, DEFAULT_POINTER_RADIUS), angleDeg: mod(getNumber(settings.pathStartAngle, DEFAULT_PATH_START_ANGLE), 360), bgColor: getString(settings.pointerBgColor, DEFAULT_POINTER_BG_COLOR), bgColorSelected: getString(settings.pointerBgColorSelected, DEFAULT_POINTER_BG_COLOR_SELECTED), @@ -132,6 +132,7 @@ const initPointers = ( for(let i=0; i { cursor={ pointer.disabled ? 'default' : 'pointer' } style={ outlineNoneStyle }> - + + { + !settings.pointerSVG && + + } + + { + settings.pointerSVG && + + { settings.pointerSVG } + + } } diff --git a/src/example/index.tsx b/src/example/index.tsx index a56cb47..8c47f53 100644 --- a/src/example/index.tsx +++ b/src/example/index.tsx @@ -931,7 +931,7 @@ export const testOverlap = () => { export const testStyling = () => { return ( <> - { value: 70 } ]} + />*/} + + + + + + + + + + } /> ) @@ -1165,7 +1191,7 @@ export const testEvents = () => { ) }; -const testRangeDragging = () => { +export const testRangeDragging = () => { return ( <> { {/*{ testData() }*/} {/*{ testStep() }*/} {/*{ testOverlap() }*/} - {/*{ testStyling() }*/} + { testStyling() } {/*{ testDisabled() }*/} {/*{ testEvents() }*/} - { testRangeDragging() } + {/*{ testRangeDragging() }*/} ); }; diff --git a/test/browser/example.min.js b/test/browser/example.min.js index f441b8e..5b43c0c 100644 --- a/test/browser/example.min.js +++ b/test/browser/example.min.js @@ -4,20 +4,163 @@ https://github.com/mzusin/react-round-slider MIT License Copyright (c) 2023-present, Miriam Zusin */ -(()=>{var rd=Object.create;var fo=Object.defineProperty;var ld=Object.getOwnPropertyDescriptor;var od=Object.getOwnPropertyNames,Bu=Object.getOwnPropertySymbols,id=Object.getPrototypeOf,Vu=Object.prototype.hasOwnProperty,ud=Object.prototype.propertyIsEnumerable;var Uu=(e,t,n)=>t in e?fo(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Ir=(e,t)=>{for(var n in t||(t={}))Vu.call(t,n)&&Uu(e,n,t[n]);if(Bu)for(var n of Bu(t))ud.call(t,n)&&Uu(e,n,t[n]);return e};var tt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var ad=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let l of od(t))!Vu.call(e,l)&&l!==n&&fo(e,l,{get:()=>t[l],enumerable:!(r=ld(t,l))||r.enumerable});return e};var U=(e,t,n)=>(n=e!=null?rd(id(e)):{},ad(t||!e||!e.__esModule?fo(n,"default",{value:e,enumerable:!0}):n,e));var qu=tt(I=>{"use strict";var Ln=Symbol.for("react.element"),sd=Symbol.for("react.portal"),cd=Symbol.for("react.fragment"),fd=Symbol.for("react.strict_mode"),dd=Symbol.for("react.profiler"),pd=Symbol.for("react.provider"),md=Symbol.for("react.context"),hd=Symbol.for("react.forward_ref"),gd=Symbol.for("react.suspense"),vd=Symbol.for("react.memo"),yd=Symbol.for("react.lazy"),Hu=Symbol.iterator;function Sd(e){return e===null||typeof e!="object"?null:(e=Hu&&e[Hu]||e["@@iterator"],typeof e=="function"?e:null)}var Wu={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},Gu=Object.assign,Qu={};function Jt(e,t,n){this.props=e,this.context=t,this.refs=Qu,this.updater=n||Wu}Jt.prototype.isReactComponent={};Jt.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};Jt.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function Ku(){}Ku.prototype=Jt.prototype;function mo(e,t,n){this.props=e,this.context=t,this.refs=Qu,this.updater=n||Wu}var ho=mo.prototype=new Ku;ho.constructor=mo;Gu(ho,Jt.prototype);ho.isPureReactComponent=!0;var ju=Array.isArray,Xu=Object.prototype.hasOwnProperty,go={current:null},Yu={key:!0,ref:!0,__self:!0,__source:!0};function Zu(e,t,n){var r,l={},o=null,i=null;if(t!=null)for(r in t.ref!==void 0&&(i=t.ref),t.key!==void 0&&(o=""+t.key),t)Xu.call(t,r)&&!Yu.hasOwnProperty(r)&&(l[r]=t[r]);var u=arguments.length-2;if(u===1)l.children=n;else if(1{"use strict";Ju.exports=qu()});var aa=tt(z=>{"use strict";function xo(e,t){var n=e.length;e.push(t);e:for(;0>>1,l=e[r];if(0>>1;rzr(u,n))azr(s,u)?(e[r]=s,e[a]=n,r=a):(e[r]=u,e[i]=n,r=i);else if(azr(s,n))e[r]=s,e[a]=n,r=a;else break e}}return t}function zr(e,t){var n=e.sortIndex-t.sortIndex;return n!==0?n:e.id-t.id}typeof performance=="object"&&typeof performance.now=="function"?(bu=performance,z.unstable_now=function(){return bu.now()}):(yo=Date,ea=yo.now(),z.unstable_now=function(){return yo.now()-ea});var bu,yo,ea,Ge=[],pt=[],Cd=1,De=null,le=3,Br=!1,Ot=!1,zn=!1,ra=typeof setTimeout=="function"?setTimeout:null,la=typeof clearTimeout=="function"?clearTimeout:null,ta=typeof setImmediate!="undefined"?setImmediate:null;typeof navigator!="undefined"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function wo(e){for(var t=ze(pt);t!==null;){if(t.callback===null)Fr(pt);else if(t.startTime<=e)Fr(pt),t.sortIndex=t.expirationTime,xo(Ge,t);else break;t=ze(pt)}}function ko(e){if(zn=!1,wo(e),!Ot)if(ze(Ge)!==null)Ot=!0,_o(Co);else{var t=ze(pt);t!==null&&Do(ko,t.startTime-e)}}function Co(e,t){Ot=!1,zn&&(zn=!1,la(On),On=-1),Br=!0;var n=le;try{for(wo(t),De=ze(Ge);De!==null&&(!(De.expirationTime>t)||e&&!ua());){var r=De.callback;if(typeof r=="function"){De.callback=null,le=De.priorityLevel;var l=r(De.expirationTime<=t);t=z.unstable_now(),typeof l=="function"?De.callback=l:De===ze(Ge)&&Fr(Ge),wo(t)}else Fr(Ge);De=ze(Ge)}if(De!==null)var o=!0;else{var i=ze(pt);i!==null&&Do(ko,i.startTime-t),o=!1}return o}finally{De=null,le=n,Br=!1}}var Ur=!1,Or=null,On=-1,oa=5,ia=-1;function ua(){return!(z.unstable_now()-iae||125r?(e.sortIndex=n,xo(pt,e),ze(Ge)===null&&e===ze(pt)&&(zn?(la(On),On=-1):zn=!0,Do(ko,n-r))):(e.sortIndex=l,xo(Ge,e),Ot||Br||(Ot=!0,_o(Co))),e};z.unstable_shouldYield=ua;z.unstable_wrapCallback=function(e){var t=le;return function(){var n=le;le=t;try{return e.apply(this,arguments)}finally{le=n}}}});var ca=tt((dm,sa)=>{"use strict";sa.exports=aa()});var vf=tt(ke=>{"use strict";var vs=We(),xe=ca();function x(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;nt}return!1}function de(e,t,n,r,l,o,i){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=l,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=o,this.removeEmptyString=i}var ne={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){ne[e]=new de(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];ne[t]=new de(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){ne[e]=new de(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){ne[e]=new de(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){ne[e]=new de(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){ne[e]=new de(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){ne[e]=new de(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){ne[e]=new de(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){ne[e]=new de(e,5,!1,e.toLowerCase(),null,!1,!1)});var Hi=/[\-:]([a-z])/g;function ji(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(Hi,ji);ne[t]=new de(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(Hi,ji);ne[t]=new de(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(Hi,ji);ne[t]=new de(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){ne[e]=new de(e,1,!1,e.toLowerCase(),null,!1,!1)});ne.xlinkHref=new de("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){ne[e]=new de(e,1,!1,e.toLowerCase(),null,!0,!0)});function $i(e,t,n,r){var l=ne.hasOwnProperty(t)?ne[t]:null;(l!==null?l.type!==0:r||!(2u||l[i]!==o[u]){var a=` -`+l[i].replace(" at new "," at ");return e.displayName&&a.includes("")&&(a=a.replace("",e.displayName)),a}while(1<=i&&0<=u);break}}}finally{Ao=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?Gn(e):""}function Pd(e){switch(e.tag){case 5:return Gn(e.type);case 16:return Gn("Lazy");case 13:return Gn("Suspense");case 19:return Gn("SuspenseList");case 0:case 2:case 15:return e=Po(e.type,!1),e;case 11:return e=Po(e.type.render,!1),e;case 1:return e=Po(e.type,!0),e;default:return""}}function bo(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case nn:return"Fragment";case tn:return"Portal";case Zo:return"Profiler";case Wi:return"StrictMode";case qo:return"Suspense";case Jo:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case Es:return(e.displayName||"Context")+".Consumer";case Ss:return(e._context.displayName||"Context")+".Provider";case Gi:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case Qi:return t=e.displayName||null,t!==null?t:bo(e.type)||"Memo";case ht:t=e._payload,e=e._init;try{return bo(e(t))}catch(n){}}return null}function Rd(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return bo(t);case 8:return t===Wi?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function Pt(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function ws(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function Id(e){var t=ws(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&typeof n!="undefined"&&typeof n.get=="function"&&typeof n.set=="function"){var l=n.get,o=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return l.call(this)},set:function(i){r=""+i,o.call(this,i)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(i){r=""+i},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function Hr(e){e._valueTracker||(e._valueTracker=Id(e))}function ks(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=ws(e)?e.checked?"true":"false":e.value),e=r,e!==n?(t.setValue(e),!0):!1}function hl(e){if(e=e||(typeof document!="undefined"?document:void 0),typeof e=="undefined")return null;try{return e.activeElement||e.body}catch(t){return e.body}}function ei(e,t){var n=t.checked;return $({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n!=null?n:e._wrapperState.initialChecked})}function ma(e,t){var n=t.defaultValue==null?"":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;n=Pt(t.value!=null?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function Cs(e,t){t=t.checked,t!=null&&$i(e,"checked",t,!1)}function ti(e,t){Cs(e,t);var n=Pt(t.value),r=t.type;if(n!=null)r==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?ni(e,t.type,n):t.hasOwnProperty("defaultValue")&&ni(e,t.type,Pt(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function ha(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!(r!=="submit"&&r!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function ni(e,t,n){(t!=="number"||hl(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var Qn=Array.isArray;function mn(e,t,n,r){if(e=e.options,t){t={};for(var l=0;l"+t.valueOf().toString()+"",t=jr.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function or(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var Yn={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Md=["Webkit","ms","Moz","O"];Object.keys(Yn).forEach(function(e){Md.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Yn[t]=Yn[e]})});function As(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||Yn.hasOwnProperty(e)&&Yn[e]?(""+t).trim():t+"px"}function Ps(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=n.indexOf("--")===0,l=As(n,t[n],r);n==="float"&&(n="cssFloat"),r?e.setProperty(n,l):e[n]=l}}var Ld=$({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function oi(e,t){if(t){if(Ld[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(x(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(x(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(x(61))}if(t.style!=null&&typeof t.style!="object")throw Error(x(62))}}function ii(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var ui=null;function Ki(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var ai=null,hn=null,gn=null;function ya(e){if(e=kr(e)){if(typeof ai!="function")throw Error(x(280));var t=e.stateNode;t&&(t=$l(t),ai(e.stateNode,e.type,t))}}function Rs(e){hn?gn?gn.push(e):gn=[e]:hn=e}function Is(){if(hn){var e=hn,t=gn;if(gn=hn=null,ya(e),t)for(e=0;e>>=0,e===0?32:31-(Wd(e)/Gd|0)|0}var $r=64,Wr=4194304;function Kn(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function Sl(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,l=e.suspendedLanes,o=e.pingedLanes,i=n&268435455;if(i!==0){var u=i&~l;u!==0?r=Kn(u):(o&=i,o!==0&&(r=Kn(o)))}else i=n&~l,i!==0?r=Kn(i):o!==0&&(r=Kn(o));if(r===0)return 0;if(t!==0&&t!==r&&!(t&l)&&(l=r&-r,o=t&-t,l>=o||l===16&&(o&4194240)!==0))return t;if(r&4&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0n;n++)t.push(e);return t}function xr(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-Ve(t),e[t]=n}function Yd(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0=qn),Ta=String.fromCharCode(32),Aa=!1;function qs(e,t){switch(e){case"keyup":return k0.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Js(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var rn=!1;function _0(e,t){switch(e){case"compositionend":return Js(t);case"keypress":return t.which!==32?null:(Aa=!0,Ta);case"textInput":return e=t.data,e===Ta&&Aa?null:e;default:return null}}function D0(e,t){if(rn)return e==="compositionend"||!tu&&qs(e,t)?(e=Ys(),il=Ji=St=null,rn=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=Ia(n)}}function nc(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?nc(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function rc(){for(var e=window,t=hl();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch(r){n=!1}if(n)e=t.contentWindow;else break;t=hl(e.document)}return t}function nu(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function z0(e){var t=rc(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&nc(n.ownerDocument.documentElement,n)){if(r!==null&&nu(n)){if(t=r.start,e=r.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var l=n.textContent.length,o=Math.min(r.start,l);r=r.end===void 0?o:Math.min(r.end,l),!e.extend&&o>r&&(l=r,r=o,o=l),l=Ma(n,o);var i=Ma(n,r);l&&i&&(e.rangeCount!==1||e.anchorNode!==l.node||e.anchorOffset!==l.offset||e.focusNode!==i.node||e.focusOffset!==i.offset)&&(t=t.createRange(),t.setStart(l.node,l.offset),e.removeAllRanges(),o>r?(e.addRange(t),e.extend(i.node,i.offset)):(t.setEnd(i.node,i.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n=document.documentMode,ln=null,mi=null,bn=null,hi=!1;function La(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;hi||ln==null||ln!==hl(r)||(r=ln,"selectionStart"in r&&nu(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),bn&&fr(bn,r)||(bn=r,r=wl(mi,"onSelect"),0an||(e.current=xi[an],xi[an]=null,an--)}function O(e,t){an++,xi[an]=e.current,e.current=t}var Rt={},ae=Mt(Rt),he=Mt(!1),Wt=Rt;function xn(e,t){var n=e.type.contextTypes;if(!n)return Rt;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var l={},o;for(o in n)l[o]=t[o];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=l),l}function ge(e){return e=e.childContextTypes,e!=null}function Cl(){B(he),B(ae)}function ja(e,t,n){if(ae.current!==Rt)throw Error(x(168));O(ae,t),O(he,n)}function dc(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!="function")return n;r=r.getChildContext();for(var l in r)if(!(l in t))throw Error(x(108,Rd(e)||"Unknown",l));return $({},n,r)}function _l(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Rt,Wt=ae.current,O(ae,e),O(he,he.current),!0}function $a(e,t,n){var r=e.stateNode;if(!r)throw Error(x(169));n?(e=dc(e,t,Wt),r.__reactInternalMemoizedMergedChildContext=e,B(he),B(ae),O(ae,e)):B(he),O(he,n)}var rt=null,Wl=!1,Vo=!1;function pc(e){rt===null?rt=[e]:rt.push(e)}function G0(e){Wl=!0,pc(e)}function Lt(){if(!Vo&&rt!==null){Vo=!0;var e=0,t=N;try{var n=rt;for(N=1;e>=i,l-=i,lt=1<<32-Ve(t)+l|n<T?(A=D,D=null):A=D.sibling;var P=h(f,D,d[T],E);if(P===null){D===null&&(D=A);break}e&&D&&P.alternate===null&&t(f,D),c=o(P,c,T),_===null?k=P:_.sibling=P,_=P,D=A}if(T===d.length)return n(f,D),V&&Ft(f,T),k;if(D===null){for(;TT?(A=D,D=null):A=D.sibling;var Z=h(f,D,P.value,E);if(Z===null){D===null&&(D=A);break}e&&D&&Z.alternate===null&&t(f,D),c=o(Z,c,T),_===null?k=Z:_.sibling=Z,_=Z,D=A}if(P.done)return n(f,D),V&&Ft(f,T),k;if(D===null){for(;!P.done;T++,P=d.next())P=g(f,P.value,E),P!==null&&(c=o(P,c,T),_===null?k=P:_.sibling=P,_=P);return V&&Ft(f,T),k}for(D=r(f,D);!P.done;T++,P=d.next())P=v(D,f,T,P.value,E),P!==null&&(e&&P.alternate!==null&&D.delete(P.key===null?T:P.key),c=o(P,c,T),_===null?k=P:_.sibling=P,_=P);return e&&D.forEach(function(_e){return t(f,_e)}),V&&Ft(f,T),k}function R(f,c,d,E){if(typeof d=="object"&&d!==null&&d.type===nn&&d.key===null&&(d=d.props.children),typeof d=="object"&&d!==null){switch(d.$$typeof){case Vr:e:{for(var k=d.key,_=c;_!==null;){if(_.key===k){if(k=d.type,k===nn){if(_.tag===7){n(f,_.sibling),c=l(_,d.props.children),c.return=f,f=c;break e}}else if(_.elementType===k||typeof k=="object"&&k!==null&&k.$$typeof===ht&&Za(k)===_.type){n(f,_.sibling),c=l(_,d.props),c.ref=Hn(f,_,d),c.return=f,f=c;break e}n(f,_);break}else t(f,_);_=_.sibling}d.type===nn?(c=$t(d.props.children,f.mode,E,d.key),c.return=f,f=c):(E=ml(d.type,d.key,d.props,null,f.mode,E),E.ref=Hn(f,c,d),E.return=f,f=E)}return i(f);case tn:e:{for(_=d.key;c!==null;){if(c.key===_)if(c.tag===4&&c.stateNode.containerInfo===d.containerInfo&&c.stateNode.implementation===d.implementation){n(f,c.sibling),c=l(c,d.children||[]),c.return=f,f=c;break e}else{n(f,c);break}else t(f,c);c=c.sibling}c=Xo(d,f.mode,E),c.return=f,f=c}return i(f);case ht:return _=d._init,R(f,c,_(d._payload),E)}if(Qn(d))return y(f,c,d,E);if(Fn(d))return w(f,c,d,E);tl(f,d)}return typeof d=="string"&&d!==""||typeof d=="number"?(d=""+d,c!==null&&c.tag===6?(n(f,c.sibling),c=l(c,d),c.return=f,f=c):(n(f,c),c=Ko(d,f.mode,E),c.return=f,f=c),i(f)):n(f,c)}return R}var kn=xc(!0),wc=xc(!1),Cr={},Ze=Mt(Cr),hr=Mt(Cr),gr=Mt(Cr);function Ht(e){if(e===Cr)throw Error(x(174));return e}function fu(e,t){switch(O(gr,t),O(hr,e),O(Ze,Cr),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:li(null,"");break;default:e=e===8?t.parentNode:t,t=e.namespaceURI||null,e=e.tagName,t=li(t,e)}B(Ze),O(Ze,t)}function Cn(){B(Ze),B(hr),B(gr)}function kc(e){Ht(gr.current);var t=Ht(Ze.current),n=li(t,e.type);t!==n&&(O(hr,e),O(Ze,n))}function du(e){hr.current===e&&(B(Ze),B(hr))}var H=Mt(0);function Il(e){for(var t=e;t!==null;){if(t.tag===13){var n=t.memoizedState;if(n!==null&&(n=n.dehydrated,n===null||n.data==="$?"||n.data==="$!"))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if(t.flags&128)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var Ho=[];function pu(){for(var e=0;en?n:4,e(!0);var r=jo.transition;jo.transition={};try{e(!1),t()}finally{N=n,jo.transition=r}}function Uc(){return Me().memoizedState}function Y0(e,t,n){var r=Tt(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},Vc(e))Hc(t,n);else if(n=vc(e,t,n,r),n!==null){var l=fe();He(n,e,r,l),jc(n,t,r)}}function Z0(e,t,n){var r=Tt(e),l={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(Vc(e))Hc(t,l);else{var o=e.alternate;if(e.lanes===0&&(o===null||o.lanes===0)&&(o=t.lastRenderedReducer,o!==null))try{var i=t.lastRenderedState,u=o(i,n);if(l.hasEagerState=!0,l.eagerState=u,je(u,i)){var a=t.interleaved;a===null?(l.next=l,su(t)):(l.next=a.next,a.next=l),t.interleaved=l;return}}catch(s){}finally{}n=vc(e,t,l,r),n!==null&&(l=fe(),He(n,e,r,l),jc(n,t,r))}}function Vc(e){var t=e.alternate;return e===j||t!==null&&t===j}function Hc(e,t){er=Ml=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function jc(e,t,n){if(n&4194240){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Yi(e,n)}}var Ll={readContext:Ie,useCallback:oe,useContext:oe,useEffect:oe,useImperativeHandle:oe,useInsertionEffect:oe,useLayoutEffect:oe,useMemo:oe,useReducer:oe,useRef:oe,useState:oe,useDebugValue:oe,useDeferredValue:oe,useTransition:oe,useMutableSource:oe,useSyncExternalStore:oe,useId:oe,unstable_isNewReconciler:!1},q0={readContext:Ie,useCallback:function(e,t){return Ke().memoizedState=[e,t===void 0?null:t],e},useContext:Ie,useEffect:Ja,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,cl(4194308,4,Nc.bind(null,t,e),n)},useLayoutEffect:function(e,t){return cl(4194308,4,e,t)},useInsertionEffect:function(e,t){return cl(4,2,e,t)},useMemo:function(e,t){var n=Ke();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=Ke();return t=n!==void 0?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=Y0.bind(null,j,e),[r.memoizedState,e]},useRef:function(e){var t=Ke();return e={current:e},t.memoizedState=e},useState:qa,useDebugValue:yu,useDeferredValue:function(e){return Ke().memoizedState=e},useTransition:function(){var e=qa(!1),t=e[0];return e=X0.bind(null,e[1]),Ke().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=j,l=Ke();if(V){if(n===void 0)throw Error(x(407));n=n()}else{if(n=t(),J===null)throw Error(x(349));Qt&30||Dc(r,t,n)}l.memoizedState=n;var o={value:n,getSnapshot:t};return l.queue=o,Ja(Ac.bind(null,r,o,e),[e]),r.flags|=2048,Sr(9,Tc.bind(null,r,o,n,t),void 0,null),n},useId:function(){var e=Ke(),t=J.identifierPrefix;if(V){var n=ot,r=lt;n=(r&~(1<<32-Ve(r)-1)).toString(32)+n,t=":"+t+"R"+n,n=vr++,0<\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=i.createElement(n,{is:r.is}):(e=i.createElement(n),n==="select"&&(i=e,r.multiple?i.multiple=!0:r.size&&(i.size=r.size))):e=i.createElementNS(e,n),e[Xe]=t,e[mr]=r,qc(e,t,!1,!1),t.stateNode=e;e:{switch(i=ii(n,r),n){case"dialog":F("cancel",e),F("close",e),l=r;break;case"iframe":case"object":case"embed":F("load",e),l=r;break;case"video":case"audio":for(l=0;lDn&&(t.flags|=128,r=!0,jn(o,!1),t.lanes=4194304)}else{if(!r)if(e=Il(i),e!==null){if(t.flags|=128,r=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),jn(o,!0),o.tail===null&&o.tailMode==="hidden"&&!i.alternate&&!V)return ie(t),null}else 2*G()-o.renderingStartTime>Dn&&n!==1073741824&&(t.flags|=128,r=!0,jn(o,!1),t.lanes=4194304);o.isBackwards?(i.sibling=t.child,t.child=i):(n=o.last,n!==null?n.sibling=i:t.child=i,o.last=i)}return o.tail!==null?(t=o.tail,o.rendering=t,o.tail=t.sibling,o.renderingStartTime=G(),t.sibling=null,n=H.current,O(H,r?n&1|2:n&1),t):(ie(t),null);case 22:case 23:return Cu(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&t.mode&1?ye&1073741824&&(ie(t),t.subtreeFlags&6&&(t.flags|=8192)):ie(t),null;case 24:return null;case 25:return null}throw Error(x(156,t.tag))}function op(e,t){switch(lu(t),t.tag){case 1:return ge(t.type)&&Cl(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Cn(),B(he),B(ae),pu(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return du(t),null;case 13:if(B(H),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(x(340));wn()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return B(H),null;case 4:return Cn(),null;case 10:return au(t.type._context),null;case 22:case 23:return Cu(),null;case 24:return null;default:return null}}var rl=!1,ue=!1,ip=typeof WeakSet=="function"?WeakSet:Set,C=null;function dn(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(r){W(e,t,r)}else n.current=null}function Li(e,t,n){try{n()}catch(r){W(e,t,r)}}var us=!1;function up(e,t){if(gi=El,e=rc(),nu(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var l=r.anchorOffset,o=r.focusNode;r=r.focusOffset;try{n.nodeType,o.nodeType}catch(E){n=null;break e}var i=0,u=-1,a=-1,s=0,p=0,g=e,h=null;t:for(;;){for(var v;g!==n||l!==0&&g.nodeType!==3||(u=i+l),g!==o||r!==0&&g.nodeType!==3||(a=i+r),g.nodeType===3&&(i+=g.nodeValue.length),(v=g.firstChild)!==null;)h=g,g=v;for(;;){if(g===e)break t;if(h===n&&++s===l&&(u=i),h===o&&++p===r&&(a=i),(v=g.nextSibling)!==null)break;g=h,h=g.parentNode}g=v}n=u===-1||a===-1?null:{start:u,end:a}}else n=null}n=n||{start:0,end:0}}else n=null;for(vi={focusedElem:e,selectionRange:n},El=!1,C=t;C!==null;)if(t=C,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,C=e;else for(;C!==null;){t=C;try{var y=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(y!==null){var w=y.memoizedProps,R=y.memoizedState,f=t.stateNode,c=f.getSnapshotBeforeUpdate(t.elementType===t.type?w:Fe(t.type,w),R);f.__reactInternalSnapshotBeforeUpdate=c}break;case 3:var d=t.stateNode.containerInfo;d.nodeType===1?d.textContent="":d.nodeType===9&&d.documentElement&&d.removeChild(d.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(x(163))}}catch(E){W(t,t.return,E)}if(e=t.sibling,e!==null){e.return=t.return,C=e;break}C=t.return}return y=us,us=!1,y}function tr(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var l=r=r.next;do{if((l.tag&e)===e){var o=l.destroy;l.destroy=void 0,o!==void 0&&Li(t,n,o)}l=l.next}while(l!==r)}}function Kl(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function Ni(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function ef(e){var t=e.alternate;t!==null&&(e.alternate=null,ef(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Xe],delete t[mr],delete t[Ei],delete t[$0],delete t[W0])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function tf(e){return e.tag===5||e.tag===3||e.tag===4}function as(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||tf(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function zi(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=kl));else if(r!==4&&(e=e.child,e!==null))for(zi(e,t,n),e=e.sibling;e!==null;)zi(e,t,n),e=e.sibling}function Oi(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(Oi(e,t,n),e=e.sibling;e!==null;)Oi(e,t,n),e=e.sibling}var ee=null,Be=!1;function mt(e,t,n){for(n=n.child;n!==null;)nf(e,t,n),n=n.sibling}function nf(e,t,n){if(Ye&&typeof Ye.onCommitFiberUnmount=="function")try{Ye.onCommitFiberUnmount(Ul,n)}catch(u){}switch(n.tag){case 5:ue||dn(n,t);case 6:var r=ee,l=Be;ee=null,mt(e,t,n),ee=r,Be=l,ee!==null&&(Be?(e=ee,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):ee.removeChild(n.stateNode));break;case 18:ee!==null&&(Be?(e=ee,n=n.stateNode,e.nodeType===8?Uo(e.parentNode,n):e.nodeType===1&&Uo(e,n),sr(e)):Uo(ee,n.stateNode));break;case 4:r=ee,l=Be,ee=n.stateNode.containerInfo,Be=!0,mt(e,t,n),ee=r,Be=l;break;case 0:case 11:case 14:case 15:if(!ue&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){l=r=r.next;do{var o=l,i=o.destroy;o=o.tag,i!==void 0&&(o&2||o&4)&&Li(n,t,i),l=l.next}while(l!==r)}mt(e,t,n);break;case 1:if(!ue&&(dn(n,t),r=n.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(u){W(n,t,u)}mt(e,t,n);break;case 21:mt(e,t,n);break;case 22:n.mode&1?(ue=(r=ue)||n.memoizedState!==null,mt(e,t,n),ue=r):mt(e,t,n);break;default:mt(e,t,n)}}function ss(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new ip),t.forEach(function(r){var l=gp.bind(null,e,r);n.has(r)||(n.add(r),r.then(l,l))})}}function Oe(e,t){var n=t.deletions;if(n!==null)for(var r=0;rl&&(l=i),r&=~o}if(r=l,r=G()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*sp(r/1960))-r,10e?16:e,Et===null)var r=!1;else{if(e=Et,Et=null,Ol=0,M&6)throw Error(x(331));var l=M;for(M|=4,C=e.current;C!==null;){var o=C,i=o.child;if(C.flags&16){var u=o.deletions;if(u!==null){for(var a=0;aG()-wu?jt(e,0):xu|=n),ve(e,t)}function ff(e,t){t===0&&(e.mode&1?(t=Wr,Wr<<=1,!(Wr&130023424)&&(Wr=4194304)):t=1);var n=fe();e=st(e,t),e!==null&&(xr(e,t,n),ve(e,n))}function hp(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),ff(e,n)}function gp(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,l=e.memoizedState;l!==null&&(n=l.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(x(314))}r!==null&&r.delete(t),ff(e,n)}var df;df=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||he.current)me=!0;else{if(!(e.lanes&n)&&!(t.flags&128))return me=!1,rp(e,t,n);me=!!(e.flags&131072)}else me=!1,V&&t.flags&1048576&&mc(t,Tl,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;fl(e,t),e=t.pendingProps;var l=xn(t,ae.current);yn(t,n),l=hu(null,t,r,e,l,n);var o=gu();return t.flags|=1,typeof l=="object"&&l!==null&&typeof l.render=="function"&&l.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,ge(r)?(o=!0,_l(t)):o=!1,t.memoizedState=l.state!==null&&l.state!==void 0?l.state:null,cu(t),l.updater=Gl,t.stateNode=l,l._reactInternals=t,Di(t,r,e,n),t=Pi(null,t,r,!0,o,n)):(t.tag=0,V&&o&&ru(t),ce(null,t,l,n),t=t.child),t;case 16:r=t.elementType;e:{switch(fl(e,t),e=t.pendingProps,l=r._init,r=l(r._payload),t.type=r,l=t.tag=yp(r),e=Fe(r,e),l){case 0:t=Ai(null,t,r,e,n);break e;case 1:t=ls(null,t,r,e,n);break e;case 11:t=ns(null,t,r,e,n);break e;case 14:t=rs(null,t,r,Fe(r.type,e),n);break e}throw Error(x(306,r,""))}return t;case 0:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Fe(r,l),Ai(e,t,r,l,n);case 1:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Fe(r,l),ls(e,t,r,l,n);case 3:e:{if(Xc(t),e===null)throw Error(x(387));r=t.pendingProps,o=t.memoizedState,l=o.element,yc(e,t),Rl(t,r,null,n);var i=t.memoizedState;if(r=i.element,o.isDehydrated)if(o={element:r,isDehydrated:!1,cache:i.cache,pendingSuspenseBoundaries:i.pendingSuspenseBoundaries,transitions:i.transitions},t.updateQueue.baseState=o,t.memoizedState=o,t.flags&256){l=_n(Error(x(423)),t),t=os(e,t,r,n,l);break e}else if(r!==l){l=_n(Error(x(424)),t),t=os(e,t,r,n,l);break e}else for(Se=Ct(t.stateNode.containerInfo.firstChild),Ee=t,V=!0,Ue=null,n=wc(t,null,r,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(wn(),r===l){t=ct(e,t,n);break e}ce(e,t,r,n)}t=t.child}return t;case 5:return kc(t),e===null&&ki(t),r=t.type,l=t.pendingProps,o=e!==null?e.memoizedProps:null,i=l.children,yi(r,l)?i=null:o!==null&&yi(r,o)&&(t.flags|=32),Kc(e,t),ce(e,t,i,n),t.child;case 6:return e===null&&ki(t),null;case 13:return Yc(e,t,n);case 4:return fu(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=kn(t,null,r,n):ce(e,t,r,n),t.child;case 11:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Fe(r,l),ns(e,t,r,l,n);case 7:return ce(e,t,t.pendingProps,n),t.child;case 8:return ce(e,t,t.pendingProps.children,n),t.child;case 12:return ce(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,l=t.pendingProps,o=t.memoizedProps,i=l.value,O(Al,r._currentValue),r._currentValue=i,o!==null)if(je(o.value,i)){if(o.children===l.children&&!he.current){t=ct(e,t,n);break e}}else for(o=t.child,o!==null&&(o.return=t);o!==null;){var u=o.dependencies;if(u!==null){i=o.child;for(var a=u.firstContext;a!==null;){if(a.context===r){if(o.tag===1){a=it(-1,n&-n),a.tag=2;var s=o.updateQueue;if(s!==null){s=s.shared;var p=s.pending;p===null?a.next=a:(a.next=p.next,p.next=a),s.pending=a}}o.lanes|=n,a=o.alternate,a!==null&&(a.lanes|=n),Ci(o.return,n,t),u.lanes|=n;break}a=a.next}}else if(o.tag===10)i=o.type===t.type?null:o.child;else if(o.tag===18){if(i=o.return,i===null)throw Error(x(341));i.lanes|=n,u=i.alternate,u!==null&&(u.lanes|=n),Ci(i,n,t),i=o.sibling}else i=o.child;if(i!==null)i.return=o;else for(i=o;i!==null;){if(i===t){i=null;break}if(o=i.sibling,o!==null){o.return=i.return,i=o;break}i=i.return}o=i}ce(e,t,l.children,n),t=t.child}return t;case 9:return l=t.type,r=t.pendingProps.children,yn(t,n),l=Ie(l),r=r(l),t.flags|=1,ce(e,t,r,n),t.child;case 14:return r=t.type,l=Fe(r,t.pendingProps),l=Fe(r.type,l),rs(e,t,r,l,n);case 15:return Gc(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Fe(r,l),fl(e,t),t.tag=1,ge(r)?(e=!0,_l(t)):e=!1,yn(t,n),Ec(t,r,l),Di(t,r,l,n),Pi(null,t,r,!0,e,n);case 19:return Zc(e,t,n);case 22:return Qc(e,t,n)}throw Error(x(156,t.tag))};function pf(e,t){return Bs(e,t)}function vp(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Pe(e,t,n,r){return new vp(e,t,n,r)}function Du(e){return e=e.prototype,!(!e||!e.isReactComponent)}function yp(e){if(typeof e=="function")return Du(e)?1:0;if(e!=null){if(e=e.$$typeof,e===Gi)return 11;if(e===Qi)return 14}return 2}function At(e,t){var n=e.alternate;return n===null?(n=Pe(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function ml(e,t,n,r,l,o){var i=2;if(r=e,typeof e=="function")Du(e)&&(i=1);else if(typeof e=="string")i=5;else e:switch(e){case nn:return $t(n.children,l,o,t);case Wi:i=8,l|=8;break;case Zo:return e=Pe(12,n,t,l|2),e.elementType=Zo,e.lanes=o,e;case qo:return e=Pe(13,n,t,l),e.elementType=qo,e.lanes=o,e;case Jo:return e=Pe(19,n,t,l),e.elementType=Jo,e.lanes=o,e;case xs:return Yl(n,l,o,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case Ss:i=10;break e;case Es:i=9;break e;case Gi:i=11;break e;case Qi:i=14;break e;case ht:i=16,r=null;break e}throw Error(x(130,e==null?e:typeof e,""))}return t=Pe(i,n,t,l),t.elementType=e,t.type=r,t.lanes=o,t}function $t(e,t,n,r){return e=Pe(7,e,r,t),e.lanes=n,e}function Yl(e,t,n,r){return e=Pe(22,e,r,t),e.elementType=xs,e.lanes=n,e.stateNode={isHidden:!1},e}function Ko(e,t,n){return e=Pe(6,e,null,t),e.lanes=n,e}function Xo(e,t,n){return t=Pe(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Sp(e,t,n,r,l){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Io(0),this.expirationTimes=Io(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Io(0),this.identifierPrefix=r,this.onRecoverableError=l,this.mutableSourceEagerHydrationData=null}function Tu(e,t,n,r,l,o,i,u,a){return e=new Sp(e,t,n,u,a),t===1?(t=1,o===!0&&(t|=8)):t=0,o=Pe(3,null,null,t),e.current=o,o.stateNode=e,o.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},cu(o),e}function Ep(e,t,n){var r=3{"use strict";function yf(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__=="undefined"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(yf)}catch(e){console.error(e)}}yf(),Sf.exports=vf()});var wf=tt(Iu=>{"use strict";var xf=Ef();Iu.createRoot=xf.createRoot,Iu.hydrateRoot=xf.hydrateRoot;var hm});var jf=tt(uo=>{"use strict";var Lp=We(),Np=Symbol.for("react.element"),zp=Symbol.for("react.fragment"),Op=Object.prototype.hasOwnProperty,Fp=Lp.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,Bp={key:!0,ref:!0,__self:!0,__source:!0};function Hf(e,t,n){var r,l={},o=null,i=null;n!==void 0&&(o=""+n),t.key!==void 0&&(o=""+t.key),t.ref!==void 0&&(i=t.ref);for(r in t)Op.call(t,r)&&!Bp.hasOwnProperty(r)&&(l[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps,t)l[r]===void 0&&(l[r]=t[r]);return{$$typeof:Np,type:e,key:o,ref:i,props:l,_owner:Fp.current}}uo.Fragment=zp;uo.jsx=Hf;uo.jsxs=Hf});var re=tt((zm,$f)=>{"use strict";$f.exports=jf()});var td=U(We(),1),nd=U(wf(),1);var et=U(We(),1);var _p=Math.pow,Le=(e,t=1/0)=>{if(t===1/0)return e;t<0&&(t=0);let n=_p(10,t);return Math.round(e*n)/n},b=(e,t)=>(e%t+t)%t,Ce=(e,t,n,r,l)=>(l-r)*(e-t)/(n-t)+r;var kf=e=>!isNaN(parseFloat(e))&&isFinite(e);var Cf=(e,t=1/0)=>{let n=e*(180/Math.PI);return Le(n,t)},qe=(e,t=1/0)=>{let n=e*(Math.PI/180);return Le(n,t)};var _f=(e,t,n=1/0)=>{let r=[];for(let l=0;l_f(e,t,n);var Dp=(e,t,n=1/0)=>{let r=[];for(let l=0;lDp(e,t,n);var Tf=(e,t=1/0)=>{let n=0;for(let r=0;r{let r=_f(e,t);return Tf(r,n)};var Tp=(e,t=1/0)=>{let n=Tf(e),r=[];for(let l=0;lTp(e,t);var Je=(e,t,n)=>(t=t%Math.PI*2,[e[0]+Math.cos(t)*n,e[1]+Math.sin(t)*n]);var Mu=()=>Math.random().toString(36).substring(2)+new Date().getTime().toString(36);var Pf=(e,t,n,r,l,o)=>{let i=t+n*2,u=Math.max(0,r*2-i),a=e*2+i+u,[s,p]=Ap(e,r,t,n);return{cx:s,cy:p,radius:e,size:a,thickness:t,border:n,startAngleDeg:l,endAngleDeg:o}},Ap=(e,t,n,r)=>{let l=Pp(e,t,n,r),o=Le(l/2,2);return[o,o]},Pp=(e,t,n,r)=>{let l=n+r*2,o=Math.max(0,t*2-l);return e*2+l+o};var Rf="#efefef";var If="#444444";var Lu="#163a86",Nu="#000",zu="#a8a8a8";var Ou="#000",Mf="#5daed2",Lf="#97b0bb",Nf="#000";var zf="#efefef",Of="#000";var L=(e,t)=>kf(e)?Number(e):t,K=(e,t)=>e==null?t:e,be=(e,t)=>e==null?t:e;var no=(e,t,n)=>(e>t&&(t+=360),n>=e&&n<=t||n+360>=e&&n+360<=t),_r=(e,t)=>{t0?360:r},Ff=(e,t,n)=>{e>t&&(t+=360);let r=2*Math.PI*n;e>t&&(t+=360);let l=t-e,o=-(e/360)*r,i=l/360*r,u=r-i;return{strokeDasharray:[i,u].join(" "),strokeOffset:o}};var qt=(e,t,n,r,l,o,i)=>{let{left:u,top:a}=e.getBoundingClientRect(),s=[t-u,n-a],p=Df(s,[r,l]),g=Math.atan2(p[1]/i,p[0]/o);return g<0&&(g+=2*Math.PI),Cf(g)},Rn=(e,t,n,r)=>{r0){let o=Math.round(l);l=e.data[o]}else l=Le(l,e.round);return l},Rp=(e,t,n,r)=>{let l;if(r0){let o=e.data.findIndex(i=>i===t);l=o===-1?0:o}else l=typeof t!="number"?e.min:t;return b(Ce(l,e.min,e.max,n,r),360)},Ip=(e,t)=>{if(!e||!e.pointers||e.pointers.length<0||!t)return[{id:Mu(),index:0,radius:10,angleDeg:b(L(e.pathStartAngle,0),360),bgColor:K(e.pointerBgColor,Lu),bgColorSelected:K(e.pointerBgColorSelected,Nu),bgColorDisabled:K(e.pointerBgColorDisabled,zu),border:L(e.pointerBorder,0),borderColor:K(e.pointerBorderColor,Ou),disabled:!!e.disabled}];let n=[];for(let r=0;r{let n=Ip(e,t);return{pointers:n,maxRadius:Mp(n)}},Mp=e=>{if(e.length<=0)return 0;let t=-1/0;for(let n of e)t=Math.max(t,Math.max(0,n.radius+n.border/2));return t},ro=(e,t,n,r,l)=>{if(!e||e.length<=0)return null;if(e.length===1)return e[0];let o=Ce(qe(t),0,Math.PI*2,0,Math.PI),i=Je([n,r],o,l),u,a=null,s=e.filter(p=>!p.disabled);for(let p of s){let g=Ce(qe(p.angleDeg),0,Math.PI*2,0,Math.PI),h=Je([n,r],g,l),v=to(i,h);(u===void 0||v{let i=Ce(qe(n),0,Math.PI*2,0,Math.PI),u=Je([r,l],i,o),a=Ce(qe(e),0,Math.PI*2,0,Math.PI),s=Je([r,l],a,o),p=Ce(qe(t),0,Math.PI*2,0,Math.PI),g=Je([r,l],p,o),h=to(u,s),v=to(u,g);return h<=v?e:t},oo=(e,t)=>{if(!e||e.length<=0)return null;let n,r,l=null,o=null;for(let i of e){let u=_r(t,i.angleDeg);(n===void 0||ur)&&(o=i,r=u)}return l===null||o===null?null:[l,o]},Fu=(e,t)=>t===0?0:Math.round(e/t)*t;var $e=U(We(),1);var io={outline:"none"};var In=U(re(),1),Up=(e,t,n,r,l)=>e.disabled?l:document.activeElement===t.current&&r||n,Vp=e=>{let t=(0,$e.useRef)(null),{pointer:n,svg:r,$svg:l,setPointer:o,data:i,settings:u}=e,{radius:a,angleDeg:s,bgColor:p,bgColorSelected:g,bgColorDisabled:h,border:v,borderColor:y}=e.pointer,{cx:w,cy:R}=r,[f,c]=(0,$e.useState)(null),[d,E]=(0,$e.useState)("");(0,$e.useEffect)(()=>{let A=Rn(i,n.angleDeg,r.startAngleDeg,r.endAngleDeg);E(A===void 0?"":A.toString())},[i,n.angleDeg,r.startAngleDeg,r.endAngleDeg]),(0,$e.useEffect)(()=>{let A=Ce(qe(s),0,Math.PI*2,0,Math.PI),P=Je([w,R],A,r.radius);c(P)},[s,w,R,r.radius]);let k=(0,$e.useCallback)(A=>{if(!l||u.disabled||n.disabled)return;let P=A.type.indexOf("mouse")!==-1?A.clientX:A.touches[0].clientX,Z=A.type.indexOf("mouse")!==-1?A.clientY:A.touches[0].clientY,_e=qt(l,P,Z,r.cx,r.cy,r.radius,r.radius),Mn;no(r.startAngleDeg,r.endAngleDeg,_e)?Mn=_e:Mn=lo(r.startAngleDeg,r.endAngleDeg,n.angleDeg,r.cx,r.cy,r.radius),o(n,Mn)},[l,n,o,r.cx,r.cy,r.endAngleDeg,r.radius,r.startAngleDeg,u.disabled]),_=()=>{window.removeEventListener("mousemove",k),window.removeEventListener("mouseup",k)},D=A=>{u.disabled||n.disabled||(k(A),window.addEventListener("mousemove",k),window.addEventListener("mouseup",_))},T=A=>{if(!(u.disabled||n.disabled||u.keyboardDisabled))switch(A.key){case"ArrowLeft":{A.preventDefault(),o(n,n.angleDeg+i.stepAngleDeg);break}case"ArrowRight":{A.preventDefault(),o(n,n.angleDeg-i.stepAngleDeg);break}case"ArrowUp":{A.preventDefault(),o(n,n.angleDeg-i.stepAngleDeg);break}case"ArrowDown":{A.preventDefault(),o(n,n.angleDeg+i.stepAngleDeg);break}}};return(0,$e.useEffect)(()=>{let A=t.current,P=_e=>{u.disabled||n.disabled||(_e.preventDefault(),_e.stopPropagation(),k(_e))},Z=_e=>{if(u.disabled||n.disabled||u.mousewheelDisabled||document.activeElement!==A)return;_e.stopPropagation(),_e.preventDefault();let Mn=_e.deltaY<0,co;Mn?co=n.angleDeg+i.stepAngleDeg:co=n.angleDeg-i.stepAngleDeg,o(n,co)};return A==null||A.addEventListener("touchmove",P,{passive:!1}),document.addEventListener("wheel",Z,{passive:!1}),()=>{A==null||A.removeEventListener("touchmove",P),document.removeEventListener("wheel",Z)}},[f,k,i.stepAngleDeg,n,o,u.disabled,u.mousewheelDisabled]),(0,In.jsx)(In.Fragment,{children:f&&(0,In.jsx)("g",{ref:t,transform:`translate(${f[0]-a/2}, ${f[1]-a/2})`,role:"slider","aria-disabled":n.disabled?!0:void 0,"aria-valuenow":n.angleDeg,"aria-valuetext":d,"aria-label":n.ariaLabel,"data-type":"pointer","data-angle":n.angleDeg,"data-id":n.id,"data-index":n.index,onMouseDown:D,onKeyDown:T,tabIndex:0,cursor:n.disabled?"default":"pointer",style:io,children:(0,In.jsx)("circle",{cx:a/2,cy:a/2,r:a,fill:Up(n,t,p,g,h),strokeWidth:v,stroke:y})})})},Wf=Vp;var Tr=U(re(),1),Hp=e=>{let{pointers:t,settings:n,svg:r,$svg:l,setPointer:o,data:i}=e;return(0,Tr.jsx)(Tr.Fragment,{children:t.pointers.map(u=>(0,Tr.jsx)(Wf,{pointer:u,svg:r,settings:n,$svg:l,setPointer:o,data:i},u.id))})},Gf=Hp;var Kf=e=>{let t=L(e.min,0),n=L(e.max,100),r=L(e.step,1),l=L(e.arrowStep,1),o=L(e.round,0),i=e.data||[];if(i.length>0){let h=i.findIndex(y=>y===t),v=i.findIndex(y=>y===n);t=h===-1?0:h,n=v===-1?i.length:v}else t>n&&(t=n+100);let u=L(e.pathStartAngle,0),a=L(e.pathEndAngle,360),s=b(u,360)===b(a,360),p=r*360/(n-t),g=l*360/(n-t);return{min:t,max:n,round:o,data:i,stepAngleDeg:p,arrowStepAngleDeg:g,isClosedShape:s}};var Nt=U(We(),1);var Xf=(e,t,n,r,l,o)=>{if(!e.pointers||e.pointers.length<=0)return null;let i={radius:t,cx:n,cy:r,startAngleDeg:l,endAngleDeg:l,strokeDasharray:[0,0],strokeOffset:0};if(e.pointers.length===1)i.startAngleDeg=l,i.endAngleDeg=e.pointers[0].angleDeg;else{let y=oo(e.pointers,l);if(!y)return null;let[w,R]=y;i.startAngleDeg=w.angleDeg,i.endAngleDeg=R.angleDeg}let u=_r(l,o);i.startAngleDeg>i.endAngleDeg&&(i.endAngleDeg+=360);let a=_r(i.startAngleDeg,i.endAngleDeg);a>u&&(a=360-a,[i.startAngleDeg,i.endAngleDeg]=[i.endAngleDeg,i.startAngleDeg]);let p=2*Math.PI*t,g=-(i.startAngleDeg/360)*p,h=a/360*p,v=p-h;return i.strokeDasharray=[h,v],i.strokeOffset=g,i};var Ar=U(re(),1),Qp=e=>{let{settings:t,pointers:n,$svg:r,svg:l,data:o,setPointer:i}=e,[u,a]=(0,Nt.useState)(null),s=(0,Nt.useRef)();(0,Nt.useEffect)(()=>{a(Xf(n,l.radius,l.cx,l.cy,l.startAngleDeg,l.endAngleDeg))},[n,l.radius,l.cx,l.cy,l.startAngleDeg,l.endAngleDeg]);let p=y=>{if(!r||t.disabled)return;let w=qt(r,y.clientX,y.clientY,l.cx,l.cy,l.radius,l.radius),R=ro(n.pointers,w,l.cx,l.cy,l.radius);R&&i(R,w)},g=(0,Nt.useCallback)(y=>{if(!r||t.disabled||!t.rangeDragging)return;let w=oo(n.pointers,l.startAngleDeg);if(!w)return;let[R,f]=w,c=qt(r,y.clientX,y.clientY,l.cx,l.cy,l.radius,l.radius);if(s.current===void 0){s.current=c;return}let d=c-s.current;d===0||Math.abs(d){window.removeEventListener("mousemove",g),window.removeEventListener("mouseup",g),s.current=void 0},v=y=>{!t.rangeDragging||t.disabled||n.pointers.length<=1||(g(y),window.addEventListener("mousemove",g),window.addEventListener("mouseup",h))};return(0,Ar.jsx)(Ar.Fragment,{children:!be(t.hideConnection,!1)&&u&&(0,Ar.jsx)("circle",{"data-type":"connection",cx:u.cx,cy:u.cy,r:u.radius,strokeDasharray:u.strokeDasharray.join(" "),strokeDashoffset:u.strokeOffset,stroke:t.disabled?K(t.connectionBgColorDisabled,Lf):K(t.connectionBgColor,Mf),strokeWidth:l.thickness+1,fill:"none",shapeRendering:"geometricPrecision",strokeLinecap:"round",cursor:t.disabled?"default":"pointer",onClick:p,onMouseDown:v})})},Yf=Qp;var ao=U(We(),1),Pr=U(re(),1),Xp=e=>{let{settings:t,pointers:n,svg:r,data:l}=e,{cx:o,cy:i}=r,[u,a]=(0,ao.useState)("");(0,ao.useEffect)(()=>{let p=n.pointers.map(h=>Rn(l,h.angleDeg,r.startAngleDeg,r.endAngleDeg));p.sort((h,v)=>h.toString().localeCompare(v.toString(),"en",{numeric:!0}));let g=p.map(h=>`${t.textPrefix||""}${h}${t.textSuffix||""}`);a(g.join(" "))},[l,n.pointers,r.startAngleDeg,r.endAngleDeg,t.textPrefix,t.textSuffix]);let s=be(t.hideText,!1);return(0,Pr.jsx)(Pr.Fragment,{children:!s&&(0,Pr.jsx)("text",{x:o,y:i,fill:K(t.textColor,Nf),fontSize:L(t.textFontSize,16),fontFamily:t.textFontFamily,style:{userSelect:"none"},textAnchor:"middle",children:u})})},Zf=Xp;var zt=U(We(),1);var qf=(e,t)=>{let n=L(e.ticsCount,0);n||(t.data&&t.data.length>0?n=t.data.length:n=t.max);let r=L(e.ticksHeight,20);return{ticksCount:n,disableTicks:be(e.disableTicks,!1),ticksWidth:L(e.ticksWidth,3),ticksHeight:r,longerTicksHeight:L(e.longerTicksHeight,r*2),ticksDistanceToPanel:L(e.ticksDistanceToPanel,0),tickValuesDistance:L(e.tickValuesDistance,15),ticksColor:K(e.ticksColor,zf),tickValuesColor:K(e.tickValuesColor,Of),tickValuesFontSize:L(e.tickValuesFontSize,12),ticksGroupSize:L(e.ticksGroupSize,10),longerTickValuesOnly:be(e.longerTickValuesOnly,!0),showTickValues:be(e.showTickValues,!0)}},Jf=(e,t,n,r,l,o)=>{let i=[],u=Math.abs(r-n),a=t===0?0:u/t,s=t;o.isClosedShape||s++;for(let p=0;p0){let Z=Math.round(P);P=o.data[Z]}else P=Le(P,o.round);_=(P!=null?P:"").toString()}let D=0,T=0,A=_!==void 0;if(A){let P=L(R+e.tickValuesDistance,R*1.5),Z=eo(f,P);D=v+Z[0],T=y+Z[1]}i.push({x:v,y,x1:E,y1:k,textX:D,textY:T,isLonger:w,tickValue:_,showText:A})}return i};var dt=U(re(),1),em=e=>{let{settings:t,svg:n,data:r}=e,[l,o]=(0,zt.useState)(null),[i,u]=(0,zt.useState)([]);return(0,zt.useEffect)(()=>{o(qf(t,r))},[t,r]),(0,zt.useEffect)(()=>{if(!l)return;let a=n.endAngleDeg;a{let{x:p,y:g,x1:h,y1:v,textX:y,textY:w,showText:R}=a;return(0,dt.jsxs)(zt.Fragment,{children:[(0,dt.jsx)("line",{x1:p,y1:g,x2:h,y2:v,strokeWidth:l.ticksWidth,stroke:l.ticksColor}),R&&(0,dt.jsx)("text",{x:y,y:w,textAnchor:"middle",dominantBaseline:"middle",fill:l.tickValuesColor,fontSize:l.tickValuesFontSize,fontFamily:t.tickValuesFontFamily,style:{userSelect:"none"},children:a.tickValue})]},s)})})})},bf=em;var so=U(We(),1);var Rr=U(re(),1),tm=e=>{let{settings:t,pointers:n,$svg:r,svg:l,setPointer:o}=e,[i,u]=(0,so.useState)({strokeDasharray:"0 1000000",strokeOffset:0});return(0,so.useEffect)(()=>{u(Ff(l.startAngleDeg,l.endAngleDeg,l.radius))},[l.startAngleDeg,l.endAngleDeg,l.radius]),(0,Rr.jsxs)("g",{onClick:s=>{if(!r||t.disabled)return;let p=qt(r,s.clientX,s.clientY,l.cx,l.cy,l.radius,l.radius),g=ro(n.pointers,p,l.cx,l.cy,l.radius);g&&o(g,p)},children:[l.border>0&&(0,Rr.jsx)("circle",{strokeDasharray:i.strokeDasharray,strokeDashoffset:i.strokeOffset,cx:l.cx,cy:l.cy,r:l.radius,stroke:K(t.pathBorderColor,If),strokeWidth:l.thickness+l.border*2,fill:"none",shapeRendering:"geometricPrecision",strokeLinecap:"round",cursor:"pointer","data-type":"path-border"}),(0,Rr.jsx)("circle",{strokeDasharray:i.strokeDasharray,strokeDashoffset:i.strokeOffset,cx:l.cx,cy:l.cy,r:l.radius,stroke:K(t.pathBgColor,Rf),strokeWidth:l.thickness,fill:"none",shapeRendering:"geometricPrecision",strokeLinecap:"round",cursor:"pointer","data-type":"path"})]})},ed=tm;var Ne=U(re(),1),S=e=>{let[t,n]=(0,et.useState)(null),[r,l]=(0,et.useState)(null),[o,i]=(0,et.useState)(null),u=(0,et.useRef)(null);(0,et.useEffect)(()=>{n(Kf(e))},[e]),(0,et.useEffect)(()=>{i(Vf(e,t))},[e,t]),(0,et.useEffect)(()=>{if(!o)return;let s=L(e.pathStartAngle,0),p=L(e.pathEndAngle,360);p<=s&&(p+=360),l(Pf(L(e.pathRadius,150),L(e.pathThickness,5),L(e.pathBorder,0),o.maxRadius,s,p))},[e.pathRadius,e.pathThickness,e.pathBorder,e.pathStartAngle,e.pathEndAngle,o]);let a=(s,p)=>{if(e.disabled||!o.pointers||!s||s.disabled||(p=Fu(p,t.stepAngleDeg),t.isClosedShape&&b(p,360)===b(r.endAngleDeg,360)&&(p=r.startAngleDeg),s.angleDeg===p))return;if(!e.pointersOverlap){let v,y;if(t.isClosedShape){let w=b(s.index-1,o.pointers.length),R=b(s.index+1,o.pointers.length);v=o.pointers[w].angleDeg,y=o.pointers[R].angleDeg}else v=s.index===0?r.startAngleDeg:o.pointers[s.index-1].angleDeg,y=s.index===o.pointers.length-1?r.endAngleDeg:o.pointers[s.index+1].angleDeg;y<=v&&(y+=360),no(v,y,p)||(p=lo(v,y,p,r.cx,r.cy,r.radius))}if(s.angleDeg===p)return;let h=Ir({},o);if(h.pointers=[...o.pointers],h.pointers[s.index].angleDeg=p,o.pointers=h.pointers,i(h),typeof e.onChange=="function"){let v=h.pointers.map(y=>Rn(t,y.angleDeg,r.startAngleDeg,r.endAngleDeg));e.onChange(v)}};return(0,Ne.jsx)(Ne.Fragment,{children:r&&(0,Ne.jsxs)("svg",{ref:u,xmlns:"http://www.w3.org/2000/svg",width:r.size,height:r.size,tabIndex:0,focusable:!0,"aria-disabled":e.disabled?!0:void 0,style:io,children:[e.SvgDefs&&(0,Ne.jsx)("defs",{children:e.SvgDefs}),(0,Ne.jsx)(bf,{settings:e,svg:r,data:t}),(0,Ne.jsx)(ed,{settings:e,pointers:o,svg:r,$svg:u.current,setPointer:a}),(0,Ne.jsx)(Yf,{settings:e,pointers:o,svg:r,$svg:u.current,data:t,setPointer:a}),(0,Ne.jsx)(Gf,{settings:e,pointers:o,svg:r,$svg:u.current,setPointer:a,data:t}),(0,Ne.jsx)(Zf,{settings:e,pointers:o,svg:r,data:t})]})})};var m=U(re(),1),tg=()=>(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(S,{}),(0,m.jsx)(S,{pathStartAngle:0,pathEndAngle:90}),(0,m.jsx)(S,{pathStartAngle:0,pathEndAngle:180}),(0,m.jsx)(S,{pathStartAngle:90,pathEndAngle:180}),(0,m.jsx)(S,{pathStartAngle:180,pathEndAngle:270}),(0,m.jsx)(S,{pathStartAngle:180,pathEndAngle:360}),(0,m.jsx)(S,{pathStartAngle:270,pathEndAngle:360}),(0,m.jsx)(S,{pathStartAngle:270,pathEndAngle:90}),(0,m.jsx)(S,{pathStartAngle:270,pathEndAngle:180}),(0,m.jsx)(S,{pathStartAngle:90,pathEndAngle:270})]}),ng=()=>(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(S,{pathRadius:150,pathBorder:10,pathBorderColor:"#68da1c"}),(0,m.jsx)(S,{pathStartAngle:0,pathEndAngle:90,pathRadius:150,pathBorder:10,pathBorderColor:"#8e3da4"}),(0,m.jsx)(S,{pathStartAngle:0,pathEndAngle:180,pathRadius:150,pathBorder:1,pathBorderColor:"#68da1c"}),(0,m.jsx)(S,{pathStartAngle:90,pathEndAngle:180,pathRadius:150,pathBorder:2,pathBorderColor:"#8e3da4"}),(0,m.jsx)(S,{pathStartAngle:180,pathEndAngle:270,pathRadius:150,pathBorder:3,pathBorderColor:"#4bace2"}),(0,m.jsx)(S,{pathStartAngle:180,pathEndAngle:360,pathRadius:150,pathBorder:3,pathBorderColor:"#4bace2"}),(0,m.jsx)(S,{pathStartAngle:180,pathEndAngle:380,pathRadius:150,pathBorder:3,pathBorderColor:"#4bace2"}),(0,m.jsx)(S,{pathStartAngle:180,pathEndAngle:90,pathRadius:150,pathBorder:3,pathBorderColor:"#4bace2"}),(0,m.jsx)(S,{pathStartAngle:270,pathEndAngle:90,pathRadius:150,pathBorder:3,pathBorderColor:"#4bace2"}),(0,m.jsx)(S,{pathStartAngle:270,pathEndAngle:180,pathRadius:150,pathBorder:3,pathBorderColor:"#4bace2"}),(0,m.jsx)(S,{pathRadius:100,pathBorder:3,pathBorderColor:"#4bace2"}),(0,m.jsx)(S,{pathStartAngle:0,pathEndAngle:90,pathRadius:100,pathBorder:3,pathBorderColor:"#4bace2"}),(0,m.jsx)(S,{pathStartAngle:0,pathEndAngle:180,pathRadius:100,pathBorder:3,pathBorderColor:"#4bace2"}),(0,m.jsx)(S,{pathStartAngle:90,pathEndAngle:180,pathRadius:100,pathBorder:3,pathBorderColor:"#4bace2"}),(0,m.jsx)(S,{pathStartAngle:180,pathEndAngle:270,pathRadius:100,pathBorder:3,pathBorderColor:"#4bace2"}),(0,m.jsx)(S,{pathStartAngle:180,pathEndAngle:360,pathRadius:100,pathBorder:3,pathBorderColor:"#4bace2"}),(0,m.jsx)(S,{pathStartAngle:180,pathEndAngle:380,pathRadius:100,pathBorder:3,pathBorderColor:"#4bace2"}),(0,m.jsx)(S,{pathStartAngle:180,pathEndAngle:90,pathRadius:100,pathBorder:3,pathBorderColor:"#4bace2"}),(0,m.jsx)(S,{pathStartAngle:270,pathEndAngle:90,pathRadius:100,pathBorder:3,pathBorderColor:"#4bace2"}),(0,m.jsx)(S,{pathStartAngle:270,pathEndAngle:180,pathRadius:100,pathBorder:3,pathBorderColor:"#4bace2"})]}),rg=()=>(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(S,{pointers:[{value:30},{value:70}]}),(0,m.jsx)(S,{pathStartAngle:0,pathEndAngle:90,pointers:[{value:30},{value:70}]}),(0,m.jsx)(S,{pathStartAngle:0,pathEndAngle:180,pointers:[{value:30},{value:70}]}),(0,m.jsx)(S,{pathStartAngle:90,pathEndAngle:180,pointers:[{value:30},{value:70}]}),(0,m.jsx)(S,{pathStartAngle:180,pathEndAngle:270,pointers:[{value:30},{value:70}]}),(0,m.jsx)(S,{pathStartAngle:180,pathEndAngle:360,pointers:[{value:30},{value:70}]}),(0,m.jsx)(S,{pathStartAngle:270,pathEndAngle:360,pointers:[{value:30},{value:70}]}),(0,m.jsx)(S,{pathStartAngle:270,pathEndAngle:90,pointers:[{value:30},{value:70}]}),(0,m.jsx)(S,{pathStartAngle:270,pathEndAngle:180,pointers:[{value:30},{value:70}]}),(0,m.jsx)(S,{pathStartAngle:90,pathEndAngle:270,pointers:[{value:30},{value:70}]}),(0,m.jsx)(S,{pathStartAngle:90,pathEndAngle:90,pointers:[{value:30},{value:70}]})]}),lg=()=>(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(S,{pathRadius:150,pathStartAngle:0,pathEndAngle:180,pointers:[{value:0,bgColor:"#8e3da4"},{value:25,bgColor:"#fffc00"},{value:50,bgColor:"#b0fc7e"},{value:75,bgColor:"#ff0000"},{value:100,bgColor:"#ffb800"}]}),(0,m.jsx)(S,{pathRadius:150,pathStartAngle:0,pathEndAngle:180,pointers:[{value:30},{value:60},{value:90}]}),(0,m.jsx)(S,{pathRadius:150,pathStartAngle:0,pathEndAngle:360,pointers:[{value:30},{value:60},{value:90}]}),(0,m.jsx)(S,{pathRadius:150,pathStartAngle:0,pathEndAngle:360,pointers:[{value:0},{value:25},{value:50},{value:75}]}),(0,m.jsx)(S,{pathRadius:150,pathStartAngle:270,pathEndAngle:90,pointers:[{value:30},{value:60},{value:90}]}),(0,m.jsx)(S,{pathRadius:150,pathStartAngle:270,pathEndAngle:180,pointers:[{value:30},{value:60},{value:90}]}),(0,m.jsx)(S,{pathRadius:150,pathStartAngle:270,pathEndAngle:0,pointers:[{value:30},{value:60},{value:90}]}),(0,m.jsx)(S,{pathRadius:150,pathStartAngle:0,pathEndAngle:90,pointers:[{value:30},{value:60},{value:90}]})]}),og=()=>(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(S,{min:-100,max:100,pointerBorder:15}),(0,m.jsx)(S,{min:100,max:200})]}),ig=()=>(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(S,{pathStartAngle:90,pointerBgColor:"#d3bbdc",pointerBorder:2,pointerBorderColor:"#8e3da4",showTickValues:!0,ticksGroupSize:10}),(0,m.jsx)(S,{pointers:[{radius:3}]}),(0,m.jsx)(S,{pathThickness:10,pathBorder:2,pathBorderColor:"#5daed2",pointers:[{radius:3}]}),(0,m.jsx)(S,{pathStartAngle:0,pathEndAngle:90,pathBgColor:"#163a86",pathThickness:15,pointers:[{radius:3}]}),(0,m.jsx)(S,{pathStartAngle:0,pathEndAngle:45,pointers:[{radius:3}],ticsCount:5,ticksGroupSize:5,longerTickValuesOnly:!1})]}),ug=()=>(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(S,{pathRadius:150,pathStartAngle:270,pathEndAngle:45,pointers:[{value:100}],textColor:"#366d8c",textFontSize:24,textPrefix:"Value: ",textSuffix:"%"}),(0,m.jsx)(S,{pathStartAngle:180,pathEndAngle:90,pathRadius:150,pointers:[{value:10},{value:90}],connectionBgColor:"#bb9d9d",textSuffix:"px",textFontFamily:"Arial"}),(0,m.jsx)(S,{pathStartAngle:180,pathEndAngle:90,pathRadius:150,pointers:[{value:10.1234},{value:90.5678}],connectionBgColor:"#bb9d9d",textSuffix:"px",textFontFamily:"Arial",round:2})]}),ag=()=>(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(S,{data:["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"],textColor:"#5DAED2",textFontSize:24,textFontFamily:"Helvetica,Arial,sans-serif",ticksGroupSize:0,longerTickValuesOnly:!1}),(0,m.jsx)(S,{data:["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"],textColor:"#5DAED2",textFontSize:24,textFontFamily:"Helvetica,Arial,sans-serif",pointers:[{value:"b"}],ticksGroupSize:0,longerTickValuesOnly:!1}),(0,m.jsx)(S,{data:["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"],textColor:"#5DAED2",textFontSize:24,textFontFamily:"Helvetica,Arial,sans-serif",pointers:[{value:"t"}],ticksGroupSize:0,longerTickValuesOnly:!1}),(0,m.jsx)(S,{data:["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"],textColor:"#5DAED2",textFontSize:24,textFontFamily:"Helvetica,Arial,sans-serif",pointers:[{value:"y"}],ticksGroupSize:0,longerTickValuesOnly:!1}),(0,m.jsx)(S,{data:["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"],textColor:"#5DAED2",textFontSize:24,textFontFamily:"Helvetica,Arial,sans-serif",pointers:[{value:"z"}],ticksGroupSize:0,longerTickValuesOnly:!1}),(0,m.jsx)(S,{data:["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"],textColor:"#5DAED2",textFontSize:24,textFontFamily:"Helvetica,Arial,sans-serif",pointers:[{value:"a"}],ticksGroupSize:0,longerTickValuesOnly:!1})]}),sg=()=>(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(S,{step:1}),(0,m.jsx)(S,{step:.1,round:2}),(0,m.jsx)(S,{step:10})]}),cg=()=>(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(S,{pointersOverlap:!0}),(0,m.jsx)(S,{pathStartAngle:0,pathEndAngle:90,pointersOverlap:!0,pointers:[{value:30},{value:70}]}),(0,m.jsx)(S,{pathStartAngle:0,pathEndAngle:180,pointersOverlap:!0,pointers:[{value:30},{value:70}]}),(0,m.jsx)(S,{pathStartAngle:90,pathEndAngle:180,pointersOverlap:!0,pointers:[{value:30},{value:70}]}),(0,m.jsx)(S,{pathStartAngle:180,pathEndAngle:270,pointersOverlap:!0,pointers:[{value:30},{value:70}]}),(0,m.jsx)(S,{pathStartAngle:180,pathEndAngle:360,pointersOverlap:!0,pointers:[{value:30},{value:70}]}),(0,m.jsx)(S,{pathStartAngle:270,pathEndAngle:360,pointersOverlap:!0,pointers:[{value:30},{value:70}]}),(0,m.jsx)(S,{pathStartAngle:270,pathEndAngle:90,pointersOverlap:!0,pointers:[{value:30},{value:70}]}),(0,m.jsx)(S,{pathStartAngle:270,pathEndAngle:180,pointersOverlap:!0,pointers:[{value:30},{value:70}]}),(0,m.jsx)(S,{pathStartAngle:90,pathEndAngle:270,pointersOverlap:!0,pointers:[{value:30},{value:70}]})]}),fg=()=>(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(S,{pathRadius:150,pathStartAngle:0,pathEndAngle:180,pointers:[{value:0},{value:25},{value:50},{value:75},{value:100}]}),(0,m.jsx)(S,{pathRadius:150,pathStartAngle:0,pathEndAngle:180,pointerBgColorSelected:"#ff0000",pointers:[{value:0},{value:25},{value:50},{value:75},{value:100}]}),(0,m.jsx)(S,{pathRadius:150,pathStartAngle:0,pathEndAngle:180,pointers:[{value:0,bgColor:"#8e3da4",bgColorSelected:"#702b80"},{value:25,bgColor:"#fffc00",bgColorSelected:"#b9b822"},{value:50,bgColor:"#b0fc7e",bgColorSelected:"#86c959"},{value:75,bgColor:"#ff0000",bgColorSelected:"#b42929"},{value:100,bgColor:"#ffb800",bgColorSelected:"#c48f08"}]}),(0,m.jsx)(S,{SvgDefs:(0,m.jsxs)(m.Fragment,{children:[(0,m.jsxs)("linearGradient",{id:"pointer",x1:"0%",y1:"0%",x2:"0%",y2:"100%",children:[(0,m.jsx)("stop",{offset:"0%",stopColor:"#8e50c4"}),(0,m.jsx)("stop",{offset:"100%",stopColor:"#422563"})]}),(0,m.jsxs)("linearGradient",{id:"pointer-selected",x1:"0%",y1:"0%",x2:"0%",y2:"100%",children:[(0,m.jsx)("stop",{offset:"0%",stopColor:"#f2c832"}),(0,m.jsx)("stop",{offset:"100%",stopColor:"#f19305"})]}),(0,m.jsxs)("linearGradient",{id:"connection",x1:"0%",y1:"0%",x2:"0%",y2:"100%",children:[(0,m.jsx)("stop",{offset:"0%",stopColor:"#00bc9b"}),(0,m.jsx)("stop",{offset:"100%",stopColor:"#5eaefd"})]})]}),pointerBgColor:"url(#pointer)",pointerBgColorSelected:"url(#pointer-selected)",connectionBgColor:"url(#connection)",pointers:[{value:30},{value:70}]})]}),dg=()=>(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(S,{}),(0,m.jsx)(S,{disabled:!0}),(0,m.jsx)(S,{disabled:!0,pathStartAngle:0,pathEndAngle:90,pointers:[{value:30},{value:70}]}),(0,m.jsx)(S,{pathStartAngle:0,pathEndAngle:90,pointers:[{value:30},{value:70,disabled:!0}]}),(0,m.jsx)(S,{keyboardDisabled:!0}),(0,m.jsx)(S,{mousewheelDisabled:!0})]}),pg=()=>(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(S,{onChange:e=>{console.log(e)}}),(0,m.jsx)(S,{round:2,step:.1,onChange:e=>{console.log(e)}}),(0,m.jsx)(S,{min:-100,max:100,onChange:e=>{console.log(e)}}),(0,m.jsx)(S,{data:["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"],textColor:"#5DAED2",textFontSize:24,textFontFamily:"Helvetica,Arial,sans-serif",ticksGroupSize:0,longerTickValuesOnly:!1,onChange:e=>{console.log(e)}}),(0,m.jsx)(S,{pathRadius:150,pathStartAngle:0,pathEndAngle:180,pointers:[{value:0,bgColor:"#8e3da4"},{value:25,bgColor:"#fffc00"},{value:50,bgColor:"#b0fc7e"},{value:75,bgColor:"#ff0000"},{value:100,bgColor:"#ffb800"}],onChange:e=>{console.log(e)}})]}),om=()=>(0,m.jsx)(m.Fragment,{children:(0,m.jsx)(S,{rangeDragging:!0,pointers:[{value:30},{value:70}]})}),im=()=>(0,m.jsx)(m.Fragment,{children:om()}),um=()=>{let e=document.getElementById("root");if(!e)return;nd.default.createRoot(e).render((0,m.jsx)(td.StrictMode,{children:(0,m.jsx)(im,{})}))};um();})(); +(()=>{var mO=Object.create;var Ph=Object.defineProperty;var gO=Object.getOwnPropertyDescriptor;var yO=Object.getOwnPropertyNames,rS=Object.getOwnPropertySymbols,bO=Object.getPrototypeOf,oS=Object.prototype.hasOwnProperty,SO=Object.prototype.propertyIsEnumerable;var iS=(p,m,b)=>m in p?Ph(p,m,{enumerable:!0,configurable:!0,writable:!0,value:b}):p[m]=b,Sf=(p,m)=>{for(var b in m||(m={}))oS.call(m,b)&&iS(p,b,m[b]);if(rS)for(var b of rS(m))SO.call(m,b)&&iS(p,b,m[b]);return p};var Fr=(p,m)=>()=>(m||p((m={exports:{}}).exports,m),m.exports);var EO=(p,m,b,T)=>{if(m&&typeof m=="object"||typeof m=="function")for(let S of yO(m))!oS.call(p,S)&&S!==b&&Ph(p,S,{get:()=>m[S],enumerable:!(T=gO(m,S))||T.enumerable});return p};var mt=(p,m,b)=>(b=p!=null?mO(bO(p)):{},EO(m||!p||!p.__esModule?Ph(b,"default",{value:p,enumerable:!0}):b,p));var uS=Fr((Ne,Ef)=>{"use strict";(function(){"use strict";typeof __REACT_DEVTOOLS_GLOBAL_HOOK__!="undefined"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart=="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error);var p="18.2.0",m=Symbol.for("react.element"),b=Symbol.for("react.portal"),T=Symbol.for("react.fragment"),S=Symbol.for("react.strict_mode"),z=Symbol.for("react.profiler"),f=Symbol.for("react.provider"),q=Symbol.for("react.context"),P=Symbol.for("react.forward_ref"),U=Symbol.for("react.suspense"),Y=Symbol.for("react.suspense_list"),V=Symbol.for("react.memo"),K=Symbol.for("react.lazy"),F=Symbol.for("react.offscreen"),J=Symbol.iterator,ze="@@iterator";function Ye(s){if(s===null||typeof s!="object")return null;var v=J&&s[J]||s[ze];return typeof v=="function"?v:null}var Ke={current:null},Te={transition:null},ae={current:null,isBatchingLegacy:!1,didScheduleLegacyUpdate:!1},Ze={current:null},be={},lt=null;function Ae(s){lt=s}be.setExtraStackFrame=function(s){lt=s},be.getCurrentStack=null,be.getStackAddendum=function(){var s="";lt&&(s+=lt);var v=be.getCurrentStack;return v&&(s+=v()||""),s};var fn=!1,se=!1,He=!1,Je=!1,Oe=!1,ue={ReactCurrentDispatcher:Ke,ReactCurrentBatchConfig:Te,ReactCurrentOwner:Ze};ue.ReactDebugCurrentFrame=be,ue.ReactCurrentActQueue=ae;function qe(s){{for(var v=arguments.length,x=new Array(v>1?v-1:0),O=1;O1?v-1:0),O=1;O1){for(var rt=Array(Ge),it=0;it1){for(var ct=Array(it),gt=0;gt is not supported and will be removed in a future major release. Did you mean to render instead?")),v.Provider},set:function(te){v.Provider=te}},_currentValue:{get:function(){return v._currentValue},set:function(te){v._currentValue=te}},_currentValue2:{get:function(){return v._currentValue2},set:function(te){v._currentValue2=te}},_threadCount:{get:function(){return v._threadCount},set:function(te){v._threadCount=te}},Consumer:{get:function(){return x||(x=!0,ve("Rendering is not supported and will be removed in a future major release. Did you mean to render instead?")),v.Consumer}},displayName:{get:function(){return v.displayName},set:function(te){B||(qe("Setting `displayName` on Context.Consumer has no effect. You should set it directly on the context with Context.displayName = '%s'.",te),B=!0)}}}),v.Consumer=ce}return v._currentRenderer=null,v._currentRenderer2=null,v}var Ra=-1,dr=0,uo=1,lo=2;function $r(s){if(s._status===Ra){var v=s._result,x=v();if(x.then(function(ce){if(s._status===dr||s._status===Ra){var te=s;te._status=uo,te._result=ce}},function(ce){if(s._status===dr||s._status===Ra){var te=s;te._status=lo,te._result=ce}}),s._status===Ra){var O=s;O._status=dr,O._result=x}}if(s._status===uo){var B=s._result;return B===void 0&&ve(`lazy: Expected the result of a dynamic import() call. Instead received: %s + +Your code should look like: + const MyComponent = lazy(() => import('./MyComponent')) + +Did you accidentally put curly braces around the import?`,B),"default"in B||ve(`lazy: Expected the result of a dynamic import() call. Instead received: %s + +Your code should look like: + const MyComponent = lazy(() => import('./MyComponent'))`,B),B.default}else throw s._result}function Ya(s){var v={_status:Ra,_result:s},x={$$typeof:K,_payload:v,_init:$r};{var O,B;Object.defineProperties(x,{defaultProps:{configurable:!0,get:function(){return O},set:function(ce){ve("React.lazy(...): It is not supported to assign `defaultProps` to a lazy component import. Either specify them where the component is defined, or create a wrapping component around it."),O=ce,Object.defineProperty(x,"defaultProps",{enumerable:!0})}},propTypes:{configurable:!0,get:function(){return B},set:function(ce){ve("React.lazy(...): It is not supported to assign `propTypes` to a lazy component import. Either specify them where the component is defined, or create a wrapping component around it."),B=ce,Object.defineProperty(x,"propTypes",{enumerable:!0})}}})}return x}function xa(s){s!=null&&s.$$typeof===V?ve("forwardRef requires a render function but received a `memo` component. Instead of forwardRef(memo(...)), use memo(forwardRef(...))."):typeof s!="function"?ve("forwardRef requires a render function but was given %s.",s===null?"null":typeof s):s.length!==0&&s.length!==2&&ve("forwardRef render functions accept exactly two parameters: props and ref. %s",s.length===1?"Did you forget to use the ref parameter?":"Any additional parameter will be undefined."),s!=null&&(s.defaultProps!=null||s.propTypes!=null)&&ve("forwardRef render functions do not support propTypes or defaultProps. Did you accidentally pass a React component?");var v={$$typeof:P,render:s};{var x;Object.defineProperty(v,"displayName",{enumerable:!1,configurable:!0,get:function(){return x},set:function(O){x=O,!s.name&&!s.displayName&&(s.displayName=O)}})}return v}var Da;Da=Symbol.for("react.module.reference");function Yr(s){return!!(typeof s=="string"||typeof s=="function"||s===T||s===z||Oe||s===S||s===U||s===Y||Je||s===F||fn||se||He||typeof s=="object"&&s!==null&&(s.$$typeof===K||s.$$typeof===V||s.$$typeof===f||s.$$typeof===q||s.$$typeof===P||s.$$typeof===Da||s.getModuleId!==void 0))}function h(s,v){Yr(s)||ve("memo: The first argument must be a component. Instead received: %s",s===null?"null":typeof s);var x={$$typeof:V,type:s,compare:v===void 0?null:v};{var O;Object.defineProperty(x,"displayName",{enumerable:!1,configurable:!0,get:function(){return O},set:function(B){O=B,!s.name&&!s.displayName&&(s.displayName=B)}})}return x}function L(){var s=Ke.current;return s===null&&ve(`Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons: +1. You might have mismatching versions of React and the renderer (such as React DOM) +2. You might be breaking the Rules of Hooks +3. You might have more than one copy of React in the same app +See https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem.`),s}function I(s){var v=L();if(s._context!==void 0){var x=s._context;x.Consumer===s?ve("Calling useContext(Context.Consumer) is not supported, may cause bugs, and will be removed in a future major release. Did you mean to call useContext(Context) instead?"):x.Provider===s&&ve("Calling useContext(Context.Provider) is not supported. Did you mean to call useContext(Context) instead?")}return v.useContext(s)}function oe(s){var v=L();return v.useState(s)}function Me(s,v,x){var O=L();return O.useReducer(s,v,x)}function Fe(s){var v=L();return v.useRef(s)}function Re(s,v){var x=L();return x.useEffect(s,v)}function le(s,v){var x=L();return x.useInsertionEffect(s,v)}function Mt(s,v){var x=L();return x.useLayoutEffect(s,v)}function dt(s,v){var x=L();return x.useCallback(s,v)}function pt(s,v){var x=L();return x.useMemo(s,v)}function mn(s,v,x){var O=L();return O.useImperativeHandle(s,v,x)}function Ga(s,v){{var x=L();return x.useDebugValue(s,v)}}function so(){var s=L();return s.useTransition()}function Hn(s){var v=L();return v.useDeferredValue(s)}function Lf(){var s=L();return s.useId()}function pr(s,v,x){var O=L();return O.useSyncExternalStore(s,v,x)}var xe=0,Gr,mu,gu,yu,bu,Su,Eu;function Cu(){}Cu.__reactDisabledLog=!0;function cs(){{if(xe===0){Gr=console.log,mu=console.info,gu=console.warn,yu=console.error,bu=console.group,Su=console.groupCollapsed,Eu=console.groupEnd;var s={configurable:!0,enumerable:!0,value:Cu,writable:!0};Object.defineProperties(console,{info:s,log:s,warn:s,error:s,group:s,groupCollapsed:s,groupEnd:s})}xe++}}function kf(){{if(xe--,xe===0){var s={configurable:!0,enumerable:!0,writable:!0};Object.defineProperties(console,{log:dn({},s,{value:Gr}),info:dn({},s,{value:mu}),warn:dn({},s,{value:gu}),error:dn({},s,{value:yu}),group:dn({},s,{value:bu}),groupCollapsed:dn({},s,{value:Su}),groupEnd:dn({},s,{value:Eu})})}xe<0&&ve("disabledDepth fell below zero. This is a bug in React. Please file an issue.")}}var Tu=ue.ReactCurrentDispatcher,Ai;function qr(s,v,x){{if(Ai===void 0)try{throw Error()}catch(B){var O=B.stack.trim().match(/\n( *(at )?)/);Ai=O&&O[1]||""}return` +`+Ai+s}}var ca=!1,Wr;{var co=typeof WeakMap=="function"?WeakMap:Map;Wr=new co}function fs(s,v){if(!s||ca)return"";{var x=Wr.get(s);if(x!==void 0)return x}var O;ca=!0;var B=Error.prepareStackTrace;Error.prepareStackTrace=void 0;var ce;ce=Tu.current,Tu.current=null,cs();try{if(v){var te=function(){throw Error()};if(Object.defineProperty(te.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(te,[])}catch(wt){O=wt}Reflect.construct(s,[],te)}else{try{te.call()}catch(wt){O=wt}s.call(te.prototype)}}else{try{throw Error()}catch(wt){O=wt}s()}}catch(wt){if(wt&&O&&typeof wt.stack=="string"){for(var ye=wt.stack.split(` +`),ke=O.stack.split(` +`),Ge=ye.length-1,rt=ke.length-1;Ge>=1&&rt>=0&&ye[Ge]!==ke[rt];)rt--;for(;Ge>=1&&rt>=0;Ge--,rt--)if(ye[Ge]!==ke[rt]){if(Ge!==1||rt!==1)do if(Ge--,rt--,rt<0||ye[Ge]!==ke[rt]){var it=` +`+ye[Ge].replace(" at new "," at ");return s.displayName&&it.includes("")&&(it=it.replace("",s.displayName)),typeof s=="function"&&Wr.set(s,it),it}while(Ge>=1&&rt>=0);break}}}finally{ca=!1,Tu.current=ce,kf(),Error.prepareStackTrace=B}var ct=s?s.displayName||s.name:"",gt=ct?qr(ct):"";return typeof s=="function"&&Wr.set(s,gt),gt}function Ru(s,v,x){return fs(s,!1)}function Uf(s){var v=s.prototype;return!!(v&&v.isReactComponent)}function Xr(s,v,x){if(s==null)return"";if(typeof s=="function")return fs(s,Uf(s));if(typeof s=="string")return qr(s);switch(s){case U:return qr("Suspense");case Y:return qr("SuspenseList")}if(typeof s=="object")switch(s.$$typeof){case P:return Ru(s.render);case V:return Xr(s.type,v,x);case K:{var O=s,B=O._payload,ce=O._init;try{return Xr(ce(B),v,x)}catch(te){}}}return""}var ds={},fo=ue.ReactDebugCurrentFrame;function po(s){if(s){var v=s._owner,x=Xr(s.type,s._source,v?v.type:null);fo.setExtraStackFrame(x)}else fo.setExtraStackFrame(null)}function ps(s,v,x,O,B){{var ce=Function.call.bind(xn);for(var te in s)if(ce(s,te)){var ye=void 0;try{if(typeof s[te]!="function"){var ke=Error((O||"React class")+": "+x+" type `"+te+"` is invalid; it must be a function, usually from the `prop-types` package, but received `"+typeof s[te]+"`.This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.");throw ke.name="Invariant Violation",ke}ye=s[te](v,te,O,x,null,"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED")}catch(Ge){ye=Ge}ye&&!(ye instanceof Error)&&(po(B),ve("%s: type specification of %s `%s` is invalid; the type checker function must return `null` or an `Error` but returned a %s. You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument).",O||"React class",x,te,typeof ye),po(null)),ye instanceof Error&&!(ye.message in ds)&&(ds[ye.message]=!0,po(B),ve("Failed %s type: %s",x,ye.message),po(null))}}}function Qr(s){if(s){var v=s._owner,x=Xr(s.type,s._source,v?v.type:null);Ae(x)}else Ae(null)}var vo;vo=!1;function et(){if(Ze.current){var s=Tt(Ze.current.type);if(s)return` + +Check the render method of \``+s+"`."}return""}function Nf(s){if(s!==void 0){var v=s.fileName.replace(/^.*[\\\/]/,""),x=s.lineNumber;return` + +Check your code at `+v+":"+x+"."}return""}function vs(s){return s!=null?Nf(s.__source):""}var Ee={};function hs(s){var v=et();if(!v){var x=typeof s=="string"?s:s.displayName||s.name;x&&(v=` + +Check the top-level render call using <`+x+">.")}return v}function gn(s,v){if(!(!s._store||s._store.validated||s.key!=null)){s._store.validated=!0;var x=hs(v);if(!Ee[x]){Ee[x]=!0;var O="";s&&s._owner&&s._owner!==Ze.current&&(O=" It was passed a child from "+Tt(s._owner.type)+"."),Qr(s),ve('Each child in a list should have a unique "key" prop.%s%s See https://reactjs.org/link/warning-keys for more information.',x,O),Qr(null)}}}function Kr(s,v){if(typeof s=="object"){if(vn(s))for(var x=0;x",B=" Did you accidentally export a JSX literal instead of a component?"):te=typeof s,ve("React.createElement: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s",te,B)}var ye=fr.apply(this,arguments);if(ye==null)return ye;if(O)for(var ke=2;ke10&&qe("Detected a large number of updates inside startTransition. If this is due to a subscription please re-write it to use React provided hooks. Otherwise concurrent mode guarantees are off the table."),O._updatedFibers.clear()}}}var _a=!1,ho=null;function xu(s){if(ho===null)try{var v=("require"+Math.random()).slice(0,7),x=Ef&&Ef[v];ho=x.call(Ef,"timers").setImmediate}catch(O){ho=function(B){_a===!1&&(_a=!0,typeof MessageChannel=="undefined"&&ve("This browser does not have a MessageChannel implementation, so enqueuing tasks via await act(async () => ...) will fail. Please file an issue at https://github.com/facebook/react/issues if you encounter this warning."));var ce=new MessageChannel;ce.port1.onmessage=B,ce.port2.postMessage(void 0)}}return ho(s)}var vr=0,Du=!1;function Ff(s){{var v=vr;vr++,ae.current===null&&(ae.current=[]);var x=ae.isBatchingLegacy,O;try{if(ae.isBatchingLegacy=!0,O=s(),!x&&ae.didScheduleLegacyUpdate){var B=ae.current;B!==null&&(ae.didScheduleLegacyUpdate=!1,go(B))}}catch(ct){throw mo(v),ct}finally{ae.isBatchingLegacy=x}if(O!==null&&typeof O=="object"&&typeof O.then=="function"){var ce=O,te=!1,ye={then:function(ct,gt){te=!0,ce.then(function(wt){mo(v),vr===0?_u(wt,ct,gt):ct(wt)},function(wt){mo(v),gt(wt)})}};return!Du&&typeof Promise!="undefined"&&Promise.resolve().then(function(){}).then(function(){te||(Du=!0,ve("You called act(async () => ...) without await. This could lead to unexpected testing behaviour, interleaving multiple act calls and mixing their scopes. You should - await act(async () => ...);"))}),ye}else{var ke=O;if(mo(v),vr===0){var Ge=ae.current;Ge!==null&&(go(Ge),ae.current=null);var rt={then:function(ct,gt){ae.current===null?(ae.current=[],_u(ke,ct,gt)):ct(ke)}};return rt}else{var it={then:function(ct,gt){ct(ke)}};return it}}}}function mo(s){s!==vr-1&&ve("You seem to have overlapping act() calls, this is not supported. Be sure to await previous act() calls before making a new one. "),vr=s}function _u(s,v,x){{var O=ae.current;if(O!==null)try{go(O),xu(function(){O.length===0?(ae.current=null,v(s)):_u(s,v,x)})}catch(B){x(B)}else v(s)}}var Jr=!1;function go(s){if(!Jr){Jr=!0;var v=0;try{for(;v{"use strict";lS.exports=uS()});var sS=Fr(ut=>{"use strict";(function(){"use strict";typeof __REACT_DEVTOOLS_GLOBAL_HOOK__!="undefined"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart=="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error);var p=!1,m=!1,b=5;function T($,re){var Se=$.length;$.push(re),f($,re,Se)}function S($){return $.length===0?null:$[0]}function z($){if($.length===0)return null;var re=$[0],Se=$.pop();return Se!==re&&($[0]=Se,q($,Se,0)),re}function f($,re,Se){for(var Ie=Se;Ie>0;){var tt=Ie-1>>>1,Pt=$[tt];if(P(Pt,re)>0)$[tt]=re,$[Ie]=Pt,Ie=tt;else return}}function q($,re,Se){for(var Ie=Se,tt=$.length,Pt=tt>>>1;IeSe&&(!$||xn()));){var Ie=Oe.callback;if(typeof Ie=="function"){Oe.callback=null,ue=Oe.priorityLevel;var tt=Oe.expirationTime<=Se,Pt=Ie(tt);Se=ut.unstable_now(),typeof Pt=="function"?Oe.callback=Pt:Oe===S(se)&&z(se),aa(Se)}else z(se);Oe=S(se)}if(Oe!==null)return!0;var bt=S(He);return bt!==null&&Rt(pn,bt.startTime-Se),!1}function $a($,re){switch($){case U:case Y:case V:case K:case F:break;default:$=V}var Se=ue;ue=$;try{return re()}finally{ue=Se}}function ra($){var re;switch(ue){case U:case Y:case V:re=V;break;default:re=ue;break}var Se=ue;ue=re;try{return $()}finally{ue=Se}}function Ca($){var re=ue;return function(){var Se=ue;ue=re;try{return $.apply(this,arguments)}finally{ue=Se}}}function Yn($,re,Se){var Ie=ut.unstable_now(),tt;if(typeof Se=="object"&&Se!==null){var Pt=Se.delay;typeof Pt=="number"&&Pt>0?tt=Ie+Pt:tt=Ie}else tt=Ie;var bt;switch($){case U:bt=Ze;break;case Y:bt=be;break;case F:bt=fn;break;case K:bt=Ae;break;case V:default:bt=lt;break}var zn=tt+bt,nt={id:Je++,callback:re,priorityLevel:$,startTime:tt,expirationTime:zn,sortIndex:-1};return tt>Ie?(nt.sortIndex=tt,T(He,nt),S(se)===null&&nt===S(He)&&(Tn?sa():Tn=!0,Rt(pn,tt-Ie))):(nt.sortIndex=zn,T(se,nt),!ve&&!qe&&(ve=!0,la(Nn))),nt}function Rn(){}function ia(){!ve&&!qe&&(ve=!0,la(Nn))}function vn(){return S(se)}function Gn($){$.callback=null}function Xt(){return ue}var Qt=!1,Et=null,Kt=-1,Zt=b,Tt=-1;function xn(){var $=ut.unstable_now()-Tt;return!($125){console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported");return}$>0?Zt=Math.floor(1e3/$):Zt=b}var oa=function(){if(Et!==null){var $=ut.unstable_now();Tt=$;var re=!0,Se=!0;try{Se=Et(re,$)}finally{Se?hn():(Qt=!1,Et=null)}}else Qt=!1},hn;if(typeof Ea=="function")hn=function(){Ea(oa)};else if(typeof MessageChannel!="undefined"){var ua=new MessageChannel,Dn=ua.port2;ua.port1.onmessage=oa,hn=function(){Dn.postMessage(null)}}else hn=function(){Ia(oa,0)};function la($){Et=$,Qt||(Qt=!0,hn())}function Rt($,re){Kt=Ia(function(){$(ut.unstable_now())},re)}function sa(){Wt(Kt),Kt=-1}var Ta=Pr,fr=null;ut.unstable_IdlePriority=F,ut.unstable_ImmediatePriority=U,ut.unstable_LowPriority=K,ut.unstable_NormalPriority=V,ut.unstable_Profiling=fr,ut.unstable_UserBlockingPriority=Y,ut.unstable_cancelCallback=Gn,ut.unstable_continueExecution=ia,ut.unstable_forceFrameRate=jr,ut.unstable_getCurrentPriorityLevel=Xt,ut.unstable_getFirstCallbackNode=vn,ut.unstable_next=ra,ut.unstable_pauseExecution=Rn,ut.unstable_requestPaint=Ta,ut.unstable_runWithPriority=$a,ut.unstable_scheduleCallback=Yn,ut.unstable_shouldYield=xn,ut.unstable_wrapCallback=Ca,typeof __REACT_DEVTOOLS_GLOBAL_HOOK__!="undefined"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop=="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error)})()});var fS=Fr((oM,cS)=>{"use strict";cS.exports=sS()});var dS=Fr(ta=>{"use strict";(function(){"use strict";typeof __REACT_DEVTOOLS_GLOBAL_HOOK__!="undefined"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart=="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error);var p=or(),m=fS(),b=p.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,T=!1;function S(e){T=e}function z(e){if(!T){for(var t=arguments.length,n=new Array(t>1?t-1:0),a=1;a1?t-1:0),a=1;a2&&(e[0]==="o"||e[0]==="O")&&(e[1]==="n"||e[1]==="N")}function zn(e,t,n,a){if(n!==null&&n.type===ua)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":{if(a)return!1;if(n!==null)return!n.acceptsBooleans;var r=e.toLowerCase().slice(0,5);return r!=="data-"&&r!=="aria-"}default:return!1}}function nt(e,t,n,a){if(t===null||typeof t=="undefined"||zn(e,t,n,a))return!0;if(a)return!1;if(n!==null)switch(n.type){case Rt:return!t;case sa:return t===!1;case Ta:return isNaN(t);case fr:return isNaN(t)||t<1}return!1}function _n(e){return st.hasOwnProperty(e)?st[e]:null}function at(e,t,n,a,r,i,o){this.acceptsBooleans=t===la||t===Rt||t===sa,this.attributeName=a,this.attributeNamespace=r,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=i,this.removeEmptyString=o}var st={},Di=["children","dangerouslySetInnerHTML","defaultValue","defaultChecked","innerHTML","suppressContentEditableWarning","suppressHydrationWarning","style"];Di.forEach(function(e){st[e]=new at(e,ua,!1,e,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0],n=e[1];st[t]=new at(t,Dn,!1,n,null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(e){st[e]=new at(e,la,!1,e.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){st[e]=new at(e,la,!1,e,null,!1,!1)}),["allowFullScreen","async","autoFocus","autoPlay","controls","default","defer","disabled","disablePictureInPicture","disableRemotePlayback","formNoValidate","hidden","loop","noModule","noValidate","open","playsInline","readOnly","required","reversed","scoped","seamless","itemScope"].forEach(function(e){st[e]=new at(e,Rt,!1,e.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(e){st[e]=new at(e,Rt,!0,e,null,!1,!1)}),["capture","download"].forEach(function(e){st[e]=new at(e,sa,!1,e,null,!1,!1)}),["cols","rows","size","span"].forEach(function(e){st[e]=new at(e,fr,!1,e,null,!1,!1)}),["rowSpan","start"].forEach(function(e){st[e]=new at(e,Ta,!1,e.toLowerCase(),null,!1,!1)});var Ir=/[\-\:]([a-z])/g,_i=function(e){return e[1].toUpperCase()};["accent-height","alignment-baseline","arabic-form","baseline-shift","cap-height","clip-path","clip-rule","color-interpolation","color-interpolation-filters","color-profile","color-rendering","dominant-baseline","enable-background","fill-opacity","fill-rule","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","glyph-name","glyph-orientation-horizontal","glyph-orientation-vertical","horiz-adv-x","horiz-origin-x","image-rendering","letter-spacing","lighting-color","marker-end","marker-mid","marker-start","overline-position","overline-thickness","paint-order","panose-1","pointer-events","rendering-intent","shape-rendering","stop-color","stop-opacity","strikethrough-position","strikethrough-thickness","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","text-anchor","text-decoration","text-rendering","underline-position","underline-thickness","unicode-bidi","unicode-range","units-per-em","v-alphabetic","v-hanging","v-ideographic","v-mathematical","vector-effect","vert-adv-y","vert-origin-x","vert-origin-y","word-spacing","writing-mode","xmlns:xlink","x-height"].forEach(function(e){var t=e.replace(Ir,_i);st[t]=new at(t,Dn,!1,e,null,!1,!1)}),["xlink:actuate","xlink:arcrole","xlink:role","xlink:show","xlink:title","xlink:type"].forEach(function(e){var t=e.replace(Ir,_i);st[t]=new at(t,Dn,!1,e,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(Ir,_i);st[t]=new at(t,Dn,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(e){st[e]=new at(e,Dn,!1,e.toLowerCase(),null,!1,!1)});var oo="xlinkHref";st[oo]=new at("xlinkHref",Dn,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(e){st[e]=new at(e,Dn,!1,e.toLowerCase(),null,!0,!0)});var hu=/^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*\:/i,Ra=!1;function dr(e){!Ra&&hu.test(e)&&(Ra=!0,f("A future version of React will block javascript: URLs as a security precaution. Use event handlers instead if you can. If you need to generate unsafe HTML try using dangerouslySetInnerHTML instead. React was passed %s.",JSON.stringify(e)))}function uo(e,t,n,a){if(a.mustUseProperty){var r=a.propertyName;return e[r]}else{Tt(n,t),a.sanitizeURL&&dr(""+n);var i=a.attributeName,o=null;if(a.type===sa){if(e.hasAttribute(i)){var u=e.getAttribute(i);return u===""?!0:nt(t,n,a,!1)?u:u===""+n?n:u}}else if(e.hasAttribute(i)){if(nt(t,n,a,!1))return e.getAttribute(i);if(a.type===Rt)return n;o=e.getAttribute(i)}return nt(t,n,a,!1)?o===null?n:o:o===""+n?n:o}}function lo(e,t,n,a){{if(!Pt(t))return;if(!e.hasAttribute(t))return n===void 0?void 0:null;var r=e.getAttribute(t);return Tt(n,t),r===""+n?n:r}}function $r(e,t,n,a){var r=_n(t);if(!bt(t,r,a)){if(nt(t,n,r,a)&&(n=null),a||r===null){if(Pt(t)){var i=t;n===null?e.removeAttribute(i):(Tt(n,t),e.setAttribute(i,""+n))}return}var o=r.mustUseProperty;if(o){var u=r.propertyName;if(n===null){var l=r.type;e[u]=l===Rt?!1:""}else e[u]=n;return}var c=r.attributeName,d=r.attributeNamespace;if(n===null)e.removeAttribute(c);else{var y=r.type,g;y===Rt||y===sa&&n===!0?g="":(Tt(n,c),g=""+n,r.sanitizeURL&&dr(g.toString())),d?e.setAttributeNS(d,c,g):e.setAttribute(c,g)}}}var Ya=Symbol.for("react.element"),xa=Symbol.for("react.portal"),Da=Symbol.for("react.fragment"),Yr=Symbol.for("react.strict_mode"),h=Symbol.for("react.profiler"),L=Symbol.for("react.provider"),I=Symbol.for("react.context"),oe=Symbol.for("react.forward_ref"),Me=Symbol.for("react.suspense"),Fe=Symbol.for("react.suspense_list"),Re=Symbol.for("react.memo"),le=Symbol.for("react.lazy"),Mt=Symbol.for("react.scope"),dt=Symbol.for("react.debug_trace_mode"),pt=Symbol.for("react.offscreen"),mn=Symbol.for("react.legacy_hidden"),Ga=Symbol.for("react.cache"),so=Symbol.for("react.tracing_marker"),Hn=Symbol.iterator,Lf="@@iterator";function pr(e){if(e===null||typeof e!="object")return null;var t=Hn&&e[Hn]||e[Lf];return typeof t=="function"?t:null}var xe=Object.assign,Gr=0,mu,gu,yu,bu,Su,Eu,Cu;function cs(){}cs.__reactDisabledLog=!0;function kf(){{if(Gr===0){mu=console.log,gu=console.info,yu=console.warn,bu=console.error,Su=console.group,Eu=console.groupCollapsed,Cu=console.groupEnd;var e={configurable:!0,enumerable:!0,value:cs,writable:!0};Object.defineProperties(console,{info:e,log:e,warn:e,error:e,group:e,groupCollapsed:e,groupEnd:e})}Gr++}}function Tu(){{if(Gr--,Gr===0){var e={configurable:!0,enumerable:!0,writable:!0};Object.defineProperties(console,{log:xe({},e,{value:mu}),info:xe({},e,{value:gu}),warn:xe({},e,{value:yu}),error:xe({},e,{value:bu}),group:xe({},e,{value:Su}),groupCollapsed:xe({},e,{value:Eu}),groupEnd:xe({},e,{value:Cu})})}Gr<0&&f("disabledDepth fell below zero. This is a bug in React. Please file an issue.")}}var Ai=b.ReactCurrentDispatcher,qr;function ca(e,t,n){{if(qr===void 0)try{throw Error()}catch(r){var a=r.stack.trim().match(/\n( *(at )?)/);qr=a&&a[1]||""}return` +`+qr+e}}var Wr=!1,co;{var fs=typeof WeakMap=="function"?WeakMap:Map;co=new fs}function Ru(e,t){if(!e||Wr)return"";{var n=co.get(e);if(n!==void 0)return n}var a;Wr=!0;var r=Error.prepareStackTrace;Error.prepareStackTrace=void 0;var i;i=Ai.current,Ai.current=null,kf();try{if(t){var o=function(){throw Error()};if(Object.defineProperty(o.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(o,[])}catch(R){a=R}Reflect.construct(e,[],o)}else{try{o.call()}catch(R){a=R}e.call(o.prototype)}}else{try{throw Error()}catch(R){a=R}e()}}catch(R){if(R&&a&&typeof R.stack=="string"){for(var u=R.stack.split(` +`),l=a.stack.split(` +`),c=u.length-1,d=l.length-1;c>=1&&d>=0&&u[c]!==l[d];)d--;for(;c>=1&&d>=0;c--,d--)if(u[c]!==l[d]){if(c!==1||d!==1)do if(c--,d--,d<0||u[c]!==l[d]){var y=` +`+u[c].replace(" at new "," at ");return e.displayName&&y.includes("")&&(y=y.replace("",e.displayName)),typeof e=="function"&&co.set(e,y),y}while(c>=1&&d>=0);break}}}finally{Wr=!1,Ai.current=i,Tu(),Error.prepareStackTrace=r}var g=e?e.displayName||e.name:"",D=g?ca(g):"";return typeof e=="function"&&co.set(e,D),D}function Uf(e,t,n){return Ru(e,!0)}function Xr(e,t,n){return Ru(e,!1)}function ds(e){var t=e.prototype;return!!(t&&t.isReactComponent)}function fo(e,t,n){if(e==null)return"";if(typeof e=="function")return Ru(e,ds(e));if(typeof e=="string")return ca(e);switch(e){case Me:return ca("Suspense");case Fe:return ca("SuspenseList")}if(typeof e=="object")switch(e.$$typeof){case oe:return Xr(e.render);case Re:return fo(e.type,t,n);case le:{var a=e,r=a._payload,i=a._init;try{return fo(i(r),t,n)}catch(o){}}}return""}function po(e){var t=e._debugOwner?e._debugOwner.type:null,n=e._debugSource;switch(e.tag){case F:return ca(e.type);case fn:return ca("Lazy");case be:return ca("Suspense");case Je:return ca("SuspenseList");case P:case Y:case Ae:return Xr(e.type);case ae:return Xr(e.type.render);case U:return Uf(e.type);default:return""}}function ps(e){try{var t="",n=e;do t+=po(n),n=n.return;while(n);return t}catch(a){return` +Error generating stack: `+a.message+` +`+a.stack}}function Qr(e,t,n){var a=e.displayName;if(a)return a;var r=t.displayName||t.name||"";return r!==""?n+"("+r+")":n}function vo(e){return e.displayName||"Context"}function et(e){if(e==null)return null;if(typeof e.tag=="number"&&f("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case Da:return"Fragment";case xa:return"Portal";case h:return"Profiler";case Yr:return"StrictMode";case Me:return"Suspense";case Fe:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case I:var t=e;return vo(t)+".Consumer";case L:var n=e;return vo(n._context)+".Provider";case oe:return Qr(e,e.render,"ForwardRef");case Re:var a=e.displayName||null;return a!==null?a:et(e.type)||"Memo";case le:{var r=e,i=r._payload,o=r._init;try{return et(o(i))}catch(u){return null}}}return null}function Nf(e,t,n){var a=t.displayName||t.name||"";return e.displayName||(a!==""?n+"("+a+")":n)}function vs(e){return e.displayName||"Context"}function Ee(e){var t=e.tag,n=e.type;switch(t){case ve:return"Cache";case Ke:var a=n;return vs(a)+".Consumer";case Te:var r=n;return vs(r._context)+".Provider";case He:return"DehydratedFragment";case ae:return Nf(n,n.render,"ForwardRef");case ze:return"Fragment";case F:return n;case K:return"Portal";case V:return"Root";case J:return"Text";case fn:return et(n);case Ye:return n===Yr?"StrictMode":"Mode";case ue:return"Offscreen";case Ze:return"Profiler";case Oe:return"Scope";case be:return"Suspense";case Je:return"SuspenseList";case Tn:return"TracingMarker";case U:case P:case se:case Y:case lt:case Ae:if(typeof n=="function")return n.displayName||n.name||null;if(typeof n=="string")return n;break}return null}var hs=b.ReactDebugCurrentFrame,gn=null,Kr=!1;function Zr(){{if(gn===null)return null;var e=gn._debugOwner;if(e!==null&&typeof e!="undefined")return Ee(e)}return null}function zf(){return gn===null?"":ps(gn)}function jt(){hs.getCurrentStack=null,gn=null,Kr=!1}function ht(e){hs.getCurrentStack=e===null?null:zf,gn=e,Kr=!1}function Hf(){return gn}function fa(e){Kr=e}function Fn(e){return""+e}function _a(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return hn(e),e;default:return""}}var ho={button:!0,checkbox:!0,image:!0,hidden:!0,radio:!0,reset:!0,submit:!0};function xu(e,t){ho[t.type]||t.onChange||t.onInput||t.readOnly||t.disabled||t.value==null||f("You provided a `value` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultValue`. Otherwise, set either `onChange` or `readOnly`."),t.onChange||t.readOnly||t.disabled||t.checked==null||f("You provided a `checked` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultChecked`. Otherwise, set either `onChange` or `readOnly`.")}function vr(e){var t=e.type,n=e.nodeName;return n&&n.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function Du(e){return e._valueTracker}function Ff(e){e._valueTracker=null}function mo(e){var t="";return e&&(vr(e)?t=e.checked?"true":"false":t=e.value),t}function _u(e){var t=vr(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t);hn(e[t]);var a=""+e[t];if(!(e.hasOwnProperty(t)||typeof n=="undefined"||typeof n.get!="function"||typeof n.set!="function")){var r=n.get,i=n.set;Object.defineProperty(e,t,{configurable:!0,get:function(){return r.call(this)},set:function(u){hn(u),a=""+u,i.call(this,u)}}),Object.defineProperty(e,t,{enumerable:n.enumerable});var o={getValue:function(){return a},setValue:function(u){hn(u),a=""+u},stopTracking:function(){Ff(e),delete e[t]}};return o}}function Jr(e){Du(e)||(e._valueTracker=_u(e))}function go(e){if(!e)return!1;var t=Du(e);if(!t)return!0;var n=t.getValue(),a=mo(e);return a!==n?(t.setValue(a),!0):!1}function yo(e){if(e=e||(typeof document!="undefined"?document:void 0),typeof e=="undefined")return null;try{return e.activeElement||e.body}catch(t){return e.body}}var ms=!1,gs=!1,ys=!1,s=!1;function v(e){var t=e.type==="checkbox"||e.type==="radio";return t?e.checked!=null:e.value!=null}function x(e,t){var n=e,a=t.checked,r=xe({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:a!=null?a:n._wrapperState.initialChecked});return r}function O(e,t){xu("input",t),t.checked!==void 0&&t.defaultChecked!==void 0&&!gs&&(f("%s contains an input of type %s with both checked and defaultChecked props. Input elements must be either controlled or uncontrolled (specify either the checked prop, or the defaultChecked prop, but not both). Decide between using a controlled or uncontrolled input element and remove one of these props. More info: https://reactjs.org/link/controlled-components",Zr()||"A component",t.type),gs=!0),t.value!==void 0&&t.defaultValue!==void 0&&!ms&&(f("%s contains an input of type %s with both value and defaultValue props. Input elements must be either controlled or uncontrolled (specify either the value prop, or the defaultValue prop, but not both). Decide between using a controlled or uncontrolled input element and remove one of these props. More info: https://reactjs.org/link/controlled-components",Zr()||"A component",t.type),ms=!0);var n=e,a=t.defaultValue==null?"":t.defaultValue;n._wrapperState={initialChecked:t.checked!=null?t.checked:t.defaultChecked,initialValue:_a(t.value!=null?t.value:a),controlled:v(t)}}function B(e,t){var n=e,a=t.checked;a!=null&&$r(n,"checked",a,!1)}function ce(e,t){var n=e;{var a=v(t);!n._wrapperState.controlled&&a&&!s&&(f("A component is changing an uncontrolled input to be controlled. This is likely caused by the value changing from undefined to a defined value, which should not happen. Decide between using a controlled or uncontrolled input element for the lifetime of the component. More info: https://reactjs.org/link/controlled-components"),s=!0),n._wrapperState.controlled&&!a&&!ys&&(f("A component is changing a controlled input to be uncontrolled. This is likely caused by the value changing from a defined to undefined, which should not happen. Decide between using a controlled or uncontrolled input element for the lifetime of the component. More info: https://reactjs.org/link/controlled-components"),ys=!0)}B(e,t);var r=_a(t.value),i=t.type;if(r!=null)i==="number"?(r===0&&n.value===""||n.value!=r)&&(n.value=Fn(r)):n.value!==Fn(r)&&(n.value=Fn(r));else if(i==="submit"||i==="reset"){n.removeAttribute("value");return}t.hasOwnProperty("value")?Ge(n,t.type,r):t.hasOwnProperty("defaultValue")&&Ge(n,t.type,_a(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(n.defaultChecked=!!t.defaultChecked)}function te(e,t,n){var a=e;if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type,i=r==="submit"||r==="reset";if(i&&(t.value===void 0||t.value===null))return;var o=Fn(a._wrapperState.initialValue);n||o!==a.value&&(a.value=o),a.defaultValue=o}var u=a.name;u!==""&&(a.name=""),a.defaultChecked=!a.defaultChecked,a.defaultChecked=!!a._wrapperState.initialChecked,u!==""&&(a.name=u)}function ye(e,t){var n=e;ce(n,t),ke(n,t)}function ke(e,t){var n=t.name;if(t.type==="radio"&&n!=null){for(var a=e;a.parentNode;)a=a.parentNode;Tt(n,"name");for(var r=a.querySelectorAll("input[name="+JSON.stringify(""+n)+'][type="radio"]'),i=0;i.")))}):t.dangerouslySetInnerHTML!=null&&(ct||(ct=!0,f("Pass a `value` prop if you set dangerouslyInnerHTML so React knows which value should be selected.")))),t.selected!=null&&!rt&&(f("Use the `defaultValue` or `value` props on must be a scalar value if `multiple` is false.%s",n,bs())}}}}function hr(e,t,n,a){var r=e.options;if(t){for(var i=n,o={},u=0;u.");var a=xe({},t,{value:void 0,defaultValue:void 0,children:Fn(n._wrapperState.initialValue)});return a}function Zh(e,t){var n=e;xu("textarea",t),t.value!==void 0&&t.defaultValue!==void 0&&!Kh&&(f("%s contains a textarea with both value and defaultValue props. Textarea elements must be either controlled or uncontrolled (specify either the value prop, or the defaultValue prop, but not both). Decide between using a controlled or uncontrolled textarea and remove one of these props. More info: https://reactjs.org/link/controlled-components",Zr()||"A component"),Kh=!0);var a=t.value;if(a==null){var r=t.children,i=t.defaultValue;if(r!=null){f("Use the `defaultValue` or `value` props instead of setting children on