modern-path2d 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +58 -46
- package/dist/index.d.cts +16 -10
- package/dist/index.d.mts +16 -10
- package/dist/index.d.ts +16 -10
- package/dist/index.js +1 -1
- package/dist/index.mjs +58 -46
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -979,13 +979,13 @@ class Curve {
|
|
|
979
979
|
drawTo(ctx) {
|
|
980
980
|
return this;
|
|
981
981
|
}
|
|
982
|
-
clone() {
|
|
983
|
-
return new this.constructor().copy(this);
|
|
984
|
-
}
|
|
985
982
|
copy(source) {
|
|
986
983
|
this.arcLengthDivisions = source.arcLengthDivisions;
|
|
987
984
|
return this;
|
|
988
985
|
}
|
|
986
|
+
clone() {
|
|
987
|
+
return new this.constructor().copy(this);
|
|
988
|
+
}
|
|
989
989
|
}
|
|
990
990
|
|
|
991
991
|
class CircleCurve extends Curve {
|
|
@@ -1072,6 +1072,13 @@ class CubicBezierCurve extends Curve {
|
|
|
1072
1072
|
);
|
|
1073
1073
|
return output;
|
|
1074
1074
|
}
|
|
1075
|
+
transform(matrix) {
|
|
1076
|
+
this.v0.applyMatrix3(matrix);
|
|
1077
|
+
this.v1.applyMatrix3(matrix);
|
|
1078
|
+
this.v2.applyMatrix3(matrix);
|
|
1079
|
+
this.v3.applyMatrix3(matrix);
|
|
1080
|
+
return this;
|
|
1081
|
+
}
|
|
1075
1082
|
getMinMax(min = Point2D.MAX, max = Point2D.MIN) {
|
|
1076
1083
|
const { v0, v1, v2, v3 } = this;
|
|
1077
1084
|
min.x = Math.min(min.x, v0.x, v1.x, v2.x, v3.x);
|
|
@@ -1080,13 +1087,6 @@ class CubicBezierCurve extends Curve {
|
|
|
1080
1087
|
max.y = Math.max(max.y, v0.y, v1.y, v2.y, v3.y);
|
|
1081
1088
|
return { min, max };
|
|
1082
1089
|
}
|
|
1083
|
-
transform(matrix) {
|
|
1084
|
-
this.v0.applyMatrix3(matrix);
|
|
1085
|
-
this.v1.applyMatrix3(matrix);
|
|
1086
|
-
this.v2.applyMatrix3(matrix);
|
|
1087
|
-
this.v3.applyMatrix3(matrix);
|
|
1088
|
-
return this;
|
|
1089
|
-
}
|
|
1090
1090
|
getCommands() {
|
|
1091
1091
|
const { v0, v1, v2, v3 } = this;
|
|
1092
1092
|
return [
|
|
@@ -1126,9 +1126,6 @@ class EllipseCurve extends Curve {
|
|
|
1126
1126
|
this.clockwise = clockwise;
|
|
1127
1127
|
this.rotation = rotation;
|
|
1128
1128
|
}
|
|
1129
|
-
getDivisions(divisions = 12) {
|
|
1130
|
-
return divisions * 2;
|
|
1131
|
-
}
|
|
1132
1129
|
getPoint(t, output = new Point2D()) {
|
|
1133
1130
|
const twoPi = Math.PI * 2;
|
|
1134
1131
|
let deltaAngle = this.endAngle - this.startAngle;
|
|
@@ -1164,6 +1161,9 @@ class EllipseCurve extends Curve {
|
|
|
1164
1161
|
}
|
|
1165
1162
|
return output.set(_x, _y);
|
|
1166
1163
|
}
|
|
1164
|
+
getDivisions(divisions = 12) {
|
|
1165
|
+
return divisions * 2;
|
|
1166
|
+
}
|
|
1167
1167
|
getCommands() {
|
|
1168
1168
|
const { x, y, radiusX, radiusY, startAngle, endAngle, clockwise } = this;
|
|
1169
1169
|
const anticlockwise = !clockwise;
|
|
@@ -1377,9 +1377,6 @@ class LineCurve extends Curve {
|
|
|
1377
1377
|
this.v1 = v1;
|
|
1378
1378
|
this.v2 = v2;
|
|
1379
1379
|
}
|
|
1380
|
-
getDivisions() {
|
|
1381
|
-
return 1;
|
|
1382
|
-
}
|
|
1383
1380
|
getPoint(t, output = new Point2D()) {
|
|
1384
1381
|
if (t === 1) {
|
|
1385
1382
|
output.copy(this.v2);
|
|
@@ -1398,12 +1395,13 @@ class LineCurve extends Curve {
|
|
|
1398
1395
|
getTangentAt(u, output = new Point2D()) {
|
|
1399
1396
|
return this.getTangent(u, output);
|
|
1400
1397
|
}
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1398
|
+
transform(matrix) {
|
|
1399
|
+
this.v1.applyMatrix3(matrix);
|
|
1400
|
+
this.v2.applyMatrix3(matrix);
|
|
1401
|
+
return this;
|
|
1402
|
+
}
|
|
1403
|
+
getDivisions() {
|
|
1404
|
+
return 1;
|
|
1407
1405
|
}
|
|
1408
1406
|
getMinMax(min = Point2D.MAX, max = Point2D.MIN) {
|
|
1409
1407
|
const { v1, v2 } = this;
|
|
@@ -1413,10 +1411,12 @@ class LineCurve extends Curve {
|
|
|
1413
1411
|
max.y = Math.max(max.y, v1.y, v2.y);
|
|
1414
1412
|
return { min, max };
|
|
1415
1413
|
}
|
|
1416
|
-
|
|
1417
|
-
this
|
|
1418
|
-
|
|
1419
|
-
|
|
1414
|
+
getCommands() {
|
|
1415
|
+
const { v1, v2 } = this;
|
|
1416
|
+
return [
|
|
1417
|
+
{ type: "M", x: v1.x, y: v1.y },
|
|
1418
|
+
{ type: "L", x: v2.x, y: v2.y }
|
|
1419
|
+
];
|
|
1420
1420
|
}
|
|
1421
1421
|
drawTo(ctx) {
|
|
1422
1422
|
const { v1, v2 } = this;
|
|
@@ -1587,12 +1587,11 @@ class QuadraticBezierCurve extends Curve {
|
|
|
1587
1587
|
);
|
|
1588
1588
|
return output;
|
|
1589
1589
|
}
|
|
1590
|
-
|
|
1591
|
-
|
|
1592
|
-
|
|
1593
|
-
|
|
1594
|
-
|
|
1595
|
-
];
|
|
1590
|
+
transform(matrix) {
|
|
1591
|
+
this.v0.applyMatrix3(matrix);
|
|
1592
|
+
this.v1.applyMatrix3(matrix);
|
|
1593
|
+
this.v2.applyMatrix3(matrix);
|
|
1594
|
+
return this;
|
|
1596
1595
|
}
|
|
1597
1596
|
getMinMax(min = Point2D.MAX, max = Point2D.MIN) {
|
|
1598
1597
|
const { v0, v1, v2 } = this;
|
|
@@ -1606,11 +1605,12 @@ class QuadraticBezierCurve extends Curve {
|
|
|
1606
1605
|
max.y = Math.max(max.y, v0.y, v2.y, y1, y2);
|
|
1607
1606
|
return { min, max };
|
|
1608
1607
|
}
|
|
1609
|
-
|
|
1610
|
-
this
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
|
|
1608
|
+
getCommands() {
|
|
1609
|
+
const { v0, v1, v2 } = this;
|
|
1610
|
+
return [
|
|
1611
|
+
{ type: "M", x: v0.x, y: v0.y },
|
|
1612
|
+
{ type: "Q", x1: v1.x, y1: v1.y, x: v2.x, y: v2.y }
|
|
1613
|
+
];
|
|
1614
1614
|
}
|
|
1615
1615
|
drawTo(ctx) {
|
|
1616
1616
|
const { v0, v1, v2 } = this;
|
|
@@ -1939,9 +1939,8 @@ class CurvePath extends Curve {
|
|
|
1939
1939
|
copy(source) {
|
|
1940
1940
|
super.copy(source);
|
|
1941
1941
|
this.curves = [];
|
|
1942
|
-
for (let i = 0,
|
|
1943
|
-
|
|
1944
|
-
this.curves.push(curve.clone());
|
|
1942
|
+
for (let i = 0, len = source.curves.length; i < len; i++) {
|
|
1943
|
+
this.curves.push(source.curves[i].clone());
|
|
1945
1944
|
}
|
|
1946
1945
|
this.autoClose = source.autoClose;
|
|
1947
1946
|
this.currentPoint.copy(source.currentPoint);
|
|
@@ -2066,21 +2065,25 @@ class Path2D {
|
|
|
2066
2065
|
this.forEachCurve((curve) => curve.getMinMax(min, max));
|
|
2067
2066
|
return { min, max };
|
|
2068
2067
|
}
|
|
2069
|
-
getCommands() {
|
|
2070
|
-
return this.paths.flatMap((path) => path.curves.flatMap((curve) => curve.getCommands()));
|
|
2071
|
-
}
|
|
2072
|
-
getData() {
|
|
2073
|
-
return this.paths.map((path) => path.getData()).join(" ");
|
|
2074
|
-
}
|
|
2075
2068
|
getBoundingBox() {
|
|
2076
2069
|
const { min, max } = this.getMinMax();
|
|
2077
2070
|
return {
|
|
2078
2071
|
x: min.x,
|
|
2079
2072
|
y: min.y,
|
|
2073
|
+
left: min.x,
|
|
2074
|
+
top: min.y,
|
|
2075
|
+
right: max.x,
|
|
2076
|
+
bottom: max.y,
|
|
2080
2077
|
width: max.x - min.x,
|
|
2081
2078
|
height: max.y - min.y
|
|
2082
2079
|
};
|
|
2083
2080
|
}
|
|
2081
|
+
getCommands() {
|
|
2082
|
+
return this.paths.flatMap((path) => path.curves.flatMap((curve) => curve.getCommands()));
|
|
2083
|
+
}
|
|
2084
|
+
getData() {
|
|
2085
|
+
return this.paths.map((path) => path.getData()).join(" ");
|
|
2086
|
+
}
|
|
2084
2087
|
getSvgString() {
|
|
2085
2088
|
const { x, y, width, height } = this.getBoundingBox();
|
|
2086
2089
|
return `<svg viewBox="${x} ${y} ${width} ${height}" xmlns="http://www.w3.org/2000/svg"><path fill="none" stroke="currentColor" d="${this.getData()}"></path></svg>`;
|
|
@@ -2101,6 +2104,15 @@ class Path2D {
|
|
|
2101
2104
|
this.drawTo(ctx);
|
|
2102
2105
|
ctx.fill();
|
|
2103
2106
|
}
|
|
2107
|
+
copy(source) {
|
|
2108
|
+
source.currentPath = this.currentPath.clone();
|
|
2109
|
+
source.paths = this.paths.map((path) => path.clone());
|
|
2110
|
+
source.userData = this.userData;
|
|
2111
|
+
return this;
|
|
2112
|
+
}
|
|
2113
|
+
clone() {
|
|
2114
|
+
return new Path2D().copy(this);
|
|
2115
|
+
}
|
|
2104
2116
|
}
|
|
2105
2117
|
|
|
2106
2118
|
const defaultUnit = "px";
|
package/dist/index.d.cts
CHANGED
|
@@ -103,19 +103,25 @@ declare class Path2D<T = any> {
|
|
|
103
103
|
min: Point2D;
|
|
104
104
|
max: Point2D;
|
|
105
105
|
};
|
|
106
|
-
getCommands(): PathCommand[];
|
|
107
|
-
getData(): string;
|
|
108
106
|
getBoundingBox(): {
|
|
109
107
|
x: number;
|
|
110
108
|
y: number;
|
|
109
|
+
left: number;
|
|
110
|
+
top: number;
|
|
111
|
+
right: number;
|
|
112
|
+
bottom: number;
|
|
111
113
|
width: number;
|
|
112
114
|
height: number;
|
|
113
115
|
};
|
|
116
|
+
getCommands(): PathCommand[];
|
|
117
|
+
getData(): string;
|
|
114
118
|
getSvgString(): string;
|
|
115
119
|
getSvgDataUri(): string;
|
|
116
120
|
drawTo(ctx: CanvasRenderingContext2D): void;
|
|
117
121
|
strokeTo(ctx: CanvasRenderingContext2D): void;
|
|
118
122
|
fillTo(ctx: CanvasRenderingContext2D): void;
|
|
123
|
+
copy(source: Path2D): this;
|
|
124
|
+
clone(): Path2D;
|
|
119
125
|
}
|
|
120
126
|
|
|
121
127
|
/**
|
|
@@ -200,8 +206,8 @@ declare abstract class Curve {
|
|
|
200
206
|
getData(): string;
|
|
201
207
|
/** overrideable */
|
|
202
208
|
drawTo(ctx: CanvasRenderingContext2D): this;
|
|
203
|
-
clone(): this;
|
|
204
209
|
copy(source: Curve): this;
|
|
210
|
+
clone(): this;
|
|
205
211
|
}
|
|
206
212
|
|
|
207
213
|
declare class CircleCurve extends Curve {
|
|
@@ -226,11 +232,11 @@ declare class CubicBezierCurve extends Curve {
|
|
|
226
232
|
v3: Point2D;
|
|
227
233
|
constructor(v0?: Point2D, v1?: Point2D, v2?: Point2D, v3?: Point2D);
|
|
228
234
|
getPoint(t: number, output?: Point2D): Point2D;
|
|
235
|
+
transform(matrix: Matrix3): this;
|
|
229
236
|
getMinMax(min?: Point2D, max?: Point2D): {
|
|
230
237
|
min: Point2D;
|
|
231
238
|
max: Point2D;
|
|
232
239
|
};
|
|
233
|
-
transform(matrix: Matrix3): this;
|
|
234
240
|
getCommands(): PathCommand[];
|
|
235
241
|
drawTo(ctx: CanvasRenderingContext2D): this;
|
|
236
242
|
copy(source: CubicBezierCurve): this;
|
|
@@ -246,8 +252,8 @@ declare class EllipseCurve extends Curve {
|
|
|
246
252
|
clockwise: boolean;
|
|
247
253
|
rotation: number;
|
|
248
254
|
constructor(x?: number, y?: number, radiusX?: number, radiusY?: number, startAngle?: number, endAngle?: number, clockwise?: boolean, rotation?: number);
|
|
249
|
-
getDivisions(divisions?: number): number;
|
|
250
255
|
getPoint(t: number, output?: Point2D): Point2D;
|
|
256
|
+
getDivisions(divisions?: number): number;
|
|
251
257
|
getCommands(): PathCommand[];
|
|
252
258
|
drawTo(ctx: CanvasRenderingContext2D): this;
|
|
253
259
|
transform(matrix: Matrix3): this;
|
|
@@ -275,17 +281,17 @@ declare class LineCurve extends Curve {
|
|
|
275
281
|
v1: Point2D;
|
|
276
282
|
v2: Point2D;
|
|
277
283
|
constructor(v1?: Point2D, v2?: Point2D);
|
|
278
|
-
getDivisions(): number;
|
|
279
284
|
getPoint(t: number, output?: Point2D): Point2D;
|
|
280
285
|
getPointAt(u: number, output?: Point2D): Point2D;
|
|
281
286
|
getTangent(t: number, output?: Point2D): Point2D;
|
|
282
287
|
getTangentAt(u: number, output?: Point2D): Point2D;
|
|
283
|
-
|
|
288
|
+
transform(matrix: Matrix3): this;
|
|
289
|
+
getDivisions(): number;
|
|
284
290
|
getMinMax(min?: Point2D, max?: Point2D): {
|
|
285
291
|
min: Point2D;
|
|
286
292
|
max: Point2D;
|
|
287
293
|
};
|
|
288
|
-
|
|
294
|
+
getCommands(): PathCommand[];
|
|
289
295
|
drawTo(ctx: CanvasRenderingContext2D): this;
|
|
290
296
|
copy(source: LineCurve): this;
|
|
291
297
|
}
|
|
@@ -320,12 +326,12 @@ declare class QuadraticBezierCurve extends Curve {
|
|
|
320
326
|
v2: Point2D;
|
|
321
327
|
constructor(v0?: Point2D, v1?: Point2D, v2?: Point2D);
|
|
322
328
|
getPoint(t: number, output?: Point2D): Point2D;
|
|
323
|
-
|
|
329
|
+
transform(matrix: Matrix3): this;
|
|
324
330
|
getMinMax(min?: Point2D, max?: Point2D): {
|
|
325
331
|
min: Point2D;
|
|
326
332
|
max: Point2D;
|
|
327
333
|
};
|
|
328
|
-
|
|
334
|
+
getCommands(): PathCommand[];
|
|
329
335
|
drawTo(ctx: CanvasRenderingContext2D): this;
|
|
330
336
|
copy(source: QuadraticBezierCurve): this;
|
|
331
337
|
}
|
package/dist/index.d.mts
CHANGED
|
@@ -103,19 +103,25 @@ declare class Path2D<T = any> {
|
|
|
103
103
|
min: Point2D;
|
|
104
104
|
max: Point2D;
|
|
105
105
|
};
|
|
106
|
-
getCommands(): PathCommand[];
|
|
107
|
-
getData(): string;
|
|
108
106
|
getBoundingBox(): {
|
|
109
107
|
x: number;
|
|
110
108
|
y: number;
|
|
109
|
+
left: number;
|
|
110
|
+
top: number;
|
|
111
|
+
right: number;
|
|
112
|
+
bottom: number;
|
|
111
113
|
width: number;
|
|
112
114
|
height: number;
|
|
113
115
|
};
|
|
116
|
+
getCommands(): PathCommand[];
|
|
117
|
+
getData(): string;
|
|
114
118
|
getSvgString(): string;
|
|
115
119
|
getSvgDataUri(): string;
|
|
116
120
|
drawTo(ctx: CanvasRenderingContext2D): void;
|
|
117
121
|
strokeTo(ctx: CanvasRenderingContext2D): void;
|
|
118
122
|
fillTo(ctx: CanvasRenderingContext2D): void;
|
|
123
|
+
copy(source: Path2D): this;
|
|
124
|
+
clone(): Path2D;
|
|
119
125
|
}
|
|
120
126
|
|
|
121
127
|
/**
|
|
@@ -200,8 +206,8 @@ declare abstract class Curve {
|
|
|
200
206
|
getData(): string;
|
|
201
207
|
/** overrideable */
|
|
202
208
|
drawTo(ctx: CanvasRenderingContext2D): this;
|
|
203
|
-
clone(): this;
|
|
204
209
|
copy(source: Curve): this;
|
|
210
|
+
clone(): this;
|
|
205
211
|
}
|
|
206
212
|
|
|
207
213
|
declare class CircleCurve extends Curve {
|
|
@@ -226,11 +232,11 @@ declare class CubicBezierCurve extends Curve {
|
|
|
226
232
|
v3: Point2D;
|
|
227
233
|
constructor(v0?: Point2D, v1?: Point2D, v2?: Point2D, v3?: Point2D);
|
|
228
234
|
getPoint(t: number, output?: Point2D): Point2D;
|
|
235
|
+
transform(matrix: Matrix3): this;
|
|
229
236
|
getMinMax(min?: Point2D, max?: Point2D): {
|
|
230
237
|
min: Point2D;
|
|
231
238
|
max: Point2D;
|
|
232
239
|
};
|
|
233
|
-
transform(matrix: Matrix3): this;
|
|
234
240
|
getCommands(): PathCommand[];
|
|
235
241
|
drawTo(ctx: CanvasRenderingContext2D): this;
|
|
236
242
|
copy(source: CubicBezierCurve): this;
|
|
@@ -246,8 +252,8 @@ declare class EllipseCurve extends Curve {
|
|
|
246
252
|
clockwise: boolean;
|
|
247
253
|
rotation: number;
|
|
248
254
|
constructor(x?: number, y?: number, radiusX?: number, radiusY?: number, startAngle?: number, endAngle?: number, clockwise?: boolean, rotation?: number);
|
|
249
|
-
getDivisions(divisions?: number): number;
|
|
250
255
|
getPoint(t: number, output?: Point2D): Point2D;
|
|
256
|
+
getDivisions(divisions?: number): number;
|
|
251
257
|
getCommands(): PathCommand[];
|
|
252
258
|
drawTo(ctx: CanvasRenderingContext2D): this;
|
|
253
259
|
transform(matrix: Matrix3): this;
|
|
@@ -275,17 +281,17 @@ declare class LineCurve extends Curve {
|
|
|
275
281
|
v1: Point2D;
|
|
276
282
|
v2: Point2D;
|
|
277
283
|
constructor(v1?: Point2D, v2?: Point2D);
|
|
278
|
-
getDivisions(): number;
|
|
279
284
|
getPoint(t: number, output?: Point2D): Point2D;
|
|
280
285
|
getPointAt(u: number, output?: Point2D): Point2D;
|
|
281
286
|
getTangent(t: number, output?: Point2D): Point2D;
|
|
282
287
|
getTangentAt(u: number, output?: Point2D): Point2D;
|
|
283
|
-
|
|
288
|
+
transform(matrix: Matrix3): this;
|
|
289
|
+
getDivisions(): number;
|
|
284
290
|
getMinMax(min?: Point2D, max?: Point2D): {
|
|
285
291
|
min: Point2D;
|
|
286
292
|
max: Point2D;
|
|
287
293
|
};
|
|
288
|
-
|
|
294
|
+
getCommands(): PathCommand[];
|
|
289
295
|
drawTo(ctx: CanvasRenderingContext2D): this;
|
|
290
296
|
copy(source: LineCurve): this;
|
|
291
297
|
}
|
|
@@ -320,12 +326,12 @@ declare class QuadraticBezierCurve extends Curve {
|
|
|
320
326
|
v2: Point2D;
|
|
321
327
|
constructor(v0?: Point2D, v1?: Point2D, v2?: Point2D);
|
|
322
328
|
getPoint(t: number, output?: Point2D): Point2D;
|
|
323
|
-
|
|
329
|
+
transform(matrix: Matrix3): this;
|
|
324
330
|
getMinMax(min?: Point2D, max?: Point2D): {
|
|
325
331
|
min: Point2D;
|
|
326
332
|
max: Point2D;
|
|
327
333
|
};
|
|
328
|
-
|
|
334
|
+
getCommands(): PathCommand[];
|
|
329
335
|
drawTo(ctx: CanvasRenderingContext2D): this;
|
|
330
336
|
copy(source: QuadraticBezierCurve): this;
|
|
331
337
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -103,19 +103,25 @@ declare class Path2D<T = any> {
|
|
|
103
103
|
min: Point2D;
|
|
104
104
|
max: Point2D;
|
|
105
105
|
};
|
|
106
|
-
getCommands(): PathCommand[];
|
|
107
|
-
getData(): string;
|
|
108
106
|
getBoundingBox(): {
|
|
109
107
|
x: number;
|
|
110
108
|
y: number;
|
|
109
|
+
left: number;
|
|
110
|
+
top: number;
|
|
111
|
+
right: number;
|
|
112
|
+
bottom: number;
|
|
111
113
|
width: number;
|
|
112
114
|
height: number;
|
|
113
115
|
};
|
|
116
|
+
getCommands(): PathCommand[];
|
|
117
|
+
getData(): string;
|
|
114
118
|
getSvgString(): string;
|
|
115
119
|
getSvgDataUri(): string;
|
|
116
120
|
drawTo(ctx: CanvasRenderingContext2D): void;
|
|
117
121
|
strokeTo(ctx: CanvasRenderingContext2D): void;
|
|
118
122
|
fillTo(ctx: CanvasRenderingContext2D): void;
|
|
123
|
+
copy(source: Path2D): this;
|
|
124
|
+
clone(): Path2D;
|
|
119
125
|
}
|
|
120
126
|
|
|
121
127
|
/**
|
|
@@ -200,8 +206,8 @@ declare abstract class Curve {
|
|
|
200
206
|
getData(): string;
|
|
201
207
|
/** overrideable */
|
|
202
208
|
drawTo(ctx: CanvasRenderingContext2D): this;
|
|
203
|
-
clone(): this;
|
|
204
209
|
copy(source: Curve): this;
|
|
210
|
+
clone(): this;
|
|
205
211
|
}
|
|
206
212
|
|
|
207
213
|
declare class CircleCurve extends Curve {
|
|
@@ -226,11 +232,11 @@ declare class CubicBezierCurve extends Curve {
|
|
|
226
232
|
v3: Point2D;
|
|
227
233
|
constructor(v0?: Point2D, v1?: Point2D, v2?: Point2D, v3?: Point2D);
|
|
228
234
|
getPoint(t: number, output?: Point2D): Point2D;
|
|
235
|
+
transform(matrix: Matrix3): this;
|
|
229
236
|
getMinMax(min?: Point2D, max?: Point2D): {
|
|
230
237
|
min: Point2D;
|
|
231
238
|
max: Point2D;
|
|
232
239
|
};
|
|
233
|
-
transform(matrix: Matrix3): this;
|
|
234
240
|
getCommands(): PathCommand[];
|
|
235
241
|
drawTo(ctx: CanvasRenderingContext2D): this;
|
|
236
242
|
copy(source: CubicBezierCurve): this;
|
|
@@ -246,8 +252,8 @@ declare class EllipseCurve extends Curve {
|
|
|
246
252
|
clockwise: boolean;
|
|
247
253
|
rotation: number;
|
|
248
254
|
constructor(x?: number, y?: number, radiusX?: number, radiusY?: number, startAngle?: number, endAngle?: number, clockwise?: boolean, rotation?: number);
|
|
249
|
-
getDivisions(divisions?: number): number;
|
|
250
255
|
getPoint(t: number, output?: Point2D): Point2D;
|
|
256
|
+
getDivisions(divisions?: number): number;
|
|
251
257
|
getCommands(): PathCommand[];
|
|
252
258
|
drawTo(ctx: CanvasRenderingContext2D): this;
|
|
253
259
|
transform(matrix: Matrix3): this;
|
|
@@ -275,17 +281,17 @@ declare class LineCurve extends Curve {
|
|
|
275
281
|
v1: Point2D;
|
|
276
282
|
v2: Point2D;
|
|
277
283
|
constructor(v1?: Point2D, v2?: Point2D);
|
|
278
|
-
getDivisions(): number;
|
|
279
284
|
getPoint(t: number, output?: Point2D): Point2D;
|
|
280
285
|
getPointAt(u: number, output?: Point2D): Point2D;
|
|
281
286
|
getTangent(t: number, output?: Point2D): Point2D;
|
|
282
287
|
getTangentAt(u: number, output?: Point2D): Point2D;
|
|
283
|
-
|
|
288
|
+
transform(matrix: Matrix3): this;
|
|
289
|
+
getDivisions(): number;
|
|
284
290
|
getMinMax(min?: Point2D, max?: Point2D): {
|
|
285
291
|
min: Point2D;
|
|
286
292
|
max: Point2D;
|
|
287
293
|
};
|
|
288
|
-
|
|
294
|
+
getCommands(): PathCommand[];
|
|
289
295
|
drawTo(ctx: CanvasRenderingContext2D): this;
|
|
290
296
|
copy(source: LineCurve): this;
|
|
291
297
|
}
|
|
@@ -320,12 +326,12 @@ declare class QuadraticBezierCurve extends Curve {
|
|
|
320
326
|
v2: Point2D;
|
|
321
327
|
constructor(v0?: Point2D, v1?: Point2D, v2?: Point2D);
|
|
322
328
|
getPoint(t: number, output?: Point2D): Point2D;
|
|
323
|
-
|
|
329
|
+
transform(matrix: Matrix3): this;
|
|
324
330
|
getMinMax(min?: Point2D, max?: Point2D): {
|
|
325
331
|
min: Point2D;
|
|
326
332
|
max: Point2D;
|
|
327
333
|
};
|
|
328
|
-
|
|
334
|
+
getCommands(): PathCommand[];
|
|
329
335
|
drawTo(ctx: CanvasRenderingContext2D): this;
|
|
330
336
|
copy(source: QuadraticBezierCurve): this;
|
|
331
337
|
}
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(v,d){typeof exports=="object"&&typeof module<"u"?d(exports):typeof define=="function"&&define.amd?define(["exports"],d):(v=typeof globalThis<"u"?globalThis:v||self,d(v.modernPath2d={}))})(this,function(v){"use strict";var Qt=Object.defineProperty;var Ut=(v,d,$)=>d in v?Qt(v,d,{enumerable:!0,configurable:!0,writable:!0,value:$}):v[d]=$;var b=(v,d,$)=>Ut(v,typeof d!="symbol"?d+"":d,$);class d{constructor(e=1,t=0,s=0,i=0,o=1,c=0,a=0,h=0,n=1){b(this,"elements",[]);this.set(e,t,s,i,o,c,a,h,n)}set(e,t,s,i,o,c,a,h,n){const u=this.elements;return u[0]=e,u[1]=i,u[2]=a,u[3]=t,u[4]=o,u[5]=h,u[6]=s,u[7]=c,u[8]=n,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(e){const t=this.elements,s=e.elements;return t[0]=s[0],t[1]=s[1],t[2]=s[2],t[3]=s[3],t[4]=s[4],t[5]=s[5],t[6]=s[6],t[7]=s[7],t[8]=s[8],this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){const s=e.elements,i=t.elements,o=this.elements,c=s[0],a=s[3],h=s[6],n=s[1],u=s[4],y=s[7],p=s[2],x=s[5],g=s[8],f=i[0],M=i[3],w=i[6],I=i[1],T=i[4],C=i[7],A=i[2],E=i[5],z=i[8];return o[0]=c*f+a*I+h*A,o[3]=c*M+a*T+h*E,o[6]=c*w+a*C+h*z,o[1]=n*f+u*I+y*A,o[4]=n*M+u*T+y*E,o[7]=n*w+u*C+y*z,o[2]=p*f+x*I+g*A,o[5]=p*M+x*T+g*E,o[8]=p*w+x*C+g*z,this}invert(){const e=this.elements,t=e[0],s=e[1],i=e[2],o=e[3],c=e[4],a=e[5],h=e[6],n=e[7],u=e[8],y=u*c-a*n,p=a*h-u*o,x=n*o-c*h,g=t*y+s*p+i*x;if(g===0)return this.set(0,0,0,0,0,0,0,0,0);const f=1/g;return e[0]=y*f,e[1]=(i*n-u*s)*f,e[2]=(a*s-i*c)*f,e[3]=p*f,e[4]=(u*t-i*h)*f,e[5]=(i*o-a*t)*f,e[6]=x*f,e[7]=(s*h-n*t)*f,e[8]=(c*t-s*o)*f,this}transpose(){let e;const t=this.elements;return e=t[1],t[1]=t[3],t[3]=e,e=t[2],t[2]=t[6],t[6]=e,e=t[5],t[5]=t[7],t[7]=e,this}scale(e,t){return this.premultiply($.makeScale(e,t)),this}rotate(e){return this.premultiply($.makeRotation(-e)),this}translate(e,t){return this.premultiply($.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 $=new d;class l{constructor(e=0,t=0){this.x=e,this.y=t}static get MAX(){return new l(1/0,1/0)}static get MIN(){return new l(-1/0,-1/0)}set(e,t){return this.x=e,this.y=t,this}add(e){return this.x+=e.x,this.y+=e.y,this}sub(e){return this.x-=e.x,this.y-=e.y,this}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const t=this.x-e.x,s=this.y-e.y;return t*t+s*s}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}multiplyScalar(e){return this.x*=e,this.y*=e,this}divideScalar(e){return this.multiplyScalar(1/e)}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this}normalize(){return this.divideScalar(this.length()||1)}lerpVectors(e,t,s){return this.x=e.x+(t.x-e.x)*s,this.y=e.y+(t.y-e.y)*s,this}equals(e){return this.x===e.x&&this.y===e.y}applyMatrix3(e){const[t,s,i,o,c,a]=e.elements,{x:h,y:n}=this;return this.set(t*h+s*n+i,o*h+c*n+a),this}copy(e){return this.x=e.x,this.y=e.y,this}clone(){return new l(this.x,this.y)}}function U(r,e,t,s){const i=r*t+e*s,o=Math.sqrt(r*r+e*e)*Math.sqrt(t*t+s*s);let c=Math.acos(Math.max(-1,Math.min(1,i/o)));return r*s-e*t<0&&(c=-c),c}function lt(r,e,t,s,i,o,c,a){if(e===0||t===0){r.lineTo(a.x,a.y);return}s=s*Math.PI/180,e=Math.abs(e),t=Math.abs(t);const h=(c.x-a.x)/2,n=(c.y-a.y)/2,u=Math.cos(s)*h+Math.sin(s)*n,y=-Math.sin(s)*h+Math.cos(s)*n;let p=e*e,x=t*t;const g=u*u,f=y*y,M=g/p+f/x;if(M>1){const ut=Math.sqrt(M);e=ut*e,t=ut*t,p=e*e,x=t*t}const w=p*f+x*g,I=(p*x-w)/w;let T=Math.sqrt(Math.max(0,I));i===o&&(T=-T);const C=T*e*y/t,A=-T*t*u/e,E=Math.cos(s)*C-Math.sin(s)*A+(c.x+a.x)/2,z=Math.sin(s)*C+Math.cos(s)*A+(c.y+a.y)/2,Y=U(1,0,(u-C)/e,(y-A)/t),Q=U((u-C)/e,(y-A)/t,(-u-C)/e,(-y-A)/t)%(Math.PI*2);r.currentPath.absellipse(E,z,e,t,Y,Y+Q,o===0,s)}function D(r,e){return r-(e-r)}function yt(r,e){const t=new l,s=new l,i=new l;let o=!0,c=!1;for(let a=0,h=r.length;a<h;a++){const n=r[a];if(o&&(c=!0,o=!1),n.type==="m"||n.type==="M")n.type==="m"?(t.x+=n.x,t.y+=n.y):(t.x=n.x,t.y=n.y),s.x=t.x,s.y=t.y,e.moveTo(t.x,t.y),a===0&&i.copy(t);else if(n.type==="h"||n.type==="H")n.type==="h"?t.x+=n.x:t.x=n.x,s.x=t.x,s.y=t.y,e.lineTo(t.x,t.y),c&&i.copy(t);else if(n.type==="v"||n.type==="V")n.type==="v"?t.y+=n.y:t.y=n.y,s.x=t.x,s.y=t.y,e.lineTo(t.x,t.y),c&&i.copy(t);else if(n.type==="l"||n.type==="L")n.type==="l"?(t.x+=n.x,t.y+=n.y):(t.x=n.x,t.y=n.y),s.x=t.x,s.y=t.y,e.lineTo(t.x,t.y),c&&i.copy(t);else if(n.type==="c"||n.type==="C")n.type==="c"?(e.bezierCurveTo(t.x+n.x1,t.y+n.y1,t.x+n.x2,t.y+n.y2,t.x+n.x,t.y+n.y),s.x=t.x+n.x2,s.y=t.y+n.y2,t.x+=n.x,t.y+=n.y):(e.bezierCurveTo(n.x1,n.y1,n.x2,n.y2,n.x,n.y),s.x=n.x2,s.y=n.y2,t.x=n.x,t.y=n.y),c&&i.copy(t);else if(n.type==="s"||n.type==="S")n.type==="s"?(e.bezierCurveTo(D(t.x,s.x),D(t.y,s.y),t.x+n.x2,t.y+n.y2,t.x+n.x,t.y+n.y),s.x=t.x+n.x2,s.y=t.y+n.y2,t.x+=n.x,t.y+=n.y):(e.bezierCurveTo(D(t.x,s.x),D(t.y,s.y),n.x2,n.y2,n.x,n.y),s.x=n.x2,s.y=n.y2,t.x=n.x,t.y=n.y),c&&i.copy(t);else if(n.type==="q"||n.type==="Q")n.type==="q"?(e.quadraticCurveTo(t.x+n.x1,t.y+n.y1,t.x+n.x,t.y+n.y),s.x=t.x+n.x1,s.y=t.y+n.y1,t.x+=n.x,t.y+=n.y):(e.quadraticCurveTo(n.x1,n.y1,n.x,n.y),s.x=n.x1,s.y=n.y1,t.x=n.x,t.y=n.y),c&&i.copy(t);else if(n.type==="t"||n.type==="T"){const u=D(t.x,s.x),y=D(t.y,s.y);s.x=u,s.y=y,n.type==="t"?(e.quadraticCurveTo(u,y,t.x+n.x,t.y+n.y),t.x+=n.x,t.y+=n.y):(e.quadraticCurveTo(u,y,n.x,n.y),t.x=n.x,t.y=n.y),c&&i.copy(t)}else if(n.type==="a"||n.type==="A"){if(n.type==="a"){if(n.x===0&&n.y===0)continue;t.x+=n.x,t.y+=n.y}else{if(n.x===t.x&&n.y===t.y)continue;t.x=n.x,t.y=n.y}const u=t.clone();s.x=t.x,s.y=t.y,lt(e,n.rx,n.ry,n.angle,n.largeArcFlag,n.sweepFlag,u,t),c&&i.copy(t)}else n.type==="z"||n.type==="Z"?(e.currentPath.autoClose=!0,e.currentPath.curves.length>0&&(t.copy(i),e.currentPath.currentPoint.copy(t),o=!0)):console.warn(n);c=!1}}const P={SEPARATOR:/[ \t\r\n,.\-+]/,WHITESPACE:/[ \t\r\n]/,DIGIT:/\d/,SIGN:/[-+]/,POINT:/\./,COMMA:/,/,EXP:/e/i,FLAGS:/[01]/};function S(r,e,t=0){let a=0,h=!0,n="",u="";const y=[];function p(M,w,I){const T=new SyntaxError(`Unexpected character "${M}" at index ${w}.`);throw T.partial=I,T}function x(){n!==""&&(u===""?y.push(Number(n)):y.push(Number(n)*10**Number(u))),n="",u=""}let g;const f=r.length;for(let M=0;M<f;M++){if(g=r[M],Array.isArray(e)&&e.includes(y.length%t)&&P.FLAGS.test(g)){a=1,n=g,x();continue}if(a===0){if(P.WHITESPACE.test(g))continue;if(P.DIGIT.test(g)||P.SIGN.test(g)){a=1,n=g;continue}if(P.POINT.test(g)){a=2,n=g;continue}P.COMMA.test(g)&&(h&&p(g,M,y),h=!0)}if(a===1){if(P.DIGIT.test(g)){n+=g;continue}if(P.POINT.test(g)){n+=g,a=2;continue}if(P.EXP.test(g)){a=3;continue}P.SIGN.test(g)&&n.length===1&&P.SIGN.test(n[0])&&p(g,M,y)}if(a===2){if(P.DIGIT.test(g)){n+=g;continue}if(P.EXP.test(g)){a=3;continue}P.POINT.test(g)&&n[n.length-1]==="."&&p(g,M,y)}if(a===3){if(P.DIGIT.test(g)){u+=g;continue}if(P.SIGN.test(g)){if(u===""){u+=g;continue}u.length===1&&P.SIGN.test(u)&&p(g,M,y)}}P.WHITESPACE.test(g)?(x(),a=0,h=!1):P.COMMA.test(g)?(x(),a=0,h=!0):P.SIGN.test(g)?(x(),a=1,n=g):P.POINT.test(g)?(x(),a=2,n=g):p(g,M,y)}return x(),y}function gt(r){switch(r.type){case"m":case"M":return`${r.type} ${r.x} ${r.y}`;case"h":case"H":return`${r.type} ${r.x}`;case"v":case"V":return`${r.type} ${r.y}`;case"l":case"L":return`${r.type} ${r.x} ${r.y}`;case"c":case"C":return`${r.type} ${r.x1} ${r.y1} ${r.x2} ${r.y2} ${r.x} ${r.y}`;case"s":case"S":return`${r.type} ${r.x2} ${r.y2} ${r.x} ${r.y}`;case"q":case"Q":return`${r.type} ${r.x1} ${r.y1} ${r.x} ${r.y}`;case"t":case"T":return`${r.type} ${r.x} ${r.y}`;case"a":case"A":return`${r.type} ${r.rx} ${r.ry} ${r.angle} ${r.largeArcFlag} ${r.sweepFlag} ${r.x} ${r.y}`;case"z":case"Z":return r.type;default:return""}}function pt(r){let e="";for(let t=0,s=r.length;t<s;t++)e+=`${gt(r[t])} `;return e}const ft=/[a-df-z][^a-df-z]*/gi;function xt(r){const e=[],t=r.match(ft);if(!t)return e;for(let s=0,i=t.length;s<i;s++){const o=t[s],c=o.charAt(0),a=o.slice(1).trim();let h;switch(c){case"m":case"M":h=S(a);for(let n=0,u=h.length;n<u;n+=2)n===0?e.push({type:c,x:h[n],y:h[n+1]}):e.push({type:c==="m"?"l":"L",x:h[n],y:h[n+1]});break;case"h":case"H":h=S(a);for(let n=0,u=h.length;n<u;n++)e.push({type:c,x:h[n]});break;case"v":case"V":h=S(a);for(let n=0,u=h.length;n<u;n++)e.push({type:c,y:h[n]});break;case"l":case"L":h=S(a);for(let n=0,u=h.length;n<u;n+=2)e.push({type:c,x:h[n],y:h[n+1]});break;case"c":case"C":h=S(a);for(let n=0,u=h.length;n<u;n+=6)e.push({type:c,x1:h[n],y1:h[n+1],x2:h[n+2],y2:h[n+3],x:h[n+4],y:h[n+5]});break;case"s":case"S":h=S(a);for(let n=0,u=h.length;n<u;n+=4)e.push({type:c,x2:h[n],y2:h[n+1],x:h[n+2],y:h[n+3]});break;case"q":case"Q":h=S(a);for(let n=0,u=h.length;n<u;n+=4)e.push({type:c,x1:h[n],y1:h[n+1],x:h[n+2],y:h[n+3]});break;case"t":case"T":h=S(a);for(let n=0,u=h.length;n<u;n+=2)e.push({type:c,x:h[n],y:h[n+1]});break;case"a":case"A":h=S(a,[3,4],7);for(let n=0,u=h.length;n<u;n+=7)e.push({type:c,rx:h[n],ry:h[n+1],angle:h[n+2],largeArcFlag:h[n+3],sweepFlag:h[n+4],x:h[n+5],y:h[n+6]});break;case"z":case"Z":e.push({type:c});break;default:console.warn(o)}}return e}class k{constructor(){b(this,"arcLengthDivisions",200);b(this,"_cacheArcLengths");b(this,"_needsUpdate",!1)}getPointAt(e,t=new l){return this.getPoint(this.getUtoTmapping(e),t)}getPoints(e=5){const t=[];for(let s=0;s<=e;s++)t.push(this.getPoint(s/e));return t}getSpacedPoints(e=5){const t=[];for(let s=0;s<=e;s++)t.push(this.getPointAt(s/e));return t}getLength(){const e=this.getLengths();return e[e.length-1]}getLengths(e=this.arcLengthDivisions){if(this._cacheArcLengths&&this._cacheArcLengths.length===e+1&&!this._needsUpdate)return this._cacheArcLengths;this._needsUpdate=!1;const t=[];let s,i=this.getPoint(0),o=0;t.push(0);for(let c=1;c<=e;c++)s=this.getPoint(c/e),o+=s.distanceTo(i),t.push(o),i=s;return this._cacheArcLengths=t,t}updateArcLengths(){this._needsUpdate=!0,this.getLengths()}getUtoTmapping(e,t){const s=this.getLengths();let i=0;const o=s.length;let c;t?c=t:c=e*s[o-1];let a=0,h=o-1,n;for(;a<=h;)if(i=Math.floor(a+(h-a)/2),n=s[i]-c,n<0)a=i+1;else if(n>0)h=i-1;else{h=i;break}if(i=h,s[i]===c)return i/(o-1);const u=s[i],p=s[i+1]-u,x=(c-u)/p;return(i+x)/(o-1)}getTangent(e,t=new l){let i=e-1e-4,o=e+1e-4;return i<0&&(i=0),o>1&&(o=1),t.copy(this.getPoint(o)).sub(this.getPoint(i)).normalize()}getTangentAt(e,t=new l){return this.getTangent(this.getUtoTmapping(e),t)}transform(e){return this}getDivisions(e){return e}getMinMax(e=l.MAX,t=l.MIN){return{min:e,max:t}}getCommands(){return[]}getData(){return pt(this.getCommands())}drawTo(e){return this}clone(){return new this.constructor().copy(this)}copy(e){return this.arcLengthDivisions=e.arcLengthDivisions,this}}class O 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().multiplyScalar(t))}getTangent(e){const{x:t,y:s}=this.getNormal(e);return new l(-s,t)}getNormal(e){const{start:t,end:s}=this,i=e*(s-t)+t-.5*Math.PI;return new l(Math.cos(i),Math.sin(i))}getMinMax(e=l.MAX,t=l.MIN){return e.x=Math.min(e.x,this.center.x-this.radius),e.y=Math.min(e.y,this.center.y-this.radius),t.x=Math.max(t.x,this.center.x+this.radius),t.y=Math.max(t.y,this.center.y+this.radius),{min:e,max:t}}}function V(r,e,t,s,i){const o=(s-e)*.5,c=(i-t)*.5,a=r*r,h=r*a;return(2*t-2*s+o+c)*h+(-3*t+3*s-2*o-c)*a+o*r+t}function Mt(r,e){const t=1-r;return t*t*e}function vt(r,e){return 2*(1-r)*r*e}function mt(r,e){return r*r*e}function H(r,e,t,s){return Mt(r,e)+vt(r,t)+mt(r,s)}function dt(r,e){const t=1-r;return t*t*t*e}function Pt(r,e){const t=1-r;return 3*t*t*r*e}function Tt(r,e){return 3*(1-r)*r*r*e}function wt(r,e){return r*r*r*e}function W(r,e,t,s,i){return dt(r,e)+Pt(r,t)+Tt(r,s)+wt(r,i)}class j extends k{constructor(e=new l,t=new l,s=new l,i=new l){super(),this.v0=e,this.v1=t,this.v2=s,this.v3=i}getPoint(e,t=new l){const{v0:s,v1:i,v2:o,v3:c}=this;return t.set(W(e,s.x,i.x,o.x,c.x),W(e,s.y,i.y,o.y,c.y)),t}getMinMax(e=l.MAX,t=l.MIN){const{v0:s,v1:i,v2:o,v3:c}=this;return e.x=Math.min(e.x,s.x,i.x,o.x,c.x),e.y=Math.min(e.y,s.y,i.y,o.y,c.y),t.x=Math.max(t.x,s.x,i.x,o.x,c.x),t.y=Math.max(t.y,s.y,i.y,o.y,c.y),{min:e,max:t}}transform(e){return this.v0.applyMatrix3(e),this.v1.applyMatrix3(e),this.v2.applyMatrix3(e),this.v3.applyMatrix3(e),this}getCommands(){const{v0:e,v1:t,v2:s,v3:i}=this;return[{type:"M",x:e.x,y:e.y},{type:"C",x1:t.x,y1:t.y,x2:s.x,y2:s.y,x:i.x,y:i.y}]}drawTo(e){const{v0:t,v1:s,v2:i,v3:o}=this;return e.moveTo(t.x,t.y),e.bezierCurveTo(s.x,s.y,i.x,i.y,o.x,o.y),this}copy(e){return super.copy(e),this.v0.copy(e.v0),this.v1.copy(e.v1),this.v2.copy(e.v2),this.v3.copy(e.v3),this}}const bt=new d,Z=new d,J=new d,R=new l;class K extends k{constructor(e=0,t=0,s=1,i=1,o=0,c=Math.PI*2,a=!1,h=0){super(),this.x=e,this.y=t,this.radiusX=s,this.radiusY=i,this.startAngle=o,this.endAngle=c,this.clockwise=a,this.rotation=h}getDivisions(e=12){return e*2}getPoint(e,t=new l){const s=Math.PI*2;let i=this.endAngle-this.startAngle;const o=Math.abs(i)<Number.EPSILON;for(;i<0;)i+=s;for(;i>s;)i-=s;i<Number.EPSILON&&(o?i=0:i=s),this.clockwise&&!o&&(i===s?i=-s:i=i-s);const c=this.startAngle+e*i;let a=this.x+this.radiusX*Math.cos(c),h=this.y+this.radiusY*Math.sin(c);if(this.rotation!==0){const n=Math.cos(this.rotation),u=Math.sin(this.rotation),y=a-this.x,p=h-this.y;a=y*n-p*u+this.x,h=y*u+p*n+this.y}return t.set(a,h)}getCommands(){const{x:e,y:t,radiusX:s,radiusY:i,startAngle:o,endAngle:c,clockwise:a}=this,h=!a,n=e+s*Math.cos(o),u=t+i*Math.sin(o),y=e+s*Math.cos(c),p=t+i*Math.sin(c),x=Math.abs(o-c),g=x>Math.PI?1:0,f=h?0:1,M=e+s*Math.cos(o+(c-o)/2),w=t+i*Math.sin(o+(c-o)/2);return x>=2*Math.PI?[{type:"M",x:n,y:u},{type:"A",rx:s,ry:i,angle:0,largeArcFlag:1,sweepFlag:f,x:M,y:w},{type:"A",rx:s,ry:i,angle:0,largeArcFlag:1,sweepFlag:f,x:n,y:u}]:[{type:"M",x:n,y:u},{type:"A",rx:s,ry:i,angle:0,largeArcFlag:g,sweepFlag:f,x:y,y:p}]}drawTo(e){const{x:t,y:s,radiusX:i,radiusY:o,rotation:c,startAngle:a,endAngle:h,clockwise:n}=this,u=t+i*Math.cos(a),y=s+o*Math.sin(a);return e.moveTo(u,y),e.ellipse(t,s,i,o,c,a,h,!n),this}transform(e){return R.set(this.x,this.y),R.applyMatrix3(e),this.x=R.x,this.y=R.y,It(e)?At(this,e):Ct(this,e),this}copy(e){return super.copy(e),this.x=e.x,this.y=e.y,this.radiusX=e.radiusX,this.radiusY=e.radiusY,this.startAngle=e.startAngle,this.endAngle=e.endAngle,this.clockwise=e.clockwise,this.rotation=e.rotation,this}}function At(r,e){const t=r.radiusX,s=r.radiusY,i=Math.cos(r.rotation),o=Math.sin(r.rotation),c=new l(t*i,t*o),a=new l(-s*o,s*i),h=c.applyMatrix3(e),n=a.applyMatrix3(e),u=bt.set(h.x,n.x,0,h.y,n.y,0,0,0,1),y=Z.copy(u).invert(),g=J.copy(y).transpose().multiply(y).elements,f=kt(g[0],g[1],g[4]),M=Math.sqrt(f.rt1),w=Math.sqrt(f.rt2);if(r.radiusX=1/M,r.radiusY=1/w,r.rotation=Math.atan2(f.sn,f.cs),!((r.endAngle-r.startAngle)%(2*Math.PI)<Number.EPSILON)){const T=Z.set(M,0,0,0,w,0,0,0,1),C=J.set(f.cs,f.sn,0,-f.sn,f.cs,0,0,0,1),A=T.multiply(C).multiply(u),E=z=>{const{x:Y,y:Q}=new l(Math.cos(z),Math.sin(z)).applyMatrix3(A);return Math.atan2(Q,Y)};r.startAngle=E(r.startAngle),r.endAngle=E(r.endAngle),tt(e)&&(r.clockwise=!r.clockwise)}}function Ct(r,e){const t=et(e),s=st(e);r.radiusX*=t,r.radiusY*=s;const i=t>Number.EPSILON?Math.atan2(e.elements[1],e.elements[0]):Math.atan2(-e.elements[3],e.elements[4]);r.rotation+=i,tt(e)&&(r.startAngle*=-1,r.endAngle*=-1,r.clockwise=!r.clockwise)}function tt(r){const e=r.elements;return e[0]*e[4]-e[1]*e[3]<0}function It(r){const e=r.elements,t=e[0]*e[3]+e[1]*e[4];if(t===0)return!1;const s=et(r),i=st(r);return Math.abs(t/(s*i))>Number.EPSILON}function et(r){const e=r.elements;return Math.sqrt(e[0]*e[0]+e[1]*e[1])}function st(r){const e=r.elements;return Math.sqrt(e[3]*e[3]+e[4]*e[4])}function kt(r,e,t){let s,i,o,c,a;const h=r+t,n=r-t,u=Math.sqrt(n*n+4*e*e);return h>0?(s=.5*(h+u),a=1/s,i=r*a*t-e*a*e):h<0?i=.5*(h-u):(s=.5*u,i=-.5*u),n>0?o=n+u:o=n-u,Math.abs(o)>2*Math.abs(e)?(a=-2*e/o,c=1/Math.sqrt(1+a*a),o=a*c):Math.abs(e)===0?(o=1,c=0):(a=-.5*o/e,o=1/Math.sqrt(1+a*a),c=a*o),n>0&&(a=o,o=-c,c=a),{rt1:s,rt2:i,cs:o,sn:c}}class q extends k{constructor(e=new l,t=new l){super(),this.v1=e,this.v2=t}getDivisions(){return 1}getPoint(e,t=new l){return e===1?t.copy(this.v2):(t.copy(this.v2).sub(this.v1),t.multiplyScalar(e).add(this.v1)),t}getPointAt(e,t=new l){return this.getPoint(e,t)}getTangent(e,t=new l){return t.subVectors(this.v2,this.v1).normalize()}getTangentAt(e,t=new l){return this.getTangent(e,t)}getCommands(){const{v1:e,v2:t}=this;return[{type:"M",x:e.x,y:e.y},{type:"L",x:t.x,y:t.y}]}getMinMax(e=l.MAX,t=l.MIN){const{v1:s,v2:i}=this;return e.x=Math.min(e.x,s.x,i.x),e.y=Math.min(e.y,s.y,i.y),t.x=Math.max(t.x,s.x,i.x),t.y=Math.max(t.y,s.y,i.y),{min:e,max:t}}transform(e){return this.v1.applyMatrix3(e),this.v2.applyMatrix3(e),this}drawTo(e){const{v1:t,v2:s}=this;return e.moveTo(t.x,t.y),e.lineTo(s.x,s.y),this}copy(e){return super.copy(e),this.v1.copy(e.v1),this.v2.copy(e.v2),this}}class Lt extends k{constructor(t,s,i=0,o=1){super();b(this,"curves");b(this,"pointT",0);this.center=t,this.size=s,this.start=i,this.end=o;const{x:c,y:a}=this.center,h=new l(c+.5*this.size,a-.5*this.size),n=new l(c-.5*this.size,a-.5*this.size),u=new l(c,a+.5*this.size),y=new O(h,Math.SQRT1_2*this.size,-.25*Math.PI,.75*Math.PI),p=new O(n,Math.SQRT1_2*this.size,-.75*Math.PI,.25*Math.PI),x=new O(u,.5*Math.SQRT1_2*this.size,.75*Math.PI,1.25*Math.PI),g=new l(c,a+this.size),f=new l(c+this.size,a),M=new l().lerpVectors(f,g,.75),w=new l(c-this.size,a),I=new l().lerpVectors(w,g,.75),T=new q(f,M),C=new q(I,w);this.curves=[y,T,x,C,p]}getPoint(t){return this.getCurrentLine(t).getPoint(this.pointT)}getPointAt(t){return this.getPoint(t)}getCurrentLine(t){let s=(t*(this.end-this.start)+this.start)%1;s<0&&(s+=1),s*=9*Math.PI/8+1.5;let i;const o=.5*Math.PI;return s<o?(i=0,this.pointT=s/o):s<o+.75?(i=1,this.pointT=(s-o)/.75):s<5*Math.PI/8+.75?(i=2,this.pointT=(s-o-.75)/(Math.PI/8)):s<5*Math.PI/8+1.5?(i=3,this.pointT=(s-5*Math.PI/8-.75)/.75):(i=4,this.pointT=(s-5*Math.PI/8-1.5)/o),this.curves[i]}getTangent(t){return this.getCurrentLine(t).getTangent(this.pointT).normalize()}getNormal(t){const s=this.getCurrentLine(t);return new l(s.v2.y-s.v1.y,-(s.v2.x-s.v1.x)).normalize()}getCommands(){return this.curves.flatMap(t=>t.getCommands())}drawTo(t){return this.curves.forEach(s=>s.drawTo(t)),this}}class St extends k{constructor(t,s=0,i=0,o=0,c=1){super();b(this,"curves",[]);b(this,"points",[]);this.center=t,this.radius=s,this.num=i,this.start=o,this.end=c;for(let a=0;a<this.num;a++){let h=a*2*Math.PI/this.num;h-=.5*Math.PI;const n=new l(this.radius*Math.cos(h),this.radius*Math.sin(h));n.add(this.center),this.points.push(n)}for(let a=0;a<this.num;a++)this.curves.push(new q(this.points[a],this.points[(a+1)%this.num]))}getPoint(t){return this.getCurrentLine(t),this.currentLine.getPoint(this.pointK)}getPointAt(t){return this.getPoint(t)}getCurrentLine(t){let s=(t*(this.end-this.start)+this.start)%1;s<0&&(s+=1);const i=s*this.num,o=Math.floor(i);return this.pointK=i-o,this.currentLine=this.curves[o],this.currentLine}getTangent(t){return this.getCurrentLine(t).getTangent(0).normalize()}getNormal(t){const s=this.getCurrentLine(t);return new l(s.v2.y-s.v1.y,-(s.v2.x-s.v1.x)).normalize()}getCommands(){return this.curves.flatMap(t=>t.getCommands())}getMinMax(t=l.MAX,s=l.MIN){return this.curves.forEach(i=>i.getMinMax(t,s)),{min:t,max:s}}drawTo(t){return this.curves.forEach(s=>s.drawTo(t)),this}}class nt extends k{constructor(e=new l,t=new l,s=new l){super(),this.v0=e,this.v1=t,this.v2=s}getPoint(e,t=new l){const{v0:s,v1:i,v2:o}=this;return t.set(H(e,s.x,i.x,o.x),H(e,s.y,i.y,o.y)),t}getCommands(){const{v0:e,v1:t,v2:s}=this;return[{type:"M",x:e.x,y:e.y},{type:"Q",x1:t.x,y1:t.y,x:s.x,y:s.y}]}getMinMax(e=l.MAX,t=l.MIN){const{v0:s,v1:i,v2:o}=this,c=.5*(s.x+i.x),a=.5*(s.y+i.y),h=.5*(s.x+o.x),n=.5*(s.y+o.y);return e.x=Math.min(e.x,s.x,o.x,c,h),e.y=Math.min(e.y,s.y,o.y,a,n),t.x=Math.max(t.x,s.x,o.x,c,h),t.y=Math.max(t.y,s.y,o.y,a,n),{min:e,max:t}}transform(e){return this.v0.applyMatrix3(e),this.v1.applyMatrix3(e),this.v2.applyMatrix3(e),this}drawTo(e){const{v0:t,v1:s,v2:i}=this;return e.moveTo(t.x,t.y),e.quadraticCurveTo(s.x,s.y,i.x,i.y),this}copy(e){return super.copy(e),this.v0.copy(e.v0),this.v1.copy(e.v1),this.v2.copy(e.v2),this}}class it extends k{constructor(t,s,i=1,o=0,c=1){super();b(this,"curves",[]);b(this,"pointT",0);this.center=t,this.rx=s,this.aspectRatio=i,this.start=o,this.end=c;const{x:a,y:h}=this.center,n=this.rx,u=this.rx/this.aspectRatio,y=[new l(a-n,h-u),new l(a+n,h-u),new l(a+n,h+u),new l(a-n,h+u)];for(let p=0;p<4;p++)this.curves.push(new q(y[p],y[(p+1)%4]))}get x(){return this.center.x-this.rx}get y(){return this.center.y-this.rx/this.aspectRatio}get width(){return this.rx*2}get height(){return this.rx/this.aspectRatio*2}getPoint(t){return this.getCurrentLine(t).getPoint(this.pointT)}getPointAt(t){return this.getPoint(t)}getCurrentLine(t){let s=(t*(this.end-this.start)+this.start)%1;s<0&&(s+=1),s*=(1+this.aspectRatio)*2;let i;return s<this.aspectRatio?(i=0,this.pointT=s/this.aspectRatio):s<this.aspectRatio+1?(i=1,this.pointT=(s-this.aspectRatio)/1):s<2*this.aspectRatio+1?(i=2,this.pointT=(s-this.aspectRatio-1)/this.aspectRatio):(i=3,this.pointT=(s-2*this.aspectRatio-1)/1),this.curves[i]}getTangent(t){return this.getCurrentLine(t).getTangent(0).normalize()}getNormal(t){const{v1:s,v2:i}=this.getCurrentLine(t);return new l(i.y-s.y,-(i.x-s.x)).normalize()}getCommands(){return this.curves.flatMap(t=>t.getCommands())}getMinMax(t=l.MAX,s=l.MIN){return this.curves.forEach(i=>i.getMinMax(t,s)),{min:t,max:s}}drawTo(t){return this.curves.forEach(s=>s.drawTo(t)),this}}class rt extends k{constructor(e=[]){super(),this.points=e}getDivisions(e=12){return e*this.points.length}getPoint(e,t=new l){const{points:s}=this,i=(s.length-1)*e,o=Math.floor(i),c=i-o,a=s[o===0?o:o-1],h=s[o],n=s[o>s.length-2?s.length-1:o+1],u=s[o>s.length-3?s.length-1:o+2];return t.set(V(c,a.x,h.x,n.x,u.x),V(c,a.y,h.y,n.y,u.y)),t}copy(e){super.copy(e),this.points=[];for(let t=0,s=e.points.length;t<s;t++)this.points.push(e.points[t].clone());return this}}class X extends k{constructor(t){super();b(this,"curves",[]);b(this,"currentPoint",new l);b(this,"autoClose",!1);b(this,"_cacheLengths",[]);t&&this.setFromPoints(t)}addCurve(t){return this.curves.push(t),this}closePath(){const t=this.curves[0].getPoint(0),s=this.curves[this.curves.length-1].getPoint(1);return t.equals(s)||this.curves.push(new q(s,t)),this}getPoint(t,s=new l){const i=t*this.getLength(),o=this.getCurveLengths();let c=0;for(;c<o.length;){if(o[c]>=i){const a=o[c]-i,h=this.curves[c],n=h.getLength();return h.getPointAt(n===0?0:1-a/n,s)}c++}return s}getLength(){const t=this.getCurveLengths();return t[t.length-1]}updateArcLengths(){super.updateArcLengths(),this._cacheLengths=[],this.getCurveLengths()}getCurveLengths(){if(this._cacheLengths.length===this.curves.length)return this._cacheLengths;const t=[];let s=0;for(let i=0,o=this.curves.length;i<o;i++)s+=this.curves[i].getLength(),t.push(s);return this._cacheLengths=t,t}getSpacedPoints(t=40){const s=[];for(let i=0;i<=t;i++)s.push(this.getPoint(i/t));return this.autoClose&&s.push(s[0]),s}getPoints(t=12){const s=[];let i;for(let o=0,c=this.curves;o<c.length;o++){const a=c[o],h=a.getPoints(a.getDivisions(t));for(let n=0;n<h.length;n++){const u=h[n];i&&i.equals(u)||(s.push(u),i=u)}}return this.autoClose&&s.length>1&&!s[s.length-1].equals(s[0])&&s.push(s[0]),s}setFromPoints(t){this.moveTo(t[0].x,t[0].y);for(let s=1,i=t.length;s<i;s++)this.lineTo(t[s].x,t[s].y);return this}bezierCurveTo(t,s,i,o,c,a){return this.curves.push(new j(this.currentPoint.clone(),new l(t,s),new l(i,o),new l(c,a))),this.currentPoint.set(c,a),this}lineTo(t,s){const i=new q(this.currentPoint.clone(),new l(t,s));return this.curves.push(i),this.currentPoint.set(t,s),this}moveTo(t,s){return this.currentPoint.set(t,s),this}quadraticCurveTo(t,s,i,o){return this.curves.push(new nt(this.currentPoint.clone(),new l(t,s),new l(i,o))),this.currentPoint.set(i,o),this}rect(t,s,i,o){return this.curves.push(new it(new l(t+i/2,s+o/2),i/2,i/o)),this.currentPoint.set(t,s),this}splineThru(t){const s=[this.currentPoint.clone()].concat(t);return this.curves.push(new rt(s)),this.currentPoint.copy(t[t.length-1]),this}arc(t,s,i,o,c,a=!1){const h=this.currentPoint;return this.absarc(t+h.x,s+h.y,i,o,c,a),this}absarc(t,s,i,o,c,a=!1){return this.absellipse(t,s,i,i,o,c,a),this}ellipse(t,s,i,o,c,a,h=!1,n=0){const u=this.currentPoint;return this.absellipse(t+u.x,s+u.y,i,o,c,a,h,n),this}absellipse(t,s,i,o,c,a,h=!1,n=0){const u=new K(t,s,i,o,c,a,h,n);if(this.curves.length>0){const y=u.getPoint(0);y.equals(this.currentPoint)||this.lineTo(y.x,y.y)}return this.curves.push(u),this.currentPoint.copy(u.getPoint(1)),this}getCommands(){return this.curves.flatMap(t=>t.getCommands())}getMinMax(t=l.MAX,s=l.MIN){return this.curves.forEach(i=>i.getMinMax(t,s)),{min:t,max:s}}drawTo(t){return this.curves.forEach(s=>s.drawTo(t)),this}copy(t){super.copy(t),this.curves=[];for(let s=0,i=t.curves.length;s<i;s++){const o=t.curves[s];this.curves.push(o.clone())}return this.autoClose=t.autoClose,this.currentPoint.copy(t.currentPoint),this}}class L{constructor(e){b(this,"currentPath",new X);b(this,"paths",[this.currentPath]);b(this,"userData");e&&(e instanceof L?this.addPath(e):Array.isArray(e)?this.addCommands(e):this.addData(e))}addPath(e){return e instanceof L?this.paths.push(...e.paths.map(t=>t.clone())):this.paths.push(e),this}closePath(){return this.currentPath.closePath(),this}moveTo(e,t){return this.currentPath=new X,this.paths.push(this.currentPath),this.currentPath.moveTo(e,t),this}lineTo(e,t){return this.currentPath.lineTo(e,t),this}bezierCurveTo(e,t,s,i,o,c){return this.currentPath.bezierCurveTo(e,t,s,i,o,c),this}quadraticCurveTo(e,t,s,i){return this.currentPath.quadraticCurveTo(e,t,s,i),this}arc(e,t,s,i,o,c){return this.currentPath.absarc(e,t,s,i,o,!c),this}arcTo(e,t,s,i,o){const c=this.currentPath.currentPoint,a=c.x,h=c.y,n=e-a,u=t-h,y=s-e,p=i-t,x=Math.sqrt(n*n+u*u),g=Math.sqrt(y*y+p*p);if(x<o||g<o)return this.lineTo(s,i),this;const f={x:n/x,y:u/x},M={x:y/g,y:p/g},w=e-f.y*o,I=t+f.x*o,T=Math.atan2(f.y,f.x);let A=Math.atan2(M.y,M.x)-T;return A>Math.PI?A-=2*Math.PI:A<-Math.PI&&(A+=2*Math.PI),this.arc(w,I,o,T,T+A,!1),this.lineTo(s,i),this}ellipse(e,t,s,i,o,c,a,h){return this.currentPath.absellipse(e,t,s,i,c,a,!h,o),this}rect(e,t,s,i){return this.currentPath.rect(e,t,s,i),this}addCommands(e){return yt(e,this),this}addData(e){return this.addCommands(xt(e)),this}splineThru(e){return this.currentPath.splineThru(e),this}forEachCurve(e){return this.paths.forEach(t=>t.curves.forEach(s=>e(s))),this}transform(e){return this.forEachCurve(t=>t.transform(e)),this}getMinMax(e=new l,t=new l){return this.forEachCurve(s=>s.getMinMax(e,t)),{min:e,max:t}}getCommands(){return this.paths.flatMap(e=>e.curves.flatMap(t=>t.getCommands()))}getData(){return this.paths.map(e=>e.getData()).join(" ")}getBoundingBox(){const{min:e,max:t}=this.getMinMax();return{x:e.x,y:e.y,width:t.x-e.x,height:t.y-e.y}}getSvgString(){const{x:e,y:t,width:s,height:i}=this.getBoundingBox();return`<svg viewBox="${e} ${t} ${s} ${i}" xmlns="http://www.w3.org/2000/svg"><path fill="none" stroke="currentColor" d="${this.getData()}"></path></svg>`}getSvgDataUri(){return`data:image/svg+xml;base64,${btoa(this.getSvgString())}`}drawTo(e){this.forEachCurve(t=>{t.drawTo(e)})}strokeTo(e){this.drawTo(e),e.stroke()}fillTo(e){this.drawTo(e),e.fill()}}const _="px",ot=90,at=["mm","cm","in","pt","pc","px"],B={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(r){let e="px";if(typeof r=="string"||r instanceof String)for(let s=0,i=at.length;s<i;s++){const o=at[s];if(r.endsWith(o)){e=o,r=r.substring(0,r.length-o.length);break}}let t;return e==="px"&&_!=="px"?t=B.in[_]/ot:(t=B[e][_],t<0&&(t=B[e].in*ot)),t*Number.parseFloat(r)}const Nt=new d,F=new d,ct=new d,ht=new d;function $t(r,e,t){if(!(r.hasAttribute("transform")||r.nodeName==="use"&&(r.hasAttribute("x")||r.hasAttribute("y"))))return null;const s=Et(r);return t.length>0&&s.premultiply(t[t.length-1]),e.copy(s),t.push(s),s}function Et(r){const e=new d,t=Nt;if(r.nodeName==="use"&&(r.hasAttribute("x")||r.hasAttribute("y"))&&e.translate(m(r.getAttribute("x")),m(r.getAttribute("y"))),r.hasAttribute("transform")){const s=r.getAttribute("transform").split(")");for(let i=s.length-1;i>=0;i--){const o=s[i].trim();if(o==="")continue;const c=o.indexOf("("),a=o.length;if(c>0&&c<a){const h=o.slice(0,c),n=S(o.slice(c+1));switch(t.identity(),h){case"translate":if(n.length>=1){const u=n[0];let y=0;n.length>=2&&(y=n[1]),t.translate(u,y)}break;case"rotate":if(n.length>=1){let u=0,y=0,p=0;u=n[0]*Math.PI/180,n.length>=3&&(y=n[1],p=n[2]),F.makeTranslation(-y,-p),ct.makeRotation(u),ht.multiplyMatrices(ct,F),F.makeTranslation(y,p),t.multiplyMatrices(F,ht)}break;case"scale":n.length>=1&&t.scale(n[0],n[1]??n[0]);break;case"skewX":n.length===1&&t.set(1,Math.tan(n[0]*Math.PI/180),0,0,1,0,0,0,1);break;case"skewY":n.length===1&&t.set(1,0,0,Math.tan(n[0]*Math.PI/180),1,0,0,0,1);break;case"matrix":n.length===6&&t.set(n[0],n[2],n[4],n[1],n[3],n[5],0,0,1);break}}e.premultiply(t)}}return e}function zt(r){return new L().addPath(new X().absarc(m(r.getAttribute("cx")||0),m(r.getAttribute("cy")||0),m(r.getAttribute("r")||0),0,Math.PI*2))}function qt(r,e){if(!(!r.sheet||!r.sheet.cssRules||!r.sheet.cssRules.length))for(let t=0;t<r.sheet.cssRules.length;t++){const s=r.sheet.cssRules[t];if(s.type!==1)continue;const i=s.selectorText.split(/,/g).filter(Boolean).map(o=>o.trim());for(let o=0;o<i.length;o++){const c=Object.fromEntries(Object.entries(s.style).filter(([,a])=>a!==""));e[i[o]]=Object.assign(e[i[o]]||{},c)}}}function Dt(r){return new L().addPath(new X().absellipse(m(r.getAttribute("cx")||0),m(r.getAttribute("cy")||0),m(r.getAttribute("rx")||0),m(r.getAttribute("ry")||0),0,Math.PI*2))}function Xt(r){return new L().moveTo(m(r.getAttribute("x1")||0),m(r.getAttribute("y1")||0)).lineTo(m(r.getAttribute("x2")||0),m(r.getAttribute("y2")||0))}function Ot(r){const e=new L,t=r.getAttribute("d");return!t||t==="none"?null:(e.addData(t),e)}const Rt=/([+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)(?:,|\s)([+-]?\d*\.?\d+(?:e[+-]?\d+)?)/g;function Ft(r){var s;const e=new L;let t=0;return(s=r.getAttribute("points"))==null||s.replace(Rt,(i,o,c)=>{const a=m(o),h=m(c);return t===0?e.moveTo(a,h):e.lineTo(a,h),t++,i}),e.currentPath.autoClose=!0,e}const Yt=/([+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)(?:,|\s)([+-]?\d*\.?\d+(?:e[+-]?\d+)?)/g;function _t(r){var s;const e=new L;let t=0;return(s=r.getAttribute("points"))==null||s.replace(Yt,(i,o,c)=>{const a=m(o),h=m(c);return t===0?e.moveTo(a,h):e.lineTo(a,h),t++,i}),e.currentPath.autoClose=!1,e}function Bt(r){const e=m(r.getAttribute("x")||0),t=m(r.getAttribute("y")||0),s=m(r.getAttribute("rx")||r.getAttribute("ry")||0),i=m(r.getAttribute("ry")||r.getAttribute("rx")||0),o=m(r.getAttribute("width")),c=m(r.getAttribute("height")),a=1-.551915024494,h=new L;return h.moveTo(e+s,t),h.lineTo(e+o-s,t),(s!==0||i!==0)&&h.bezierCurveTo(e+o-s*a,t,e+o,t+i*a,e+o,t+i),h.lineTo(e+o,t+c-i),(s!==0||i!==0)&&h.bezierCurveTo(e+o,t+c-i*a,e+o-s*a,t+c,e+o-s,t+c),h.lineTo(e+s,t+c),(s!==0||i!==0)&&h.bezierCurveTo(e+s*a,t+c,e,t+c-i*a,e,t+c-i),h.lineTo(e,t+i),(s!==0||i!==0)&&h.bezierCurveTo(e,t+i*a,e+s*a,t,e+s,t),h}function N(r,e,t){e=Object.assign({},e);let s={};if(r.hasAttribute("class")){const a=r.getAttribute("class").split(/\s/).filter(Boolean).map(h=>h.trim());for(let h=0;h<a.length;h++)s=Object.assign(s,t[`.${a[h]}`])}r.hasAttribute("id")&&(s=Object.assign(s,t[`#${r.getAttribute("id")}`]));function i(a,h,n){n===void 0&&(n=function(y){return y.startsWith("url")&&console.warn("url access in attributes is not implemented."),y}),r.hasAttribute(a)&&(e[h]=n(r.getAttribute(a))),s[a]&&(e[h]=n(s[a])),r.style&&r.style[a]!==""&&(e[h]=n(r.style[a]))}function o(a){return Math.max(0,Math.min(1,m(a)))}function c(a){return Math.max(0,m(a))}return i("fill","fill"),i("fill-opacity","fillOpacity",o),i("fill-rule","fillRule"),i("opacity","opacity",o),i("stroke","stroke"),i("stroke-dashoffset","strokeDashoffset"),i("stroke-dasharray","strokeDasharray"),i("stroke-linecap","strokeLineCap"),i("stroke-linejoin","strokeLineJoin"),i("stroke-miterlimit","strokeMiterLimit",c),i("stroke-opacity","strokeOpacity",o),i("stroke-width","strokeWidth",c),i("visibility","visibility"),e}function G(r,e,t=[]){var u;if(r.nodeType!==1)return t;let s=!1,i=null;const o={};switch(r.nodeName){case"svg":e=N(r,e,o);break;case"style":qt(r,o);break;case"g":e=N(r,e,o);break;case"path":e=N(r,e,o),r.hasAttribute("d")&&(i=Ot(r));break;case"rect":e=N(r,e,o),i=Bt(r);break;case"polygon":e=N(r,e,o),i=Ft(r);break;case"polyline":e=N(r,e,o),i=_t(r);break;case"circle":e=N(r,e,o),i=zt(r);break;case"ellipse":e=N(r,e,o),i=Dt(r);break;case"line":e=N(r,e,o),i=Xt(r);break;case"defs":s=!0;break;case"use":{e=N(r,e,o);const p=(r.getAttributeNS("http://www.w3.org/1999/xlink","href")||"").substring(1),x=(u=r.viewportElement)==null?void 0:u.getElementById(p);x?G(x,e,t):console.warn(`'use node' references non-existent node id: ${p}`);break}default:console.warn(r);break}const c=new d,a=[],h=$t(r,c,a);i&&(i.transform(c),t.push(i),i.userData={node:r,style:e});const n=r.childNodes;for(let y=0,p=n.length;y<p;y++){const x=n[y];s&&x.nodeName!=="style"&&x.nodeName!=="defs"||G(x,e,t)}return h&&(a.pop(),a.length>0?c.copy(a[a.length-1]):c.identity()),t}function Gt(r){let e;return typeof r=="string"?e=new DOMParser().parseFromString(r,"image/svg+xml").documentElement:e=r,G(e,{fill:"#000",fillOpacity:1,strokeOpacity:1,strokeWidth:1,strokeLineJoin:"miter",strokeLineCap:"butt",strokeMiterLimit:4})}v.CircleCurve=O,v.CubicBezierCurve=j,v.Curve=k,v.CurvePath=X,v.EllipseCurve=K,v.HeartCurve=Lt,v.LineCurve=q,v.Matrix3=d,v.Path2D=L,v.PloygonCurve=St,v.Point2D=l,v.QuadraticBezierCurve=nt,v.RectangularCurve=it,v.SplineCurve=rt,v.parseSvg=Gt,Object.defineProperty(v,Symbol.toStringTag,{value:"Module"})});
|
|
1
|
+
(function(v,d){typeof exports=="object"&&typeof module<"u"?d(exports):typeof define=="function"&&define.amd?define(["exports"],d):(v=typeof globalThis<"u"?globalThis:v||self,d(v.modernPath2d={}))})(this,function(v){"use strict";var Qt=Object.defineProperty;var Ut=(v,d,$)=>d in v?Qt(v,d,{enumerable:!0,configurable:!0,writable:!0,value:$}):v[d]=$;var b=(v,d,$)=>Ut(v,typeof d!="symbol"?d+"":d,$);class d{constructor(e=1,t=0,s=0,i=0,o=1,h=0,a=0,c=0,n=1){b(this,"elements",[]);this.set(e,t,s,i,o,h,a,c,n)}set(e,t,s,i,o,h,a,c,n){const u=this.elements;return u[0]=e,u[1]=i,u[2]=a,u[3]=t,u[4]=o,u[5]=c,u[6]=s,u[7]=h,u[8]=n,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(e){const t=this.elements,s=e.elements;return t[0]=s[0],t[1]=s[1],t[2]=s[2],t[3]=s[3],t[4]=s[4],t[5]=s[5],t[6]=s[6],t[7]=s[7],t[8]=s[8],this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){const s=e.elements,i=t.elements,o=this.elements,h=s[0],a=s[3],c=s[6],n=s[1],u=s[4],y=s[7],p=s[2],x=s[5],g=s[8],f=i[0],M=i[3],w=i[6],k=i[1],T=i[4],C=i[7],A=i[2],E=i[5],z=i[8];return o[0]=h*f+a*k+c*A,o[3]=h*M+a*T+c*E,o[6]=h*w+a*C+c*z,o[1]=n*f+u*k+y*A,o[4]=n*M+u*T+y*E,o[7]=n*w+u*C+y*z,o[2]=p*f+x*k+g*A,o[5]=p*M+x*T+g*E,o[8]=p*w+x*C+g*z,this}invert(){const e=this.elements,t=e[0],s=e[1],i=e[2],o=e[3],h=e[4],a=e[5],c=e[6],n=e[7],u=e[8],y=u*h-a*n,p=a*c-u*o,x=n*o-h*c,g=t*y+s*p+i*x;if(g===0)return this.set(0,0,0,0,0,0,0,0,0);const f=1/g;return e[0]=y*f,e[1]=(i*n-u*s)*f,e[2]=(a*s-i*h)*f,e[3]=p*f,e[4]=(u*t-i*c)*f,e[5]=(i*o-a*t)*f,e[6]=x*f,e[7]=(s*c-n*t)*f,e[8]=(h*t-s*o)*f,this}transpose(){let e;const t=this.elements;return e=t[1],t[1]=t[3],t[3]=e,e=t[2],t[2]=t[6],t[6]=e,e=t[5],t[5]=t[7],t[7]=e,this}scale(e,t){return this.premultiply($.makeScale(e,t)),this}rotate(e){return this.premultiply($.makeRotation(-e)),this}translate(e,t){return this.premultiply($.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 $=new d;class l{constructor(e=0,t=0){this.x=e,this.y=t}static get MAX(){return new l(1/0,1/0)}static get MIN(){return new l(-1/0,-1/0)}set(e,t){return this.x=e,this.y=t,this}add(e){return this.x+=e.x,this.y+=e.y,this}sub(e){return this.x-=e.x,this.y-=e.y,this}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const t=this.x-e.x,s=this.y-e.y;return t*t+s*s}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}multiplyScalar(e){return this.x*=e,this.y*=e,this}divideScalar(e){return this.multiplyScalar(1/e)}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this}normalize(){return this.divideScalar(this.length()||1)}lerpVectors(e,t,s){return this.x=e.x+(t.x-e.x)*s,this.y=e.y+(t.y-e.y)*s,this}equals(e){return this.x===e.x&&this.y===e.y}applyMatrix3(e){const[t,s,i,o,h,a]=e.elements,{x:c,y:n}=this;return this.set(t*c+s*n+i,o*c+h*n+a),this}copy(e){return this.x=e.x,this.y=e.y,this}clone(){return new l(this.x,this.y)}}function U(r,e,t,s){const i=r*t+e*s,o=Math.sqrt(r*r+e*e)*Math.sqrt(t*t+s*s);let h=Math.acos(Math.max(-1,Math.min(1,i/o)));return r*s-e*t<0&&(h=-h),h}function lt(r,e,t,s,i,o,h,a){if(e===0||t===0){r.lineTo(a.x,a.y);return}s=s*Math.PI/180,e=Math.abs(e),t=Math.abs(t);const c=(h.x-a.x)/2,n=(h.y-a.y)/2,u=Math.cos(s)*c+Math.sin(s)*n,y=-Math.sin(s)*c+Math.cos(s)*n;let p=e*e,x=t*t;const g=u*u,f=y*y,M=g/p+f/x;if(M>1){const ut=Math.sqrt(M);e=ut*e,t=ut*t,p=e*e,x=t*t}const w=p*f+x*g,k=(p*x-w)/w;let T=Math.sqrt(Math.max(0,k));i===o&&(T=-T);const C=T*e*y/t,A=-T*t*u/e,E=Math.cos(s)*C-Math.sin(s)*A+(h.x+a.x)/2,z=Math.sin(s)*C+Math.cos(s)*A+(h.y+a.y)/2,Y=U(1,0,(u-C)/e,(y-A)/t),Q=U((u-C)/e,(y-A)/t,(-u-C)/e,(-y-A)/t)%(Math.PI*2);r.currentPath.absellipse(E,z,e,t,Y,Y+Q,o===0,s)}function D(r,e){return r-(e-r)}function yt(r,e){const t=new l,s=new l,i=new l;let o=!0,h=!1;for(let a=0,c=r.length;a<c;a++){const n=r[a];if(o&&(h=!0,o=!1),n.type==="m"||n.type==="M")n.type==="m"?(t.x+=n.x,t.y+=n.y):(t.x=n.x,t.y=n.y),s.x=t.x,s.y=t.y,e.moveTo(t.x,t.y),a===0&&i.copy(t);else if(n.type==="h"||n.type==="H")n.type==="h"?t.x+=n.x:t.x=n.x,s.x=t.x,s.y=t.y,e.lineTo(t.x,t.y),h&&i.copy(t);else if(n.type==="v"||n.type==="V")n.type==="v"?t.y+=n.y:t.y=n.y,s.x=t.x,s.y=t.y,e.lineTo(t.x,t.y),h&&i.copy(t);else if(n.type==="l"||n.type==="L")n.type==="l"?(t.x+=n.x,t.y+=n.y):(t.x=n.x,t.y=n.y),s.x=t.x,s.y=t.y,e.lineTo(t.x,t.y),h&&i.copy(t);else if(n.type==="c"||n.type==="C")n.type==="c"?(e.bezierCurveTo(t.x+n.x1,t.y+n.y1,t.x+n.x2,t.y+n.y2,t.x+n.x,t.y+n.y),s.x=t.x+n.x2,s.y=t.y+n.y2,t.x+=n.x,t.y+=n.y):(e.bezierCurveTo(n.x1,n.y1,n.x2,n.y2,n.x,n.y),s.x=n.x2,s.y=n.y2,t.x=n.x,t.y=n.y),h&&i.copy(t);else if(n.type==="s"||n.type==="S")n.type==="s"?(e.bezierCurveTo(D(t.x,s.x),D(t.y,s.y),t.x+n.x2,t.y+n.y2,t.x+n.x,t.y+n.y),s.x=t.x+n.x2,s.y=t.y+n.y2,t.x+=n.x,t.y+=n.y):(e.bezierCurveTo(D(t.x,s.x),D(t.y,s.y),n.x2,n.y2,n.x,n.y),s.x=n.x2,s.y=n.y2,t.x=n.x,t.y=n.y),h&&i.copy(t);else if(n.type==="q"||n.type==="Q")n.type==="q"?(e.quadraticCurveTo(t.x+n.x1,t.y+n.y1,t.x+n.x,t.y+n.y),s.x=t.x+n.x1,s.y=t.y+n.y1,t.x+=n.x,t.y+=n.y):(e.quadraticCurveTo(n.x1,n.y1,n.x,n.y),s.x=n.x1,s.y=n.y1,t.x=n.x,t.y=n.y),h&&i.copy(t);else if(n.type==="t"||n.type==="T"){const u=D(t.x,s.x),y=D(t.y,s.y);s.x=u,s.y=y,n.type==="t"?(e.quadraticCurveTo(u,y,t.x+n.x,t.y+n.y),t.x+=n.x,t.y+=n.y):(e.quadraticCurveTo(u,y,n.x,n.y),t.x=n.x,t.y=n.y),h&&i.copy(t)}else if(n.type==="a"||n.type==="A"){if(n.type==="a"){if(n.x===0&&n.y===0)continue;t.x+=n.x,t.y+=n.y}else{if(n.x===t.x&&n.y===t.y)continue;t.x=n.x,t.y=n.y}const u=t.clone();s.x=t.x,s.y=t.y,lt(e,n.rx,n.ry,n.angle,n.largeArcFlag,n.sweepFlag,u,t),h&&i.copy(t)}else n.type==="z"||n.type==="Z"?(e.currentPath.autoClose=!0,e.currentPath.curves.length>0&&(t.copy(i),e.currentPath.currentPoint.copy(t),o=!0)):console.warn(n);h=!1}}const P={SEPARATOR:/[ \t\r\n,.\-+]/,WHITESPACE:/[ \t\r\n]/,DIGIT:/\d/,SIGN:/[-+]/,POINT:/\./,COMMA:/,/,EXP:/e/i,FLAGS:/[01]/};function S(r,e,t=0){let a=0,c=!0,n="",u="";const y=[];function p(M,w,k){const T=new SyntaxError(`Unexpected character "${M}" at index ${w}.`);throw T.partial=k,T}function x(){n!==""&&(u===""?y.push(Number(n)):y.push(Number(n)*10**Number(u))),n="",u=""}let g;const f=r.length;for(let M=0;M<f;M++){if(g=r[M],Array.isArray(e)&&e.includes(y.length%t)&&P.FLAGS.test(g)){a=1,n=g,x();continue}if(a===0){if(P.WHITESPACE.test(g))continue;if(P.DIGIT.test(g)||P.SIGN.test(g)){a=1,n=g;continue}if(P.POINT.test(g)){a=2,n=g;continue}P.COMMA.test(g)&&(c&&p(g,M,y),c=!0)}if(a===1){if(P.DIGIT.test(g)){n+=g;continue}if(P.POINT.test(g)){n+=g,a=2;continue}if(P.EXP.test(g)){a=3;continue}P.SIGN.test(g)&&n.length===1&&P.SIGN.test(n[0])&&p(g,M,y)}if(a===2){if(P.DIGIT.test(g)){n+=g;continue}if(P.EXP.test(g)){a=3;continue}P.POINT.test(g)&&n[n.length-1]==="."&&p(g,M,y)}if(a===3){if(P.DIGIT.test(g)){u+=g;continue}if(P.SIGN.test(g)){if(u===""){u+=g;continue}u.length===1&&P.SIGN.test(u)&&p(g,M,y)}}P.WHITESPACE.test(g)?(x(),a=0,c=!1):P.COMMA.test(g)?(x(),a=0,c=!0):P.SIGN.test(g)?(x(),a=1,n=g):P.POINT.test(g)?(x(),a=2,n=g):p(g,M,y)}return x(),y}function gt(r){switch(r.type){case"m":case"M":return`${r.type} ${r.x} ${r.y}`;case"h":case"H":return`${r.type} ${r.x}`;case"v":case"V":return`${r.type} ${r.y}`;case"l":case"L":return`${r.type} ${r.x} ${r.y}`;case"c":case"C":return`${r.type} ${r.x1} ${r.y1} ${r.x2} ${r.y2} ${r.x} ${r.y}`;case"s":case"S":return`${r.type} ${r.x2} ${r.y2} ${r.x} ${r.y}`;case"q":case"Q":return`${r.type} ${r.x1} ${r.y1} ${r.x} ${r.y}`;case"t":case"T":return`${r.type} ${r.x} ${r.y}`;case"a":case"A":return`${r.type} ${r.rx} ${r.ry} ${r.angle} ${r.largeArcFlag} ${r.sweepFlag} ${r.x} ${r.y}`;case"z":case"Z":return r.type;default:return""}}function pt(r){let e="";for(let t=0,s=r.length;t<s;t++)e+=`${gt(r[t])} `;return e}const ft=/[a-df-z][^a-df-z]*/gi;function xt(r){const e=[],t=r.match(ft);if(!t)return e;for(let s=0,i=t.length;s<i;s++){const o=t[s],h=o.charAt(0),a=o.slice(1).trim();let c;switch(h){case"m":case"M":c=S(a);for(let n=0,u=c.length;n<u;n+=2)n===0?e.push({type:h,x:c[n],y:c[n+1]}):e.push({type:h==="m"?"l":"L",x:c[n],y:c[n+1]});break;case"h":case"H":c=S(a);for(let n=0,u=c.length;n<u;n++)e.push({type:h,x:c[n]});break;case"v":case"V":c=S(a);for(let n=0,u=c.length;n<u;n++)e.push({type:h,y:c[n]});break;case"l":case"L":c=S(a);for(let n=0,u=c.length;n<u;n+=2)e.push({type:h,x:c[n],y:c[n+1]});break;case"c":case"C":c=S(a);for(let n=0,u=c.length;n<u;n+=6)e.push({type:h,x1:c[n],y1:c[n+1],x2:c[n+2],y2:c[n+3],x:c[n+4],y:c[n+5]});break;case"s":case"S":c=S(a);for(let n=0,u=c.length;n<u;n+=4)e.push({type:h,x2:c[n],y2:c[n+1],x:c[n+2],y:c[n+3]});break;case"q":case"Q":c=S(a);for(let n=0,u=c.length;n<u;n+=4)e.push({type:h,x1:c[n],y1:c[n+1],x:c[n+2],y:c[n+3]});break;case"t":case"T":c=S(a);for(let n=0,u=c.length;n<u;n+=2)e.push({type:h,x:c[n],y:c[n+1]});break;case"a":case"A":c=S(a,[3,4],7);for(let n=0,u=c.length;n<u;n+=7)e.push({type:h,rx:c[n],ry:c[n+1],angle:c[n+2],largeArcFlag:c[n+3],sweepFlag:c[n+4],x:c[n+5],y:c[n+6]});break;case"z":case"Z":e.push({type:h});break;default:console.warn(o)}}return e}class L{constructor(){b(this,"arcLengthDivisions",200);b(this,"_cacheArcLengths");b(this,"_needsUpdate",!1)}getPointAt(e,t=new l){return this.getPoint(this.getUtoTmapping(e),t)}getPoints(e=5){const t=[];for(let s=0;s<=e;s++)t.push(this.getPoint(s/e));return t}getSpacedPoints(e=5){const t=[];for(let s=0;s<=e;s++)t.push(this.getPointAt(s/e));return t}getLength(){const e=this.getLengths();return e[e.length-1]}getLengths(e=this.arcLengthDivisions){if(this._cacheArcLengths&&this._cacheArcLengths.length===e+1&&!this._needsUpdate)return this._cacheArcLengths;this._needsUpdate=!1;const t=[];let s,i=this.getPoint(0),o=0;t.push(0);for(let h=1;h<=e;h++)s=this.getPoint(h/e),o+=s.distanceTo(i),t.push(o),i=s;return this._cacheArcLengths=t,t}updateArcLengths(){this._needsUpdate=!0,this.getLengths()}getUtoTmapping(e,t){const s=this.getLengths();let i=0;const o=s.length;let h;t?h=t:h=e*s[o-1];let a=0,c=o-1,n;for(;a<=c;)if(i=Math.floor(a+(c-a)/2),n=s[i]-h,n<0)a=i+1;else if(n>0)c=i-1;else{c=i;break}if(i=c,s[i]===h)return i/(o-1);const u=s[i],p=s[i+1]-u,x=(h-u)/p;return(i+x)/(o-1)}getTangent(e,t=new l){let i=e-1e-4,o=e+1e-4;return i<0&&(i=0),o>1&&(o=1),t.copy(this.getPoint(o)).sub(this.getPoint(i)).normalize()}getTangentAt(e,t=new l){return this.getTangent(this.getUtoTmapping(e),t)}transform(e){return this}getDivisions(e){return e}getMinMax(e=l.MAX,t=l.MIN){return{min:e,max:t}}getCommands(){return[]}getData(){return pt(this.getCommands())}drawTo(e){return this}copy(e){return this.arcLengthDivisions=e.arcLengthDivisions,this}clone(){return new this.constructor().copy(this)}}class O extends L{constructor(e,t,s=0,i=Math.PI*2){super(),this.center=e,this.radius=t,this.start=s,this.end=i}getPoint(e){const{radius:t,center:s}=this;return s.clone().add(this.getNormal(e).clone().multiplyScalar(t))}getTangent(e){const{x:t,y:s}=this.getNormal(e);return new l(-s,t)}getNormal(e){const{start:t,end:s}=this,i=e*(s-t)+t-.5*Math.PI;return new l(Math.cos(i),Math.sin(i))}getMinMax(e=l.MAX,t=l.MIN){return e.x=Math.min(e.x,this.center.x-this.radius),e.y=Math.min(e.y,this.center.y-this.radius),t.x=Math.max(t.x,this.center.x+this.radius),t.y=Math.max(t.y,this.center.y+this.radius),{min:e,max:t}}}function V(r,e,t,s,i){const o=(s-e)*.5,h=(i-t)*.5,a=r*r,c=r*a;return(2*t-2*s+o+h)*c+(-3*t+3*s-2*o-h)*a+o*r+t}function Mt(r,e){const t=1-r;return t*t*e}function vt(r,e){return 2*(1-r)*r*e}function mt(r,e){return r*r*e}function H(r,e,t,s){return Mt(r,e)+vt(r,t)+mt(r,s)}function dt(r,e){const t=1-r;return t*t*t*e}function Pt(r,e){const t=1-r;return 3*t*t*r*e}function Tt(r,e){return 3*(1-r)*r*r*e}function wt(r,e){return r*r*r*e}function W(r,e,t,s,i){return dt(r,e)+Pt(r,t)+Tt(r,s)+wt(r,i)}class j extends L{constructor(e=new l,t=new l,s=new l,i=new l){super(),this.v0=e,this.v1=t,this.v2=s,this.v3=i}getPoint(e,t=new l){const{v0:s,v1:i,v2:o,v3:h}=this;return t.set(W(e,s.x,i.x,o.x,h.x),W(e,s.y,i.y,o.y,h.y)),t}transform(e){return this.v0.applyMatrix3(e),this.v1.applyMatrix3(e),this.v2.applyMatrix3(e),this.v3.applyMatrix3(e),this}getMinMax(e=l.MAX,t=l.MIN){const{v0:s,v1:i,v2:o,v3:h}=this;return e.x=Math.min(e.x,s.x,i.x,o.x,h.x),e.y=Math.min(e.y,s.y,i.y,o.y,h.y),t.x=Math.max(t.x,s.x,i.x,o.x,h.x),t.y=Math.max(t.y,s.y,i.y,o.y,h.y),{min:e,max:t}}getCommands(){const{v0:e,v1:t,v2:s,v3:i}=this;return[{type:"M",x:e.x,y:e.y},{type:"C",x1:t.x,y1:t.y,x2:s.x,y2:s.y,x:i.x,y:i.y}]}drawTo(e){const{v0:t,v1:s,v2:i,v3:o}=this;return e.moveTo(t.x,t.y),e.bezierCurveTo(s.x,s.y,i.x,i.y,o.x,o.y),this}copy(e){return super.copy(e),this.v0.copy(e.v0),this.v1.copy(e.v1),this.v2.copy(e.v2),this.v3.copy(e.v3),this}}const bt=new d,Z=new d,J=new d,R=new l;class K extends L{constructor(e=0,t=0,s=1,i=1,o=0,h=Math.PI*2,a=!1,c=0){super(),this.x=e,this.y=t,this.radiusX=s,this.radiusY=i,this.startAngle=o,this.endAngle=h,this.clockwise=a,this.rotation=c}getPoint(e,t=new l){const s=Math.PI*2;let i=this.endAngle-this.startAngle;const o=Math.abs(i)<Number.EPSILON;for(;i<0;)i+=s;for(;i>s;)i-=s;i<Number.EPSILON&&(o?i=0:i=s),this.clockwise&&!o&&(i===s?i=-s:i=i-s);const h=this.startAngle+e*i;let a=this.x+this.radiusX*Math.cos(h),c=this.y+this.radiusY*Math.sin(h);if(this.rotation!==0){const n=Math.cos(this.rotation),u=Math.sin(this.rotation),y=a-this.x,p=c-this.y;a=y*n-p*u+this.x,c=y*u+p*n+this.y}return t.set(a,c)}getDivisions(e=12){return e*2}getCommands(){const{x:e,y:t,radiusX:s,radiusY:i,startAngle:o,endAngle:h,clockwise:a}=this,c=!a,n=e+s*Math.cos(o),u=t+i*Math.sin(o),y=e+s*Math.cos(h),p=t+i*Math.sin(h),x=Math.abs(o-h),g=x>Math.PI?1:0,f=c?0:1,M=e+s*Math.cos(o+(h-o)/2),w=t+i*Math.sin(o+(h-o)/2);return x>=2*Math.PI?[{type:"M",x:n,y:u},{type:"A",rx:s,ry:i,angle:0,largeArcFlag:1,sweepFlag:f,x:M,y:w},{type:"A",rx:s,ry:i,angle:0,largeArcFlag:1,sweepFlag:f,x:n,y:u}]:[{type:"M",x:n,y:u},{type:"A",rx:s,ry:i,angle:0,largeArcFlag:g,sweepFlag:f,x:y,y:p}]}drawTo(e){const{x:t,y:s,radiusX:i,radiusY:o,rotation:h,startAngle:a,endAngle:c,clockwise:n}=this,u=t+i*Math.cos(a),y=s+o*Math.sin(a);return e.moveTo(u,y),e.ellipse(t,s,i,o,h,a,c,!n),this}transform(e){return R.set(this.x,this.y),R.applyMatrix3(e),this.x=R.x,this.y=R.y,It(e)?At(this,e):Ct(this,e),this}copy(e){return super.copy(e),this.x=e.x,this.y=e.y,this.radiusX=e.radiusX,this.radiusY=e.radiusY,this.startAngle=e.startAngle,this.endAngle=e.endAngle,this.clockwise=e.clockwise,this.rotation=e.rotation,this}}function At(r,e){const t=r.radiusX,s=r.radiusY,i=Math.cos(r.rotation),o=Math.sin(r.rotation),h=new l(t*i,t*o),a=new l(-s*o,s*i),c=h.applyMatrix3(e),n=a.applyMatrix3(e),u=bt.set(c.x,n.x,0,c.y,n.y,0,0,0,1),y=Z.copy(u).invert(),g=J.copy(y).transpose().multiply(y).elements,f=kt(g[0],g[1],g[4]),M=Math.sqrt(f.rt1),w=Math.sqrt(f.rt2);if(r.radiusX=1/M,r.radiusY=1/w,r.rotation=Math.atan2(f.sn,f.cs),!((r.endAngle-r.startAngle)%(2*Math.PI)<Number.EPSILON)){const T=Z.set(M,0,0,0,w,0,0,0,1),C=J.set(f.cs,f.sn,0,-f.sn,f.cs,0,0,0,1),A=T.multiply(C).multiply(u),E=z=>{const{x:Y,y:Q}=new l(Math.cos(z),Math.sin(z)).applyMatrix3(A);return Math.atan2(Q,Y)};r.startAngle=E(r.startAngle),r.endAngle=E(r.endAngle),tt(e)&&(r.clockwise=!r.clockwise)}}function Ct(r,e){const t=et(e),s=st(e);r.radiusX*=t,r.radiusY*=s;const i=t>Number.EPSILON?Math.atan2(e.elements[1],e.elements[0]):Math.atan2(-e.elements[3],e.elements[4]);r.rotation+=i,tt(e)&&(r.startAngle*=-1,r.endAngle*=-1,r.clockwise=!r.clockwise)}function tt(r){const e=r.elements;return e[0]*e[4]-e[1]*e[3]<0}function It(r){const e=r.elements,t=e[0]*e[3]+e[1]*e[4];if(t===0)return!1;const s=et(r),i=st(r);return Math.abs(t/(s*i))>Number.EPSILON}function et(r){const e=r.elements;return Math.sqrt(e[0]*e[0]+e[1]*e[1])}function st(r){const e=r.elements;return Math.sqrt(e[3]*e[3]+e[4]*e[4])}function kt(r,e,t){let s,i,o,h,a;const c=r+t,n=r-t,u=Math.sqrt(n*n+4*e*e);return c>0?(s=.5*(c+u),a=1/s,i=r*a*t-e*a*e):c<0?i=.5*(c-u):(s=.5*u,i=-.5*u),n>0?o=n+u:o=n-u,Math.abs(o)>2*Math.abs(e)?(a=-2*e/o,h=1/Math.sqrt(1+a*a),o=a*h):Math.abs(e)===0?(o=1,h=0):(a=-.5*o/e,o=1/Math.sqrt(1+a*a),h=a*o),n>0&&(a=o,o=-h,h=a),{rt1:s,rt2:i,cs:o,sn:h}}class q extends L{constructor(e=new l,t=new l){super(),this.v1=e,this.v2=t}getPoint(e,t=new l){return e===1?t.copy(this.v2):(t.copy(this.v2).sub(this.v1),t.multiplyScalar(e).add(this.v1)),t}getPointAt(e,t=new l){return this.getPoint(e,t)}getTangent(e,t=new l){return t.subVectors(this.v2,this.v1).normalize()}getTangentAt(e,t=new l){return this.getTangent(e,t)}transform(e){return this.v1.applyMatrix3(e),this.v2.applyMatrix3(e),this}getDivisions(){return 1}getMinMax(e=l.MAX,t=l.MIN){const{v1:s,v2:i}=this;return e.x=Math.min(e.x,s.x,i.x),e.y=Math.min(e.y,s.y,i.y),t.x=Math.max(t.x,s.x,i.x),t.y=Math.max(t.y,s.y,i.y),{min:e,max:t}}getCommands(){const{v1:e,v2:t}=this;return[{type:"M",x:e.x,y:e.y},{type:"L",x:t.x,y:t.y}]}drawTo(e){const{v1:t,v2:s}=this;return e.moveTo(t.x,t.y),e.lineTo(s.x,s.y),this}copy(e){return super.copy(e),this.v1.copy(e.v1),this.v2.copy(e.v2),this}}class Lt extends L{constructor(t,s,i=0,o=1){super();b(this,"curves");b(this,"pointT",0);this.center=t,this.size=s,this.start=i,this.end=o;const{x:h,y:a}=this.center,c=new l(h+.5*this.size,a-.5*this.size),n=new l(h-.5*this.size,a-.5*this.size),u=new l(h,a+.5*this.size),y=new O(c,Math.SQRT1_2*this.size,-.25*Math.PI,.75*Math.PI),p=new O(n,Math.SQRT1_2*this.size,-.75*Math.PI,.25*Math.PI),x=new O(u,.5*Math.SQRT1_2*this.size,.75*Math.PI,1.25*Math.PI),g=new l(h,a+this.size),f=new l(h+this.size,a),M=new l().lerpVectors(f,g,.75),w=new l(h-this.size,a),k=new l().lerpVectors(w,g,.75),T=new q(f,M),C=new q(k,w);this.curves=[y,T,x,C,p]}getPoint(t){return this.getCurrentLine(t).getPoint(this.pointT)}getPointAt(t){return this.getPoint(t)}getCurrentLine(t){let s=(t*(this.end-this.start)+this.start)%1;s<0&&(s+=1),s*=9*Math.PI/8+1.5;let i;const o=.5*Math.PI;return s<o?(i=0,this.pointT=s/o):s<o+.75?(i=1,this.pointT=(s-o)/.75):s<5*Math.PI/8+.75?(i=2,this.pointT=(s-o-.75)/(Math.PI/8)):s<5*Math.PI/8+1.5?(i=3,this.pointT=(s-5*Math.PI/8-.75)/.75):(i=4,this.pointT=(s-5*Math.PI/8-1.5)/o),this.curves[i]}getTangent(t){return this.getCurrentLine(t).getTangent(this.pointT).normalize()}getNormal(t){const s=this.getCurrentLine(t);return new l(s.v2.y-s.v1.y,-(s.v2.x-s.v1.x)).normalize()}getCommands(){return this.curves.flatMap(t=>t.getCommands())}drawTo(t){return this.curves.forEach(s=>s.drawTo(t)),this}}class St extends L{constructor(t,s=0,i=0,o=0,h=1){super();b(this,"curves",[]);b(this,"points",[]);this.center=t,this.radius=s,this.num=i,this.start=o,this.end=h;for(let a=0;a<this.num;a++){let c=a*2*Math.PI/this.num;c-=.5*Math.PI;const n=new l(this.radius*Math.cos(c),this.radius*Math.sin(c));n.add(this.center),this.points.push(n)}for(let a=0;a<this.num;a++)this.curves.push(new q(this.points[a],this.points[(a+1)%this.num]))}getPoint(t){return this.getCurrentLine(t),this.currentLine.getPoint(this.pointK)}getPointAt(t){return this.getPoint(t)}getCurrentLine(t){let s=(t*(this.end-this.start)+this.start)%1;s<0&&(s+=1);const i=s*this.num,o=Math.floor(i);return this.pointK=i-o,this.currentLine=this.curves[o],this.currentLine}getTangent(t){return this.getCurrentLine(t).getTangent(0).normalize()}getNormal(t){const s=this.getCurrentLine(t);return new l(s.v2.y-s.v1.y,-(s.v2.x-s.v1.x)).normalize()}getCommands(){return this.curves.flatMap(t=>t.getCommands())}getMinMax(t=l.MAX,s=l.MIN){return this.curves.forEach(i=>i.getMinMax(t,s)),{min:t,max:s}}drawTo(t){return this.curves.forEach(s=>s.drawTo(t)),this}}class nt extends L{constructor(e=new l,t=new l,s=new l){super(),this.v0=e,this.v1=t,this.v2=s}getPoint(e,t=new l){const{v0:s,v1:i,v2:o}=this;return t.set(H(e,s.x,i.x,o.x),H(e,s.y,i.y,o.y)),t}transform(e){return this.v0.applyMatrix3(e),this.v1.applyMatrix3(e),this.v2.applyMatrix3(e),this}getMinMax(e=l.MAX,t=l.MIN){const{v0:s,v1:i,v2:o}=this,h=.5*(s.x+i.x),a=.5*(s.y+i.y),c=.5*(s.x+o.x),n=.5*(s.y+o.y);return e.x=Math.min(e.x,s.x,o.x,h,c),e.y=Math.min(e.y,s.y,o.y,a,n),t.x=Math.max(t.x,s.x,o.x,h,c),t.y=Math.max(t.y,s.y,o.y,a,n),{min:e,max:t}}getCommands(){const{v0:e,v1:t,v2:s}=this;return[{type:"M",x:e.x,y:e.y},{type:"Q",x1:t.x,y1:t.y,x:s.x,y:s.y}]}drawTo(e){const{v0:t,v1:s,v2:i}=this;return e.moveTo(t.x,t.y),e.quadraticCurveTo(s.x,s.y,i.x,i.y),this}copy(e){return super.copy(e),this.v0.copy(e.v0),this.v1.copy(e.v1),this.v2.copy(e.v2),this}}class it extends L{constructor(t,s,i=1,o=0,h=1){super();b(this,"curves",[]);b(this,"pointT",0);this.center=t,this.rx=s,this.aspectRatio=i,this.start=o,this.end=h;const{x:a,y:c}=this.center,n=this.rx,u=this.rx/this.aspectRatio,y=[new l(a-n,c-u),new l(a+n,c-u),new l(a+n,c+u),new l(a-n,c+u)];for(let p=0;p<4;p++)this.curves.push(new q(y[p],y[(p+1)%4]))}get x(){return this.center.x-this.rx}get y(){return this.center.y-this.rx/this.aspectRatio}get width(){return this.rx*2}get height(){return this.rx/this.aspectRatio*2}getPoint(t){return this.getCurrentLine(t).getPoint(this.pointT)}getPointAt(t){return this.getPoint(t)}getCurrentLine(t){let s=(t*(this.end-this.start)+this.start)%1;s<0&&(s+=1),s*=(1+this.aspectRatio)*2;let i;return s<this.aspectRatio?(i=0,this.pointT=s/this.aspectRatio):s<this.aspectRatio+1?(i=1,this.pointT=(s-this.aspectRatio)/1):s<2*this.aspectRatio+1?(i=2,this.pointT=(s-this.aspectRatio-1)/this.aspectRatio):(i=3,this.pointT=(s-2*this.aspectRatio-1)/1),this.curves[i]}getTangent(t){return this.getCurrentLine(t).getTangent(0).normalize()}getNormal(t){const{v1:s,v2:i}=this.getCurrentLine(t);return new l(i.y-s.y,-(i.x-s.x)).normalize()}getCommands(){return this.curves.flatMap(t=>t.getCommands())}getMinMax(t=l.MAX,s=l.MIN){return this.curves.forEach(i=>i.getMinMax(t,s)),{min:t,max:s}}drawTo(t){return this.curves.forEach(s=>s.drawTo(t)),this}}class rt extends L{constructor(e=[]){super(),this.points=e}getDivisions(e=12){return e*this.points.length}getPoint(e,t=new l){const{points:s}=this,i=(s.length-1)*e,o=Math.floor(i),h=i-o,a=s[o===0?o:o-1],c=s[o],n=s[o>s.length-2?s.length-1:o+1],u=s[o>s.length-3?s.length-1:o+2];return t.set(V(h,a.x,c.x,n.x,u.x),V(h,a.y,c.y,n.y,u.y)),t}copy(e){super.copy(e),this.points=[];for(let t=0,s=e.points.length;t<s;t++)this.points.push(e.points[t].clone());return this}}class X extends L{constructor(t){super();b(this,"curves",[]);b(this,"currentPoint",new l);b(this,"autoClose",!1);b(this,"_cacheLengths",[]);t&&this.setFromPoints(t)}addCurve(t){return this.curves.push(t),this}closePath(){const t=this.curves[0].getPoint(0),s=this.curves[this.curves.length-1].getPoint(1);return t.equals(s)||this.curves.push(new q(s,t)),this}getPoint(t,s=new l){const i=t*this.getLength(),o=this.getCurveLengths();let h=0;for(;h<o.length;){if(o[h]>=i){const a=o[h]-i,c=this.curves[h],n=c.getLength();return c.getPointAt(n===0?0:1-a/n,s)}h++}return s}getLength(){const t=this.getCurveLengths();return t[t.length-1]}updateArcLengths(){super.updateArcLengths(),this._cacheLengths=[],this.getCurveLengths()}getCurveLengths(){if(this._cacheLengths.length===this.curves.length)return this._cacheLengths;const t=[];let s=0;for(let i=0,o=this.curves.length;i<o;i++)s+=this.curves[i].getLength(),t.push(s);return this._cacheLengths=t,t}getSpacedPoints(t=40){const s=[];for(let i=0;i<=t;i++)s.push(this.getPoint(i/t));return this.autoClose&&s.push(s[0]),s}getPoints(t=12){const s=[];let i;for(let o=0,h=this.curves;o<h.length;o++){const a=h[o],c=a.getPoints(a.getDivisions(t));for(let n=0;n<c.length;n++){const u=c[n];i&&i.equals(u)||(s.push(u),i=u)}}return this.autoClose&&s.length>1&&!s[s.length-1].equals(s[0])&&s.push(s[0]),s}setFromPoints(t){this.moveTo(t[0].x,t[0].y);for(let s=1,i=t.length;s<i;s++)this.lineTo(t[s].x,t[s].y);return this}bezierCurveTo(t,s,i,o,h,a){return this.curves.push(new j(this.currentPoint.clone(),new l(t,s),new l(i,o),new l(h,a))),this.currentPoint.set(h,a),this}lineTo(t,s){const i=new q(this.currentPoint.clone(),new l(t,s));return this.curves.push(i),this.currentPoint.set(t,s),this}moveTo(t,s){return this.currentPoint.set(t,s),this}quadraticCurveTo(t,s,i,o){return this.curves.push(new nt(this.currentPoint.clone(),new l(t,s),new l(i,o))),this.currentPoint.set(i,o),this}rect(t,s,i,o){return this.curves.push(new it(new l(t+i/2,s+o/2),i/2,i/o)),this.currentPoint.set(t,s),this}splineThru(t){const s=[this.currentPoint.clone()].concat(t);return this.curves.push(new rt(s)),this.currentPoint.copy(t[t.length-1]),this}arc(t,s,i,o,h,a=!1){const c=this.currentPoint;return this.absarc(t+c.x,s+c.y,i,o,h,a),this}absarc(t,s,i,o,h,a=!1){return this.absellipse(t,s,i,i,o,h,a),this}ellipse(t,s,i,o,h,a,c=!1,n=0){const u=this.currentPoint;return this.absellipse(t+u.x,s+u.y,i,o,h,a,c,n),this}absellipse(t,s,i,o,h,a,c=!1,n=0){const u=new K(t,s,i,o,h,a,c,n);if(this.curves.length>0){const y=u.getPoint(0);y.equals(this.currentPoint)||this.lineTo(y.x,y.y)}return this.curves.push(u),this.currentPoint.copy(u.getPoint(1)),this}getCommands(){return this.curves.flatMap(t=>t.getCommands())}getMinMax(t=l.MAX,s=l.MIN){return this.curves.forEach(i=>i.getMinMax(t,s)),{min:t,max:s}}drawTo(t){return this.curves.forEach(s=>s.drawTo(t)),this}copy(t){super.copy(t),this.curves=[];for(let s=0,i=t.curves.length;s<i;s++)this.curves.push(t.curves[s].clone());return this.autoClose=t.autoClose,this.currentPoint.copy(t.currentPoint),this}}class I{constructor(e){b(this,"currentPath",new X);b(this,"paths",[this.currentPath]);b(this,"userData");e&&(e instanceof I?this.addPath(e):Array.isArray(e)?this.addCommands(e):this.addData(e))}addPath(e){return e instanceof I?this.paths.push(...e.paths.map(t=>t.clone())):this.paths.push(e),this}closePath(){return this.currentPath.closePath(),this}moveTo(e,t){return this.currentPath=new X,this.paths.push(this.currentPath),this.currentPath.moveTo(e,t),this}lineTo(e,t){return this.currentPath.lineTo(e,t),this}bezierCurveTo(e,t,s,i,o,h){return this.currentPath.bezierCurveTo(e,t,s,i,o,h),this}quadraticCurveTo(e,t,s,i){return this.currentPath.quadraticCurveTo(e,t,s,i),this}arc(e,t,s,i,o,h){return this.currentPath.absarc(e,t,s,i,o,!h),this}arcTo(e,t,s,i,o){const h=this.currentPath.currentPoint,a=h.x,c=h.y,n=e-a,u=t-c,y=s-e,p=i-t,x=Math.sqrt(n*n+u*u),g=Math.sqrt(y*y+p*p);if(x<o||g<o)return this.lineTo(s,i),this;const f={x:n/x,y:u/x},M={x:y/g,y:p/g},w=e-f.y*o,k=t+f.x*o,T=Math.atan2(f.y,f.x);let A=Math.atan2(M.y,M.x)-T;return A>Math.PI?A-=2*Math.PI:A<-Math.PI&&(A+=2*Math.PI),this.arc(w,k,o,T,T+A,!1),this.lineTo(s,i),this}ellipse(e,t,s,i,o,h,a,c){return this.currentPath.absellipse(e,t,s,i,h,a,!c,o),this}rect(e,t,s,i){return this.currentPath.rect(e,t,s,i),this}addCommands(e){return yt(e,this),this}addData(e){return this.addCommands(xt(e)),this}splineThru(e){return this.currentPath.splineThru(e),this}forEachCurve(e){return this.paths.forEach(t=>t.curves.forEach(s=>e(s))),this}transform(e){return this.forEachCurve(t=>t.transform(e)),this}getMinMax(e=new l,t=new l){return this.forEachCurve(s=>s.getMinMax(e,t)),{min:e,max:t}}getBoundingBox(){const{min:e,max:t}=this.getMinMax();return{x:e.x,y:e.y,left:e.x,top:e.y,right:t.x,bottom:t.y,width:t.x-e.x,height:t.y-e.y}}getCommands(){return this.paths.flatMap(e=>e.curves.flatMap(t=>t.getCommands()))}getData(){return this.paths.map(e=>e.getData()).join(" ")}getSvgString(){const{x:e,y:t,width:s,height:i}=this.getBoundingBox();return`<svg viewBox="${e} ${t} ${s} ${i}" xmlns="http://www.w3.org/2000/svg"><path fill="none" stroke="currentColor" d="${this.getData()}"></path></svg>`}getSvgDataUri(){return`data:image/svg+xml;base64,${btoa(this.getSvgString())}`}drawTo(e){this.forEachCurve(t=>{t.drawTo(e)})}strokeTo(e){this.drawTo(e),e.stroke()}fillTo(e){this.drawTo(e),e.fill()}copy(e){return e.currentPath=this.currentPath.clone(),e.paths=this.paths.map(t=>t.clone()),e.userData=this.userData,this}clone(){return new I().copy(this)}}const _="px",ot=90,at=["mm","cm","in","pt","pc","px"],B={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(r){let e="px";if(typeof r=="string"||r instanceof String)for(let s=0,i=at.length;s<i;s++){const o=at[s];if(r.endsWith(o)){e=o,r=r.substring(0,r.length-o.length);break}}let t;return e==="px"&&_!=="px"?t=B.in[_]/ot:(t=B[e][_],t<0&&(t=B[e].in*ot)),t*Number.parseFloat(r)}const Nt=new d,F=new d,ht=new d,ct=new d;function $t(r,e,t){if(!(r.hasAttribute("transform")||r.nodeName==="use"&&(r.hasAttribute("x")||r.hasAttribute("y"))))return null;const s=Et(r);return t.length>0&&s.premultiply(t[t.length-1]),e.copy(s),t.push(s),s}function Et(r){const e=new d,t=Nt;if(r.nodeName==="use"&&(r.hasAttribute("x")||r.hasAttribute("y"))&&e.translate(m(r.getAttribute("x")),m(r.getAttribute("y"))),r.hasAttribute("transform")){const s=r.getAttribute("transform").split(")");for(let i=s.length-1;i>=0;i--){const o=s[i].trim();if(o==="")continue;const h=o.indexOf("("),a=o.length;if(h>0&&h<a){const c=o.slice(0,h),n=S(o.slice(h+1));switch(t.identity(),c){case"translate":if(n.length>=1){const u=n[0];let y=0;n.length>=2&&(y=n[1]),t.translate(u,y)}break;case"rotate":if(n.length>=1){let u=0,y=0,p=0;u=n[0]*Math.PI/180,n.length>=3&&(y=n[1],p=n[2]),F.makeTranslation(-y,-p),ht.makeRotation(u),ct.multiplyMatrices(ht,F),F.makeTranslation(y,p),t.multiplyMatrices(F,ct)}break;case"scale":n.length>=1&&t.scale(n[0],n[1]??n[0]);break;case"skewX":n.length===1&&t.set(1,Math.tan(n[0]*Math.PI/180),0,0,1,0,0,0,1);break;case"skewY":n.length===1&&t.set(1,0,0,Math.tan(n[0]*Math.PI/180),1,0,0,0,1);break;case"matrix":n.length===6&&t.set(n[0],n[2],n[4],n[1],n[3],n[5],0,0,1);break}}e.premultiply(t)}}return e}function zt(r){return new I().addPath(new X().absarc(m(r.getAttribute("cx")||0),m(r.getAttribute("cy")||0),m(r.getAttribute("r")||0),0,Math.PI*2))}function qt(r,e){if(!(!r.sheet||!r.sheet.cssRules||!r.sheet.cssRules.length))for(let t=0;t<r.sheet.cssRules.length;t++){const s=r.sheet.cssRules[t];if(s.type!==1)continue;const i=s.selectorText.split(/,/g).filter(Boolean).map(o=>o.trim());for(let o=0;o<i.length;o++){const h=Object.fromEntries(Object.entries(s.style).filter(([,a])=>a!==""));e[i[o]]=Object.assign(e[i[o]]||{},h)}}}function Dt(r){return new I().addPath(new X().absellipse(m(r.getAttribute("cx")||0),m(r.getAttribute("cy")||0),m(r.getAttribute("rx")||0),m(r.getAttribute("ry")||0),0,Math.PI*2))}function Xt(r){return new I().moveTo(m(r.getAttribute("x1")||0),m(r.getAttribute("y1")||0)).lineTo(m(r.getAttribute("x2")||0),m(r.getAttribute("y2")||0))}function Ot(r){const e=new I,t=r.getAttribute("d");return!t||t==="none"?null:(e.addData(t),e)}const Rt=/([+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)(?:,|\s)([+-]?\d*\.?\d+(?:e[+-]?\d+)?)/g;function Ft(r){var s;const e=new I;let t=0;return(s=r.getAttribute("points"))==null||s.replace(Rt,(i,o,h)=>{const a=m(o),c=m(h);return t===0?e.moveTo(a,c):e.lineTo(a,c),t++,i}),e.currentPath.autoClose=!0,e}const Yt=/([+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)(?:,|\s)([+-]?\d*\.?\d+(?:e[+-]?\d+)?)/g;function _t(r){var s;const e=new I;let t=0;return(s=r.getAttribute("points"))==null||s.replace(Yt,(i,o,h)=>{const a=m(o),c=m(h);return t===0?e.moveTo(a,c):e.lineTo(a,c),t++,i}),e.currentPath.autoClose=!1,e}function Bt(r){const e=m(r.getAttribute("x")||0),t=m(r.getAttribute("y")||0),s=m(r.getAttribute("rx")||r.getAttribute("ry")||0),i=m(r.getAttribute("ry")||r.getAttribute("rx")||0),o=m(r.getAttribute("width")),h=m(r.getAttribute("height")),a=1-.551915024494,c=new I;return c.moveTo(e+s,t),c.lineTo(e+o-s,t),(s!==0||i!==0)&&c.bezierCurveTo(e+o-s*a,t,e+o,t+i*a,e+o,t+i),c.lineTo(e+o,t+h-i),(s!==0||i!==0)&&c.bezierCurveTo(e+o,t+h-i*a,e+o-s*a,t+h,e+o-s,t+h),c.lineTo(e+s,t+h),(s!==0||i!==0)&&c.bezierCurveTo(e+s*a,t+h,e,t+h-i*a,e,t+h-i),c.lineTo(e,t+i),(s!==0||i!==0)&&c.bezierCurveTo(e,t+i*a,e+s*a,t,e+s,t),c}function N(r,e,t){e=Object.assign({},e);let s={};if(r.hasAttribute("class")){const a=r.getAttribute("class").split(/\s/).filter(Boolean).map(c=>c.trim());for(let c=0;c<a.length;c++)s=Object.assign(s,t[`.${a[c]}`])}r.hasAttribute("id")&&(s=Object.assign(s,t[`#${r.getAttribute("id")}`]));function i(a,c,n){n===void 0&&(n=function(y){return y.startsWith("url")&&console.warn("url access in attributes is not implemented."),y}),r.hasAttribute(a)&&(e[c]=n(r.getAttribute(a))),s[a]&&(e[c]=n(s[a])),r.style&&r.style[a]!==""&&(e[c]=n(r.style[a]))}function o(a){return Math.max(0,Math.min(1,m(a)))}function h(a){return Math.max(0,m(a))}return i("fill","fill"),i("fill-opacity","fillOpacity",o),i("fill-rule","fillRule"),i("opacity","opacity",o),i("stroke","stroke"),i("stroke-dashoffset","strokeDashoffset"),i("stroke-dasharray","strokeDasharray"),i("stroke-linecap","strokeLineCap"),i("stroke-linejoin","strokeLineJoin"),i("stroke-miterlimit","strokeMiterLimit",h),i("stroke-opacity","strokeOpacity",o),i("stroke-width","strokeWidth",h),i("visibility","visibility"),e}function G(r,e,t=[]){var u;if(r.nodeType!==1)return t;let s=!1,i=null;const o={};switch(r.nodeName){case"svg":e=N(r,e,o);break;case"style":qt(r,o);break;case"g":e=N(r,e,o);break;case"path":e=N(r,e,o),r.hasAttribute("d")&&(i=Ot(r));break;case"rect":e=N(r,e,o),i=Bt(r);break;case"polygon":e=N(r,e,o),i=Ft(r);break;case"polyline":e=N(r,e,o),i=_t(r);break;case"circle":e=N(r,e,o),i=zt(r);break;case"ellipse":e=N(r,e,o),i=Dt(r);break;case"line":e=N(r,e,o),i=Xt(r);break;case"defs":s=!0;break;case"use":{e=N(r,e,o);const p=(r.getAttributeNS("http://www.w3.org/1999/xlink","href")||"").substring(1),x=(u=r.viewportElement)==null?void 0:u.getElementById(p);x?G(x,e,t):console.warn(`'use node' references non-existent node id: ${p}`);break}default:console.warn(r);break}const h=new d,a=[],c=$t(r,h,a);i&&(i.transform(h),t.push(i),i.userData={node:r,style:e});const n=r.childNodes;for(let y=0,p=n.length;y<p;y++){const x=n[y];s&&x.nodeName!=="style"&&x.nodeName!=="defs"||G(x,e,t)}return c&&(a.pop(),a.length>0?h.copy(a[a.length-1]):h.identity()),t}function Gt(r){let e;return typeof r=="string"?e=new DOMParser().parseFromString(r,"image/svg+xml").documentElement:e=r,G(e,{fill:"#000",fillOpacity:1,strokeOpacity:1,strokeWidth:1,strokeLineJoin:"miter",strokeLineCap:"butt",strokeMiterLimit:4})}v.CircleCurve=O,v.CubicBezierCurve=j,v.Curve=L,v.CurvePath=X,v.EllipseCurve=K,v.HeartCurve=Lt,v.LineCurve=q,v.Matrix3=d,v.Path2D=I,v.PloygonCurve=St,v.Point2D=l,v.QuadraticBezierCurve=nt,v.RectangularCurve=it,v.SplineCurve=rt,v.parseSvg=Gt,Object.defineProperty(v,Symbol.toStringTag,{value:"Module"})});
|
package/dist/index.mjs
CHANGED
|
@@ -977,13 +977,13 @@ class Curve {
|
|
|
977
977
|
drawTo(ctx) {
|
|
978
978
|
return this;
|
|
979
979
|
}
|
|
980
|
-
clone() {
|
|
981
|
-
return new this.constructor().copy(this);
|
|
982
|
-
}
|
|
983
980
|
copy(source) {
|
|
984
981
|
this.arcLengthDivisions = source.arcLengthDivisions;
|
|
985
982
|
return this;
|
|
986
983
|
}
|
|
984
|
+
clone() {
|
|
985
|
+
return new this.constructor().copy(this);
|
|
986
|
+
}
|
|
987
987
|
}
|
|
988
988
|
|
|
989
989
|
class CircleCurve extends Curve {
|
|
@@ -1070,6 +1070,13 @@ class CubicBezierCurve extends Curve {
|
|
|
1070
1070
|
);
|
|
1071
1071
|
return output;
|
|
1072
1072
|
}
|
|
1073
|
+
transform(matrix) {
|
|
1074
|
+
this.v0.applyMatrix3(matrix);
|
|
1075
|
+
this.v1.applyMatrix3(matrix);
|
|
1076
|
+
this.v2.applyMatrix3(matrix);
|
|
1077
|
+
this.v3.applyMatrix3(matrix);
|
|
1078
|
+
return this;
|
|
1079
|
+
}
|
|
1073
1080
|
getMinMax(min = Point2D.MAX, max = Point2D.MIN) {
|
|
1074
1081
|
const { v0, v1, v2, v3 } = this;
|
|
1075
1082
|
min.x = Math.min(min.x, v0.x, v1.x, v2.x, v3.x);
|
|
@@ -1078,13 +1085,6 @@ class CubicBezierCurve extends Curve {
|
|
|
1078
1085
|
max.y = Math.max(max.y, v0.y, v1.y, v2.y, v3.y);
|
|
1079
1086
|
return { min, max };
|
|
1080
1087
|
}
|
|
1081
|
-
transform(matrix) {
|
|
1082
|
-
this.v0.applyMatrix3(matrix);
|
|
1083
|
-
this.v1.applyMatrix3(matrix);
|
|
1084
|
-
this.v2.applyMatrix3(matrix);
|
|
1085
|
-
this.v3.applyMatrix3(matrix);
|
|
1086
|
-
return this;
|
|
1087
|
-
}
|
|
1088
1088
|
getCommands() {
|
|
1089
1089
|
const { v0, v1, v2, v3 } = this;
|
|
1090
1090
|
return [
|
|
@@ -1124,9 +1124,6 @@ class EllipseCurve extends Curve {
|
|
|
1124
1124
|
this.clockwise = clockwise;
|
|
1125
1125
|
this.rotation = rotation;
|
|
1126
1126
|
}
|
|
1127
|
-
getDivisions(divisions = 12) {
|
|
1128
|
-
return divisions * 2;
|
|
1129
|
-
}
|
|
1130
1127
|
getPoint(t, output = new Point2D()) {
|
|
1131
1128
|
const twoPi = Math.PI * 2;
|
|
1132
1129
|
let deltaAngle = this.endAngle - this.startAngle;
|
|
@@ -1162,6 +1159,9 @@ class EllipseCurve extends Curve {
|
|
|
1162
1159
|
}
|
|
1163
1160
|
return output.set(_x, _y);
|
|
1164
1161
|
}
|
|
1162
|
+
getDivisions(divisions = 12) {
|
|
1163
|
+
return divisions * 2;
|
|
1164
|
+
}
|
|
1165
1165
|
getCommands() {
|
|
1166
1166
|
const { x, y, radiusX, radiusY, startAngle, endAngle, clockwise } = this;
|
|
1167
1167
|
const anticlockwise = !clockwise;
|
|
@@ -1375,9 +1375,6 @@ class LineCurve extends Curve {
|
|
|
1375
1375
|
this.v1 = v1;
|
|
1376
1376
|
this.v2 = v2;
|
|
1377
1377
|
}
|
|
1378
|
-
getDivisions() {
|
|
1379
|
-
return 1;
|
|
1380
|
-
}
|
|
1381
1378
|
getPoint(t, output = new Point2D()) {
|
|
1382
1379
|
if (t === 1) {
|
|
1383
1380
|
output.copy(this.v2);
|
|
@@ -1396,12 +1393,13 @@ class LineCurve extends Curve {
|
|
|
1396
1393
|
getTangentAt(u, output = new Point2D()) {
|
|
1397
1394
|
return this.getTangent(u, output);
|
|
1398
1395
|
}
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1396
|
+
transform(matrix) {
|
|
1397
|
+
this.v1.applyMatrix3(matrix);
|
|
1398
|
+
this.v2.applyMatrix3(matrix);
|
|
1399
|
+
return this;
|
|
1400
|
+
}
|
|
1401
|
+
getDivisions() {
|
|
1402
|
+
return 1;
|
|
1405
1403
|
}
|
|
1406
1404
|
getMinMax(min = Point2D.MAX, max = Point2D.MIN) {
|
|
1407
1405
|
const { v1, v2 } = this;
|
|
@@ -1411,10 +1409,12 @@ class LineCurve extends Curve {
|
|
|
1411
1409
|
max.y = Math.max(max.y, v1.y, v2.y);
|
|
1412
1410
|
return { min, max };
|
|
1413
1411
|
}
|
|
1414
|
-
|
|
1415
|
-
this
|
|
1416
|
-
|
|
1417
|
-
|
|
1412
|
+
getCommands() {
|
|
1413
|
+
const { v1, v2 } = this;
|
|
1414
|
+
return [
|
|
1415
|
+
{ type: "M", x: v1.x, y: v1.y },
|
|
1416
|
+
{ type: "L", x: v2.x, y: v2.y }
|
|
1417
|
+
];
|
|
1418
1418
|
}
|
|
1419
1419
|
drawTo(ctx) {
|
|
1420
1420
|
const { v1, v2 } = this;
|
|
@@ -1585,12 +1585,11 @@ class QuadraticBezierCurve extends Curve {
|
|
|
1585
1585
|
);
|
|
1586
1586
|
return output;
|
|
1587
1587
|
}
|
|
1588
|
-
|
|
1589
|
-
|
|
1590
|
-
|
|
1591
|
-
|
|
1592
|
-
|
|
1593
|
-
];
|
|
1588
|
+
transform(matrix) {
|
|
1589
|
+
this.v0.applyMatrix3(matrix);
|
|
1590
|
+
this.v1.applyMatrix3(matrix);
|
|
1591
|
+
this.v2.applyMatrix3(matrix);
|
|
1592
|
+
return this;
|
|
1594
1593
|
}
|
|
1595
1594
|
getMinMax(min = Point2D.MAX, max = Point2D.MIN) {
|
|
1596
1595
|
const { v0, v1, v2 } = this;
|
|
@@ -1604,11 +1603,12 @@ class QuadraticBezierCurve extends Curve {
|
|
|
1604
1603
|
max.y = Math.max(max.y, v0.y, v2.y, y1, y2);
|
|
1605
1604
|
return { min, max };
|
|
1606
1605
|
}
|
|
1607
|
-
|
|
1608
|
-
this
|
|
1609
|
-
|
|
1610
|
-
|
|
1611
|
-
|
|
1606
|
+
getCommands() {
|
|
1607
|
+
const { v0, v1, v2 } = this;
|
|
1608
|
+
return [
|
|
1609
|
+
{ type: "M", x: v0.x, y: v0.y },
|
|
1610
|
+
{ type: "Q", x1: v1.x, y1: v1.y, x: v2.x, y: v2.y }
|
|
1611
|
+
];
|
|
1612
1612
|
}
|
|
1613
1613
|
drawTo(ctx) {
|
|
1614
1614
|
const { v0, v1, v2 } = this;
|
|
@@ -1937,9 +1937,8 @@ class CurvePath extends Curve {
|
|
|
1937
1937
|
copy(source) {
|
|
1938
1938
|
super.copy(source);
|
|
1939
1939
|
this.curves = [];
|
|
1940
|
-
for (let i = 0,
|
|
1941
|
-
|
|
1942
|
-
this.curves.push(curve.clone());
|
|
1940
|
+
for (let i = 0, len = source.curves.length; i < len; i++) {
|
|
1941
|
+
this.curves.push(source.curves[i].clone());
|
|
1943
1942
|
}
|
|
1944
1943
|
this.autoClose = source.autoClose;
|
|
1945
1944
|
this.currentPoint.copy(source.currentPoint);
|
|
@@ -2064,21 +2063,25 @@ class Path2D {
|
|
|
2064
2063
|
this.forEachCurve((curve) => curve.getMinMax(min, max));
|
|
2065
2064
|
return { min, max };
|
|
2066
2065
|
}
|
|
2067
|
-
getCommands() {
|
|
2068
|
-
return this.paths.flatMap((path) => path.curves.flatMap((curve) => curve.getCommands()));
|
|
2069
|
-
}
|
|
2070
|
-
getData() {
|
|
2071
|
-
return this.paths.map((path) => path.getData()).join(" ");
|
|
2072
|
-
}
|
|
2073
2066
|
getBoundingBox() {
|
|
2074
2067
|
const { min, max } = this.getMinMax();
|
|
2075
2068
|
return {
|
|
2076
2069
|
x: min.x,
|
|
2077
2070
|
y: min.y,
|
|
2071
|
+
left: min.x,
|
|
2072
|
+
top: min.y,
|
|
2073
|
+
right: max.x,
|
|
2074
|
+
bottom: max.y,
|
|
2078
2075
|
width: max.x - min.x,
|
|
2079
2076
|
height: max.y - min.y
|
|
2080
2077
|
};
|
|
2081
2078
|
}
|
|
2079
|
+
getCommands() {
|
|
2080
|
+
return this.paths.flatMap((path) => path.curves.flatMap((curve) => curve.getCommands()));
|
|
2081
|
+
}
|
|
2082
|
+
getData() {
|
|
2083
|
+
return this.paths.map((path) => path.getData()).join(" ");
|
|
2084
|
+
}
|
|
2082
2085
|
getSvgString() {
|
|
2083
2086
|
const { x, y, width, height } = this.getBoundingBox();
|
|
2084
2087
|
return `<svg viewBox="${x} ${y} ${width} ${height}" xmlns="http://www.w3.org/2000/svg"><path fill="none" stroke="currentColor" d="${this.getData()}"></path></svg>`;
|
|
@@ -2099,6 +2102,15 @@ class Path2D {
|
|
|
2099
2102
|
this.drawTo(ctx);
|
|
2100
2103
|
ctx.fill();
|
|
2101
2104
|
}
|
|
2105
|
+
copy(source) {
|
|
2106
|
+
source.currentPath = this.currentPath.clone();
|
|
2107
|
+
source.paths = this.paths.map((path) => path.clone());
|
|
2108
|
+
source.userData = this.userData;
|
|
2109
|
+
return this;
|
|
2110
|
+
}
|
|
2111
|
+
clone() {
|
|
2112
|
+
return new Path2D().copy(this);
|
|
2113
|
+
}
|
|
2102
2114
|
}
|
|
2103
2115
|
|
|
2104
2116
|
const defaultUnit = "px";
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "modern-path2d",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.1",
|
|
5
5
|
"packageManager": "pnpm@9.9.0",
|
|
6
6
|
"description": "A modern Path2D library, fully compatible with Web Path2D, with additional support for path animation, path deformation, path playback, etc.",
|
|
7
7
|
"author": "wxm",
|