@dnyantra/dtly 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/README.md +21 -8
  2. package/dist/agents.d.ts +1 -0
  3. package/dist/agents.js +9 -4
  4. package/dist/agents.js.map +1 -1
  5. package/dist/cli.js +35 -5
  6. package/dist/cli.js.map +1 -1
  7. package/dist/core/anim.js +20 -0
  8. package/dist/core/anim.js.map +1 -1
  9. package/dist/core/captions.d.ts +13 -0
  10. package/dist/core/captions.js +57 -0
  11. package/dist/core/captions.js.map +1 -0
  12. package/dist/core/geo.d.ts +13 -0
  13. package/dist/core/geo.js +41 -0
  14. package/dist/core/geo.js.map +1 -0
  15. package/dist/core/model.d.ts +112 -9
  16. package/dist/core/model.js.map +1 -1
  17. package/dist/core/path.d.ts +35 -0
  18. package/dist/core/path.js +324 -0
  19. package/dist/core/path.js.map +1 -0
  20. package/dist/core/svg.d.ts +22 -0
  21. package/dist/core/svg.js +217 -0
  22. package/dist/core/svg.js.map +1 -0
  23. package/dist/core/text.d.ts +3 -1
  24. package/dist/core/text.js +49 -3
  25. package/dist/core/text.js.map +1 -1
  26. package/dist/mcp/server.js +28 -1
  27. package/dist/mcp/server.js.map +1 -1
  28. package/dist/ops/ops.d.ts +7 -0
  29. package/dist/ops/ops.js +11 -1
  30. package/dist/ops/ops.js.map +1 -1
  31. package/dist/presets/app.d.ts +2 -0
  32. package/dist/presets/app.js +82 -0
  33. package/dist/presets/app.js.map +1 -0
  34. package/dist/presets/captions.d.ts +2 -0
  35. package/dist/presets/captions.js +48 -0
  36. package/dist/presets/captions.js.map +1 -0
  37. package/dist/presets/charts.d.ts +2 -0
  38. package/dist/presets/charts.js +162 -0
  39. package/dist/presets/charts.js.map +1 -0
  40. package/dist/presets/index.d.ts +1 -1
  41. package/dist/presets/index.js +62 -1
  42. package/dist/presets/index.js.map +1 -1
  43. package/dist/presets/maps.d.ts +2 -0
  44. package/dist/presets/maps.js +79 -0
  45. package/dist/presets/maps.js.map +1 -0
  46. package/dist/render/fx.d.ts +11 -0
  47. package/dist/render/fx.js +87 -0
  48. package/dist/render/fx.js.map +1 -0
  49. package/dist/render/grade.d.ts +20 -0
  50. package/dist/render/grade.js +178 -0
  51. package/dist/render/grade.js.map +1 -0
  52. package/dist/render/lottie.d.ts +36 -0
  53. package/dist/render/lottie.js +523 -0
  54. package/dist/render/lottie.js.map +1 -0
  55. package/dist/render/node-host.d.ts +1 -0
  56. package/dist/render/node-host.js +15 -4
  57. package/dist/render/node-host.js.map +1 -1
  58. package/dist/render/perspective.d.ts +5 -0
  59. package/dist/render/perspective.js +71 -0
  60. package/dist/render/perspective.js.map +1 -0
  61. package/dist/render/renderer.d.ts +6 -0
  62. package/dist/render/renderer.js +156 -95
  63. package/dist/render/renderer.js.map +1 -1
  64. package/dist/render/shapes.d.ts +6 -0
  65. package/dist/render/shapes.js +129 -0
  66. package/dist/render/shapes.js.map +1 -0
  67. package/dist/render/tiles.d.ts +11 -0
  68. package/dist/render/tiles.js +42 -0
  69. package/dist/render/tiles.js.map +1 -0
  70. package/dist/render/transcribe.d.ts +14 -0
  71. package/dist/render/transcribe.js +55 -0
  72. package/dist/render/transcribe.js.map +1 -0
  73. package/dist/studio/server.js +14 -1
  74. package/dist/studio/server.js.map +1 -1
  75. package/dist/studio-app/app.js +5 -4
  76. package/dist/studio-app/app.js.map +4 -4
  77. package/dist/version.d.ts +1 -1
  78. package/dist/version.js +1 -1
  79. package/package.json +1 -1
  80. package/plugin/skills/{dtly → moti}/SKILL.md +26 -6
@@ -0,0 +1,35 @@
1
+ import type { Vec2 } from './model.js';
2
+ export type Seg = {
3
+ kind: 'M';
4
+ p: Vec2;
5
+ } | {
6
+ kind: 'L';
7
+ p: Vec2;
8
+ } | {
9
+ kind: 'C';
10
+ c1: Vec2;
11
+ c2: Vec2;
12
+ p: Vec2;
13
+ } | {
14
+ kind: 'Z';
15
+ };
16
+ export type Path = Seg[];
17
+ export declare const parsePath: (d: string) => Path;
18
+ export declare const pathToString: (path: Path) => string;
19
+ export declare const transformPath: (path: Path, m: [number, number, number, number, number, number]) => Path;
20
+ export declare const tracePath: (ctx: CanvasRenderingContext2D, path: Path) => void;
21
+ export declare const flatten: (path: Path, tolerance?: number) => {
22
+ pts: Vec2[];
23
+ closed: boolean;
24
+ }[];
25
+ export declare const resample: (pts: Vec2[], closed: boolean, n: number) => Vec2[];
26
+ export declare const trimPolylines: (subs: {
27
+ pts: Vec2[];
28
+ closed: boolean;
29
+ }[], start: number, end: number, offset?: number) => Vec2[][];
30
+ export declare const morph: (a: Path, b: Path, p: number) => Path;
31
+ export declare const pathBounds: (path: Path) => [number, number, number, number] | null;
32
+ export declare const pointAt: (path: Path, f: number) => {
33
+ p: Vec2;
34
+ angle: number;
35
+ };
@@ -0,0 +1,324 @@
1
+ // Parses SVG path data into absolute M/L/C/Z segments (H, V, S, Q, T and A are converted).
2
+ export const parsePath = (d) => {
3
+ const out = [];
4
+ const tokens = d.match(/[a-df-z]|-?(?:\d+\.?\d*|\.\d+)(?:e[-+]?\d+)?/gi) ?? [];
5
+ let i = 0, cmd = '', cur = [0, 0], start = [0, 0], lastC = null, lastQ = null;
6
+ const num = () => Number(tokens[i++]);
7
+ const isNum = () => i < tokens.length && !/^[a-z]$/i.test(tokens[i]);
8
+ while (i < tokens.length) {
9
+ if (/^[a-z]$/i.test(tokens[i]))
10
+ cmd = tokens[i++];
11
+ else if (!cmd) {
12
+ i++;
13
+ continue;
14
+ }
15
+ const rel = cmd === cmd.toLowerCase();
16
+ const R = (p) => (rel ? [cur[0] + p[0], cur[1] + p[1]] : p);
17
+ const C = cmd.toUpperCase();
18
+ if (C === 'Z') {
19
+ out.push({ kind: 'Z' });
20
+ cur = start;
21
+ lastC = lastQ = null;
22
+ if (!isNum())
23
+ continue;
24
+ }
25
+ do {
26
+ if (C === 'M') {
27
+ cur = R([num(), num()]);
28
+ start = cur;
29
+ out.push({ kind: 'M', p: cur });
30
+ cmd = rel ? 'l' : 'L';
31
+ lastC = lastQ = null;
32
+ break;
33
+ }
34
+ if (C === 'L') {
35
+ cur = R([num(), num()]);
36
+ out.push({ kind: 'L', p: cur });
37
+ lastC = lastQ = null;
38
+ }
39
+ else if (C === 'H') {
40
+ const x = num();
41
+ cur = [rel ? cur[0] + x : x, cur[1]];
42
+ out.push({ kind: 'L', p: cur });
43
+ lastC = lastQ = null;
44
+ }
45
+ else if (C === 'V') {
46
+ const y = num();
47
+ cur = [cur[0], rel ? cur[1] + y : y];
48
+ out.push({ kind: 'L', p: cur });
49
+ lastC = lastQ = null;
50
+ }
51
+ else if (C === 'C') {
52
+ const c1 = R([num(), num()]), c2 = R([num(), num()]), p = R([num(), num()]);
53
+ out.push({ kind: 'C', c1, c2, p });
54
+ cur = p;
55
+ lastC = c2;
56
+ lastQ = null;
57
+ }
58
+ else if (C === 'S') {
59
+ const c1 = lastC ? [2 * cur[0] - lastC[0], 2 * cur[1] - lastC[1]] : cur;
60
+ const c2 = R([num(), num()]), p = R([num(), num()]);
61
+ out.push({ kind: 'C', c1, c2, p });
62
+ cur = p;
63
+ lastC = c2;
64
+ lastQ = null;
65
+ }
66
+ else if (C === 'Q' || C === 'T') {
67
+ const q = C === 'Q' ? R([num(), num()]) : lastQ ? [2 * cur[0] - lastQ[0], 2 * cur[1] - lastQ[1]] : cur;
68
+ const p = R([num(), num()]);
69
+ out.push({ kind: 'C', c1: [cur[0] + (2 / 3) * (q[0] - cur[0]), cur[1] + (2 / 3) * (q[1] - cur[1])], c2: [p[0] + (2 / 3) * (q[0] - p[0]), p[1] + (2 / 3) * (q[1] - p[1])], p });
70
+ cur = p;
71
+ lastQ = q;
72
+ lastC = null;
73
+ }
74
+ else if (C === 'A') {
75
+ const rx = num(), ry = num(), rot = num(), large = num(), sweep = num(), p = R([num(), num()]);
76
+ for (const s of arcToCubics(cur, p, rx, ry, rot, !!large, !!sweep))
77
+ out.push(s);
78
+ cur = p;
79
+ lastC = lastQ = null;
80
+ }
81
+ else {
82
+ i++;
83
+ break;
84
+ }
85
+ } while (isNum());
86
+ }
87
+ return out;
88
+ };
89
+ // SVG elliptical arc → cubic beziers (SVG spec F.6).
90
+ const arcToCubics = (p0, p1, rx, ry, deg, large, sweep) => {
91
+ if (!rx || !ry)
92
+ return [{ kind: 'L', p: p1 }];
93
+ rx = Math.abs(rx);
94
+ ry = Math.abs(ry);
95
+ const phi = (deg * Math.PI) / 180, cos = Math.cos(phi), sin = Math.sin(phi);
96
+ const dx = (p0[0] - p1[0]) / 2, dy = (p0[1] - p1[1]) / 2;
97
+ const x1 = cos * dx + sin * dy, y1 = -sin * dx + cos * dy;
98
+ const lam = (x1 * x1) / (rx * rx) + (y1 * y1) / (ry * ry);
99
+ if (lam > 1) {
100
+ rx *= Math.sqrt(lam);
101
+ ry *= Math.sqrt(lam);
102
+ }
103
+ const sign = large === sweep ? -1 : 1;
104
+ const num = rx * rx * ry * ry - rx * rx * y1 * y1 - ry * ry * x1 * x1;
105
+ const co = sign * Math.sqrt(Math.max(0, num / (rx * rx * y1 * y1 + ry * ry * x1 * x1)));
106
+ const cx1 = (co * rx * y1) / ry, cy1 = (-co * ry * x1) / rx;
107
+ const cx = cos * cx1 - sin * cy1 + (p0[0] + p1[0]) / 2, cy = sin * cx1 + cos * cy1 + (p0[1] + p1[1]) / 2;
108
+ const ang = (ux, uy, vx, vy) => { const a = Math.atan2(ux * vy - uy * vx, ux * vx + uy * vy); return a; };
109
+ let t1 = ang(1, 0, (x1 - cx1) / rx, (y1 - cy1) / ry);
110
+ let dt = ang((x1 - cx1) / rx, (y1 - cy1) / ry, (-x1 - cx1) / rx, (-y1 - cy1) / ry);
111
+ if (!sweep && dt > 0)
112
+ dt -= Math.PI * 2;
113
+ if (sweep && dt < 0)
114
+ dt += Math.PI * 2;
115
+ const n = Math.ceil(Math.abs(dt) / (Math.PI / 2));
116
+ const segs = [];
117
+ const step = dt / n, k = (4 / 3) * Math.tan(step / 4);
118
+ const pt = (a) => [cx + rx * Math.cos(a) * cos - ry * Math.sin(a) * sin, cy + rx * Math.cos(a) * sin + ry * Math.sin(a) * cos];
119
+ const der = (a) => [-rx * Math.sin(a) * cos - ry * Math.cos(a) * sin, -rx * Math.sin(a) * sin + ry * Math.cos(a) * cos];
120
+ for (let j = 0; j < n; j++) {
121
+ const a0 = t1, a1 = t1 + step;
122
+ const s = pt(a0), e = pt(a1), d0 = der(a0), d1 = der(a1);
123
+ segs.push({ kind: 'C', c1: [s[0] + k * d0[0], s[1] + k * d0[1]], c2: [e[0] - k * d1[0], e[1] - k * d1[1]], p: j === n - 1 ? p1 : e });
124
+ t1 = a1;
125
+ }
126
+ return segs;
127
+ };
128
+ export const pathToString = (path) => path.map((s) => {
129
+ const f = (v) => `${+v[0].toFixed(2)} ${+v[1].toFixed(2)}`;
130
+ if (s.kind === 'Z')
131
+ return 'Z';
132
+ if (s.kind === 'C')
133
+ return `C${f(s.c1)} ${f(s.c2)} ${f(s.p)}`;
134
+ return `${s.kind}${f(s.p)}`;
135
+ }).join(' ');
136
+ export const transformPath = (path, m) => {
137
+ const T = ([x, y]) => [m[0] * x + m[2] * y + m[4], m[1] * x + m[3] * y + m[5]];
138
+ return path.map((s) => (s.kind === 'Z' ? s : s.kind === 'C' ? { kind: 'C', c1: T(s.c1), c2: T(s.c2), p: T(s.p) } : { kind: s.kind, p: T(s.p) }));
139
+ };
140
+ export const tracePath = (ctx, path) => {
141
+ for (const s of path) {
142
+ if (s.kind === 'M')
143
+ ctx.moveTo(...s.p);
144
+ else if (s.kind === 'L')
145
+ ctx.lineTo(...s.p);
146
+ else if (s.kind === 'C')
147
+ ctx.bezierCurveTo(...s.c1, ...s.c2, ...s.p);
148
+ else
149
+ ctx.closePath();
150
+ }
151
+ };
152
+ const bez = (a, b, c, d, t) => {
153
+ const u = 1 - t;
154
+ return [u * u * u * a[0] + 3 * u * u * t * b[0] + 3 * u * t * t * c[0] + t * t * t * d[0], u * u * u * a[1] + 3 * u * u * t * b[1] + 3 * u * t * t * c[1] + t * t * t * d[1]];
155
+ };
156
+ // Subpaths flattened into polylines (curves sampled finely enough for trims and morphs).
157
+ export const flatten = (path, tolerance = 0.75) => {
158
+ const subs = [];
159
+ let cur = null;
160
+ let last = [0, 0], start = [0, 0];
161
+ for (const s of path) {
162
+ if (s.kind === 'M') {
163
+ cur = { pts: [s.p], closed: false };
164
+ subs.push(cur);
165
+ last = start = s.p;
166
+ continue;
167
+ }
168
+ if (!cur) {
169
+ cur = { pts: [last], closed: false };
170
+ subs.push(cur);
171
+ }
172
+ if (s.kind === 'L') {
173
+ cur.pts.push(s.p);
174
+ last = s.p;
175
+ }
176
+ else if (s.kind === 'C') {
177
+ const len = Math.hypot(s.c1[0] - last[0], s.c1[1] - last[1]) + Math.hypot(s.c2[0] - s.c1[0], s.c2[1] - s.c1[1]) + Math.hypot(s.p[0] - s.c2[0], s.p[1] - s.c2[1]);
178
+ const n = Math.max(4, Math.min(200, Math.ceil(Math.sqrt(len / tolerance) * 2)));
179
+ for (let k = 1; k <= n; k++)
180
+ cur.pts.push(bez(last, s.c1, s.c2, s.p, k / n));
181
+ last = s.p;
182
+ }
183
+ else {
184
+ cur.closed = true;
185
+ last = start;
186
+ cur = null;
187
+ }
188
+ }
189
+ return subs.filter((s) => s.pts.length > 1);
190
+ };
191
+ const polyLen = (pts, closed) => {
192
+ let l = 0;
193
+ const n = closed ? pts.length : pts.length - 1;
194
+ for (let i = 0; i < n; i++) {
195
+ const a = pts[i], b = pts[(i + 1) % pts.length];
196
+ l += Math.hypot(b[0] - a[0], b[1] - a[1]);
197
+ }
198
+ return l;
199
+ };
200
+ // Evenly spaced points along a polyline (used for morphing paths with different structures).
201
+ export const resample = (pts, closed, n) => {
202
+ const all = closed ? [...pts, pts[0]] : pts;
203
+ const lens = all.slice(1).map((p, i) => Math.hypot(p[0] - all[i][0], p[1] - all[i][1]));
204
+ const total = lens.reduce((a, b) => a + b, 0) || 1;
205
+ const out = [];
206
+ let seg = 0, acc = 0;
207
+ for (let k = 0; k < n; k++) {
208
+ const d = (closed ? k / n : k / (n - 1)) * total;
209
+ while (seg < lens.length - 1 && acc + lens[seg] < d) {
210
+ acc += lens[seg];
211
+ seg++;
212
+ }
213
+ const f = lens[seg] ? (d - acc) / lens[seg] : 0;
214
+ out.push([all[seg][0] + (all[seg + 1][0] - all[seg][0]) * f, all[seg][1] + (all[seg + 1][1] - all[seg][1]) * f]);
215
+ }
216
+ return out;
217
+ };
218
+ // Trim paths (AE "Trim Paths"): the part of the outline between start% and end%, across subpaths.
219
+ export const trimPolylines = (subs, start, end, offset = 0) => {
220
+ const total = subs.reduce((a, s) => a + polyLen(s.pts, s.closed), 0);
221
+ if (!total)
222
+ return [];
223
+ let a = Math.min(start, end) + offset, b = Math.max(start, end) + offset;
224
+ const ranges = [];
225
+ const shift = Math.floor(a);
226
+ a -= shift;
227
+ b -= shift;
228
+ if (b <= 1)
229
+ ranges.push([a, b]);
230
+ else {
231
+ ranges.push([a, 1]);
232
+ ranges.push([0, Math.min(1, b - 1)]);
233
+ }
234
+ const out = [];
235
+ for (const [ra, rb] of ranges) {
236
+ const from = ra * total, to = rb * total;
237
+ let acc = 0;
238
+ for (const s of subs) {
239
+ const all = s.closed ? [...s.pts, s.pts[0]] : s.pts;
240
+ let line = null;
241
+ for (let i = 0; i < all.length - 1; i++) {
242
+ const p = all[i], q = all[i + 1];
243
+ const l = Math.hypot(q[0] - p[0], q[1] - p[1]);
244
+ const s0 = acc, s1 = acc + l;
245
+ acc = s1;
246
+ if (s1 < from || s0 > to || !l) {
247
+ if (line && s0 > to)
248
+ break;
249
+ continue;
250
+ }
251
+ const at = (d) => { const f = (d - s0) / l; return [p[0] + (q[0] - p[0]) * f, p[1] + (q[1] - p[1]) * f]; };
252
+ if (!line) {
253
+ line = [at(Math.max(from, s0))];
254
+ out.push(line);
255
+ }
256
+ line.push(at(Math.min(to, s1)));
257
+ }
258
+ }
259
+ }
260
+ return out;
261
+ };
262
+ const area = (pts) => pts.reduce((a, p, i) => { const q = pts[(i + 1) % pts.length]; return a + p[0] * q[1] - q[0] * p[1]; }, 0) / 2;
263
+ // Shape morphing: both paths resampled to the same point count, rotated to the best start point, blended.
264
+ const MORPH_POINTS = 160;
265
+ export const morph = (a, b, p) => {
266
+ const sa = flatten(a), sb = flatten(b);
267
+ const n = Math.max(sa.length, sb.length);
268
+ const out = [];
269
+ for (let k = 0; k < n; k++) {
270
+ const A = sa[k] ?? sa[sa.length - 1], B = sb[k] ?? sb[sb.length - 1];
271
+ if (!A || !B)
272
+ continue;
273
+ const closed = A.closed || B.closed;
274
+ const pa = resample(A.pts, closed, MORPH_POINTS);
275
+ let pb = resample(B.pts, closed, MORPH_POINTS);
276
+ if (closed) {
277
+ // Same winding direction, then the rotation that pairs points with the least travel.
278
+ if (Math.sign(area(pa)) !== Math.sign(area(pb)))
279
+ pb = pb.reverse();
280
+ let best = 0, bestD = Infinity;
281
+ for (let r = 0; r < MORPH_POINTS; r++) {
282
+ let d = 0;
283
+ for (let i = 0; i < MORPH_POINTS; i += 4) {
284
+ const q = pb[(i + r) % MORPH_POINTS];
285
+ d += (pa[i][0] - q[0]) ** 2 + (pa[i][1] - q[1]) ** 2;
286
+ }
287
+ if (d < bestD) {
288
+ bestD = d;
289
+ best = r;
290
+ }
291
+ }
292
+ const rotated = pb;
293
+ pb = rotated.map((_, i) => rotated[(i + best) % MORPH_POINTS]);
294
+ }
295
+ pa.forEach((q, i) => out.push({ kind: i ? 'L' : 'M', p: [q[0] + (pb[i][0] - q[0]) * p, q[1] + (pb[i][1] - q[1]) * p] }));
296
+ if (closed)
297
+ out.push({ kind: 'Z' });
298
+ }
299
+ return out;
300
+ };
301
+ export const pathBounds = (path) => {
302
+ const pts = flatten(path).flatMap((s) => s.pts);
303
+ if (!pts.length)
304
+ return null;
305
+ const xs = pts.map((p) => p[0]), ys = pts.map((p) => p[1]);
306
+ const x = Math.min(...xs), y = Math.min(...ys);
307
+ return [x, y, Math.max(...xs) - x, Math.max(...ys) - y];
308
+ };
309
+ // Point and direction at a fraction of the path's length (motion along a path, map markers).
310
+ export const pointAt = (path, f) => {
311
+ const pts = flatten(path).flatMap((s) => s.pts);
312
+ if (pts.length < 2)
313
+ return { p: pts[0] ?? [0, 0], angle: 0 };
314
+ const lens = pts.slice(1).map((p, i) => Math.hypot(p[0] - pts[i][0], p[1] - pts[i][1]));
315
+ const total = lens.reduce((a, b) => a + b, 0);
316
+ let d = Math.max(0, Math.min(1, f)) * total, i = 0;
317
+ while (i < lens.length - 1 && d > lens[i]) {
318
+ d -= lens[i];
319
+ i++;
320
+ }
321
+ const a = pts[i], b = pts[i + 1], k = lens[i] ? d / lens[i] : 0;
322
+ return { p: [a[0] + (b[0] - a[0]) * k, a[1] + (b[1] - a[1]) * k], angle: (Math.atan2(b[1] - a[1], b[0] - a[0]) * 180) / Math.PI };
323
+ };
324
+ //# sourceMappingURL=path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.js","sourceRoot":"","sources":["../../src/core/path.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { NewLayer, Vec2 } from './model.js';
2
+ interface El {
3
+ tag: string;
4
+ attrs: Record<string, string>;
5
+ children: El[];
6
+ text: string;
7
+ }
8
+ export declare const parseXml: (src: string) => El;
9
+ export interface SvgImportOptions {
10
+ name?: string;
11
+ width?: number;
12
+ position?: Vec2;
13
+ color?: string;
14
+ inPoint?: number;
15
+ }
16
+ export interface SvgImportResult {
17
+ layers: NewLayer[];
18
+ size: Vec2;
19
+ parts: number;
20
+ }
21
+ export declare const importSvg: (svg: string, opts?: SvgImportOptions) => SvgImportResult;
22
+ export {};
@@ -0,0 +1,217 @@
1
+ import { parseColor, rgbaString } from './color.js';
2
+ import { flatten, parsePath, pathBounds, pathToString, transformPath } from './path.js';
3
+ const mul = (m, n) => [m[0] * n[0] + m[2] * n[1], m[1] * n[0] + m[3] * n[1], m[0] * n[2] + m[2] * n[3], m[1] * n[2] + m[3] * n[3], m[0] * n[4] + m[2] * n[5] + m[4], m[1] * n[4] + m[3] * n[5] + m[5]];
4
+ const I = [1, 0, 0, 1, 0, 0];
5
+ // A small, forgiving XML parser (SVGs from design tools and icon sets).
6
+ export const parseXml = (src) => {
7
+ const root = { tag: '#root', attrs: {}, children: [], text: '' };
8
+ const stack = [root];
9
+ const re = /<!--[\s\S]*?-->|<!\[CDATA\[([\s\S]*?)\]\]>|<\?[\s\S]*?\?>|<!DOCTYPE[\s\S]*?>|<\/([\w:-]+)\s*>|<([\w:-]+)((?:\s+[\w:.-]+\s*=\s*(?:"[^"]*"|'[^']*'))*)\s*(\/?)>|([^<]+)/g;
10
+ let m;
11
+ while ((m = re.exec(src))) {
12
+ const top = stack[stack.length - 1];
13
+ if (m[1] !== undefined)
14
+ top.text += m[1];
15
+ else if (m[2]) {
16
+ if (stack.length > 1)
17
+ stack.pop();
18
+ }
19
+ else if (m[3]) {
20
+ const attrs = {};
21
+ for (const a of m[4].matchAll(/([\w:.-]+)\s*=\s*(?:"([^"]*)"|'([^']*)')/g))
22
+ attrs[a[1]] = (a[2] ?? a[3]).replace(/&quot;/g, '"').replace(/&amp;/g, '&');
23
+ const el = { tag: m[3].replace(/^svg:/, ''), attrs, children: [], text: '' };
24
+ top.children.push(el);
25
+ if (!m[5])
26
+ stack.push(el);
27
+ }
28
+ else if (m[6])
29
+ top.text += m[6];
30
+ }
31
+ return root;
32
+ };
33
+ const parseTransform = (s) => {
34
+ if (!s)
35
+ return I;
36
+ let m = I;
37
+ for (const [, fn, args] of s.matchAll(/(\w+)\s*\(([^)]*)\)/g)) {
38
+ const a = args.split(/[\s,]+/).filter(Boolean).map(Number);
39
+ let n = I;
40
+ if (fn === 'matrix')
41
+ n = a;
42
+ else if (fn === 'translate')
43
+ n = [1, 0, 0, 1, a[0] ?? 0, a[1] ?? 0];
44
+ else if (fn === 'scale')
45
+ n = [a[0], 0, 0, a[1] ?? a[0], 0, 0];
46
+ else if (fn === 'rotate') {
47
+ const r = ((a[0] ?? 0) * Math.PI) / 180, c = Math.cos(r), s2 = Math.sin(r);
48
+ n = [c, s2, -s2, c, 0, 0];
49
+ if (a.length >= 3)
50
+ n = mul(mul([1, 0, 0, 1, a[1], a[2]], n), [1, 0, 0, 1, -a[1], -a[2]]);
51
+ }
52
+ else if (fn === 'skewX')
53
+ n = [1, 0, Math.tan(((a[0] ?? 0) * Math.PI) / 180), 1, 0, 0];
54
+ else if (fn === 'skewY')
55
+ n = [1, Math.tan(((a[0] ?? 0) * Math.PI) / 180), 0, 1, 0, 0];
56
+ m = mul(m, n);
57
+ }
58
+ return m;
59
+ };
60
+ const num = (v, d = 0) => (v === undefined || v === '' ? d : v.trim().endsWith('%') ? parseFloat(v) / 100 : parseFloat(v));
61
+ const elementPath = (el) => {
62
+ const a = el.attrs;
63
+ switch (el.tag) {
64
+ case 'path': return a.d ? parsePath(a.d) : null;
65
+ case 'rect': {
66
+ const x = num(a.x), y = num(a.y), w = num(a.width), h = num(a.height);
67
+ let rx = num(a.rx, NaN), ry = num(a.ry, NaN);
68
+ if (isNaN(rx))
69
+ rx = isNaN(ry) ? 0 : ry;
70
+ if (isNaN(ry))
71
+ ry = rx;
72
+ rx = Math.min(rx, w / 2);
73
+ ry = Math.min(ry, h / 2);
74
+ if (!rx)
75
+ return parsePath(`M${x} ${y}H${x + w}V${y + h}H${x}Z`);
76
+ return parsePath(`M${x + rx} ${y}H${x + w - rx}A${rx} ${ry} 0 0 1 ${x + w} ${y + ry}V${y + h - ry}A${rx} ${ry} 0 0 1 ${x + w - rx} ${y + h}H${x + rx}A${rx} ${ry} 0 0 1 ${x} ${y + h - ry}V${y + ry}A${rx} ${ry} 0 0 1 ${x + rx} ${y}Z`);
77
+ }
78
+ case 'circle':
79
+ case 'ellipse': {
80
+ const cx = num(a.cx), cy = num(a.cy), rx = el.tag === 'circle' ? num(a.r) : num(a.rx), ry = el.tag === 'circle' ? num(a.r) : num(a.ry);
81
+ return parsePath(`M${cx} ${cy - ry}A${rx} ${ry} 0 1 1 ${cx} ${cy + ry}A${rx} ${ry} 0 1 1 ${cx} ${cy - ry}Z`);
82
+ }
83
+ case 'line': return parsePath(`M${num(a.x1)} ${num(a.y1)}L${num(a.x2)} ${num(a.y2)}`);
84
+ case 'polyline':
85
+ case 'polygon': {
86
+ const n = (a.points ?? '').trim().split(/[\s,]+/).map(Number);
87
+ if (n.length < 4)
88
+ return null;
89
+ return parsePath(`M${n[0]} ${n[1]}${Array.from({ length: n.length / 2 - 1 }, (_, i) => `L${n[2 * i + 2]} ${n[2 * i + 3]}`).join('')}${el.tag === 'polygon' ? 'Z' : ''}`);
90
+ }
91
+ default: return null;
92
+ }
93
+ };
94
+ const PAINT_PROPS = ['fill', 'stroke', 'stroke-width', 'opacity', 'fill-opacity', 'stroke-opacity', 'fill-rule', 'stroke-linecap', 'stroke-linejoin', 'display', 'visibility'];
95
+ // Converts SVG text into layers: one null "group" layer plus one shape layer per drawable element.
96
+ export const importSvg = (svg, opts = {}) => {
97
+ const root = parseXml(svg).children.find((c) => c.tag === 'svg');
98
+ if (!root)
99
+ throw new Error('Not an SVG file');
100
+ const vb = (root.attrs.viewBox ?? '').split(/[\s,]+/).map(Number);
101
+ const vbW = vb.length === 4 ? vb[2] : num(root.attrs.width, 100), vbH = vb.length === 4 ? vb[3] : num(root.attrs.height, 100);
102
+ const vbX = vb.length === 4 ? vb[0] : 0, vbY = vb.length === 4 ? vb[1] : 0;
103
+ const targetW = opts.width ?? 600;
104
+ const k = targetW / vbW;
105
+ const size = [targetW, vbH * k];
106
+ // viewBox → layer space centred on the group's origin.
107
+ const base = [k, 0, 0, k, -vbX * k - size[0] / 2, -vbY * k - size[1] / 2];
108
+ // Class rules from <style> blocks (".a{fill:#f00}" / ".a,.b{...}").
109
+ const classes = {};
110
+ const gradients = {};
111
+ const walkDefs = (el) => {
112
+ if (el.tag === 'style')
113
+ for (const [, sel, body] of el.text.matchAll(/([^{}]+)\{([^}]*)\}/g)) {
114
+ const decl = Object.fromEntries(body.split(';').map((d) => d.split(':').map((x) => x.trim())).filter((d) => d.length === 2 && d[0]));
115
+ for (const s of sel.split(',')) {
116
+ const c = s.trim().match(/^\.([\w-]+)$/);
117
+ if (c)
118
+ classes[c[1]] = { ...classes[c[1]], ...decl };
119
+ }
120
+ }
121
+ if ((el.tag === 'linearGradient' || el.tag === 'radialGradient') && el.attrs.id)
122
+ gradients[el.attrs.id] = el;
123
+ el.children.forEach(walkDefs);
124
+ };
125
+ walkDefs(root);
126
+ const props = (el) => {
127
+ const out = {};
128
+ for (const c of (el.attrs.class ?? '').split(/\s+/))
129
+ Object.assign(out, classes[c] ?? {});
130
+ for (const p of PAINT_PROPS)
131
+ if (el.attrs[p] !== undefined)
132
+ out[p] = el.attrs[p];
133
+ for (const d of (el.attrs.style ?? '').split(';')) {
134
+ const [kk, v] = d.split(':').map((x) => x?.trim());
135
+ if (kk && v)
136
+ out[kk] = v;
137
+ }
138
+ return out;
139
+ };
140
+ const color = (v, opacity, m, bbox) => {
141
+ if (!v || v === 'none' || v === 'transparent')
142
+ return undefined;
143
+ if (v === 'currentColor')
144
+ v = opts.color ?? '#000000';
145
+ const ref = v.match(/url\(#([^)]+)\)/);
146
+ if (ref) {
147
+ const g = gradients[ref[1]];
148
+ const stops = (g?.children ?? []).filter((c) => c.tag === 'stop').map((st) => {
149
+ const sp = { ...Object.fromEntries((st.attrs.style ?? '').split(';').map((d) => d.split(':').map((x) => x.trim())).filter((d) => d.length === 2)), ...st.attrs };
150
+ const off = sp.offset?.endsWith('%') ? parseFloat(sp.offset) / 100 : num(sp.offset);
151
+ const c = parseColor(sp['stop-color'] ?? '#000') ?? [0, 0, 0, 1];
152
+ return [off, rgbaString([c[0], c[1], c[2], c[3] * num(sp['stop-opacity'], 1) * opacity])];
153
+ });
154
+ if (!g || !stops.length)
155
+ return undefined;
156
+ // Default gradientUnits is objectBoundingBox: 0..1 across the shape's own bounds.
157
+ const box = g.attrs.gradientUnits === 'userSpaceOnUse' ? null : bbox;
158
+ const U = (x, y) => (box ? [box[0] + x * box[2], box[1] + y * box[3]] : [x, y]);
159
+ const gt = parseTransform(g.attrs.gradientTransform);
160
+ const T = (x, y) => { const [ux, uy] = U(x, y); const gx = gt[0] * ux + gt[2] * uy + gt[4], gy = gt[1] * ux + gt[3] * uy + gt[5]; return [m[0] * gx + m[2] * gy + m[4], m[1] * gx + m[3] * gy + m[5]]; };
161
+ if (g.tag === 'linearGradient')
162
+ return { linear: { from: T(num(g.attrs.x1), num(g.attrs.y1)), to: T(num(g.attrs.x2, 1), num(g.attrs.y2)), stops } };
163
+ const r = num(g.attrs.r, 0.5) * (box ? Math.max(box[2], box[3]) : 1) * Math.hypot(m[0], m[1]) * Math.hypot(gt[0], gt[1]);
164
+ return { radial: { center: T(num(g.attrs.cx, 0.5), num(g.attrs.cy, 0.5)), radius: r, stops } };
165
+ }
166
+ const c = parseColor(v);
167
+ if (!c)
168
+ return v;
169
+ return opacity < 1 || c[3] < 1 ? rgbaString([c[0], c[1], c[2], c[3] * opacity]) : v;
170
+ };
171
+ const groupName = opts.name ?? 'svg';
172
+ const layers = [];
173
+ const shapes = [];
174
+ let index = 0;
175
+ const visit = (el, m, inherited) => {
176
+ if (['defs', 'style', 'title', 'desc', 'metadata', 'clipPath', 'mask', 'symbol', 'linearGradient', 'radialGradient', 'pattern', 'filter'].includes(el.tag))
177
+ return;
178
+ const p = props(el);
179
+ const st = {
180
+ fill: p.fill ?? inherited.fill, stroke: p.stroke ?? inherited.stroke,
181
+ strokeWidth: p['stroke-width'] !== undefined ? parseFloat(p['stroke-width']) : inherited.strokeWidth,
182
+ opacity: inherited.opacity * num(p.opacity, 1), fillOpacity: p['fill-opacity'] !== undefined ? num(p['fill-opacity'], 1) : inherited.fillOpacity,
183
+ strokeOpacity: p['stroke-opacity'] !== undefined ? num(p['stroke-opacity'], 1) : inherited.strokeOpacity,
184
+ fillRule: p['fill-rule'] ?? inherited.fillRule, lineCap: p['stroke-linecap'] ?? inherited.lineCap, lineJoin: p['stroke-linejoin'] ?? inherited.lineJoin,
185
+ display: p.display === 'none' || p.visibility === 'hidden' ? 'none' : inherited.display,
186
+ };
187
+ if (st.display === 'none')
188
+ return;
189
+ const mm = mul(m, parseTransform(el.attrs.transform));
190
+ const path = elementPath(el);
191
+ if (path && flatten(path).length) {
192
+ const baked = transformPath(path, mm);
193
+ const scale = Math.sqrt(Math.abs(mm[0] * mm[3] - mm[1] * mm[2]));
194
+ const bbox = pathBounds(path);
195
+ const fill = el.tag === 'line' || el.tag === 'polyline' ? undefined : color(st.fill, st.opacity * st.fillOpacity, mm, bbox);
196
+ const stroke = color(st.stroke, st.opacity * st.strokeOpacity, mm, bbox);
197
+ if (fill || stroke) {
198
+ shapes.push({
199
+ type: 'shape', name: el.attrs.id ?? `${groupName}-part-${++index}`, shape: 'path', path: pathToString(baked), parent: '__group__',
200
+ transform: { anchor: [0, 0], position: [0, 0] },
201
+ ...(fill ? { fill } : {}), ...(typeof stroke === 'string' ? { stroke, strokeWidth: +(st.strokeWidth * scale).toFixed(2) } : {}),
202
+ ...(st.fillRule === 'evenodd' ? { fillRule: 'evenodd' } : {}),
203
+ ...(st.lineCap ? { lineCap: st.lineCap } : {}), ...(st.lineJoin ? { lineJoin: st.lineJoin } : {}),
204
+ ...(opts.inPoint !== undefined ? { inPoint: opts.inPoint } : {}),
205
+ });
206
+ }
207
+ }
208
+ for (const c of el.children)
209
+ visit(c, mm, st);
210
+ };
211
+ visit(root, base, { fill: '#000000', stroke: 'none', strokeWidth: 1, opacity: 1, fillOpacity: 1, strokeOpacity: 1 });
212
+ layers.push({ type: 'null', name: groupName, transform: { position: opts.position ?? [540, 960] }, ...(opts.inPoint !== undefined ? { inPoint: opts.inPoint } : {}) });
213
+ // Topmost SVG element = top layer (index 0), as in the drawing order of the file.
214
+ layers.push(...shapes.reverse());
215
+ return { layers, size, parts: shapes.length };
216
+ };
217
+ //# sourceMappingURL=svg.js.map