modern-path2d 0.1.3 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -61,13 +61,12 @@ class Point2D {
61
61
  equals(point) {
62
62
  return this.x === point.x && this.y === point.y;
63
63
  }
64
- applyMatrix3(matrix3) {
65
- const [a, c, tx, b, d, ty] = matrix3.elements;
66
- const { x, y } = this;
67
- this.set(
68
- a * x + c * y + tx,
69
- b * x + d * y + ty
70
- );
64
+ applyMatrix3(m) {
65
+ const x = this.x;
66
+ const y = this.y;
67
+ const e = m.elements;
68
+ this.x = e[0] * x + e[3] * y + e[6];
69
+ this.y = e[1] * x + e[4] * y + e[7];
71
70
  return this;
72
71
  }
73
72
  copy(point) {
@@ -1557,6 +1556,14 @@ class HeartCurve extends Curve {
1557
1556
  const line = this.getCurrentLine(value);
1558
1557
  return new Point2D(line.v2.y - line.v1.y, -(line.v2.x - line.v1.x)).normalize();
1559
1558
  }
1559
+ transform(matrix) {
1560
+ this.curves.forEach((curve) => curve.transform(matrix));
1561
+ return this;
1562
+ }
1563
+ getMinMax(min = Point2D.MAX, max = Point2D.MIN) {
1564
+ this.curves.forEach((curve) => curve.getMinMax(min, max));
1565
+ return { min, max };
1566
+ }
1560
1567
  getCommands() {
1561
1568
  return this.curves.flatMap((curve) => curve.getCommands());
1562
1569
  }
@@ -1616,13 +1623,17 @@ class PloygonCurve extends Curve {
1616
1623
  const line = this.getCurrentLine(value);
1617
1624
  return new Point2D(line.v2.y - line.v1.y, -(line.v2.x - line.v1.x)).normalize();
1618
1625
  }
1619
- getCommands() {
1620
- return this.curves.flatMap((curve) => curve.getCommands());
1626
+ transform(matrix) {
1627
+ this.curves.forEach((curve) => curve.transform(matrix));
1628
+ return this;
1621
1629
  }
1622
1630
  getMinMax(min = Point2D.MAX, max = Point2D.MIN) {
1623
1631
  this.curves.forEach((curve) => curve.getMinMax(min, max));
1624
1632
  return { min, max };
1625
1633
  }
1634
+ getCommands() {
1635
+ return this.curves.flatMap((curve) => curve.getCommands());
1636
+ }
1626
1637
  drawTo(ctx) {
1627
1638
  this.curves.forEach((curve) => curve.drawTo(ctx));
1628
1639
  return this;
@@ -1709,7 +1720,7 @@ class RectangularCurve extends Curve {
1709
1720
  new Point2D(x - offsetX, y + offsetY)
1710
1721
  ];
1711
1722
  for (let i = 0; i < 4; i++) {
1712
- this.curves.push(new LineCurve(points[i], points[(i + 1) % 4]));
1723
+ this.curves.push(new LineCurve(points[i].clone(), points[(i + 1) % 4].clone()));
1713
1724
  }
1714
1725
  }
1715
1726
  get x() {
@@ -1757,13 +1768,17 @@ class RectangularCurve extends Curve {
1757
1768
  const { v1, v2 } = this.getCurrentLine(value);
1758
1769
  return new Point2D(v2.y - v1.y, -(v2.x - v1.x)).normalize();
1759
1770
  }
1760
- getCommands() {
1761
- return this.curves.flatMap((curve) => curve.getCommands());
1771
+ transform(matrix) {
1772
+ this.curves.forEach((curve) => curve.transform(matrix));
1773
+ return this;
1762
1774
  }
1763
1775
  getMinMax(min = Point2D.MAX, max = Point2D.MIN) {
1764
1776
  this.curves.forEach((curve) => curve.getMinMax(min, max));
1765
1777
  return { min, max };
1766
1778
  }
1779
+ getCommands() {
1780
+ return this.curves.flatMap((curve) => curve.getCommands());
1781
+ }
1767
1782
  drawTo(ctx) {
1768
1783
  this.curves.forEach((curve) => curve.drawTo(ctx));
1769
1784
  return this;
@@ -2174,9 +2189,9 @@ class Path2D {
2174
2189
  ctx.fill();
2175
2190
  }
2176
2191
  copy(source) {
2177
- source.currentPath = this.currentPath.clone();
2178
- source.paths = this.paths.map((path) => path.clone());
2179
- source.userData = this.userData;
2192
+ this.currentPath = source.currentPath.clone();
2193
+ this.paths = source.paths.map((path) => path.clone());
2194
+ this.userData = source.userData;
2180
2195
  return this;
2181
2196
  }
2182
2197
  toCanvas(fill = true) {
@@ -2196,7 +2211,7 @@ class Path2D {
2196
2211
  return canvas;
2197
2212
  }
2198
2213
  clone() {
2199
- return new Path2D().copy(this);
2214
+ return new this.constructor().copy(this);
2200
2215
  }
2201
2216
  }
2202
2217
 
package/dist/index.d.cts CHANGED
@@ -37,7 +37,7 @@ declare class Point2D {
37
37
  normalize(): this;
38
38
  lerpVectors(v1: Point2D, v2: Point2D, alpha: number): this;
39
39
  equals(point: Point2D): boolean;
40
- applyMatrix3(matrix3: Matrix3): this;
40
+ applyMatrix3(m: Matrix3): this;
41
41
  copy(point: Point2D): this;
42
42
  clone(): Point2D;
43
43
  }
@@ -132,7 +132,7 @@ declare class Path2D<T = any> {
132
132
  fillTo(ctx: CanvasRenderingContext2D): void;
133
133
  copy(source: Path2D): this;
134
134
  toCanvas(fill?: boolean): HTMLCanvasElement;
135
- clone(): Path2D;
135
+ clone(): this;
136
136
  }
137
137
 
138
138
  /**
@@ -284,6 +284,11 @@ declare class HeartCurve extends Curve {
284
284
  getCurrentLine(value: number): Curve;
285
285
  getTangent(value: number): Point2D;
286
286
  getNormal(value: number): Point2D;
287
+ transform(matrix: Matrix3): this;
288
+ getMinMax(min?: Point2D, max?: Point2D): {
289
+ min: Point2D;
290
+ max: Point2D;
291
+ };
287
292
  getCommands(): PathCommand[];
288
293
  drawTo(ctx: CanvasRenderingContext2D): this;
289
294
  }
@@ -323,11 +328,12 @@ declare class PloygonCurve extends Curve {
323
328
  getCurrentLine(value: number): LineCurve;
324
329
  getTangent(value: number): Point2D;
325
330
  getNormal(value: number): Point2D;
326
- getCommands(): PathCommand[];
331
+ transform(matrix: Matrix3): this;
327
332
  getMinMax(min?: Point2D, max?: Point2D): {
328
333
  min: Point2D;
329
334
  max: Point2D;
330
335
  };
336
+ getCommands(): PathCommand[];
331
337
  drawTo(ctx: CanvasRenderingContext2D): this;
332
338
  }
333
339
 
@@ -365,11 +371,12 @@ declare class RectangularCurve extends Curve {
365
371
  getCurrentLine(t: number): LineCurve;
366
372
  getTangent(t: number): Point2D;
367
373
  getNormal(value: number): Point2D;
368
- getCommands(): PathCommand[];
374
+ transform(matrix: Matrix3): this;
369
375
  getMinMax(min?: Point2D, max?: Point2D): {
370
376
  min: Point2D;
371
377
  max: Point2D;
372
378
  };
379
+ getCommands(): PathCommand[];
373
380
  drawTo(ctx: CanvasRenderingContext2D): this;
374
381
  }
375
382
 
package/dist/index.d.mts CHANGED
@@ -37,7 +37,7 @@ declare class Point2D {
37
37
  normalize(): this;
38
38
  lerpVectors(v1: Point2D, v2: Point2D, alpha: number): this;
39
39
  equals(point: Point2D): boolean;
40
- applyMatrix3(matrix3: Matrix3): this;
40
+ applyMatrix3(m: Matrix3): this;
41
41
  copy(point: Point2D): this;
42
42
  clone(): Point2D;
43
43
  }
@@ -132,7 +132,7 @@ declare class Path2D<T = any> {
132
132
  fillTo(ctx: CanvasRenderingContext2D): void;
133
133
  copy(source: Path2D): this;
134
134
  toCanvas(fill?: boolean): HTMLCanvasElement;
135
- clone(): Path2D;
135
+ clone(): this;
136
136
  }
137
137
 
138
138
  /**
@@ -284,6 +284,11 @@ declare class HeartCurve extends Curve {
284
284
  getCurrentLine(value: number): Curve;
285
285
  getTangent(value: number): Point2D;
286
286
  getNormal(value: number): Point2D;
287
+ transform(matrix: Matrix3): this;
288
+ getMinMax(min?: Point2D, max?: Point2D): {
289
+ min: Point2D;
290
+ max: Point2D;
291
+ };
287
292
  getCommands(): PathCommand[];
288
293
  drawTo(ctx: CanvasRenderingContext2D): this;
289
294
  }
@@ -323,11 +328,12 @@ declare class PloygonCurve extends Curve {
323
328
  getCurrentLine(value: number): LineCurve;
324
329
  getTangent(value: number): Point2D;
325
330
  getNormal(value: number): Point2D;
326
- getCommands(): PathCommand[];
331
+ transform(matrix: Matrix3): this;
327
332
  getMinMax(min?: Point2D, max?: Point2D): {
328
333
  min: Point2D;
329
334
  max: Point2D;
330
335
  };
336
+ getCommands(): PathCommand[];
331
337
  drawTo(ctx: CanvasRenderingContext2D): this;
332
338
  }
333
339
 
@@ -365,11 +371,12 @@ declare class RectangularCurve extends Curve {
365
371
  getCurrentLine(t: number): LineCurve;
366
372
  getTangent(t: number): Point2D;
367
373
  getNormal(value: number): Point2D;
368
- getCommands(): PathCommand[];
374
+ transform(matrix: Matrix3): this;
369
375
  getMinMax(min?: Point2D, max?: Point2D): {
370
376
  min: Point2D;
371
377
  max: Point2D;
372
378
  };
379
+ getCommands(): PathCommand[];
373
380
  drawTo(ctx: CanvasRenderingContext2D): this;
374
381
  }
375
382
 
package/dist/index.d.ts CHANGED
@@ -37,7 +37,7 @@ declare class Point2D {
37
37
  normalize(): this;
38
38
  lerpVectors(v1: Point2D, v2: Point2D, alpha: number): this;
39
39
  equals(point: Point2D): boolean;
40
- applyMatrix3(matrix3: Matrix3): this;
40
+ applyMatrix3(m: Matrix3): this;
41
41
  copy(point: Point2D): this;
42
42
  clone(): Point2D;
43
43
  }
@@ -132,7 +132,7 @@ declare class Path2D<T = any> {
132
132
  fillTo(ctx: CanvasRenderingContext2D): void;
133
133
  copy(source: Path2D): this;
134
134
  toCanvas(fill?: boolean): HTMLCanvasElement;
135
- clone(): Path2D;
135
+ clone(): this;
136
136
  }
137
137
 
138
138
  /**
@@ -284,6 +284,11 @@ declare class HeartCurve extends Curve {
284
284
  getCurrentLine(value: number): Curve;
285
285
  getTangent(value: number): Point2D;
286
286
  getNormal(value: number): Point2D;
287
+ transform(matrix: Matrix3): this;
288
+ getMinMax(min?: Point2D, max?: Point2D): {
289
+ min: Point2D;
290
+ max: Point2D;
291
+ };
287
292
  getCommands(): PathCommand[];
288
293
  drawTo(ctx: CanvasRenderingContext2D): this;
289
294
  }
@@ -323,11 +328,12 @@ declare class PloygonCurve extends Curve {
323
328
  getCurrentLine(value: number): LineCurve;
324
329
  getTangent(value: number): Point2D;
325
330
  getNormal(value: number): Point2D;
326
- getCommands(): PathCommand[];
331
+ transform(matrix: Matrix3): this;
327
332
  getMinMax(min?: Point2D, max?: Point2D): {
328
333
  min: Point2D;
329
334
  max: Point2D;
330
335
  };
336
+ getCommands(): PathCommand[];
331
337
  drawTo(ctx: CanvasRenderingContext2D): this;
332
338
  }
333
339
 
@@ -365,11 +371,12 @@ declare class RectangularCurve extends Curve {
365
371
  getCurrentLine(t: number): LineCurve;
366
372
  getTangent(t: number): Point2D;
367
373
  getNormal(value: number): Point2D;
368
- getCommands(): PathCommand[];
374
+ transform(matrix: Matrix3): this;
369
375
  getMinMax(min?: Point2D, max?: Point2D): {
370
376
  min: Point2D;
371
377
  max: Point2D;
372
378
  };
379
+ getCommands(): PathCommand[];
373
380
  drawTo(ctx: CanvasRenderingContext2D): this;
374
381
  }
375
382
 
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- (function(M,u){typeof exports=="object"&&typeof module<"u"?u(exports):typeof define=="function"&&define.amd?define(["exports"],u):(M=typeof globalThis<"u"?globalThis:M||self,u(M.modernPath2d={}))})(this,function(M){"use strict";var Vt=Object.defineProperty;var Bt=(M,u,S)=>u in M?Vt(M,u,{enumerable:!0,configurable:!0,writable:!0,value:S}):M[u]=S;var w=(M,u,S)=>Bt(M,typeof u!="symbol"?u+"":u,S);class u{constructor(e=0,t=0){this.x=e,this.y=t}static get MAX(){return new u(1/0,1/0)}static get MIN(){return new u(-1/0,-1/0)}set(e,t){return this.x=e,this.y=t,this}add(e){return this.x+=e.x,this.y+=e.y,this}sub(e){return this.x-=e.x,this.y-=e.y,this}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const t=this.x-e.x,s=this.y-e.y;return t*t+s*s}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}multiplyScalar(e){return this.x*=e,this.y*=e,this}divideScalar(e){return this.multiplyScalar(1/e)}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this}normalize(){return this.divideScalar(this.length()||1)}lerpVectors(e,t,s){return this.x=e.x+(t.x-e.x)*s,this.y=e.y+(t.y-e.y)*s,this}equals(e){return this.x===e.x&&this.y===e.y}applyMatrix3(e){const[t,s,i,o,h,a]=e.elements,{x:c,y:n}=this;return this.set(t*c+s*n+i,o*c+h*n+a),this}copy(e){return this.x=e.x,this.y=e.y,this}clone(){return new u(this.x,this.y)}}class S{constructor(e=0,t=0,s=0,i=0){this.left=e,this.top=t,this.width=s,this.height=i}get x(){return this.left}set x(e){this.left=e}get y(){return this.top}set y(e){this.top=e}get right(){return this.left+this.width}get bottom(){return this.top+this.height}static from(...e){const t=e[0],s=e.slice(1).reduce((i,o)=>(i.left=Math.min(i.left,o.left),i.top=Math.min(i.top,o.top),i.right=Math.max(i.right,o.right),i.bottom=Math.max(i.bottom,o.bottom),i),{left:(t==null?void 0:t.left)??0,top:(t==null?void 0:t.top)??0,right:(t==null?void 0:t.right)??0,bottom:(t==null?void 0:t.bottom)??0});return new S(s.left,s.top,s.right-s.left,s.bottom-s.top)}translate(e,t){return this.left+=e,this.top+=t,this}getCenterPoint(){return new u((this.left+this.right)/2,(this.top+this.bottom)/2)}clone(){return new S(this.left,this.top,this.width,this.height)}toArray(){return[this.left,this.top,this.width,this.height]}}class k{constructor(e=1,t=0,s=0,i=0,o=1,h=0,a=0,c=0,n=1){w(this,"elements",[]);this.set(e,t,s,i,o,h,a,c,n)}set(e,t,s,i,o,h,a,c,n){const l=this.elements;return l[0]=e,l[1]=i,l[2]=a,l[3]=t,l[4]=o,l[5]=c,l[6]=s,l[7]=h,l[8]=n,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(e){const t=this.elements,s=e.elements;return t[0]=s[0],t[1]=s[1],t[2]=s[2],t[3]=s[3],t[4]=s[4],t[5]=s[5],t[6]=s[6],t[7]=s[7],t[8]=s[8],this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){const s=e.elements,i=t.elements,o=this.elements,h=s[0],a=s[3],c=s[6],n=s[1],l=s[4],y=s[7],p=s[2],x=s[5],g=s[8],f=i[0],m=i[3],T=i[6],I=i[1],P=i[4],A=i[7],b=i[2],E=i[5],z=i[8];return o[0]=h*f+a*I+c*b,o[3]=h*m+a*P+c*E,o[6]=h*T+a*A+c*z,o[1]=n*f+l*I+y*b,o[4]=n*m+l*P+y*E,o[7]=n*T+l*A+y*z,o[2]=p*f+x*I+g*b,o[5]=p*m+x*P+g*E,o[8]=p*T+x*A+g*z,this}invert(){const e=this.elements,t=e[0],s=e[1],i=e[2],o=e[3],h=e[4],a=e[5],c=e[6],n=e[7],l=e[8],y=l*h-a*n,p=a*c-l*o,x=n*o-h*c,g=t*y+s*p+i*x;if(g===0)return this.set(0,0,0,0,0,0,0,0,0);const f=1/g;return e[0]=y*f,e[1]=(i*n-l*s)*f,e[2]=(a*s-i*h)*f,e[3]=p*f,e[4]=(l*t-i*c)*f,e[5]=(i*o-a*t)*f,e[6]=x*f,e[7]=(s*c-n*t)*f,e[8]=(h*t-s*o)*f,this}transpose(){let e;const t=this.elements;return e=t[1],t[1]=t[3],t[3]=e,e=t[2],t[2]=t[6],t[6]=e,e=t[5],t[5]=t[7],t[7]=e,this}scale(e,t){return this.premultiply(G.makeScale(e,t)),this}rotate(e){return this.premultiply(G.makeRotation(-e)),this}translate(e,t){return this.premultiply(G.makeTranslation(e,t)),this}makeTranslation(e,t){return this.set(1,0,e,0,1,t,0,0,1),this}makeRotation(e){const t=Math.cos(e),s=Math.sin(e);return this.set(t,-s,0,s,t,0,0,0,1),this}makeScale(e,t){return this.set(e,0,0,0,t,0,0,0,1),this}fromArray(e,t=0){for(let s=0;s<9;s++)this.elements[s]=e[s+t];return this}clone(){return new this.constructor().fromArray(this.elements)}}const G=new k;function B(r,e,t,s){const i=r*t+e*s,o=Math.sqrt(r*r+e*e)*Math.sqrt(t*t+s*s);let h=Math.acos(Math.max(-1,Math.min(1,i/o)));return r*s-e*t<0&&(h=-h),h}function yt(r,e,t,s,i,o,h,a){if(e===0||t===0){r.lineTo(a.x,a.y);return}s=s*Math.PI/180,e=Math.abs(e),t=Math.abs(t);const c=(h.x-a.x)/2,n=(h.y-a.y)/2,l=Math.cos(s)*c+Math.sin(s)*n,y=-Math.sin(s)*c+Math.cos(s)*n;let p=e*e,x=t*t;const g=l*l,f=y*y,m=g/p+f/x;if(m>1){const ut=Math.sqrt(m);e=ut*e,t=ut*t,p=e*e,x=t*t}const T=p*f+x*g,I=(p*x-T)/T;let P=Math.sqrt(Math.max(0,I));i===o&&(P=-P);const A=P*e*y/t,b=-P*t*l/e,E=Math.cos(s)*A-Math.sin(s)*b+(h.x+a.x)/2,z=Math.sin(s)*A+Math.cos(s)*b+(h.y+a.y)/2,Y=B(1,0,(l-A)/e,(y-b)/t),V=B((l-A)/e,(y-b)/t,(-l-A)/e,(-y-b)/t)%(Math.PI*2);r.currentPath.absellipse(E,z,e,t,Y,Y+V,o===0,s)}function D(r,e){return r-(e-r)}function gt(r,e){const t=new u,s=new u,i=new u;let o=!0,h=!1;for(let a=0,c=r.length;a<c;a++){const n=r[a];if(o&&(h=!0,o=!1),n.type==="m"||n.type==="M")n.type==="m"?(t.x+=n.x,t.y+=n.y):(t.x=n.x,t.y=n.y),s.x=t.x,s.y=t.y,e.moveTo(t.x,t.y),i.copy(t);else if(n.type==="h"||n.type==="H")n.type==="h"?t.x+=n.x:t.x=n.x,s.x=t.x,s.y=t.y,e.lineTo(t.x,t.y),h&&i.copy(t);else if(n.type==="v"||n.type==="V")n.type==="v"?t.y+=n.y:t.y=n.y,s.x=t.x,s.y=t.y,e.lineTo(t.x,t.y),h&&i.copy(t);else if(n.type==="l"||n.type==="L")n.type==="l"?(t.x+=n.x,t.y+=n.y):(t.x=n.x,t.y=n.y),s.x=t.x,s.y=t.y,e.lineTo(t.x,t.y),h&&i.copy(t);else if(n.type==="c"||n.type==="C")n.type==="c"?(e.bezierCurveTo(t.x+n.x1,t.y+n.y1,t.x+n.x2,t.y+n.y2,t.x+n.x,t.y+n.y),s.x=t.x+n.x2,s.y=t.y+n.y2,t.x+=n.x,t.y+=n.y):(e.bezierCurveTo(n.x1,n.y1,n.x2,n.y2,n.x,n.y),s.x=n.x2,s.y=n.y2,t.x=n.x,t.y=n.y),h&&i.copy(t);else if(n.type==="s"||n.type==="S")n.type==="s"?(e.bezierCurveTo(D(t.x,s.x),D(t.y,s.y),t.x+n.x2,t.y+n.y2,t.x+n.x,t.y+n.y),s.x=t.x+n.x2,s.y=t.y+n.y2,t.x+=n.x,t.y+=n.y):(e.bezierCurveTo(D(t.x,s.x),D(t.y,s.y),n.x2,n.y2,n.x,n.y),s.x=n.x2,s.y=n.y2,t.x=n.x,t.y=n.y),h&&i.copy(t);else if(n.type==="q"||n.type==="Q")n.type==="q"?(e.quadraticCurveTo(t.x+n.x1,t.y+n.y1,t.x+n.x,t.y+n.y),s.x=t.x+n.x1,s.y=t.y+n.y1,t.x+=n.x,t.y+=n.y):(e.quadraticCurveTo(n.x1,n.y1,n.x,n.y),s.x=n.x1,s.y=n.y1,t.x=n.x,t.y=n.y),h&&i.copy(t);else if(n.type==="t"||n.type==="T"){const l=D(t.x,s.x),y=D(t.y,s.y);s.x=l,s.y=y,n.type==="t"?(e.quadraticCurveTo(l,y,t.x+n.x,t.y+n.y),t.x+=n.x,t.y+=n.y):(e.quadraticCurveTo(l,y,n.x,n.y),t.x=n.x,t.y=n.y),h&&i.copy(t)}else if(n.type==="a"||n.type==="A"){if(n.type==="a"){if(n.x===0&&n.y===0)continue;t.x+=n.x,t.y+=n.y}else{if(n.x===t.x&&n.y===t.y)continue;t.x=n.x,t.y=n.y}const l=t.clone();s.x=t.x,s.y=t.y,yt(e,n.rx,n.ry,n.angle,n.largeArcFlag,n.sweepFlag,l,t),h&&i.copy(t)}else n.type==="z"||n.type==="Z"?(e.currentPath.autoClose=!0,e.currentPath.curves.length>0&&(t.copy(i),e.currentPath.currentPoint.copy(t),o=!0)):console.warn("Unsupported commands",n);h=!1}}const d={SEPARATOR:/[ \t\r\n,.\-+]/,WHITESPACE:/[ \t\r\n]/,DIGIT:/\d/,SIGN:/[-+]/,POINT:/\./,COMMA:/,/,EXP:/e/i,FLAGS:/[01]/};function N(r,e,t=0){let a=0,c=!0,n="",l="";const y=[];function p(m,T,I){const P=new SyntaxError(`Unexpected character "${m}" at index ${T}.`);throw P.partial=I,P}function x(){n!==""&&(l===""?y.push(Number(n)):y.push(Number(n)*10**Number(l))),n="",l=""}let g;const f=r.length;for(let m=0;m<f;m++){if(g=r[m],Array.isArray(e)&&e.includes(y.length%t)&&d.FLAGS.test(g)){a=1,n=g,x();continue}if(a===0){if(d.WHITESPACE.test(g))continue;if(d.DIGIT.test(g)||d.SIGN.test(g)){a=1,n=g;continue}if(d.POINT.test(g)){a=2,n=g;continue}d.COMMA.test(g)&&(c&&p(g,m,y),c=!0)}if(a===1){if(d.DIGIT.test(g)){n+=g;continue}if(d.POINT.test(g)){n+=g,a=2;continue}if(d.EXP.test(g)){a=3;continue}d.SIGN.test(g)&&n.length===1&&d.SIGN.test(n[0])&&p(g,m,y)}if(a===2){if(d.DIGIT.test(g)){n+=g;continue}if(d.EXP.test(g)){a=3;continue}d.POINT.test(g)&&n[n.length-1]==="."&&p(g,m,y)}if(a===3){if(d.DIGIT.test(g)){l+=g;continue}if(d.SIGN.test(g)){if(l===""){l+=g;continue}l.length===1&&d.SIGN.test(l)&&p(g,m,y)}}d.WHITESPACE.test(g)?(x(),a=0,c=!1):d.COMMA.test(g)?(x(),a=0,c=!0):d.SIGN.test(g)?(x(),a=1,n=g):d.POINT.test(g)?(x(),a=2,n=g):p(g,m,y)}return x(),y}function pt(r){switch(r.type){case"m":case"M":return`${r.type} ${r.x} ${r.y}`;case"h":case"H":return`${r.type} ${r.x}`;case"v":case"V":return`${r.type} ${r.y}`;case"l":case"L":return`${r.type} ${r.x} ${r.y}`;case"c":case"C":return`${r.type} ${r.x1} ${r.y1} ${r.x2} ${r.y2} ${r.x} ${r.y}`;case"s":case"S":return`${r.type} ${r.x2} ${r.y2} ${r.x} ${r.y}`;case"q":case"Q":return`${r.type} ${r.x1} ${r.y1} ${r.x} ${r.y}`;case"t":case"T":return`${r.type} ${r.x} ${r.y}`;case"a":case"A":return`${r.type} ${r.rx} ${r.ry} ${r.angle} ${r.largeArcFlag} ${r.sweepFlag} ${r.x} ${r.y}`;case"z":case"Z":return r.type;default:return""}}function ft(r){let e="";for(let t=0,s=r.length;t<s;t++)e+=`${pt(r[t])} `;return e}const xt=/[a-df-z][^a-df-z]*/gi;function Mt(r){const e=[],t=r.match(xt);if(!t)return e;for(let s=0,i=t.length;s<i;s++){const o=t[s],h=o.charAt(0),a=o.slice(1).trim();let c;switch(h){case"m":case"M":c=N(a);for(let n=0,l=c.length;n<l;n+=2)n===0?e.push({type:h,x:c[n],y:c[n+1]}):e.push({type:h==="m"?"l":"L",x:c[n],y:c[n+1]});break;case"h":case"H":c=N(a);for(let n=0,l=c.length;n<l;n++)e.push({type:h,x:c[n]});break;case"v":case"V":c=N(a);for(let n=0,l=c.length;n<l;n++)e.push({type:h,y:c[n]});break;case"l":case"L":c=N(a);for(let n=0,l=c.length;n<l;n+=2)e.push({type:h,x:c[n],y:c[n+1]});break;case"c":case"C":c=N(a);for(let n=0,l=c.length;n<l;n+=6)e.push({type:h,x1:c[n],y1:c[n+1],x2:c[n+2],y2:c[n+3],x:c[n+4],y:c[n+5]});break;case"s":case"S":c=N(a);for(let n=0,l=c.length;n<l;n+=4)e.push({type:h,x2:c[n],y2:c[n+1],x:c[n+2],y:c[n+3]});break;case"q":case"Q":c=N(a);for(let n=0,l=c.length;n<l;n+=4)e.push({type:h,x1:c[n],y1:c[n+1],x:c[n+2],y:c[n+3]});break;case"t":case"T":c=N(a);for(let n=0,l=c.length;n<l;n+=2)e.push({type:h,x:c[n],y:c[n+1]});break;case"a":case"A":c=N(a,[3,4],7);for(let n=0,l=c.length;n<l;n+=7)e.push({type:h,rx:c[n],ry:c[n+1],angle:c[n+2],largeArcFlag:c[n+3],sweepFlag:c[n+4],x:c[n+5],y:c[n+6]});break;case"z":case"Z":e.push({type:h});break;default:console.warn(o)}}return e}class L{constructor(){w(this,"arcLengthDivisions",200);w(this,"_cacheArcLengths");w(this,"_needsUpdate",!1)}getPointAt(e,t=new u){return this.getPoint(this.getUtoTmapping(e),t)}getPoints(e=5){const t=[];for(let s=0;s<=e;s++)t.push(this.getPoint(s/e));return t}getSpacedPoints(e=5){const t=[];for(let s=0;s<=e;s++)t.push(this.getPointAt(s/e));return t}getLength(){const e=this.getLengths();return e[e.length-1]}getLengths(e=this.arcLengthDivisions){if(this._cacheArcLengths&&this._cacheArcLengths.length===e+1&&!this._needsUpdate)return this._cacheArcLengths;this._needsUpdate=!1;const t=[];let s,i=this.getPoint(0),o=0;t.push(0);for(let h=1;h<=e;h++)s=this.getPoint(h/e),o+=s.distanceTo(i),t.push(o),i=s;return this._cacheArcLengths=t,t}updateArcLengths(){this._needsUpdate=!0,this.getLengths()}getUtoTmapping(e,t){const s=this.getLengths();let i=0;const o=s.length;let h;t?h=t:h=e*s[o-1];let a=0,c=o-1,n;for(;a<=c;)if(i=Math.floor(a+(c-a)/2),n=s[i]-h,n<0)a=i+1;else if(n>0)c=i-1;else{c=i;break}if(i=c,s[i]===h)return i/(o-1);const l=s[i],p=s[i+1]-l,x=(h-l)/p;return(i+x)/(o-1)}getTangent(e,t=new u){let i=e-1e-4,o=e+1e-4;return i<0&&(i=0),o>1&&(o=1),t.copy(this.getPoint(o)).sub(this.getPoint(i)).normalize()}getTangentAt(e,t=new u){return this.getTangent(this.getUtoTmapping(e),t)}transform(e){return this}getDivisions(e){return e}getMinMax(e=u.MAX,t=u.MIN){return{min:e,max:t}}getCommands(){return[]}getData(){return ft(this.getCommands())}drawTo(e){return this}copy(e){return this.arcLengthDivisions=e.arcLengthDivisions,this}clone(){return new this.constructor().copy(this)}}class O extends L{constructor(e,t,s=0,i=Math.PI*2){super(),this.center=e,this.radius=t,this.start=s,this.end=i}getPoint(e){const{radius:t,center:s}=this;return s.clone().add(this.getNormal(e).clone().multiplyScalar(t))}getTangent(e){const{x:t,y:s}=this.getNormal(e);return new u(-s,t)}getNormal(e){const{start:t,end:s}=this,i=e*(s-t)+t-.5*Math.PI;return new u(Math.cos(i),Math.sin(i))}getMinMax(e=u.MAX,t=u.MIN){return e.x=Math.min(e.x,this.center.x-this.radius),e.y=Math.min(e.y,this.center.y-this.radius),t.x=Math.max(t.x,this.center.x+this.radius),t.y=Math.max(t.y,this.center.y+this.radius),{min:e,max:t}}}function H(r,e,t,s,i){const o=(s-e)*.5,h=(i-t)*.5,a=r*r,c=r*a;return(2*t-2*s+o+h)*c+(-3*t+3*s-2*o-h)*a+o*r+t}function mt(r,e){const t=1-r;return t*t*e}function vt(r,e){return 2*(1-r)*r*e}function dt(r,e){return r*r*e}function W(r,e,t,s){return mt(r,e)+vt(r,t)+dt(r,s)}function Pt(r,e){const t=1-r;return t*t*t*e}function Tt(r,e){const t=1-r;return 3*t*t*r*e}function wt(r,e){return 3*(1-r)*r*r*e}function bt(r,e){return r*r*r*e}function j(r,e,t,s,i){return Pt(r,e)+Tt(r,t)+wt(r,s)+bt(r,i)}class Z extends L{constructor(e=new u,t=new u,s=new u,i=new u){super(),this.v0=e,this.v1=t,this.v2=s,this.v3=i}getPoint(e,t=new u){const{v0:s,v1:i,v2:o,v3:h}=this;return t.set(j(e,s.x,i.x,o.x,h.x),j(e,s.y,i.y,o.y,h.y)),t}transform(e){return this.v0.applyMatrix3(e),this.v1.applyMatrix3(e),this.v2.applyMatrix3(e),this.v3.applyMatrix3(e),this}getMinMax(e=u.MAX,t=u.MIN){const{v0:s,v1:i,v2:o,v3:h}=this;return e.x=Math.min(e.x,s.x,i.x,o.x,h.x),e.y=Math.min(e.y,s.y,i.y,o.y,h.y),t.x=Math.max(t.x,s.x,i.x,o.x,h.x),t.y=Math.max(t.y,s.y,i.y,o.y,h.y),{min:e,max:t}}getCommands(){const{v0:e,v1:t,v2:s,v3:i}=this;return[{type:"M",x:e.x,y:e.y},{type:"C",x1:t.x,y1:t.y,x2:s.x,y2:s.y,x:i.x,y:i.y}]}drawTo(e){const{v1:t,v2:s,v3:i}=this;return e.bezierCurveTo(t.x,t.y,s.x,s.y,i.x,i.y),this}copy(e){return super.copy(e),this.v0.copy(e.v0),this.v1.copy(e.v1),this.v2.copy(e.v2),this.v3.copy(e.v3),this}}const At=new k,J=new k,K=new k,R=new u;class tt extends L{constructor(e=0,t=0,s=1,i=1,o=0,h=Math.PI*2,a=!1,c=0){super(),this.x=e,this.y=t,this.radiusX=s,this.radiusY=i,this.startAngle=o,this.endAngle=h,this.clockwise=a,this.rotation=c}getPoint(e,t=new u){const s=Math.PI*2;let i=this.endAngle-this.startAngle;const o=Math.abs(i)<Number.EPSILON;for(;i<0;)i+=s;for(;i>s;)i-=s;i<Number.EPSILON&&(o?i=0:i=s),this.clockwise&&!o&&(i===s?i=-s:i=i-s);const h=this.startAngle+e*i;let a=this.x+this.radiusX*Math.cos(h),c=this.y+this.radiusY*Math.sin(h);if(this.rotation!==0){const n=Math.cos(this.rotation),l=Math.sin(this.rotation),y=a-this.x,p=c-this.y;a=y*n-p*l+this.x,c=y*l+p*n+this.y}return t.set(a,c)}getDivisions(e=12){return e*2}getCommands(){const{x:e,y:t,radiusX:s,radiusY:i,startAngle:o,endAngle:h,clockwise:a}=this,c=!a,n=e+s*Math.cos(o),l=t+i*Math.sin(o),y=e+s*Math.cos(h),p=t+i*Math.sin(h),x=Math.abs(o-h),g=x>Math.PI?1:0,f=c?0:1,m=e+s*Math.cos(o+(h-o)/2),T=t+i*Math.sin(o+(h-o)/2);return x>=2*Math.PI?[{type:"M",x:n,y:l},{type:"A",rx:s,ry:i,angle:0,largeArcFlag:1,sweepFlag:f,x:m,y:T},{type:"A",rx:s,ry:i,angle:0,largeArcFlag:1,sweepFlag:f,x:n,y:l}]:[{type:"M",x:n,y:l},{type:"A",rx:s,ry:i,angle:0,largeArcFlag:g,sweepFlag:f,x:y,y:p}]}drawTo(e){const{x:t,y:s,radiusX:i,radiusY:o,rotation:h,startAngle:a,endAngle:c,clockwise:n}=this,l=t+i*Math.cos(a),y=s+o*Math.sin(a);return e.moveTo(l,y),e.ellipse(t,s,i,o,h,a,c,!n),this}transform(e){return R.set(this.x,this.y),R.applyMatrix3(e),this.x=R.x,this.y=R.y,kt(e)?Ct(this,e):It(this,e),this}copy(e){return super.copy(e),this.x=e.x,this.y=e.y,this.radiusX=e.radiusX,this.radiusY=e.radiusY,this.startAngle=e.startAngle,this.endAngle=e.endAngle,this.clockwise=e.clockwise,this.rotation=e.rotation,this}}function Ct(r,e){const t=r.radiusX,s=r.radiusY,i=Math.cos(r.rotation),o=Math.sin(r.rotation),h=new u(t*i,t*o),a=new u(-s*o,s*i),c=h.applyMatrix3(e),n=a.applyMatrix3(e),l=At.set(c.x,n.x,0,c.y,n.y,0,0,0,1),y=J.copy(l).invert(),g=K.copy(y).transpose().multiply(y).elements,f=Lt(g[0],g[1],g[4]),m=Math.sqrt(f.rt1),T=Math.sqrt(f.rt2);if(r.radiusX=1/m,r.radiusY=1/T,r.rotation=Math.atan2(f.sn,f.cs),!((r.endAngle-r.startAngle)%(2*Math.PI)<Number.EPSILON)){const P=J.set(m,0,0,0,T,0,0,0,1),A=K.set(f.cs,f.sn,0,-f.sn,f.cs,0,0,0,1),b=P.multiply(A).multiply(l),E=z=>{const{x:Y,y:V}=new u(Math.cos(z),Math.sin(z)).applyMatrix3(b);return Math.atan2(V,Y)};r.startAngle=E(r.startAngle),r.endAngle=E(r.endAngle),et(e)&&(r.clockwise=!r.clockwise)}}function It(r,e){const t=st(e),s=nt(e);r.radiusX*=t,r.radiusY*=s;const i=t>Number.EPSILON?Math.atan2(e.elements[1],e.elements[0]):Math.atan2(-e.elements[3],e.elements[4]);r.rotation+=i,et(e)&&(r.startAngle*=-1,r.endAngle*=-1,r.clockwise=!r.clockwise)}function et(r){const e=r.elements;return e[0]*e[4]-e[1]*e[3]<0}function kt(r){const e=r.elements,t=e[0]*e[3]+e[1]*e[4];if(t===0)return!1;const s=st(r),i=nt(r);return Math.abs(t/(s*i))>Number.EPSILON}function st(r){const e=r.elements;return Math.sqrt(e[0]*e[0]+e[1]*e[1])}function nt(r){const e=r.elements;return Math.sqrt(e[3]*e[3]+e[4]*e[4])}function Lt(r,e,t){let s,i,o,h,a;const c=r+t,n=r-t,l=Math.sqrt(n*n+4*e*e);return c>0?(s=.5*(c+l),a=1/s,i=r*a*t-e*a*e):c<0?i=.5*(c-l):(s=.5*l,i=-.5*l),n>0?o=n+l:o=n-l,Math.abs(o)>2*Math.abs(e)?(a=-2*e/o,h=1/Math.sqrt(1+a*a),o=a*h):Math.abs(e)===0?(o=1,h=0):(a=-.5*o/e,o=1/Math.sqrt(1+a*a),h=a*o),n>0&&(a=o,o=-h,h=a),{rt1:s,rt2:i,cs:o,sn:h}}class q extends L{constructor(e=new u,t=new u){super(),this.v1=e,this.v2=t}getPoint(e,t=new u){return e===1?t.copy(this.v2):(t.copy(this.v2).sub(this.v1),t.multiplyScalar(e).add(this.v1)),t}getPointAt(e,t=new u){return this.getPoint(e,t)}getTangent(e,t=new u){return t.subVectors(this.v2,this.v1).normalize()}getTangentAt(e,t=new u){return this.getTangent(e,t)}transform(e){return this.v1.applyMatrix3(e),this.v2.applyMatrix3(e),this}getDivisions(){return 1}getMinMax(e=u.MAX,t=u.MIN){const{v1:s,v2:i}=this;return e.x=Math.min(e.x,s.x,i.x),e.y=Math.min(e.y,s.y,i.y),t.x=Math.max(t.x,s.x,i.x),t.y=Math.max(t.y,s.y,i.y),{min:e,max:t}}getCommands(){const{v1:e,v2:t}=this;return[{type:"M",x:e.x,y:e.y},{type:"L",x:t.x,y:t.y}]}drawTo(e){const{v2:t}=this;return e.lineTo(t.x,t.y),this}copy(e){return super.copy(e),this.v1.copy(e.v1),this.v2.copy(e.v2),this}}class St extends L{constructor(t,s,i=0,o=1){super();w(this,"curves");w(this,"pointT",0);this.center=t,this.size=s,this.start=i,this.end=o;const{x:h,y:a}=this.center,c=new u(h+.5*this.size,a-.5*this.size),n=new u(h-.5*this.size,a-.5*this.size),l=new u(h,a+.5*this.size),y=new O(c,Math.SQRT1_2*this.size,-.25*Math.PI,.75*Math.PI),p=new O(n,Math.SQRT1_2*this.size,-.75*Math.PI,.25*Math.PI),x=new O(l,.5*Math.SQRT1_2*this.size,.75*Math.PI,1.25*Math.PI),g=new u(h,a+this.size),f=new u(h+this.size,a),m=new u().lerpVectors(f,g,.75),T=new u(h-this.size,a),I=new u().lerpVectors(T,g,.75),P=new q(f,m),A=new q(I,T);this.curves=[y,P,x,A,p]}getPoint(t){return this.getCurrentLine(t).getPoint(this.pointT)}getPointAt(t){return this.getPoint(t)}getCurrentLine(t){let s=(t*(this.end-this.start)+this.start)%1;s<0&&(s+=1),s*=9*Math.PI/8+1.5;let i;const o=.5*Math.PI;return s<o?(i=0,this.pointT=s/o):s<o+.75?(i=1,this.pointT=(s-o)/.75):s<5*Math.PI/8+.75?(i=2,this.pointT=(s-o-.75)/(Math.PI/8)):s<5*Math.PI/8+1.5?(i=3,this.pointT=(s-5*Math.PI/8-.75)/.75):(i=4,this.pointT=(s-5*Math.PI/8-1.5)/o),this.curves[i]}getTangent(t){return this.getCurrentLine(t).getTangent(this.pointT).normalize()}getNormal(t){const s=this.getCurrentLine(t);return new u(s.v2.y-s.v1.y,-(s.v2.x-s.v1.x)).normalize()}getCommands(){return this.curves.flatMap(t=>t.getCommands())}drawTo(t){return this.curves.forEach(s=>s.drawTo(t)),this}}class Nt extends L{constructor(t,s=0,i=0,o=0,h=1){super();w(this,"curves",[]);w(this,"points",[]);this.center=t,this.radius=s,this.num=i,this.start=o,this.end=h;for(let a=0;a<this.num;a++){let c=a*2*Math.PI/this.num;c-=.5*Math.PI;const n=new u(this.radius*Math.cos(c),this.radius*Math.sin(c));n.add(this.center),this.points.push(n)}for(let a=0;a<this.num;a++)this.curves.push(new q(this.points[a],this.points[(a+1)%this.num]))}getPoint(t){return this.getCurrentLine(t),this.currentLine.getPoint(this.pointK)}getPointAt(t){return this.getPoint(t)}getCurrentLine(t){let s=(t*(this.end-this.start)+this.start)%1;s<0&&(s+=1);const i=s*this.num,o=Math.floor(i);return this.pointK=i-o,this.currentLine=this.curves[o],this.currentLine}getTangent(t){return this.getCurrentLine(t).getTangent(0).normalize()}getNormal(t){const s=this.getCurrentLine(t);return new u(s.v2.y-s.v1.y,-(s.v2.x-s.v1.x)).normalize()}getCommands(){return this.curves.flatMap(t=>t.getCommands())}getMinMax(t=u.MAX,s=u.MIN){return this.curves.forEach(i=>i.getMinMax(t,s)),{min:t,max:s}}drawTo(t){return this.curves.forEach(s=>s.drawTo(t)),this}}class it extends L{constructor(e=new u,t=new u,s=new u){super(),this.v0=e,this.v1=t,this.v2=s}getPoint(e,t=new u){const{v0:s,v1:i,v2:o}=this;return t.set(W(e,s.x,i.x,o.x),W(e,s.y,i.y,o.y)),t}transform(e){return this.v0.applyMatrix3(e),this.v1.applyMatrix3(e),this.v2.applyMatrix3(e),this}getMinMax(e=u.MAX,t=u.MIN){const{v0:s,v1:i,v2:o}=this,h=.5*(s.x+i.x),a=.5*(s.y+i.y),c=.5*(s.x+o.x),n=.5*(s.y+o.y);return e.x=Math.min(e.x,s.x,o.x,h,c),e.y=Math.min(e.y,s.y,o.y,a,n),t.x=Math.max(t.x,s.x,o.x,h,c),t.y=Math.max(t.y,s.y,o.y,a,n),{min:e,max:t}}getCommands(){const{v0:e,v1:t,v2:s}=this;return[{type:"M",x:e.x,y:e.y},{type:"Q",x1:t.x,y1:t.y,x:s.x,y:s.y}]}drawTo(e){const{v1:t,v2:s}=this;return e.quadraticCurveTo(t.x,t.y,s.x,s.y),this}copy(e){return super.copy(e),this.v0.copy(e.v0),this.v1.copy(e.v1),this.v2.copy(e.v2),this}}class rt extends L{constructor(t,s,i=1,o=0,h=1){super();w(this,"curves",[]);w(this,"pointT",0);this.center=t,this.rx=s,this.aspectRatio=i,this.start=o,this.end=h;const{x:a,y:c}=this.center,n=this.rx,l=this.rx/this.aspectRatio,y=[new u(a-n,c-l),new u(a+n,c-l),new u(a+n,c+l),new u(a-n,c+l)];for(let p=0;p<4;p++)this.curves.push(new q(y[p],y[(p+1)%4]))}get x(){return this.center.x-this.rx}get y(){return this.center.y-this.rx/this.aspectRatio}get width(){return this.rx*2}get height(){return this.rx/this.aspectRatio*2}getPoint(t){return this.getCurrentLine(t).getPoint(this.pointT)}getPointAt(t){return this.getPoint(t)}getCurrentLine(t){let s=(t*(this.end-this.start)+this.start)%1;s<0&&(s+=1),s*=(1+this.aspectRatio)*2;let i;return s<this.aspectRatio?(i=0,this.pointT=s/this.aspectRatio):s<this.aspectRatio+1?(i=1,this.pointT=(s-this.aspectRatio)/1):s<2*this.aspectRatio+1?(i=2,this.pointT=(s-this.aspectRatio-1)/this.aspectRatio):(i=3,this.pointT=(s-2*this.aspectRatio-1)/1),this.curves[i]}getTangent(t){return this.getCurrentLine(t).getTangent(0).normalize()}getNormal(t){const{v1:s,v2:i}=this.getCurrentLine(t);return new u(i.y-s.y,-(i.x-s.x)).normalize()}getCommands(){return this.curves.flatMap(t=>t.getCommands())}getMinMax(t=u.MAX,s=u.MIN){return this.curves.forEach(i=>i.getMinMax(t,s)),{min:t,max:s}}drawTo(t){return this.curves.forEach(s=>s.drawTo(t)),this}}class ot extends L{constructor(e=[]){super(),this.points=e}getDivisions(e=12){return e*this.points.length}getPoint(e,t=new u){const{points:s}=this,i=(s.length-1)*e,o=Math.floor(i),h=i-o,a=s[o===0?o:o-1],c=s[o],n=s[o>s.length-2?s.length-1:o+1],l=s[o>s.length-3?s.length-1:o+2];return t.set(H(h,a.x,c.x,n.x,l.x),H(h,a.y,c.y,n.y,l.y)),t}copy(e){super.copy(e),this.points=[];for(let t=0,s=e.points.length;t<s;t++)this.points.push(e.points[t].clone());return this}}class X extends L{constructor(t){super();w(this,"curves",[]);w(this,"currentPoint",new u);w(this,"autoClose",!1);w(this,"_cacheLengths",[]);t&&this.setFromPoints(t)}addCurve(t){return this.curves.push(t),this}closePath(){const t=this.curves[0].getPoint(0),s=this.curves[this.curves.length-1].getPoint(1);return t.equals(s)||this.curves.push(new q(s,t)),this}getPoint(t,s=new u){const i=t*this.getLength(),o=this.getCurveLengths();let h=0;for(;h<o.length;){if(o[h]>=i){const a=o[h]-i,c=this.curves[h],n=c.getLength();return c.getPointAt(n===0?0:1-a/n,s)}h++}return s}getLength(){const t=this.getCurveLengths();return t[t.length-1]}updateArcLengths(){super.updateArcLengths(),this._cacheLengths=[],this.getCurveLengths()}getCurveLengths(){if(this._cacheLengths.length===this.curves.length)return this._cacheLengths;const t=[];let s=0;for(let i=0,o=this.curves.length;i<o;i++)s+=this.curves[i].getLength(),t.push(s);return this._cacheLengths=t,t}getSpacedPoints(t=40){const s=[];for(let i=0;i<=t;i++)s.push(this.getPoint(i/t));return this.autoClose&&s.push(s[0]),s}getPoints(t=12){const s=[];let i;for(let o=0,h=this.curves;o<h.length;o++){const a=h[o],c=a.getPoints(a.getDivisions(t));for(let n=0;n<c.length;n++){const l=c[n];i&&i.equals(l)||(s.push(l),i=l)}}return this.autoClose&&s.length>1&&!s[s.length-1].equals(s[0])&&s.push(s[0]),s}setFromPoints(t){this.moveTo(t[0].x,t[0].y);for(let s=1,i=t.length;s<i;s++)this.lineTo(t[s].x,t[s].y);return this}bezierCurveTo(t,s,i,o,h,a){return this.curves.push(new Z(this.currentPoint.clone(),new u(t,s),new u(i,o),new u(h,a))),this.currentPoint.set(h,a),this}lineTo(t,s){return this.curves.push(new q(this.currentPoint.clone(),new u(t,s))),this.currentPoint.set(t,s),this}moveTo(t,s){return this.currentPoint.set(t,s),this}quadraticCurveTo(t,s,i,o){return this.curves.push(new it(this.currentPoint.clone(),new u(t,s),new u(i,o))),this.currentPoint.set(i,o),this}rect(t,s,i,o){return this.curves.push(new rt(new u(t+i/2,s+o/2),i/2,i/o)),this.currentPoint.set(t,s),this}splineThru(t){const s=[this.currentPoint.clone()].concat(t);return this.curves.push(new ot(s)),this.currentPoint.copy(t[t.length-1]),this}arc(t,s,i,o,h,a=!1){const c=this.currentPoint;return this.absarc(t+c.x,s+c.y,i,o,h,a),this}absarc(t,s,i,o,h,a=!1){return this.absellipse(t,s,i,i,o,h,a),this}ellipse(t,s,i,o,h,a,c=!1,n=0){const l=this.currentPoint;return this.absellipse(t+l.x,s+l.y,i,o,h,a,c,n),this}absellipse(t,s,i,o,h,a,c=!1,n=0){const l=new tt(t,s,i,o,h,a,c,n);if(this.curves.length>0){const y=l.getPoint(0);y.equals(this.currentPoint)||this.lineTo(y.x,y.y)}return this.curves.push(l),this.currentPoint.copy(l.getPoint(1)),this}getCommands(){return this.curves.flatMap(t=>t.getCommands())}getMinMax(t=u.MAX,s=u.MIN){return this.curves.forEach(i=>i.getMinMax(t,s)),{min:t,max:s}}drawTo(t){var i;const s=(i=this.curves[0])==null?void 0:i.getPoint(0);return s&&t.moveTo(s.x,s.y),this.curves.forEach(o=>o.drawTo(t)),this.autoClose&&t.closePath(),this}copy(t){super.copy(t),this.curves=[];for(let s=0,i=t.curves.length;s<i;s++)this.curves.push(t.curves[s].clone());return this.autoClose=t.autoClose,this.currentPoint.copy(t.currentPoint),this}}class C{constructor(e){w(this,"currentPath",new X);w(this,"paths",[this.currentPath]);w(this,"userData");e&&(e instanceof C?this.addPath(e):Array.isArray(e)?this.addCommands(e):this.addData(e))}addPath(e){return e instanceof C?this.paths.push(...e.paths.map(t=>t.clone())):this.paths.push(e),this}closePath(){return this.currentPath.closePath(),this}moveTo(e,t){const{currentPoint:s,curves:i}=this.currentPath;return(s.x!==e||s.y!==t)&&(i.length?(this.currentPath=new X().moveTo(e,t),this.paths.push(this.currentPath)):this.currentPath.moveTo(e,t)),this}lineTo(e,t){return this.currentPath.lineTo(e,t),this}bezierCurveTo(e,t,s,i,o,h){return this.currentPath.bezierCurveTo(e,t,s,i,o,h),this}quadraticCurveTo(e,t,s,i){return this.currentPath.quadraticCurveTo(e,t,s,i),this}arc(e,t,s,i,o,h){return this.currentPath.absarc(e,t,s,i,o,!h),this}arcTo(e,t,s,i,o){const h=this.currentPath.currentPoint,a=h.x,c=h.y,n=e-a,l=t-c,y=s-e,p=i-t,x=Math.sqrt(n*n+l*l),g=Math.sqrt(y*y+p*p);if(x<o||g<o)return this.lineTo(s,i),this;const f={x:n/x,y:l/x},m={x:y/g,y:p/g},T=e-f.y*o,I=t+f.x*o,P=Math.atan2(f.y,f.x);let b=Math.atan2(m.y,m.x)-P;return b>Math.PI?b-=2*Math.PI:b<-Math.PI&&(b+=2*Math.PI),this.arc(T,I,o,P,P+b,!1),this.lineTo(s,i),this}ellipse(e,t,s,i,o,h,a,c){return this.currentPath.absellipse(e,t,s,i,h,a,!c,o),this}rect(e,t,s,i){return this.currentPath.rect(e,t,s,i),this}addCommands(e){return gt(e,this),this}addData(e){return this.addCommands(Mt(e)),this}splineThru(e){return this.currentPath.splineThru(e),this}forEachCurve(e){return this.paths.forEach(t=>t.curves.forEach(s=>e(s))),this}transform(e){return this.forEachCurve(t=>t.transform(e)),this}getMinMax(e=u.MAX,t=u.MIN){return this.forEachCurve(s=>s.getMinMax(e,t)),{min:e,max:t}}getBoundingBox(){const{min:e,max:t}=this.getMinMax();return new S(e.x,e.y,t.x-e.x,t.y-e.y)}getCommands(){return this.paths.flatMap(e=>e.curves.flatMap(t=>t.getCommands()))}getData(){return this.paths.map(e=>e.getData()).join(" ")}getSvgString(){const{x:e,y:t,width:s,height:i}=this.getBoundingBox();return`<svg viewBox="${e} ${t} ${s} ${i}" xmlns="http://www.w3.org/2000/svg"><path fill="none" stroke="currentColor" d="${this.getData()}"></path></svg>`}getSvgDataUri(){return`data:image/svg+xml;base64,${btoa(this.getSvgString())}`}drawTo(e){this.paths.forEach(t=>{t.drawTo(e)})}strokeTo(e){this.drawTo(e),e.stroke()}fillTo(e){this.drawTo(e),e.fill()}copy(e){return e.currentPath=this.currentPath.clone(),e.paths=this.paths.map(t=>t.clone()),e.userData=this.userData,this}toCanvas(e=!0){const t=document.createElement("canvas"),{left:s,top:i,width:o,height:h}=this.getBoundingBox();t.width=o,t.height=h;const a=t.getContext("2d");return a&&(a.translate(-s,-i),e?this.fillTo(a):this.strokeTo(a)),t}clone(){return new C().copy(this)}}const _="px",at=90,ht=["mm","cm","in","pt","pc","px"],U={mm:{mm:1,cm:.1,in:1/25.4,pt:72/25.4,pc:6/25.4,px:-1},cm:{mm:10,cm:1,in:1/2.54,pt:72/2.54,pc:6/2.54,px:-1},in:{mm:25.4,cm:2.54,in:1,pt:72,pc:6,px:-1},pt:{mm:25.4/72,cm:2.54/72,in:1/72,pt:1,pc:6/72,px:-1},pc:{mm:25.4/6,cm:2.54/6,in:1/6,pt:72/6,pc:1,px:-1},px:{px:1}};function v(r){let e="px";if(typeof r=="string"||r instanceof String)for(let s=0,i=ht.length;s<i;s++){const o=ht[s];if(r.endsWith(o)){e=o,r=r.substring(0,r.length-o.length);break}}let t;return e==="px"&&_!=="px"?t=U.in[_]/at:(t=U[e][_],t<0&&(t=U[e].in*at)),t*Number.parseFloat(r)}const $t=new k,F=new k,ct=new k,lt=new k;function Et(r,e,t){if(!(r.hasAttribute("transform")||r.nodeName==="use"&&(r.hasAttribute("x")||r.hasAttribute("y"))))return null;const s=zt(r);return t.length>0&&s.premultiply(t[t.length-1]),e.copy(s),t.push(s),s}function zt(r){const e=new k,t=$t;if(r.nodeName==="use"&&(r.hasAttribute("x")||r.hasAttribute("y"))&&e.translate(v(r.getAttribute("x")),v(r.getAttribute("y"))),r.hasAttribute("transform")){const s=r.getAttribute("transform").split(")");for(let i=s.length-1;i>=0;i--){const o=s[i].trim();if(o==="")continue;const h=o.indexOf("("),a=o.length;if(h>0&&h<a){const c=o.slice(0,h),n=N(o.slice(h+1));switch(t.identity(),c){case"translate":if(n.length>=1){const l=n[0];let y=0;n.length>=2&&(y=n[1]),t.translate(l,y)}break;case"rotate":if(n.length>=1){let l=0,y=0,p=0;l=n[0]*Math.PI/180,n.length>=3&&(y=n[1],p=n[2]),F.makeTranslation(-y,-p),ct.makeRotation(l),lt.multiplyMatrices(ct,F),F.makeTranslation(y,p),t.multiplyMatrices(F,lt)}break;case"scale":n.length>=1&&t.scale(n[0],n[1]??n[0]);break;case"skewX":n.length===1&&t.set(1,Math.tan(n[0]*Math.PI/180),0,0,1,0,0,0,1);break;case"skewY":n.length===1&&t.set(1,0,0,Math.tan(n[0]*Math.PI/180),1,0,0,0,1);break;case"matrix":n.length===6&&t.set(n[0],n[2],n[4],n[1],n[3],n[5],0,0,1);break}}e.premultiply(t)}}return e}function qt(r){return new C().addPath(new X().absarc(v(r.getAttribute("cx")||0),v(r.getAttribute("cy")||0),v(r.getAttribute("r")||0),0,Math.PI*2))}function Dt(r,e){if(!(!r.sheet||!r.sheet.cssRules||!r.sheet.cssRules.length))for(let t=0;t<r.sheet.cssRules.length;t++){const s=r.sheet.cssRules[t];if(s.type!==1)continue;const i=s.selectorText.split(/,/g).filter(Boolean).map(o=>o.trim());for(let o=0;o<i.length;o++){const h=Object.fromEntries(Object.entries(s.style).filter(([,a])=>a!==""));e[i[o]]=Object.assign(e[i[o]]||{},h)}}}function Xt(r){return new C().addPath(new X().absellipse(v(r.getAttribute("cx")||0),v(r.getAttribute("cy")||0),v(r.getAttribute("rx")||0),v(r.getAttribute("ry")||0),0,Math.PI*2))}function Ot(r){return new C().moveTo(v(r.getAttribute("x1")||0),v(r.getAttribute("y1")||0)).lineTo(v(r.getAttribute("x2")||0),v(r.getAttribute("y2")||0))}function Rt(r){const e=new C,t=r.getAttribute("d");return!t||t==="none"?null:(e.addData(t),e)}const Ft=/([+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)(?:,|\s)([+-]?\d*\.?\d+(?:e[+-]?\d+)?)/g;function Yt(r){var s;const e=new C;let t=0;return(s=r.getAttribute("points"))==null||s.replace(Ft,(i,o,h)=>{const a=v(o),c=v(h);return t===0?e.moveTo(a,c):e.lineTo(a,c),t++,i}),e.currentPath.autoClose=!0,e}const Gt=/([+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)(?:,|\s)([+-]?\d*\.?\d+(?:e[+-]?\d+)?)/g;function _t(r){var s;const e=new C;let t=0;return(s=r.getAttribute("points"))==null||s.replace(Gt,(i,o,h)=>{const a=v(o),c=v(h);return t===0?e.moveTo(a,c):e.lineTo(a,c),t++,i}),e.currentPath.autoClose=!1,e}function Ut(r){const e=v(r.getAttribute("x")||0),t=v(r.getAttribute("y")||0),s=v(r.getAttribute("rx")||r.getAttribute("ry")||0),i=v(r.getAttribute("ry")||r.getAttribute("rx")||0),o=v(r.getAttribute("width")),h=v(r.getAttribute("height")),a=1-.551915024494,c=new C;return c.moveTo(e+s,t),c.lineTo(e+o-s,t),(s!==0||i!==0)&&c.bezierCurveTo(e+o-s*a,t,e+o,t+i*a,e+o,t+i),c.lineTo(e+o,t+h-i),(s!==0||i!==0)&&c.bezierCurveTo(e+o,t+h-i*a,e+o-s*a,t+h,e+o-s,t+h),c.lineTo(e+s,t+h),(s!==0||i!==0)&&c.bezierCurveTo(e+s*a,t+h,e,t+h-i*a,e,t+h-i),c.lineTo(e,t+i),(s!==0||i!==0)&&c.bezierCurveTo(e,t+i*a,e+s*a,t,e+s,t),c}function $(r,e,t){e=Object.assign({},e);let s={};if(r.hasAttribute("class")){const a=r.getAttribute("class").split(/\s/).filter(Boolean).map(c=>c.trim());for(let c=0;c<a.length;c++)s=Object.assign(s,t[`.${a[c]}`])}r.hasAttribute("id")&&(s=Object.assign(s,t[`#${r.getAttribute("id")}`]));function i(a,c,n){n===void 0&&(n=function(y){return y.startsWith("url")&&console.warn("url access in attributes is not implemented."),y}),r.hasAttribute(a)&&(e[c]=n(r.getAttribute(a))),s[a]&&(e[c]=n(s[a])),r.style&&r.style[a]!==""&&(e[c]=n(r.style[a]))}function o(a){return Math.max(0,Math.min(1,v(a)))}function h(a){return Math.max(0,v(a))}return i("fill","fill"),i("fill-opacity","fillOpacity",o),i("fill-rule","fillRule"),i("opacity","opacity",o),i("stroke","stroke"),i("stroke-dashoffset","strokeDashoffset"),i("stroke-dasharray","strokeDasharray"),i("stroke-linecap","strokeLineCap"),i("stroke-linejoin","strokeLineJoin"),i("stroke-miterlimit","strokeMiterLimit",h),i("stroke-opacity","strokeOpacity",o),i("stroke-width","strokeWidth",h),i("visibility","visibility"),e}function Q(r,e,t=[]){var l;if(r.nodeType!==1)return t;let s=!1,i=null;const o={};switch(r.nodeName){case"svg":e=$(r,e,o);break;case"style":Dt(r,o);break;case"g":e=$(r,e,o);break;case"path":e=$(r,e,o),r.hasAttribute("d")&&(i=Rt(r));break;case"rect":e=$(r,e,o),i=Ut(r);break;case"polygon":e=$(r,e,o),i=Yt(r);break;case"polyline":e=$(r,e,o),i=_t(r);break;case"circle":e=$(r,e,o),i=qt(r);break;case"ellipse":e=$(r,e,o),i=Xt(r);break;case"line":e=$(r,e,o),i=Ot(r);break;case"defs":s=!0;break;case"use":{e=$(r,e,o);const p=(r.getAttributeNS("http://www.w3.org/1999/xlink","href")||"").substring(1),x=(l=r.viewportElement)==null?void 0:l.getElementById(p);x?Q(x,e,t):console.warn(`'use node' references non-existent node id: ${p}`);break}default:console.warn(r);break}const h=new k,a=[],c=Et(r,h,a);i&&(i.transform(h),t.push(i),i.userData={node:r,style:e});const n=r.childNodes;for(let y=0,p=n.length;y<p;y++){const x=n[y];s&&x.nodeName!=="style"&&x.nodeName!=="defs"||Q(x,e,t)}return c&&(a.pop(),a.length>0?h.copy(a[a.length-1]):h.identity()),t}function Qt(r){let e;return typeof r=="string"?e=new DOMParser().parseFromString(r,"image/svg+xml").documentElement:e=r,Q(e,{fill:"#000",fillOpacity:1,strokeOpacity:1,strokeWidth:1,strokeLineJoin:"miter",strokeLineCap:"butt",strokeMiterLimit:4})}M.BoundingBox=S,M.CircleCurve=O,M.CubicBezierCurve=Z,M.Curve=L,M.CurvePath=X,M.EllipseCurve=tt,M.HeartCurve=St,M.LineCurve=q,M.Matrix3=k,M.Path2D=C,M.PloygonCurve=Nt,M.Point2D=u,M.QuadraticBezierCurve=it,M.RectangularCurve=rt,M.SplineCurve=ot,M.parseSvg=Qt,Object.defineProperty(M,Symbol.toStringTag,{value:"Module"})});
1
+ (function(M,l){typeof exports=="object"&&typeof module<"u"?l(exports):typeof define=="function"&&define.amd?define(["exports"],l):(M=typeof globalThis<"u"?globalThis:M||self,l(M.modernPath2d={}))})(this,function(M){"use strict";var Vt=Object.defineProperty;var Bt=(M,l,S)=>l in M?Vt(M,l,{enumerable:!0,configurable:!0,writable:!0,value:S}):M[l]=S;var w=(M,l,S)=>Bt(M,typeof l!="symbol"?l+"":l,S);class l{constructor(e=0,t=0){this.x=e,this.y=t}static get MAX(){return new l(1/0,1/0)}static get MIN(){return new l(-1/0,-1/0)}set(e,t){return this.x=e,this.y=t,this}add(e){return this.x+=e.x,this.y+=e.y,this}sub(e){return this.x-=e.x,this.y-=e.y,this}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const t=this.x-e.x,s=this.y-e.y;return t*t+s*s}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}multiplyScalar(e){return this.x*=e,this.y*=e,this}divideScalar(e){return this.multiplyScalar(1/e)}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this}normalize(){return this.divideScalar(this.length()||1)}lerpVectors(e,t,s){return this.x=e.x+(t.x-e.x)*s,this.y=e.y+(t.y-e.y)*s,this}equals(e){return this.x===e.x&&this.y===e.y}applyMatrix3(e){const t=this.x,s=this.y,n=e.elements;return this.x=n[0]*t+n[3]*s+n[6],this.y=n[1]*t+n[4]*s+n[7],this}copy(e){return this.x=e.x,this.y=e.y,this}clone(){return new l(this.x,this.y)}}class S{constructor(e=0,t=0,s=0,n=0){this.left=e,this.top=t,this.width=s,this.height=n}get x(){return this.left}set x(e){this.left=e}get y(){return this.top}set y(e){this.top=e}get right(){return this.left+this.width}get bottom(){return this.top+this.height}static from(...e){const t=e[0],s=e.slice(1).reduce((n,o)=>(n.left=Math.min(n.left,o.left),n.top=Math.min(n.top,o.top),n.right=Math.max(n.right,o.right),n.bottom=Math.max(n.bottom,o.bottom),n),{left:(t==null?void 0:t.left)??0,top:(t==null?void 0:t.top)??0,right:(t==null?void 0:t.right)??0,bottom:(t==null?void 0:t.bottom)??0});return new S(s.left,s.top,s.right-s.left,s.bottom-s.top)}translate(e,t){return this.left+=e,this.top+=t,this}getCenterPoint(){return new l((this.left+this.right)/2,(this.top+this.bottom)/2)}clone(){return new S(this.left,this.top,this.width,this.height)}toArray(){return[this.left,this.top,this.width,this.height]}}class I{constructor(e=1,t=0,s=0,n=0,o=1,a=0,h=0,c=0,i=1){w(this,"elements",[]);this.set(e,t,s,n,o,a,h,c,i)}set(e,t,s,n,o,a,h,c,i){const u=this.elements;return u[0]=e,u[1]=n,u[2]=h,u[3]=t,u[4]=o,u[5]=c,u[6]=s,u[7]=a,u[8]=i,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(e){const t=this.elements,s=e.elements;return t[0]=s[0],t[1]=s[1],t[2]=s[2],t[3]=s[3],t[4]=s[4],t[5]=s[5],t[6]=s[6],t[7]=s[7],t[8]=s[8],this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){const s=e.elements,n=t.elements,o=this.elements,a=s[0],h=s[3],c=s[6],i=s[1],u=s[4],y=s[7],f=s[2],x=s[5],g=s[8],p=n[0],m=n[3],T=n[6],C=n[1],P=n[4],A=n[7],b=n[2],$=n[5],z=n[8];return o[0]=a*p+h*C+c*b,o[3]=a*m+h*P+c*$,o[6]=a*T+h*A+c*z,o[1]=i*p+u*C+y*b,o[4]=i*m+u*P+y*$,o[7]=i*T+u*A+y*z,o[2]=f*p+x*C+g*b,o[5]=f*m+x*P+g*$,o[8]=f*T+x*A+g*z,this}invert(){const e=this.elements,t=e[0],s=e[1],n=e[2],o=e[3],a=e[4],h=e[5],c=e[6],i=e[7],u=e[8],y=u*a-h*i,f=h*c-u*o,x=i*o-a*c,g=t*y+s*f+n*x;if(g===0)return this.set(0,0,0,0,0,0,0,0,0);const p=1/g;return e[0]=y*p,e[1]=(n*i-u*s)*p,e[2]=(h*s-n*a)*p,e[3]=f*p,e[4]=(u*t-n*c)*p,e[5]=(n*o-h*t)*p,e[6]=x*p,e[7]=(s*c-i*t)*p,e[8]=(a*t-s*o)*p,this}transpose(){let e;const t=this.elements;return e=t[1],t[1]=t[3],t[3]=e,e=t[2],t[2]=t[6],t[6]=e,e=t[5],t[5]=t[7],t[7]=e,this}scale(e,t){return this.premultiply(G.makeScale(e,t)),this}rotate(e){return this.premultiply(G.makeRotation(-e)),this}translate(e,t){return this.premultiply(G.makeTranslation(e,t)),this}makeTranslation(e,t){return this.set(1,0,e,0,1,t,0,0,1),this}makeRotation(e){const t=Math.cos(e),s=Math.sin(e);return this.set(t,-s,0,s,t,0,0,0,1),this}makeScale(e,t){return this.set(e,0,0,0,t,0,0,0,1),this}fromArray(e,t=0){for(let s=0;s<9;s++)this.elements[s]=e[s+t];return this}clone(){return new this.constructor().fromArray(this.elements)}}const G=new I;function B(r,e,t,s){const n=r*t+e*s,o=Math.sqrt(r*r+e*e)*Math.sqrt(t*t+s*s);let a=Math.acos(Math.max(-1,Math.min(1,n/o)));return r*s-e*t<0&&(a=-a),a}function yt(r,e,t,s,n,o,a,h){if(e===0||t===0){r.lineTo(h.x,h.y);return}s=s*Math.PI/180,e=Math.abs(e),t=Math.abs(t);const c=(a.x-h.x)/2,i=(a.y-h.y)/2,u=Math.cos(s)*c+Math.sin(s)*i,y=-Math.sin(s)*c+Math.cos(s)*i;let f=e*e,x=t*t;const g=u*u,p=y*y,m=g/f+p/x;if(m>1){const lt=Math.sqrt(m);e=lt*e,t=lt*t,f=e*e,x=t*t}const T=f*p+x*g,C=(f*x-T)/T;let P=Math.sqrt(Math.max(0,C));n===o&&(P=-P);const A=P*e*y/t,b=-P*t*u/e,$=Math.cos(s)*A-Math.sin(s)*b+(a.x+h.x)/2,z=Math.sin(s)*A+Math.cos(s)*b+(a.y+h.y)/2,Y=B(1,0,(u-A)/e,(y-b)/t),V=B((u-A)/e,(y-b)/t,(-u-A)/e,(-y-b)/t)%(Math.PI*2);r.currentPath.absellipse($,z,e,t,Y,Y+V,o===0,s)}function D(r,e){return r-(e-r)}function gt(r,e){const t=new l,s=new l,n=new l;let o=!0,a=!1;for(let h=0,c=r.length;h<c;h++){const i=r[h];if(o&&(a=!0,o=!1),i.type==="m"||i.type==="M")i.type==="m"?(t.x+=i.x,t.y+=i.y):(t.x=i.x,t.y=i.y),s.x=t.x,s.y=t.y,e.moveTo(t.x,t.y),n.copy(t);else if(i.type==="h"||i.type==="H")i.type==="h"?t.x+=i.x:t.x=i.x,s.x=t.x,s.y=t.y,e.lineTo(t.x,t.y),a&&n.copy(t);else if(i.type==="v"||i.type==="V")i.type==="v"?t.y+=i.y:t.y=i.y,s.x=t.x,s.y=t.y,e.lineTo(t.x,t.y),a&&n.copy(t);else if(i.type==="l"||i.type==="L")i.type==="l"?(t.x+=i.x,t.y+=i.y):(t.x=i.x,t.y=i.y),s.x=t.x,s.y=t.y,e.lineTo(t.x,t.y),a&&n.copy(t);else if(i.type==="c"||i.type==="C")i.type==="c"?(e.bezierCurveTo(t.x+i.x1,t.y+i.y1,t.x+i.x2,t.y+i.y2,t.x+i.x,t.y+i.y),s.x=t.x+i.x2,s.y=t.y+i.y2,t.x+=i.x,t.y+=i.y):(e.bezierCurveTo(i.x1,i.y1,i.x2,i.y2,i.x,i.y),s.x=i.x2,s.y=i.y2,t.x=i.x,t.y=i.y),a&&n.copy(t);else if(i.type==="s"||i.type==="S")i.type==="s"?(e.bezierCurveTo(D(t.x,s.x),D(t.y,s.y),t.x+i.x2,t.y+i.y2,t.x+i.x,t.y+i.y),s.x=t.x+i.x2,s.y=t.y+i.y2,t.x+=i.x,t.y+=i.y):(e.bezierCurveTo(D(t.x,s.x),D(t.y,s.y),i.x2,i.y2,i.x,i.y),s.x=i.x2,s.y=i.y2,t.x=i.x,t.y=i.y),a&&n.copy(t);else if(i.type==="q"||i.type==="Q")i.type==="q"?(e.quadraticCurveTo(t.x+i.x1,t.y+i.y1,t.x+i.x,t.y+i.y),s.x=t.x+i.x1,s.y=t.y+i.y1,t.x+=i.x,t.y+=i.y):(e.quadraticCurveTo(i.x1,i.y1,i.x,i.y),s.x=i.x1,s.y=i.y1,t.x=i.x,t.y=i.y),a&&n.copy(t);else if(i.type==="t"||i.type==="T"){const u=D(t.x,s.x),y=D(t.y,s.y);s.x=u,s.y=y,i.type==="t"?(e.quadraticCurveTo(u,y,t.x+i.x,t.y+i.y),t.x+=i.x,t.y+=i.y):(e.quadraticCurveTo(u,y,i.x,i.y),t.x=i.x,t.y=i.y),a&&n.copy(t)}else if(i.type==="a"||i.type==="A"){if(i.type==="a"){if(i.x===0&&i.y===0)continue;t.x+=i.x,t.y+=i.y}else{if(i.x===t.x&&i.y===t.y)continue;t.x=i.x,t.y=i.y}const u=t.clone();s.x=t.x,s.y=t.y,yt(e,i.rx,i.ry,i.angle,i.largeArcFlag,i.sweepFlag,u,t),a&&n.copy(t)}else i.type==="z"||i.type==="Z"?(e.currentPath.autoClose=!0,e.currentPath.curves.length>0&&(t.copy(n),e.currentPath.currentPoint.copy(t),o=!0)):console.warn("Unsupported commands",i);a=!1}}const d={SEPARATOR:/[ \t\r\n,.\-+]/,WHITESPACE:/[ \t\r\n]/,DIGIT:/\d/,SIGN:/[-+]/,POINT:/\./,COMMA:/,/,EXP:/e/i,FLAGS:/[01]/};function N(r,e,t=0){let h=0,c=!0,i="",u="";const y=[];function f(m,T,C){const P=new SyntaxError(`Unexpected character "${m}" at index ${T}.`);throw P.partial=C,P}function x(){i!==""&&(u===""?y.push(Number(i)):y.push(Number(i)*10**Number(u))),i="",u=""}let g;const p=r.length;for(let m=0;m<p;m++){if(g=r[m],Array.isArray(e)&&e.includes(y.length%t)&&d.FLAGS.test(g)){h=1,i=g,x();continue}if(h===0){if(d.WHITESPACE.test(g))continue;if(d.DIGIT.test(g)||d.SIGN.test(g)){h=1,i=g;continue}if(d.POINT.test(g)){h=2,i=g;continue}d.COMMA.test(g)&&(c&&f(g,m,y),c=!0)}if(h===1){if(d.DIGIT.test(g)){i+=g;continue}if(d.POINT.test(g)){i+=g,h=2;continue}if(d.EXP.test(g)){h=3;continue}d.SIGN.test(g)&&i.length===1&&d.SIGN.test(i[0])&&f(g,m,y)}if(h===2){if(d.DIGIT.test(g)){i+=g;continue}if(d.EXP.test(g)){h=3;continue}d.POINT.test(g)&&i[i.length-1]==="."&&f(g,m,y)}if(h===3){if(d.DIGIT.test(g)){u+=g;continue}if(d.SIGN.test(g)){if(u===""){u+=g;continue}u.length===1&&d.SIGN.test(u)&&f(g,m,y)}}d.WHITESPACE.test(g)?(x(),h=0,c=!1):d.COMMA.test(g)?(x(),h=0,c=!0):d.SIGN.test(g)?(x(),h=1,i=g):d.POINT.test(g)?(x(),h=2,i=g):f(g,m,y)}return x(),y}function ft(r){switch(r.type){case"m":case"M":return`${r.type} ${r.x} ${r.y}`;case"h":case"H":return`${r.type} ${r.x}`;case"v":case"V":return`${r.type} ${r.y}`;case"l":case"L":return`${r.type} ${r.x} ${r.y}`;case"c":case"C":return`${r.type} ${r.x1} ${r.y1} ${r.x2} ${r.y2} ${r.x} ${r.y}`;case"s":case"S":return`${r.type} ${r.x2} ${r.y2} ${r.x} ${r.y}`;case"q":case"Q":return`${r.type} ${r.x1} ${r.y1} ${r.x} ${r.y}`;case"t":case"T":return`${r.type} ${r.x} ${r.y}`;case"a":case"A":return`${r.type} ${r.rx} ${r.ry} ${r.angle} ${r.largeArcFlag} ${r.sweepFlag} ${r.x} ${r.y}`;case"z":case"Z":return r.type;default:return""}}function pt(r){let e="";for(let t=0,s=r.length;t<s;t++)e+=`${ft(r[t])} `;return e}const xt=/[a-df-z][^a-df-z]*/gi;function Mt(r){const e=[],t=r.match(xt);if(!t)return e;for(let s=0,n=t.length;s<n;s++){const o=t[s],a=o.charAt(0),h=o.slice(1).trim();let c;switch(a){case"m":case"M":c=N(h);for(let i=0,u=c.length;i<u;i+=2)i===0?e.push({type:a,x:c[i],y:c[i+1]}):e.push({type:a==="m"?"l":"L",x:c[i],y:c[i+1]});break;case"h":case"H":c=N(h);for(let i=0,u=c.length;i<u;i++)e.push({type:a,x:c[i]});break;case"v":case"V":c=N(h);for(let i=0,u=c.length;i<u;i++)e.push({type:a,y:c[i]});break;case"l":case"L":c=N(h);for(let i=0,u=c.length;i<u;i+=2)e.push({type:a,x:c[i],y:c[i+1]});break;case"c":case"C":c=N(h);for(let i=0,u=c.length;i<u;i+=6)e.push({type:a,x1:c[i],y1:c[i+1],x2:c[i+2],y2:c[i+3],x:c[i+4],y:c[i+5]});break;case"s":case"S":c=N(h);for(let i=0,u=c.length;i<u;i+=4)e.push({type:a,x2:c[i],y2:c[i+1],x:c[i+2],y:c[i+3]});break;case"q":case"Q":c=N(h);for(let i=0,u=c.length;i<u;i+=4)e.push({type:a,x1:c[i],y1:c[i+1],x:c[i+2],y:c[i+3]});break;case"t":case"T":c=N(h);for(let i=0,u=c.length;i<u;i+=2)e.push({type:a,x:c[i],y:c[i+1]});break;case"a":case"A":c=N(h,[3,4],7);for(let i=0,u=c.length;i<u;i+=7)e.push({type:a,rx:c[i],ry:c[i+1],angle:c[i+2],largeArcFlag:c[i+3],sweepFlag:c[i+4],x:c[i+5],y:c[i+6]});break;case"z":case"Z":e.push({type:a});break;default:console.warn(o)}}return e}class k{constructor(){w(this,"arcLengthDivisions",200);w(this,"_cacheArcLengths");w(this,"_needsUpdate",!1)}getPointAt(e,t=new l){return this.getPoint(this.getUtoTmapping(e),t)}getPoints(e=5){const t=[];for(let s=0;s<=e;s++)t.push(this.getPoint(s/e));return t}getSpacedPoints(e=5){const t=[];for(let s=0;s<=e;s++)t.push(this.getPointAt(s/e));return t}getLength(){const e=this.getLengths();return e[e.length-1]}getLengths(e=this.arcLengthDivisions){if(this._cacheArcLengths&&this._cacheArcLengths.length===e+1&&!this._needsUpdate)return this._cacheArcLengths;this._needsUpdate=!1;const t=[];let s,n=this.getPoint(0),o=0;t.push(0);for(let a=1;a<=e;a++)s=this.getPoint(a/e),o+=s.distanceTo(n),t.push(o),n=s;return this._cacheArcLengths=t,t}updateArcLengths(){this._needsUpdate=!0,this.getLengths()}getUtoTmapping(e,t){const s=this.getLengths();let n=0;const o=s.length;let a;t?a=t:a=e*s[o-1];let h=0,c=o-1,i;for(;h<=c;)if(n=Math.floor(h+(c-h)/2),i=s[n]-a,i<0)h=n+1;else if(i>0)c=n-1;else{c=n;break}if(n=c,s[n]===a)return n/(o-1);const u=s[n],f=s[n+1]-u,x=(a-u)/f;return(n+x)/(o-1)}getTangent(e,t=new l){let n=e-1e-4,o=e+1e-4;return n<0&&(n=0),o>1&&(o=1),t.copy(this.getPoint(o)).sub(this.getPoint(n)).normalize()}getTangentAt(e,t=new l){return this.getTangent(this.getUtoTmapping(e),t)}transform(e){return this}getDivisions(e){return e}getMinMax(e=l.MAX,t=l.MIN){return{min:e,max:t}}getCommands(){return[]}getData(){return pt(this.getCommands())}drawTo(e){return this}copy(e){return this.arcLengthDivisions=e.arcLengthDivisions,this}clone(){return new this.constructor().copy(this)}}class O extends k{constructor(e,t,s=0,n=Math.PI*2){super(),this.center=e,this.radius=t,this.start=s,this.end=n}getPoint(e){const{radius:t,center:s}=this;return s.clone().add(this.getNormal(e).clone().multiplyScalar(t))}getTangent(e){const{x:t,y:s}=this.getNormal(e);return new l(-s,t)}getNormal(e){const{start:t,end:s}=this,n=e*(s-t)+t-.5*Math.PI;return new l(Math.cos(n),Math.sin(n))}getMinMax(e=l.MAX,t=l.MIN){return e.x=Math.min(e.x,this.center.x-this.radius),e.y=Math.min(e.y,this.center.y-this.radius),t.x=Math.max(t.x,this.center.x+this.radius),t.y=Math.max(t.y,this.center.y+this.radius),{min:e,max:t}}}function H(r,e,t,s,n){const o=(s-e)*.5,a=(n-t)*.5,h=r*r,c=r*h;return(2*t-2*s+o+a)*c+(-3*t+3*s-2*o-a)*h+o*r+t}function mt(r,e){const t=1-r;return t*t*e}function vt(r,e){return 2*(1-r)*r*e}function dt(r,e){return r*r*e}function W(r,e,t,s){return mt(r,e)+vt(r,t)+dt(r,s)}function Pt(r,e){const t=1-r;return t*t*t*e}function Tt(r,e){const t=1-r;return 3*t*t*r*e}function wt(r,e){return 3*(1-r)*r*r*e}function bt(r,e){return r*r*r*e}function j(r,e,t,s,n){return Pt(r,e)+Tt(r,t)+wt(r,s)+bt(r,n)}class Z extends k{constructor(e=new l,t=new l,s=new l,n=new l){super(),this.v0=e,this.v1=t,this.v2=s,this.v3=n}getPoint(e,t=new l){const{v0:s,v1:n,v2:o,v3:a}=this;return t.set(j(e,s.x,n.x,o.x,a.x),j(e,s.y,n.y,o.y,a.y)),t}transform(e){return this.v0.applyMatrix3(e),this.v1.applyMatrix3(e),this.v2.applyMatrix3(e),this.v3.applyMatrix3(e),this}getMinMax(e=l.MAX,t=l.MIN){const{v0:s,v1:n,v2:o,v3:a}=this;return e.x=Math.min(e.x,s.x,n.x,o.x,a.x),e.y=Math.min(e.y,s.y,n.y,o.y,a.y),t.x=Math.max(t.x,s.x,n.x,o.x,a.x),t.y=Math.max(t.y,s.y,n.y,o.y,a.y),{min:e,max:t}}getCommands(){const{v0:e,v1:t,v2:s,v3:n}=this;return[{type:"M",x:e.x,y:e.y},{type:"C",x1:t.x,y1:t.y,x2:s.x,y2:s.y,x:n.x,y:n.y}]}drawTo(e){const{v1:t,v2:s,v3:n}=this;return e.bezierCurveTo(t.x,t.y,s.x,s.y,n.x,n.y),this}copy(e){return super.copy(e),this.v0.copy(e.v0),this.v1.copy(e.v1),this.v2.copy(e.v2),this.v3.copy(e.v3),this}}const At=new I,J=new I,K=new I,R=new l;class tt extends k{constructor(e=0,t=0,s=1,n=1,o=0,a=Math.PI*2,h=!1,c=0){super(),this.x=e,this.y=t,this.radiusX=s,this.radiusY=n,this.startAngle=o,this.endAngle=a,this.clockwise=h,this.rotation=c}getPoint(e,t=new l){const s=Math.PI*2;let n=this.endAngle-this.startAngle;const o=Math.abs(n)<Number.EPSILON;for(;n<0;)n+=s;for(;n>s;)n-=s;n<Number.EPSILON&&(o?n=0:n=s),this.clockwise&&!o&&(n===s?n=-s:n=n-s);const a=this.startAngle+e*n;let h=this.x+this.radiusX*Math.cos(a),c=this.y+this.radiusY*Math.sin(a);if(this.rotation!==0){const i=Math.cos(this.rotation),u=Math.sin(this.rotation),y=h-this.x,f=c-this.y;h=y*i-f*u+this.x,c=y*u+f*i+this.y}return t.set(h,c)}getDivisions(e=12){return e*2}getCommands(){const{x:e,y:t,radiusX:s,radiusY:n,startAngle:o,endAngle:a,clockwise:h}=this,c=!h,i=e+s*Math.cos(o),u=t+n*Math.sin(o),y=e+s*Math.cos(a),f=t+n*Math.sin(a),x=Math.abs(o-a),g=x>Math.PI?1:0,p=c?0:1,m=e+s*Math.cos(o+(a-o)/2),T=t+n*Math.sin(o+(a-o)/2);return x>=2*Math.PI?[{type:"M",x:i,y:u},{type:"A",rx:s,ry:n,angle:0,largeArcFlag:1,sweepFlag:p,x:m,y:T},{type:"A",rx:s,ry:n,angle:0,largeArcFlag:1,sweepFlag:p,x:i,y:u}]:[{type:"M",x:i,y:u},{type:"A",rx:s,ry:n,angle:0,largeArcFlag:g,sweepFlag:p,x:y,y:f}]}drawTo(e){const{x:t,y:s,radiusX:n,radiusY:o,rotation:a,startAngle:h,endAngle:c,clockwise:i}=this,u=t+n*Math.cos(h),y=s+o*Math.sin(h);return e.moveTo(u,y),e.ellipse(t,s,n,o,a,h,c,!i),this}transform(e){return R.set(this.x,this.y),R.applyMatrix3(e),this.x=R.x,this.y=R.y,kt(e)?Ct(this,e):It(this,e),this}copy(e){return super.copy(e),this.x=e.x,this.y=e.y,this.radiusX=e.radiusX,this.radiusY=e.radiusY,this.startAngle=e.startAngle,this.endAngle=e.endAngle,this.clockwise=e.clockwise,this.rotation=e.rotation,this}}function Ct(r,e){const t=r.radiusX,s=r.radiusY,n=Math.cos(r.rotation),o=Math.sin(r.rotation),a=new l(t*n,t*o),h=new l(-s*o,s*n),c=a.applyMatrix3(e),i=h.applyMatrix3(e),u=At.set(c.x,i.x,0,c.y,i.y,0,0,0,1),y=J.copy(u).invert(),g=K.copy(y).transpose().multiply(y).elements,p=Lt(g[0],g[1],g[4]),m=Math.sqrt(p.rt1),T=Math.sqrt(p.rt2);if(r.radiusX=1/m,r.radiusY=1/T,r.rotation=Math.atan2(p.sn,p.cs),!((r.endAngle-r.startAngle)%(2*Math.PI)<Number.EPSILON)){const P=J.set(m,0,0,0,T,0,0,0,1),A=K.set(p.cs,p.sn,0,-p.sn,p.cs,0,0,0,1),b=P.multiply(A).multiply(u),$=z=>{const{x:Y,y:V}=new l(Math.cos(z),Math.sin(z)).applyMatrix3(b);return Math.atan2(V,Y)};r.startAngle=$(r.startAngle),r.endAngle=$(r.endAngle),et(e)&&(r.clockwise=!r.clockwise)}}function It(r,e){const t=st(e),s=nt(e);r.radiusX*=t,r.radiusY*=s;const n=t>Number.EPSILON?Math.atan2(e.elements[1],e.elements[0]):Math.atan2(-e.elements[3],e.elements[4]);r.rotation+=n,et(e)&&(r.startAngle*=-1,r.endAngle*=-1,r.clockwise=!r.clockwise)}function et(r){const e=r.elements;return e[0]*e[4]-e[1]*e[3]<0}function kt(r){const e=r.elements,t=e[0]*e[3]+e[1]*e[4];if(t===0)return!1;const s=st(r),n=nt(r);return Math.abs(t/(s*n))>Number.EPSILON}function st(r){const e=r.elements;return Math.sqrt(e[0]*e[0]+e[1]*e[1])}function nt(r){const e=r.elements;return Math.sqrt(e[3]*e[3]+e[4]*e[4])}function Lt(r,e,t){let s,n,o,a,h;const c=r+t,i=r-t,u=Math.sqrt(i*i+4*e*e);return c>0?(s=.5*(c+u),h=1/s,n=r*h*t-e*h*e):c<0?n=.5*(c-u):(s=.5*u,n=-.5*u),i>0?o=i+u:o=i-u,Math.abs(o)>2*Math.abs(e)?(h=-2*e/o,a=1/Math.sqrt(1+h*h),o=h*a):Math.abs(e)===0?(o=1,a=0):(h=-.5*o/e,o=1/Math.sqrt(1+h*h),a=h*o),i>0&&(h=o,o=-a,a=h),{rt1:s,rt2:n,cs:o,sn:a}}class q extends k{constructor(e=new l,t=new l){super(),this.v1=e,this.v2=t}getPoint(e,t=new l){return e===1?t.copy(this.v2):(t.copy(this.v2).sub(this.v1),t.multiplyScalar(e).add(this.v1)),t}getPointAt(e,t=new l){return this.getPoint(e,t)}getTangent(e,t=new l){return t.subVectors(this.v2,this.v1).normalize()}getTangentAt(e,t=new l){return this.getTangent(e,t)}transform(e){return this.v1.applyMatrix3(e),this.v2.applyMatrix3(e),this}getDivisions(){return 1}getMinMax(e=l.MAX,t=l.MIN){const{v1:s,v2:n}=this;return e.x=Math.min(e.x,s.x,n.x),e.y=Math.min(e.y,s.y,n.y),t.x=Math.max(t.x,s.x,n.x),t.y=Math.max(t.y,s.y,n.y),{min:e,max:t}}getCommands(){const{v1:e,v2:t}=this;return[{type:"M",x:e.x,y:e.y},{type:"L",x:t.x,y:t.y}]}drawTo(e){const{v2:t}=this;return e.lineTo(t.x,t.y),this}copy(e){return super.copy(e),this.v1.copy(e.v1),this.v2.copy(e.v2),this}}class St extends k{constructor(t,s,n=0,o=1){super();w(this,"curves");w(this,"pointT",0);this.center=t,this.size=s,this.start=n,this.end=o;const{x:a,y:h}=this.center,c=new l(a+.5*this.size,h-.5*this.size),i=new l(a-.5*this.size,h-.5*this.size),u=new l(a,h+.5*this.size),y=new O(c,Math.SQRT1_2*this.size,-.25*Math.PI,.75*Math.PI),f=new O(i,Math.SQRT1_2*this.size,-.75*Math.PI,.25*Math.PI),x=new O(u,.5*Math.SQRT1_2*this.size,.75*Math.PI,1.25*Math.PI),g=new l(a,h+this.size),p=new l(a+this.size,h),m=new l().lerpVectors(p,g,.75),T=new l(a-this.size,h),C=new l().lerpVectors(T,g,.75),P=new q(p,m),A=new q(C,T);this.curves=[y,P,x,A,f]}getPoint(t){return this.getCurrentLine(t).getPoint(this.pointT)}getPointAt(t){return this.getPoint(t)}getCurrentLine(t){let s=(t*(this.end-this.start)+this.start)%1;s<0&&(s+=1),s*=9*Math.PI/8+1.5;let n;const o=.5*Math.PI;return s<o?(n=0,this.pointT=s/o):s<o+.75?(n=1,this.pointT=(s-o)/.75):s<5*Math.PI/8+.75?(n=2,this.pointT=(s-o-.75)/(Math.PI/8)):s<5*Math.PI/8+1.5?(n=3,this.pointT=(s-5*Math.PI/8-.75)/.75):(n=4,this.pointT=(s-5*Math.PI/8-1.5)/o),this.curves[n]}getTangent(t){return this.getCurrentLine(t).getTangent(this.pointT).normalize()}getNormal(t){const s=this.getCurrentLine(t);return new l(s.v2.y-s.v1.y,-(s.v2.x-s.v1.x)).normalize()}transform(t){return this.curves.forEach(s=>s.transform(t)),this}getMinMax(t=l.MAX,s=l.MIN){return this.curves.forEach(n=>n.getMinMax(t,s)),{min:t,max:s}}getCommands(){return this.curves.flatMap(t=>t.getCommands())}drawTo(t){return this.curves.forEach(s=>s.drawTo(t)),this}}class Nt extends k{constructor(t,s=0,n=0,o=0,a=1){super();w(this,"curves",[]);w(this,"points",[]);this.center=t,this.radius=s,this.num=n,this.start=o,this.end=a;for(let h=0;h<this.num;h++){let c=h*2*Math.PI/this.num;c-=.5*Math.PI;const i=new l(this.radius*Math.cos(c),this.radius*Math.sin(c));i.add(this.center),this.points.push(i)}for(let h=0;h<this.num;h++)this.curves.push(new q(this.points[h],this.points[(h+1)%this.num]))}getPoint(t){return this.getCurrentLine(t),this.currentLine.getPoint(this.pointK)}getPointAt(t){return this.getPoint(t)}getCurrentLine(t){let s=(t*(this.end-this.start)+this.start)%1;s<0&&(s+=1);const n=s*this.num,o=Math.floor(n);return this.pointK=n-o,this.currentLine=this.curves[o],this.currentLine}getTangent(t){return this.getCurrentLine(t).getTangent(0).normalize()}getNormal(t){const s=this.getCurrentLine(t);return new l(s.v2.y-s.v1.y,-(s.v2.x-s.v1.x)).normalize()}transform(t){return this.curves.forEach(s=>s.transform(t)),this}getMinMax(t=l.MAX,s=l.MIN){return this.curves.forEach(n=>n.getMinMax(t,s)),{min:t,max:s}}getCommands(){return this.curves.flatMap(t=>t.getCommands())}drawTo(t){return this.curves.forEach(s=>s.drawTo(t)),this}}class it extends k{constructor(e=new l,t=new l,s=new l){super(),this.v0=e,this.v1=t,this.v2=s}getPoint(e,t=new l){const{v0:s,v1:n,v2:o}=this;return t.set(W(e,s.x,n.x,o.x),W(e,s.y,n.y,o.y)),t}transform(e){return this.v0.applyMatrix3(e),this.v1.applyMatrix3(e),this.v2.applyMatrix3(e),this}getMinMax(e=l.MAX,t=l.MIN){const{v0:s,v1:n,v2:o}=this,a=.5*(s.x+n.x),h=.5*(s.y+n.y),c=.5*(s.x+o.x),i=.5*(s.y+o.y);return e.x=Math.min(e.x,s.x,o.x,a,c),e.y=Math.min(e.y,s.y,o.y,h,i),t.x=Math.max(t.x,s.x,o.x,a,c),t.y=Math.max(t.y,s.y,o.y,h,i),{min:e,max:t}}getCommands(){const{v0:e,v1:t,v2:s}=this;return[{type:"M",x:e.x,y:e.y},{type:"Q",x1:t.x,y1:t.y,x:s.x,y:s.y}]}drawTo(e){const{v1:t,v2:s}=this;return e.quadraticCurveTo(t.x,t.y,s.x,s.y),this}copy(e){return super.copy(e),this.v0.copy(e.v0),this.v1.copy(e.v1),this.v2.copy(e.v2),this}}class rt extends k{constructor(t,s,n=1,o=0,a=1){super();w(this,"curves",[]);w(this,"pointT",0);this.center=t,this.rx=s,this.aspectRatio=n,this.start=o,this.end=a;const{x:h,y:c}=this.center,i=this.rx,u=this.rx/this.aspectRatio,y=[new l(h-i,c-u),new l(h+i,c-u),new l(h+i,c+u),new l(h-i,c+u)];for(let f=0;f<4;f++)this.curves.push(new q(y[f].clone(),y[(f+1)%4].clone()))}get x(){return this.center.x-this.rx}get y(){return this.center.y-this.rx/this.aspectRatio}get width(){return this.rx*2}get height(){return this.rx/this.aspectRatio*2}getPoint(t){return this.getCurrentLine(t).getPoint(this.pointT)}getPointAt(t){return this.getPoint(t)}getCurrentLine(t){let s=(t*(this.end-this.start)+this.start)%1;s<0&&(s+=1),s*=(1+this.aspectRatio)*2;let n;return s<this.aspectRatio?(n=0,this.pointT=s/this.aspectRatio):s<this.aspectRatio+1?(n=1,this.pointT=(s-this.aspectRatio)/1):s<2*this.aspectRatio+1?(n=2,this.pointT=(s-this.aspectRatio-1)/this.aspectRatio):(n=3,this.pointT=(s-2*this.aspectRatio-1)/1),this.curves[n]}getTangent(t){return this.getCurrentLine(t).getTangent(0).normalize()}getNormal(t){const{v1:s,v2:n}=this.getCurrentLine(t);return new l(n.y-s.y,-(n.x-s.x)).normalize()}transform(t){return this.curves.forEach(s=>s.transform(t)),this}getMinMax(t=l.MAX,s=l.MIN){return this.curves.forEach(n=>n.getMinMax(t,s)),{min:t,max:s}}getCommands(){return this.curves.flatMap(t=>t.getCommands())}drawTo(t){return this.curves.forEach(s=>s.drawTo(t)),this}}class ot extends k{constructor(e=[]){super(),this.points=e}getDivisions(e=12){return e*this.points.length}getPoint(e,t=new l){const{points:s}=this,n=(s.length-1)*e,o=Math.floor(n),a=n-o,h=s[o===0?o:o-1],c=s[o],i=s[o>s.length-2?s.length-1:o+1],u=s[o>s.length-3?s.length-1:o+2];return t.set(H(a,h.x,c.x,i.x,u.x),H(a,h.y,c.y,i.y,u.y)),t}copy(e){super.copy(e),this.points=[];for(let t=0,s=e.points.length;t<s;t++)this.points.push(e.points[t].clone());return this}}class X extends k{constructor(t){super();w(this,"curves",[]);w(this,"currentPoint",new l);w(this,"autoClose",!1);w(this,"_cacheLengths",[]);t&&this.setFromPoints(t)}addCurve(t){return this.curves.push(t),this}closePath(){const t=this.curves[0].getPoint(0),s=this.curves[this.curves.length-1].getPoint(1);return t.equals(s)||this.curves.push(new q(s,t)),this}getPoint(t,s=new l){const n=t*this.getLength(),o=this.getCurveLengths();let a=0;for(;a<o.length;){if(o[a]>=n){const h=o[a]-n,c=this.curves[a],i=c.getLength();return c.getPointAt(i===0?0:1-h/i,s)}a++}return s}getLength(){const t=this.getCurveLengths();return t[t.length-1]}updateArcLengths(){super.updateArcLengths(),this._cacheLengths=[],this.getCurveLengths()}getCurveLengths(){if(this._cacheLengths.length===this.curves.length)return this._cacheLengths;const t=[];let s=0;for(let n=0,o=this.curves.length;n<o;n++)s+=this.curves[n].getLength(),t.push(s);return this._cacheLengths=t,t}getSpacedPoints(t=40){const s=[];for(let n=0;n<=t;n++)s.push(this.getPoint(n/t));return this.autoClose&&s.push(s[0]),s}getPoints(t=12){const s=[];let n;for(let o=0,a=this.curves;o<a.length;o++){const h=a[o],c=h.getPoints(h.getDivisions(t));for(let i=0;i<c.length;i++){const u=c[i];n&&n.equals(u)||(s.push(u),n=u)}}return this.autoClose&&s.length>1&&!s[s.length-1].equals(s[0])&&s.push(s[0]),s}setFromPoints(t){this.moveTo(t[0].x,t[0].y);for(let s=1,n=t.length;s<n;s++)this.lineTo(t[s].x,t[s].y);return this}bezierCurveTo(t,s,n,o,a,h){return this.curves.push(new Z(this.currentPoint.clone(),new l(t,s),new l(n,o),new l(a,h))),this.currentPoint.set(a,h),this}lineTo(t,s){return this.curves.push(new q(this.currentPoint.clone(),new l(t,s))),this.currentPoint.set(t,s),this}moveTo(t,s){return this.currentPoint.set(t,s),this}quadraticCurveTo(t,s,n,o){return this.curves.push(new it(this.currentPoint.clone(),new l(t,s),new l(n,o))),this.currentPoint.set(n,o),this}rect(t,s,n,o){return this.curves.push(new rt(new l(t+n/2,s+o/2),n/2,n/o)),this.currentPoint.set(t,s),this}splineThru(t){const s=[this.currentPoint.clone()].concat(t);return this.curves.push(new ot(s)),this.currentPoint.copy(t[t.length-1]),this}arc(t,s,n,o,a,h=!1){const c=this.currentPoint;return this.absarc(t+c.x,s+c.y,n,o,a,h),this}absarc(t,s,n,o,a,h=!1){return this.absellipse(t,s,n,n,o,a,h),this}ellipse(t,s,n,o,a,h,c=!1,i=0){const u=this.currentPoint;return this.absellipse(t+u.x,s+u.y,n,o,a,h,c,i),this}absellipse(t,s,n,o,a,h,c=!1,i=0){const u=new tt(t,s,n,o,a,h,c,i);if(this.curves.length>0){const y=u.getPoint(0);y.equals(this.currentPoint)||this.lineTo(y.x,y.y)}return this.curves.push(u),this.currentPoint.copy(u.getPoint(1)),this}getCommands(){return this.curves.flatMap(t=>t.getCommands())}getMinMax(t=l.MAX,s=l.MIN){return this.curves.forEach(n=>n.getMinMax(t,s)),{min:t,max:s}}drawTo(t){var n;const s=(n=this.curves[0])==null?void 0:n.getPoint(0);return s&&t.moveTo(s.x,s.y),this.curves.forEach(o=>o.drawTo(t)),this.autoClose&&t.closePath(),this}copy(t){super.copy(t),this.curves=[];for(let s=0,n=t.curves.length;s<n;s++)this.curves.push(t.curves[s].clone());return this.autoClose=t.autoClose,this.currentPoint.copy(t.currentPoint),this}}class L{constructor(e){w(this,"currentPath",new X);w(this,"paths",[this.currentPath]);w(this,"userData");e&&(e instanceof L?this.addPath(e):Array.isArray(e)?this.addCommands(e):this.addData(e))}addPath(e){return e instanceof L?this.paths.push(...e.paths.map(t=>t.clone())):this.paths.push(e),this}closePath(){return this.currentPath.closePath(),this}moveTo(e,t){const{currentPoint:s,curves:n}=this.currentPath;return(s.x!==e||s.y!==t)&&(n.length?(this.currentPath=new X().moveTo(e,t),this.paths.push(this.currentPath)):this.currentPath.moveTo(e,t)),this}lineTo(e,t){return this.currentPath.lineTo(e,t),this}bezierCurveTo(e,t,s,n,o,a){return this.currentPath.bezierCurveTo(e,t,s,n,o,a),this}quadraticCurveTo(e,t,s,n){return this.currentPath.quadraticCurveTo(e,t,s,n),this}arc(e,t,s,n,o,a){return this.currentPath.absarc(e,t,s,n,o,!a),this}arcTo(e,t,s,n,o){const a=this.currentPath.currentPoint,h=a.x,c=a.y,i=e-h,u=t-c,y=s-e,f=n-t,x=Math.sqrt(i*i+u*u),g=Math.sqrt(y*y+f*f);if(x<o||g<o)return this.lineTo(s,n),this;const p={x:i/x,y:u/x},m={x:y/g,y:f/g},T=e-p.y*o,C=t+p.x*o,P=Math.atan2(p.y,p.x);let b=Math.atan2(m.y,m.x)-P;return b>Math.PI?b-=2*Math.PI:b<-Math.PI&&(b+=2*Math.PI),this.arc(T,C,o,P,P+b,!1),this.lineTo(s,n),this}ellipse(e,t,s,n,o,a,h,c){return this.currentPath.absellipse(e,t,s,n,a,h,!c,o),this}rect(e,t,s,n){return this.currentPath.rect(e,t,s,n),this}addCommands(e){return gt(e,this),this}addData(e){return this.addCommands(Mt(e)),this}splineThru(e){return this.currentPath.splineThru(e),this}forEachCurve(e){return this.paths.forEach(t=>t.curves.forEach(s=>e(s))),this}transform(e){return this.forEachCurve(t=>t.transform(e)),this}getMinMax(e=l.MAX,t=l.MIN){return this.forEachCurve(s=>s.getMinMax(e,t)),{min:e,max:t}}getBoundingBox(){const{min:e,max:t}=this.getMinMax();return new S(e.x,e.y,t.x-e.x,t.y-e.y)}getCommands(){return this.paths.flatMap(e=>e.curves.flatMap(t=>t.getCommands()))}getData(){return this.paths.map(e=>e.getData()).join(" ")}getSvgString(){const{x:e,y:t,width:s,height:n}=this.getBoundingBox();return`<svg viewBox="${e} ${t} ${s} ${n}" xmlns="http://www.w3.org/2000/svg"><path fill="none" stroke="currentColor" d="${this.getData()}"></path></svg>`}getSvgDataUri(){return`data:image/svg+xml;base64,${btoa(this.getSvgString())}`}drawTo(e){this.paths.forEach(t=>{t.drawTo(e)})}strokeTo(e){this.drawTo(e),e.stroke()}fillTo(e){this.drawTo(e),e.fill()}copy(e){return this.currentPath=e.currentPath.clone(),this.paths=e.paths.map(t=>t.clone()),this.userData=e.userData,this}toCanvas(e=!0){const t=document.createElement("canvas"),{left:s,top:n,width:o,height:a}=this.getBoundingBox();t.width=o,t.height=a;const h=t.getContext("2d");return h&&(h.translate(-s,-n),e?this.fillTo(h):this.strokeTo(h)),t}clone(){return new this.constructor().copy(this)}}const _="px",ht=90,at=["mm","cm","in","pt","pc","px"],U={mm:{mm:1,cm:.1,in:1/25.4,pt:72/25.4,pc:6/25.4,px:-1},cm:{mm:10,cm:1,in:1/2.54,pt:72/2.54,pc:6/2.54,px:-1},in:{mm:25.4,cm:2.54,in:1,pt:72,pc:6,px:-1},pt:{mm:25.4/72,cm:2.54/72,in:1/72,pt:1,pc:6/72,px:-1},pc:{mm:25.4/6,cm:2.54/6,in:1/6,pt:72/6,pc:1,px:-1},px:{px:1}};function v(r){let e="px";if(typeof r=="string"||r instanceof String)for(let s=0,n=at.length;s<n;s++){const o=at[s];if(r.endsWith(o)){e=o,r=r.substring(0,r.length-o.length);break}}let t;return e==="px"&&_!=="px"?t=U.in[_]/ht:(t=U[e][_],t<0&&(t=U[e].in*ht)),t*Number.parseFloat(r)}const Et=new I,F=new I,ct=new I,ut=new I;function $t(r,e,t){if(!(r.hasAttribute("transform")||r.nodeName==="use"&&(r.hasAttribute("x")||r.hasAttribute("y"))))return null;const s=zt(r);return t.length>0&&s.premultiply(t[t.length-1]),e.copy(s),t.push(s),s}function zt(r){const e=new I,t=Et;if(r.nodeName==="use"&&(r.hasAttribute("x")||r.hasAttribute("y"))&&e.translate(v(r.getAttribute("x")),v(r.getAttribute("y"))),r.hasAttribute("transform")){const s=r.getAttribute("transform").split(")");for(let n=s.length-1;n>=0;n--){const o=s[n].trim();if(o==="")continue;const a=o.indexOf("("),h=o.length;if(a>0&&a<h){const c=o.slice(0,a),i=N(o.slice(a+1));switch(t.identity(),c){case"translate":if(i.length>=1){const u=i[0];let y=0;i.length>=2&&(y=i[1]),t.translate(u,y)}break;case"rotate":if(i.length>=1){let u=0,y=0,f=0;u=i[0]*Math.PI/180,i.length>=3&&(y=i[1],f=i[2]),F.makeTranslation(-y,-f),ct.makeRotation(u),ut.multiplyMatrices(ct,F),F.makeTranslation(y,f),t.multiplyMatrices(F,ut)}break;case"scale":i.length>=1&&t.scale(i[0],i[1]??i[0]);break;case"skewX":i.length===1&&t.set(1,Math.tan(i[0]*Math.PI/180),0,0,1,0,0,0,1);break;case"skewY":i.length===1&&t.set(1,0,0,Math.tan(i[0]*Math.PI/180),1,0,0,0,1);break;case"matrix":i.length===6&&t.set(i[0],i[2],i[4],i[1],i[3],i[5],0,0,1);break}}e.premultiply(t)}}return e}function qt(r){return new L().addPath(new X().absarc(v(r.getAttribute("cx")||0),v(r.getAttribute("cy")||0),v(r.getAttribute("r")||0),0,Math.PI*2))}function Dt(r,e){if(!(!r.sheet||!r.sheet.cssRules||!r.sheet.cssRules.length))for(let t=0;t<r.sheet.cssRules.length;t++){const s=r.sheet.cssRules[t];if(s.type!==1)continue;const n=s.selectorText.split(/,/g).filter(Boolean).map(o=>o.trim());for(let o=0;o<n.length;o++){const a=Object.fromEntries(Object.entries(s.style).filter(([,h])=>h!==""));e[n[o]]=Object.assign(e[n[o]]||{},a)}}}function Xt(r){return new L().addPath(new X().absellipse(v(r.getAttribute("cx")||0),v(r.getAttribute("cy")||0),v(r.getAttribute("rx")||0),v(r.getAttribute("ry")||0),0,Math.PI*2))}function Ot(r){return new L().moveTo(v(r.getAttribute("x1")||0),v(r.getAttribute("y1")||0)).lineTo(v(r.getAttribute("x2")||0),v(r.getAttribute("y2")||0))}function Rt(r){const e=new L,t=r.getAttribute("d");return!t||t==="none"?null:(e.addData(t),e)}const Ft=/([+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)(?:,|\s)([+-]?\d*\.?\d+(?:e[+-]?\d+)?)/g;function Yt(r){var s;const e=new L;let t=0;return(s=r.getAttribute("points"))==null||s.replace(Ft,(n,o,a)=>{const h=v(o),c=v(a);return t===0?e.moveTo(h,c):e.lineTo(h,c),t++,n}),e.currentPath.autoClose=!0,e}const Gt=/([+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)(?:,|\s)([+-]?\d*\.?\d+(?:e[+-]?\d+)?)/g;function _t(r){var s;const e=new L;let t=0;return(s=r.getAttribute("points"))==null||s.replace(Gt,(n,o,a)=>{const h=v(o),c=v(a);return t===0?e.moveTo(h,c):e.lineTo(h,c),t++,n}),e.currentPath.autoClose=!1,e}function Ut(r){const e=v(r.getAttribute("x")||0),t=v(r.getAttribute("y")||0),s=v(r.getAttribute("rx")||r.getAttribute("ry")||0),n=v(r.getAttribute("ry")||r.getAttribute("rx")||0),o=v(r.getAttribute("width")),a=v(r.getAttribute("height")),h=1-.551915024494,c=new L;return c.moveTo(e+s,t),c.lineTo(e+o-s,t),(s!==0||n!==0)&&c.bezierCurveTo(e+o-s*h,t,e+o,t+n*h,e+o,t+n),c.lineTo(e+o,t+a-n),(s!==0||n!==0)&&c.bezierCurveTo(e+o,t+a-n*h,e+o-s*h,t+a,e+o-s,t+a),c.lineTo(e+s,t+a),(s!==0||n!==0)&&c.bezierCurveTo(e+s*h,t+a,e,t+a-n*h,e,t+a-n),c.lineTo(e,t+n),(s!==0||n!==0)&&c.bezierCurveTo(e,t+n*h,e+s*h,t,e+s,t),c}function E(r,e,t){e=Object.assign({},e);let s={};if(r.hasAttribute("class")){const h=r.getAttribute("class").split(/\s/).filter(Boolean).map(c=>c.trim());for(let c=0;c<h.length;c++)s=Object.assign(s,t[`.${h[c]}`])}r.hasAttribute("id")&&(s=Object.assign(s,t[`#${r.getAttribute("id")}`]));function n(h,c,i){i===void 0&&(i=function(y){return y.startsWith("url")&&console.warn("url access in attributes is not implemented."),y}),r.hasAttribute(h)&&(e[c]=i(r.getAttribute(h))),s[h]&&(e[c]=i(s[h])),r.style&&r.style[h]!==""&&(e[c]=i(r.style[h]))}function o(h){return Math.max(0,Math.min(1,v(h)))}function a(h){return Math.max(0,v(h))}return n("fill","fill"),n("fill-opacity","fillOpacity",o),n("fill-rule","fillRule"),n("opacity","opacity",o),n("stroke","stroke"),n("stroke-dashoffset","strokeDashoffset"),n("stroke-dasharray","strokeDasharray"),n("stroke-linecap","strokeLineCap"),n("stroke-linejoin","strokeLineJoin"),n("stroke-miterlimit","strokeMiterLimit",a),n("stroke-opacity","strokeOpacity",o),n("stroke-width","strokeWidth",a),n("visibility","visibility"),e}function Q(r,e,t=[]){var u;if(r.nodeType!==1)return t;let s=!1,n=null;const o={};switch(r.nodeName){case"svg":e=E(r,e,o);break;case"style":Dt(r,o);break;case"g":e=E(r,e,o);break;case"path":e=E(r,e,o),r.hasAttribute("d")&&(n=Rt(r));break;case"rect":e=E(r,e,o),n=Ut(r);break;case"polygon":e=E(r,e,o),n=Yt(r);break;case"polyline":e=E(r,e,o),n=_t(r);break;case"circle":e=E(r,e,o),n=qt(r);break;case"ellipse":e=E(r,e,o),n=Xt(r);break;case"line":e=E(r,e,o),n=Ot(r);break;case"defs":s=!0;break;case"use":{e=E(r,e,o);const f=(r.getAttributeNS("http://www.w3.org/1999/xlink","href")||"").substring(1),x=(u=r.viewportElement)==null?void 0:u.getElementById(f);x?Q(x,e,t):console.warn(`'use node' references non-existent node id: ${f}`);break}default:console.warn(r);break}const a=new I,h=[],c=$t(r,a,h);n&&(n.transform(a),t.push(n),n.userData={node:r,style:e});const i=r.childNodes;for(let y=0,f=i.length;y<f;y++){const x=i[y];s&&x.nodeName!=="style"&&x.nodeName!=="defs"||Q(x,e,t)}return c&&(h.pop(),h.length>0?a.copy(h[h.length-1]):a.identity()),t}function Qt(r){let e;return typeof r=="string"?e=new DOMParser().parseFromString(r,"image/svg+xml").documentElement:e=r,Q(e,{fill:"#000",fillOpacity:1,strokeOpacity:1,strokeWidth:1,strokeLineJoin:"miter",strokeLineCap:"butt",strokeMiterLimit:4})}M.BoundingBox=S,M.CircleCurve=O,M.CubicBezierCurve=Z,M.Curve=k,M.CurvePath=X,M.EllipseCurve=tt,M.HeartCurve=St,M.LineCurve=q,M.Matrix3=I,M.Path2D=L,M.PloygonCurve=Nt,M.Point2D=l,M.QuadraticBezierCurve=it,M.RectangularCurve=rt,M.SplineCurve=ot,M.parseSvg=Qt,Object.defineProperty(M,Symbol.toStringTag,{value:"Module"})});
package/dist/index.mjs CHANGED
@@ -59,13 +59,12 @@ class Point2D {
59
59
  equals(point) {
60
60
  return this.x === point.x && this.y === point.y;
61
61
  }
62
- applyMatrix3(matrix3) {
63
- const [a, c, tx, b, d, ty] = matrix3.elements;
64
- const { x, y } = this;
65
- this.set(
66
- a * x + c * y + tx,
67
- b * x + d * y + ty
68
- );
62
+ applyMatrix3(m) {
63
+ const x = this.x;
64
+ const y = this.y;
65
+ const e = m.elements;
66
+ this.x = e[0] * x + e[3] * y + e[6];
67
+ this.y = e[1] * x + e[4] * y + e[7];
69
68
  return this;
70
69
  }
71
70
  copy(point) {
@@ -1555,6 +1554,14 @@ class HeartCurve extends Curve {
1555
1554
  const line = this.getCurrentLine(value);
1556
1555
  return new Point2D(line.v2.y - line.v1.y, -(line.v2.x - line.v1.x)).normalize();
1557
1556
  }
1557
+ transform(matrix) {
1558
+ this.curves.forEach((curve) => curve.transform(matrix));
1559
+ return this;
1560
+ }
1561
+ getMinMax(min = Point2D.MAX, max = Point2D.MIN) {
1562
+ this.curves.forEach((curve) => curve.getMinMax(min, max));
1563
+ return { min, max };
1564
+ }
1558
1565
  getCommands() {
1559
1566
  return this.curves.flatMap((curve) => curve.getCommands());
1560
1567
  }
@@ -1614,13 +1621,17 @@ class PloygonCurve extends Curve {
1614
1621
  const line = this.getCurrentLine(value);
1615
1622
  return new Point2D(line.v2.y - line.v1.y, -(line.v2.x - line.v1.x)).normalize();
1616
1623
  }
1617
- getCommands() {
1618
- return this.curves.flatMap((curve) => curve.getCommands());
1624
+ transform(matrix) {
1625
+ this.curves.forEach((curve) => curve.transform(matrix));
1626
+ return this;
1619
1627
  }
1620
1628
  getMinMax(min = Point2D.MAX, max = Point2D.MIN) {
1621
1629
  this.curves.forEach((curve) => curve.getMinMax(min, max));
1622
1630
  return { min, max };
1623
1631
  }
1632
+ getCommands() {
1633
+ return this.curves.flatMap((curve) => curve.getCommands());
1634
+ }
1624
1635
  drawTo(ctx) {
1625
1636
  this.curves.forEach((curve) => curve.drawTo(ctx));
1626
1637
  return this;
@@ -1707,7 +1718,7 @@ class RectangularCurve extends Curve {
1707
1718
  new Point2D(x - offsetX, y + offsetY)
1708
1719
  ];
1709
1720
  for (let i = 0; i < 4; i++) {
1710
- this.curves.push(new LineCurve(points[i], points[(i + 1) % 4]));
1721
+ this.curves.push(new LineCurve(points[i].clone(), points[(i + 1) % 4].clone()));
1711
1722
  }
1712
1723
  }
1713
1724
  get x() {
@@ -1755,13 +1766,17 @@ class RectangularCurve extends Curve {
1755
1766
  const { v1, v2 } = this.getCurrentLine(value);
1756
1767
  return new Point2D(v2.y - v1.y, -(v2.x - v1.x)).normalize();
1757
1768
  }
1758
- getCommands() {
1759
- return this.curves.flatMap((curve) => curve.getCommands());
1769
+ transform(matrix) {
1770
+ this.curves.forEach((curve) => curve.transform(matrix));
1771
+ return this;
1760
1772
  }
1761
1773
  getMinMax(min = Point2D.MAX, max = Point2D.MIN) {
1762
1774
  this.curves.forEach((curve) => curve.getMinMax(min, max));
1763
1775
  return { min, max };
1764
1776
  }
1777
+ getCommands() {
1778
+ return this.curves.flatMap((curve) => curve.getCommands());
1779
+ }
1765
1780
  drawTo(ctx) {
1766
1781
  this.curves.forEach((curve) => curve.drawTo(ctx));
1767
1782
  return this;
@@ -2172,9 +2187,9 @@ class Path2D {
2172
2187
  ctx.fill();
2173
2188
  }
2174
2189
  copy(source) {
2175
- source.currentPath = this.currentPath.clone();
2176
- source.paths = this.paths.map((path) => path.clone());
2177
- source.userData = this.userData;
2190
+ this.currentPath = source.currentPath.clone();
2191
+ this.paths = source.paths.map((path) => path.clone());
2192
+ this.userData = source.userData;
2178
2193
  return this;
2179
2194
  }
2180
2195
  toCanvas(fill = true) {
@@ -2194,7 +2209,7 @@ class Path2D {
2194
2209
  return canvas;
2195
2210
  }
2196
2211
  clone() {
2197
- return new Path2D().copy(this);
2212
+ return new this.constructor().copy(this);
2198
2213
  }
2199
2214
  }
2200
2215
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "modern-path2d",
3
3
  "type": "module",
4
- "version": "0.1.3",
4
+ "version": "0.1.5",
5
5
  "packageManager": "pnpm@9.9.0",
6
6
  "description": "A modern Path2D library, fully compatible with Web Path2D, with additional support for path animation, path deformation, path playback, etc.",
7
7
  "author": "wxm",