modern-path2d 0.2.8 → 1.0.0

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/README.md CHANGED
@@ -39,7 +39,7 @@ npm i modern-path2d
39
39
  ## 🦄 Usage
40
40
 
41
41
  ```ts
42
- import { parseSvg, Path2D } from 'modern-path2d'
42
+ import { parseSVG, Path2D } from 'modern-path2d'
43
43
 
44
44
  const path = new Path2D()
45
45
 
@@ -62,7 +62,7 @@ path.addCommands([
62
62
  ])
63
63
 
64
64
  // add svg
65
- const parsedPaths = parseSvg(`<svg xmlns="http://www.w3.org/2000/svg" width="72" height="72" viewBox="0 0 72 72" fill="none">
65
+ const parsedPaths = parseSVG(`<svg xmlns="http://www.w3.org/2000/svg" width="72" height="72" viewBox="0 0 72 72" fill="none">
66
66
  <path d="M51.3646 45.8642C49.7808 46.2782 47.906 46.705 45.8588 47.0857M45.8588 47.0857C34.1649 49.2607 16.8486 49.9343 16.0277 38.1484C15.22 26.5533 32.264 22.3636 45.6135 24.5626C53.601 25.8783 57.4507 29.6208 57.9285 34.237C58.2811 37.6435 55.778 43.3702 45.8588 47.0857ZM45.8588 47.0857C42.3367 48.4051 37.8795 49.4708 32.283 50.0891" stroke="#FFC300" stroke-width="2.5" stroke-linecap="round"/>
67
67
  </svg>`)
68
68
  parsedPaths.forEach((parsedPath) => {
@@ -82,5 +82,5 @@ path.drawTo(document.getElementById('canvas').getContext('2d'))
82
82
  document.body.append(path.toCanvas())
83
83
 
84
84
  // export to svg
85
- document.body.append(path.toSvg())
85
+ document.body.append(path.toSVG())
86
86
  ```
package/dist/index.cjs CHANGED
@@ -252,15 +252,9 @@ class BoundingBox {
252
252
  }
253
253
  }
254
254
 
255
- var __defProp$6 = Object.defineProperty;
256
- var __defNormalProp$6 = (obj, key, value) => key in obj ? __defProp$6(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
257
- var __publicField$6 = (obj, key, value) => {
258
- __defNormalProp$6(obj, typeof key !== "symbol" ? key + "" : key, value);
259
- return value;
260
- };
261
255
  class Matrix3 {
256
+ elements = [];
262
257
  constructor(n11 = 1, n12 = 0, n13 = 0, n21 = 0, n22 = 1, n23 = 0, n31 = 0, n32 = 0, n33 = 1) {
263
- __publicField$6(this, "elements", []);
264
258
  this.set(n11, n12, n13, n21, n22, n23, n31, n32, n33);
265
259
  }
266
260
  set(n11, n12, n13, n21, n22, n23, n31, n32, n33) {
@@ -698,8 +692,7 @@ function parsePathDataArgs(input, flags, stride = 0) {
698
692
  if (number !== "") {
699
693
  if (exponent === "")
700
694
  result.push(Number(number));
701
- else
702
- result.push(Number(number) * 10 ** Number(exponent));
695
+ else result.push(Number(number) * 10 ** Number(exponent));
703
696
  }
704
697
  number = "";
705
698
  exponent = "";
@@ -999,18 +992,10 @@ function pathDataToPathCommands(d) {
999
992
  return commands;
1000
993
  }
1001
994
 
1002
- var __defProp$5 = Object.defineProperty;
1003
- var __defNormalProp$5 = (obj, key, value) => key in obj ? __defProp$5(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
1004
- var __publicField$5 = (obj, key, value) => {
1005
- __defNormalProp$5(obj, typeof key !== "symbol" ? key + "" : key, value);
1006
- return value;
1007
- };
1008
995
  class Curve {
1009
- constructor() {
1010
- __publicField$5(this, "arcLengthDivisions", 200);
1011
- __publicField$5(this, "_cacheArcLengths");
1012
- __publicField$5(this, "_needsUpdate", false);
1013
- }
996
+ arcLengthDivisions = 200;
997
+ _cacheArcLengths;
998
+ _needsUpdate = false;
1014
999
  isClockwise() {
1015
1000
  const prev = this.getPoint(1);
1016
1001
  const cur = this.getPoint(0.5);
@@ -1364,10 +1349,8 @@ class EllipseCurve extends Curve {
1364
1349
  const twoPi = Math.PI * 2;
1365
1350
  let deltaAngle = this.endAngle - this.startAngle;
1366
1351
  const samePoints = Math.abs(deltaAngle) < Number.EPSILON;
1367
- while (deltaAngle < 0)
1368
- deltaAngle += twoPi;
1369
- while (deltaAngle > twoPi)
1370
- deltaAngle -= twoPi;
1352
+ while (deltaAngle < 0) deltaAngle += twoPi;
1353
+ while (deltaAngle > twoPi) deltaAngle -= twoPi;
1371
1354
  if (deltaAngle < Number.EPSILON) {
1372
1355
  if (samePoints) {
1373
1356
  deltaAngle = 0;
@@ -1679,12 +1662,6 @@ class LineCurve extends Curve {
1679
1662
  }
1680
1663
  }
1681
1664
 
1682
- var __defProp$4 = Object.defineProperty;
1683
- var __defNormalProp$4 = (obj, key, value) => key in obj ? __defProp$4(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
1684
- var __publicField$4 = (obj, key, value) => {
1685
- __defNormalProp$4(obj, typeof key !== "symbol" ? key + "" : key, value);
1686
- return value;
1687
- };
1688
1665
  class HeartCurve extends Curve {
1689
1666
  constructor(center, size, start = 0, end = 1) {
1690
1667
  super();
@@ -1692,9 +1669,9 @@ class HeartCurve extends Curve {
1692
1669
  this.size = size;
1693
1670
  this.start = start;
1694
1671
  this.end = end;
1695
- __publicField$4(this, "curveT", 0);
1696
1672
  this.update();
1697
1673
  }
1674
+ curveT = 0;
1698
1675
  update() {
1699
1676
  const { x, y } = this.center;
1700
1677
  const A = new Vector2(x + 0.5 * this.size, y - 0.5 * this.size);
@@ -1765,12 +1742,6 @@ class HeartCurve extends Curve {
1765
1742
  }
1766
1743
  }
1767
1744
 
1768
- var __defProp$3 = Object.defineProperty;
1769
- var __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
1770
- var __publicField$3 = (obj, key, value) => {
1771
- __defNormalProp$3(obj, typeof key !== "symbol" ? key + "" : key, value);
1772
- return value;
1773
- };
1774
1745
  class PloygonCurve extends Curve {
1775
1746
  constructor(center, radius = 0, number = 0, start = 0, end = 1) {
1776
1747
  super();
@@ -1779,11 +1750,11 @@ class PloygonCurve extends Curve {
1779
1750
  this.number = number;
1780
1751
  this.start = start;
1781
1752
  this.end = end;
1782
- __publicField$3(this, "curves", []);
1783
- __publicField$3(this, "curveT", 0);
1784
- __publicField$3(this, "points", []);
1785
1753
  this.update();
1786
1754
  }
1755
+ curves = [];
1756
+ curveT = 0;
1757
+ points = [];
1787
1758
  update() {
1788
1759
  for (let i = 0; i < this.number; i++) {
1789
1760
  let radian = i * 2 * Math.PI / this.number;
@@ -1892,12 +1863,6 @@ class QuadraticBezierCurve extends Curve {
1892
1863
  }
1893
1864
  }
1894
1865
 
1895
- var __defProp$2 = Object.defineProperty;
1896
- var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
1897
- var __publicField$2 = (obj, key, value) => {
1898
- __defNormalProp$2(obj, typeof key !== "symbol" ? key + "" : key, value);
1899
- return value;
1900
- };
1901
1866
  class RectangularCurve extends Curve {
1902
1867
  constructor(center, rx, aspectRatio = 1, start = 0, end = 1) {
1903
1868
  super();
@@ -1906,10 +1871,10 @@ class RectangularCurve extends Curve {
1906
1871
  this.aspectRatio = aspectRatio;
1907
1872
  this.start = start;
1908
1873
  this.end = end;
1909
- __publicField$2(this, "curves", []);
1910
- __publicField$2(this, "curveT", 0);
1911
1874
  this.update();
1912
1875
  }
1876
+ curves = [];
1877
+ curveT = 0;
1913
1878
  get x() {
1914
1879
  return this.center.x - this.rx;
1915
1880
  }
@@ -2018,20 +1983,14 @@ class SplineCurve extends Curve {
2018
1983
  }
2019
1984
  }
2020
1985
 
2021
- var __defProp$1 = Object.defineProperty;
2022
- var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
2023
- var __publicField$1 = (obj, key, value) => {
2024
- __defNormalProp$1(obj, typeof key !== "symbol" ? key + "" : key, value);
2025
- return value;
2026
- };
2027
1986
  class CurvePath extends Curve {
1987
+ curves = [];
1988
+ startPoint;
1989
+ currentPoint;
1990
+ autoClose = false;
1991
+ _cacheLengths = [];
2028
1992
  constructor(points) {
2029
1993
  super();
2030
- __publicField$1(this, "curves", []);
2031
- __publicField$1(this, "startPoint");
2032
- __publicField$1(this, "currentPoint");
2033
- __publicField$1(this, "autoClose", false);
2034
- __publicField$1(this, "_cacheLengths", []);
2035
1994
  if (points) {
2036
1995
  this.addPoints(points);
2037
1996
  }
@@ -2310,17 +2269,20 @@ function getIntersectionPoint(p1, p2, q1, q2) {
2310
2269
  );
2311
2270
  }
2312
2271
 
2313
- var __defProp = Object.defineProperty;
2314
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
2315
- var __publicField = (obj, key, value) => {
2316
- __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
2317
- return value;
2318
- };
2319
2272
  class Path2D {
2273
+ currentPath = new CurvePath();
2274
+ paths = [this.currentPath];
2275
+ style;
2276
+ get startPoint() {
2277
+ return this.currentPath.startPoint;
2278
+ }
2279
+ get currentPoint() {
2280
+ return this.currentPath.currentPoint;
2281
+ }
2282
+ get strokeWidth() {
2283
+ return this.style.strokeWidth ?? ((this.style.stroke ?? "none") === "none" ? 0 : 1);
2284
+ }
2320
2285
  constructor(path, style = {}) {
2321
- __publicField(this, "currentPath", new CurvePath());
2322
- __publicField(this, "paths", [this.currentPath]);
2323
- __publicField(this, "style");
2324
2286
  if (path) {
2325
2287
  if (path instanceof Path2D) {
2326
2288
  this.addPath(path);
@@ -2332,15 +2294,6 @@ class Path2D {
2332
2294
  }
2333
2295
  this.style = style;
2334
2296
  }
2335
- get startPoint() {
2336
- return this.currentPath.startPoint;
2337
- }
2338
- get currentPoint() {
2339
- return this.currentPath.currentPoint;
2340
- }
2341
- get strokeWidth() {
2342
- return this.style.strokeWidth ?? ((this.style.stroke ?? "none") === "none" ? 0 : 1);
2343
- }
2344
2297
  addPath(path) {
2345
2298
  if (path instanceof Path2D) {
2346
2299
  this.paths.push(...path.paths.map((v) => v.clone()));
@@ -2576,7 +2529,7 @@ class Path2D {
2576
2529
  toData() {
2577
2530
  return this.paths.map((path) => path.toData()).join(" ");
2578
2531
  }
2579
- toSvgPathString() {
2532
+ toSVGPathString() {
2580
2533
  const style = {
2581
2534
  ...this.style,
2582
2535
  fill: this.style.fill ?? "#000",
@@ -2599,16 +2552,16 @@ class Path2D {
2599
2552
  }
2600
2553
  return `<path d="${this.toData()}" style="${cssText}"></path>`;
2601
2554
  }
2602
- toSvgString() {
2555
+ toSVGString() {
2603
2556
  const { x, y, width, height } = this.getBoundingBox();
2604
- const path = this.toSvgPathString();
2557
+ const path = this.toSVGPathString();
2605
2558
  return `<svg viewBox="${x} ${y} ${width} ${height}" width="${width}px" height="${height}px" xmlns="http://www.w3.org/2000/svg">${path}</svg>`;
2606
2559
  }
2607
- toSvgUrl() {
2608
- return `data:image/svg+xml;base64,${btoa(this.toSvgString())}`;
2560
+ toSVGUrl() {
2561
+ return `data:image/svg+xml;base64,${btoa(this.toSVGString())}`;
2609
2562
  }
2610
- toSvg() {
2611
- return new DOMParser().parseFromString(this.toSvgString(), "image/svg+xml").documentElement;
2563
+ toSVG() {
2564
+ return new DOMParser().parseFromString(this.toSVGString(), "image/svg+xml").documentElement;
2612
2565
  }
2613
2566
  toCanvas(options = {}) {
2614
2567
  const { pixelRatio = 2, ...style } = options;
@@ -2698,9 +2651,7 @@ function parseFloatWithUnits(string) {
2698
2651
  }
2699
2652
  }
2700
2653
  let scale;
2701
- if (theUnit === "px" && defaultUnit !== "px") {
2702
- scale = unitConversion.in[defaultUnit] / defaultDPI;
2703
- } else {
2654
+ {
2704
2655
  scale = unitConversion[theUnit][defaultUnit];
2705
2656
  if (scale < 0) {
2706
2657
  scale = unitConversion[theUnit].in * defaultDPI;
@@ -3141,7 +3092,7 @@ function parseNode(node, style, paths = [], stylesheets = {}) {
3141
3092
  const dataUri = "data:image/svg+xml;";
3142
3093
  const base64DataUri = `${dataUri}base64,`;
3143
3094
  const utf8DataUri = `${dataUri}charset=utf8,`;
3144
- function parseSvgToDom(svg) {
3095
+ function parseSVGToDOM(svg) {
3145
3096
  if (typeof svg === "string") {
3146
3097
  let xml;
3147
3098
  if (svg.startsWith(base64DataUri)) {
@@ -3153,16 +3104,19 @@ function parseSvgToDom(svg) {
3153
3104
  } else {
3154
3105
  xml = svg;
3155
3106
  }
3156
- return new DOMParser().parseFromString(
3157
- xml,
3158
- "image/svg+xml"
3159
- ).documentElement;
3107
+ const doc = new DOMParser().parseFromString(xml, "text/xml");
3108
+ const error = doc.querySelector("parsererror");
3109
+ if (error) {
3110
+ throw new Error(`${error.textContent ?? "parser error"}
3111
+ ${xml}`);
3112
+ }
3113
+ return doc.documentElement;
3160
3114
  } else {
3161
3115
  return svg;
3162
3116
  }
3163
3117
  }
3164
- function parseSvg(svg) {
3165
- return parseNode(parseSvgToDom(svg), {});
3118
+ function parseSVG(svg) {
3119
+ return parseNode(parseSVGToDOM(svg), {});
3166
3120
  }
3167
3121
 
3168
3122
  function getPathsBoundingBox(paths, withStyle = true) {
@@ -3174,16 +3128,16 @@ function getPathsBoundingBox(paths, withStyle = true) {
3174
3128
  paths.forEach((path) => path.getMinMax(min, max, withStyle));
3175
3129
  return new BoundingBox(min.x, min.y, max.x - min.x, max.y - min.y);
3176
3130
  }
3177
- function pathsToSvgString(paths) {
3131
+ function pathsToSVGString(paths) {
3178
3132
  const { x, y, width, height } = getPathsBoundingBox(paths);
3179
- const content = paths.map((path) => path.toSvgPathString()).join("");
3133
+ const content = paths.map((path) => path.toSVGPathString()).join("");
3180
3134
  return `<svg viewBox="${x} ${y} ${width} ${height}" width="${width}px" height="${height}px" xmlns="http://www.w3.org/2000/svg">${content}</svg>`;
3181
3135
  }
3182
- function pathsToSvgUrl(paths) {
3183
- return `data:image/svg+xml;base64,${btoa(pathsToSvgString(paths))}`;
3136
+ function pathsToSVGUrl(paths) {
3137
+ return `data:image/svg+xml;base64,${btoa(pathsToSVGString(paths))}`;
3184
3138
  }
3185
- function pathsToSvg(paths) {
3186
- return new DOMParser().parseFromString(pathsToSvgString(paths), "image/svg+xml").documentElement;
3139
+ function pathsToSVG(paths) {
3140
+ return new DOMParser().parseFromString(pathsToSVGString(paths), "image/svg+xml").documentElement;
3187
3141
  }
3188
3142
  function pathsToCanvas(paths, options = {}) {
3189
3143
  const { pixelRatio = 2, ...style } = options;
@@ -3223,12 +3177,12 @@ exports.addPathCommandsToPath2D = addPathCommandsToPath2D;
3223
3177
  exports.getPathsBoundingBox = getPathsBoundingBox;
3224
3178
  exports.parseArcCommand = parseArcCommand;
3225
3179
  exports.parsePathDataArgs = parsePathDataArgs;
3226
- exports.parseSvg = parseSvg;
3227
- exports.parseSvgToDom = parseSvgToDom;
3180
+ exports.parseSVG = parseSVG;
3181
+ exports.parseSVGToDOM = parseSVGToDOM;
3228
3182
  exports.pathCommandsToPathData = pathCommandsToPathData;
3229
3183
  exports.pathDataToPathCommands = pathDataToPathCommands;
3230
3184
  exports.pathsToCanvas = pathsToCanvas;
3231
- exports.pathsToSvg = pathsToSvg;
3232
- exports.pathsToSvgString = pathsToSvgString;
3233
- exports.pathsToSvgUrl = pathsToSvgUrl;
3185
+ exports.pathsToSVG = pathsToSVG;
3186
+ exports.pathsToSVGString = pathsToSVGString;
3187
+ exports.pathsToSVGUrl = pathsToSVGUrl;
3234
3188
  exports.setCanvasContext = setCanvasContext;
package/dist/index.d.cts CHANGED
@@ -447,10 +447,10 @@ declare class Path2D {
447
447
  drawControlPointsTo(ctx: CanvasRenderingContext2D, style?: Partial<PathStyle>): this;
448
448
  toCommands(): PathCommand[];
449
449
  toData(): string;
450
- toSvgPathString(): string;
451
- toSvgString(): string;
452
- toSvgUrl(): string;
453
- toSvg(): SVGElement;
450
+ toSVGPathString(): string;
451
+ toSVGString(): string;
452
+ toSVGUrl(): string;
453
+ toSVG(): SVGElement;
454
454
  toCanvas(options?: Partial<PathStyle & {
455
455
  pixelRatio: number;
456
456
  }>): HTMLCanvasElement;
@@ -482,15 +482,15 @@ declare function pathCommandsToPathData(commands: PathCommand[]): string;
482
482
 
483
483
  declare function pathDataToPathCommands(d: string): PathCommand[];
484
484
 
485
- declare function parseSvgToDom(svg: string | SVGElement): SVGElement;
486
- declare function parseSvg(svg: string | SVGElement): Path2D[];
485
+ declare function parseSVGToDOM(svg: string | SVGElement): SVGElement;
486
+ declare function parseSVG(svg: string | SVGElement): Path2D[];
487
487
 
488
488
  declare function getPathsBoundingBox(paths: Path2D[], withStyle?: boolean): BoundingBox | undefined;
489
- declare function pathsToSvgString(paths: Path2D[]): string;
490
- declare function pathsToSvgUrl(paths: Path2D[]): string;
491
- declare function pathsToSvg(paths: Path2D[]): SVGElement;
489
+ declare function pathsToSVGString(paths: Path2D[]): string;
490
+ declare function pathsToSVGUrl(paths: Path2D[]): string;
491
+ declare function pathsToSVG(paths: Path2D[]): SVGElement;
492
492
  declare function pathsToCanvas(paths: Path2D[], options?: Partial<PathStyle & {
493
493
  pixelRatio: number;
494
494
  }>): HTMLCanvasElement;
495
495
 
496
- export { BoundingBox, CircleCurve, CubicBezierCurve, Curve, CurvePath, EllipseCurve, type FillRule, HeartCurve, LineCurve, Matrix3, Path2D, type PathCommand, type PathDrawStyle, type PathStyle, PloygonCurve, QuadraticBezierCurve, RectangularCurve, SplineCurve, type StrokeLinecap, type StrokeLinejoin, Vector2, type VectorLike, addPathCommandsToPath2D, getPathsBoundingBox, parseArcCommand, parsePathDataArgs, parseSvg, parseSvgToDom, pathCommandsToPathData, pathDataToPathCommands, pathsToCanvas, pathsToSvg, pathsToSvgString, pathsToSvgUrl, setCanvasContext };
496
+ export { BoundingBox, CircleCurve, CubicBezierCurve, Curve, CurvePath, EllipseCurve, type FillRule, HeartCurve, LineCurve, Matrix3, Path2D, type PathCommand, type PathDrawStyle, type PathStyle, PloygonCurve, QuadraticBezierCurve, RectangularCurve, SplineCurve, type StrokeLinecap, type StrokeLinejoin, Vector2, type VectorLike, addPathCommandsToPath2D, getPathsBoundingBox, parseArcCommand, parsePathDataArgs, parseSVG, parseSVGToDOM, pathCommandsToPathData, pathDataToPathCommands, pathsToCanvas, pathsToSVG, pathsToSVGString, pathsToSVGUrl, setCanvasContext };
package/dist/index.d.mts CHANGED
@@ -447,10 +447,10 @@ declare class Path2D {
447
447
  drawControlPointsTo(ctx: CanvasRenderingContext2D, style?: Partial<PathStyle>): this;
448
448
  toCommands(): PathCommand[];
449
449
  toData(): string;
450
- toSvgPathString(): string;
451
- toSvgString(): string;
452
- toSvgUrl(): string;
453
- toSvg(): SVGElement;
450
+ toSVGPathString(): string;
451
+ toSVGString(): string;
452
+ toSVGUrl(): string;
453
+ toSVG(): SVGElement;
454
454
  toCanvas(options?: Partial<PathStyle & {
455
455
  pixelRatio: number;
456
456
  }>): HTMLCanvasElement;
@@ -482,15 +482,15 @@ declare function pathCommandsToPathData(commands: PathCommand[]): string;
482
482
 
483
483
  declare function pathDataToPathCommands(d: string): PathCommand[];
484
484
 
485
- declare function parseSvgToDom(svg: string | SVGElement): SVGElement;
486
- declare function parseSvg(svg: string | SVGElement): Path2D[];
485
+ declare function parseSVGToDOM(svg: string | SVGElement): SVGElement;
486
+ declare function parseSVG(svg: string | SVGElement): Path2D[];
487
487
 
488
488
  declare function getPathsBoundingBox(paths: Path2D[], withStyle?: boolean): BoundingBox | undefined;
489
- declare function pathsToSvgString(paths: Path2D[]): string;
490
- declare function pathsToSvgUrl(paths: Path2D[]): string;
491
- declare function pathsToSvg(paths: Path2D[]): SVGElement;
489
+ declare function pathsToSVGString(paths: Path2D[]): string;
490
+ declare function pathsToSVGUrl(paths: Path2D[]): string;
491
+ declare function pathsToSVG(paths: Path2D[]): SVGElement;
492
492
  declare function pathsToCanvas(paths: Path2D[], options?: Partial<PathStyle & {
493
493
  pixelRatio: number;
494
494
  }>): HTMLCanvasElement;
495
495
 
496
- export { BoundingBox, CircleCurve, CubicBezierCurve, Curve, CurvePath, EllipseCurve, type FillRule, HeartCurve, LineCurve, Matrix3, Path2D, type PathCommand, type PathDrawStyle, type PathStyle, PloygonCurve, QuadraticBezierCurve, RectangularCurve, SplineCurve, type StrokeLinecap, type StrokeLinejoin, Vector2, type VectorLike, addPathCommandsToPath2D, getPathsBoundingBox, parseArcCommand, parsePathDataArgs, parseSvg, parseSvgToDom, pathCommandsToPathData, pathDataToPathCommands, pathsToCanvas, pathsToSvg, pathsToSvgString, pathsToSvgUrl, setCanvasContext };
496
+ export { BoundingBox, CircleCurve, CubicBezierCurve, Curve, CurvePath, EllipseCurve, type FillRule, HeartCurve, LineCurve, Matrix3, Path2D, type PathCommand, type PathDrawStyle, type PathStyle, PloygonCurve, QuadraticBezierCurve, RectangularCurve, SplineCurve, type StrokeLinecap, type StrokeLinejoin, Vector2, type VectorLike, addPathCommandsToPath2D, getPathsBoundingBox, parseArcCommand, parsePathDataArgs, parseSVG, parseSVGToDOM, pathCommandsToPathData, pathDataToPathCommands, pathsToCanvas, pathsToSVG, pathsToSVGString, pathsToSVGUrl, setCanvasContext };
package/dist/index.d.ts CHANGED
@@ -447,10 +447,10 @@ declare class Path2D {
447
447
  drawControlPointsTo(ctx: CanvasRenderingContext2D, style?: Partial<PathStyle>): this;
448
448
  toCommands(): PathCommand[];
449
449
  toData(): string;
450
- toSvgPathString(): string;
451
- toSvgString(): string;
452
- toSvgUrl(): string;
453
- toSvg(): SVGElement;
450
+ toSVGPathString(): string;
451
+ toSVGString(): string;
452
+ toSVGUrl(): string;
453
+ toSVG(): SVGElement;
454
454
  toCanvas(options?: Partial<PathStyle & {
455
455
  pixelRatio: number;
456
456
  }>): HTMLCanvasElement;
@@ -482,15 +482,15 @@ declare function pathCommandsToPathData(commands: PathCommand[]): string;
482
482
 
483
483
  declare function pathDataToPathCommands(d: string): PathCommand[];
484
484
 
485
- declare function parseSvgToDom(svg: string | SVGElement): SVGElement;
486
- declare function parseSvg(svg: string | SVGElement): Path2D[];
485
+ declare function parseSVGToDOM(svg: string | SVGElement): SVGElement;
486
+ declare function parseSVG(svg: string | SVGElement): Path2D[];
487
487
 
488
488
  declare function getPathsBoundingBox(paths: Path2D[], withStyle?: boolean): BoundingBox | undefined;
489
- declare function pathsToSvgString(paths: Path2D[]): string;
490
- declare function pathsToSvgUrl(paths: Path2D[]): string;
491
- declare function pathsToSvg(paths: Path2D[]): SVGElement;
489
+ declare function pathsToSVGString(paths: Path2D[]): string;
490
+ declare function pathsToSVGUrl(paths: Path2D[]): string;
491
+ declare function pathsToSVG(paths: Path2D[]): SVGElement;
492
492
  declare function pathsToCanvas(paths: Path2D[], options?: Partial<PathStyle & {
493
493
  pixelRatio: number;
494
494
  }>): HTMLCanvasElement;
495
495
 
496
- export { BoundingBox, CircleCurve, CubicBezierCurve, Curve, CurvePath, EllipseCurve, type FillRule, HeartCurve, LineCurve, Matrix3, Path2D, type PathCommand, type PathDrawStyle, type PathStyle, PloygonCurve, QuadraticBezierCurve, RectangularCurve, SplineCurve, type StrokeLinecap, type StrokeLinejoin, Vector2, type VectorLike, addPathCommandsToPath2D, getPathsBoundingBox, parseArcCommand, parsePathDataArgs, parseSvg, parseSvgToDom, pathCommandsToPathData, pathDataToPathCommands, pathsToCanvas, pathsToSvg, pathsToSvgString, pathsToSvgUrl, setCanvasContext };
496
+ export { BoundingBox, CircleCurve, CubicBezierCurve, Curve, CurvePath, EllipseCurve, type FillRule, HeartCurve, LineCurve, Matrix3, Path2D, type PathCommand, type PathDrawStyle, type PathStyle, PloygonCurve, QuadraticBezierCurve, RectangularCurve, SplineCurve, type StrokeLinecap, type StrokeLinejoin, Vector2, type VectorLike, addPathCommandsToPath2D, getPathsBoundingBox, parseArcCommand, parsePathDataArgs, parseSVG, parseSVGToDOM, pathCommandsToPathData, pathDataToPathCommands, pathsToCanvas, pathsToSVG, pathsToSVGString, pathsToSVGUrl, setCanvasContext };
package/dist/index.js CHANGED
@@ -1 +1,2 @@
1
- (function(p,C){typeof exports=="object"&&typeof module<"u"?C(exports):typeof define=="function"&&define.amd?define(["exports"],C):(p=typeof globalThis<"u"?globalThis:p||self,C(p.modernPath2d={}))})(this,function(p){"use strict";var ie=Object.defineProperty;var re=(p,C,q)=>C in p?ie(p,C,{enumerable:!0,configurable:!0,writable:!0,value:q}):p[C]=q;var T=(p,C,q)=>re(p,typeof C!="symbol"?C+"":C,q);const C={arcs:"bevel",bevel:"bevel",miter:"miter","miter-clip":"miter",round:"round"};function q(o,e){const{fill:t="#000",stroke:s="none",strokeWidth:i=s==="none"?0:1,strokeLinecap:r="round",strokeLinejoin:n="miter",strokeMiterlimit:c=0,strokeDasharray:a=[],strokeDashoffset:h=0,shadowOffsetX:l=0,shadowOffsetY:y=0,shadowBlur:f=0,shadowColor:d="rgba(0, 0, 0, 0)"}=e;o.fillStyle=t,o.strokeStyle=s,o.lineWidth=i,o.lineCap=r,o.lineJoin=C[n],o.miterLimit=c,o.setLineDash(a),o.lineDashOffset=h,o.shadowOffsetX=l,o.shadowOffsetY=y,o.shadowBlur=f,o.shadowColor=d}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)}get array(){return[this.x,this.y]}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}multiply(e){return this.x*=e.x,this.y*=e.y,this}divide(e){return this.x/=e.x,this.y/=e.y,this}dot(e){return this.x*e.x+this.y*e.y}cross(e){return this.x*e.y-this.y*e.x}rotate(e,t={x:0,y:0}){const s=-e/180*Math.PI,i=this.x-t.x,r=-(this.y-t.y),n=Math.sin(s),c=Math.cos(s);return this.set(t.x+(i*c-r*n),t.y-(i*n+r*c)),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}lengthSquared(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.lengthSquared())}scale(e,t=e,s={x:0,y:0}){const i=e<0?s.x-this.x+s.x:this.x,r=t<0?s.y-this.y+s.y:this.y;return this.x=i*Math.abs(e),this.y=r*Math.abs(t),this}skew(e,t=0,s={x:0,y:0}){const i=this.x-s.x,r=this.y-s.y;return this.x=s.x+(i+Math.tan(e)*r),this.y=s.y+(r+Math.tan(t)*i),this}min(...e){return this.x=Math.min(this.x,...e.map(t=>t.x)),this.y=Math.min(this.y,...e.map(t=>t.y)),this}max(...e){return this.x=Math.max(this.x,...e.map(t=>t.x)),this.y=Math.max(this.y,...e.map(t=>t.y)),this}normalize(){return this.scale(1/(this.length()||1))}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this}multiplyVectors(e,t){return this.x=e.x*t.x,this.y=e.y*t.y,this}divideVectors(e,t){return this.x=e.x/t.x,this.y=e.y/t.y,this}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,i=e.elements;return this.x=i[0]*t+i[3]*s+i[6],this.y=i[1]*t+i[4]*s+i[7],this}copy(e){return this.x=e.x,this.y=e.y,this}clone(){return new u(this.x,this.y)}}class L{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}get center(){return new u((this.left+this.right)/2,(this.top+this.bottom)/2)}get array(){return[this.left,this.top,this.width,this.height]}static from(...e){if(e.length===0)return new L;if(e.length===1)return e[0].clone();const t=e[0],s=e.slice(1).reduce((i,r)=>(i.left=Math.min(i.left,r.left),i.top=Math.min(i.top,r.top),i.right=Math.max(i.right,r.right),i.bottom=Math.max(i.bottom,r.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 L(s.left,s.top,s.right-s.left,s.bottom-s.top)}translate(e,t){return this.left+=e,this.top+=t,this}copy(e){return this.left=e.left,this.top=e.top,this.width=e.width,this.height=e.height,this}clone(){return new L(this.left,this.top,this.width,this.height)}}class b{constructor(e=1,t=0,s=0,i=0,r=1,n=0,c=0,a=0,h=1){T(this,"elements",[]);this.set(e,t,s,i,r,n,c,a,h)}set(e,t,s,i,r,n,c,a,h){const l=this.elements;return l[0]=e,l[1]=i,l[2]=c,l[3]=t,l[4]=r,l[5]=a,l[6]=s,l[7]=n,l[8]=h,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,r=this.elements,n=s[0],c=s[3],a=s[6],h=s[1],l=s[4],y=s[7],f=s[2],d=s[5],g=s[8],x=i[0],m=i[3],w=i[6],E=i[1],v=i[4],S=i[7],N=i[2],z=i[5],D=i[8];return r[0]=n*x+c*E+a*N,r[3]=n*m+c*v+a*z,r[6]=n*w+c*S+a*D,r[1]=h*x+l*E+y*N,r[4]=h*m+l*v+y*z,r[7]=h*w+l*S+y*D,r[2]=f*x+d*E+g*N,r[5]=f*m+d*v+g*z,r[8]=f*w+d*S+g*D,this}invert(){const e=this.elements,t=e[0],s=e[1],i=e[2],r=e[3],n=e[4],c=e[5],a=e[6],h=e[7],l=e[8],y=l*n-c*h,f=c*a-l*r,d=h*r-n*a,g=t*y+s*f+i*d;if(g===0)return this.set(0,0,0,0,0,0,0,0,0);const x=1/g;return e[0]=y*x,e[1]=(i*h-l*s)*x,e[2]=(c*s-i*n)*x,e[3]=f*x,e[4]=(l*t-i*a)*x,e[5]=(i*r-c*t)*x,e[6]=d*x,e[7]=(s*a-h*t)*x,e[8]=(n*t-s*r)*x,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(W.makeScale(e,t)),this}rotate(e){return this.premultiply(W.makeRotation(-e)),this}translate(e,t){return this.premultiply(W.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 W=new b;function K(o,e,t,s){const i=o*t+e*s,r=Math.sqrt(o*o+e*e)*Math.sqrt(t*t+s*s);let n=Math.acos(Math.max(-1,Math.min(1,i/r)));return o*s-e*t<0&&(n=-n),n}function tt(o,e,t,s,i,r,n,c){if(e===0||t===0){o.lineTo(c.x,c.y);return}s=s*Math.PI/180,e=Math.abs(e),t=Math.abs(t);const a=(n.x-c.x)/2,h=(n.y-c.y)/2,l=Math.cos(s)*a+Math.sin(s)*h,y=-Math.sin(s)*a+Math.cos(s)*h;let f=e*e,d=t*t;const g=l*l,x=y*y,m=g/f+x/d;if(m>1){const Ct=Math.sqrt(m);e=Ct*e,t=Ct*t,f=e*e,d=t*t}const w=f*x+d*g,E=(f*d-w)/w;let v=Math.sqrt(Math.max(0,E));i===r&&(v=-v);const S=v*e*y/t,N=-v*t*l/e,z=Math.cos(s)*S-Math.sin(s)*N+(n.x+c.x)/2,D=Math.sin(s)*S+Math.cos(s)*N+(n.y+c.y)/2,U=K(1,0,(l-S)/e,(y-N)/t),J=K((l-S)/e,(y-N)/t,(-l-S)/e,(-y-N)/t)%(Math.PI*2);o.ellipse(z,D,e,t,s,U,U+J,r===0)}function O(o,e){return o-(e-o)}function Y(o,e){const t=new u,s=new u;for(let i=0,r=o.length;i<r;i++){const n=o[i];if(n.type==="m"||n.type==="M")n.type==="m"?t.add(n):t.copy(n),e.moveTo(t.x,t.y),s.copy(t);else if(n.type==="h"||n.type==="H")n.type==="h"?t.x+=n.x:t.x=n.x,e.lineTo(t.x,t.y),s.copy(t);else if(n.type==="v"||n.type==="V")n.type==="v"?t.y+=n.y:t.y=n.y,e.lineTo(t.x,t.y),s.copy(t);else if(n.type==="l"||n.type==="L")n.type==="l"?t.add(n):t.copy(n),e.lineTo(t.x,t.y),s.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.add(n)):(e.bezierCurveTo(n.x1,n.y1,n.x2,n.y2,n.x,n.y),s.x=n.x2,s.y=n.y2,t.copy(n));else if(n.type==="s"||n.type==="S")n.type==="s"?(e.bezierCurveTo(O(t.x,s.x),O(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.add(n)):(e.bezierCurveTo(O(t.x,s.x),O(t.y,s.y),n.x2,n.y2,n.x,n.y),s.x=n.x2,s.y=n.y2,t.copy(n));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.add(n)):(e.quadraticCurveTo(n.x1,n.y1,n.x,n.y),s.x=n.x1,s.y=n.y1,t.copy(n));else if(n.type==="t"||n.type==="T"){const c=O(t.x,s.x),a=O(t.y,s.y);s.x=c,s.y=a,n.type==="t"?(e.quadraticCurveTo(c,a,t.x+n.x,t.y+n.y),t.add(n)):(e.quadraticCurveTo(c,a,n.x,n.y),t.copy(n))}else if(n.type==="a"||n.type==="A"){const c=t.clone();if(n.type==="a"){if(n.x===0&&n.y===0)continue;t.add(n)}else{if(t.equals(n))continue;t.copy(n)}s.copy(t),tt(e,n.rx,n.ry,n.angle,n.largeArcFlag,n.sweepFlag,c,t)}else n.type==="z"||n.type==="Z"?(e.startPoint&&t.copy(e.startPoint),e.closePath()):console.warn("Unsupported commands",n)}}const P={SEPARATOR:/[ \t\r\n,.\-+]/,WHITESPACE:/[ \t\r\n]/,DIGIT:/\d/,SIGN:/[-+]/,POINT:/\./,COMMA:/,/,EXP:/e/i,FLAGS:/[01]/};function A(o,e,t=0){let c=0,a=!0,h="",l="";const y=[];function f(m,w,E){const v=new SyntaxError(`Unexpected character "${m}" at index ${w}.`);throw v.partial=E,v}function d(){h!==""&&(l===""?y.push(Number(h)):y.push(Number(h)*10**Number(l))),h="",l=""}let g;const x=o.length;for(let m=0;m<x;m++){if(g=o[m],Array.isArray(e)&&e.includes(y.length%t)&&P.FLAGS.test(g)){c=1,h=g,d();continue}if(c===0){if(P.WHITESPACE.test(g))continue;if(P.DIGIT.test(g)||P.SIGN.test(g)){c=1,h=g;continue}if(P.POINT.test(g)){c=2,h=g;continue}P.COMMA.test(g)&&(a&&f(g,m,y),a=!0)}if(c===1){if(P.DIGIT.test(g)){h+=g;continue}if(P.POINT.test(g)){h+=g,c=2;continue}if(P.EXP.test(g)){c=3;continue}P.SIGN.test(g)&&h.length===1&&P.SIGN.test(h[0])&&f(g,m,y)}if(c===2){if(P.DIGIT.test(g)){h+=g;continue}if(P.EXP.test(g)){c=3;continue}P.POINT.test(g)&&h[h.length-1]==="."&&f(g,m,y)}if(c===3){if(P.DIGIT.test(g)){l+=g;continue}if(P.SIGN.test(g)){if(l===""){l+=g;continue}l.length===1&&P.SIGN.test(l)&&f(g,m,y)}}P.WHITESPACE.test(g)?(d(),c=0,a=!1):P.COMMA.test(g)?(d(),c=0,a=!0):P.SIGN.test(g)?(d(),c=1,h=g):P.POINT.test(g)?(d(),c=2,h=g):f(g,m,y)}return d(),y}function et(o){let e,t;const s=[];for(let i=0,r=o.length;i<r;i++){const n=o[i];switch(n.type){case"m":case"M":if(n.x.toFixed(4)===(t==null?void 0:t.x.toFixed(4))&&n.y.toFixed(4)===(t==null?void 0:t.y.toFixed(4)))continue;s.push(`${n.type} ${n.x} ${n.y}`),t={x:n.x,y:n.y},e={x:n.x,y:n.y};break;case"h":case"H":s.push(`${n.type} ${n.x}`),t={x:n.x,y:(t==null?void 0:t.y)??0};break;case"v":case"V":s.push(`${n.type} ${n.y}`),t={x:(t==null?void 0:t.x)??0,y:n.y};break;case"l":case"L":s.push(`${n.type} ${n.x} ${n.y}`),t={x:n.x,y:n.y};break;case"c":case"C":s.push(`${n.type} ${n.x1} ${n.y1} ${n.x2} ${n.y2} ${n.x} ${n.y}`),t={x:n.x,y:n.y};break;case"s":case"S":s.push(`${n.type} ${n.x2} ${n.y2} ${n.x} ${n.y}`),t={x:n.x,y:n.y};break;case"q":case"Q":s.push(`${n.type} ${n.x1} ${n.y1} ${n.x} ${n.y}`),t={x:n.x,y:n.y};break;case"t":case"T":s.push(`${n.type} ${n.x} ${n.y}`),t={x:n.x,y:n.y};break;case"a":case"A":s.push(`${n.type} ${n.rx} ${n.ry} ${n.angle} ${n.largeArcFlag} ${n.sweepFlag} ${n.x} ${n.y}`),t={x:n.x,y:n.y};break;case"z":case"Z":s.push(n.type),e&&(t={x:e.x,y:e.y});break}}return s.join(" ")}const vt=/[a-df-z][^a-df-z]*/gi;function G(o){const e=[],t=o.match(vt);if(!t)return e;for(let s=0,i=t.length;s<i;s++){const r=t[s],n=r.charAt(0),c=r.slice(1).trim();let a;switch(n){case"m":case"M":a=A(c);for(let h=0,l=a.length;h<l;h+=2)h===0?e.push({type:n,x:a[h],y:a[h+1]}):e.push({type:n==="m"?"l":"L",x:a[h],y:a[h+1]});break;case"h":case"H":a=A(c);for(let h=0,l=a.length;h<l;h++)e.push({type:n,x:a[h]});break;case"v":case"V":a=A(c);for(let h=0,l=a.length;h<l;h++)e.push({type:n,y:a[h]});break;case"l":case"L":a=A(c);for(let h=0,l=a.length;h<l;h+=2)e.push({type:n,x:a[h],y:a[h+1]});break;case"c":case"C":a=A(c);for(let h=0,l=a.length;h<l;h+=6)e.push({type:n,x1:a[h],y1:a[h+1],x2:a[h+2],y2:a[h+3],x:a[h+4],y:a[h+5]});break;case"s":case"S":a=A(c);for(let h=0,l=a.length;h<l;h+=4)e.push({type:n,x2:a[h],y2:a[h+1],x:a[h+2],y:a[h+3]});break;case"q":case"Q":a=A(c);for(let h=0,l=a.length;h<l;h+=4)e.push({type:n,x1:a[h],y1:a[h+1],x:a[h+2],y:a[h+3]});break;case"t":case"T":a=A(c);for(let h=0,l=a.length;h<l;h+=2)e.push({type:n,x:a[h],y:a[h+1]});break;case"a":case"A":a=A(c,[3,4],7);for(let h=0,l=a.length;h<l;h+=7)e.push({type:n,rx:a[h],ry:a[h+1],angle:a[h+2],largeArcFlag:a[h+3],sweepFlag:a[h+4],x:a[h+5],y:a[h+6]});break;case"z":case"Z":e.push({type:n});break;default:console.warn(r)}}return e}class k{constructor(){T(this,"arcLengthDivisions",200);T(this,"_cacheArcLengths");T(this,"_needsUpdate",!1)}isClockwise(){const e=this.getPoint(1),t=this.getPoint(.5),s=this.getPoint(1);return(t.x-e.x)*(s.y-t.y)-(t.y-e.y)*(s.x-t.x)<0}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}forEachControlPoints(e){return this.getControlPoints().forEach(e),this}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),r=0;t.push(0);for(let n=1;n<=e;n++)s=this.getPoint(n/e),r+=s.distanceTo(i),t.push(r),i=s;return this._cacheArcLengths=t,t}updateArcLengths(){this._needsUpdate=!0,this.getLengths()}getUToTMapping(e,t){const s=this.getLengths();let i=0;const r=s.length;let n;t?n=t:n=e*s[r-1];let c=0,a=r-1,h;for(;c<=a;)if(i=Math.floor(c+(a-c)/2),h=s[i]-n,h<0)c=i+1;else if(h>0)a=i-1;else{a=i;break}if(i=a,s[i]===n)return i/(r-1);const l=s[i],f=s[i+1]-l,d=(n-l)/f;return(i+d)/(r-1)}getTangent(e,t=new u){const i=Math.max(0,e-1e-4),r=Math.min(1,e+1e-4);return t.copy(this.getPoint(r).sub(this.getPoint(i)).normalize())}getTangentAt(e,t){return this.getTangent(this.getUToTMapping(e),t)}getNormal(e,t=new u){return this.getTangent(e,t),t.set(-t.y,t.x).normalize()}getNormalAt(e,t){return this.getNormal(this.getUToTMapping(e),t)}getTForPoint(e,t=.001){let s=0,i=1,r=(s+i)/2;for(;i-s>t;){r=(s+i)/2;const n=this.getPoint(r);if(n.distanceTo(e)<t)return r;n.x<e.x?s=r:i=r}return r}matrix(e){return this.forEachControlPoints(t=>t.applyMatrix3(e)),this}getMinMax(e=u.MAX,t=u.MIN){return this.getPoints().forEach(s=>{e.min(s),t.max(s)}),{min:e,max:t}}getBoundingBox(){const{min:e,max:t}=this.getMinMax();return new L(e.x,e.y,t.x-e.x,t.y-e.y)}toCommands(){return this.getPoints().map((e,t)=>t===0?{type:"M",x:e.x,y:e.y}:{type:"L",x:e.x,y:e.y})}toData(){return et(this.toCommands())}drawTo(e){return this.toCommands().forEach(t=>{switch(t.type){case"M":e.moveTo(t.x,t.y);break;case"L":e.lineTo(t.x,t.y);break}}),this}copy(e){return this.arcLengthDivisions=e.arcLengthDivisions,this}clone(){return new this.constructor().copy(this)}}class R extends k{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().scale(t))}getTangent(e,t=new u){const{x:s,y:i}=this.getNormal(e);return t.set(-i,s)}getNormal(e,t=new u){const{start:s,end:i}=this,r=e*(i-s)+s-.5*Math.PI;return t.set(Math.cos(r),Math.sin(r))}getControlPoints(){return[this.center]}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 st(o,e,t,s,i){const r=(s-e)*.5,n=(i-t)*.5,c=o*o,a=o*c;return(2*t-2*s+r+n)*a+(-3*t+3*s-2*r-n)*c+r*o+t}function bt(o,e){const t=1-o;return t*t*e}function At(o,e){return 2*(1-o)*o*e}function kt(o,e){return o*o*e}function nt(o,e,t,s){return bt(o,e)+At(o,t)+kt(o,s)}function It(o,e){const t=1-o;return t*t*t*e}function St(o,e){const t=1-o;return 3*t*t*o*e}function Nt(o,e){return 3*(1-o)*o*o*e}function $t(o,e){return o*o*o*e}function it(o,e,t,s,i){return It(o,e)+St(o,t)+Nt(o,s)+$t(o,i)}class rt extends k{constructor(e=new u,t=new u,s=new u,i=new u){super(),this.start=e,this.startControl=t,this.endControl=s,this.end=i}getPoint(e,t=new u){const{start:s,startControl:i,endControl:r,end:n}=this;return t.set(it(e,s.x,i.x,r.x,n.x),it(e,s.y,i.y,r.y,n.y))}getControlPoints(){return[this.start,this.startControl,this.endControl,this.end]}_solveQuadratic(e,t,s){const i=t*t-4*e*s;if(i<0)return[];const r=Math.sqrt(i),n=(-t+r)/(2*e),c=(-t-r)/(2*e);return[n,c].filter(a=>a>=0&&a<=1)}getMinMax(e=u.MAX,t=u.MIN){const s=this.start,i=this.startControl,r=this.endControl,n=this.end,c=this._solveQuadratic(3*(i.x-s.x),6*(r.x-i.x),3*(n.x-r.x)),a=this._solveQuadratic(3*(i.y-s.y),6*(r.y-i.y),3*(n.y-r.y)),h=[0,1,...c,...a];return((y,f)=>{for(const d of y)for(let g=0;g<=f;g++){const x=g/f-.5,m=Math.min(1,Math.max(0,d+x)),w=this.getPoint(m);e.x=Math.min(e.x,w.x),e.y=Math.min(e.y,w.y),t.x=Math.max(t.x,w.x),t.y=Math.max(t.y,w.y)}})(h,10),{min:e,max:t}}toCommands(){const{start:e,startControl:t,endControl:s,end: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{start:t,startControl:s,endControl:i,end:r}=this;return e.lineTo(t.x,t.y),e.bezierCurveTo(s.x,s.y,i.x,i.y,r.x,r.y),this}copy(e){return super.copy(e),this.start.copy(e.start),this.startControl.copy(e.startControl),this.endControl.copy(e.endControl),this.end.copy(e.end),this}}const Et=new b,ot=new b,ht=new b,_=new u;class at extends k{constructor(e=new u,t=1,s=1,i=0,r=0,n=Math.PI*2,c=!1){super(),this.center=e,this.radiusX=t,this.radiusY=s,this.rotation=i,this.startAngle=r,this.endAngle=n,this.clockwise=c}isClockwise(){return this.clockwise}getPoint(e,t=new u){const s=Math.PI*2;let i=this.endAngle-this.startAngle;const r=Math.abs(i)<Number.EPSILON;for(;i<0;)i+=s;for(;i>s;)i-=s;i<Number.EPSILON&&(r?i=0:i=s),this.clockwise&&!r&&(i===s?i=-s:i=i-s);const n=this.startAngle+e*i;let c=this.center.x+this.radiusX*Math.cos(n),a=this.center.y+this.radiusY*Math.sin(n);if(this.rotation!==0){const h=Math.cos(this.rotation),l=Math.sin(this.rotation),y=c-this.center.x,f=a-this.center.y;c=y*h-f*l+this.center.x,a=y*l+f*h+this.center.y}return t.set(c,a)}toCommands(){const{center:e,radiusX:t,radiusY:s,startAngle:i,endAngle:r,clockwise:n,rotation:c}=this,{x:a,y:h}=e,l=a+t*Math.cos(i)*Math.cos(c)-s*Math.sin(i)*Math.sin(c),y=h+t*Math.cos(i)*Math.sin(c)+s*Math.sin(i)*Math.cos(c),f=Math.abs(i-r),d=f>Math.PI?1:0,g=n?1:0,x=c*180/Math.PI;if(f>=2*Math.PI){const m=i+Math.PI,w=a+t*Math.cos(m)*Math.cos(c)-s*Math.sin(m)*Math.sin(c),E=h+t*Math.cos(m)*Math.sin(c)+s*Math.sin(m)*Math.cos(c);return[{type:"M",x:l,y},{type:"A",rx:t,ry:s,angle:x,largeArcFlag:0,sweepFlag:g,x:w,y:E},{type:"A",rx:t,ry:s,angle:x,largeArcFlag:0,sweepFlag:g,x:l,y}]}else{const m=a+t*Math.cos(r)*Math.cos(c)-s*Math.sin(r)*Math.sin(c),w=h+t*Math.cos(r)*Math.sin(c)+s*Math.sin(r)*Math.cos(c);return[{type:"M",x:l,y},{type:"A",rx:t,ry:s,angle:x,largeArcFlag:d,sweepFlag:g,x:m,y:w}]}}drawTo(e){const{center:t,radiusX:s,radiusY:i,rotation:r,startAngle:n,endAngle:c,clockwise:a}=this;return e.ellipse(t.x,t.y,s,i,r,n,c,!a),this}matrix(e){return _.set(this.center.x,this.center.y),_.applyMatrix3(e),this.center.x=_.x,this.center.y=_.y,zt(e)?Lt(this,e):qt(this,e),this}getControlPoints(){return[this.center]}getMinMax(e=u.MAX,t=u.MIN){const{center:s,radiusX:i,radiusY:r,rotation:n}=this,{x:c,y:a}=s,h=Math.cos(n),l=Math.sin(n),y=Math.sqrt(i*i*h*h+r*r*l*l),f=Math.sqrt(i*i*l*l+r*r*h*h);return e.x=Math.min(e.x,c-y),e.y=Math.min(e.y,a-f),t.x=Math.max(t.x,c+y),t.y=Math.max(t.y,a+f),{min:e,max:t}}copy(e){return super.copy(e),this.center.x=e.center.x,this.center.y=e.center.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 Lt(o,e){const t=o.radiusX,s=o.radiusY,i=Math.cos(o.rotation),r=Math.sin(o.rotation),n=new u(t*i,t*r),c=new u(-s*r,s*i),a=n.applyMatrix3(e),h=c.applyMatrix3(e),l=Et.set(a.x,h.x,0,a.y,h.y,0,0,0,1),y=ot.copy(l).invert(),g=ht.copy(y).transpose().multiply(y).elements,x=Dt(g[0],g[1],g[4]),m=Math.sqrt(x.rt1),w=Math.sqrt(x.rt2);if(o.radiusX=1/m,o.radiusY=1/w,o.rotation=Math.atan2(x.sn,x.cs),!((o.endAngle-o.startAngle)%(2*Math.PI)<Number.EPSILON)){const v=ot.set(m,0,0,0,w,0,0,0,1),S=ht.set(x.cs,x.sn,0,-x.sn,x.cs,0,0,0,1),N=v.multiply(S).multiply(l),z=D=>{const{x:U,y:J}=new u(Math.cos(D),Math.sin(D)).applyMatrix3(N);return Math.atan2(J,U)};o.startAngle=z(o.startAngle),o.endAngle=z(o.endAngle),ct(e)&&(o.clockwise=!o.clockwise)}}function qt(o,e){const t=lt(e),s=ut(e);o.radiusX*=t,o.radiusY*=s;const i=t>Number.EPSILON?Math.atan2(e.elements[1],e.elements[0]):Math.atan2(-e.elements[3],e.elements[4]);o.rotation+=i,ct(e)&&(o.startAngle*=-1,o.endAngle*=-1,o.clockwise=!o.clockwise)}function ct(o){const e=o.elements;return e[0]*e[4]-e[1]*e[3]<0}function zt(o){const e=o.elements,t=e[0]*e[3]+e[1]*e[4];if(t===0)return!1;const s=lt(o),i=ut(o);return Math.abs(t/(s*i))>Number.EPSILON}function lt(o){const e=o.elements;return Math.sqrt(e[0]*e[0]+e[1]*e[1])}function ut(o){const e=o.elements;return Math.sqrt(e[3]*e[3]+e[4]*e[4])}function Dt(o,e,t){let s,i,r,n,c;const a=o+t,h=o-t,l=Math.sqrt(h*h+4*e*e);return a>0?(s=.5*(a+l),c=1/s,i=o*c*t-e*c*e):a<0?i=.5*(a-l):(s=.5*l,i=-.5*l),h>0?r=h+l:r=h-l,Math.abs(r)>2*Math.abs(e)?(c=-2*e/r,n=1/Math.sqrt(1+c*c),r=c*n):Math.abs(e)===0?(r=1,n=0):(c=-.5*r/e,r=1/Math.sqrt(1+c*c),n=c*r),h>0&&(c=r,r=-n,n=c),{rt1:s,rt2:i,cs:r,sn:n}}class X extends k{constructor(e=new u,t=new u){super(),this.start=e,this.end=t}getPoint(e,t=new u){return e===1?t.copy(this.end):t.copy(this.end).sub(this.start).scale(e).add(this.start),t}getPointAt(e,t=new u){return this.getPoint(e,t)}getTangent(e,t=new u){return t.subVectors(this.end,this.start).normalize()}getTangentAt(e,t=new u){return this.getTangent(e,t)}getControlPoints(){return[this.start,this.end]}getMinMax(e=u.MAX,t=u.MIN){const{start:s,end: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}}toCommands(){const{start:e,end:t}=this;return[{type:"M",x:e.x,y:e.y},{type:"L",x:t.x,y:t.y}]}drawTo(e){const{start:t,end:s}=this;return e.lineTo(t.x,t.y),e.lineTo(s.x,s.y),this}copy(e){return super.copy(e),this.start.copy(e.start),this.end.copy(e.end),this}}class Xt extends k{constructor(t,s,i=0,r=1){super();T(this,"curveT",0);this.center=t,this.size=s,this.start=i,this.end=r,this.update()}update(){const{x:t,y:s}=this.center,i=new u(t+.5*this.size,s-.5*this.size),r=new u(t-.5*this.size,s-.5*this.size),n=new u(t,s+.5*this.size),c=new R(i,Math.SQRT1_2*this.size,-.25*Math.PI,.75*Math.PI),a=new R(r,Math.SQRT1_2*this.size,-.75*Math.PI,.25*Math.PI),h=new R(n,.5*Math.SQRT1_2*this.size,.75*Math.PI,1.25*Math.PI),l=new u(t,s+this.size),y=new u(t+this.size,s),f=new u().lerpVectors(y,l,.75),d=new u(t-this.size,s),g=new u().lerpVectors(d,l,.75),x=new X(y,f),m=new X(g,d);return this.curves=[c,x,h,m,a],this}getPoint(t){return this.getCurve(t).getPoint(this.curveT)}getPointAt(t){return this.getPoint(t)}getCurve(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 r=.5*Math.PI;return s<r?(i=0,this.curveT=s/r):s<r+.75?(i=1,this.curveT=(s-r)/.75):s<5*Math.PI/8+.75?(i=2,this.curveT=(s-r-.75)/(Math.PI/8)):s<5*Math.PI/8+1.5?(i=3,this.curveT=(s-5*Math.PI/8-.75)/.75):(i=4,this.curveT=(s-5*Math.PI/8-1.5)/r),this.curves[i]}getTangent(t,s){return this.getCurve(t).getTangent(this.curveT,s)}getNormal(t,s){return this.getCurve(t).getNormal(this.curveT,s)}getControlPoints(){return this.curves.flatMap(t=>t.getControlPoints())}getMinMax(t=u.MAX,s=u.MIN){return this.curves.forEach(i=>i.getMinMax(t,s)),{min:t,max:s}}toCommands(){return this.curves.flatMap(t=>t.toCommands())}drawTo(t){return this.curves.forEach(s=>s.drawTo(t)),this}}class Ot extends k{constructor(t,s=0,i=0,r=0,n=1){super();T(this,"curves",[]);T(this,"curveT",0);T(this,"points",[]);this.center=t,this.radius=s,this.number=i,this.start=r,this.end=n,this.update()}update(){for(let t=0;t<this.number;t++){let s=t*2*Math.PI/this.number;s-=.5*Math.PI,this.points.push(new u(this.radius*Math.cos(s),this.radius*Math.sin(s)).add(this.center))}for(let t=0;t<this.number;t++)this.curves.push(new X(this.points[t],this.points[(t+1)%this.number]));return this}getCurve(t){let s=(t*(this.end-this.start)+this.start)%1;s<0&&(s+=1);const i=s*this.number,r=Math.floor(i);return this.curveT=i-r,this.curves[r]}getPoint(t,s){return this.getCurve(t).getPoint(this.curveT,s)}getPointAt(t,s){return this.getPoint(t,s)}getTangent(t,s){return this.getCurve(t).getTangent(this.curveT,s)}getNormal(t,s){return this.getCurve(t).getNormal(this.curveT,s)}getControlPoints(){return this.curves.flatMap(t=>t.getControlPoints())}getMinMax(t=u.MAX,s=u.MIN){return this.curves.forEach(i=>i.getMinMax(t,s)),{min:t,max:s}}toCommands(){return this.curves.flatMap(t=>t.toCommands())}drawTo(t){return this.curves.forEach(s=>s.drawTo(t)),this}}class yt extends k{constructor(e=new u,t=new u,s=new u){super(),this.start=e,this.control=t,this.end=s}getPoint(e,t=new u){const{start:s,control:i,end:r}=this;return t.set(nt(e,s.x,i.x,r.x),nt(e,s.y,i.y,r.y)),t}getControlPoints(){return[this.start,this.control,this.end]}getMinMax(e=u.MAX,t=u.MIN){const{start:s,control:i,end:r}=this,n=.5*(s.x+i.x),c=.5*(s.y+i.y),a=.5*(s.x+r.x),h=.5*(s.y+r.y);return e.x=Math.min(e.x,s.x,r.x,n,a),e.y=Math.min(e.y,s.y,r.y,c,h),t.x=Math.max(t.x,s.x,r.x,n,a),t.y=Math.max(t.y,s.y,r.y,c,h),{min:e,max:t}}toCommands(){const{start:e,control:t,end: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{start:t,control:s,end:i}=this;return e.lineTo(t.x,t.y),e.quadraticCurveTo(s.x,s.y,i.x,i.y),this}copy(e){return super.copy(e),this.start.copy(e.start),this.control.copy(e.control),this.end.copy(e.end),this}}class gt extends k{constructor(t,s,i=1,r=0,n=1){super();T(this,"curves",[]);T(this,"curveT",0);this.center=t,this.rx=s,this.aspectRatio=i,this.start=r,this.end=n,this.update()}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}update(){const{x:t,y:s}=this.center,i=this.rx,r=this.rx/this.aspectRatio,n=[new u(t-i,s-r),new u(t+i,s-r),new u(t+i,s+r),new u(t-i,s+r)];for(let c=0;c<4;c++)this.curves.push(new X(n[c].clone(),n[(c+1)%4].clone()));return this}getCurve(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.curveT=s/this.aspectRatio):s<this.aspectRatio+1?(i=1,this.curveT=(s-this.aspectRatio)/1):s<2*this.aspectRatio+1?(i=2,this.curveT=(s-this.aspectRatio-1)/this.aspectRatio):(i=3,this.curveT=(s-2*this.aspectRatio-1)/1),this.curves[i]}getPoint(t,s){return this.getCurve(t).getPoint(this.curveT,s)}getPointAt(t,s){return this.getPoint(t,s)}getTangent(t,s){return this.getCurve(t).getTangent(this.curveT,s)}getNormal(t,s){return this.getCurve(t).getNormal(this.curveT,s)}getControlPoints(){return this.curves.flatMap(t=>t.getControlPoints())}getMinMax(t=u.MAX,s=u.MIN){return this.curves.forEach(i=>i.getMinMax(t,s)),{min:t,max:s}}toCommands(){return this.curves.flatMap(t=>t.toCommands())}drawTo(t){return this.curves.forEach(s=>s.drawTo(t)),this}}class ft extends k{constructor(e=[]){super(),this.points=e}getPoint(e,t=new u){const{points:s}=this,i=(s.length-1)*e,r=Math.floor(i),n=i-r,c=s[r===0?r:r-1],a=s[r],h=s[r>s.length-2?s.length-1:r+1],l=s[r>s.length-3?s.length-1:r+2];return t.set(st(n,c.x,a.x,h.x,l.x),st(n,c.y,a.y,h.y,l.y)),t}getControlPoints(){return this.points}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 F extends k{constructor(t){super();T(this,"curves",[]);T(this,"startPoint");T(this,"currentPoint");T(this,"autoClose",!1);T(this,"_cacheLengths",[]);t&&this.addPoints(t)}addCurve(t){return this.curves.push(t),this}addPoints(t){this.moveTo(t[0].x,t[0].y);for(let s=1,i=t.length;s<i;s++){const{x:r,y:n}=t[s];this.lineTo(r,n)}return this}addCommands(t){return Y(t,this),this}addData(t){return this.addCommands(G(t)),this}getPoint(t,s=new u){const i=t*this.getLength(),r=this.getCurveLengths();let n=0;for(;n<r.length;){if(r[n]>=i){const c=r[n]-i,a=this.curves[n],h=a.getLength();return a.getPointAt(h===0?0:1-c/h,s)}n++}return s}getControlPoints(){return this.curves.flatMap(t=>t.getControlPoints())}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,r=this.curves.length;i<r;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=[],i=this.curves;let r;for(let n=0,c=i.length;n<c;n++){const h=i[n].getPoints(t);for(let l=0;l<h.length;l++){const y=h[l];r!=null&&r.equals(y)||(s.push(y),r=y)}}return this.autoClose&&s.length>1&&!s[s.length-1].equals(s[0])&&s.push(s[0]),s}_setCurrentPoint(t){return this.currentPoint=new u(t.x,t.y),this.startPoint||(this.startPoint=this.currentPoint.clone()),this}closePath(){const t=this.startPoint;if(t){const s=this.currentPoint;s&&!t.equals(s)&&(this.curves.push(new X(s.clone(),t)),s.copy(t)),this.startPoint=void 0}return this}moveTo(t,s){return this.currentPoint=new u(t,s),this.startPoint=this.currentPoint.clone(),this}lineTo(t,s){const i=this.currentPoint;return i!=null&&i.equals({x:t,y:s})||this.curves.push(new X((i==null?void 0:i.clone())??new u,new u(t,s))),this._setCurrentPoint({x:t,y:s}),this}bezierCurveTo(t,s,i,r,n,c){const a=this.currentPoint;return a!=null&&a.equals({x:n,y:c})||this.curves.push(new rt((a==null?void 0:a.clone())??new u,new u(t,s),new u(i,r),new u(n,c))),this._setCurrentPoint({x:n,y:c}),this}quadraticCurveTo(t,s,i,r){const n=this.currentPoint;return n!=null&&n.equals({x:i,y:r})||this.curves.push(new yt((n==null?void 0:n.clone())??new u,new u(t,s),new u(i,r))),this._setCurrentPoint({x:i,y:r}),this}arc(t,s,i,r,n,c){return this.ellipse(t,s,i,i,0,r,n,c),this}relativeArc(t,s,i,r,n,c){const a=this.currentPoint??new u;return this.arc(t+a.x,s+a.y,i,r,n,c),this}arcTo(t,s,i,r,n){return console.warn("Method arcTo not supported yet"),this}ellipse(t,s,i,r,n,c,a,h=!0){const l=new at(new u(t,s),i,r,n,c,a,!h);if(this.curves.length>0){const y=l.getPoint(0);(!this.currentPoint||!y.equals(this.currentPoint))&&this.lineTo(y.x,y.y)}return this.curves.push(l),this._setCurrentPoint(l.getPoint(1)),this}relativeEllipse(t,s,i,r,n,c,a,h){const l=this.currentPoint??new u;return this.ellipse(t+l.x,s+l.y,i,r,n,c,a,h),this}rect(t,s,i,r){return this.curves.push(new gt(new u(t+i/2,s+r/2),i/2,i/r)),this._setCurrentPoint({x:t,y:s}),this}splineThru(t){const s=this.currentPoint??new u;return this.curves.push(new ft([s].concat(t))),this._setCurrentPoint(t[t.length-1]),this}getMinMax(t=u.MAX,s=u.MIN){return this.curves.forEach(i=>i.getMinMax(t,s)),{min:t,max:s}}getBoundingBox(){const{min:t,max:s}=this.getMinMax();return new L(t.x,t.y,s.x-t.x,s.y-t.y)}toCommands(){return this.curves.flatMap(t=>t.toCommands())}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(r=>r.drawTo(t)),this.autoClose&&t.closePath(),this}copy(t){var s;super.copy(t),this.curves=[];for(let i=0,r=t.curves.length;i<r;i++)this.curves.push(t.curves[i].clone());return this.autoClose=t.autoClose,this.currentPoint=(s=t.currentPoint)==null?void 0:s.clone(),this}}function Ft(o){return o.replace(/[^a-z0-9]/gi,"-").replace(/\B([A-Z])/g,"-$1").toLowerCase()}function Rt(o,e,t,s){const i=e.clone().sub(o),r=s.clone().sub(t),n=t.clone().sub(o),c=i.cross(r);if(c===0)return new u((o.x+t.x)/2,(o.y+t.y)/2);const a=n.cross(r)/c;return Math.abs(a)>1?new u((o.x+t.x)/2,(o.y+t.y)/2):new u(o.x+a*i.x,o.y+a*i.y)}class I{constructor(e,t={}){T(this,"currentPath",new F);T(this,"paths",[this.currentPath]);T(this,"style");e&&(e instanceof I?this.addPath(e):Array.isArray(e)?this.addCommands(e):this.addData(e)),this.style=t}get startPoint(){return this.currentPath.startPoint}get currentPoint(){return this.currentPath.currentPoint}get strokeWidth(){return this.style.strokeWidth??((this.style.stroke??"none")==="none"?0:1)}addPath(e){return e instanceof I?this.paths.push(...e.paths.map(t=>t.clone())):this.paths.push(e),this}closePath(){const e=this.startPoint;return e&&(this.currentPath.closePath(),this.currentPath.curves.length>0&&(this.currentPath=new F().moveTo(e.x,e.y),this.paths.push(this.currentPath))),this}moveTo(e,t){const{currentPoint:s,curves:i}=this.currentPath;return s!=null&&s.equals({x:e,y:t})||(i.length?(this.currentPath=new F().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,r,n){return this.currentPath.bezierCurveTo(e,t,s,i,r,n),this}quadraticCurveTo(e,t,s,i){return this.currentPath.quadraticCurveTo(e,t,s,i),this}arc(e,t,s,i,r,n){return this.currentPath.arc(e,t,s,i,r,n),this}arcTo(e,t,s,i,r){return this.currentPath.arcTo(e,t,s,i,r),this}ellipse(e,t,s,i,r,n,c,a){return this.currentPath.ellipse(e,t,s,i,r,n,c,a),this}rect(e,t,s,i){return this.currentPath.rect(e,t,s,i),this}addCommands(e){return Y(e,this),this}addData(e){return this.addCommands(G(e)),this}splineThru(e){return this.currentPath.splineThru(e),this}getControlPoints(){return this.paths.flatMap(e=>e.getControlPoints())}getCurves(){return this.paths.flatMap(e=>e.curves)}scale(e,t=e,s={x:0,y:0}){return this.getControlPoints().forEach(i=>{i.scale(e,t,s)}),this}skew(e,t=0,s={x:0,y:0}){return this.getControlPoints().forEach(i=>{i.skew(e,t,s)}),this}rotate(e,t={x:0,y:0}){return this.getControlPoints().forEach(s=>{s.rotate(e,t)}),this}bold(e){if(e===0)return this;const t=this.getCurves(),s=[],i=[],r=[];t.forEach((c,a)=>{const h=c.getControlPoints(),l=c.isClockwise();r[a]=h,i[a]=l;const y=h[0],f=h[h.length-1]??y;s.push({start:l?f:y,end:l?y:f,index:a})});const n=[];return s.forEach((c,a)=>{n[a]=[],s.forEach((h,l)=>{l!==a&&h.start.equals(c.end)&&n[a].push(h.index)})}),t.forEach((c,a)=>{const h=i[a];r[a].forEach(y=>{const f=c.getTForPoint(y),d=c.getNormal(f).scale(h?e:-e);y.add(d)})}),n.forEach((c,a)=>{const h=r[a];c.forEach(l=>{const y=r[l],f=Rt(h[h.length-1],h[h.length-2]??h[h.length-1],y[0],y[1]??y[0]);f&&(h[h.length-1].copy(f),y[0].copy(f))})}),this}matrix(e){return this.getCurves().forEach(t=>t.matrix(e)),this}getMinMax(e=u.MAX,t=u.MIN,s=!0){const i=this.strokeWidth;return this.getCurves().forEach(r=>{if(r.getMinMax(e,t),s&&i>1){const n=i/2,c=r.isClockwise(),a=[];for(let h=0;h<=1;h+=1/r.arcLengthDivisions){const l=r.getPoint(h),y=r.getNormal(h),f=y.clone().scale(c?n:-n),d=y.clone().scale(c?-n:n);a.push(l.clone().add(f),l.clone().add(d),l.clone().add({x:n,y:0}),l.clone().add({x:-n,y:0}),l.clone().add({x:0,y:n}),l.clone().add({x:0,y:-n}),l.clone().add({x:n,y:n}),l.clone().add({x:-n,y:-n}))}e.min(...a),t.max(...a)}}),{min:e,max:t}}getBoundingBox(e=!0){const{min:t,max:s}=this.getMinMax(void 0,void 0,e);return new L(t.x,t.y,s.x-t.x,s.y-t.y)}drawTo(e,t={}){t={...this.style,...t};const{fill:s="#000",stroke:i="none"}=t;return e.beginPath(),e.save(),q(e,t),this.paths.forEach(r=>{r.drawTo(e)}),s!=="none"&&e.fill(),i!=="none"&&e.stroke(),e.restore(),this}drawControlPointsTo(e,t={}){t={...this.style,...t};const{fill:s="#000",stroke:i="none"}=t;return e.beginPath(),e.save(),q(e,t),this.getControlPoints().forEach(r=>{e.moveTo(r.x,r.y),e.arc(r.x,r.y,4,0,Math.PI*2)}),s!=="none"&&e.fill(),i!=="none"&&e.stroke(),e.restore(),this}toCommands(){return this.paths.flatMap(e=>e.toCommands())}toData(){return this.paths.map(e=>e.toData()).join(" ")}toSvgPathString(){const e={...this.style,fill:this.style.fill??"#000",stroke:this.style.stroke??"none"},t={};for(const i in e)e[i]!==void 0&&(t[Ft(i)]=e[i]);Object.assign(t,{"stroke-width":`${this.strokeWidth}px`});let s="";for(const i in t)t[i]!==void 0&&(s+=`${i}:${t[i]};`);return`<path d="${this.toData()}" style="${s}"></path>`}toSvgString(){const{x:e,y:t,width:s,height:i}=this.getBoundingBox(),r=this.toSvgPathString();return`<svg viewBox="${e} ${t} ${s} ${i}" width="${s}px" height="${i}px" xmlns="http://www.w3.org/2000/svg">${r}</svg>`}toSvgUrl(){return`data:image/svg+xml;base64,${btoa(this.toSvgString())}`}toSvg(){return new DOMParser().parseFromString(this.toSvgString(),"image/svg+xml").documentElement}toCanvas(e={}){const{pixelRatio:t=2,...s}=e,{left:i,top:r,width:n,height:c}=this.getBoundingBox(),a=document.createElement("canvas");a.width=n*t,a.height=c*t,a.style.width=`${n}px`,a.style.height=`${c}px`;const h=a.getContext("2d");return h&&(h.scale(t,t),h.translate(-i,-r),this.drawTo(h,s)),a}copy(e){return this.currentPath=e.currentPath.clone(),this.paths=e.paths.map(t=>t.clone()),this.style={...e.style},this}clone(){return new this.constructor().copy(this)}}const Q="px",pt=90,dt=["mm","cm","in","pt","pc","px"],V={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 M(o){let e="px";if(typeof o=="string"||o instanceof String)for(let s=0,i=dt.length;s<i;s++){const r=dt[s];if(o.endsWith(r)){e=r,o=o.substring(0,o.length-r.length);break}}let t;return e==="px"&&Q!=="px"?t=V.in[Q]/pt:(t=V[e][Q],t<0&&(t=V[e].in*pt)),t*Number.parseFloat(o)}const _t=new b,B=new b,xt=new b,mt=new b;function Bt(o,e,t){if(!(o.hasAttribute("transform")||o.nodeName==="use"&&(o.hasAttribute("x")||o.hasAttribute("y"))))return null;const s=Ut(o);return t.length>0&&s.premultiply(t[t.length-1]),e.copy(s),t.push(s),s}function Ut(o){const e=new b,t=_t;if(o.nodeName==="use"&&(o.hasAttribute("x")||o.hasAttribute("y"))&&e.translate(M(o.getAttribute("x")),M(o.getAttribute("y"))),o.hasAttribute("transform")){const s=o.getAttribute("transform").split(")");for(let i=s.length-1;i>=0;i--){const r=s[i].trim();if(r==="")continue;const n=r.indexOf("("),c=r.length;if(n>0&&n<c){const a=r.slice(0,n),h=A(r.slice(n+1));switch(t.identity(),a){case"translate":if(h.length>=1){const l=h[0];let y=0;h.length>=2&&(y=h[1]),t.translate(l,y)}break;case"rotate":if(h.length>=1){let l=0,y=0,f=0;l=h[0]*Math.PI/180,h.length>=3&&(y=h[1],f=h[2]),B.makeTranslation(-y,-f),xt.makeRotation(l),mt.multiplyMatrices(xt,B),B.makeTranslation(y,f),t.multiplyMatrices(B,mt)}break;case"scale":h.length>=1&&t.scale(h[0],h[1]??h[0]);break;case"skewX":h.length===1&&t.set(1,Math.tan(h[0]*Math.PI/180),0,0,1,0,0,0,1);break;case"skewY":h.length===1&&t.set(1,0,0,Math.tan(h[0]*Math.PI/180),1,0,0,0,1);break;case"matrix":h.length===6&&t.set(h[0],h[2],h[4],h[1],h[3],h[5],0,0,1);break}}e.premultiply(t)}}return e}function Wt(o){return new I().addPath(new F().arc(M(o.getAttribute("cx")||0),M(o.getAttribute("cy")||0),M(o.getAttribute("r")||0),0,Math.PI*2))}function Yt(o,e){if(!(!o.sheet||!o.sheet.cssRules||!o.sheet.cssRules.length))for(let t=0;t<o.sheet.cssRules.length;t++){const s=o.sheet.cssRules[t];if(s.type!==1)continue;const i=s.selectorText.split(/,/g).filter(Boolean).map(n=>n.trim()),r={};for(let n=s.style.length,c=0;c<n;c++){const a=s.style.item(c);r[a]=s.style.getPropertyValue(a)}for(let n=0;n<i.length;n++)e[i[n]]=Object.assign(e[i[n]]||{},{...r})}}function Gt(o){return new I().addPath(new F().ellipse(M(o.getAttribute("cx")||0),M(o.getAttribute("cy")||0),M(o.getAttribute("rx")||0),M(o.getAttribute("ry")||0),0,0,Math.PI*2))}function Qt(o){return new I().moveTo(M(o.getAttribute("x1")||0),M(o.getAttribute("y1")||0)).lineTo(M(o.getAttribute("x2")||0),M(o.getAttribute("y2")||0))}function Vt(o){const e=new I,t=o.getAttribute("d");return!t||t==="none"?null:(e.addData(t),e)}const jt=/([+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)(?:,|\s)([+-]?\d*\.?\d+(?:e[+-]?\d+)?)/g;function Ht(o){var s;const e=new I;let t=0;return(s=o.getAttribute("points"))==null||s.replace(jt,(i,r,n)=>{const c=M(r),a=M(n);return t===0?e.moveTo(c,a):e.lineTo(c,a),t++,i}),e.currentPath.autoClose=!0,e}const Zt=/([+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)(?:,|\s)([+-]?\d*\.?\d+(?:e[+-]?\d+)?)/g;function Jt(o){var s;const e=new I;let t=0;return(s=o.getAttribute("points"))==null||s.replace(Zt,(i,r,n)=>{const c=M(r),a=M(n);return t===0?e.moveTo(c,a):e.lineTo(c,a),t++,i}),e.currentPath.autoClose=!1,e}function Kt(o){const e=M(o.getAttribute("x")||0),t=M(o.getAttribute("y")||0),s=M(o.getAttribute("rx")||o.getAttribute("ry")||0),i=M(o.getAttribute("ry")||o.getAttribute("rx")||0),r=M(o.getAttribute("width")),n=M(o.getAttribute("height")),c=1-.551915024494,a=new I;return a.moveTo(e+s,t),a.lineTo(e+r-s,t),(s!==0||i!==0)&&a.bezierCurveTo(e+r-s*c,t,e+r,t+i*c,e+r,t+i),a.lineTo(e+r,t+n-i),(s!==0||i!==0)&&a.bezierCurveTo(e+r,t+n-i*c,e+r-s*c,t+n,e+r-s,t+n),a.lineTo(e+s,t+n),(s!==0||i!==0)&&a.bezierCurveTo(e+s*c,t+n,e,t+n-i*c,e,t+n-i),a.lineTo(e,t+i),(s!==0||i!==0)&&a.bezierCurveTo(e,t+i*c,e+s*c,t,e+s,t),a}function $(o,e,t){e=Object.assign({},e);let s={};if(o.hasAttribute("class")){const h=o.getAttribute("class").split(/\s/).filter(Boolean).map(l=>l.trim());for(let l=0;l<h.length;l++)s=Object.assign(s,t[`.${h[l]}`])}o.hasAttribute("id")&&(s=Object.assign(s,t[`#${o.getAttribute("id")}`]));for(let h=o.style.length,l=0;l<h;l++){const y=o.style.item(l),f=o.style.getPropertyValue(y);e[y]=f,s[y]=f}function i(h,l,y=r){o.hasAttribute(h)&&(e[l]=y(o.getAttribute(h))),s[h]&&(e[l]=y(s[h]))}function r(h){return h.startsWith("url")&&console.warn("url access in attributes is not implemented."),h}function n(h){return Math.max(0,Math.min(1,M(h)))}function c(h){return Math.max(0,M(h))}function a(h){return h.split(" ").filter(l=>l!=="").map(l=>M(l))}return i("fill","fill"),i("fill-opacity","fillOpacity",n),i("fill-rule","fillRule"),i("opacity","opacity",n),i("stroke","stroke"),i("stroke-opacity","strokeOpacity",n),i("stroke-width","strokeWidth",c),i("stroke-linecap","strokeLinecap"),i("stroke-linejoin","strokeLinejoin"),i("stroke-miterlimit","strokeMiterlimit",c),i("stroke-dasharray","strokeDasharray",a),i("stroke-dashoffset","strokeDashoffset",M),i("visibility","visibility"),e}function j(o,e,t=[],s={}){var y;if(o.nodeType!==1)return t;let i=!1,r=null,n={...e};switch(o.nodeName){case"svg":n=$(o,n,s);break;case"style":Yt(o,s);break;case"g":n=$(o,n,s);break;case"path":n=$(o,n,s),o.hasAttribute("d")&&(r=Vt(o));break;case"rect":n=$(o,n,s),r=Kt(o);break;case"polygon":n=$(o,n,s),r=Ht(o);break;case"polyline":n=$(o,n,s),r=Jt(o);break;case"circle":n=$(o,n,s),r=Wt(o);break;case"ellipse":n=$(o,n,s),r=Gt(o);break;case"line":n=$(o,n,s),r=Qt(o);break;case"defs":i=!0;break;case"use":{n=$(o,n,s);const d=(o.getAttributeNS("http://www.w3.org/1999/xlink","href")||"").substring(1),g=(y=o.viewportElement)==null?void 0:y.getElementById(d);g?j(g,n,t,s):console.warn(`'use node' references non-existent node id: ${d}`);break}default:console.warn(o);break}if(n.display==="none")return t;Object.assign(e,n);const c=new b,a=[],h=Bt(o,c,a);r&&(r.matrix(c),t.push(r),r.style=e);const l=o.childNodes;for(let f=0,d=l.length;f<d;f++){const g=l[f];i&&g.nodeName!=="style"&&g.nodeName!=="defs"||j(g,e,t,s)}return h&&(a.pop(),a.length>0?c.copy(a[a.length-1]):c.identity()),t}const Mt="data:image/svg+xml;",Pt=`${Mt}base64,`,wt=`${Mt}charset=utf8,`;function Tt(o){if(typeof o=="string"){let e;return o.startsWith(Pt)?(o=o.substring(Pt.length,o.length),e=atob(o)):o.startsWith(wt)?(o=o.substring(wt.length,o.length),e=decodeURIComponent(o)):e=o,new DOMParser().parseFromString(e,"image/svg+xml").documentElement}else return o}function te(o){return j(Tt(o),{})}function H(o,e=!0){if(!o.length)return;const t=u.MAX,s=u.MIN;return o.forEach(i=>i.getMinMax(t,s,e)),new L(t.x,t.y,s.x-t.x,s.y-t.y)}function Z(o){const{x:e,y:t,width:s,height:i}=H(o),r=o.map(n=>n.toSvgPathString()).join("");return`<svg viewBox="${e} ${t} ${s} ${i}" width="${s}px" height="${i}px" xmlns="http://www.w3.org/2000/svg">${r}</svg>`}function ee(o){return`data:image/svg+xml;base64,${btoa(Z(o))}`}function se(o){return new DOMParser().parseFromString(Z(o),"image/svg+xml").documentElement}function ne(o,e={}){const{pixelRatio:t=2,...s}=e,{left:i,top:r,width:n,height:c}=H(o),a=document.createElement("canvas");a.width=n*t,a.height=c*t,a.style.width=`${n}px`,a.style.height=`${c}px`;const h=a.getContext("2d");return h&&(h.scale(t,t),h.translate(-i,-r),o.forEach(l=>{l.drawTo(h,s)})),a}p.BoundingBox=L,p.CircleCurve=R,p.CubicBezierCurve=rt,p.Curve=k,p.CurvePath=F,p.EllipseCurve=at,p.HeartCurve=Xt,p.LineCurve=X,p.Matrix3=b,p.Path2D=I,p.PloygonCurve=Ot,p.QuadraticBezierCurve=yt,p.RectangularCurve=gt,p.SplineCurve=ft,p.Vector2=u,p.addPathCommandsToPath2D=Y,p.getPathsBoundingBox=H,p.parseArcCommand=tt,p.parsePathDataArgs=A,p.parseSvg=te,p.parseSvgToDom=Tt,p.pathCommandsToPathData=et,p.pathDataToPathCommands=G,p.pathsToCanvas=ne,p.pathsToSvg=se,p.pathsToSvgString=Z,p.pathsToSvgUrl=ee,p.setCanvasContext=q,Object.defineProperty(p,Symbol.toStringTag,{value:"Module"})});
1
+ (function(p,C){typeof exports=="object"&&typeof module<"u"?C(exports):typeof define=="function"&&define.amd?define(["exports"],C):(p=typeof globalThis<"u"?globalThis:p||self,C(p.modernPath2d={}))})(this,function(p){"use strict";var ie=Object.defineProperty;var re=(p,C,q)=>C in p?ie(p,C,{enumerable:!0,configurable:!0,writable:!0,value:q}):p[C]=q;var T=(p,C,q)=>re(p,typeof C!="symbol"?C+"":C,q);const C={arcs:"bevel",bevel:"bevel",miter:"miter","miter-clip":"miter",round:"round"};function q(o,e){const{fill:t="#000",stroke:s="none",strokeWidth:i=s==="none"?0:1,strokeLinecap:r="round",strokeLinejoin:n="miter",strokeMiterlimit:c=0,strokeDasharray:a=[],strokeDashoffset:h=0,shadowOffsetX:l=0,shadowOffsetY:y=0,shadowBlur:f=0,shadowColor:d="rgba(0, 0, 0, 0)"}=e;o.fillStyle=t,o.strokeStyle=s,o.lineWidth=i,o.lineCap=r,o.lineJoin=C[n],o.miterLimit=c,o.setLineDash(a),o.lineDashOffset=h,o.shadowOffsetX=l,o.shadowOffsetY=y,o.shadowBlur=f,o.shadowColor=d}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)}get array(){return[this.x,this.y]}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}multiply(e){return this.x*=e.x,this.y*=e.y,this}divide(e){return this.x/=e.x,this.y/=e.y,this}dot(e){return this.x*e.x+this.y*e.y}cross(e){return this.x*e.y-this.y*e.x}rotate(e,t={x:0,y:0}){const s=-e/180*Math.PI,i=this.x-t.x,r=-(this.y-t.y),n=Math.sin(s),c=Math.cos(s);return this.set(t.x+(i*c-r*n),t.y-(i*n+r*c)),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}lengthSquared(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.lengthSquared())}scale(e,t=e,s={x:0,y:0}){const i=e<0?s.x-this.x+s.x:this.x,r=t<0?s.y-this.y+s.y:this.y;return this.x=i*Math.abs(e),this.y=r*Math.abs(t),this}skew(e,t=0,s={x:0,y:0}){const i=this.x-s.x,r=this.y-s.y;return this.x=s.x+(i+Math.tan(e)*r),this.y=s.y+(r+Math.tan(t)*i),this}min(...e){return this.x=Math.min(this.x,...e.map(t=>t.x)),this.y=Math.min(this.y,...e.map(t=>t.y)),this}max(...e){return this.x=Math.max(this.x,...e.map(t=>t.x)),this.y=Math.max(this.y,...e.map(t=>t.y)),this}normalize(){return this.scale(1/(this.length()||1))}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this}multiplyVectors(e,t){return this.x=e.x*t.x,this.y=e.y*t.y,this}divideVectors(e,t){return this.x=e.x/t.x,this.y=e.y/t.y,this}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,i=e.elements;return this.x=i[0]*t+i[3]*s+i[6],this.y=i[1]*t+i[4]*s+i[7],this}copy(e){return this.x=e.x,this.y=e.y,this}clone(){return new u(this.x,this.y)}}class L{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}get center(){return new u((this.left+this.right)/2,(this.top+this.bottom)/2)}get array(){return[this.left,this.top,this.width,this.height]}static from(...e){if(e.length===0)return new L;if(e.length===1)return e[0].clone();const t=e[0],s=e.slice(1).reduce((i,r)=>(i.left=Math.min(i.left,r.left),i.top=Math.min(i.top,r.top),i.right=Math.max(i.right,r.right),i.bottom=Math.max(i.bottom,r.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 L(s.left,s.top,s.right-s.left,s.bottom-s.top)}translate(e,t){return this.left+=e,this.top+=t,this}copy(e){return this.left=e.left,this.top=e.top,this.width=e.width,this.height=e.height,this}clone(){return new L(this.left,this.top,this.width,this.height)}}class v{constructor(e=1,t=0,s=0,i=0,r=1,n=0,c=0,a=0,h=1){T(this,"elements",[]);this.set(e,t,s,i,r,n,c,a,h)}set(e,t,s,i,r,n,c,a,h){const l=this.elements;return l[0]=e,l[1]=i,l[2]=c,l[3]=t,l[4]=r,l[5]=a,l[6]=s,l[7]=n,l[8]=h,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,r=this.elements,n=s[0],c=s[3],a=s[6],h=s[1],l=s[4],y=s[7],f=s[2],d=s[5],g=s[8],x=i[0],m=i[3],w=i[6],E=i[1],b=i[4],S=i[7],$=i[2],z=i[5],D=i[8];return r[0]=n*x+c*E+a*$,r[3]=n*m+c*b+a*z,r[6]=n*w+c*S+a*D,r[1]=h*x+l*E+y*$,r[4]=h*m+l*b+y*z,r[7]=h*w+l*S+y*D,r[2]=f*x+d*E+g*$,r[5]=f*m+d*b+g*z,r[8]=f*w+d*S+g*D,this}invert(){const e=this.elements,t=e[0],s=e[1],i=e[2],r=e[3],n=e[4],c=e[5],a=e[6],h=e[7],l=e[8],y=l*n-c*h,f=c*a-l*r,d=h*r-n*a,g=t*y+s*f+i*d;if(g===0)return this.set(0,0,0,0,0,0,0,0,0);const x=1/g;return e[0]=y*x,e[1]=(i*h-l*s)*x,e[2]=(c*s-i*n)*x,e[3]=f*x,e[4]=(l*t-i*a)*x,e[5]=(i*r-c*t)*x,e[6]=d*x,e[7]=(s*a-h*t)*x,e[8]=(n*t-s*r)*x,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(B.makeScale(e,t)),this}rotate(e){return this.premultiply(B.makeRotation(-e)),this}translate(e,t){return this.premultiply(B.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 B=new v;function Z(o,e,t,s){const i=o*t+e*s,r=Math.sqrt(o*o+e*e)*Math.sqrt(t*t+s*s);let n=Math.acos(Math.max(-1,Math.min(1,i/r)));return o*s-e*t<0&&(n=-n),n}function J(o,e,t,s,i,r,n,c){if(e===0||t===0){o.lineTo(c.x,c.y);return}s=s*Math.PI/180,e=Math.abs(e),t=Math.abs(t);const a=(n.x-c.x)/2,h=(n.y-c.y)/2,l=Math.cos(s)*a+Math.sin(s)*h,y=-Math.sin(s)*a+Math.cos(s)*h;let f=e*e,d=t*t;const g=l*l,x=y*y,m=g/f+x/d;if(m>1){const wt=Math.sqrt(m);e=wt*e,t=wt*t,f=e*e,d=t*t}const w=f*x+d*g,E=(f*d-w)/w;let b=Math.sqrt(Math.max(0,E));i===r&&(b=-b);const S=b*e*y/t,$=-b*t*l/e,z=Math.cos(s)*S-Math.sin(s)*$+(n.x+c.x)/2,D=Math.sin(s)*S+Math.cos(s)*$+(n.y+c.y)/2,_=Z(1,0,(l-S)/e,(y-$)/t),H=Z((l-S)/e,(y-$)/t,(-l-S)/e,(-y-$)/t)%(Math.PI*2);o.ellipse(z,D,e,t,s,_,_+H,r===0)}function X(o,e){return o-(e-o)}function U(o,e){const t=new u,s=new u;for(let i=0,r=o.length;i<r;i++){const n=o[i];if(n.type==="m"||n.type==="M")n.type==="m"?t.add(n):t.copy(n),e.moveTo(t.x,t.y),s.copy(t);else if(n.type==="h"||n.type==="H")n.type==="h"?t.x+=n.x:t.x=n.x,e.lineTo(t.x,t.y),s.copy(t);else if(n.type==="v"||n.type==="V")n.type==="v"?t.y+=n.y:t.y=n.y,e.lineTo(t.x,t.y),s.copy(t);else if(n.type==="l"||n.type==="L")n.type==="l"?t.add(n):t.copy(n),e.lineTo(t.x,t.y),s.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.add(n)):(e.bezierCurveTo(n.x1,n.y1,n.x2,n.y2,n.x,n.y),s.x=n.x2,s.y=n.y2,t.copy(n));else if(n.type==="s"||n.type==="S")n.type==="s"?(e.bezierCurveTo(X(t.x,s.x),X(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.add(n)):(e.bezierCurveTo(X(t.x,s.x),X(t.y,s.y),n.x2,n.y2,n.x,n.y),s.x=n.x2,s.y=n.y2,t.copy(n));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.add(n)):(e.quadraticCurveTo(n.x1,n.y1,n.x,n.y),s.x=n.x1,s.y=n.y1,t.copy(n));else if(n.type==="t"||n.type==="T"){const c=X(t.x,s.x),a=X(t.y,s.y);s.x=c,s.y=a,n.type==="t"?(e.quadraticCurveTo(c,a,t.x+n.x,t.y+n.y),t.add(n)):(e.quadraticCurveTo(c,a,n.x,n.y),t.copy(n))}else if(n.type==="a"||n.type==="A"){const c=t.clone();if(n.type==="a"){if(n.x===0&&n.y===0)continue;t.add(n)}else{if(t.equals(n))continue;t.copy(n)}s.copy(t),J(e,n.rx,n.ry,n.angle,n.largeArcFlag,n.sweepFlag,c,t)}else n.type==="z"||n.type==="Z"?(e.startPoint&&t.copy(e.startPoint),e.closePath()):console.warn("Unsupported commands",n)}}const P={SEPARATOR:/[ \t\r\n,.\-+]/,WHITESPACE:/[ \t\r\n]/,DIGIT:/\d/,SIGN:/[-+]/,POINT:/\./,COMMA:/,/,EXP:/e/i,FLAGS:/[01]/};function A(o,e,t=0){let c=0,a=!0,h="",l="";const y=[];function f(m,w,E){const b=new SyntaxError(`Unexpected character "${m}" at index ${w}.`);throw b.partial=E,b}function d(){h!==""&&(l===""?y.push(Number(h)):y.push(Number(h)*10**Number(l))),h="",l=""}let g;const x=o.length;for(let m=0;m<x;m++){if(g=o[m],Array.isArray(e)&&e.includes(y.length%t)&&P.FLAGS.test(g)){c=1,h=g,d();continue}if(c===0){if(P.WHITESPACE.test(g))continue;if(P.DIGIT.test(g)||P.SIGN.test(g)){c=1,h=g;continue}if(P.POINT.test(g)){c=2,h=g;continue}P.COMMA.test(g)&&(a&&f(g,m,y),a=!0)}if(c===1){if(P.DIGIT.test(g)){h+=g;continue}if(P.POINT.test(g)){h+=g,c=2;continue}if(P.EXP.test(g)){c=3;continue}P.SIGN.test(g)&&h.length===1&&P.SIGN.test(h[0])&&f(g,m,y)}if(c===2){if(P.DIGIT.test(g)){h+=g;continue}if(P.EXP.test(g)){c=3;continue}P.POINT.test(g)&&h[h.length-1]==="."&&f(g,m,y)}if(c===3){if(P.DIGIT.test(g)){l+=g;continue}if(P.SIGN.test(g)){if(l===""){l+=g;continue}l.length===1&&P.SIGN.test(l)&&f(g,m,y)}}P.WHITESPACE.test(g)?(d(),c=0,a=!1):P.COMMA.test(g)?(d(),c=0,a=!0):P.SIGN.test(g)?(d(),c=1,h=g):P.POINT.test(g)?(d(),c=2,h=g):f(g,m,y)}return d(),y}function K(o){let e,t;const s=[];for(let i=0,r=o.length;i<r;i++){const n=o[i];switch(n.type){case"m":case"M":if(n.x.toFixed(4)===(t==null?void 0:t.x.toFixed(4))&&n.y.toFixed(4)===(t==null?void 0:t.y.toFixed(4)))continue;s.push(`${n.type} ${n.x} ${n.y}`),t={x:n.x,y:n.y},e={x:n.x,y:n.y};break;case"h":case"H":s.push(`${n.type} ${n.x}`),t={x:n.x,y:(t==null?void 0:t.y)??0};break;case"v":case"V":s.push(`${n.type} ${n.y}`),t={x:(t==null?void 0:t.x)??0,y:n.y};break;case"l":case"L":s.push(`${n.type} ${n.x} ${n.y}`),t={x:n.x,y:n.y};break;case"c":case"C":s.push(`${n.type} ${n.x1} ${n.y1} ${n.x2} ${n.y2} ${n.x} ${n.y}`),t={x:n.x,y:n.y};break;case"s":case"S":s.push(`${n.type} ${n.x2} ${n.y2} ${n.x} ${n.y}`),t={x:n.x,y:n.y};break;case"q":case"Q":s.push(`${n.type} ${n.x1} ${n.y1} ${n.x} ${n.y}`),t={x:n.x,y:n.y};break;case"t":case"T":s.push(`${n.type} ${n.x} ${n.y}`),t={x:n.x,y:n.y};break;case"a":case"A":s.push(`${n.type} ${n.rx} ${n.ry} ${n.angle} ${n.largeArcFlag} ${n.sweepFlag} ${n.x} ${n.y}`),t={x:n.x,y:n.y};break;case"z":case"Z":s.push(n.type),e&&(t={x:e.x,y:e.y});break}}return s.join(" ")}const Tt=/[a-df-z][^a-df-z]*/gi;function W(o){const e=[],t=o.match(Tt);if(!t)return e;for(let s=0,i=t.length;s<i;s++){const r=t[s],n=r.charAt(0),c=r.slice(1).trim();let a;switch(n){case"m":case"M":a=A(c);for(let h=0,l=a.length;h<l;h+=2)h===0?e.push({type:n,x:a[h],y:a[h+1]}):e.push({type:n==="m"?"l":"L",x:a[h],y:a[h+1]});break;case"h":case"H":a=A(c);for(let h=0,l=a.length;h<l;h++)e.push({type:n,x:a[h]});break;case"v":case"V":a=A(c);for(let h=0,l=a.length;h<l;h++)e.push({type:n,y:a[h]});break;case"l":case"L":a=A(c);for(let h=0,l=a.length;h<l;h+=2)e.push({type:n,x:a[h],y:a[h+1]});break;case"c":case"C":a=A(c);for(let h=0,l=a.length;h<l;h+=6)e.push({type:n,x1:a[h],y1:a[h+1],x2:a[h+2],y2:a[h+3],x:a[h+4],y:a[h+5]});break;case"s":case"S":a=A(c);for(let h=0,l=a.length;h<l;h+=4)e.push({type:n,x2:a[h],y2:a[h+1],x:a[h+2],y:a[h+3]});break;case"q":case"Q":a=A(c);for(let h=0,l=a.length;h<l;h+=4)e.push({type:n,x1:a[h],y1:a[h+1],x:a[h+2],y:a[h+3]});break;case"t":case"T":a=A(c);for(let h=0,l=a.length;h<l;h+=2)e.push({type:n,x:a[h],y:a[h+1]});break;case"a":case"A":a=A(c,[3,4],7);for(let h=0,l=a.length;h<l;h+=7)e.push({type:n,rx:a[h],ry:a[h+1],angle:a[h+2],largeArcFlag:a[h+3],sweepFlag:a[h+4],x:a[h+5],y:a[h+6]});break;case"z":case"Z":e.push({type:n});break;default:console.warn(r)}}return e}class k{constructor(){T(this,"arcLengthDivisions",200);T(this,"_cacheArcLengths");T(this,"_needsUpdate",!1)}isClockwise(){const e=this.getPoint(1),t=this.getPoint(.5),s=this.getPoint(1);return(t.x-e.x)*(s.y-t.y)-(t.y-e.y)*(s.x-t.x)<0}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}forEachControlPoints(e){return this.getControlPoints().forEach(e),this}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),r=0;t.push(0);for(let n=1;n<=e;n++)s=this.getPoint(n/e),r+=s.distanceTo(i),t.push(r),i=s;return this._cacheArcLengths=t,t}updateArcLengths(){this._needsUpdate=!0,this.getLengths()}getUToTMapping(e,t){const s=this.getLengths();let i=0;const r=s.length;let n;t?n=t:n=e*s[r-1];let c=0,a=r-1,h;for(;c<=a;)if(i=Math.floor(c+(a-c)/2),h=s[i]-n,h<0)c=i+1;else if(h>0)a=i-1;else{a=i;break}if(i=a,s[i]===n)return i/(r-1);const l=s[i],f=s[i+1]-l,d=(n-l)/f;return(i+d)/(r-1)}getTangent(e,t=new u){const i=Math.max(0,e-1e-4),r=Math.min(1,e+1e-4);return t.copy(this.getPoint(r).sub(this.getPoint(i)).normalize())}getTangentAt(e,t){return this.getTangent(this.getUToTMapping(e),t)}getNormal(e,t=new u){return this.getTangent(e,t),t.set(-t.y,t.x).normalize()}getNormalAt(e,t){return this.getNormal(this.getUToTMapping(e),t)}getTForPoint(e,t=.001){let s=0,i=1,r=(s+i)/2;for(;i-s>t;){r=(s+i)/2;const n=this.getPoint(r);if(n.distanceTo(e)<t)return r;n.x<e.x?s=r:i=r}return r}matrix(e){return this.forEachControlPoints(t=>t.applyMatrix3(e)),this}getMinMax(e=u.MAX,t=u.MIN){return this.getPoints().forEach(s=>{e.min(s),t.max(s)}),{min:e,max:t}}getBoundingBox(){const{min:e,max:t}=this.getMinMax();return new L(e.x,e.y,t.x-e.x,t.y-e.y)}toCommands(){return this.getPoints().map((e,t)=>t===0?{type:"M",x:e.x,y:e.y}:{type:"L",x:e.x,y:e.y})}toData(){return K(this.toCommands())}drawTo(e){return this.toCommands().forEach(t=>{switch(t.type){case"M":e.moveTo(t.x,t.y);break;case"L":e.lineTo(t.x,t.y);break}}),this}copy(e){return this.arcLengthDivisions=e.arcLengthDivisions,this}clone(){return new this.constructor().copy(this)}}class R extends k{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().scale(t))}getTangent(e,t=new u){const{x:s,y:i}=this.getNormal(e);return t.set(-i,s)}getNormal(e,t=new u){const{start:s,end:i}=this,r=e*(i-s)+s-.5*Math.PI;return t.set(Math.cos(r),Math.sin(r))}getControlPoints(){return[this.center]}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 tt(o,e,t,s,i){const r=(s-e)*.5,n=(i-t)*.5,c=o*o,a=o*c;return(2*t-2*s+r+n)*a+(-3*t+3*s-2*r-n)*c+r*o+t}function Ct(o,e){const t=1-o;return t*t*e}function bt(o,e){return 2*(1-o)*o*e}function vt(o,e){return o*o*e}function et(o,e,t,s){return Ct(o,e)+bt(o,t)+vt(o,s)}function At(o,e){const t=1-o;return t*t*t*e}function kt(o,e){const t=1-o;return 3*t*t*o*e}function It(o,e){return 3*(1-o)*o*o*e}function St(o,e){return o*o*o*e}function st(o,e,t,s,i){return At(o,e)+kt(o,t)+It(o,s)+St(o,i)}class nt extends k{constructor(e=new u,t=new u,s=new u,i=new u){super(),this.start=e,this.startControl=t,this.endControl=s,this.end=i}getPoint(e,t=new u){const{start:s,startControl:i,endControl:r,end:n}=this;return t.set(st(e,s.x,i.x,r.x,n.x),st(e,s.y,i.y,r.y,n.y))}getControlPoints(){return[this.start,this.startControl,this.endControl,this.end]}_solveQuadratic(e,t,s){const i=t*t-4*e*s;if(i<0)return[];const r=Math.sqrt(i),n=(-t+r)/(2*e),c=(-t-r)/(2*e);return[n,c].filter(a=>a>=0&&a<=1)}getMinMax(e=u.MAX,t=u.MIN){const s=this.start,i=this.startControl,r=this.endControl,n=this.end,c=this._solveQuadratic(3*(i.x-s.x),6*(r.x-i.x),3*(n.x-r.x)),a=this._solveQuadratic(3*(i.y-s.y),6*(r.y-i.y),3*(n.y-r.y)),h=[0,1,...c,...a];return((y,f)=>{for(const d of y)for(let g=0;g<=f;g++){const x=g/f-.5,m=Math.min(1,Math.max(0,d+x)),w=this.getPoint(m);e.x=Math.min(e.x,w.x),e.y=Math.min(e.y,w.y),t.x=Math.max(t.x,w.x),t.y=Math.max(t.y,w.y)}})(h,10),{min:e,max:t}}toCommands(){const{start:e,startControl:t,endControl:s,end: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{start:t,startControl:s,endControl:i,end:r}=this;return e.lineTo(t.x,t.y),e.bezierCurveTo(s.x,s.y,i.x,i.y,r.x,r.y),this}copy(e){return super.copy(e),this.start.copy(e.start),this.startControl.copy(e.startControl),this.endControl.copy(e.endControl),this.end.copy(e.end),this}}const $t=new v,it=new v,rt=new v,G=new u;class ot extends k{constructor(e=new u,t=1,s=1,i=0,r=0,n=Math.PI*2,c=!1){super(),this.center=e,this.radiusX=t,this.radiusY=s,this.rotation=i,this.startAngle=r,this.endAngle=n,this.clockwise=c}isClockwise(){return this.clockwise}getPoint(e,t=new u){const s=Math.PI*2;let i=this.endAngle-this.startAngle;const r=Math.abs(i)<Number.EPSILON;for(;i<0;)i+=s;for(;i>s;)i-=s;i<Number.EPSILON&&(r?i=0:i=s),this.clockwise&&!r&&(i===s?i=-s:i=i-s);const n=this.startAngle+e*i;let c=this.center.x+this.radiusX*Math.cos(n),a=this.center.y+this.radiusY*Math.sin(n);if(this.rotation!==0){const h=Math.cos(this.rotation),l=Math.sin(this.rotation),y=c-this.center.x,f=a-this.center.y;c=y*h-f*l+this.center.x,a=y*l+f*h+this.center.y}return t.set(c,a)}toCommands(){const{center:e,radiusX:t,radiusY:s,startAngle:i,endAngle:r,clockwise:n,rotation:c}=this,{x:a,y:h}=e,l=a+t*Math.cos(i)*Math.cos(c)-s*Math.sin(i)*Math.sin(c),y=h+t*Math.cos(i)*Math.sin(c)+s*Math.sin(i)*Math.cos(c),f=Math.abs(i-r),d=f>Math.PI?1:0,g=n?1:0,x=c*180/Math.PI;if(f>=2*Math.PI){const m=i+Math.PI,w=a+t*Math.cos(m)*Math.cos(c)-s*Math.sin(m)*Math.sin(c),E=h+t*Math.cos(m)*Math.sin(c)+s*Math.sin(m)*Math.cos(c);return[{type:"M",x:l,y},{type:"A",rx:t,ry:s,angle:x,largeArcFlag:0,sweepFlag:g,x:w,y:E},{type:"A",rx:t,ry:s,angle:x,largeArcFlag:0,sweepFlag:g,x:l,y}]}else{const m=a+t*Math.cos(r)*Math.cos(c)-s*Math.sin(r)*Math.sin(c),w=h+t*Math.cos(r)*Math.sin(c)+s*Math.sin(r)*Math.cos(c);return[{type:"M",x:l,y},{type:"A",rx:t,ry:s,angle:x,largeArcFlag:d,sweepFlag:g,x:m,y:w}]}}drawTo(e){const{center:t,radiusX:s,radiusY:i,rotation:r,startAngle:n,endAngle:c,clockwise:a}=this;return e.ellipse(t.x,t.y,s,i,r,n,c,!a),this}matrix(e){return G.set(this.center.x,this.center.y),G.applyMatrix3(e),this.center.x=G.x,this.center.y=G.y,Lt(e)?Nt(this,e):Et(this,e),this}getControlPoints(){return[this.center]}getMinMax(e=u.MAX,t=u.MIN){const{center:s,radiusX:i,radiusY:r,rotation:n}=this,{x:c,y:a}=s,h=Math.cos(n),l=Math.sin(n),y=Math.sqrt(i*i*h*h+r*r*l*l),f=Math.sqrt(i*i*l*l+r*r*h*h);return e.x=Math.min(e.x,c-y),e.y=Math.min(e.y,a-f),t.x=Math.max(t.x,c+y),t.y=Math.max(t.y,a+f),{min:e,max:t}}copy(e){return super.copy(e),this.center.x=e.center.x,this.center.y=e.center.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 Nt(o,e){const t=o.radiusX,s=o.radiusY,i=Math.cos(o.rotation),r=Math.sin(o.rotation),n=new u(t*i,t*r),c=new u(-s*r,s*i),a=n.applyMatrix3(e),h=c.applyMatrix3(e),l=$t.set(a.x,h.x,0,a.y,h.y,0,0,0,1),y=it.copy(l).invert(),g=rt.copy(y).transpose().multiply(y).elements,x=qt(g[0],g[1],g[4]),m=Math.sqrt(x.rt1),w=Math.sqrt(x.rt2);if(o.radiusX=1/m,o.radiusY=1/w,o.rotation=Math.atan2(x.sn,x.cs),!((o.endAngle-o.startAngle)%(2*Math.PI)<Number.EPSILON)){const b=it.set(m,0,0,0,w,0,0,0,1),S=rt.set(x.cs,x.sn,0,-x.sn,x.cs,0,0,0,1),$=b.multiply(S).multiply(l),z=D=>{const{x:_,y:H}=new u(Math.cos(D),Math.sin(D)).applyMatrix3($);return Math.atan2(H,_)};o.startAngle=z(o.startAngle),o.endAngle=z(o.endAngle),ht(e)&&(o.clockwise=!o.clockwise)}}function Et(o,e){const t=at(e),s=ct(e);o.radiusX*=t,o.radiusY*=s;const i=t>Number.EPSILON?Math.atan2(e.elements[1],e.elements[0]):Math.atan2(-e.elements[3],e.elements[4]);o.rotation+=i,ht(e)&&(o.startAngle*=-1,o.endAngle*=-1,o.clockwise=!o.clockwise)}function ht(o){const e=o.elements;return e[0]*e[4]-e[1]*e[3]<0}function Lt(o){const e=o.elements,t=e[0]*e[3]+e[1]*e[4];if(t===0)return!1;const s=at(o),i=ct(o);return Math.abs(t/(s*i))>Number.EPSILON}function at(o){const e=o.elements;return Math.sqrt(e[0]*e[0]+e[1]*e[1])}function ct(o){const e=o.elements;return Math.sqrt(e[3]*e[3]+e[4]*e[4])}function qt(o,e,t){let s,i,r,n,c;const a=o+t,h=o-t,l=Math.sqrt(h*h+4*e*e);return a>0?(s=.5*(a+l),c=1/s,i=o*c*t-e*c*e):a<0?i=.5*(a-l):(s=.5*l,i=-.5*l),h>0?r=h+l:r=h-l,Math.abs(r)>2*Math.abs(e)?(c=-2*e/r,n=1/Math.sqrt(1+c*c),r=c*n):Math.abs(e)===0?(r=1,n=0):(c=-.5*r/e,r=1/Math.sqrt(1+c*c),n=c*r),h>0&&(c=r,r=-n,n=c),{rt1:s,rt2:i,cs:r,sn:n}}class O extends k{constructor(e=new u,t=new u){super(),this.start=e,this.end=t}getPoint(e,t=new u){return e===1?t.copy(this.end):t.copy(this.end).sub(this.start).scale(e).add(this.start),t}getPointAt(e,t=new u){return this.getPoint(e,t)}getTangent(e,t=new u){return t.subVectors(this.end,this.start).normalize()}getTangentAt(e,t=new u){return this.getTangent(e,t)}getControlPoints(){return[this.start,this.end]}getMinMax(e=u.MAX,t=u.MIN){const{start:s,end: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}}toCommands(){const{start:e,end:t}=this;return[{type:"M",x:e.x,y:e.y},{type:"L",x:t.x,y:t.y}]}drawTo(e){const{start:t,end:s}=this;return e.lineTo(t.x,t.y),e.lineTo(s.x,s.y),this}copy(e){return super.copy(e),this.start.copy(e.start),this.end.copy(e.end),this}}class zt extends k{constructor(t,s,i=0,r=1){super();T(this,"curveT",0);this.center=t,this.size=s,this.start=i,this.end=r,this.update()}update(){const{x:t,y:s}=this.center,i=new u(t+.5*this.size,s-.5*this.size),r=new u(t-.5*this.size,s-.5*this.size),n=new u(t,s+.5*this.size),c=new R(i,Math.SQRT1_2*this.size,-.25*Math.PI,.75*Math.PI),a=new R(r,Math.SQRT1_2*this.size,-.75*Math.PI,.25*Math.PI),h=new R(n,.5*Math.SQRT1_2*this.size,.75*Math.PI,1.25*Math.PI),l=new u(t,s+this.size),y=new u(t+this.size,s),f=new u().lerpVectors(y,l,.75),d=new u(t-this.size,s),g=new u().lerpVectors(d,l,.75),x=new O(y,f),m=new O(g,d);return this.curves=[c,x,h,m,a],this}getPoint(t){return this.getCurve(t).getPoint(this.curveT)}getPointAt(t){return this.getPoint(t)}getCurve(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 r=.5*Math.PI;return s<r?(i=0,this.curveT=s/r):s<r+.75?(i=1,this.curveT=(s-r)/.75):s<5*Math.PI/8+.75?(i=2,this.curveT=(s-r-.75)/(Math.PI/8)):s<5*Math.PI/8+1.5?(i=3,this.curveT=(s-5*Math.PI/8-.75)/.75):(i=4,this.curveT=(s-5*Math.PI/8-1.5)/r),this.curves[i]}getTangent(t,s){return this.getCurve(t).getTangent(this.curveT,s)}getNormal(t,s){return this.getCurve(t).getNormal(this.curveT,s)}getControlPoints(){return this.curves.flatMap(t=>t.getControlPoints())}getMinMax(t=u.MAX,s=u.MIN){return this.curves.forEach(i=>i.getMinMax(t,s)),{min:t,max:s}}toCommands(){return this.curves.flatMap(t=>t.toCommands())}drawTo(t){return this.curves.forEach(s=>s.drawTo(t)),this}}class Dt extends k{constructor(t,s=0,i=0,r=0,n=1){super();T(this,"curves",[]);T(this,"curveT",0);T(this,"points",[]);this.center=t,this.radius=s,this.number=i,this.start=r,this.end=n,this.update()}update(){for(let t=0;t<this.number;t++){let s=t*2*Math.PI/this.number;s-=.5*Math.PI,this.points.push(new u(this.radius*Math.cos(s),this.radius*Math.sin(s)).add(this.center))}for(let t=0;t<this.number;t++)this.curves.push(new O(this.points[t],this.points[(t+1)%this.number]));return this}getCurve(t){let s=(t*(this.end-this.start)+this.start)%1;s<0&&(s+=1);const i=s*this.number,r=Math.floor(i);return this.curveT=i-r,this.curves[r]}getPoint(t,s){return this.getCurve(t).getPoint(this.curveT,s)}getPointAt(t,s){return this.getPoint(t,s)}getTangent(t,s){return this.getCurve(t).getTangent(this.curveT,s)}getNormal(t,s){return this.getCurve(t).getNormal(this.curveT,s)}getControlPoints(){return this.curves.flatMap(t=>t.getControlPoints())}getMinMax(t=u.MAX,s=u.MIN){return this.curves.forEach(i=>i.getMinMax(t,s)),{min:t,max:s}}toCommands(){return this.curves.flatMap(t=>t.toCommands())}drawTo(t){return this.curves.forEach(s=>s.drawTo(t)),this}}class lt extends k{constructor(e=new u,t=new u,s=new u){super(),this.start=e,this.control=t,this.end=s}getPoint(e,t=new u){const{start:s,control:i,end:r}=this;return t.set(et(e,s.x,i.x,r.x),et(e,s.y,i.y,r.y)),t}getControlPoints(){return[this.start,this.control,this.end]}getMinMax(e=u.MAX,t=u.MIN){const{start:s,control:i,end:r}=this,n=.5*(s.x+i.x),c=.5*(s.y+i.y),a=.5*(s.x+r.x),h=.5*(s.y+r.y);return e.x=Math.min(e.x,s.x,r.x,n,a),e.y=Math.min(e.y,s.y,r.y,c,h),t.x=Math.max(t.x,s.x,r.x,n,a),t.y=Math.max(t.y,s.y,r.y,c,h),{min:e,max:t}}toCommands(){const{start:e,control:t,end: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{start:t,control:s,end:i}=this;return e.lineTo(t.x,t.y),e.quadraticCurveTo(s.x,s.y,i.x,i.y),this}copy(e){return super.copy(e),this.start.copy(e.start),this.control.copy(e.control),this.end.copy(e.end),this}}class ut extends k{constructor(t,s,i=1,r=0,n=1){super();T(this,"curves",[]);T(this,"curveT",0);this.center=t,this.rx=s,this.aspectRatio=i,this.start=r,this.end=n,this.update()}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}update(){const{x:t,y:s}=this.center,i=this.rx,r=this.rx/this.aspectRatio,n=[new u(t-i,s-r),new u(t+i,s-r),new u(t+i,s+r),new u(t-i,s+r)];for(let c=0;c<4;c++)this.curves.push(new O(n[c].clone(),n[(c+1)%4].clone()));return this}getCurve(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.curveT=s/this.aspectRatio):s<this.aspectRatio+1?(i=1,this.curveT=(s-this.aspectRatio)/1):s<2*this.aspectRatio+1?(i=2,this.curveT=(s-this.aspectRatio-1)/this.aspectRatio):(i=3,this.curveT=(s-2*this.aspectRatio-1)/1),this.curves[i]}getPoint(t,s){return this.getCurve(t).getPoint(this.curveT,s)}getPointAt(t,s){return this.getPoint(t,s)}getTangent(t,s){return this.getCurve(t).getTangent(this.curveT,s)}getNormal(t,s){return this.getCurve(t).getNormal(this.curveT,s)}getControlPoints(){return this.curves.flatMap(t=>t.getControlPoints())}getMinMax(t=u.MAX,s=u.MIN){return this.curves.forEach(i=>i.getMinMax(t,s)),{min:t,max:s}}toCommands(){return this.curves.flatMap(t=>t.toCommands())}drawTo(t){return this.curves.forEach(s=>s.drawTo(t)),this}}class yt extends k{constructor(e=[]){super(),this.points=e}getPoint(e,t=new u){const{points:s}=this,i=(s.length-1)*e,r=Math.floor(i),n=i-r,c=s[r===0?r:r-1],a=s[r],h=s[r>s.length-2?s.length-1:r+1],l=s[r>s.length-3?s.length-1:r+2];return t.set(tt(n,c.x,a.x,h.x,l.x),tt(n,c.y,a.y,h.y,l.y)),t}getControlPoints(){return this.points}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 F extends k{constructor(t){super();T(this,"curves",[]);T(this,"startPoint");T(this,"currentPoint");T(this,"autoClose",!1);T(this,"_cacheLengths",[]);t&&this.addPoints(t)}addCurve(t){return this.curves.push(t),this}addPoints(t){this.moveTo(t[0].x,t[0].y);for(let s=1,i=t.length;s<i;s++){const{x:r,y:n}=t[s];this.lineTo(r,n)}return this}addCommands(t){return U(t,this),this}addData(t){return this.addCommands(W(t)),this}getPoint(t,s=new u){const i=t*this.getLength(),r=this.getCurveLengths();let n=0;for(;n<r.length;){if(r[n]>=i){const c=r[n]-i,a=this.curves[n],h=a.getLength();return a.getPointAt(h===0?0:1-c/h,s)}n++}return s}getControlPoints(){return this.curves.flatMap(t=>t.getControlPoints())}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,r=this.curves.length;i<r;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=[],i=this.curves;let r;for(let n=0,c=i.length;n<c;n++){const h=i[n].getPoints(t);for(let l=0;l<h.length;l++){const y=h[l];r!=null&&r.equals(y)||(s.push(y),r=y)}}return this.autoClose&&s.length>1&&!s[s.length-1].equals(s[0])&&s.push(s[0]),s}_setCurrentPoint(t){return this.currentPoint=new u(t.x,t.y),this.startPoint||(this.startPoint=this.currentPoint.clone()),this}closePath(){const t=this.startPoint;if(t){const s=this.currentPoint;s&&!t.equals(s)&&(this.curves.push(new O(s.clone(),t)),s.copy(t)),this.startPoint=void 0}return this}moveTo(t,s){return this.currentPoint=new u(t,s),this.startPoint=this.currentPoint.clone(),this}lineTo(t,s){const i=this.currentPoint;return i!=null&&i.equals({x:t,y:s})||this.curves.push(new O((i==null?void 0:i.clone())??new u,new u(t,s))),this._setCurrentPoint({x:t,y:s}),this}bezierCurveTo(t,s,i,r,n,c){const a=this.currentPoint;return a!=null&&a.equals({x:n,y:c})||this.curves.push(new nt((a==null?void 0:a.clone())??new u,new u(t,s),new u(i,r),new u(n,c))),this._setCurrentPoint({x:n,y:c}),this}quadraticCurveTo(t,s,i,r){const n=this.currentPoint;return n!=null&&n.equals({x:i,y:r})||this.curves.push(new lt((n==null?void 0:n.clone())??new u,new u(t,s),new u(i,r))),this._setCurrentPoint({x:i,y:r}),this}arc(t,s,i,r,n,c){return this.ellipse(t,s,i,i,0,r,n,c),this}relativeArc(t,s,i,r,n,c){const a=this.currentPoint??new u;return this.arc(t+a.x,s+a.y,i,r,n,c),this}arcTo(t,s,i,r,n){return console.warn("Method arcTo not supported yet"),this}ellipse(t,s,i,r,n,c,a,h=!0){const l=new ot(new u(t,s),i,r,n,c,a,!h);if(this.curves.length>0){const y=l.getPoint(0);(!this.currentPoint||!y.equals(this.currentPoint))&&this.lineTo(y.x,y.y)}return this.curves.push(l),this._setCurrentPoint(l.getPoint(1)),this}relativeEllipse(t,s,i,r,n,c,a,h){const l=this.currentPoint??new u;return this.ellipse(t+l.x,s+l.y,i,r,n,c,a,h),this}rect(t,s,i,r){return this.curves.push(new ut(new u(t+i/2,s+r/2),i/2,i/r)),this._setCurrentPoint({x:t,y:s}),this}splineThru(t){const s=this.currentPoint??new u;return this.curves.push(new yt([s].concat(t))),this._setCurrentPoint(t[t.length-1]),this}getMinMax(t=u.MAX,s=u.MIN){return this.curves.forEach(i=>i.getMinMax(t,s)),{min:t,max:s}}getBoundingBox(){const{min:t,max:s}=this.getMinMax();return new L(t.x,t.y,s.x-t.x,s.y-t.y)}toCommands(){return this.curves.flatMap(t=>t.toCommands())}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(r=>r.drawTo(t)),this.autoClose&&t.closePath(),this}copy(t){var s;super.copy(t),this.curves=[];for(let i=0,r=t.curves.length;i<r;i++)this.curves.push(t.curves[i].clone());return this.autoClose=t.autoClose,this.currentPoint=(s=t.currentPoint)==null?void 0:s.clone(),this}}function Ot(o){return o.replace(/[^a-z0-9]/gi,"-").replace(/\B([A-Z])/g,"-$1").toLowerCase()}function Xt(o,e,t,s){const i=e.clone().sub(o),r=s.clone().sub(t),n=t.clone().sub(o),c=i.cross(r);if(c===0)return new u((o.x+t.x)/2,(o.y+t.y)/2);const a=n.cross(r)/c;return Math.abs(a)>1?new u((o.x+t.x)/2,(o.y+t.y)/2):new u(o.x+a*i.x,o.y+a*i.y)}class I{constructor(e,t={}){T(this,"currentPath",new F);T(this,"paths",[this.currentPath]);T(this,"style");e&&(e instanceof I?this.addPath(e):Array.isArray(e)?this.addCommands(e):this.addData(e)),this.style=t}get startPoint(){return this.currentPath.startPoint}get currentPoint(){return this.currentPath.currentPoint}get strokeWidth(){return this.style.strokeWidth??((this.style.stroke??"none")==="none"?0:1)}addPath(e){return e instanceof I?this.paths.push(...e.paths.map(t=>t.clone())):this.paths.push(e),this}closePath(){const e=this.startPoint;return e&&(this.currentPath.closePath(),this.currentPath.curves.length>0&&(this.currentPath=new F().moveTo(e.x,e.y),this.paths.push(this.currentPath))),this}moveTo(e,t){const{currentPoint:s,curves:i}=this.currentPath;return s!=null&&s.equals({x:e,y:t})||(i.length?(this.currentPath=new F().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,r,n){return this.currentPath.bezierCurveTo(e,t,s,i,r,n),this}quadraticCurveTo(e,t,s,i){return this.currentPath.quadraticCurveTo(e,t,s,i),this}arc(e,t,s,i,r,n){return this.currentPath.arc(e,t,s,i,r,n),this}arcTo(e,t,s,i,r){return this.currentPath.arcTo(e,t,s,i,r),this}ellipse(e,t,s,i,r,n,c,a){return this.currentPath.ellipse(e,t,s,i,r,n,c,a),this}rect(e,t,s,i){return this.currentPath.rect(e,t,s,i),this}addCommands(e){return U(e,this),this}addData(e){return this.addCommands(W(e)),this}splineThru(e){return this.currentPath.splineThru(e),this}getControlPoints(){return this.paths.flatMap(e=>e.getControlPoints())}getCurves(){return this.paths.flatMap(e=>e.curves)}scale(e,t=e,s={x:0,y:0}){return this.getControlPoints().forEach(i=>{i.scale(e,t,s)}),this}skew(e,t=0,s={x:0,y:0}){return this.getControlPoints().forEach(i=>{i.skew(e,t,s)}),this}rotate(e,t={x:0,y:0}){return this.getControlPoints().forEach(s=>{s.rotate(e,t)}),this}bold(e){if(e===0)return this;const t=this.getCurves(),s=[],i=[],r=[];t.forEach((c,a)=>{const h=c.getControlPoints(),l=c.isClockwise();r[a]=h,i[a]=l;const y=h[0],f=h[h.length-1]??y;s.push({start:l?f:y,end:l?y:f,index:a})});const n=[];return s.forEach((c,a)=>{n[a]=[],s.forEach((h,l)=>{l!==a&&h.start.equals(c.end)&&n[a].push(h.index)})}),t.forEach((c,a)=>{const h=i[a];r[a].forEach(y=>{const f=c.getTForPoint(y),d=c.getNormal(f).scale(h?e:-e);y.add(d)})}),n.forEach((c,a)=>{const h=r[a];c.forEach(l=>{const y=r[l],f=Xt(h[h.length-1],h[h.length-2]??h[h.length-1],y[0],y[1]??y[0]);f&&(h[h.length-1].copy(f),y[0].copy(f))})}),this}matrix(e){return this.getCurves().forEach(t=>t.matrix(e)),this}getMinMax(e=u.MAX,t=u.MIN,s=!0){const i=this.strokeWidth;return this.getCurves().forEach(r=>{if(r.getMinMax(e,t),s&&i>1){const n=i/2,c=r.isClockwise(),a=[];for(let h=0;h<=1;h+=1/r.arcLengthDivisions){const l=r.getPoint(h),y=r.getNormal(h),f=y.clone().scale(c?n:-n),d=y.clone().scale(c?-n:n);a.push(l.clone().add(f),l.clone().add(d),l.clone().add({x:n,y:0}),l.clone().add({x:-n,y:0}),l.clone().add({x:0,y:n}),l.clone().add({x:0,y:-n}),l.clone().add({x:n,y:n}),l.clone().add({x:-n,y:-n}))}e.min(...a),t.max(...a)}}),{min:e,max:t}}getBoundingBox(e=!0){const{min:t,max:s}=this.getMinMax(void 0,void 0,e);return new L(t.x,t.y,s.x-t.x,s.y-t.y)}drawTo(e,t={}){t={...this.style,...t};const{fill:s="#000",stroke:i="none"}=t;return e.beginPath(),e.save(),q(e,t),this.paths.forEach(r=>{r.drawTo(e)}),s!=="none"&&e.fill(),i!=="none"&&e.stroke(),e.restore(),this}drawControlPointsTo(e,t={}){t={...this.style,...t};const{fill:s="#000",stroke:i="none"}=t;return e.beginPath(),e.save(),q(e,t),this.getControlPoints().forEach(r=>{e.moveTo(r.x,r.y),e.arc(r.x,r.y,4,0,Math.PI*2)}),s!=="none"&&e.fill(),i!=="none"&&e.stroke(),e.restore(),this}toCommands(){return this.paths.flatMap(e=>e.toCommands())}toData(){return this.paths.map(e=>e.toData()).join(" ")}toSVGPathString(){const e={...this.style,fill:this.style.fill??"#000",stroke:this.style.stroke??"none"},t={};for(const i in e)e[i]!==void 0&&(t[Ot(i)]=e[i]);Object.assign(t,{"stroke-width":`${this.strokeWidth}px`});let s="";for(const i in t)t[i]!==void 0&&(s+=`${i}:${t[i]};`);return`<path d="${this.toData()}" style="${s}"></path>`}toSVGString(){const{x:e,y:t,width:s,height:i}=this.getBoundingBox(),r=this.toSVGPathString();return`<svg viewBox="${e} ${t} ${s} ${i}" width="${s}px" height="${i}px" xmlns="http://www.w3.org/2000/svg">${r}</svg>`}toSVGUrl(){return`data:image/svg+xml;base64,${btoa(this.toSVGString())}`}toSVG(){return new DOMParser().parseFromString(this.toSVGString(),"image/svg+xml").documentElement}toCanvas(e={}){const{pixelRatio:t=2,...s}=e,{left:i,top:r,width:n,height:c}=this.getBoundingBox(),a=document.createElement("canvas");a.width=n*t,a.height=c*t,a.style.width=`${n}px`,a.style.height=`${c}px`;const h=a.getContext("2d");return h&&(h.scale(t,t),h.translate(-i,-r),this.drawTo(h,s)),a}copy(e){return this.currentPath=e.currentPath.clone(),this.paths=e.paths.map(t=>t.clone()),this.style={...e.style},this}clone(){return new this.constructor().copy(this)}}const Ft="px",Rt=90,gt=["mm","cm","in","pt","pc","px"],ft={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 M(o){let e="px";if(typeof o=="string"||o instanceof String)for(let s=0,i=gt.length;s<i;s++){const r=gt[s];if(o.endsWith(r)){e=r,o=o.substring(0,o.length-r.length);break}}let t;return t=ft[e][Ft],t<0&&(t=ft[e].in*Rt),t*Number.parseFloat(o)}const Gt=new v,V=new v,pt=new v,dt=new v;function Vt(o,e,t){if(!(o.hasAttribute("transform")||o.nodeName==="use"&&(o.hasAttribute("x")||o.hasAttribute("y"))))return null;const s=_t(o);return t.length>0&&s.premultiply(t[t.length-1]),e.copy(s),t.push(s),s}function _t(o){const e=new v,t=Gt;if(o.nodeName==="use"&&(o.hasAttribute("x")||o.hasAttribute("y"))&&e.translate(M(o.getAttribute("x")),M(o.getAttribute("y"))),o.hasAttribute("transform")){const s=o.getAttribute("transform").split(")");for(let i=s.length-1;i>=0;i--){const r=s[i].trim();if(r==="")continue;const n=r.indexOf("("),c=r.length;if(n>0&&n<c){const a=r.slice(0,n),h=A(r.slice(n+1));switch(t.identity(),a){case"translate":if(h.length>=1){const l=h[0];let y=0;h.length>=2&&(y=h[1]),t.translate(l,y)}break;case"rotate":if(h.length>=1){let l=0,y=0,f=0;l=h[0]*Math.PI/180,h.length>=3&&(y=h[1],f=h[2]),V.makeTranslation(-y,-f),pt.makeRotation(l),dt.multiplyMatrices(pt,V),V.makeTranslation(y,f),t.multiplyMatrices(V,dt)}break;case"scale":h.length>=1&&t.scale(h[0],h[1]??h[0]);break;case"skewX":h.length===1&&t.set(1,Math.tan(h[0]*Math.PI/180),0,0,1,0,0,0,1);break;case"skewY":h.length===1&&t.set(1,0,0,Math.tan(h[0]*Math.PI/180),1,0,0,0,1);break;case"matrix":h.length===6&&t.set(h[0],h[2],h[4],h[1],h[3],h[5],0,0,1);break}}e.premultiply(t)}}return e}function Bt(o){return new I().addPath(new F().arc(M(o.getAttribute("cx")||0),M(o.getAttribute("cy")||0),M(o.getAttribute("r")||0),0,Math.PI*2))}function Ut(o,e){if(!(!o.sheet||!o.sheet.cssRules||!o.sheet.cssRules.length))for(let t=0;t<o.sheet.cssRules.length;t++){const s=o.sheet.cssRules[t];if(s.type!==1)continue;const i=s.selectorText.split(/,/g).filter(Boolean).map(n=>n.trim()),r={};for(let n=s.style.length,c=0;c<n;c++){const a=s.style.item(c);r[a]=s.style.getPropertyValue(a)}for(let n=0;n<i.length;n++)e[i[n]]=Object.assign(e[i[n]]||{},{...r})}}function Wt(o){return new I().addPath(new F().ellipse(M(o.getAttribute("cx")||0),M(o.getAttribute("cy")||0),M(o.getAttribute("rx")||0),M(o.getAttribute("ry")||0),0,0,Math.PI*2))}function Yt(o){return new I().moveTo(M(o.getAttribute("x1")||0),M(o.getAttribute("y1")||0)).lineTo(M(o.getAttribute("x2")||0),M(o.getAttribute("y2")||0))}function Qt(o){const e=new I,t=o.getAttribute("d");return!t||t==="none"?null:(e.addData(t),e)}const jt=/([+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)(?:,|\s)([+-]?\d*\.?\d+(?:e[+-]?\d+)?)/g;function Ht(o){var s;const e=new I;let t=0;return(s=o.getAttribute("points"))==null||s.replace(jt,(i,r,n)=>{const c=M(r),a=M(n);return t===0?e.moveTo(c,a):e.lineTo(c,a),t++,i}),e.currentPath.autoClose=!0,e}const Zt=/([+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)(?:,|\s)([+-]?\d*\.?\d+(?:e[+-]?\d+)?)/g;function Jt(o){var s;const e=new I;let t=0;return(s=o.getAttribute("points"))==null||s.replace(Zt,(i,r,n)=>{const c=M(r),a=M(n);return t===0?e.moveTo(c,a):e.lineTo(c,a),t++,i}),e.currentPath.autoClose=!1,e}function Kt(o){const e=M(o.getAttribute("x")||0),t=M(o.getAttribute("y")||0),s=M(o.getAttribute("rx")||o.getAttribute("ry")||0),i=M(o.getAttribute("ry")||o.getAttribute("rx")||0),r=M(o.getAttribute("width")),n=M(o.getAttribute("height")),c=1-.551915024494,a=new I;return a.moveTo(e+s,t),a.lineTo(e+r-s,t),(s!==0||i!==0)&&a.bezierCurveTo(e+r-s*c,t,e+r,t+i*c,e+r,t+i),a.lineTo(e+r,t+n-i),(s!==0||i!==0)&&a.bezierCurveTo(e+r,t+n-i*c,e+r-s*c,t+n,e+r-s,t+n),a.lineTo(e+s,t+n),(s!==0||i!==0)&&a.bezierCurveTo(e+s*c,t+n,e,t+n-i*c,e,t+n-i),a.lineTo(e,t+i),(s!==0||i!==0)&&a.bezierCurveTo(e,t+i*c,e+s*c,t,e+s,t),a}function N(o,e,t){e=Object.assign({},e);let s={};if(o.hasAttribute("class")){const h=o.getAttribute("class").split(/\s/).filter(Boolean).map(l=>l.trim());for(let l=0;l<h.length;l++)s=Object.assign(s,t[`.${h[l]}`])}o.hasAttribute("id")&&(s=Object.assign(s,t[`#${o.getAttribute("id")}`]));for(let h=o.style.length,l=0;l<h;l++){const y=o.style.item(l),f=o.style.getPropertyValue(y);e[y]=f,s[y]=f}function i(h,l,y=r){o.hasAttribute(h)&&(e[l]=y(o.getAttribute(h))),s[h]&&(e[l]=y(s[h]))}function r(h){return h.startsWith("url")&&console.warn("url access in attributes is not implemented."),h}function n(h){return Math.max(0,Math.min(1,M(h)))}function c(h){return Math.max(0,M(h))}function a(h){return h.split(" ").filter(l=>l!=="").map(l=>M(l))}return i("fill","fill"),i("fill-opacity","fillOpacity",n),i("fill-rule","fillRule"),i("opacity","opacity",n),i("stroke","stroke"),i("stroke-opacity","strokeOpacity",n),i("stroke-width","strokeWidth",c),i("stroke-linecap","strokeLinecap"),i("stroke-linejoin","strokeLinejoin"),i("stroke-miterlimit","strokeMiterlimit",c),i("stroke-dasharray","strokeDasharray",a),i("stroke-dashoffset","strokeDashoffset",M),i("visibility","visibility"),e}function Y(o,e,t=[],s={}){var y;if(o.nodeType!==1)return t;let i=!1,r=null,n={...e};switch(o.nodeName){case"svg":n=N(o,n,s);break;case"style":Ut(o,s);break;case"g":n=N(o,n,s);break;case"path":n=N(o,n,s),o.hasAttribute("d")&&(r=Qt(o));break;case"rect":n=N(o,n,s),r=Kt(o);break;case"polygon":n=N(o,n,s),r=Ht(o);break;case"polyline":n=N(o,n,s),r=Jt(o);break;case"circle":n=N(o,n,s),r=Bt(o);break;case"ellipse":n=N(o,n,s),r=Wt(o);break;case"line":n=N(o,n,s),r=Yt(o);break;case"defs":i=!0;break;case"use":{n=N(o,n,s);const d=(o.getAttributeNS("http://www.w3.org/1999/xlink","href")||"").substring(1),g=(y=o.viewportElement)==null?void 0:y.getElementById(d);g?Y(g,n,t,s):console.warn(`'use node' references non-existent node id: ${d}`);break}default:console.warn(o);break}if(n.display==="none")return t;Object.assign(e,n);const c=new v,a=[],h=Vt(o,c,a);r&&(r.matrix(c),t.push(r),r.style=e);const l=o.childNodes;for(let f=0,d=l.length;f<d;f++){const g=l[f];i&&g.nodeName!=="style"&&g.nodeName!=="defs"||Y(g,e,t,s)}return h&&(a.pop(),a.length>0?c.copy(a[a.length-1]):c.identity()),t}const xt="data:image/svg+xml;",mt=`${xt}base64,`,Mt=`${xt}charset=utf8,`;function Pt(o){if(typeof o=="string"){let e;o.startsWith(mt)?(o=o.substring(mt.length,o.length),e=atob(o)):o.startsWith(Mt)?(o=o.substring(Mt.length,o.length),e=decodeURIComponent(o)):e=o;const t=new DOMParser().parseFromString(e,"text/xml"),s=t.querySelector("parsererror");if(s)throw new Error(`${s.textContent??"parser error"}
2
+ ${e}`);return t.documentElement}else return o}function te(o){return Y(Pt(o),{})}function Q(o,e=!0){if(!o.length)return;const t=u.MAX,s=u.MIN;return o.forEach(i=>i.getMinMax(t,s,e)),new L(t.x,t.y,s.x-t.x,s.y-t.y)}function j(o){const{x:e,y:t,width:s,height:i}=Q(o),r=o.map(n=>n.toSVGPathString()).join("");return`<svg viewBox="${e} ${t} ${s} ${i}" width="${s}px" height="${i}px" xmlns="http://www.w3.org/2000/svg">${r}</svg>`}function ee(o){return`data:image/svg+xml;base64,${btoa(j(o))}`}function se(o){return new DOMParser().parseFromString(j(o),"image/svg+xml").documentElement}function ne(o,e={}){const{pixelRatio:t=2,...s}=e,{left:i,top:r,width:n,height:c}=Q(o),a=document.createElement("canvas");a.width=n*t,a.height=c*t,a.style.width=`${n}px`,a.style.height=`${c}px`;const h=a.getContext("2d");return h&&(h.scale(t,t),h.translate(-i,-r),o.forEach(l=>{l.drawTo(h,s)})),a}p.BoundingBox=L,p.CircleCurve=R,p.CubicBezierCurve=nt,p.Curve=k,p.CurvePath=F,p.EllipseCurve=ot,p.HeartCurve=zt,p.LineCurve=O,p.Matrix3=v,p.Path2D=I,p.PloygonCurve=Dt,p.QuadraticBezierCurve=lt,p.RectangularCurve=ut,p.SplineCurve=yt,p.Vector2=u,p.addPathCommandsToPath2D=U,p.getPathsBoundingBox=Q,p.parseArcCommand=J,p.parsePathDataArgs=A,p.parseSVG=te,p.parseSVGToDOM=Pt,p.pathCommandsToPathData=K,p.pathDataToPathCommands=W,p.pathsToCanvas=ne,p.pathsToSVG=se,p.pathsToSVGString=j,p.pathsToSVGUrl=ee,p.setCanvasContext=q,Object.defineProperty(p,Symbol.toStringTag,{value:"Module"})});
package/dist/index.mjs CHANGED
@@ -250,15 +250,9 @@ class BoundingBox {
250
250
  }
251
251
  }
252
252
 
253
- var __defProp$6 = Object.defineProperty;
254
- var __defNormalProp$6 = (obj, key, value) => key in obj ? __defProp$6(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
255
- var __publicField$6 = (obj, key, value) => {
256
- __defNormalProp$6(obj, typeof key !== "symbol" ? key + "" : key, value);
257
- return value;
258
- };
259
253
  class Matrix3 {
254
+ elements = [];
260
255
  constructor(n11 = 1, n12 = 0, n13 = 0, n21 = 0, n22 = 1, n23 = 0, n31 = 0, n32 = 0, n33 = 1) {
261
- __publicField$6(this, "elements", []);
262
256
  this.set(n11, n12, n13, n21, n22, n23, n31, n32, n33);
263
257
  }
264
258
  set(n11, n12, n13, n21, n22, n23, n31, n32, n33) {
@@ -696,8 +690,7 @@ function parsePathDataArgs(input, flags, stride = 0) {
696
690
  if (number !== "") {
697
691
  if (exponent === "")
698
692
  result.push(Number(number));
699
- else
700
- result.push(Number(number) * 10 ** Number(exponent));
693
+ else result.push(Number(number) * 10 ** Number(exponent));
701
694
  }
702
695
  number = "";
703
696
  exponent = "";
@@ -997,18 +990,10 @@ function pathDataToPathCommands(d) {
997
990
  return commands;
998
991
  }
999
992
 
1000
- var __defProp$5 = Object.defineProperty;
1001
- var __defNormalProp$5 = (obj, key, value) => key in obj ? __defProp$5(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
1002
- var __publicField$5 = (obj, key, value) => {
1003
- __defNormalProp$5(obj, typeof key !== "symbol" ? key + "" : key, value);
1004
- return value;
1005
- };
1006
993
  class Curve {
1007
- constructor() {
1008
- __publicField$5(this, "arcLengthDivisions", 200);
1009
- __publicField$5(this, "_cacheArcLengths");
1010
- __publicField$5(this, "_needsUpdate", false);
1011
- }
994
+ arcLengthDivisions = 200;
995
+ _cacheArcLengths;
996
+ _needsUpdate = false;
1012
997
  isClockwise() {
1013
998
  const prev = this.getPoint(1);
1014
999
  const cur = this.getPoint(0.5);
@@ -1362,10 +1347,8 @@ class EllipseCurve extends Curve {
1362
1347
  const twoPi = Math.PI * 2;
1363
1348
  let deltaAngle = this.endAngle - this.startAngle;
1364
1349
  const samePoints = Math.abs(deltaAngle) < Number.EPSILON;
1365
- while (deltaAngle < 0)
1366
- deltaAngle += twoPi;
1367
- while (deltaAngle > twoPi)
1368
- deltaAngle -= twoPi;
1350
+ while (deltaAngle < 0) deltaAngle += twoPi;
1351
+ while (deltaAngle > twoPi) deltaAngle -= twoPi;
1369
1352
  if (deltaAngle < Number.EPSILON) {
1370
1353
  if (samePoints) {
1371
1354
  deltaAngle = 0;
@@ -1677,12 +1660,6 @@ class LineCurve extends Curve {
1677
1660
  }
1678
1661
  }
1679
1662
 
1680
- var __defProp$4 = Object.defineProperty;
1681
- var __defNormalProp$4 = (obj, key, value) => key in obj ? __defProp$4(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
1682
- var __publicField$4 = (obj, key, value) => {
1683
- __defNormalProp$4(obj, typeof key !== "symbol" ? key + "" : key, value);
1684
- return value;
1685
- };
1686
1663
  class HeartCurve extends Curve {
1687
1664
  constructor(center, size, start = 0, end = 1) {
1688
1665
  super();
@@ -1690,9 +1667,9 @@ class HeartCurve extends Curve {
1690
1667
  this.size = size;
1691
1668
  this.start = start;
1692
1669
  this.end = end;
1693
- __publicField$4(this, "curveT", 0);
1694
1670
  this.update();
1695
1671
  }
1672
+ curveT = 0;
1696
1673
  update() {
1697
1674
  const { x, y } = this.center;
1698
1675
  const A = new Vector2(x + 0.5 * this.size, y - 0.5 * this.size);
@@ -1763,12 +1740,6 @@ class HeartCurve extends Curve {
1763
1740
  }
1764
1741
  }
1765
1742
 
1766
- var __defProp$3 = Object.defineProperty;
1767
- var __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
1768
- var __publicField$3 = (obj, key, value) => {
1769
- __defNormalProp$3(obj, typeof key !== "symbol" ? key + "" : key, value);
1770
- return value;
1771
- };
1772
1743
  class PloygonCurve extends Curve {
1773
1744
  constructor(center, radius = 0, number = 0, start = 0, end = 1) {
1774
1745
  super();
@@ -1777,11 +1748,11 @@ class PloygonCurve extends Curve {
1777
1748
  this.number = number;
1778
1749
  this.start = start;
1779
1750
  this.end = end;
1780
- __publicField$3(this, "curves", []);
1781
- __publicField$3(this, "curveT", 0);
1782
- __publicField$3(this, "points", []);
1783
1751
  this.update();
1784
1752
  }
1753
+ curves = [];
1754
+ curveT = 0;
1755
+ points = [];
1785
1756
  update() {
1786
1757
  for (let i = 0; i < this.number; i++) {
1787
1758
  let radian = i * 2 * Math.PI / this.number;
@@ -1890,12 +1861,6 @@ class QuadraticBezierCurve extends Curve {
1890
1861
  }
1891
1862
  }
1892
1863
 
1893
- var __defProp$2 = Object.defineProperty;
1894
- var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
1895
- var __publicField$2 = (obj, key, value) => {
1896
- __defNormalProp$2(obj, typeof key !== "symbol" ? key + "" : key, value);
1897
- return value;
1898
- };
1899
1864
  class RectangularCurve extends Curve {
1900
1865
  constructor(center, rx, aspectRatio = 1, start = 0, end = 1) {
1901
1866
  super();
@@ -1904,10 +1869,10 @@ class RectangularCurve extends Curve {
1904
1869
  this.aspectRatio = aspectRatio;
1905
1870
  this.start = start;
1906
1871
  this.end = end;
1907
- __publicField$2(this, "curves", []);
1908
- __publicField$2(this, "curveT", 0);
1909
1872
  this.update();
1910
1873
  }
1874
+ curves = [];
1875
+ curveT = 0;
1911
1876
  get x() {
1912
1877
  return this.center.x - this.rx;
1913
1878
  }
@@ -2016,20 +1981,14 @@ class SplineCurve extends Curve {
2016
1981
  }
2017
1982
  }
2018
1983
 
2019
- var __defProp$1 = Object.defineProperty;
2020
- var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
2021
- var __publicField$1 = (obj, key, value) => {
2022
- __defNormalProp$1(obj, typeof key !== "symbol" ? key + "" : key, value);
2023
- return value;
2024
- };
2025
1984
  class CurvePath extends Curve {
1985
+ curves = [];
1986
+ startPoint;
1987
+ currentPoint;
1988
+ autoClose = false;
1989
+ _cacheLengths = [];
2026
1990
  constructor(points) {
2027
1991
  super();
2028
- __publicField$1(this, "curves", []);
2029
- __publicField$1(this, "startPoint");
2030
- __publicField$1(this, "currentPoint");
2031
- __publicField$1(this, "autoClose", false);
2032
- __publicField$1(this, "_cacheLengths", []);
2033
1992
  if (points) {
2034
1993
  this.addPoints(points);
2035
1994
  }
@@ -2308,17 +2267,20 @@ function getIntersectionPoint(p1, p2, q1, q2) {
2308
2267
  );
2309
2268
  }
2310
2269
 
2311
- var __defProp = Object.defineProperty;
2312
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
2313
- var __publicField = (obj, key, value) => {
2314
- __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
2315
- return value;
2316
- };
2317
2270
  class Path2D {
2271
+ currentPath = new CurvePath();
2272
+ paths = [this.currentPath];
2273
+ style;
2274
+ get startPoint() {
2275
+ return this.currentPath.startPoint;
2276
+ }
2277
+ get currentPoint() {
2278
+ return this.currentPath.currentPoint;
2279
+ }
2280
+ get strokeWidth() {
2281
+ return this.style.strokeWidth ?? ((this.style.stroke ?? "none") === "none" ? 0 : 1);
2282
+ }
2318
2283
  constructor(path, style = {}) {
2319
- __publicField(this, "currentPath", new CurvePath());
2320
- __publicField(this, "paths", [this.currentPath]);
2321
- __publicField(this, "style");
2322
2284
  if (path) {
2323
2285
  if (path instanceof Path2D) {
2324
2286
  this.addPath(path);
@@ -2330,15 +2292,6 @@ class Path2D {
2330
2292
  }
2331
2293
  this.style = style;
2332
2294
  }
2333
- get startPoint() {
2334
- return this.currentPath.startPoint;
2335
- }
2336
- get currentPoint() {
2337
- return this.currentPath.currentPoint;
2338
- }
2339
- get strokeWidth() {
2340
- return this.style.strokeWidth ?? ((this.style.stroke ?? "none") === "none" ? 0 : 1);
2341
- }
2342
2295
  addPath(path) {
2343
2296
  if (path instanceof Path2D) {
2344
2297
  this.paths.push(...path.paths.map((v) => v.clone()));
@@ -2574,7 +2527,7 @@ class Path2D {
2574
2527
  toData() {
2575
2528
  return this.paths.map((path) => path.toData()).join(" ");
2576
2529
  }
2577
- toSvgPathString() {
2530
+ toSVGPathString() {
2578
2531
  const style = {
2579
2532
  ...this.style,
2580
2533
  fill: this.style.fill ?? "#000",
@@ -2597,16 +2550,16 @@ class Path2D {
2597
2550
  }
2598
2551
  return `<path d="${this.toData()}" style="${cssText}"></path>`;
2599
2552
  }
2600
- toSvgString() {
2553
+ toSVGString() {
2601
2554
  const { x, y, width, height } = this.getBoundingBox();
2602
- const path = this.toSvgPathString();
2555
+ const path = this.toSVGPathString();
2603
2556
  return `<svg viewBox="${x} ${y} ${width} ${height}" width="${width}px" height="${height}px" xmlns="http://www.w3.org/2000/svg">${path}</svg>`;
2604
2557
  }
2605
- toSvgUrl() {
2606
- return `data:image/svg+xml;base64,${btoa(this.toSvgString())}`;
2558
+ toSVGUrl() {
2559
+ return `data:image/svg+xml;base64,${btoa(this.toSVGString())}`;
2607
2560
  }
2608
- toSvg() {
2609
- return new DOMParser().parseFromString(this.toSvgString(), "image/svg+xml").documentElement;
2561
+ toSVG() {
2562
+ return new DOMParser().parseFromString(this.toSVGString(), "image/svg+xml").documentElement;
2610
2563
  }
2611
2564
  toCanvas(options = {}) {
2612
2565
  const { pixelRatio = 2, ...style } = options;
@@ -2696,9 +2649,7 @@ function parseFloatWithUnits(string) {
2696
2649
  }
2697
2650
  }
2698
2651
  let scale;
2699
- if (theUnit === "px" && defaultUnit !== "px") {
2700
- scale = unitConversion.in[defaultUnit] / defaultDPI;
2701
- } else {
2652
+ {
2702
2653
  scale = unitConversion[theUnit][defaultUnit];
2703
2654
  if (scale < 0) {
2704
2655
  scale = unitConversion[theUnit].in * defaultDPI;
@@ -3139,7 +3090,7 @@ function parseNode(node, style, paths = [], stylesheets = {}) {
3139
3090
  const dataUri = "data:image/svg+xml;";
3140
3091
  const base64DataUri = `${dataUri}base64,`;
3141
3092
  const utf8DataUri = `${dataUri}charset=utf8,`;
3142
- function parseSvgToDom(svg) {
3093
+ function parseSVGToDOM(svg) {
3143
3094
  if (typeof svg === "string") {
3144
3095
  let xml;
3145
3096
  if (svg.startsWith(base64DataUri)) {
@@ -3151,16 +3102,19 @@ function parseSvgToDom(svg) {
3151
3102
  } else {
3152
3103
  xml = svg;
3153
3104
  }
3154
- return new DOMParser().parseFromString(
3155
- xml,
3156
- "image/svg+xml"
3157
- ).documentElement;
3105
+ const doc = new DOMParser().parseFromString(xml, "text/xml");
3106
+ const error = doc.querySelector("parsererror");
3107
+ if (error) {
3108
+ throw new Error(`${error.textContent ?? "parser error"}
3109
+ ${xml}`);
3110
+ }
3111
+ return doc.documentElement;
3158
3112
  } else {
3159
3113
  return svg;
3160
3114
  }
3161
3115
  }
3162
- function parseSvg(svg) {
3163
- return parseNode(parseSvgToDom(svg), {});
3116
+ function parseSVG(svg) {
3117
+ return parseNode(parseSVGToDOM(svg), {});
3164
3118
  }
3165
3119
 
3166
3120
  function getPathsBoundingBox(paths, withStyle = true) {
@@ -3172,16 +3126,16 @@ function getPathsBoundingBox(paths, withStyle = true) {
3172
3126
  paths.forEach((path) => path.getMinMax(min, max, withStyle));
3173
3127
  return new BoundingBox(min.x, min.y, max.x - min.x, max.y - min.y);
3174
3128
  }
3175
- function pathsToSvgString(paths) {
3129
+ function pathsToSVGString(paths) {
3176
3130
  const { x, y, width, height } = getPathsBoundingBox(paths);
3177
- const content = paths.map((path) => path.toSvgPathString()).join("");
3131
+ const content = paths.map((path) => path.toSVGPathString()).join("");
3178
3132
  return `<svg viewBox="${x} ${y} ${width} ${height}" width="${width}px" height="${height}px" xmlns="http://www.w3.org/2000/svg">${content}</svg>`;
3179
3133
  }
3180
- function pathsToSvgUrl(paths) {
3181
- return `data:image/svg+xml;base64,${btoa(pathsToSvgString(paths))}`;
3134
+ function pathsToSVGUrl(paths) {
3135
+ return `data:image/svg+xml;base64,${btoa(pathsToSVGString(paths))}`;
3182
3136
  }
3183
- function pathsToSvg(paths) {
3184
- return new DOMParser().parseFromString(pathsToSvgString(paths), "image/svg+xml").documentElement;
3137
+ function pathsToSVG(paths) {
3138
+ return new DOMParser().parseFromString(pathsToSVGString(paths), "image/svg+xml").documentElement;
3185
3139
  }
3186
3140
  function pathsToCanvas(paths, options = {}) {
3187
3141
  const { pixelRatio = 2, ...style } = options;
@@ -3202,4 +3156,4 @@ function pathsToCanvas(paths, options = {}) {
3202
3156
  return canvas;
3203
3157
  }
3204
3158
 
3205
- export { BoundingBox, CircleCurve, CubicBezierCurve, Curve, CurvePath, EllipseCurve, HeartCurve, LineCurve, Matrix3, Path2D, PloygonCurve, QuadraticBezierCurve, RectangularCurve, SplineCurve, Vector2, addPathCommandsToPath2D, getPathsBoundingBox, parseArcCommand, parsePathDataArgs, parseSvg, parseSvgToDom, pathCommandsToPathData, pathDataToPathCommands, pathsToCanvas, pathsToSvg, pathsToSvgString, pathsToSvgUrl, setCanvasContext };
3159
+ export { BoundingBox, CircleCurve, CubicBezierCurve, Curve, CurvePath, EllipseCurve, HeartCurve, LineCurve, Matrix3, Path2D, PloygonCurve, QuadraticBezierCurve, RectangularCurve, SplineCurve, Vector2, addPathCommandsToPath2D, getPathsBoundingBox, parseArcCommand, parsePathDataArgs, parseSVG, parseSVGToDOM, pathCommandsToPathData, pathDataToPathCommands, pathsToCanvas, pathsToSVG, pathsToSVGString, pathsToSVGUrl, setCanvasContext };
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "modern-path2d",
3
3
  "type": "module",
4
- "version": "0.2.8",
5
- "packageManager": "pnpm@9.9.0",
4
+ "version": "1.0.0",
5
+ "packageManager": "pnpm@9.15.1",
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",
8
8
  "license": "MIT",
@@ -56,17 +56,17 @@
56
56
  "prepare": "simple-git-hooks"
57
57
  },
58
58
  "devDependencies": {
59
- "@antfu/eslint-config": "^3.7.1",
60
- "@types/node": "^22.6.1",
61
- "bumpp": "^9.5.2",
59
+ "@antfu/eslint-config": "^3.12.0",
60
+ "@types/node": "^22.10.2",
61
+ "bumpp": "^9.9.2",
62
62
  "conventional-changelog-cli": "^5.0.0",
63
- "eslint": "^9.11.1",
64
- "lint-staged": "^15.2.10",
63
+ "eslint": "^9.17.0",
64
+ "lint-staged": "^15.2.11",
65
65
  "simple-git-hooks": "^2.11.1",
66
- "typescript": "^5.6.2",
67
- "unbuild": "^2.0.0",
68
- "vite": "^5.4.7",
69
- "vitest": "^2.1.1"
66
+ "typescript": "^5.7.2",
67
+ "unbuild": "^3.0.1",
68
+ "vite": "^6.0.5",
69
+ "vitest": "^2.1.8"
70
70
  },
71
71
  "simple-git-hooks": {
72
72
  "pre-commit": "pnpm lint-staged"