@remotion/paths 3.2.11

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.
Files changed (65) hide show
  1. package/.prettierrc.js +14 -0
  2. package/LICENSE.md +7 -0
  3. package/README.md +25 -0
  4. package/dist/arc.d.ts +12 -0
  5. package/dist/arc.js +231 -0
  6. package/dist/bezier-functions.d.ts +11 -0
  7. package/dist/bezier-functions.js +138 -0
  8. package/dist/bezier-values.d.ts +3 -0
  9. package/dist/bezier-values.js +693 -0
  10. package/dist/bezier.d.ts +26 -0
  11. package/dist/bezier.js +81 -0
  12. package/dist/construct.d.ts +7 -0
  13. package/dist/construct.js +308 -0
  14. package/dist/evolve-path.d.ts +10 -0
  15. package/dist/evolve-path.js +17 -0
  16. package/dist/get-length.d.ts +6 -0
  17. package/dist/get-length.js +15 -0
  18. package/dist/get-part-at-length.d.ts +4 -0
  19. package/dist/get-part-at-length.js +20 -0
  20. package/dist/get-parts.d.ts +7 -0
  21. package/dist/get-parts.js +31 -0
  22. package/dist/get-point-at-length.d.ts +7 -0
  23. package/dist/get-point-at-length.js +24 -0
  24. package/dist/get-properties-at-length.d.ts +1 -0
  25. package/dist/get-properties-at-length.js +23 -0
  26. package/dist/get-reversed-path.d.ts +12 -0
  27. package/dist/get-reversed-path.js +159 -0
  28. package/dist/get-tangent-at-length.d.ts +7 -0
  29. package/dist/get-tangent-at-length.js +24 -0
  30. package/dist/helpers/arc.d.ts +12 -0
  31. package/dist/helpers/arc.js +226 -0
  32. package/dist/helpers/bezier-functions.d.ts +11 -0
  33. package/dist/helpers/bezier-functions.js +135 -0
  34. package/dist/helpers/bezier-values.d.ts +3 -0
  35. package/dist/helpers/bezier-values.js +694 -0
  36. package/dist/helpers/bezier.d.ts +26 -0
  37. package/dist/helpers/bezier.js +82 -0
  38. package/dist/helpers/construct.d.ts +7 -0
  39. package/dist/helpers/construct.js +309 -0
  40. package/dist/helpers/get-part-at-length.d.ts +4 -0
  41. package/dist/helpers/get-part-at-length.js +20 -0
  42. package/dist/helpers/linear.d.ts +7 -0
  43. package/dist/helpers/linear.js +30 -0
  44. package/dist/helpers/parse.d.ts +2 -0
  45. package/dist/helpers/parse.js +49 -0
  46. package/dist/helpers/split-curve.d.ts +47 -0
  47. package/dist/helpers/split-curve.js +190 -0
  48. package/dist/helpers/types.d.ts +22 -0
  49. package/dist/helpers/types.js +3 -0
  50. package/dist/index.d.ts +9 -0
  51. package/dist/index.js +19 -0
  52. package/dist/interpolate-path.d.ts +8 -0
  53. package/dist/interpolate-path.js +366 -0
  54. package/dist/linear.d.ts +7 -0
  55. package/dist/linear.js +31 -0
  56. package/dist/normalize-path.d.ts +6 -0
  57. package/dist/normalize-path.js +300 -0
  58. package/dist/parse.d.ts +2 -0
  59. package/dist/parse.js +48 -0
  60. package/dist/reverse-path.d.ts +12 -0
  61. package/dist/reverse-path.js +148 -0
  62. package/dist/types.d.ts +26 -0
  63. package/dist/types.js +2 -0
  64. package/package.json +39 -0
  65. package/tsconfig.json +9 -0
@@ -0,0 +1,26 @@
1
+ import type { Point } from './types';
2
+ export declare const makeBezier: ({ ax, ay, bx, by, cx, cy, dx, dy, }: {
3
+ ax: number;
4
+ ay: number;
5
+ bx: number;
6
+ by: number;
7
+ cx: number;
8
+ cy: number;
9
+ dx: number | null;
10
+ dy: number | null;
11
+ }) => {
12
+ getPointAtLength: (len: number) => Point;
13
+ getPropertiesAtLength: (len: number) => {
14
+ x: number;
15
+ y: number;
16
+ tangentX: number;
17
+ tangentY: number;
18
+ };
19
+ getTangentAtLength: (len: number) => Point;
20
+ getTotalLength: () => number;
21
+ getC: () => {
22
+ x: number;
23
+ y: number;
24
+ };
25
+ getD: () => Point;
26
+ };
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ // Copied from: https://github.com/rveciana/svg-path-properties
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.makeBezier = void 0;
5
+ const bezier_functions_1 = require("./bezier-functions");
6
+ const makeBezier = ({ ax, ay, bx, by, cx, cy, dx, dy, }) => {
7
+ let d;
8
+ let getArcLength;
9
+ let getPoint;
10
+ let getDerivative;
11
+ const a = { x: ax, y: ay };
12
+ const b = { x: bx, y: by };
13
+ const c = { x: cx, y: cy };
14
+ if (dx !== null && dy !== null) {
15
+ getArcLength = bezier_functions_1.getCubicArcLength;
16
+ getPoint = bezier_functions_1.cubicPoint;
17
+ getDerivative = bezier_functions_1.cubicDerivative;
18
+ d = { x: dx, y: dy };
19
+ }
20
+ else {
21
+ getArcLength = bezier_functions_1.getQuadraticArcLength;
22
+ getPoint = bezier_functions_1.quadraticPoint;
23
+ getDerivative = bezier_functions_1.quadraticDerivative;
24
+ d = { x: 0, y: 0 };
25
+ }
26
+ const length = getArcLength([a.x, b.x, c.x, d.x], [a.y, b.y, c.y, d.y], 1);
27
+ const getTotalLength = () => {
28
+ return length;
29
+ };
30
+ const getPointAtLength = (len) => {
31
+ const xs = [a.x, b.x, c.x, d.x];
32
+ const xy = [a.y, b.y, c.y, d.y];
33
+ const t = (0, bezier_functions_1.t2length)(len, len, (i) => getArcLength(xs, xy, i));
34
+ return getPoint(xs, xy, t);
35
+ };
36
+ const getTangentAtLength = (len) => {
37
+ const xs = [a.x, b.x, c.x, d.x];
38
+ const xy = [a.y, b.y, c.y, d.y];
39
+ const t = (0, bezier_functions_1.t2length)(len, len, (i) => getArcLength(xs, xy, i));
40
+ const derivative = getDerivative(xs, xy, t);
41
+ const mdl = Math.sqrt(derivative.x * derivative.x + derivative.y * derivative.y);
42
+ let tangent;
43
+ if (mdl > 0) {
44
+ tangent = { x: derivative.x / mdl, y: derivative.y / mdl };
45
+ }
46
+ else {
47
+ tangent = { x: 0, y: 0 };
48
+ }
49
+ return tangent;
50
+ };
51
+ const getPropertiesAtLength = (len) => {
52
+ const xs = [a.x, b.x, c.x, d.x];
53
+ const xy = [a.y, b.y, c.y, d.y];
54
+ const t = (0, bezier_functions_1.t2length)(len, len, (i) => getArcLength(xs, xy, i));
55
+ const derivative = getDerivative(xs, xy, t);
56
+ const mdl = Math.sqrt(derivative.x * derivative.x + derivative.y * derivative.y);
57
+ let tangent;
58
+ if (mdl > 0) {
59
+ tangent = { x: derivative.x / mdl, y: derivative.y / mdl };
60
+ }
61
+ else {
62
+ tangent = { x: 0, y: 0 };
63
+ }
64
+ const point = getPoint(xs, xy, t);
65
+ return { x: point.x, y: point.y, tangentX: tangent.x, tangentY: tangent.y };
66
+ };
67
+ const getC = () => {
68
+ return c;
69
+ };
70
+ const getD = () => {
71
+ return d;
72
+ };
73
+ return {
74
+ getPointAtLength,
75
+ getPropertiesAtLength,
76
+ getTangentAtLength,
77
+ getTotalLength,
78
+ getC,
79
+ getD,
80
+ };
81
+ };
82
+ exports.makeBezier = makeBezier;
@@ -0,0 +1,7 @@
1
+ import type { Point, Properties } from './types';
2
+ export declare const construct: (string: string) => {
3
+ initial_point: Point | null;
4
+ length: number;
5
+ partial_lengths: number[];
6
+ functions: (Properties | null)[];
7
+ };
@@ -0,0 +1,309 @@
1
+ "use strict";
2
+ // Copied from: https://github.com/rveciana/svg-path-properties
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.construct = void 0;
8
+ const arc_1 = require("./arc");
9
+ const bezier_1 = require("./bezier");
10
+ const linear_1 = require("./linear");
11
+ const parse_1 = __importDefault(require("./parse"));
12
+ const construct = (string) => {
13
+ let length = 0;
14
+ const partial_lengths = [];
15
+ const functions = [];
16
+ let initial_point = null;
17
+ const parsed = (0, parse_1.default)(string);
18
+ let cur = [0, 0];
19
+ let prev_point = [0, 0];
20
+ let curve;
21
+ let ringStart = [0, 0];
22
+ for (let i = 0; i < parsed.length; i++) {
23
+ // moveTo
24
+ if (parsed[i][0] === 'M') {
25
+ cur = [parsed[i][1], parsed[i][2]];
26
+ ringStart = [cur[0], cur[1]];
27
+ functions.push(null);
28
+ if (i === 0) {
29
+ initial_point = { x: parsed[i][1], y: parsed[i][2] };
30
+ }
31
+ }
32
+ else if (parsed[i][0] === 'm') {
33
+ cur = [parsed[i][1] + cur[0], parsed[i][2] + cur[1]];
34
+ ringStart = [cur[0], cur[1]];
35
+ functions.push(null);
36
+ // lineTo
37
+ }
38
+ else if (parsed[i][0] === 'L') {
39
+ length += Math.sqrt((cur[0] - parsed[i][1]) ** 2 + (cur[1] - parsed[i][2]) ** 2);
40
+ functions.push((0, linear_1.makeLinearPosition)(cur[0], parsed[i][1], cur[1], parsed[i][2]));
41
+ cur = [parsed[i][1], parsed[i][2]];
42
+ }
43
+ else if (parsed[i][0] === 'l') {
44
+ length += Math.sqrt(parsed[i][1] ** 2 + parsed[i][2] ** 2);
45
+ functions.push((0, linear_1.makeLinearPosition)(cur[0], parsed[i][1] + cur[0], cur[1], parsed[i][2] + cur[1]));
46
+ cur = [parsed[i][1] + cur[0], parsed[i][2] + cur[1]];
47
+ }
48
+ else if (parsed[i][0] === 'H') {
49
+ length += Math.abs(cur[0] - parsed[i][1]);
50
+ functions.push((0, linear_1.makeLinearPosition)(cur[0], parsed[i][1], cur[1], cur[1]));
51
+ cur[0] = parsed[i][1];
52
+ }
53
+ else if (parsed[i][0] === 'h') {
54
+ length += Math.abs(parsed[i][1]);
55
+ functions.push((0, linear_1.makeLinearPosition)(cur[0], cur[0] + parsed[i][1], cur[1], cur[1]));
56
+ cur[0] = parsed[i][1] + cur[0];
57
+ }
58
+ else if (parsed[i][0] === 'V') {
59
+ length += Math.abs(cur[1] - parsed[i][1]);
60
+ functions.push((0, linear_1.makeLinearPosition)(cur[0], cur[0], cur[1], parsed[i][1]));
61
+ cur[1] = parsed[i][1];
62
+ }
63
+ else if (parsed[i][0] === 'v') {
64
+ length += Math.abs(parsed[i][1]);
65
+ functions.push((0, linear_1.makeLinearPosition)(cur[0], cur[0], cur[1], cur[1] + parsed[i][1]));
66
+ cur[1] = parsed[i][1] + cur[1];
67
+ // Close path
68
+ }
69
+ else if (parsed[i][0] === 'z' || parsed[i][0] === 'Z') {
70
+ length += Math.sqrt((ringStart[0] - cur[0]) ** 2 + (ringStart[1] - cur[1]) ** 2);
71
+ functions.push((0, linear_1.makeLinearPosition)(cur[0], ringStart[0], cur[1], ringStart[1]));
72
+ cur = [ringStart[0], ringStart[1]];
73
+ // Cubic Bezier curves
74
+ }
75
+ else if (parsed[i][0] === 'C') {
76
+ curve = (0, bezier_1.makeBezier)({
77
+ ax: cur[0],
78
+ ay: cur[1],
79
+ bx: parsed[i][1],
80
+ by: parsed[i][2],
81
+ cx: parsed[i][3],
82
+ cy: parsed[i][4],
83
+ dx: parsed[i][5],
84
+ dy: parsed[i][6],
85
+ });
86
+ length += curve.getTotalLength();
87
+ cur = [parsed[i][5], parsed[i][6]];
88
+ functions.push(curve);
89
+ }
90
+ else if (parsed[i][0] === 'c') {
91
+ curve = (0, bezier_1.makeBezier)({
92
+ ax: cur[0],
93
+ ay: cur[1],
94
+ bx: cur[0] + parsed[i][1],
95
+ by: cur[1] + parsed[i][2],
96
+ cx: cur[0] + parsed[i][3],
97
+ cy: cur[1] + parsed[i][4],
98
+ dx: cur[0] + parsed[i][5],
99
+ dy: cur[1] + parsed[i][6],
100
+ });
101
+ if (curve.getTotalLength() > 0) {
102
+ length += curve.getTotalLength();
103
+ functions.push(curve);
104
+ cur = [parsed[i][5] + cur[0], parsed[i][6] + cur[1]];
105
+ }
106
+ else {
107
+ functions.push((0, linear_1.makeLinearPosition)(cur[0], cur[0], cur[1], cur[1]));
108
+ }
109
+ }
110
+ else if (parsed[i][0] === 'S') {
111
+ if (i > 0 && ['C', 'c', 'S', 's'].indexOf(parsed[i - 1][0]) > -1) {
112
+ if (curve) {
113
+ const c = curve.getC();
114
+ curve = (0, bezier_1.makeBezier)({
115
+ ax: cur[0],
116
+ ay: cur[1],
117
+ bx: 2 * cur[0] - c.x,
118
+ by: 2 * cur[1] - c.y,
119
+ cx: parsed[i][1],
120
+ cy: parsed[i][2],
121
+ dx: parsed[i][3],
122
+ dy: parsed[i][4],
123
+ });
124
+ }
125
+ }
126
+ else {
127
+ curve = (0, bezier_1.makeBezier)({
128
+ ax: cur[0],
129
+ ay: cur[1],
130
+ bx: cur[0],
131
+ by: cur[1],
132
+ cx: parsed[i][1],
133
+ cy: parsed[i][2],
134
+ dx: parsed[i][3],
135
+ dy: parsed[i][4],
136
+ });
137
+ }
138
+ if (curve) {
139
+ length += curve.getTotalLength();
140
+ cur = [parsed[i][3], parsed[i][4]];
141
+ functions.push(curve);
142
+ }
143
+ }
144
+ else if (parsed[i][0] === 's') {
145
+ // 240 225
146
+ if (i > 0 && ['C', 'c', 'S', 's'].indexOf(parsed[i - 1][0]) > -1) {
147
+ if (curve) {
148
+ const c = curve.getC();
149
+ const d = curve.getD();
150
+ curve = (0, bezier_1.makeBezier)({
151
+ ax: cur[0],
152
+ ay: cur[1],
153
+ bx: cur[0] + d.x - c.x,
154
+ by: cur[1] + d.y - c.y,
155
+ cx: cur[0] + parsed[i][1],
156
+ cy: cur[1] + parsed[i][2],
157
+ dx: cur[0] + parsed[i][3],
158
+ dy: cur[1] + parsed[i][4],
159
+ });
160
+ }
161
+ }
162
+ else {
163
+ curve = (0, bezier_1.makeBezier)({
164
+ ax: cur[0],
165
+ ay: cur[1],
166
+ bx: cur[0],
167
+ by: cur[1],
168
+ cx: cur[0] + parsed[i][1],
169
+ cy: cur[1] + parsed[i][2],
170
+ dx: cur[0] + parsed[i][3],
171
+ dy: cur[1] + parsed[i][4],
172
+ });
173
+ }
174
+ if (curve) {
175
+ length += curve.getTotalLength();
176
+ cur = [parsed[i][3] + cur[0], parsed[i][4] + cur[1]];
177
+ functions.push(curve);
178
+ }
179
+ }
180
+ // Quadratic Bezier curves
181
+ else if (parsed[i][0] === 'Q') {
182
+ if (cur[0] === parsed[i][1] && cur[1] === parsed[i][2]) {
183
+ const linearCurve = (0, linear_1.makeLinearPosition)(parsed[i][1], parsed[i][3], parsed[i][2], parsed[i][4]);
184
+ length += linearCurve.getTotalLength();
185
+ functions.push(linearCurve);
186
+ }
187
+ else {
188
+ curve = (0, bezier_1.makeBezier)({
189
+ ax: cur[0],
190
+ ay: cur[1],
191
+ bx: parsed[i][1],
192
+ by: parsed[i][2],
193
+ cx: parsed[i][3],
194
+ cy: parsed[i][4],
195
+ dx: null,
196
+ dy: null,
197
+ });
198
+ length += curve.getTotalLength();
199
+ functions.push(curve);
200
+ }
201
+ cur = [parsed[i][3], parsed[i][4]];
202
+ prev_point = [parsed[i][1], parsed[i][2]];
203
+ }
204
+ else if (parsed[i][0] === 'q') {
205
+ if (parsed[i][1] === 0 && parsed[i][2] === 0) {
206
+ const linearCurve = (0, linear_1.makeLinearPosition)(cur[0] + parsed[i][1], cur[0] + parsed[i][3], cur[1] + parsed[i][2], cur[1] + parsed[i][4]);
207
+ length += linearCurve.getTotalLength();
208
+ functions.push(linearCurve);
209
+ }
210
+ else {
211
+ curve = (0, bezier_1.makeBezier)({
212
+ ax: cur[0],
213
+ ay: cur[1],
214
+ bx: cur[0] + parsed[i][1],
215
+ by: cur[1] + parsed[i][2],
216
+ cx: cur[0] + parsed[i][3],
217
+ cy: cur[1] + parsed[i][4],
218
+ dx: null,
219
+ dy: null,
220
+ });
221
+ length += curve.getTotalLength();
222
+ functions.push(curve);
223
+ }
224
+ prev_point = [cur[0] + parsed[i][1], cur[1] + parsed[i][2]];
225
+ cur = [parsed[i][3] + cur[0], parsed[i][4] + cur[1]];
226
+ }
227
+ else if (parsed[i][0] === 'T') {
228
+ if (i > 0 && ['Q', 'q', 'T', 't'].indexOf(parsed[i - 1][0]) > -1) {
229
+ curve = (0, bezier_1.makeBezier)({
230
+ ax: cur[0],
231
+ ay: cur[1],
232
+ bx: 2 * cur[0] - prev_point[0],
233
+ by: 2 * cur[1] - prev_point[1],
234
+ cx: parsed[i][1],
235
+ cy: parsed[i][2],
236
+ dx: null,
237
+ dy: null,
238
+ });
239
+ functions.push(curve);
240
+ length += curve.getTotalLength();
241
+ }
242
+ else {
243
+ const linearCurve = (0, linear_1.makeLinearPosition)(cur[0], parsed[i][1], cur[1], parsed[i][2]);
244
+ functions.push(linearCurve);
245
+ length += linearCurve.getTotalLength();
246
+ }
247
+ prev_point = [2 * cur[0] - prev_point[0], 2 * cur[1] - prev_point[1]];
248
+ cur = [parsed[i][1], parsed[i][2]];
249
+ }
250
+ else if (parsed[i][0] === 't') {
251
+ if (i > 0 && ['Q', 'q', 'T', 't'].indexOf(parsed[i - 1][0]) > -1) {
252
+ curve = (0, bezier_1.makeBezier)({
253
+ ax: cur[0],
254
+ ay: cur[1],
255
+ bx: 2 * cur[0] - prev_point[0],
256
+ by: 2 * cur[1] - prev_point[1],
257
+ cx: cur[0] + parsed[i][1],
258
+ cy: cur[1] + parsed[i][2],
259
+ dx: null,
260
+ dy: null,
261
+ });
262
+ length += curve.getTotalLength();
263
+ functions.push(curve);
264
+ }
265
+ else {
266
+ const linearCurve = (0, linear_1.makeLinearPosition)(cur[0], cur[0] + parsed[i][1], cur[1], cur[1] + parsed[i][2]);
267
+ length += linearCurve.getTotalLength();
268
+ functions.push(linearCurve);
269
+ }
270
+ prev_point = [2 * cur[0] - prev_point[0], 2 * cur[1] - prev_point[1]];
271
+ cur = [parsed[i][1] + cur[0], parsed[i][2] + cur[1]];
272
+ }
273
+ else if (parsed[i][0] === 'A') {
274
+ const arcCurve = (0, arc_1.makeArc)({
275
+ x0: cur[0],
276
+ y0: cur[1],
277
+ rx: parsed[i][1],
278
+ ry: parsed[i][2],
279
+ xAxisRotate: parsed[i][3],
280
+ LargeArcFlag: parsed[i][4] === 1,
281
+ SweepFlag: parsed[i][5] === 1,
282
+ x1: parsed[i][6],
283
+ y1: parsed[i][7],
284
+ });
285
+ length += arcCurve.getTotalLength();
286
+ cur = [parsed[i][6], parsed[i][7]];
287
+ functions.push(arcCurve);
288
+ }
289
+ else if (parsed[i][0] === 'a') {
290
+ const arcCurve = (0, arc_1.makeArc)({
291
+ x0: cur[0],
292
+ y0: cur[1],
293
+ rx: parsed[i][1],
294
+ ry: parsed[i][2],
295
+ xAxisRotate: parsed[i][3],
296
+ LargeArcFlag: parsed[i][4] === 1,
297
+ SweepFlag: parsed[i][5] === 1,
298
+ x1: cur[0] + parsed[i][6],
299
+ y1: cur[1] + parsed[i][7],
300
+ });
301
+ length += arcCurve.getTotalLength();
302
+ cur = [cur[0] + parsed[i][6], cur[1] + parsed[i][7]];
303
+ functions.push(arcCurve);
304
+ }
305
+ partial_lengths.push(length);
306
+ }
307
+ return { initial_point, length, partial_lengths, functions };
308
+ };
309
+ exports.construct = construct;
@@ -0,0 +1,4 @@
1
+ export declare const getPartAtLength: (p: string, fractionLength: number) => {
2
+ fraction: number;
3
+ i: number;
4
+ };
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getPartAtLength = void 0;
4
+ const construct_1 = require("./construct");
5
+ const getPartAtLength = (p, fractionLength) => {
6
+ const constructed = (0, construct_1.construct)(p);
7
+ if (fractionLength < 0) {
8
+ fractionLength = 0;
9
+ }
10
+ else if (fractionLength > constructed.length) {
11
+ fractionLength = constructed.length;
12
+ }
13
+ let i = constructed.partial_lengths.length - 1;
14
+ while (constructed.partial_lengths[i] >= fractionLength && i > 0) {
15
+ i--;
16
+ }
17
+ i++;
18
+ return { fraction: fractionLength - constructed.partial_lengths[i - 1], i };
19
+ };
20
+ exports.getPartAtLength = getPartAtLength;
@@ -0,0 +1,7 @@
1
+ import type { Point, PointProperties } from './types';
2
+ export declare const makeLinearPosition: (x0: number, x1: number, y0: number, y1: number) => {
3
+ getTotalLength: () => number;
4
+ getPointAtLength: (pos: number) => Point;
5
+ getTangentAtLength: () => Point;
6
+ getPropertiesAtLength: () => PointProperties;
7
+ };
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeLinearPosition = void 0;
4
+ const makeLinearPosition = (x0, x1, y0, y1) => {
5
+ const getTotalLength = () => {
6
+ return Math.sqrt((x0 - x1) ** 2 + (y0 - y1) ** 2);
7
+ };
8
+ const getPointAtLength = (pos) => {
9
+ let fraction = pos / Math.sqrt((x0 - x1) ** 2 + (y0 - y1) ** 2);
10
+ fraction = Number.isNaN(fraction) ? 1 : fraction;
11
+ const newDeltaX = (x1 - x0) * fraction;
12
+ const newDeltaY = (y1 - y0) * fraction;
13
+ return { x: x0 + newDeltaX, y: y0 + newDeltaY };
14
+ };
15
+ const getTangentAtLength = () => {
16
+ const module = Math.sqrt((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0));
17
+ return { x: (x1 - x0) / module, y: (y1 - y0) / module };
18
+ };
19
+ const getPropertiesAtLength = () => {
20
+ const tangent = getTangentAtLength();
21
+ return { tangentX: tangent.x, tangentY: tangent.y };
22
+ };
23
+ return {
24
+ getTotalLength,
25
+ getPointAtLength,
26
+ getTangentAtLength,
27
+ getPropertiesAtLength,
28
+ };
29
+ };
30
+ exports.makeLinearPosition = makeLinearPosition;
@@ -0,0 +1,2 @@
1
+ declare const _default: (path: string) => [string, ...number[]][];
2
+ export default _default;
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ // Copied from: https://github.com/rveciana/svg-path-properties
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const length = {
5
+ a: 7,
6
+ c: 6,
7
+ h: 1,
8
+ l: 2,
9
+ m: 2,
10
+ q: 4,
11
+ s: 4,
12
+ t: 2,
13
+ v: 1,
14
+ z: 0,
15
+ };
16
+ const segmentRegExp = /([astvzqmhlc])([^astvzqmhlc]*)/gi;
17
+ const numberRegExp = /-?[0-9]*\.?[0-9]+(?:e[-+]?\d+)?/gi;
18
+ exports.default = (path) => {
19
+ const segments = (path && path.length > 0 ? path : 'M0,0').match(segmentRegExp);
20
+ if (!segments) {
21
+ throw new Error(`No path elements found in string ${path}`);
22
+ }
23
+ return segments.reduce((segmentsArray, segmentString) => {
24
+ let command = segmentString.charAt(0);
25
+ let type = command.toLowerCase();
26
+ const args = parseValues(segmentString.substr(1));
27
+ // overloaded moveTo
28
+ if (type === 'm' && args.length > 2) {
29
+ segmentsArray.push([command, ...args.splice(0, 2)]);
30
+ type = 'l';
31
+ command = command === 'm' ? 'l' : 'L';
32
+ }
33
+ while (args.length >= 0) {
34
+ if (args.length === length[type]) {
35
+ segmentsArray.push([command, ...args.splice(0, length[type])]);
36
+ break;
37
+ }
38
+ if (args.length < length[type]) {
39
+ throw new Error(`Malformed path data: "${command}" must have ${length[type]} elements and has ${args.length}: ${segmentString}`);
40
+ }
41
+ segmentsArray.push([command, ...args.splice(0, length[type])]);
42
+ }
43
+ return segmentsArray;
44
+ }, []);
45
+ };
46
+ const parseValues = (args) => {
47
+ const numbers = args.match(numberRegExp);
48
+ return numbers ? numbers.map(Number) : [];
49
+ };
@@ -0,0 +1,47 @@
1
+ /**
2
+ * List of params for each command type in a path `d` attribute
3
+ */
4
+ export declare const typeMap: {
5
+ M: string[];
6
+ L: string[];
7
+ H: string[];
8
+ V: string[];
9
+ C: string[];
10
+ S: string[];
11
+ Q: string[];
12
+ T: string[];
13
+ A: string[];
14
+ Z: never[];
15
+ m: string[];
16
+ l: string[];
17
+ h: string[];
18
+ v: string[];
19
+ c: string[];
20
+ s: string[];
21
+ q: string[];
22
+ t: string[];
23
+ a: string[];
24
+ z: never[];
25
+ };
26
+ export declare type Command = {
27
+ x2?: number | undefined;
28
+ y2?: number | undefined;
29
+ x1?: number | undefined;
30
+ y1?: number | undefined;
31
+ x?: number;
32
+ y?: number;
33
+ xAxisRotate?: number;
34
+ largeArcFlag?: boolean;
35
+ sweepFlag?: boolean;
36
+ type: keyof typeof typeMap;
37
+ };
38
+ /**
39
+ * Convert command objects to arrays of points, run de Casteljau's algorithm on it
40
+ * to split into to the desired number of segments.
41
+ *
42
+ * @param {Object} commandStart The start command object
43
+ * @param {Object} commandEnd The end command object
44
+ * @param {Number} segmentCount The number of segments to create
45
+ * @return {Object[]} An array of commands representing the segments in sequence
46
+ */
47
+ export declare const splitCurve: (commandStart: Command, commandEnd: Command, segmentCount: number) => Command[];