@pixerate/editor 0.117.0 → 0.119.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 (74) hide show
  1. package/THIRD_PARTY_NOTICES.md +3 -0
  2. package/dist/animation-editor/index.cjs +54 -54
  3. package/dist/animation-editor/index.d.cts +3 -3
  4. package/dist/animation-editor/index.d.ts +3 -3
  5. package/dist/animation-editor/index.js +2 -2
  6. package/dist/{chunk-2J3LS7JZ.cjs → chunk-4S2AXNQF.cjs} +221 -186
  7. package/dist/chunk-4S2AXNQF.cjs.map +1 -0
  8. package/dist/{chunk-7LNZAWSJ.js → chunk-CSHEI3YT.js} +625 -451
  9. package/dist/chunk-CSHEI3YT.js.map +1 -0
  10. package/dist/{chunk-M7O4BJRH.cjs → chunk-KGNUFO4T.cjs} +36 -36
  11. package/dist/{chunk-M7O4BJRH.cjs.map → chunk-KGNUFO4T.cjs.map} +1 -1
  12. package/dist/{chunk-R2JE6SA7.js → chunk-KZLQY4CD.js} +42 -7
  13. package/dist/chunk-KZLQY4CD.js.map +1 -0
  14. package/dist/{chunk-L2T6EJ5S.cjs → chunk-L3PXFMOF.cjs} +38 -25
  15. package/dist/chunk-L3PXFMOF.cjs.map +1 -0
  16. package/dist/{chunk-FODKPD44.cjs → chunk-LI3KTY7K.cjs} +724 -550
  17. package/dist/chunk-LI3KTY7K.cjs.map +1 -0
  18. package/dist/{chunk-IVSNUXW7.js → chunk-T7IZDNSL.js} +37 -24
  19. package/dist/chunk-T7IZDNSL.js.map +1 -0
  20. package/dist/{chunk-T2P5TIZ6.js → chunk-TDQDMBUR.js} +2 -2
  21. package/dist/{chunk-BYAWOAST.cjs → chunk-TS5IEUW6.cjs} +26 -25
  22. package/dist/chunk-TS5IEUW6.cjs.map +1 -0
  23. package/dist/{chunk-VD2UDVF7.js → chunk-UMVW2Q66.js} +21 -5
  24. package/dist/chunk-UMVW2Q66.js.map +1 -0
  25. package/dist/{chunk-EBSYZRSW.cjs → chunk-WMRIG4XQ.cjs} +21 -5
  26. package/dist/chunk-WMRIG4XQ.cjs.map +1 -0
  27. package/dist/{chunk-JHXMNOMF.js → chunk-YHW26LS2.js} +14 -13
  28. package/dist/chunk-YHW26LS2.js.map +1 -0
  29. package/dist/{export-DMOuzgZZ.d.cts → export-B_jO2PrH.d.cts} +18 -4
  30. package/dist/{export-Dul1SbPv.d.ts → export-Ds8Ccw0K.d.ts} +18 -4
  31. package/dist/{flow-4-OC-UkQ.d.cts → flow-A2Dj-69w.d.cts} +21 -9
  32. package/dist/{flow-Cb7lkPm8.d.ts → flow-C95atNoQ.d.ts} +21 -9
  33. package/dist/image-editor/index.cjs +1104 -979
  34. package/dist/image-editor/index.cjs.map +1 -1
  35. package/dist/image-editor/index.d.cts +5 -5
  36. package/dist/image-editor/index.d.ts +5 -5
  37. package/dist/image-editor/index.js +157 -32
  38. package/dist/image-editor/index.js.map +1 -1
  39. package/dist/paint/index.cjs +5 -3
  40. package/dist/paint/index.cjs.map +1 -1
  41. package/dist/paint/index.d.cts +2 -2
  42. package/dist/paint/index.d.ts +2 -2
  43. package/dist/paint/index.js +4 -2
  44. package/dist/paint-editor/index.cjs +147 -147
  45. package/dist/paint-editor/index.d.cts +4 -4
  46. package/dist/paint-editor/index.d.ts +4 -4
  47. package/dist/paint-editor/index.js +4 -4
  48. package/dist/raster/index.cjs +2 -2
  49. package/dist/raster/index.js +1 -1
  50. package/dist/{svg-DlEuhwoX.d.ts → svg-CTxrB5xO.d.ts} +5 -1
  51. package/dist/{svg-CVdFc80-.d.cts → svg-hK0WQc7-.d.cts} +5 -1
  52. package/dist/{types-Tfly4Aya.d.cts → types-Dq-8qgoo.d.cts} +45 -3
  53. package/dist/{types-CDLGhAZp.d.ts → types-TrSSh_RB.d.ts} +45 -3
  54. package/dist/vector/index.cjs +1535 -1164
  55. package/dist/vector/index.cjs.map +1 -1
  56. package/dist/vector/index.d.cts +127 -9
  57. package/dist/vector/index.d.ts +127 -9
  58. package/dist/vector/index.js +386 -15
  59. package/dist/vector/index.js.map +1 -1
  60. package/package.json +1 -1
  61. package/skills/pixerate-image-editor/references/photoshop-files.md +9 -7
  62. package/skills/pixerate-vector/SKILL.md +13 -1
  63. package/skills/pixerate-vector/references/commands.md +1 -0
  64. package/dist/chunk-2J3LS7JZ.cjs.map +0 -1
  65. package/dist/chunk-7LNZAWSJ.js.map +0 -1
  66. package/dist/chunk-BYAWOAST.cjs.map +0 -1
  67. package/dist/chunk-EBSYZRSW.cjs.map +0 -1
  68. package/dist/chunk-FODKPD44.cjs.map +0 -1
  69. package/dist/chunk-IVSNUXW7.js.map +0 -1
  70. package/dist/chunk-JHXMNOMF.js.map +0 -1
  71. package/dist/chunk-L2T6EJ5S.cjs.map +0 -1
  72. package/dist/chunk-R2JE6SA7.js.map +0 -1
  73. package/dist/chunk-VD2UDVF7.js.map +0 -1
  74. /package/dist/{chunk-T2P5TIZ6.js.map → chunk-TDQDMBUR.js.map} +0 -0
@@ -75,6 +75,7 @@ var VECTOR_CONNECTOR_SIDES = ["auto", "top", "right", "bottom", "left", "center"
75
75
  var VECTOR_CONNECTOR_ROUTES = ["straight", "elbow", "curved"];
76
76
  var VECTOR_BLEND_SPACINGS = ["steps", "distance", "smoothColor"];
77
77
  var VECTOR_MASK_TYPES = ["clip", "alpha", "luminance"];
78
+ var VECTOR_SYMMETRY_MODES = ["vertical", "horizontal", "dual", "diagonal", "radial"];
78
79
  var VECTOR_TEXT_ALIGNS = ["left", "center", "right", "justify"];
79
80
  var VECTOR_PATH_TEXT_BASELINES = ["baseline", "ascender", "descender", "center"];
80
81
  var VECTOR_CONSTRAINT_KINDS = [
@@ -121,7 +122,7 @@ var VECTOR_TOOLS = [
121
122
  ];
122
123
  var VECTOR_TRANSFORM_HANDLES = ["nw", "n", "ne", "e", "se", "s", "sw", "w", "rotate"];
123
124
  var VECTOR_PATHFINDER_OPERATIONS = ["divide", "trim", "merge", "crop", "outline", "minusBack"];
124
- var VECTOR_EFFECT_TYPES = ["trim", "roundCorners", "puckerBloat", "twist", "zigzag", "wiggle", "offset", "merge", "repeater", "envelope"];
125
+ var VECTOR_EFFECT_TYPES = ["trim", "roundCorners", "puckerBloat", "twist", "zigzag", "wiggle", "offset", "merge", "repeater", "envelope", "contour"];
125
126
  var VECTOR_MERGE_MODES = ["merge", "add", "subtract", "intersect", "exclude"];
126
127
  var VECTOR_FILTER_TYPES = ["dropShadow", "innerShadow", "outerGlow", "innerGlow", "layerBlur", "feather"];
127
128
 
@@ -465,8 +466,8 @@ function vectorGradientParam(type, q, focal) {
465
466
  case "diamond":
466
467
  return Math.abs(q.x) + Math.abs(q.y);
467
468
  case "conic": {
468
- const turn = Math.atan2(q.y, q.x) / (2 * Math.PI);
469
- return turn - Math.floor(turn);
469
+ const turn2 = Math.atan2(q.y, q.x) / (2 * Math.PI);
470
+ return turn2 - Math.floor(turn2);
470
471
  }
471
472
  case "radial":
472
473
  return focal ? vectorGradientFocalParam(q, focal.f, focal.fr) : Math.hypot(q.x, q.y);
@@ -1451,12 +1452,12 @@ function squareTo(a, b) {
1451
1452
  return l > EPS ? mul2(w, 1 / l) : { x: 0, y: 0 };
1452
1453
  }
1453
1454
  function smoothCut(c, radius, smoothing) {
1454
- const turn = Math.PI - Math.acos(Math.max(-1, Math.min(1, c.cos)));
1455
+ const turn2 = Math.PI - Math.acos(Math.max(-1, Math.min(1, c.cos)));
1455
1456
  const t = cornerSetback(c, radius);
1456
1457
  const room = Math.min(c.lu, c.lv) / 2;
1457
1458
  let s = Math.max(0, Math.min(1, smoothing));
1458
1459
  if ((1 + s) * t > room) s = Math.max(0, Math.min(s, room / t - 1));
1459
- const beta = turn * s / 2;
1460
+ const beta = turn2 * s / 2;
1460
1461
  if (!(beta > 1e-6) || !(t > EPS)) return null;
1461
1462
  const p = Math.min((1 + s) * t, room);
1462
1463
  const qa = radius * Math.tan(beta / 2);
@@ -1471,7 +1472,7 @@ function smoothCut(c, radius, smoothing) {
1471
1472
  };
1472
1473
  const U = side(c.u, c.v);
1473
1474
  const V2 = side(c.v, c.u);
1474
- const sweep = turn * (1 - s);
1475
+ const sweep = turn2 * (1 - s);
1475
1476
  const h = radius * (4 / 3) * Math.tan(sweep / 4);
1476
1477
  const tanU = sub2(U.a, U.q);
1477
1478
  const tanV = sub2(V2.a, V2.q);
@@ -1510,9 +1511,9 @@ function cutCorner(c, radius, kind, smoothing = 0) {
1510
1511
  }
1511
1512
  const d1 = mul2(a.dir, -1);
1512
1513
  const d2 = mul2(b.dir, -1);
1513
- const turn = Math.acos(Math.max(-1, Math.min(1, -dot2(d1, d2))));
1514
+ const turn2 = Math.acos(Math.max(-1, Math.min(1, -dot2(d1, d2))));
1514
1515
  const chord = len(sub2(b.p, a.p));
1515
- const k = turn < 1e-9 ? chord / 3 : 4 / 3 * Math.tan(turn / 4) * chord / (2 * Math.sin(turn / 2));
1516
+ const k = turn2 < 1e-9 ? chord / 3 : 4 / 3 * Math.tan(turn2 / 4) * chord / (2 * Math.sin(turn2 / 2));
1516
1517
  if (!Number.isFinite(k)) return null;
1517
1518
  return { tu: a.t, tv: b.t, start: a.p, out: add2(a.p, mul2(d1, k)), in: add2(b.p, mul2(d2, k)), end: b.p };
1518
1519
  }
@@ -2649,6 +2650,380 @@ function withVectorTargetPaint(node, target, layer, paint) {
2649
2650
  return target === "fill" ? withVectorFills(node, next) : withVectorStrokes(node, next);
2650
2651
  }
2651
2652
 
2653
+ // src/vector/pathEffects.ts
2654
+ var EPS2 = 1e-9;
2655
+ var degenerate = (s) => s.every((p) => Math.abs(p[0] - s[0][0]) < EPS2 && Math.abs(p[1] - s[0][1]) < EPS2);
2656
+ function raise(seg) {
2657
+ if (seg.length !== 3) return seg.map((p) => [p[0], p[1]]);
2658
+ const [p0, p1, p2] = seg;
2659
+ return [p0, [p0[0] + 2 / 3 * (p1[0] - p0[0]), p0[1] + 2 / 3 * (p1[1] - p0[1])], [p2[0] + 2 / 3 * (p1[0] - p2[0]), p2[1] + 2 / 3 * (p1[1] - p2[1])], p2];
2660
+ }
2661
+ function subsOf(path) {
2662
+ return _chunkXGD3FSNCcjs.pathToContours.call(void 0, path).map((c) => ({ segs: _chunkXGD3FSNCcjs.closeContour.call(void 0, c).filter((s) => !degenerate(s)).map(raise), closed: c.closed })).filter((s) => s.segs.length > 0);
2663
+ }
2664
+ var subsToPath = (subs) => _chunkXGD3FSNCcjs.contoursToPath.call(void 0, subs.map((s) => ({ segments: s.segs, closed: s.closed })));
2665
+ var unit2 = (x, y) => {
2666
+ const l = Math.hypot(x, y);
2667
+ return l > 1e-12 && Number.isFinite(l) ? [x / l, y / l] : null;
2668
+ };
2669
+ function startTangent(s) {
2670
+ for (let i = 1; i < s.length; i++) {
2671
+ const u = unit2(s[i][0] - s[0][0], s[i][1] - s[0][1]);
2672
+ if (u) return u;
2673
+ }
2674
+ return [1, 0];
2675
+ }
2676
+ function endTangent(s) {
2677
+ const end = s[s.length - 1];
2678
+ for (let i = s.length - 2; i >= 0; i--) {
2679
+ const u = unit2(end[0] - s[i][0], end[1] - s[i][1]);
2680
+ if (u) return u;
2681
+ }
2682
+ return [1, 0];
2683
+ }
2684
+ function tangentAt(s, t) {
2685
+ if (t <= 1e-9) return startTangent(s);
2686
+ if (t >= 1 - 1e-9) return endTangent(s);
2687
+ const d = _chunkXGD3FSNCcjs.segmentDerivative.call(void 0, s, t);
2688
+ return _nullishCoalesce(unit2(d[0], d[1]), () => ( startTangent(s)));
2689
+ }
2690
+ var perp2 = (v2) => [-v2[1], v2[0]];
2691
+ function effectPathLength(path) {
2692
+ let total = 0;
2693
+ for (const s of subsOf(path)) for (const seg of s.segs) total += _chunkXGD3FSNCcjs.segmentLength.call(void 0, seg);
2694
+ return total;
2695
+ }
2696
+ function effectPathVertexCount(path) {
2697
+ return subsOf(path).reduce((n, s) => n + s.segs.length + (s.closed ? 0 : 1), 0);
2698
+ }
2699
+ var Measured = class {
2700
+
2701
+
2702
+
2703
+ constructor(path) {
2704
+ this.segs = subsOf(path).flatMap((s) => s.segs);
2705
+ this.lens = this.segs.map((s) => _chunkXGD3FSNCcjs.segmentLength.call(void 0, s));
2706
+ this.total = this.lens.reduce((a, b) => a + b, 0);
2707
+ }
2708
+ /**
2709
+ * Appends the part between lengths `sa` and `sb`, continuing the last piece when this one
2710
+ * starts where it ends (across the start of a closed path).
2711
+ */
2712
+ append(sa, sb, out) {
2713
+ for (const piece of _chunkXGD3FSNCcjs.trimSegments.call(void 0, this.segs, sa, sb, this.lens)) {
2714
+ if (degenerate(piece)) continue;
2715
+ const last = _optionalChain([out, 'access', _55 => _55[out.length - 1], 'optionalAccess', _56 => _56.segs]);
2716
+ const end = _optionalChain([last, 'optionalAccess', _57 => _57[last.length - 1], 'optionalAccess', _58 => _58.at, 'call', _59 => _59(-1)]);
2717
+ if (!end || Math.hypot(end[0] - piece[0][0], end[1] - piece[0][1]) > 1e-6) out.push({ segs: [piece], closed: false });
2718
+ else last.push(piece);
2719
+ }
2720
+ }
2721
+ };
2722
+ function trimIntervals(start, end, offsetDegrees) {
2723
+ let s = start / 100;
2724
+ let e = end / 100;
2725
+ if (!Number.isFinite(s) || !Number.isFinite(e)) return null;
2726
+ if (s > e) [s, e] = [e, s];
2727
+ s = Math.min(1, Math.max(0, s));
2728
+ e = Math.min(1, Math.max(0, e));
2729
+ if (e - s >= 1 - 1e-9) return null;
2730
+ if (e - s <= 1e-9) return [];
2731
+ const off = Number.isFinite(offsetDegrees) ? (offsetDegrees / 360 % 1 + 1) % 1 : 0;
2732
+ s += off;
2733
+ e += off;
2734
+ if (e <= 1) return [[s, e]];
2735
+ if (s >= 1) return [[s - 1, e - 1]];
2736
+ return [
2737
+ [s, 1],
2738
+ [0, e - 1]
2739
+ ];
2740
+ }
2741
+ function trimPaths(paths, start, end, offsetDegrees = 0) {
2742
+ const iv = trimIntervals(start, end, offsetDegrees);
2743
+ if (!iv) return paths.slice();
2744
+ return paths.map((p) => {
2745
+ const m = new Measured(p);
2746
+ const out = [];
2747
+ if (m.total > 0) for (const [a, b] of iv) m.append(a * m.total, b * m.total, out);
2748
+ return subsToPath(out);
2749
+ });
2750
+ }
2751
+ function trimPathsIndividually(paths, start, end, offsetDegrees = 0) {
2752
+ const iv = trimIntervals(start, end, offsetDegrees);
2753
+ if (!iv) return paths.slice();
2754
+ const ms = paths.map((p) => new Measured(p));
2755
+ const total = ms.reduce((n, m) => n + m.total, 0);
2756
+ let base = 0;
2757
+ return ms.map((m) => {
2758
+ const out = [];
2759
+ for (const [a, b] of iv) {
2760
+ const la = Math.max(0, a * total - base);
2761
+ const lb = Math.min(m.total, b * total - base);
2762
+ if (lb > la) m.append(la, lb, out);
2763
+ }
2764
+ base += m.total;
2765
+ return subsToPath(out);
2766
+ });
2767
+ }
2768
+ function puckerBloatPaths(paths, amount) {
2769
+ const a = amount / 100;
2770
+ if (!a || !Number.isFinite(a)) return paths.slice();
2771
+ return paths.map((p) => {
2772
+ const verts = p.filter((c) => c.type !== "Z");
2773
+ if (!verts.length) return p;
2774
+ const cx = verts.reduce((s, c) => s + c.x, 0) / verts.length;
2775
+ const cy = verts.reduce((s, c) => s + c.y, 0) / verts.length;
2776
+ const mv = (x, y) => ({ x: x + (cx - x) * a, y: y + (cy - y) * a });
2777
+ const mvh = (x, y) => ({ x: x + (x - cx) * a, y: y + (y - cy) * a });
2778
+ const out = [];
2779
+ let prev = { x: 0, y: 0 };
2780
+ let start = { x: 0, y: 0 };
2781
+ const curve = (c1, c2, q) => {
2782
+ const h1 = mvh(c1.x, c1.y);
2783
+ const h2 = mvh(c2.x, c2.y);
2784
+ const e = mv(q.x, q.y);
2785
+ out.push({ type: "C", x1: h1.x, y1: h1.y, x2: h2.x, y2: h2.y, x: e.x, y: e.y });
2786
+ };
2787
+ for (const c of p) {
2788
+ switch (c.type) {
2789
+ case "M": {
2790
+ const e = mv(c.x, c.y);
2791
+ out.push({ type: "M", x: e.x, y: e.y });
2792
+ prev = start = { x: c.x, y: c.y };
2793
+ break;
2794
+ }
2795
+ case "L":
2796
+ curve(prev, c, c);
2797
+ prev = { x: c.x, y: c.y };
2798
+ break;
2799
+ case "Q": {
2800
+ const c1 = { x: prev.x + 2 / 3 * (c.x1 - prev.x), y: prev.y + 2 / 3 * (c.y1 - prev.y) };
2801
+ const c2 = { x: c.x + 2 / 3 * (c.x1 - c.x), y: c.y + 2 / 3 * (c.y1 - c.y) };
2802
+ curve(c1, c2, c);
2803
+ prev = { x: c.x, y: c.y };
2804
+ break;
2805
+ }
2806
+ case "C":
2807
+ curve({ x: c.x1, y: c.y1 }, { x: c.x2, y: c.y2 }, c);
2808
+ prev = { x: c.x, y: c.y };
2809
+ break;
2810
+ case "Z":
2811
+ if (Math.hypot(prev.x - start.x, prev.y - start.y) > EPS2) curve(prev, start, start);
2812
+ out.push({ type: "Z" });
2813
+ prev = start;
2814
+ break;
2815
+ }
2816
+ }
2817
+ return out;
2818
+ });
2819
+ }
2820
+ function roundCornerPaths(paths, radius) {
2821
+ if (!(radius > 0) || !Number.isFinite(radius)) return paths.slice();
2822
+ return paths.map((p) => subpathsToBezier(bezierToSubpaths(p).map((sp) => setSubpathCorners(sp, radius))));
2823
+ }
2824
+ function offsetPaths(paths, amount, join = "miter", miterLimit = 4, copies = 1, copyOffset = 0) {
2825
+ const n = Math.min(1e3, Math.max(1, Math.round(Number.isFinite(copies) ? copies : 1)));
2826
+ return paths.map((p) => {
2827
+ const out = [];
2828
+ for (let i = 0; i < n; i++) out.push(..._chunkXGD3FSNCcjs.offsetPath.call(void 0, p, amount * (i + 1 + copyOffset), { join, miterLimit }));
2829
+ return out;
2830
+ });
2831
+ }
2832
+ function twistPaths(paths, angle, center) {
2833
+ let rmax = 0;
2834
+ for (const p of paths) for (const c of p) if (c.type !== "Z") rmax = Math.max(rmax, Math.hypot(c.x - center.x, c.y - center.y));
2835
+ const a = angle * Math.PI / 180;
2836
+ if (!a || rmax <= 1e-9 || !Number.isFinite(a)) return paths.slice();
2837
+ const k = a / rmax;
2838
+ const rot = (v2, th) => {
2839
+ const s = Math.sin(th);
2840
+ const co = Math.cos(th);
2841
+ return [v2[0] * co - v2[1] * s, v2[0] * s + v2[1] * co];
2842
+ };
2843
+ const map = (p) => {
2844
+ const v2 = [p[0] - center.x, p[1] - center.y];
2845
+ const r = rot(v2, k * Math.hypot(v2[0], v2[1]));
2846
+ return [center.x + r[0], center.y + r[1]];
2847
+ };
2848
+ const jac = (p, dv) => {
2849
+ const v2 = [p[0] - center.x, p[1] - center.y];
2850
+ const r = Math.hypot(v2[0], v2[1]);
2851
+ let w = dv;
2852
+ if (r > 1e-12) {
2853
+ const f = k * (v2[0] * dv[0] + v2[1] * dv[1]) / r;
2854
+ w = [dv[0] - v2[1] * f, dv[1] + v2[0] * f];
2855
+ }
2856
+ return rot(w, k * r);
2857
+ };
2858
+ return paths.map((p) => {
2859
+ const out = [];
2860
+ for (const sub5 of subsOf(p)) {
2861
+ const segs = [];
2862
+ for (const seg of sub5.segs) {
2863
+ const cubic = seg.length === 2 ? [seg[0], seg[0], seg[1], seg[1]] : seg;
2864
+ const len2 = _chunkXGD3FSNCcjs.segmentLength.call(void 0, seg);
2865
+ const m = Math.min(64, Math.max(1, Math.ceil(Math.abs(a) * len2 / rmax / 0.15 + len2 / 50)));
2866
+ for (let i = 0; i < m; i++) {
2867
+ const q = _chunkXGD3FSNCcjs.subSegment.call(void 0, cubic, i / m, (i + 1) / m);
2868
+ const p0 = map(q[0]);
2869
+ const p3 = map(q[3]);
2870
+ const h1 = jac(q[0], [q[1][0] - q[0][0], q[1][1] - q[0][1]]);
2871
+ const h2 = jac(q[3], [q[2][0] - q[3][0], q[2][1] - q[3][1]]);
2872
+ segs.push([p0, [p0[0] + h1[0], p0[1] + h1[1]], [p3[0] + h2[0], p3[1] + h2[1]], p3]);
2873
+ }
2874
+ }
2875
+ out.push({ segs, closed: sub5.closed });
2876
+ }
2877
+ return subsToPath(out);
2878
+ });
2879
+ }
2880
+ function resample(sub5, m) {
2881
+ const segs = sub5.segs;
2882
+ const n = segs.length;
2883
+ const lens = segs.map((s) => _chunkXGD3FSNCcjs.segmentLength.call(void 0, s));
2884
+ const out = [];
2885
+ for (let j = 0; j < n; j++) {
2886
+ const piece = lens[j] / m;
2887
+ for (let k = 0; k < m; k++) {
2888
+ if (k === 0) {
2889
+ const tout = startTangent(segs[j]);
2890
+ const prev = sub5.closed || j > 0 ? (j + n - 1) % n : null;
2891
+ let tan = tout;
2892
+ if (prev !== null) {
2893
+ const tin = endTangent(segs[prev]);
2894
+ tan = _nullishCoalesce(unit2(tin[0] + tout[0], tin[1] + tout[1]), () => ( tout));
2895
+ }
2896
+ out.push({ p: segs[j][0], tan, lenPrev: prev === null ? 0 : lens[prev] / m, lenNext: piece });
2897
+ } else {
2898
+ const t = _chunkXGD3FSNCcjs.segmentParamAtLength.call(void 0, segs[j], piece * k, lens[j]);
2899
+ out.push({ p: _chunkXGD3FSNCcjs.segmentPoint.call(void 0, segs[j], t), tan: tangentAt(segs[j], t), lenPrev: piece, lenNext: piece });
2900
+ }
2901
+ }
2902
+ }
2903
+ if (!sub5.closed) {
2904
+ const last = segs[n - 1];
2905
+ out.push({ p: last[last.length - 1], tan: endTangent(last), lenPrev: lens[n - 1] / m, lenNext: 0 });
2906
+ }
2907
+ return out;
2908
+ }
2909
+ function emit(samples, disp, closed, smooth, handle) {
2910
+ const n = samples.length;
2911
+ if (!n) return null;
2912
+ const pt2 = (i) => [samples[i].p[0] + disp[i][0], samples[i].p[1] + disp[i][1]];
2913
+ const segs = [];
2914
+ const count = closed ? n : n - 1;
2915
+ for (let i = 0; i < count; i++) {
2916
+ const j = (i + 1) % n;
2917
+ const a = samples[i];
2918
+ const b = samples[j];
2919
+ const p = pt2(i);
2920
+ const q = pt2(j);
2921
+ if (smooth) segs.push([p, [p[0] + a.tan[0] * a.lenNext * handle, p[1] + a.tan[1] * a.lenNext * handle], [q[0] - b.tan[0] * b.lenPrev * handle, q[1] - b.tan[1] * b.lenPrev * handle], q]);
2922
+ else segs.push([p, q]);
2923
+ }
2924
+ if (!segs.length) return null;
2925
+ return { segs, closed };
2926
+ }
2927
+ function zigzagPaths(paths, size, ridges, smooth = false) {
2928
+ const m = Math.min(1e3, Math.max(0, Math.round(Number.isFinite(ridges) ? ridges : 0))) + 1;
2929
+ return paths.map((p) => {
2930
+ const out = [];
2931
+ for (const sub5 of subsOf(p)) {
2932
+ const s = resample(sub5, m);
2933
+ const disp = s.map((x, i) => {
2934
+ const n = perp2(x.tan);
2935
+ const d = i % 2 === 0 ? size : -size;
2936
+ return [n[0] * d, n[1] * d];
2937
+ });
2938
+ const e = emit(s, disp, sub5.closed, smooth, 0.36);
2939
+ if (e) out.push(e);
2940
+ }
2941
+ return subsToPath(out);
2942
+ });
2943
+ }
2944
+ var MASK64 = (1n << 64n) - 1n;
2945
+ function splitmix(x) {
2946
+ x = x + 0x9e3779b97f4a7c15n & MASK64;
2947
+ let z = x;
2948
+ z = (z ^ z >> 30n) * 0xbf58476d1ce4e5b9n & MASK64;
2949
+ z = (z ^ z >> 27n) * 0x94d049bb133111ebn & MASK64;
2950
+ return z ^ z >> 31n;
2951
+ }
2952
+ function hash(seed, idx, t) {
2953
+ const h = splitmix(splitmix(splitmix(seed) ^ idx) ^ BigInt.asUintN(64, BigInt(t)));
2954
+ return Number(h >> 11n) / 2 ** 53 * 2 - 1;
2955
+ }
2956
+ function noise(seed, idx, t) {
2957
+ const i = Math.floor(t);
2958
+ const f = t - i;
2959
+ const p0 = hash(seed, idx, i - 1);
2960
+ const p1 = hash(seed, idx, i);
2961
+ const p2 = hash(seed, idx, i + 1);
2962
+ const p3 = hash(seed, idx, i + 2);
2963
+ const v2 = 0.5 * (2 * p1 + (-p0 + p2) * f + (2 * p0 - 5 * p1 + 4 * p2 - p3) * f * f + (-p0 + 3 * p1 - 3 * p2 + p3) * f * f * f);
2964
+ return Math.min(1, Math.max(-1, v2));
2965
+ }
2966
+ function wigglePaths(paths, w) {
2967
+ if (!w.size || !Number.isFinite(w.size)) return paths.slice();
2968
+ const m = Math.min(1e3, Math.max(0, Math.round(Number.isFinite(w.detail) ? w.detail : 0))) + 1;
2969
+ const seed = BigInt.asUintN(64, BigInt(Math.round(Number.isFinite(w.seed) ? w.seed : 0)));
2970
+ const t = (Number.isFinite(w.time) ? w.time : 0) * (Number.isFinite(w.speed) ? w.speed : 0) + (Number.isFinite(w.phase) ? w.phase : 0) / 360;
2971
+ const corr = Math.min(1, Math.max(0, (Number.isFinite(w.correlation) ? w.correlation : 0) / 100));
2972
+ const sx = noise(seed, MASK64, t);
2973
+ const sy = noise(seed, MASK64 - 1n, t);
2974
+ let idx = 0;
2975
+ return paths.map((p) => {
2976
+ const out = [];
2977
+ for (const sub5 of subsOf(p)) {
2978
+ const s = resample(sub5, m);
2979
+ const disp = s.map(() => {
2980
+ const i = BigInt(idx);
2981
+ const ox = noise(seed, i * 2n, t + idx * 0.37);
2982
+ const oy = noise(seed, i * 2n + 1n, t + idx * 0.61);
2983
+ idx++;
2984
+ return [(sx * corr + ox * (1 - corr)) * w.size, (sy * corr + oy * (1 - corr)) * w.size];
2985
+ });
2986
+ const e = emit(s, disp, sub5.closed, w.smooth, 1 / 3);
2987
+ if (e) out.push(e);
2988
+ }
2989
+ return subsToPath(out);
2990
+ });
2991
+ }
2992
+ var MERGE_OPS = { add: "union", subtract: "difference", intersect: "intersection", exclude: "xor" };
2993
+ function mergePaths(paths, mode = "merge") {
2994
+ if (mode === "merge" || !(mode in MERGE_OPS)) return paths.flat();
2995
+ const inputs = paths.filter((p) => p.length > 0).map((path) => ({ path, fillRule: "nonzero" }));
2996
+ if (!inputs.length) return [];
2997
+ return _chunkXGD3FSNCcjs.pathBoolean.call(void 0, MERGE_OPS[mode], inputs).path;
2998
+ }
2999
+ function vectorRepeaterCopies(r, pivot) {
3000
+ const copies = Math.max(0, Number.isFinite(r.copies) ? Math.min(r.copies, 1e3) : 0);
3001
+ const n = Math.ceil(copies);
3002
+ const offset = Number.isFinite(r.offset) ? r.offset : 0;
3003
+ const so = (_nullishCoalesce(r.startOpacity, () => ( 100))) / 100;
3004
+ const eo = (_nullishCoalesce(r.endOpacity, () => ( 100))) / 100;
3005
+ const fract = copies - Math.floor(copies);
3006
+ const out = [];
3007
+ for (let i = 0; i < n; i++) {
3008
+ const k = i + offset;
3009
+ let m = translateMatrix(-pivot.x, -pivot.y);
3010
+ m = multiplyMatrices(m, scaleMatrix(Math.pow((_nullishCoalesce(_optionalChain([r, 'access', _60 => _60.scale, 'optionalAccess', _61 => _61.x]), () => ( 100))) / 100, k), Math.pow((_nullishCoalesce(_optionalChain([r, 'access', _62 => _62.scale, 'optionalAccess', _63 => _63.y]), () => ( 100))) / 100, k)));
3011
+ m = multiplyMatrices(m, rotateMatrix((_nullishCoalesce(r.rotation, () => ( 0))) * k));
3012
+ m = multiplyMatrices(m, translateMatrix(pivot.x + (_nullishCoalesce(_optionalChain([r, 'access', _64 => _64.position, 'optionalAccess', _65 => _65.x]), () => ( 0))) * k, pivot.y + (_nullishCoalesce(_optionalChain([r, 'access', _66 => _66.position, 'optionalAccess', _67 => _67.y]), () => ( 0))) * k));
3013
+ const t = n > 1 ? i / (n - 1) : 0;
3014
+ const partial = i + 1 === n && fract > 0 ? fract : 1;
3015
+ out.push({ index: i, matrix: m, opacity: Math.min(1, Math.max(0, (so + (eo - so) * t) * partial)) });
3016
+ }
3017
+ return out;
3018
+ }
3019
+ function repeatPaths(paths, r, pivot) {
3020
+ return vectorRepeaterCopies(r, pivot).map((copy) => ({ copy, paths: paths.map((p) => _chunkXGD3FSNCcjs.transformBezierPath.call(void 0, p, copy.matrix)) }));
3021
+ }
3022
+ function pathsCenter(paths) {
3023
+ const b = _chunkXGD3FSNCcjs.bezierPathBounds.call(void 0, paths.flat());
3024
+ return b ? { x: (b.minX + b.maxX) / 2, y: (b.minY + b.maxY) / 2 } : { x: 0, y: 0 };
3025
+ }
3026
+
2652
3027
  // src/vector/pathMap.ts
2653
3028
  var MAX_PIECES = 1 << 20;
2654
3029
  var MAX_DEPTH = 6;
@@ -2798,7 +3173,7 @@ function mapBezierPath(path, f, tolerance = 0.1, options = {}) {
2798
3173
 
2799
3174
  // src/vector/frames.ts
2800
3175
  function isVectorFrame(node) {
2801
- return _optionalChain([node, 'optionalAccess', _55 => _55.type]) === "group" && !!node.frame && !node.blend && !node.liveBoolean && !node.mask;
3176
+ return _optionalChain([node, 'optionalAccess', _68 => _68.type]) === "group" && !!node.frame && !node.blend && !node.liveBoolean && !node.mask;
2802
3177
  }
2803
3178
  function vectorFrameRectPath(frame) {
2804
3179
  const { x, y, width: w, height: h } = frame;
@@ -2842,8 +3217,8 @@ function placeSpan(rule, a0, a1, f0, f1, g0, g1) {
2842
3217
  }
2843
3218
  }
2844
3219
  function vectorFrameChildMatrix(resizing, box, from, to) {
2845
- const [x0, x1] = placeSpan(_nullishCoalesce(H[_nullishCoalesce(_optionalChain([resizing, 'optionalAccess', _56 => _56.horizontal]), () => ( "left"))], () => ( "start")), box.x, box.x + box.width, from.x, from.x + from.width, to.x, to.x + to.width);
2846
- const [y0, y1] = placeSpan(_nullishCoalesce(V[_nullishCoalesce(_optionalChain([resizing, 'optionalAccess', _57 => _57.vertical]), () => ( "top"))], () => ( "start")), box.y, box.y + box.height, from.y, from.y + from.height, to.y, to.y + to.height);
3220
+ const [x0, x1] = placeSpan(_nullishCoalesce(H[_nullishCoalesce(_optionalChain([resizing, 'optionalAccess', _69 => _69.horizontal]), () => ( "left"))], () => ( "start")), box.x, box.x + box.width, from.x, from.x + from.width, to.x, to.x + to.width);
3221
+ const [y0, y1] = placeSpan(_nullishCoalesce(V[_nullishCoalesce(_optionalChain([resizing, 'optionalAccess', _70 => _70.vertical]), () => ( "top"))], () => ( "start")), box.y, box.y + box.height, from.y, from.y + from.height, to.y, to.y + to.height);
2847
3222
  const sx = box.width > 1e-9 ? (x1 - x0) / box.width : 1;
2848
3223
  const sy = box.height > 1e-9 ? (y1 - y0) / box.height : 1;
2849
3224
  return [sx, 0, 0, sy, x0 - sx * box.x, y0 - sy * box.y];
@@ -2897,7 +3272,7 @@ function vectorFrameDocument(doc, id, find) {
2897
3272
  height,
2898
3273
  ...doc.background ? { background: doc.background } : {},
2899
3274
  nodes: [placed],
2900
- ..._optionalChain([doc, 'access', _58 => _58.symbols, 'optionalAccess', _59 => _59.length]) ? { symbols: doc.symbols } : {}
3275
+ ..._optionalChain([doc, 'access', _71 => _71.symbols, 'optionalAccess', _72 => _72.length]) ? { symbols: doc.symbols } : {}
2901
3276
  };
2902
3277
  }
2903
3278
  function getVectorFramePanel(state) {
@@ -2917,7 +3292,7 @@ function getVectorFramePanel(state) {
2917
3292
  const one = (values) => values.every((v2) => v2 === values[0]) ? values[0] : "mixed";
2918
3293
  return {
2919
3294
  frame: f ? { id: f.id, name: _nullishCoalesce(f.name, () => ( "Frame")), artboard: parents.get(f.id) === null, frame: f.frame } : null,
2920
- resizing: children.length ? { ids: children.map((c) => c.id), horizontal: one(children.map((c) => _nullishCoalesce(_optionalChain([c, 'access', _60 => _60.resizing, 'optionalAccess', _61 => _61.horizontal]), () => ( "left")))), vertical: one(children.map((c) => _nullishCoalesce(_optionalChain([c, 'access', _62 => _62.resizing, 'optionalAccess', _63 => _63.vertical]), () => ( "top")))) } : null
3295
+ resizing: children.length ? { ids: children.map((c) => c.id), horizontal: one(children.map((c) => _nullishCoalesce(_optionalChain([c, 'access', _73 => _73.resizing, 'optionalAccess', _74 => _74.horizontal]), () => ( "left")))), vertical: one(children.map((c) => _nullishCoalesce(_optionalChain([c, 'access', _75 => _75.resizing, 'optionalAccess', _76 => _76.vertical]), () => ( "top")))) } : null
2921
3296
  };
2922
3297
  }
2923
3298
 
@@ -3025,14 +3400,14 @@ function lineHits(p, q, seg) {
3025
3400
  return out;
3026
3401
  }
3027
3402
  var near = (a, b, eps) => Math.abs(a[0] - b[0]) <= eps && Math.abs(a[1] - b[1]) <= eps;
3028
- var degenerate = (seg, eps) => seg.every((p) => near(p, seg[0], eps));
3403
+ var degenerate2 = (seg, eps) => seg.every((p) => near(p, seg[0], eps));
3029
3404
  function arc(l, a, b, eps) {
3030
3405
  const n = l.segs.length;
3031
3406
  const segs = [];
3032
3407
  const chord = [];
3033
3408
  const push = (k, t0, t1) => {
3034
3409
  const piece = t0 <= 0 && t1 >= 1 ? l.segs[k].slice() : _chunkXGD3FSNCcjs.subSegment.call(void 0, l.segs[k], t0, t1);
3035
- if (!degenerate(piece, eps)) {
3410
+ if (!degenerate2(piece, eps)) {
3036
3411
  segs.push(piece);
3037
3412
  chord.push(l.chord[k]);
3038
3413
  }
@@ -3303,7 +3678,7 @@ function normalizeVectorFilterParams(type, params, base) {
3303
3678
  if (!isVectorFilterType(type)) return null;
3304
3679
  const out = { ...VECTOR_FILTER_DEFAULTS[type], ..._nullishCoalesce(base, () => ( {})) };
3305
3680
  for (const spec of VECTOR_FILTER_PARAM_SPECS[type]) {
3306
- const v2 = _optionalChain([params, 'optionalAccess', _64 => _64[spec.key]]);
3681
+ const v2 = _optionalChain([params, 'optionalAccess', _77 => _77[spec.key]]);
3307
3682
  if (v2 === void 0) continue;
3308
3683
  if (spec.kind === "number" && typeof v2 === "number" && Number.isFinite(v2)) out[spec.key] = Math.min(_nullishCoalesce(spec.max, () => ( Infinity)), Math.max(_nullishCoalesce(spec.min, () => ( -Infinity)), v2));
3309
3684
  else if (spec.kind === "color" && typeof v2 === "string" && v2.trim()) out[spec.key] = v2.trim();
@@ -3435,7 +3810,7 @@ function vectorFilterSvg(filters, id, bounds) {
3435
3810
  primitives.push(fe("feGaussianBlur", { in: body, stdDeviation: round(f.params.radius / 2), result: name("body") }));
3436
3811
  body = name("body");
3437
3812
  }
3438
- const lastResult = _optionalChain([primitives, 'access', _65 => _65[primitives.length - 1], 'optionalAccess', _66 => _66.attrs, 'access', _67 => _67.result]);
3813
+ const lastResult = _optionalChain([primitives, 'access', _78 => _78[primitives.length - 1], 'optionalAccess', _79 => _79.attrs, 'access', _80 => _80.result]);
3439
3814
  if (lastResult !== body) primitives.push(fe("feMerge", {}, [fe("feMergeNode", { in: body })]));
3440
3815
  const pad = vectorFilterReach(active) + 2;
3441
3816
  return {
@@ -3450,7 +3825,7 @@ function vectorFilterSvg(filters, id, bounds) {
3450
3825
  var escapeAttr = (value) => value.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
3451
3826
  function primitiveMarkup(p) {
3452
3827
  const attrs = Object.entries(p.attrs).map(([k, v2]) => ` ${k}="${escapeAttr(String(v2))}"`).join("");
3453
- return _optionalChain([p, 'access', _68 => _68.children, 'optionalAccess', _69 => _69.length]) ? `<${p.tag}${attrs}>${p.children.map(primitiveMarkup).join("")}</${p.tag}>` : `<${p.tag}${attrs}/>`;
3828
+ return _optionalChain([p, 'access', _81 => _81.children, 'optionalAccess', _82 => _82.length]) ? `<${p.tag}${attrs}>${p.children.map(primitiveMarkup).join("")}</${p.tag}>` : `<${p.tag}${attrs}/>`;
3454
3829
  }
3455
3830
  function vectorFilterMarkup(filter, extra = "") {
3456
3831
  return `<filter id="${escapeAttr(filter.id)}" filterUnits="userSpaceOnUse" x="${filter.x}" y="${filter.y}" width="${filter.width}" height="${filter.height}" color-interpolation-filters="sRGB"${extra}>${filter.primitives.map(primitiveMarkup).join("")}</filter>`;
@@ -3468,7 +3843,7 @@ function sanitizeVectorMask(value) {
3468
3843
  return r.invert === true ? { type: r.type, invert: true } : { type: r.type };
3469
3844
  }
3470
3845
  function isVectorMaskGroup(node) {
3471
- return _optionalChain([node, 'optionalAccess', _70 => _70.type]) === "group" && !!node.mask && isVectorMaskType(node.mask.type) && !node.blend && !node.liveBoolean && node.children.length > 0;
3846
+ return _optionalChain([node, 'optionalAccess', _83 => _83.type]) === "group" && !!node.mask && isVectorMaskType(node.mask.type) && !node.blend && !node.liveBoolean && node.children.length > 0;
3472
3847
  }
3473
3848
  function isVectorMaskActive(node) {
3474
3849
  return isVectorMaskGroup(node) && node.children[0].visible !== false;
@@ -3503,7 +3878,7 @@ function vectorMaskRegionShapes(node, type, parent = IDENTITY_MATRIX, self = tru
3503
3878
  if (!self && node.visible === false) return [];
3504
3879
  if (isVectorFrame(node)) node = vectorFrameDrawn(node);
3505
3880
  const m = multiplyMatrices(nodeMatrix(node), parent);
3506
- if (isVectorMaskActive(node) || node.type === "group" && _optionalChain([node, 'access', _71 => _71.effects, 'optionalAccess', _72 => _72.length])) {
3881
+ if (isVectorMaskActive(node) || node.type === "group" && _optionalChain([node, 'access', _84 => _84.effects, 'optionalAccess', _85 => _85.length])) {
3507
3882
  return vectorAppearanceShapes(node).flatMap((s) => regionOfPath(s.path, s.source, type, m));
3508
3883
  }
3509
3884
  const drawn = expandVectorAppearance(node);
@@ -3708,7 +4083,7 @@ function fitRuns(runs, length2, fallback) {
3708
4083
  }
3709
4084
  if (left2 > 0) {
3710
4085
  if (out.length) out[out.length - 1] = { ...out[out.length - 1], length: out[out.length - 1].length + left2 };
3711
- else out.push({ length: left2, style: _nullishCoalesce(_optionalChain([runs, 'access', _73 => _73[runs.length - 1], 'optionalAccess', _74 => _74.style]), () => ( fallback)) });
4086
+ else out.push({ length: left2, style: _nullishCoalesce(_optionalChain([runs, 'access', _86 => _86[runs.length - 1], 'optionalAccess', _87 => _87.style]), () => ( fallback)) });
3712
4087
  }
3713
4088
  return compact(out);
3714
4089
  }
@@ -3718,7 +4093,7 @@ function styleAt(runs, index, fallback) {
3718
4093
  if (index < at2 + r.length) return r.style;
3719
4094
  at2 += r.length;
3720
4095
  }
3721
- return _nullishCoalesce(_optionalChain([runs, 'access', _75 => _75[runs.length - 1], 'optionalAccess', _76 => _76.style]), () => ( fallback));
4096
+ return _nullishCoalesce(_optionalChain([runs, 'access', _88 => _88[runs.length - 1], 'optionalAccess', _89 => _89.style]), () => ( fallback));
3722
4097
  }
3723
4098
  function restyleRange(runs, start, end, patch) {
3724
4099
  const out = [];
@@ -3774,7 +4149,7 @@ function paragraphRanges(text) {
3774
4149
  return out;
3775
4150
  }
3776
4151
  function fitParagraphRuns(runs, text) {
3777
- const fallback = _nullishCoalesce(_optionalChain([runs, 'access', _77 => _77[0], 'optionalAccess', _78 => _78.style]), () => ( {}));
4152
+ const fallback = _nullishCoalesce(_optionalChain([runs, 'access', _90 => _90[0], 'optionalAccess', _91 => _91.style]), () => ( {}));
3778
4153
  const out = compact(paragraphRanges(text).map((p) => ({ length: p.end - p.start, style: styleAt(runs, p.start, fallback) })));
3779
4154
  return out.length ? out : [{ length: 0, style: fallback }];
3780
4155
  }
@@ -3790,7 +4165,7 @@ var isWide = (code) => code >= 11904 && code <= 40959 || code >= 44032 && code <
3790
4165
  var layoutCache = /* @__PURE__ */ new WeakMap();
3791
4166
  function layoutText(layer, shaper) {
3792
4167
  let byShaper = layoutCache.get(layer);
3793
- const hit = _optionalChain([byShaper, 'optionalAccess', _79 => _79.get, 'call', _80 => _80(shaper.id)]);
4168
+ const hit = _optionalChain([byShaper, 'optionalAccess', _92 => _92.get, 'call', _93 => _93(shaper.id)]);
3794
4169
  if (hit) return hit;
3795
4170
  const out = computeLayout(layer, shaper);
3796
4171
  if (!byShaper) {
@@ -4027,7 +4402,7 @@ function createCanvasTextShaper(options = {}) {
4027
4402
  return null;
4028
4403
  })));
4029
4404
  const canvas = make(1, 1);
4030
- const ctx = _optionalChain([canvas, 'optionalAccess', _81 => _81.getContext, 'call', _82 => _82("2d")]);
4405
+ const ctx = _optionalChain([canvas, 'optionalAccess', _94 => _94.getContext, 'call', _95 => _95("2d")]);
4031
4406
  if (!ctx || typeof ctx.measureText !== "function") return null;
4032
4407
  const fallback = _nullishCoalesce(options.fallbackFamily, () => ( "sans-serif"));
4033
4408
  const available = /* @__PURE__ */ new Map();
@@ -4100,17 +4475,17 @@ function createOutlineTextShaper(fonts, options = {}) {
4100
4475
  const entries = fonts.map((f) => {
4101
4476
  const e = "face" in f ? f : { face: f };
4102
4477
  const names = e.face.names;
4103
- const family = _nullishCoalesce(_nullishCoalesce(_nullishCoalesce(e.family, () => ( _optionalChain([names, 'optionalAccess', _83 => _83.fontFamily, 'optionalAccess', _84 => _84.en]))), () => ( Object.values(_nullishCoalesce(_optionalChain([names, 'optionalAccess', _85 => _85.fontFamily]), () => ( {})))[0])), () => ( "Font"));
4104
- const weight = _nullishCoalesce(_nullishCoalesce(e.weight, () => ( _optionalChain([e, 'access', _86 => _86.face, 'access', _87 => _87.tables, 'optionalAccess', _88 => _88.os2, 'optionalAccess', _89 => _89.usWeightClass]))), () => ( 400));
4105
- const italic = _nullishCoalesce(e.italic, () => ( Boolean((_nullishCoalesce(_optionalChain([e, 'access', _90 => _90.face, 'access', _91 => _91.tables, 'optionalAccess', _92 => _92.os2, 'optionalAccess', _93 => _93.fsSelection]), () => ( 0))) & 1)));
4106
- const postScript = _nullishCoalesce(_optionalChain([names, 'optionalAccess', _94 => _94.postScriptName, 'optionalAccess', _95 => _95.en]), () => ( Object.values(_nullishCoalesce(_optionalChain([names, 'optionalAccess', _96 => _96.postScriptName]), () => ( {})))[0]));
4478
+ const family = _nullishCoalesce(_nullishCoalesce(_nullishCoalesce(e.family, () => ( _optionalChain([names, 'optionalAccess', _96 => _96.fontFamily, 'optionalAccess', _97 => _97.en]))), () => ( Object.values(_nullishCoalesce(_optionalChain([names, 'optionalAccess', _98 => _98.fontFamily]), () => ( {})))[0])), () => ( "Font"));
4479
+ const weight = _nullishCoalesce(_nullishCoalesce(e.weight, () => ( _optionalChain([e, 'access', _99 => _99.face, 'access', _100 => _100.tables, 'optionalAccess', _101 => _101.os2, 'optionalAccess', _102 => _102.usWeightClass]))), () => ( 400));
4480
+ const italic = _nullishCoalesce(e.italic, () => ( Boolean((_nullishCoalesce(_optionalChain([e, 'access', _103 => _103.face, 'access', _104 => _104.tables, 'optionalAccess', _105 => _105.os2, 'optionalAccess', _106 => _106.fsSelection]), () => ( 0))) & 1)));
4481
+ const postScript = _nullishCoalesce(_optionalChain([names, 'optionalAccess', _107 => _107.postScriptName, 'optionalAccess', _108 => _108.en]), () => ( Object.values(_nullishCoalesce(_optionalChain([names, 'optionalAccess', _109 => _109.postScriptName]), () => ( {})))[0]));
4107
4482
  return { face: e.face, family, key: family.toLowerCase(), weight, italic, postScript };
4108
4483
  });
4109
4484
  const fallbackKey = (_nullishCoalesce(options.fallback, () => ( entries[0].family))).toLowerCase();
4110
4485
  const pick = (font) => {
4111
4486
  if (font.postScriptName) {
4112
- const exact = entries.find((e) => e.postScript === font.postScriptName);
4113
- if (exact) return { entry: exact, available: true };
4487
+ const exact2 = entries.find((e) => e.postScript === font.postScriptName);
4488
+ if (exact2) return { entry: exact2, available: true };
4114
4489
  }
4115
4490
  const key = font.family.trim().toLowerCase();
4116
4491
  let pool = entries.filter((e) => e.key === key);
@@ -4209,7 +4584,7 @@ function vectorTextHasOutlines() {
4209
4584
  return typeof getVectorTextShaper().outline === "function";
4210
4585
  }
4211
4586
  function vectorTextFamilies() {
4212
- return _nullishCoalesce(_optionalChain([getVectorTextShaper, 'call', _97 => _97(), 'access', _98 => _98.families, 'optionalCall', _99 => _99()]), () => ( ["sans-serif", "serif", "monospace"]));
4587
+ return _nullishCoalesce(_optionalChain([getVectorTextShaper, 'call', _110 => _110(), 'access', _111 => _111.families, 'optionalCall', _112 => _112()]), () => ( ["sans-serif", "serif", "monospace"]));
4213
4588
  }
4214
4589
  var DEFAULT_VECTOR_FONT = { fontFamily: "sans-serif", fontWeight: 400, fontSize: 24 };
4215
4590
  var VECTOR_CHARACTER_STYLE_KEYS = ["fontFamily", "fontWeight", "italic", "fontSize", "tracking", "leading", "baselineShift", "underline", "strikethrough"];
@@ -4384,7 +4759,7 @@ function computeLayout2(node, shaper) {
4384
4759
  const fragments = [];
4385
4760
  const lines = [];
4386
4761
  let overflow = false;
4387
- const fillOf = (f) => _optionalChain([runs, 'access', _100 => _100.find, 'call', _101 => _101((r) => f.start >= r.start && f.start < r.end), 'optionalAccess', _102 => _102.fill]);
4762
+ const fillOf = (f) => _optionalChain([runs, 'access', _113 => _113.find, 'call', _114 => _114((r) => f.start >= r.start && f.start < r.end), 'optionalAccess', _115 => _115.fill]);
4388
4763
  const styleOf = (f) => {
4389
4764
  const { color: _c, opacity: _o, postScriptName: _p, ...style } = f.style;
4390
4765
  return style;
@@ -4415,11 +4790,11 @@ function computeLayout2(node, shaper) {
4415
4790
  } else {
4416
4791
  const line = text.lines[0];
4417
4792
  const measure = measureVectorPath(subpathPath(frame.path), !!frame.flip);
4418
- const align = _nullishCoalesce(_optionalChain([node, 'access', _103 => _103.paragraph, 'optionalAccess', _104 => _104.align]), () => ( "left"));
4793
+ const align = _nullishCoalesce(_optionalChain([node, 'access', _116 => _116.paragraph, 'optionalAccess', _117 => _117.align]), () => ( "left"));
4419
4794
  const start = Math.max(0, _nullishCoalesce(frame.start, () => ( 0)));
4420
4795
  const end = Math.max(0, _nullishCoalesce(frame.end, () => ( 0)));
4421
4796
  const upright = frame.orientation === "upright";
4422
- const baselineOffset = pathBaselineOffset(_nullishCoalesce(frame.baseline, () => ( "baseline")), _nullishCoalesce(_optionalChain([line, 'optionalAccess', _105 => _105.ascent]), () => ( 0)), _nullishCoalesce(_optionalChain([line, 'optionalAccess', _106 => _106.descent]), () => ( 0)));
4797
+ const baselineOffset = pathBaselineOffset(_nullishCoalesce(frame.baseline, () => ( "baseline")), _nullishCoalesce(_optionalChain([line, 'optionalAccess', _118 => _118.ascent]), () => ( 0)), _nullishCoalesce(_optionalChain([line, 'optionalAccess', _119 => _119.descent]), () => ( 0)));
4423
4798
  if (line) {
4424
4799
  const chars = line.chars.filter((c) => {
4425
4800
  const lo = block.text.charCodeAt(c.index);
@@ -4428,7 +4803,7 @@ function computeLayout2(node, shaper) {
4428
4803
  const advanceOf = (c) => {
4429
4804
  const pair = charAt(block.text, c.index).length === 2;
4430
4805
  const low = pair ? line.chars.find((d) => d.index === c.index + 1) : void 0;
4431
- return c.advance + (_nullishCoalesce(_optionalChain([low, 'optionalAccess', _107 => _107.advance]), () => ( 0)));
4806
+ return c.advance + (_nullishCoalesce(_optionalChain([low, 'optionalAccess', _120 => _120.advance]), () => ( 0)));
4432
4807
  };
4433
4808
  const pivots = chars.map((c) => c.x + advanceOf(c) / 2);
4434
4809
  const positions = vectorPathTextPositions(pivots, [line.x, line.x + line.width], align, measure.length, start, end);
@@ -4483,7 +4858,7 @@ function computeLayout2(node, shaper) {
4483
4858
  if (x0 < Infinity) bounds = { x: x0, y: y0, width: x1 - x0, height: y1 - y0 };
4484
4859
  else if (frame.kind === "point") {
4485
4860
  const l = text.lines[0];
4486
- bounds = { x: frame.x, y: frame.y - (_nullishCoalesce(_optionalChain([l, 'optionalAccess', _108 => _108.ascent]), () => ( 0))), width: 0, height: (_nullishCoalesce(_optionalChain([l, 'optionalAccess', _109 => _109.ascent]), () => ( 0))) + (_nullishCoalesce(_optionalChain([l, 'optionalAccess', _110 => _110.descent]), () => ( 0))) };
4861
+ bounds = { x: frame.x, y: frame.y - (_nullishCoalesce(_optionalChain([l, 'optionalAccess', _121 => _121.ascent]), () => ( 0))), width: 0, height: (_nullishCoalesce(_optionalChain([l, 'optionalAccess', _122 => _122.ascent]), () => ( 0))) + (_nullishCoalesce(_optionalChain([l, 'optionalAccess', _123 => _123.descent]), () => ( 0))) };
4487
4862
  }
4488
4863
  }
4489
4864
  return { shaper: shaper.id, glyphs, fragments, lines, origin, text, bounds, overflow, missingFonts: text.missingFonts };
@@ -4604,7 +4979,7 @@ function vectorTextCaret(node, index) {
4604
4979
  const t = { x: Math.cos(r), y: Math.sin(r) };
4605
4980
  const n2 = { x: -t.y, y: t.x };
4606
4981
  const o = { x: g2.x + t.x * u, y: g2.y + t.y * u };
4607
- return { top: { x: o.x - n2.x * g2.ascent, y: o.y - n2.y * g2.ascent }, bottom: { x: o.x + n2.x * g2.descent, y: o.y + n2.y * g2.descent }, line: _nullishCoalesce(_optionalChain([layout, 'access', _111 => _111.fragments, 'access', _112 => _112[g2.fragment], 'optionalAccess', _113 => _113.line]), () => ( 0)) };
4982
+ return { top: { x: o.x - n2.x * g2.ascent, y: o.y - n2.y * g2.ascent }, bottom: { x: o.x + n2.x * g2.descent, y: o.y + n2.y * g2.descent }, line: _nullishCoalesce(_optionalChain([layout, 'access', _124 => _124.fragments, 'access', _125 => _125[g2.fragment], 'optionalAccess', _126 => _126.line]), () => ( 0)) };
4608
4983
  };
4609
4984
  if (node.frame.kind !== "path") {
4610
4985
  const c = caretAt(layout.text, index);
@@ -4739,7 +5114,7 @@ function sanitizeVectorTextFrame(value, path = "frame") {
4739
5114
  return { kind: "area", x: num2(f.x, `${path}.x`, -1e7, 1e7), y: num2(f.y, `${path}.y`, -1e7, 1e7), width: num2(f.width, `${path}.width`, 0, 1e7), height: num2(f.height, `${path}.height`, 0, 1e7) };
4740
5115
  if (f.kind === "path") {
4741
5116
  const sp = f.path;
4742
- if (!sp || !Array.isArray(sp.anchors) || sp.anchors.length < 2 || !sp.anchors.every((a) => isNum(_optionalChain([a, 'optionalAccess', _114 => _114.x])) && isNum(_optionalChain([a, 'optionalAccess', _115 => _115.y])))) fail(`${path}.path must be a subpath with at least two anchors.`);
5117
+ if (!sp || !Array.isArray(sp.anchors) || sp.anchors.length < 2 || !sp.anchors.every((a) => isNum(_optionalChain([a, 'optionalAccess', _127 => _127.x])) && isNum(_optionalChain([a, 'optionalAccess', _128 => _128.y])))) fail(`${path}.path must be a subpath with at least two anchors.`);
4743
5118
  const out = { kind: "path", path: { closed: !!sp.closed, anchors: sp.anchors.map((a) => ({ ...a })) } };
4744
5119
  if (f.start !== void 0 && f.start !== 0) out.start = num2(f.start, `${path}.start`, 0, 1e7);
4745
5120
  if (f.end !== void 0 && f.end !== 0) out.end = num2(f.end, `${path}.end`, 0, 1e7);
@@ -4757,7 +5132,7 @@ function sanitizeVectorTextFrame(value, path = "frame") {
4757
5132
  return fail(`${path}.kind must be point, area or path, got ${JSON.stringify(f.kind)}.`);
4758
5133
  }
4759
5134
  function normalizeVectorTextRuns(text, runs) {
4760
- if (!_optionalChain([runs, 'optionalAccess', _116 => _116.length])) return null;
5135
+ if (!_optionalChain([runs, 'optionalAccess', _129 => _129.length])) return null;
4761
5136
  const cleaned = fitVectorTextRuns(
4762
5137
  runs.map((r) => ({ length: r.length, style: stripUndefined(r.style) })),
4763
5138
  text.length
@@ -4791,7 +5166,7 @@ function replaceVectorText(node, start, end, insert) {
4791
5166
  const clean2 = insert.replace(/\r\n?/g, "\n");
4792
5167
  const text = node.text.slice(0, start) + clean2 + node.text.slice(end);
4793
5168
  let runs = null;
4794
- if (_optionalChain([node, 'access', _117 => _117.runs, 'optionalAccess', _118 => _118.length])) {
5169
+ if (_optionalChain([node, 'access', _130 => _130.runs, 'optionalAccess', _131 => _131.length])) {
4795
5170
  const fitted = fitVectorTextRuns(node.runs, node.text.length);
4796
5171
  const style = styleAt(fitted, start > 0 ? start - 1 : start, {});
4797
5172
  runs = normalizeVectorTextRuns(text, spliceRuns(fitted, start, end, clean2.length, style));
@@ -4807,7 +5182,7 @@ function styleVectorText(node, start, end, patch) {
4807
5182
  if (whole) {
4808
5183
  let next2 = { ...node, font: patchVectorCharacterStyle(node.font, fields, "style") };
4809
5184
  const keys = Object.keys(fields).filter((k) => fields[k] !== void 0);
4810
- if (_optionalChain([next2, 'access', _119 => _119.runs, 'optionalAccess', _120 => _120.length]) && (keys.length || fill !== void 0)) {
5185
+ if (_optionalChain([next2, 'access', _132 => _132.runs, 'optionalAccess', _133 => _133.length]) && (keys.length || fill !== void 0)) {
4811
5186
  const runs2 = normalizeVectorTextRuns(
4812
5187
  next2.text,
4813
5188
  next2.runs.map((r) => {
@@ -4852,7 +5227,7 @@ function bakeVectorTextGeometry(node, m) {
4852
5227
  ...s.baselineShift !== void 0 ? { baselineShift: s.baselineShift * k } : {}
4853
5228
  });
4854
5229
  const font = scaleStyle(node.font);
4855
- const runs = _optionalChain([node, 'access', _121 => _121.runs, 'optionalAccess', _122 => _122.map, 'call', _123 => _123((r) => ({ length: r.length, style: scaleStyle(r.style) }))]);
5230
+ const runs = _optionalChain([node, 'access', _134 => _134.runs, 'optionalAccess', _135 => _135.map, 'call', _136 => _136((r) => ({ length: r.length, style: scaleStyle(r.style) }))]);
4856
5231
  const p = node.paragraph;
4857
5232
  const paragraph = p ? {
4858
5233
  ...p,
@@ -5134,7 +5509,7 @@ function vectorInstanceGroup(node, bake) {
5134
5509
  const m = _nullishCoalesce(node.transform, () => ( [1, 0, 0, 1, 0, 0]));
5135
5510
  const { rigid, residual } = decomposeRigid(m);
5136
5511
  const k = Math.sqrt(Math.abs(residual[0] * residual[3] - residual[1] * residual[2]));
5137
- const hidden = new Set(_nullishCoalesce(_optionalChain([node, 'access', _124 => _124.overrides, 'optionalAccess', _125 => _125.hidden]), () => ( [])));
5512
+ const hidden = new Set(_nullishCoalesce(_optionalChain([node, 'access', _137 => _137.overrides, 'optionalAccess', _138 => _138.hidden]), () => ( [])));
5138
5513
  const keep = (list) => list.filter((n) => !hidden.has(n.id)).map((n) => n.type === "group" ? { ...n, children: keep(n.children) } : n);
5139
5514
  let children = prefixVectorIds(keep(_nullishCoalesce(node.art, () => ( []))), node.id);
5140
5515
  if (!isIdentityMatrix(residual)) children = children.map((c) => bake(c, residual));
@@ -5147,8 +5522,8 @@ function vectorInstanceGroup(node, bake) {
5147
5522
  if (node.locked) group.locked = true;
5148
5523
  if (node.opacity !== void 0) group.opacity = node.opacity;
5149
5524
  if (node.blendMode) group.blendMode = node.blendMode;
5150
- if (_optionalChain([node, 'access', _126 => _126.filters, 'optionalAccess', _127 => _127.length])) group.filters = node.filters;
5151
- if (_optionalChain([node, 'access', _128 => _128.effects, 'optionalAccess', _129 => _129.length])) group.effects = node.effects;
5525
+ if (_optionalChain([node, 'access', _139 => _139.filters, 'optionalAccess', _140 => _140.length])) group.filters = node.filters;
5526
+ if (_optionalChain([node, 'access', _141 => _141.effects, 'optionalAccess', _142 => _142.length])) group.effects = node.effects;
5152
5527
  if (node.booleanOperation) group.booleanOperation = node.booleanOperation;
5153
5528
  if (node.blendStep) group.blendStep = true;
5154
5529
  return group;
@@ -5872,7 +6247,8 @@ var VECTOR_EFFECT_DEFAULTS = {
5872
6247
  endOpacity: 100,
5873
6248
  composite: "below"
5874
6249
  },
5875
- envelope: { style: "arc", bend: 50, horizontal: 0, vertical: 0, orientation: "horizontal", rows: 2, columns: 2, mesh: null }
6250
+ envelope: { style: "arc", bend: 50, horizontal: 0, vertical: 0, orientation: "horizontal", rows: 2, columns: 2, mesh: null },
6251
+ contour: { direction: "inside", steps: 4, offset: 6, join: "round", miterLimit: 4, fillColor: "#ffffff", strokeColor: null, acceleration: 0 }
5876
6252
  };
5877
6253
  var VECTOR_EFFECT_LABELS = {
5878
6254
  trim: "Trim Paths",
@@ -5884,7 +6260,8 @@ var VECTOR_EFFECT_LABELS = {
5884
6260
  offset: "Offset Paths",
5885
6261
  merge: "Merge Paths",
5886
6262
  repeater: "Repeater",
5887
- envelope: "Envelope"
6263
+ envelope: "Envelope",
6264
+ contour: "Contour"
5888
6265
  };
5889
6266
  var VECTOR_EFFECT_PARAM_SPECS = {
5890
6267
  trim: [
@@ -5952,6 +6329,33 @@ var VECTOR_EFFECT_PARAM_SPECS = {
5952
6329
  ]
5953
6330
  }
5954
6331
  ],
6332
+ contour: [
6333
+ {
6334
+ key: "direction",
6335
+ label: "Direction",
6336
+ kind: "select",
6337
+ options: [
6338
+ { value: "inside", label: "Inside" },
6339
+ { value: "outside", label: "Outside" },
6340
+ { value: "center", label: "To centre" }
6341
+ ]
6342
+ },
6343
+ { key: "steps", label: "Steps", kind: "number", min: 1, max: 200, step: 1, slider: true },
6344
+ { key: "offset", label: "Offset", kind: "number", min: 0.1, max: 200, step: 0.5, slider: true },
6345
+ { key: "fillColor", label: "Fill to", kind: "color" },
6346
+ { key: "strokeColor", label: "Stroke to", kind: "color" },
6347
+ { key: "acceleration", label: "Acceleration", kind: "number", min: -100, max: 100, step: 1, slider: true },
6348
+ {
6349
+ key: "join",
6350
+ label: "Join",
6351
+ kind: "select",
6352
+ options: [
6353
+ { value: "miter", label: "Miter" },
6354
+ { value: "round", label: "Round" },
6355
+ { value: "bevel", label: "Bevel" }
6356
+ ]
6357
+ }
6358
+ ],
5955
6359
  repeater: [
5956
6360
  { key: "copies", label: "Copies", kind: "number", min: 0, max: 50, step: 0.1, slider: true },
5957
6361
  { key: "offset", label: "Offset", kind: "number", min: -10, max: 10, step: 0.1, slider: true },
@@ -6035,18 +6439,19 @@ function normalizeVectorEffectParams(type, params, base) {
6035
6439
  if (!defaults) return null;
6036
6440
  const out = { ...defaults, ..._nullishCoalesce(base, () => ( {})) };
6037
6441
  for (const spec of VECTOR_EFFECT_PARAM_SPECS[type]) {
6038
- const v2 = _optionalChain([params, 'optionalAccess', _130 => _130[spec.key]]);
6442
+ const v2 = _optionalChain([params, 'optionalAccess', _143 => _143[spec.key]]);
6039
6443
  if (v2 === void 0) continue;
6040
6444
  if (spec.kind === "number" && typeof v2 === "number" && Number.isFinite(v2)) out[spec.key] = Math.min(_nullishCoalesce(spec.max, () => ( Infinity)), Math.max(_nullishCoalesce(spec.min, () => ( -Infinity)), v2));
6041
6445
  else if (spec.kind === "boolean" && typeof v2 === "boolean") out[spec.key] = v2;
6042
6446
  else if (spec.kind === "vec2" && isVec2(v2)) out[spec.key] = { x: v2.x, y: v2.y };
6043
6447
  else if (spec.kind === "select" && spec.options.some((o) => o.value === v2)) out[spec.key] = v2;
6448
+ else if (spec.kind === "color" && (v2 === null || typeof v2 === "string" && parseVectorColor(v2))) out[spec.key] = v2;
6044
6449
  }
6045
6450
  if (type === "envelope") {
6046
6451
  const o = out;
6047
6452
  o.rows = Math.round(o.rows);
6048
6453
  o.columns = Math.round(o.columns);
6049
- const given = _optionalChain([params, 'optionalAccess', _131 => _131.mesh]);
6454
+ const given = _optionalChain([params, 'optionalAccess', _144 => _144.mesh]);
6050
6455
  let mesh = given !== void 0 ? isValidWarpMesh(given) ? cloneMesh(given) : null : o.mesh;
6051
6456
  if (o.style !== "mesh") mesh = null;
6052
6457
  if (mesh && given !== void 0) {
@@ -6063,10 +6468,10 @@ function createVectorEffect(type, id, params) {
6063
6468
  }
6064
6469
  var isEnabled = (e) => e.enabled !== false && !!VECTOR_EFFECT_DEFAULTS[e.type];
6065
6470
  function activeVectorEffects(node) {
6066
- return _nullishCoalesce(_optionalChain([node, 'access', _132 => _132.effects, 'optionalAccess', _133 => _133.filter, 'call', _134 => _134(isEnabled)]), () => ( []));
6471
+ return _nullishCoalesce(_optionalChain([node, 'access', _145 => _145.effects, 'optionalAccess', _146 => _146.filter, 'call', _147 => _147(isEnabled)]), () => ( []));
6067
6472
  }
6068
6473
  function hasOwnVectorAppearance(node) {
6069
- return node.type === "text" || node.type === "instance" || node.type === "group" && !!node.liveBoolean || isVectorFrame(node) || !!_optionalChain([node, 'access', _135 => _135.effects, 'optionalAccess', _136 => _136.some, 'call', _137 => _137(isEnabled)]);
6474
+ return node.type === "text" || node.type === "instance" || node.type === "group" && !!node.liveBoolean || isVectorFrame(node) || isVectorSymmetryGroup(node) || !!_optionalChain([node, 'access', _148 => _148.effects, 'optionalAccess', _149 => _149.some, 'call', _150 => _150(isEnabled)]);
6070
6475
  }
6071
6476
  var liveCache = /* @__PURE__ */ new WeakMap();
6072
6477
  function hasVectorAppearance(node) {
@@ -6078,7 +6483,7 @@ function hasVectorAppearance(node) {
6078
6483
  return v2;
6079
6484
  }
6080
6485
  function isVectorLiveBoolean(node) {
6081
- return _optionalChain([node, 'optionalAccess', _138 => _138.type]) === "group" && !!node.liveBoolean;
6486
+ return _optionalChain([node, 'optionalAccess', _151 => _151.type]) === "group" && !!node.liveBoolean;
6082
6487
  }
6083
6488
  function vectorOperandOperation(group, child) {
6084
6489
  return _nullishCoalesce(_nullishCoalesce(child.booleanOperation, () => ( group.liveBoolean)), () => ( "union"));
@@ -6195,11 +6600,42 @@ var compareOrder = (a, b) => {
6195
6600
  for (let i = 0; i < n; i++) if (a[i] !== b[i]) return a[i] - b[i];
6196
6601
  return a.length - b.length;
6197
6602
  };
6198
- var add3 = (a, b) => ({ x: a.x + (_nullishCoalesce(_optionalChain([b, 'optionalAccess', _139 => _139.x]), () => ( 0))), y: a.y + (_nullishCoalesce(_optionalChain([b, 'optionalAccess', _140 => _140.y]), () => ( 0))) });
6603
+ var add3 = (a, b) => ({ x: a.x + (_nullishCoalesce(_optionalChain([b, 'optionalAccess', _152 => _152.x]), () => ( 0))), y: a.y + (_nullishCoalesce(_optionalChain([b, 'optionalAccess', _153 => _153.y]), () => ( 0))) });
6199
6604
  var mapPaths = (shapes, fn) => {
6200
6605
  const out = fn(shapes.map((s) => s.path));
6201
6606
  return shapes.map((s, i) => ({ ...s, path: _nullishCoalesce(out[i], () => ( [])) }));
6202
6607
  };
6608
+ function blendPaint(from, to, t) {
6609
+ if (to === null || typeof from !== "string") return from;
6610
+ const a = parseVectorColor(from);
6611
+ const b = parseVectorColor(to);
6612
+ if (!a || !b) return from;
6613
+ const h = (v2) => Math.round(Math.min(1, Math.max(0, v2)) * 255).toString(16).padStart(2, "0");
6614
+ const m = a.map((v2, k) => v2 + (b[k] - v2) * t);
6615
+ return `#${h(m[0])}${h(m[1])}${h(m[2])}`;
6616
+ }
6617
+ function contourShapes(shapes, c) {
6618
+ const out = [];
6619
+ const step = Math.max(0.01, c.offset);
6620
+ const outside = c.direction === "outside";
6621
+ for (const s of shapes) {
6622
+ let n = Math.min(200, Math.max(1, Math.round(c.steps)));
6623
+ if (c.direction === "center") {
6624
+ const b = _chunkXGD3FSNCcjs.bezierPathBounds.call(void 0, s.path);
6625
+ n = b ? Math.min(200, Math.max(1, Math.ceil(Math.min(b.maxX - b.minX, b.maxY - b.minY) / 2 / step))) : 0;
6626
+ }
6627
+ out.push({ ...s, order: [outside ? n : 0, ...s.order] });
6628
+ const power = 2 ** (Math.min(100, Math.max(-100, c.acceleration)) / 50);
6629
+ for (let k = 1; k <= n; k++) {
6630
+ const [path] = offsetPaths([s.path], (outside ? 1 : -1) * step * k, c.join, c.miterLimit, 1, 0);
6631
+ if (!_optionalChain([path, 'optionalAccess', _154 => _154.length])) break;
6632
+ const t = (k / n) ** power;
6633
+ const source = { ...s.source, fill: _nullishCoalesce(blendPaint(s.source.fill, c.fillColor, t), () => ( null)), stroke: _nullishCoalesce(blendPaint(s.source.stroke, c.strokeColor, t), () => ( null)), fills: void 0, strokes: void 0 };
6634
+ out.push({ source, path, opacity: s.opacity, order: [outside ? n - k : k, ...s.order] });
6635
+ }
6636
+ }
6637
+ return out;
6638
+ }
6203
6639
  function applyVectorEffects(shapes, effects) {
6204
6640
  let list = shapes.slice();
6205
6641
  for (const e of _nullishCoalesce(effects, () => ( []))) {
@@ -6240,6 +6676,9 @@ function applyVectorEffects(shapes, effects) {
6240
6676
  list = mapPaths(list, (p) => envelopePaths(p, params));
6241
6677
  break;
6242
6678
  }
6679
+ case "contour":
6680
+ list = contourShapes(list, e.params);
6681
+ break;
6243
6682
  case "repeater": {
6244
6683
  const r = e.params;
6245
6684
  const copies = repeatPaths(
@@ -6316,10 +6755,10 @@ function vectorEffectInputBounds(node, effectId) {
6316
6755
  return paths ? pathsBounds(paths) : null;
6317
6756
  }
6318
6757
  function vectorNodeEnvelope(node) {
6319
- return _nullishCoalesce(_optionalChain([node, 'optionalAccess', _141 => _141.effects, 'optionalAccess', _142 => _142.find, 'call', _143 => _143((e) => e.type === "envelope" && e.enabled !== false)]), () => ( null));
6758
+ return _nullishCoalesce(_optionalChain([node, 'optionalAccess', _155 => _155.effects, 'optionalAccess', _156 => _156.find, 'call', _157 => _157((e) => e.type === "envelope" && e.enabled !== false)]), () => ( null));
6320
6759
  }
6321
6760
  function vectorEnvelopeFrame(node, effectId) {
6322
- const e = effectId ? _optionalChain([node, 'access', _144 => _144.effects, 'optionalAccess', _145 => _145.find, 'call', _146 => _146((x) => x.id === effectId)]) : vectorNodeEnvelope(node);
6761
+ const e = effectId ? _optionalChain([node, 'access', _158 => _158.effects, 'optionalAccess', _159 => _159.find, 'call', _160 => _160((x) => x.id === effectId)]) : vectorNodeEnvelope(node);
6323
6762
  if (!e || e.type !== "envelope") return null;
6324
6763
  const bounds = vectorEffectInputBounds(node, e.id);
6325
6764
  if (!bounds || !(bounds.width > 0 && bounds.height > 0)) return null;
@@ -6333,8 +6772,8 @@ function vectorAppearanceShapes(node) {
6333
6772
  shapeCache.set(node, [vectorTextShaperGeneration(), shapes]);
6334
6773
  return shapes;
6335
6774
  }
6336
- if (isVectorFrame(node)) {
6337
- const shapes = vectorAppearanceShapes(vectorFrameDrawn(node));
6775
+ if (isVectorFrame(node) || isVectorSymmetryGroup(node)) {
6776
+ const shapes = vectorAppearanceShapes(isVectorFrame(node) ? vectorFrameDrawn(node) : vectorSymmetryDrawn(node));
6338
6777
  shapeCache.set(node, [vectorTextShaperGeneration(), shapes]);
6339
6778
  return shapes;
6340
6779
  }
@@ -6380,7 +6819,7 @@ function placement(node) {
6380
6819
  ...node.blendStep ? { blendStep: true } : {},
6381
6820
  ...node.booleanOperation ? { booleanOperation: node.booleanOperation } : {},
6382
6821
  ...node.blendMode ? { blendMode: node.blendMode } : {},
6383
- ..._optionalChain([node, 'access', _147 => _147.filters, 'optionalAccess', _148 => _148.length]) ? { filters: node.filters } : {}
6822
+ ..._optionalChain([node, 'access', _161 => _161.filters, 'optionalAccess', _162 => _162.length]) ? { filters: node.filters } : {}
6384
6823
  };
6385
6824
  }
6386
6825
  function vectorAppearanceNodes(node) {
@@ -6396,8 +6835,8 @@ function expandVectorAppearance(node) {
6396
6835
  expandCache.set(node, [vectorTextShaperGeneration(), drawn]);
6397
6836
  return drawn;
6398
6837
  }
6399
- if (isVectorFrame(node)) {
6400
- const drawn = vectorFrameDrawn(node);
6838
+ if (isVectorFrame(node) || isVectorSymmetryGroup(node)) {
6839
+ const drawn = isVectorFrame(node) ? vectorFrameDrawn(node) : vectorSymmetryDrawn(node);
6401
6840
  const out2 = hasVectorAppearance(drawn) ? expandVectorAppearance(drawn) : drawn;
6402
6841
  expandCache.set(node, [vectorTextShaperGeneration(), out2]);
6403
6842
  return out2;
@@ -6502,7 +6941,7 @@ function vectorEnteredGroups(nodes, ids) {
6502
6941
  // src/vector/connectors.ts
6503
6942
  var SIDES = ["top", "right", "bottom", "left", "center"];
6504
6943
  function isVectorConnector(node) {
6505
- return _optionalChain([node, 'optionalAccess', _149 => _149.type]) === "path" && !!node.connector;
6944
+ return _optionalChain([node, 'optionalAccess', _163 => _163.type]) === "path" && !!node.connector;
6506
6945
  }
6507
6946
  function vectorConnectionSites(nodes, id) {
6508
6947
  const node = findVectorNode(nodes, id);
@@ -6559,7 +6998,7 @@ function facingSite(sites, toward) {
6559
6998
  }
6560
6999
  function storedEnds(node, world) {
6561
7000
  const sp = node.subpaths[0];
6562
- if (!_optionalChain([sp, 'optionalAccess', _150 => _150.anchors, 'access', _151 => _151.length])) return null;
7001
+ if (!_optionalChain([sp, 'optionalAccess', _164 => _164.anchors, 'access', _165 => _165.length])) return null;
6563
7002
  const a = sp.anchors[0];
6564
7003
  const b = sp.anchors[sp.anchors.length - 1];
6565
7004
  return [applyMatrix(world, a), applyMatrix(world, b)];
@@ -6666,8 +7105,8 @@ function routeVectorConnector(nodes, id) {
6666
7105
  }));
6667
7106
  return {
6668
7107
  subpaths: [{ closed: false, anchors: local }],
6669
- startSide: _nullishCoalesce(_optionalChain([s, 'optionalAccess', _152 => _152.side]), () => ( null)),
6670
- endSide: _nullishCoalesce(_optionalChain([e, 'optionalAccess', _153 => _153.side]), () => ( null)),
7108
+ startSide: _nullishCoalesce(_optionalChain([s, 'optionalAccess', _166 => _166.side]), () => ( null)),
7109
+ endSide: _nullishCoalesce(_optionalChain([e, 'optionalAccess', _167 => _167.side]), () => ( null)),
6671
7110
  dropped: { start: !!startGlue && !s, end: !!endGlue && !e }
6672
7111
  };
6673
7112
  }
@@ -6679,7 +7118,7 @@ function sameSubpaths(a, b) {
6679
7118
  const o = b[i];
6680
7119
  return sp.closed === o.closed && sp.anchors.length === o.anchors.length && sp.anchors.every((p, k) => {
6681
7120
  const q = o.anchors[k];
6682
- return samePoint(p, q) && samePoint(p.in, q.in) && samePoint(p.out, q.out) && (_nullishCoalesce(_optionalChain([p, 'access', _154 => _154.corner, 'optionalAccess', _155 => _155.radius]), () => ( 0))) === (_nullishCoalesce(_optionalChain([q, 'access', _156 => _156.corner, 'optionalAccess', _157 => _157.radius]), () => ( 0)));
7121
+ return samePoint(p, q) && samePoint(p.in, q.in) && samePoint(p.out, q.out) && (_nullishCoalesce(_optionalChain([p, 'access', _168 => _168.corner, 'optionalAccess', _169 => _169.radius]), () => ( 0))) === (_nullishCoalesce(_optionalChain([q, 'access', _170 => _170.corner, 'optionalAccess', _171 => _171.radius]), () => ( 0)));
6683
7122
  });
6684
7123
  });
6685
7124
  }
@@ -6789,7 +7228,7 @@ var add4 = (a, b) => ({ x: a.x + b.x, y: a.y + b.y });
6789
7228
  var sub4 = (a, b) => ({ x: a.x - b.x, y: a.y - b.y });
6790
7229
  var scale2 = (a, k) => ({ x: a.x * k, y: a.y * k });
6791
7230
  var left = (d) => ({ x: d.y, y: -d.x });
6792
- var unit2 = (v2) => {
7231
+ var unit3 = (v2) => {
6793
7232
  const l = Math.hypot(v2.x, v2.y);
6794
7233
  return l > 1e-12 ? { x: v2.x / l, y: v2.y / l } : { x: 1, y: 0 };
6795
7234
  };
@@ -6846,7 +7285,7 @@ function vectorStrokeGradientDefs(g, id, node, options = {}) {
6846
7285
  for (let i = 0; i < segCount; i++) {
6847
7286
  const a = pts[i];
6848
7287
  const b = pts[(i + 1) % n];
6849
- dirs.push(unit2(sub4(b, a)));
7288
+ dirs.push(unit3(sub4(b, a)));
6850
7289
  lengths.push(lengths[i] + Math.hypot(b.x - a.x, b.y - a.y));
6851
7290
  }
6852
7291
  const total = lengths[segCount];
@@ -6958,7 +7397,7 @@ function applyVectorCornersAttribute(subpaths, value) {
6958
7397
  for (const item of value.trim().split(/\s+/)) {
6959
7398
  const m = /^(\d+)\.(\d+):([\d.eE+-]+)(?::([a-z]+))?$/.exec(item);
6960
7399
  if (!m) continue;
6961
- const a = _optionalChain([subpaths, 'access', _158 => _158[+m[1]], 'optionalAccess', _159 => _159.anchors, 'access', _160 => _160[+m[2]]]);
7400
+ const a = _optionalChain([subpaths, 'access', _172 => _172[+m[1]], 'optionalAccess', _173 => _173.anchors, 'access', _174 => _174[+m[2]]]);
6962
7401
  const radius = parseFloat(m[3]);
6963
7402
  if (!a || !(radius > 0)) continue;
6964
7403
  const kind = VECTOR_CORNER_KINDS.includes(m[4]) ? m[4] : void 0;
@@ -6983,7 +7422,7 @@ function vectorPaintToSvg(paint, gradientId, options = {}) {
6983
7422
  const area2 = bounds2 ? { x: bounds2.x - reach2, y: bounds2.y - reach2, width: bounds2.width + 2 * reach2, height: bounds2.height + 2 * reach2 } : null;
6984
7423
  const key2 = `${gradientId}|${_nullishCoalesce(options.role, () => ( "fill"))}|${_nullishCoalesce(options.precision, () => ( 3))}|${area2 ? [area2.x, area2.y, area2.width, area2.height].join(",") : ""}`;
6985
7424
  let byKey2 = paintCache.get(paint);
6986
- const hit = _optionalChain([byKey2, 'optionalAccess', _161 => _161.get, 'call', _162 => _162(key2)]);
7425
+ const hit = _optionalChain([byKey2, 'optionalAccess', _175 => _175.get, 'call', _176 => _176(key2)]);
6987
7426
  if (hit) return { value: `url(#${gradientId})`, defs: hit };
6988
7427
  const defs2 = vectorShadedSvgDefs(paint, gradientId, { bounds: bounds2, area: area2, precision: _nullishCoalesce(options.precision, () => ( 3)) });
6989
7428
  if (!byKey2) paintCache.set(paint, byKey2 = /* @__PURE__ */ new Map());
@@ -6995,7 +7434,7 @@ function vectorPaintToSvg(paint, gradientId, options = {}) {
6995
7434
  const precision = _nullishCoalesce(options.precision, () => ( 3));
6996
7435
  const key = `${gradientId}|${role}|${precision}`;
6997
7436
  const owner = _nullishCoalesce(options.node, () => ( paint));
6998
- const cached = _optionalChain([paintCache, 'access', _163 => _163.get, 'call', _164 => _164(owner), 'optionalAccess', _165 => _165.get, 'call', _166 => _166(key)]);
7437
+ const cached = _optionalChain([paintCache, 'access', _177 => _177.get, 'call', _178 => _178(owner), 'optionalAccess', _179 => _179.get, 'call', _180 => _180(key)]);
6999
7438
  if (cached && (!options.node || (role === "fill" ? options.node.fill : options.node.stroke) === paint)) return { value: `url(#${gradientId})`, defs: cached };
7000
7439
  const node = options.node;
7001
7440
  const bounds = node ? vectorPathLocalBounds(node) : null;
@@ -7049,7 +7488,7 @@ function vectorNodeLocalPaintBounds(node) {
7049
7488
  }
7050
7489
  var filterCache = /* @__PURE__ */ new WeakMap();
7051
7490
  function vectorNodeFilterSvg(node, id) {
7052
- if (!_optionalChain([node, 'access', _167 => _167.filters, 'optionalAccess', _168 => _168.length])) return null;
7491
+ if (!_optionalChain([node, 'access', _181 => _181.filters, 'optionalAccess', _182 => _182.length])) return null;
7053
7492
  const hit = filterCache.get(node);
7054
7493
  if (hit && hit.id === id) return hit.filter;
7055
7494
  const active = activeVectorFilters(node);
@@ -7133,7 +7572,7 @@ function vectorDocumentToSvg(doc, options = {}) {
7133
7572
  if (node.type === "path" && node.connector) out2 += ` data-vector-connector="${escapeAttr2(JSON.stringify(node.connector))}"`;
7134
7573
  const blend = vectorBlendModeCss(node.blendMode);
7135
7574
  if (blend) out2 += ` style="mix-blend-mode:${blend}"`;
7136
- if (_optionalChain([node, 'access', _169 => _169.filters, 'optionalAccess', _170 => _170.length])) {
7575
+ if (_optionalChain([node, 'access', _183 => _183.filters, 'optionalAccess', _184 => _184.length])) {
7137
7576
  const filter = vectorNodeFilterSvg(node, `${prefix}filter-${node.id}`);
7138
7577
  const data = ` data-vector-filters="${escapeAttr2(JSON.stringify(node.filters))}"`;
7139
7578
  if (filter) {
@@ -7180,7 +7619,7 @@ function vectorDocumentToSvg(doc, options = {}) {
7180
7619
  let out2 = ` stroke="${escapeAttr2(strokeValue)}" stroke-width="${num3(width)}"`;
7181
7620
  if (node.strokeLinecap && node.strokeLinecap !== "butt") out2 += ` stroke-linecap="${node.strokeLinecap}"`;
7182
7621
  if (node.strokeLinejoin && node.strokeLinejoin !== "miter") out2 += ` stroke-linejoin="${node.strokeLinejoin}"`;
7183
- if (_optionalChain([node, 'access', _171 => _171.strokeDasharray, 'optionalAccess', _172 => _172.length])) out2 += ` stroke-dasharray="${node.strokeDasharray.map(num3).join(" ")}"`;
7622
+ if (_optionalChain([node, 'access', _185 => _185.strokeDasharray, 'optionalAccess', _186 => _186.length])) out2 += ` stroke-dasharray="${node.strokeDasharray.map(num3).join(" ")}"`;
7184
7623
  return out2;
7185
7624
  };
7186
7625
  const liveCorners = (node) => {
@@ -7223,7 +7662,7 @@ function vectorDocumentToSvg(doc, options = {}) {
7223
7662
  };
7224
7663
  const emit2 = (node, depth) => {
7225
7664
  if (node.visible === false && !options.includeHidden) return;
7226
- const wrappers = _nullishCoalesce(_optionalChain([options, 'access', _173 => _173.wrap, 'optionalAccess', _174 => _174[node.id]]), () => ( []));
7665
+ const wrappers = _nullishCoalesce(_optionalChain([options, 'access', _187 => _187.wrap, 'optionalAccess', _188 => _188[node.id]]), () => ( []));
7227
7666
  wrappers.forEach((w2, i) => {
7228
7667
  let attrs = w2.id !== void 0 ? ` id="${escapeAttr2(w2.id)}"` : "";
7229
7668
  if (w2.transform) attrs += ` transform="${escapeAttr2(w2.transform)}"`;
@@ -7244,7 +7683,7 @@ function vectorDocumentToSvg(doc, options = {}) {
7244
7683
  };
7245
7684
  const emitMaskGroup = (node, depth) => {
7246
7685
  const [source, ...contents] = node.children;
7247
- const body = _optionalChain([node, 'access', _175 => _175.effects, 'optionalAccess', _176 => _176.length]) && contents.length ? [{ id: `${node.id}~content`, type: "group", effects: node.effects, children: contents }] : contents;
7686
+ const body = _optionalChain([node, 'access', _189 => _189.effects, 'optionalAccess', _190 => _190.length]) && contents.length ? [{ id: `${node.id}~content`, type: "group", effects: node.effects, children: contents }] : contents;
7248
7687
  const settings = { type: node.mask.type, ...node.mask.invert ? { invert: true } : {} };
7249
7688
  lines.push(`${indent(depth)}<g${common(node)} data-vector-mask="${escapeAttr2(JSON.stringify(settings))}">`);
7250
7689
  const mask = vectorMaskRenderData(node, `${prefix}mask-${node.id}`, `${prefix}mask-filter-${node.id}`, precision);
@@ -7261,7 +7700,7 @@ function vectorDocumentToSvg(doc, options = {}) {
7261
7700
  lines.push(`${indent(depth + 1)}<g data-vector-part="mask-source" display="none">`);
7262
7701
  emitNode(source, depth + 2);
7263
7702
  lines.push(`${indent(depth + 1)}</g>`);
7264
- if (_optionalChain([mask, 'optionalAccess', _177 => _177.clip])) {
7703
+ if (_optionalChain([mask, 'optionalAccess', _191 => _191.clip])) {
7265
7704
  defs.push(`<clipPath id="${escapeAttr2(mask.id)}">${mask.clip.map((c) => `<path d="${c.d}" clip-rule="${c.clipRule}"/>`).join("")}</clipPath>`);
7266
7705
  ref = ` clip-path="url(#${escapeAttr2(mask.id)})"`;
7267
7706
  }
@@ -7273,7 +7712,7 @@ function vectorDocumentToSvg(doc, options = {}) {
7273
7712
  };
7274
7713
  const emitTextElement = (node, depth, attrs) => {
7275
7714
  const geometry = vectorTextGeometryNode(node);
7276
- const fields = { text: node.text, font: node.font, ..._optionalChain([node, 'access', _178 => _178.runs, 'optionalAccess', _179 => _179.length]) ? { runs: node.runs } : {}, ...node.paragraph ? { paragraph: node.paragraph } : {}, frame: node.frame, ..._optionalChain([node, 'access', _180 => _180.effects, 'optionalAccess', _181 => _181.length]) ? { effects: node.effects } : {} };
7715
+ const fields = { text: node.text, font: node.font, ..._optionalChain([node, 'access', _192 => _192.runs, 'optionalAccess', _193 => _193.length]) ? { runs: node.runs } : {}, ...node.paragraph ? { paragraph: node.paragraph } : {}, frame: node.frame, ..._optionalChain([node, 'access', _194 => _194.effects, 'optionalAccess', _195 => _195.length]) ? { effects: node.effects } : {} };
7277
7716
  let data = ` data-vector-text="${escapeAttr2(JSON.stringify(fields))}"`;
7278
7717
  if (hasVectorPaintStacks(node)) data += ` data-vector-fills="${escapeAttr2(JSON.stringify(vectorFills(node)))}" data-vector-strokes="${escapeAttr2(JSON.stringify(vectorStrokes(node)))}"`;
7279
7718
  else {
@@ -7315,12 +7754,12 @@ function vectorDocumentToSvg(doc, options = {}) {
7315
7754
  };
7316
7755
  const emitText = (node, depth) => {
7317
7756
  const outlines = vectorTextPaths(node).outlines;
7318
- const effects = !!_optionalChain([node, 'access', _182 => _182.effects, 'optionalAccess', _183 => _183.some, 'call', _184 => _184((e) => e.enabled !== false)]);
7757
+ const effects = !!_optionalChain([node, 'access', _196 => _196.effects, 'optionalAccess', _197 => _197.some, 'call', _198 => _198((e) => e.enabled !== false)]);
7319
7758
  if (!outlines || !effects && options.text !== "outlines") {
7320
7759
  emitTextElement(node, depth, common(node));
7321
7760
  return;
7322
7761
  }
7323
- lines.push(`${indent(depth)}<g${common(node)} data-vector-live="${escapeAttr2(JSON.stringify({ kind: "text", ..._optionalChain([node, 'access', _185 => _185.effects, 'optionalAccess', _186 => _186.length]) ? { effects: node.effects } : {} }))}">`);
7762
+ lines.push(`${indent(depth)}<g${common(node)} data-vector-live="${escapeAttr2(JSON.stringify({ kind: "text", ..._optionalChain([node, 'access', _199 => _199.effects, 'optionalAccess', _200 => _200.length]) ? { effects: node.effects } : {} }))}">`);
7324
7763
  lines.push(`${indent(depth + 1)}<g data-vector-part="appearance">`);
7325
7764
  for (const shape of vectorAppearanceNodes(node)) emit2(shape, depth + 2);
7326
7765
  lines.push(`${indent(depth + 1)}</g>`);
@@ -7334,7 +7773,7 @@ function vectorDocumentToSvg(doc, options = {}) {
7334
7773
  const symbolRef = (symbolId) => {
7335
7774
  const hit = symbolIds.get(symbolId);
7336
7775
  if (hit) return hit;
7337
- const sym2 = _optionalChain([doc, 'access', _187 => _187.symbols, 'optionalAccess', _188 => _188.find, 'call', _189 => _189((x) => x.id === symbolId)]);
7776
+ const sym2 = _optionalChain([doc, 'access', _201 => _201.symbols, 'optionalAccess', _202 => _202.find, 'call', _203 => _203((x) => x.id === symbolId)]);
7338
7777
  if (!sym2) return null;
7339
7778
  const id = `${prefix}symbol-${symbolId}`;
7340
7779
  symbolIds.set(symbolId, id);
@@ -7344,20 +7783,20 @@ function vectorDocumentToSvg(doc, options = {}) {
7344
7783
  };
7345
7784
  const emitInstance = (node, depth) => {
7346
7785
  const data = { symbolId: node.symbolId, ...node.scaleStrokes === false ? { scaleStrokes: false } : {}, ...node.overrides ? { overrides: node.overrides } : {} };
7347
- const exact = !node.overrides && node.scaleStrokes !== false && !_optionalChain([node, 'access', _190 => _190.effects, 'optionalAccess', _191 => _191.length]) && !_optionalChain([node, 'access', _192 => _192.filters, 'optionalAccess', _193 => _193.length]);
7786
+ const exact2 = !node.overrides && node.scaleStrokes !== false && !_optionalChain([node, 'access', _204 => _204.effects, 'optionalAccess', _205 => _205.length]) && !_optionalChain([node, 'access', _206 => _206.filters, 'optionalAccess', _207 => _207.length]);
7348
7787
  const ref = symbolRef(node.symbolId);
7349
- if (exact && ref) {
7788
+ if (exact2 && ref) {
7350
7789
  lines.push(`${indent(depth)}<use${common(node)} href="#${escapeAttr2(ref)}" data-vector-instance="${escapeAttr2(JSON.stringify(data))}"/>`);
7351
7790
  return;
7352
7791
  }
7353
- const full = { ...data, ...node.transform ? { transform: node.transform } : {}, ..._optionalChain([node, 'access', _194 => _194.effects, 'optionalAccess', _195 => _195.length]) ? { effects: node.effects } : {} };
7792
+ const full = { ...data, ...node.transform ? { transform: node.transform } : {}, ..._optionalChain([node, 'access', _208 => _208.effects, 'optionalAccess', _209 => _209.length]) ? { effects: node.effects } : {} };
7354
7793
  lines.push(`${indent(depth)}<g data-vector-instance="${escapeAttr2(JSON.stringify(full))}">`);
7355
7794
  emitNode(vectorInstanceDrawn(node), depth + 1);
7356
7795
  lines.push(`${indent(depth)}</g>`);
7357
7796
  };
7358
7797
  const emitFrame = (node, depth) => {
7359
7798
  const f = node.frame;
7360
- const data = { ...f, ..._optionalChain([node, 'access', _196 => _196.effects, 'optionalAccess', _197 => _197.length]) ? { effects: node.effects } : {} };
7799
+ const data = { ...f, ..._optionalChain([node, 'access', _210 => _210.effects, 'optionalAccess', _211 => _211.length]) ? { effects: node.effects } : {} };
7361
7800
  lines.push(`${indent(depth)}<g${common(node)} data-vector-frame="${escapeAttr2(JSON.stringify(data))}">`);
7362
7801
  const rect = vectorFrameRectPath(f);
7363
7802
  if (f.fill !== void 0 && f.fill !== null && f.fill !== "none") {
@@ -7396,8 +7835,9 @@ function vectorDocumentToSvg(doc, options = {}) {
7396
7835
  if (hasOwnVectorAppearance(node)) {
7397
7836
  const live2 = {
7398
7837
  kind: node.type,
7399
- ..._optionalChain([node, 'access', _198 => _198.effects, 'optionalAccess', _199 => _199.length]) ? { effects: node.effects } : {},
7400
- ...node.type === "group" && node.liveBoolean ? { liveBoolean: node.liveBoolean } : {}
7838
+ ..._optionalChain([node, 'access', _212 => _212.effects, 'optionalAccess', _213 => _213.length]) ? { effects: node.effects } : {},
7839
+ ...node.type === "group" && node.liveBoolean ? { liveBoolean: node.liveBoolean } : {},
7840
+ ...node.type === "group" && node.symmetry ? { symmetry: node.symmetry } : {}
7401
7841
  };
7402
7842
  lines.push(`${indent(depth)}<g${common(node)} data-vector-live="${escapeAttr2(JSON.stringify(live2))}">`);
7403
7843
  lines.push(`${indent(depth + 1)}<g data-vector-part="appearance">`);
@@ -7446,7 +7886,7 @@ function vectorDocumentToSvg(doc, options = {}) {
7446
7886
  data += ` data-vector-width-profile="${widthProfileToAttribute(profile)}"`;
7447
7887
  if (node.strokeLinecap && node.strokeLinecap !== "butt") data += ` data-vector-stroke-linecap="${node.strokeLinecap}"`;
7448
7888
  if (node.strokeLinejoin && node.strokeLinejoin !== "miter") data += ` data-vector-stroke-linejoin="${node.strokeLinejoin}"`;
7449
- if (_optionalChain([node, 'access', _200 => _200.strokeDasharray, 'optionalAccess', _201 => _201.length])) data += ` data-vector-stroke-dasharray="${node.strokeDasharray.map(num3).join(" ")}"`;
7889
+ if (_optionalChain([node, 'access', _214 => _214.strokeDasharray, 'optionalAccess', _215 => _215.length])) data += ` data-vector-stroke-dasharray="${node.strokeDasharray.map(num3).join(" ")}"`;
7450
7890
  }
7451
7891
  lines.push(`${indent(depth)}<g${common(node)}${data}>`);
7452
7892
  lines.push(`${indent(depth + 1)}<path data-vector-part="fill" d="${d}"${fillAttrs}${live}/>`);
@@ -7614,7 +8054,7 @@ function attrOrStyle(el, name) {
7614
8054
  return el.attrs[name];
7615
8055
  }
7616
8056
  function urlId(value) {
7617
- return _nullishCoalesce(_optionalChain([/^url\(\s*['"]?#([^'")\s]+)['"]?\s*\)/, 'access', _202 => _202.exec, 'call', _203 => _203((_nullishCoalesce(value, () => ( ""))).trim()), 'optionalAccess', _204 => _204[1]]), () => ( null));
8057
+ return _nullishCoalesce(_optionalChain([/^url\(\s*['"]?#([^'")\s]+)['"]?\s*\)/, 'access', _216 => _216.exec, 'call', _217 => _217((_nullishCoalesce(value, () => ( ""))).trim()), 'optionalAccess', _218 => _218[1]]), () => ( null));
7618
8058
  }
7619
8059
  function clipRulesAsFillRules(el) {
7620
8060
  const attrs = { ...el.attrs };
@@ -7679,9 +8119,9 @@ function resolveGradient(id, raw) {
7679
8119
  for (let el = first; el && !chain.includes(el) && chain.length < 32; ) {
7680
8120
  chain.push(el);
7681
8121
  const href = _nullishCoalesce(el.attrs.href, () => ( el.attrs["xlink:href"]));
7682
- el = _optionalChain([href, 'optionalAccess', _205 => _205.startsWith, 'call', _206 => _206("#")]) ? raw.get(href.slice(1)) : void 0;
8122
+ el = _optionalChain([href, 'optionalAccess', _219 => _219.startsWith, 'call', _220 => _220("#")]) ? raw.get(href.slice(1)) : void 0;
7683
8123
  }
7684
- const attr = (name) => _optionalChain([chain, 'access', _207 => _207.find, 'call', _208 => _208((el) => el.attrs[name] !== void 0), 'optionalAccess', _209 => _209.attrs, 'access', _210 => _210[name]]);
8124
+ const attr = (name) => _optionalChain([chain, 'access', _221 => _221.find, 'call', _222 => _222((el) => el.attrs[name] !== void 0), 'optionalAccess', _223 => _223.attrs, 'access', _224 => _224[name]]);
7685
8125
  const stops = _nullishCoalesce(chain.map(readStops).find((s) => s.length), () => ( []));
7686
8126
  if (!stops.length) return null;
7687
8127
  const user = attr("gradientUnits") === "userSpaceOnUse";
@@ -7851,7 +8291,7 @@ function parseVectorSvg(svg, options = {}) {
7851
8291
  const stackedPath = (g, _style, m, meta) => {
7852
8292
  const fillEl = g.children.find((c) => c.name === "path" && c.attrs["data-vector-part"] === "fill");
7853
8293
  const subpaths = fillEl ? shapeOf(fillEl) : null;
7854
- if (!_optionalChain([subpaths, 'optionalAccess', _211 => _211.length])) return null;
8294
+ if (!_optionalChain([subpaths, 'optionalAccess', _225 => _225.length])) return null;
7855
8295
  const parse = (v2) => {
7856
8296
  try {
7857
8297
  return v2 ? JSON.parse(v2) : [];
@@ -7870,7 +8310,7 @@ function parseVectorSvg(svg, options = {}) {
7870
8310
  const key = (n) => JSON.stringify([n.subpaths, _nullishCoalesce(n.transform, () => ( null)), _nullishCoalesce(n.opacity, () => ( 1)), n.visible !== false, _nullishCoalesce(n.filters, () => ( null)), _nullishCoalesce(n.blendMode, () => ( "normal")), _nullishCoalesce(n.fillRule, () => ( "nonzero")), _nullishCoalesce(n.booleanOperation, () => ( null))]);
7871
8311
  for (const n of nodes2) {
7872
8312
  const prev = out[out.length - 1];
7873
- if (_optionalChain([prev, 'optionalAccess', _212 => _212.type]) === "path" && n.type === "path" && key(prev) === key(n)) {
8313
+ if (_optionalChain([prev, 'optionalAccess', _226 => _226.type]) === "path" && n.type === "path" && key(prev) === key(n)) {
7874
8314
  const fills = vectorFills(n);
7875
8315
  const strokesBefore = vectorStrokes(prev);
7876
8316
  if (!(fills.length && strokesBefore.length)) {
@@ -7888,7 +8328,7 @@ function parseVectorSvg(svg, options = {}) {
7888
8328
  const part = (name) => g.children.find((c) => c.name === "path" && c.attrs["data-vector-part"] === name);
7889
8329
  const fillEl = part("fill");
7890
8330
  const subpaths = fillEl ? shapeOf(fillEl) : null;
7891
- if (!fillEl || !_optionalChain([subpaths, 'optionalAccess', _213 => _213.length])) return null;
8331
+ if (!fillEl || !_optionalChain([subpaths, 'optionalAccess', _227 => _227.length])) return null;
7892
8332
  const a = g.attrs;
7893
8333
  const fs = readStyle(fillEl, style);
7894
8334
  const strokeEl = part("stroke");
@@ -7925,7 +8365,7 @@ function parseVectorSvg(svg, options = {}) {
7925
8365
  ...profile.length ? { strokeWidthProfile: profile } : {},
7926
8366
  ...keptCap ? { strokeLinecap: keptCap } : {},
7927
8367
  ...keptJoin ? { strokeLinejoin: keptJoin } : {},
7928
- ..._optionalChain([keptDash, 'optionalAccess', _214 => _214.length]) ? { strokeDasharray: keptDash } : {}
8368
+ ..._optionalChain([keptDash, 'optionalAccess', _228 => _228.length]) ? { strokeDasharray: keptDash } : {}
7929
8369
  };
7930
8370
  return placed(node, m);
7931
8371
  };
@@ -7960,6 +8400,8 @@ function parseVectorSvg(svg, options = {}) {
7960
8400
  const group = { id, type: "group", ...meta, children: inner };
7961
8401
  if (effects.length) group.effects = transformVectorEffects(effects, m);
7962
8402
  if (liveBoolean) group.liveBoolean = liveBoolean;
8403
+ const symmetry = sanitizeVectorSymmetry(raw.symmetry);
8404
+ if (symmetry) group.symmetry = transformVectorSymmetry(symmetry, m);
7963
8405
  const blend = blendFromAttribute(g.attrs["data-vector-blend"], m);
7964
8406
  if (blend) group.blend = blend;
7965
8407
  return group;
@@ -7988,8 +8430,8 @@ function parseVectorSvg(svg, options = {}) {
7988
8430
  } else {
7989
8431
  const fill = json2(g.attrs["data-vector-fill"]);
7990
8432
  const stroke = json2(g.attrs["data-vector-stroke"]);
7991
- node.fill = fill == null ? null : _nullishCoalesce(_optionalChain([sanitizeVectorFills, 'call', _215 => _215([{ paint: fill }]), 'access', _216 => _216[0], 'optionalAccess', _217 => _217.paint]), () => ( null));
7992
- node.stroke = stroke == null ? null : _nullishCoalesce(_optionalChain([sanitizeVectorFills, 'call', _218 => _218([{ paint: stroke }]), 'access', _219 => _219[0], 'optionalAccess', _220 => _220.paint]), () => ( null));
8433
+ node.fill = fill == null ? null : _nullishCoalesce(_optionalChain([sanitizeVectorFills, 'call', _229 => _229([{ paint: fill }]), 'access', _230 => _230[0], 'optionalAccess', _231 => _231.paint]), () => ( null));
8434
+ node.stroke = stroke == null ? null : _nullishCoalesce(_optionalChain([sanitizeVectorFills, 'call', _232 => _232([{ paint: stroke }]), 'access', _233 => _233[0], 'optionalAccess', _234 => _234.paint]), () => ( null));
7993
8435
  const settings = json2(g.attrs["data-vector-stroke-settings"]);
7994
8436
  if (settings && typeof settings === "object") {
7995
8437
  const strokes = sanitizeVectorStrokes([{ paint: _nullishCoalesce(node.stroke, () => ( "#000")), ...settings }]);
@@ -8025,8 +8467,8 @@ function parseVectorSvg(svg, options = {}) {
8025
8467
  const anchor = attrOrStyle(el, "text-anchor");
8026
8468
  const first0 = (v2) => _nullishCoalesce(numberList(v2)[0], () => ( 0));
8027
8469
  const tspan = el.children.find((c) => c.name === "tspan");
8028
- const x = el.attrs.x !== void 0 ? first0(el.attrs.x) : first0(_optionalChain([tspan, 'optionalAccess', _221 => _221.attrs, 'access', _222 => _222.x]));
8029
- const y = el.attrs.y !== void 0 ? first0(el.attrs.y) : first0(_optionalChain([tspan, 'optionalAccess', _223 => _223.attrs, 'access', _224 => _224.y]));
8470
+ const x = el.attrs.x !== void 0 ? first0(el.attrs.x) : first0(_optionalChain([tspan, 'optionalAccess', _235 => _235.attrs, 'access', _236 => _236.x]));
8471
+ const y = el.attrs.y !== void 0 ? first0(el.attrs.y) : first0(_optionalChain([tspan, 'optionalAccess', _237 => _237.attrs, 'access', _238 => _238.y]));
8030
8472
  const fillValue = _nullishCoalesce(attrOrStyle(el, "fill"), () => ( style.fill));
8031
8473
  let node = {
8032
8474
  id: idFor(el),
@@ -8057,12 +8499,12 @@ function parseVectorSvg(svg, options = {}) {
8057
8499
  if (symbolOfElement.has(el)) return symbolOfElement.get(el);
8058
8500
  symbolOfElement.set(el, null);
8059
8501
  const own = json2(el.attrs["data-vector-symbol"]);
8060
- let id = typeof _optionalChain([own, 'optionalAccess', _225 => _225.id]) === "string" && own.id ? own.id : _nullishCoalesce(el.attrs.id, () => ( createId()));
8502
+ let id = typeof _optionalChain([own, 'optionalAccess', _239 => _239.id]) === "string" && own.id ? own.id : _nullishCoalesce(el.attrs.id, () => ( createId()));
8061
8503
  while (usedSymbolIds.has(id)) id = `${id}-${usedSymbolIds.size}`;
8062
8504
  usedSymbolIds.add(id);
8063
8505
  const style = readStyle(el, rootStyle);
8064
8506
  const nodes2 = el.name === "symbol" ? visit2(el, style, IDENTITY_MATRIX) : visitOne({ ...el, attrs: { ...el.attrs, transform: "" } }, rootStyle, parseSvgTransform(el.attrs.transform));
8065
- symbols.push({ id, name: typeof _optionalChain([own, 'optionalAccess', _226 => _226.name]) === "string" && own.name ? own.name : _nullishCoalesce(el.attrs.id, () => ( "Symbol")), nodes: nodes2 });
8507
+ symbols.push({ id, name: typeof _optionalChain([own, 'optionalAccess', _240 => _240.name]) === "string" && own.name ? own.name : _nullishCoalesce(el.attrs.id, () => ( "Symbol")), nodes: nodes2 });
8066
8508
  symbolOfElement.set(el, id);
8067
8509
  return id;
8068
8510
  };
@@ -8074,13 +8516,13 @@ function parseVectorSvg(svg, options = {}) {
8074
8516
  if (!symbolId) return null;
8075
8517
  const own = json2(el.attrs["data-vector-instance"]);
8076
8518
  const place2 = multiplyMatrices(translateMatrix(length(el.attrs.x), length(el.attrs.y)), m);
8077
- const node = { id: idFor(el), type: "instance", ...meta, symbolId, ..._optionalChain([own, 'optionalAccess', _227 => _227.scaleStrokes]) === false ? { scaleStrokes: false } : {}, ..._optionalChain([own, 'optionalAccess', _228 => _228.overrides]) ? { overrides: own.overrides } : {} };
8519
+ const node = { id: idFor(el), type: "instance", ...meta, symbolId, ..._optionalChain([own, 'optionalAccess', _241 => _241.scaleStrokes]) === false ? { scaleStrokes: false } : {}, ..._optionalChain([own, 'optionalAccess', _242 => _242.overrides]) ? { overrides: own.overrides } : {} };
8078
8520
  return isIdentityMatrix(place2) ? node : { ...node, transform: place2 };
8079
8521
  };
8080
8522
  const ownInstance = (g, m, meta) => {
8081
8523
  const raw = json2(g.attrs["data-vector-instance"]);
8082
8524
  if (!raw || typeof raw.symbolId !== "string") return null;
8083
- const sym2 = [...byId.values()].find((e) => e.name === "symbol" && _optionalChain([json2, 'call', _229 => _229(e.attrs["data-vector-symbol"]), 'optionalAccess', _230 => _230.id]) === raw.symbolId);
8525
+ const sym2 = [...byId.values()].find((e) => e.name === "symbol" && _optionalChain([json2, 'call', _243 => _243(e.attrs["data-vector-symbol"]), 'optionalAccess', _244 => _244.id]) === raw.symbolId);
8084
8526
  const symbolId = sym2 ? symbolFor(sym2) : raw.symbolId;
8085
8527
  if (!symbolId) return null;
8086
8528
  const t = Array.isArray(raw.transform) && raw.transform.length === 6 && raw.transform.every(Number.isFinite) ? raw.transform : IDENTITY_MATRIX;
@@ -8088,7 +8530,7 @@ function parseVectorSvg(svg, options = {}) {
8088
8530
  const drawn = g.children.find((c) => c.name === "g");
8089
8531
  const effects = sanitizeVectorEffects(raw.effects);
8090
8532
  const node = {
8091
- id: _nullishCoalesce(_optionalChain([drawn, 'optionalAccess', _231 => _231.attrs, 'access', _232 => _232.id]), () => ( idFor(g))),
8533
+ id: _nullishCoalesce(_optionalChain([drawn, 'optionalAccess', _245 => _245.attrs, 'access', _246 => _246.id]), () => ( idFor(g))),
8092
8534
  type: "instance",
8093
8535
  ...meta,
8094
8536
  symbolId,
@@ -8145,12 +8587,12 @@ function parseVectorSvg(svg, options = {}) {
8145
8587
  const masked = (el, nodes2, m) => {
8146
8588
  let out = nodes2;
8147
8589
  const clipEl = rawMasks.get(_nullishCoalesce(urlId(attrOrStyle(el, "clip-path")), () => ( "")));
8148
- if (_optionalChain([clipEl, 'optionalAccess', _233 => _233.name]) === "clipPath") {
8590
+ if (_optionalChain([clipEl, 'optionalAccess', _247 => _247.name]) === "clipPath") {
8149
8591
  const source = maskNode(clipEl, m, out, clipEl.attrs.clipPathUnits);
8150
8592
  if (source) out = [{ id: idFor({ name: "g", attrs: {}, children: [] }), type: "group", name: "Clip Group", mask: { type: "clip" }, children: [source, ...out] }];
8151
8593
  }
8152
8594
  const maskEl = rawMasks.get(_nullishCoalesce(urlId(attrOrStyle(el, "mask")), () => ( "")));
8153
- if (_optionalChain([maskEl, 'optionalAccess', _234 => _234.name]) === "mask") {
8595
+ if (_optionalChain([maskEl, 'optionalAccess', _248 => _248.name]) === "mask") {
8154
8596
  const source = maskNode(maskEl, m, out, maskEl.attrs.maskContentUnits);
8155
8597
  const type = attrOrStyle(maskEl, "mask-type") === "alpha" ? "alpha" : "luminance";
8156
8598
  if (source) out = [{ id: idFor({ name: "g", attrs: {}, children: [] }), type: "group", name: "Opacity Mask", mask: { type }, children: [source, ...out] }];
@@ -8172,19 +8614,19 @@ function parseVectorSvg(svg, options = {}) {
8172
8614
  let sourceEl = part("mask-source");
8173
8615
  if (!sourceEl) {
8174
8616
  const el = rawMasks.get(_nullishCoalesce(urlId(maskedEl.attrs.mask), () => ( "")));
8175
- const invert2 = _optionalChain([el, 'optionalAccess', _235 => _235.children, 'access', _236 => _236.find, 'call', _237 => _237((c) => c.name === "g" && c.attrs["data-vector-part"] === "mask-invert")]);
8617
+ const invert2 = _optionalChain([el, 'optionalAccess', _249 => _249.children, 'access', _250 => _250.find, 'call', _251 => _251((c) => c.name === "g" && c.attrs["data-vector-part"] === "mask-invert")]);
8176
8618
  sourceEl = _nullishCoalesce(invert2, () => ( el));
8177
8619
  }
8178
8620
  const source = sourceEl ? visit2(sourceEl, style, m)[0] : void 0;
8179
8621
  let contents = visit2(maskedEl, style, m);
8180
8622
  let effects;
8181
8623
  const wrapper = contents.length === 1 && contents[0].type === "group" && contents[0].id === `${id}~content` ? contents[0] : null;
8182
- if (_optionalChain([wrapper, 'optionalAccess', _238 => _238.type]) === "group") {
8624
+ if (_optionalChain([wrapper, 'optionalAccess', _252 => _252.type]) === "group") {
8183
8625
  effects = _nullishCoalesce(wrapper.effects, () => ( void 0));
8184
8626
  contents = wrapper.children;
8185
8627
  }
8186
8628
  if (!source) return contents.length ? { id, type: "group", ...meta, children: contents } : null;
8187
- return { id, type: "group", ...meta, mask, ..._optionalChain([effects, 'optionalAccess', _239 => _239.length]) ? { effects } : {}, children: [source, ...contents] };
8629
+ return { id, type: "group", ...meta, mask, ..._optionalChain([effects, 'optionalAccess', _253 => _253.length]) ? { effects } : {}, children: [source, ...contents] };
8188
8630
  };
8189
8631
  const frameGroup = (g, style, m, meta) => {
8190
8632
  const raw = parseJson(g.attrs["data-vector-frame"]);
@@ -8196,7 +8638,7 @@ function parseVectorSvg(svg, options = {}) {
8196
8638
  const { rigid, residual } = decomposeRigid(m);
8197
8639
  const r = _chunkXGD3FSNCcjs.bezierPathBounds.call(void 0, _chunkXGD3FSNCcjs.transformBezierPath.call(void 0, subpathsToBezier(vectorFrameRectPath(frame)), residual));
8198
8640
  const back = invertMatrix(rigid);
8199
- const effects = sanitizeVectorEffects(_optionalChain([raw, 'optionalAccess', _240 => _240.effects]));
8641
+ const effects = sanitizeVectorEffects(_optionalChain([raw, 'optionalAccess', _254 => _254.effects]));
8200
8642
  return {
8201
8643
  id,
8202
8644
  type: "group",
@@ -8424,7 +8866,7 @@ function vectorNodesNear(nodes, rect, pad = 0) {
8424
8866
  }
8425
8867
 
8426
8868
  // src/vector/geometry.ts
8427
- var EPS2 = 1e-9;
8869
+ var EPS3 = 1e-9;
8428
8870
  var cloneAnchor = (a) => ({
8429
8871
  x: a.x,
8430
8872
  y: a.y,
@@ -8450,7 +8892,7 @@ function hasPaint(paint) {
8450
8892
  return true;
8451
8893
  }
8452
8894
  var handleOf = (a, side) => _nullishCoalesce(a[side], () => ( { x: a.x, y: a.y }));
8453
- var isOnAnchor = (a, h) => !h || Math.abs(h.x - a.x) < EPS2 && Math.abs(h.y - a.y) < EPS2;
8895
+ var isOnAnchor = (a, h) => !h || Math.abs(h.x - a.x) < EPS3 && Math.abs(h.y - a.y) < EPS3;
8454
8896
  function subpathSegmentCount(sp) {
8455
8897
  const n = sp.anchors.length;
8456
8898
  if (n < 2) return 0;
@@ -8660,13 +9102,13 @@ function hitTestVectorNode(node, p, tolerance = 0, parent = IDENTITY_MATRIX, opt
8660
9102
  }
8661
9103
  if (isVectorMaskGroup(node)) {
8662
9104
  const m = multiplyMatrices(nodeMatrix(node), parent);
8663
- const entered = !!_optionalChain([options, 'access', _241 => _241.entered, 'optionalAccess', _242 => _242.has, 'call', _243 => _243(node.id)]);
9105
+ const entered = !!_optionalChain([options, 'access', _255 => _255.entered, 'optionalAccess', _256 => _256.has, 'call', _257 => _257(node.id)]);
8664
9106
  if (!entered && isVectorMaskActive(node) && !vectorMaskContains(node, applyMatrix(invertMatrix(m), p), tolerance)) return false;
8665
9107
  const shown = !entered && hasOwnVectorAppearance(node) ? expandVectorAppearance(node).children : node.children;
8666
9108
  for (let i = shown.length - 1; i >= 1; i--) if (hitTestVectorNode(shown[i], p, tolerance, m, options)) return true;
8667
9109
  return entered && hitTestVectorMaskSource(node, p, tolerance, m, options);
8668
9110
  }
8669
- if (!(node.type === "group" && (!hasOwnVectorAppearance(node) || _optionalChain([options, 'access', _244 => _244.entered, 'optionalAccess', _245 => _245.has, 'call', _246 => _246(node.id)])))) node = expandVectorAppearance(node);
9111
+ if (!(node.type === "group" && (!hasOwnVectorAppearance(node) || _optionalChain([options, 'access', _258 => _258.entered, 'optionalAccess', _259 => _259.has, 'call', _260 => _260(node.id)])))) node = expandVectorAppearance(node);
8670
9112
  if (node.type === "group") {
8671
9113
  const m = multiplyMatrices(nodeMatrix(node), parent);
8672
9114
  return node.children.some((c) => hitTestVectorNode(c, p, tolerance, m, options));
@@ -8678,7 +9120,7 @@ function hitTestVectorNode(node, p, tolerance = 0, parent = IDENTITY_MATRIX, opt
8678
9120
  function hitTestVectorMaskSource(group, p, tolerance, m, options) {
8679
9121
  const source = group.children[0];
8680
9122
  if (source.visible === false) return false;
8681
- if (_optionalChain([group, 'access', _247 => _247.mask, 'optionalAccess', _248 => _248.type]) !== "clip") return hitTestVectorNode(source, p, tolerance, m, options);
9123
+ if (_optionalChain([group, 'access', _261 => _261.mask, 'optionalAccess', _262 => _262.type]) !== "clip") return hitTestVectorNode(source, p, tolerance, m, options);
8682
9124
  const paths = collectPathNodes(source).filter((n) => n.visible !== false);
8683
9125
  const pt2 = [p.x, p.y];
8684
9126
  return paths.some((n) => {
@@ -8727,23 +9169,24 @@ function mapAnchor(a, m) {
8727
9169
  }
8728
9170
  function bakeIntoGeometry(node, m) {
8729
9171
  if (isIdentityMatrix(m)) return node;
8730
- if (_optionalChain([node, 'access', _249 => _249.effects, 'optionalAccess', _250 => _250.length])) node = { ...node, effects: transformVectorEffects(node.effects, m, node) };
9172
+ if (_optionalChain([node, 'access', _263 => _263.effects, 'optionalAccess', _264 => _264.length])) node = { ...node, effects: transformVectorEffects(node.effects, m, node) };
8731
9173
  if (isVectorFrame(node)) return bakeFrame(node, m);
8732
9174
  if (node.type === "group") {
8733
9175
  const group = node;
8734
9176
  const children = group.children.map((c) => transformVectorNode(c, m));
8735
- const spine = _optionalChain([group, 'access', _251 => _251.blend, 'optionalAccess', _252 => _252.spine]);
8736
- if (!spine) return { ...group, children };
9177
+ const sym2 = group.symmetry ? { symmetry: transformVectorSymmetry(group.symmetry, m) } : {};
9178
+ const spine = _optionalChain([group, 'access', _265 => _265.blend, 'optionalAccess', _266 => _266.spine]);
9179
+ if (!spine) return { ...group, ...sym2, children };
8737
9180
  const moved = { closed: spine.closed, anchors: spine.anchors.map((a) => mapAnchor(a, m)) };
8738
9181
  return { ...group, children, blend: { ...group.blend, spine: moved } };
8739
9182
  }
8740
9183
  const path = node.type === "text" ? bakeVectorTextGeometry(node, m) : node;
8741
9184
  const flips = m[0] * m[3] - m[1] * m[2] < 0;
8742
- const mirrored = flips && _optionalChain([path, 'access', _253 => _253.strokeWidthProfile, 'optionalAccess', _254 => _254.length]);
9185
+ const mirrored = flips && _optionalChain([path, 'access', _267 => _267.strokeWidthProfile, 'optionalAccess', _268 => _268.length]);
8743
9186
  const layer = (l) => ({
8744
9187
  ...l,
8745
9188
  ...isVectorGradient(l.paint) || isVectorShadedPaint(l.paint) ? { paint: transformVectorPaint(l.paint, m) } : {},
8746
- ...flips && _optionalChain([l, 'access', _255 => _255.strokeWidthProfile, 'optionalAccess', _256 => _256.length]) ? { strokeWidthProfile: mirrorWidthProfile(l.strokeWidthProfile) } : {}
9189
+ ...flips && _optionalChain([l, 'access', _269 => _269.strokeWidthProfile, 'optionalAccess', _270 => _270.length]) ? { strokeWidthProfile: mirrorWidthProfile(l.strokeWidthProfile) } : {}
8747
9190
  });
8748
9191
  return {
8749
9192
  ...path,
@@ -8837,7 +9280,7 @@ function moveAnchorHandle(a, side, pos, breakHandles = false) {
8837
9280
  const dy = pos.y - a.y;
8838
9281
  const len2 = Math.hypot(dx, dy);
8839
9282
  if (type === "symmetric") next[other] = { x: a.x - dx, y: a.y - dy };
8840
- else if (type === "smooth" && len2 > EPS2) {
9283
+ else if (type === "smooth" && len2 > EPS3) {
8841
9284
  const o = a[other];
8842
9285
  const olen = o ? Math.hypot(o.x - a.x, o.y - a.y) : len2;
8843
9286
  next[other] = { x: a.x - dx / len2 * olen, y: a.y - dy / len2 * olen };
@@ -8867,15 +9310,15 @@ function convertAnchor(sp, index, type) {
8867
9310
  else if (prev && next) dir = { x: next.x - prev.x, y: next.y - prev.y };
8868
9311
  else if (next) dir = { x: next.x - a.x, y: next.y - a.y };
8869
9312
  else if (prev) dir = { x: a.x - prev.x, y: a.y - prev.y };
8870
- if (!dir || Math.hypot(dir.x, dir.y) < EPS2) return { anchors, closed: sp.closed };
9313
+ if (!dir || Math.hypot(dir.x, dir.y) < EPS3) return { anchors, closed: sp.closed };
8871
9314
  const dl = Math.hypot(dir.x, dir.y);
8872
9315
  const ux = dir.x / dl;
8873
9316
  const uy = dir.y / dl;
8874
9317
  lenIn = a.in && !isOnAnchor(a, a.in) ? Math.hypot(a.in.x - a.x, a.in.y - a.y) : prev ? Math.hypot(prev.x - a.x, prev.y - a.y) / 3 : 0;
8875
9318
  lenOut = a.out && !isOnAnchor(a, a.out) ? Math.hypot(a.out.x - a.x, a.out.y - a.y) : next ? Math.hypot(next.x - a.x, next.y - a.y) / 3 : 0;
8876
9319
  if (type === "symmetric") lenIn = lenOut = (lenIn + lenOut) / 2 || Math.max(lenIn, lenOut);
8877
- if (lenIn > EPS2) a.in = { x: a.x - ux * lenIn, y: a.y - uy * lenIn };
8878
- if (lenOut > EPS2) a.out = { x: a.x + ux * lenOut, y: a.y + uy * lenOut };
9320
+ if (lenIn > EPS3) a.in = { x: a.x - ux * lenIn, y: a.y - uy * lenIn };
9321
+ if (lenOut > EPS3) a.out = { x: a.x + ux * lenOut, y: a.y + uy * lenOut };
8879
9322
  a.type = type;
8880
9323
  return { anchors, closed: sp.closed };
8881
9324
  }
@@ -8905,449 +9348,172 @@ function removeAnchors(sp, indices) {
8905
9348
  const drop = new Set(indices);
8906
9349
  return { anchors: sp.anchors.filter((_, i) => !drop.has(i)).map(cloneAnchor), closed: sp.closed };
8907
9350
  }
8908
- function reverseSubpath(sp) {
8909
- const anchors = sp.anchors.slice().reverse().map((a) => {
8910
- const next = { x: a.x, y: a.y };
8911
- if (a.out) next.in = { ...a.out };
8912
- if (a.in) next.out = { ...a.in };
8913
- if (a.type) next.type = a.type;
8914
- if (a.corner) next.corner = { ...a.corner };
8915
- if (a.id) next.id = a.id;
8916
- return next;
8917
- });
8918
- return { anchors, closed: sp.closed };
8919
- }
8920
- var KAPPA2 = 0.5522847498307936;
8921
- function rectSubpath(b, radius = 0, kind) {
8922
- const { x, y, width: w, height: h } = b;
8923
- const sp = { anchors: [{ x, y }, { x: x + w, y }, { x: x + w, y: y + h }, { x, y: y + h }], closed: true };
8924
- return radius > 0 ? setSubpathCorners(sp, radius, kind) : sp;
8925
- }
8926
- function ellipseSubpath(b) {
8927
- const rx = b.width / 2;
8928
- const ry = b.height / 2;
8929
- const cx = b.x + rx;
8930
- const cy = b.y + ry;
8931
- const kx = rx * KAPPA2;
8932
- const ky = ry * KAPPA2;
8933
- return {
8934
- closed: true,
8935
- anchors: [
8936
- { x: cx, y: cy - ry, in: { x: cx - kx, y: cy - ry }, out: { x: cx + kx, y: cy - ry }, type: "symmetric" },
8937
- { x: cx + rx, y: cy, in: { x: cx + rx, y: cy - ky }, out: { x: cx + rx, y: cy + ky }, type: "symmetric" },
8938
- { x: cx, y: cy + ry, in: { x: cx + kx, y: cy + ry }, out: { x: cx - kx, y: cy + ry }, type: "symmetric" },
8939
- { x: cx - rx, y: cy, in: { x: cx - rx, y: cy + ky }, out: { x: cx - rx, y: cy - ky }, type: "symmetric" }
8940
- ]
8941
- };
8942
- }
8943
- function polygonSubpath(b, sides = 6) {
8944
- const n = Math.max(3, Math.round(sides));
8945
- const cx = b.x + b.width / 2;
8946
- const cy = b.y + b.height / 2;
8947
- const anchors = [];
8948
- for (let i = 0; i < n; i++) {
8949
- const t = -Math.PI / 2 + i * 2 * Math.PI / n;
8950
- anchors.push({ x: cx + Math.cos(t) * b.width / 2, y: cy + Math.sin(t) * b.height / 2 });
8951
- }
8952
- return { anchors, closed: true };
8953
- }
8954
- function starSubpath(b, points = 5, innerRatio = 0.5) {
8955
- const n = Math.max(3, Math.round(points));
8956
- const cx = b.x + b.width / 2;
8957
- const cy = b.y + b.height / 2;
8958
- const anchors = [];
8959
- for (let i = 0; i < n * 2; i++) {
8960
- const t = -Math.PI / 2 + i * Math.PI / n;
8961
- const r = i % 2 === 0 ? 1 : innerRatio;
8962
- anchors.push({ x: cx + Math.cos(t) * r * b.width / 2, y: cy + Math.sin(t) * r * b.height / 2 });
8963
- }
8964
- return { anchors, closed: true };
8965
- }
8966
- function lineSubpath(a, b) {
8967
- return { anchors: [{ x: a.x, y: a.y }, { x: b.x, y: b.y }], closed: false };
8968
- }
8969
- function roundSubpaths(subpaths, precision = 3) {
8970
- const f = 10 ** precision;
8971
- const r = (n) => Math.round(n * f) / f;
8972
- const rp = (p) => ({ x: r(p.x), y: r(p.y) });
8973
- return subpaths.map((sp) => ({
8974
- closed: sp.closed,
8975
- anchors: sp.anchors.map((a) => ({ ...cloneAnchor(a), x: r(a.x), y: r(a.y), ...a.in ? { in: rp(a.in) } : {}, ...a.out ? { out: rp(a.out) } : {} }))
8976
- }));
8977
- }
8978
-
8979
- // src/vector/pathEffects.ts
8980
- var EPS3 = 1e-9;
8981
- var degenerate2 = (s) => s.every((p) => Math.abs(p[0] - s[0][0]) < EPS3 && Math.abs(p[1] - s[0][1]) < EPS3);
8982
- function raise(seg) {
8983
- if (seg.length !== 3) return seg.map((p) => [p[0], p[1]]);
8984
- const [p0, p1, p2] = seg;
8985
- return [p0, [p0[0] + 2 / 3 * (p1[0] - p0[0]), p0[1] + 2 / 3 * (p1[1] - p0[1])], [p2[0] + 2 / 3 * (p1[0] - p2[0]), p2[1] + 2 / 3 * (p1[1] - p2[1])], p2];
8986
- }
8987
- function subsOf(path) {
8988
- return _chunkXGD3FSNCcjs.pathToContours.call(void 0, path).map((c) => ({ segs: _chunkXGD3FSNCcjs.closeContour.call(void 0, c).filter((s) => !degenerate2(s)).map(raise), closed: c.closed })).filter((s) => s.segs.length > 0);
8989
- }
8990
- var subsToPath = (subs) => _chunkXGD3FSNCcjs.contoursToPath.call(void 0, subs.map((s) => ({ segments: s.segs, closed: s.closed })));
8991
- var unit3 = (x, y) => {
8992
- const l = Math.hypot(x, y);
8993
- return l > 1e-12 && Number.isFinite(l) ? [x / l, y / l] : null;
8994
- };
8995
- function startTangent(s) {
8996
- for (let i = 1; i < s.length; i++) {
8997
- const u = unit3(s[i][0] - s[0][0], s[i][1] - s[0][1]);
8998
- if (u) return u;
8999
- }
9000
- return [1, 0];
9001
- }
9002
- function endTangent(s) {
9003
- const end = s[s.length - 1];
9004
- for (let i = s.length - 2; i >= 0; i--) {
9005
- const u = unit3(end[0] - s[i][0], end[1] - s[i][1]);
9006
- if (u) return u;
9007
- }
9008
- return [1, 0];
9009
- }
9010
- function tangentAt(s, t) {
9011
- if (t <= 1e-9) return startTangent(s);
9012
- if (t >= 1 - 1e-9) return endTangent(s);
9013
- const d = _chunkXGD3FSNCcjs.segmentDerivative.call(void 0, s, t);
9014
- return _nullishCoalesce(unit3(d[0], d[1]), () => ( startTangent(s)));
9015
- }
9016
- var perp2 = (v2) => [-v2[1], v2[0]];
9017
- function effectPathLength(path) {
9018
- let total = 0;
9019
- for (const s of subsOf(path)) for (const seg of s.segs) total += _chunkXGD3FSNCcjs.segmentLength.call(void 0, seg);
9020
- return total;
9021
- }
9022
- function effectPathVertexCount(path) {
9023
- return subsOf(path).reduce((n, s) => n + s.segs.length + (s.closed ? 0 : 1), 0);
9024
- }
9025
- var Measured = class {
9026
-
9027
-
9028
-
9029
- constructor(path) {
9030
- this.segs = subsOf(path).flatMap((s) => s.segs);
9031
- this.lens = this.segs.map((s) => _chunkXGD3FSNCcjs.segmentLength.call(void 0, s));
9032
- this.total = this.lens.reduce((a, b) => a + b, 0);
9033
- }
9034
- /**
9035
- * Appends the part between lengths `sa` and `sb`, continuing the last piece when this one
9036
- * starts where it ends (across the start of a closed path).
9037
- */
9038
- append(sa, sb, out) {
9039
- for (const piece of _chunkXGD3FSNCcjs.trimSegments.call(void 0, this.segs, sa, sb, this.lens)) {
9040
- if (degenerate2(piece)) continue;
9041
- const last = _optionalChain([out, 'access', _257 => _257[out.length - 1], 'optionalAccess', _258 => _258.segs]);
9042
- const end = _optionalChain([last, 'optionalAccess', _259 => _259[last.length - 1], 'optionalAccess', _260 => _260.at, 'call', _261 => _261(-1)]);
9043
- if (!end || Math.hypot(end[0] - piece[0][0], end[1] - piece[0][1]) > 1e-6) out.push({ segs: [piece], closed: false });
9044
- else last.push(piece);
9045
- }
9046
- }
9047
- };
9048
- function trimIntervals(start, end, offsetDegrees) {
9049
- let s = start / 100;
9050
- let e = end / 100;
9051
- if (!Number.isFinite(s) || !Number.isFinite(e)) return null;
9052
- if (s > e) [s, e] = [e, s];
9053
- s = Math.min(1, Math.max(0, s));
9054
- e = Math.min(1, Math.max(0, e));
9055
- if (e - s >= 1 - 1e-9) return null;
9056
- if (e - s <= 1e-9) return [];
9057
- const off = Number.isFinite(offsetDegrees) ? (offsetDegrees / 360 % 1 + 1) % 1 : 0;
9058
- s += off;
9059
- e += off;
9060
- if (e <= 1) return [[s, e]];
9061
- if (s >= 1) return [[s - 1, e - 1]];
9062
- return [
9063
- [s, 1],
9064
- [0, e - 1]
9065
- ];
9066
- }
9067
- function trimPaths(paths, start, end, offsetDegrees = 0) {
9068
- const iv = trimIntervals(start, end, offsetDegrees);
9069
- if (!iv) return paths.slice();
9070
- return paths.map((p) => {
9071
- const m = new Measured(p);
9072
- const out = [];
9073
- if (m.total > 0) for (const [a, b] of iv) m.append(a * m.total, b * m.total, out);
9074
- return subsToPath(out);
9075
- });
9076
- }
9077
- function trimPathsIndividually(paths, start, end, offsetDegrees = 0) {
9078
- const iv = trimIntervals(start, end, offsetDegrees);
9079
- if (!iv) return paths.slice();
9080
- const ms = paths.map((p) => new Measured(p));
9081
- const total = ms.reduce((n, m) => n + m.total, 0);
9082
- let base = 0;
9083
- return ms.map((m) => {
9084
- const out = [];
9085
- for (const [a, b] of iv) {
9086
- const la = Math.max(0, a * total - base);
9087
- const lb = Math.min(m.total, b * total - base);
9088
- if (lb > la) m.append(la, lb, out);
9089
- }
9090
- base += m.total;
9091
- return subsToPath(out);
9092
- });
9093
- }
9094
- function puckerBloatPaths(paths, amount) {
9095
- const a = amount / 100;
9096
- if (!a || !Number.isFinite(a)) return paths.slice();
9097
- return paths.map((p) => {
9098
- const verts = p.filter((c) => c.type !== "Z");
9099
- if (!verts.length) return p;
9100
- const cx = verts.reduce((s, c) => s + c.x, 0) / verts.length;
9101
- const cy = verts.reduce((s, c) => s + c.y, 0) / verts.length;
9102
- const mv = (x, y) => ({ x: x + (cx - x) * a, y: y + (cy - y) * a });
9103
- const mvh = (x, y) => ({ x: x + (x - cx) * a, y: y + (y - cy) * a });
9104
- const out = [];
9105
- let prev = { x: 0, y: 0 };
9106
- let start = { x: 0, y: 0 };
9107
- const curve = (c1, c2, q) => {
9108
- const h1 = mvh(c1.x, c1.y);
9109
- const h2 = mvh(c2.x, c2.y);
9110
- const e = mv(q.x, q.y);
9111
- out.push({ type: "C", x1: h1.x, y1: h1.y, x2: h2.x, y2: h2.y, x: e.x, y: e.y });
9112
- };
9113
- for (const c of p) {
9114
- switch (c.type) {
9115
- case "M": {
9116
- const e = mv(c.x, c.y);
9117
- out.push({ type: "M", x: e.x, y: e.y });
9118
- prev = start = { x: c.x, y: c.y };
9119
- break;
9120
- }
9121
- case "L":
9122
- curve(prev, c, c);
9123
- prev = { x: c.x, y: c.y };
9124
- break;
9125
- case "Q": {
9126
- const c1 = { x: prev.x + 2 / 3 * (c.x1 - prev.x), y: prev.y + 2 / 3 * (c.y1 - prev.y) };
9127
- const c2 = { x: c.x + 2 / 3 * (c.x1 - c.x), y: c.y + 2 / 3 * (c.y1 - c.y) };
9128
- curve(c1, c2, c);
9129
- prev = { x: c.x, y: c.y };
9130
- break;
9131
- }
9132
- case "C":
9133
- curve({ x: c.x1, y: c.y1 }, { x: c.x2, y: c.y2 }, c);
9134
- prev = { x: c.x, y: c.y };
9135
- break;
9136
- case "Z":
9137
- if (Math.hypot(prev.x - start.x, prev.y - start.y) > EPS3) curve(prev, start, start);
9138
- out.push({ type: "Z" });
9139
- prev = start;
9140
- break;
9141
- }
9142
- }
9143
- return out;
9144
- });
9145
- }
9146
- function roundCornerPaths(paths, radius) {
9147
- if (!(radius > 0) || !Number.isFinite(radius)) return paths.slice();
9148
- return paths.map((p) => subpathsToBezier(bezierToSubpaths(p).map((sp) => setSubpathCorners(sp, radius))));
9149
- }
9150
- function offsetPaths(paths, amount, join = "miter", miterLimit = 4, copies = 1, copyOffset = 0) {
9151
- const n = Math.min(1e3, Math.max(1, Math.round(Number.isFinite(copies) ? copies : 1)));
9152
- return paths.map((p) => {
9153
- const out = [];
9154
- for (let i = 0; i < n; i++) out.push(..._chunkXGD3FSNCcjs.offsetPath.call(void 0, p, amount * (i + 1 + copyOffset), { join, miterLimit }));
9155
- return out;
9351
+ function reverseSubpath(sp) {
9352
+ const anchors = sp.anchors.slice().reverse().map((a) => {
9353
+ const next = { x: a.x, y: a.y };
9354
+ if (a.out) next.in = { ...a.out };
9355
+ if (a.in) next.out = { ...a.in };
9356
+ if (a.type) next.type = a.type;
9357
+ if (a.corner) next.corner = { ...a.corner };
9358
+ if (a.id) next.id = a.id;
9359
+ return next;
9156
9360
  });
9361
+ return { anchors, closed: sp.closed };
9157
9362
  }
9158
- function twistPaths(paths, angle, center) {
9159
- let rmax = 0;
9160
- for (const p of paths) for (const c of p) if (c.type !== "Z") rmax = Math.max(rmax, Math.hypot(c.x - center.x, c.y - center.y));
9161
- const a = angle * Math.PI / 180;
9162
- if (!a || rmax <= 1e-9 || !Number.isFinite(a)) return paths.slice();
9163
- const k = a / rmax;
9164
- const rot = (v2, th) => {
9165
- const s = Math.sin(th);
9166
- const co = Math.cos(th);
9167
- return [v2[0] * co - v2[1] * s, v2[0] * s + v2[1] * co];
9168
- };
9169
- const map = (p) => {
9170
- const v2 = [p[0] - center.x, p[1] - center.y];
9171
- const r = rot(v2, k * Math.hypot(v2[0], v2[1]));
9172
- return [center.x + r[0], center.y + r[1]];
9173
- };
9174
- const jac = (p, dv) => {
9175
- const v2 = [p[0] - center.x, p[1] - center.y];
9176
- const r = Math.hypot(v2[0], v2[1]);
9177
- let w = dv;
9178
- if (r > 1e-12) {
9179
- const f = k * (v2[0] * dv[0] + v2[1] * dv[1]) / r;
9180
- w = [dv[0] - v2[1] * f, dv[1] + v2[0] * f];
9181
- }
9182
- return rot(w, k * r);
9363
+ var KAPPA2 = 0.5522847498307936;
9364
+ function rectSubpath(b, radius = 0, kind) {
9365
+ const { x, y, width: w, height: h } = b;
9366
+ const sp = { anchors: [{ x, y }, { x: x + w, y }, { x: x + w, y: y + h }, { x, y: y + h }], closed: true };
9367
+ return radius > 0 ? setSubpathCorners(sp, radius, kind) : sp;
9368
+ }
9369
+ function ellipseSubpath(b) {
9370
+ const rx = b.width / 2;
9371
+ const ry = b.height / 2;
9372
+ const cx = b.x + rx;
9373
+ const cy = b.y + ry;
9374
+ const kx = rx * KAPPA2;
9375
+ const ky = ry * KAPPA2;
9376
+ return {
9377
+ closed: true,
9378
+ anchors: [
9379
+ { x: cx, y: cy - ry, in: { x: cx - kx, y: cy - ry }, out: { x: cx + kx, y: cy - ry }, type: "symmetric" },
9380
+ { x: cx + rx, y: cy, in: { x: cx + rx, y: cy - ky }, out: { x: cx + rx, y: cy + ky }, type: "symmetric" },
9381
+ { x: cx, y: cy + ry, in: { x: cx + kx, y: cy + ry }, out: { x: cx - kx, y: cy + ry }, type: "symmetric" },
9382
+ { x: cx - rx, y: cy, in: { x: cx - rx, y: cy + ky }, out: { x: cx - rx, y: cy - ky }, type: "symmetric" }
9383
+ ]
9183
9384
  };
9184
- return paths.map((p) => {
9185
- const out = [];
9186
- for (const sub5 of subsOf(p)) {
9187
- const segs = [];
9188
- for (const seg of sub5.segs) {
9189
- const cubic = seg.length === 2 ? [seg[0], seg[0], seg[1], seg[1]] : seg;
9190
- const len2 = _chunkXGD3FSNCcjs.segmentLength.call(void 0, seg);
9191
- const m = Math.min(64, Math.max(1, Math.ceil(Math.abs(a) * len2 / rmax / 0.15 + len2 / 50)));
9192
- for (let i = 0; i < m; i++) {
9193
- const q = _chunkXGD3FSNCcjs.subSegment.call(void 0, cubic, i / m, (i + 1) / m);
9194
- const p0 = map(q[0]);
9195
- const p3 = map(q[3]);
9196
- const h1 = jac(q[0], [q[1][0] - q[0][0], q[1][1] - q[0][1]]);
9197
- const h2 = jac(q[3], [q[2][0] - q[3][0], q[2][1] - q[3][1]]);
9198
- segs.push([p0, [p0[0] + h1[0], p0[1] + h1[1]], [p3[0] + h2[0], p3[1] + h2[1]], p3]);
9199
- }
9200
- }
9201
- out.push({ segs, closed: sub5.closed });
9202
- }
9203
- return subsToPath(out);
9204
- });
9205
9385
  }
9206
- function resample(sub5, m) {
9207
- const segs = sub5.segs;
9208
- const n = segs.length;
9209
- const lens = segs.map((s) => _chunkXGD3FSNCcjs.segmentLength.call(void 0, s));
9210
- const out = [];
9211
- for (let j = 0; j < n; j++) {
9212
- const piece = lens[j] / m;
9213
- for (let k = 0; k < m; k++) {
9214
- if (k === 0) {
9215
- const tout = startTangent(segs[j]);
9216
- const prev = sub5.closed || j > 0 ? (j + n - 1) % n : null;
9217
- let tan = tout;
9218
- if (prev !== null) {
9219
- const tin = endTangent(segs[prev]);
9220
- tan = _nullishCoalesce(unit3(tin[0] + tout[0], tin[1] + tout[1]), () => ( tout));
9221
- }
9222
- out.push({ p: segs[j][0], tan, lenPrev: prev === null ? 0 : lens[prev] / m, lenNext: piece });
9223
- } else {
9224
- const t = _chunkXGD3FSNCcjs.segmentParamAtLength.call(void 0, segs[j], piece * k, lens[j]);
9225
- out.push({ p: _chunkXGD3FSNCcjs.segmentPoint.call(void 0, segs[j], t), tan: tangentAt(segs[j], t), lenPrev: piece, lenNext: piece });
9226
- }
9227
- }
9228
- }
9229
- if (!sub5.closed) {
9230
- const last = segs[n - 1];
9231
- out.push({ p: last[last.length - 1], tan: endTangent(last), lenPrev: lens[n - 1] / m, lenNext: 0 });
9386
+ function polygonSubpath(b, sides = 6) {
9387
+ const n = Math.max(3, Math.round(sides));
9388
+ const cx = b.x + b.width / 2;
9389
+ const cy = b.y + b.height / 2;
9390
+ const anchors = [];
9391
+ for (let i = 0; i < n; i++) {
9392
+ const t = -Math.PI / 2 + i * 2 * Math.PI / n;
9393
+ anchors.push({ x: cx + Math.cos(t) * b.width / 2, y: cy + Math.sin(t) * b.height / 2 });
9232
9394
  }
9233
- return out;
9395
+ return { anchors, closed: true };
9234
9396
  }
9235
- function emit(samples, disp, closed, smooth, handle) {
9236
- const n = samples.length;
9237
- if (!n) return null;
9238
- const pt2 = (i) => [samples[i].p[0] + disp[i][0], samples[i].p[1] + disp[i][1]];
9239
- const segs = [];
9240
- const count = closed ? n : n - 1;
9241
- for (let i = 0; i < count; i++) {
9242
- const j = (i + 1) % n;
9243
- const a = samples[i];
9244
- const b = samples[j];
9245
- const p = pt2(i);
9246
- const q = pt2(j);
9247
- if (smooth) segs.push([p, [p[0] + a.tan[0] * a.lenNext * handle, p[1] + a.tan[1] * a.lenNext * handle], [q[0] - b.tan[0] * b.lenPrev * handle, q[1] - b.tan[1] * b.lenPrev * handle], q]);
9248
- else segs.push([p, q]);
9397
+ function starSubpath(b, points = 5, innerRatio = 0.5) {
9398
+ const n = Math.max(3, Math.round(points));
9399
+ const cx = b.x + b.width / 2;
9400
+ const cy = b.y + b.height / 2;
9401
+ const anchors = [];
9402
+ for (let i = 0; i < n * 2; i++) {
9403
+ const t = -Math.PI / 2 + i * Math.PI / n;
9404
+ const r = i % 2 === 0 ? 1 : innerRatio;
9405
+ anchors.push({ x: cx + Math.cos(t) * r * b.width / 2, y: cy + Math.sin(t) * r * b.height / 2 });
9249
9406
  }
9250
- if (!segs.length) return null;
9251
- return { segs, closed };
9252
- }
9253
- function zigzagPaths(paths, size, ridges, smooth = false) {
9254
- const m = Math.min(1e3, Math.max(0, Math.round(Number.isFinite(ridges) ? ridges : 0))) + 1;
9255
- return paths.map((p) => {
9256
- const out = [];
9257
- for (const sub5 of subsOf(p)) {
9258
- const s = resample(sub5, m);
9259
- const disp = s.map((x, i) => {
9260
- const n = perp2(x.tan);
9261
- const d = i % 2 === 0 ? size : -size;
9262
- return [n[0] * d, n[1] * d];
9263
- });
9264
- const e = emit(s, disp, sub5.closed, smooth, 0.36);
9265
- if (e) out.push(e);
9266
- }
9267
- return subsToPath(out);
9268
- });
9407
+ return { anchors, closed: true };
9269
9408
  }
9270
- var MASK64 = (1n << 64n) - 1n;
9271
- function splitmix(x) {
9272
- x = x + 0x9e3779b97f4a7c15n & MASK64;
9273
- let z = x;
9274
- z = (z ^ z >> 30n) * 0xbf58476d1ce4e5b9n & MASK64;
9275
- z = (z ^ z >> 27n) * 0x94d049bb133111ebn & MASK64;
9276
- return z ^ z >> 31n;
9409
+ function lineSubpath(a, b) {
9410
+ return { anchors: [{ x: a.x, y: a.y }, { x: b.x, y: b.y }], closed: false };
9277
9411
  }
9278
- function hash(seed, idx, t) {
9279
- const h = splitmix(splitmix(splitmix(seed) ^ idx) ^ BigInt.asUintN(64, BigInt(t)));
9280
- return Number(h >> 11n) / 2 ** 53 * 2 - 1;
9412
+ function roundSubpaths(subpaths, precision = 3) {
9413
+ const f = 10 ** precision;
9414
+ const r = (n) => Math.round(n * f) / f;
9415
+ const rp = (p) => ({ x: r(p.x), y: r(p.y) });
9416
+ return subpaths.map((sp) => ({
9417
+ closed: sp.closed,
9418
+ anchors: sp.anchors.map((a) => ({ ...cloneAnchor(a), x: r(a.x), y: r(a.y), ...a.in ? { in: rp(a.in) } : {}, ...a.out ? { out: rp(a.out) } : {} }))
9419
+ }));
9281
9420
  }
9282
- function noise(seed, idx, t) {
9283
- const i = Math.floor(t);
9284
- const f = t - i;
9285
- const p0 = hash(seed, idx, i - 1);
9286
- const p1 = hash(seed, idx, i);
9287
- const p2 = hash(seed, idx, i + 1);
9288
- const p3 = hash(seed, idx, i + 2);
9289
- const v2 = 0.5 * (2 * p1 + (-p0 + p2) * f + (2 * p0 - 5 * p1 + 4 * p2 - p3) * f * f + (-p0 + 3 * p1 - 3 * p2 + p3) * f * f * f);
9290
- return Math.min(1, Math.max(-1, v2));
9421
+
9422
+ // src/vector/symmetry.ts
9423
+ function isVectorSymmetryGroup(node) {
9424
+ return _optionalChain([node, 'optionalAccess', _271 => _271.type]) === "group" && !!node.symmetry && !node.blend && !node.liveBoolean && !node.mask && !node.frame;
9291
9425
  }
9292
- function wigglePaths(paths, w) {
9293
- if (!w.size || !Number.isFinite(w.size)) return paths.slice();
9294
- const m = Math.min(1e3, Math.max(0, Math.round(Number.isFinite(w.detail) ? w.detail : 0))) + 1;
9295
- const seed = BigInt.asUintN(64, BigInt(Math.round(Number.isFinite(w.seed) ? w.seed : 0)));
9296
- const t = (Number.isFinite(w.time) ? w.time : 0) * (Number.isFinite(w.speed) ? w.speed : 0) + (Number.isFinite(w.phase) ? w.phase : 0) / 360;
9297
- const corr = Math.min(1, Math.max(0, (Number.isFinite(w.correlation) ? w.correlation : 0) / 100));
9298
- const sx = noise(seed, MASK64, t);
9299
- const sy = noise(seed, MASK64 - 1n, t);
9300
- let idx = 0;
9301
- return paths.map((p) => {
9426
+ var rad = (deg) => deg * Math.PI / 180;
9427
+ var exact = (v2) => Math.abs(v2) < 1e-12 ? 0 : v2;
9428
+ var around = (c, m) => multiplyMatrices(multiplyMatrices([1, 0, 0, 1, -c.x, -c.y], m), [1, 0, 0, 1, c.x, c.y]);
9429
+ var reflect = (c, deg) => {
9430
+ const a = 2 * rad(deg);
9431
+ return around(c, [exact(Math.cos(a)), exact(Math.sin(a)), exact(Math.sin(a)), exact(-Math.cos(a)), 0, 0]);
9432
+ };
9433
+ var turn = (c, deg) => around(c, [exact(Math.cos(rad(deg))), exact(Math.sin(rad(deg))), exact(-Math.sin(rad(deg))), exact(Math.cos(rad(deg))), 0, 0]);
9434
+ var AXIS = { horizontal: [0], vertical: [90], diagonal: [45], dual: [90, 0] };
9435
+ function vectorSymmetryMatrices(s) {
9436
+ const c = s.center;
9437
+ const r = _nullishCoalesce(s.rotation, () => ( 0));
9438
+ if (s.mode === "radial") {
9439
+ const n = Math.min(64, Math.max(2, Math.round(_nullishCoalesce(s.copies, () => ( 6)))));
9302
9440
  const out = [];
9303
- for (const sub5 of subsOf(p)) {
9304
- const s = resample(sub5, m);
9305
- const disp = s.map(() => {
9306
- const i = BigInt(idx);
9307
- const ox = noise(seed, i * 2n, t + idx * 0.37);
9308
- const oy = noise(seed, i * 2n + 1n, t + idx * 0.61);
9309
- idx++;
9310
- return [(sx * corr + ox * (1 - corr)) * w.size, (sy * corr + oy * (1 - corr)) * w.size];
9311
- });
9312
- const e = emit(s, disp, sub5.closed, w.smooth, 1 / 3);
9313
- if (e) out.push(e);
9314
- }
9315
- return subsToPath(out);
9316
- });
9441
+ for (let k = 1; k < n; k++) out.push(turn(c, 360 * k / n));
9442
+ if (s.mirror) for (let k = 0; k < n; k++) out.push(reflect(c, r + 180 * k / n));
9443
+ return out;
9444
+ }
9445
+ const axes = AXIS[s.mode].map((a) => reflect(c, a + r));
9446
+ return s.mode === "dual" ? [...axes, turn(c, 180)] : axes;
9317
9447
  }
9318
- var MERGE_OPS = { add: "union", subtract: "difference", intersect: "intersection", exclude: "xor" };
9319
- function mergePaths(paths, mode = "merge") {
9320
- if (mode === "merge" || !(mode in MERGE_OPS)) return paths.flat();
9321
- const inputs = paths.filter((p) => p.length > 0).map((path) => ({ path, fillRule: "nonzero" }));
9322
- if (!inputs.length) return [];
9323
- return _chunkXGD3FSNCcjs.pathBoolean.call(void 0, MERGE_OPS[mode], inputs).path;
9448
+ function renamed(node, k) {
9449
+ const id = `${node.id}~sym${k}`;
9450
+ if (node.type === "group") return { ...node, id, children: node.children.map((c) => renamed(c, k)) };
9451
+ return { ...node, id };
9324
9452
  }
9325
- function vectorRepeaterCopies(r, pivot) {
9326
- const copies = Math.max(0, Number.isFinite(r.copies) ? Math.min(r.copies, 1e3) : 0);
9327
- const n = Math.ceil(copies);
9328
- const offset = Number.isFinite(r.offset) ? r.offset : 0;
9329
- const so = (_nullishCoalesce(r.startOpacity, () => ( 100))) / 100;
9330
- const eo = (_nullishCoalesce(r.endOpacity, () => ( 100))) / 100;
9331
- const fract = copies - Math.floor(copies);
9453
+ var drawnCache2 = /* @__PURE__ */ new WeakMap();
9454
+ function vectorSymmetryDrawn(node) {
9455
+ let hit = drawnCache2.get(node);
9456
+ if (hit) return hit;
9457
+ const { symmetry, ...group } = node;
9458
+ const copies = vectorSymmetryMatrices(symmetry).flatMap((m, k) => node.children.map((c) => ({ ...renamed(transformVectorNode(c, m), k + 1), locked: true })));
9459
+ hit = { ...group, children: [...node.children, ...copies] };
9460
+ drawnCache2.set(node, hit);
9461
+ return hit;
9462
+ }
9463
+ function vectorSymmetryAxes(s, box) {
9464
+ const r = _nullishCoalesce(s.rotation, () => ( 0));
9465
+ const dirs = s.mode === "radial" ? Array.from({ length: Math.min(64, Math.max(2, Math.round(_nullishCoalesce(s.copies, () => ( 6))))) }, (_, k) => r - 90 + 360 * k / Math.min(64, Math.max(2, Math.round(_nullishCoalesce(s.copies, () => ( 6)))))) : AXIS[s.mode].map((a) => a + r);
9332
9466
  const out = [];
9333
- for (let i = 0; i < n; i++) {
9334
- const k = i + offset;
9335
- let m = translateMatrix(-pivot.x, -pivot.y);
9336
- m = multiplyMatrices(m, scaleMatrix(Math.pow((_nullishCoalesce(_optionalChain([r, 'access', _262 => _262.scale, 'optionalAccess', _263 => _263.x]), () => ( 100))) / 100, k), Math.pow((_nullishCoalesce(_optionalChain([r, 'access', _264 => _264.scale, 'optionalAccess', _265 => _265.y]), () => ( 100))) / 100, k)));
9337
- m = multiplyMatrices(m, rotateMatrix((_nullishCoalesce(r.rotation, () => ( 0))) * k));
9338
- m = multiplyMatrices(m, translateMatrix(pivot.x + (_nullishCoalesce(_optionalChain([r, 'access', _266 => _266.position, 'optionalAccess', _267 => _267.x]), () => ( 0))) * k, pivot.y + (_nullishCoalesce(_optionalChain([r, 'access', _268 => _268.position, 'optionalAccess', _269 => _269.y]), () => ( 0))) * k));
9339
- const t = n > 1 ? i / (n - 1) : 0;
9340
- const partial = i + 1 === n && fract > 0 ? fract : 1;
9341
- out.push({ index: i, matrix: m, opacity: Math.min(1, Math.max(0, (so + (eo - so) * t) * partial)) });
9467
+ for (const deg of dirs) {
9468
+ const d = { x: Math.cos(rad(deg)), y: Math.sin(rad(deg)) };
9469
+ let lo = s.mode === "radial" ? 0 : -Infinity;
9470
+ let hi = Infinity;
9471
+ let inside = true;
9472
+ for (const [o, dv, min, max] of [
9473
+ [s.center.x, d.x, box.x, box.x + box.width],
9474
+ [s.center.y, d.y, box.y, box.y + box.height]
9475
+ ]) {
9476
+ if (Math.abs(dv) < 1e-12) {
9477
+ if (o < min || o > max) inside = false;
9478
+ } else {
9479
+ const a = (min - o) / dv;
9480
+ const b = (max - o) / dv;
9481
+ lo = Math.max(lo, Math.min(a, b));
9482
+ hi = Math.min(hi, Math.max(a, b));
9483
+ }
9484
+ }
9485
+ if (inside && Number.isFinite(lo) && Number.isFinite(hi) && hi > lo) out.push([{ x: s.center.x + lo * d.x, y: s.center.y + lo * d.y }, { x: s.center.x + hi * d.x, y: s.center.y + hi * d.y }]);
9342
9486
  }
9343
9487
  return out;
9344
9488
  }
9345
- function repeatPaths(paths, r, pivot) {
9346
- return vectorRepeaterCopies(r, pivot).map((copy) => ({ copy, paths: paths.map((p) => _chunkXGD3FSNCcjs.transformBezierPath.call(void 0, p, copy.matrix)) }));
9489
+ function sanitizeVectorSymmetry(value) {
9490
+ if (!value || typeof value !== "object") return null;
9491
+ const r = value;
9492
+ if (!VECTOR_SYMMETRY_MODES.includes(r.mode)) return null;
9493
+ const c = r.center;
9494
+ if (!c || !Number.isFinite(c.x) || !Number.isFinite(c.y)) return null;
9495
+ const out = { mode: r.mode, center: { x: c.x, y: c.y } };
9496
+ if (typeof r.rotation === "number" && Number.isFinite(r.rotation) && r.rotation % 360 !== 0) out.rotation = (r.rotation % 360 + 360) % 360;
9497
+ if (out.mode === "radial") {
9498
+ if (typeof r.copies === "number" && Number.isFinite(r.copies)) out.copies = Math.min(64, Math.max(2, Math.round(r.copies)));
9499
+ if (r.mirror === true) out.mirror = true;
9500
+ }
9501
+ return out;
9347
9502
  }
9348
- function pathsCenter(paths) {
9349
- const b = _chunkXGD3FSNCcjs.bezierPathBounds.call(void 0, paths.flat());
9350
- return b ? { x: (b.minX + b.maxX) / 2, y: (b.minY + b.maxY) / 2 } : { x: 0, y: 0 };
9503
+ var VECTOR_SYMMETRY_MODE_LABELS = {
9504
+ vertical: "Mirror left / right",
9505
+ horizontal: "Mirror top / bottom",
9506
+ dual: "Four quarters",
9507
+ diagonal: "Mirror diagonally",
9508
+ radial: "Radial"
9509
+ };
9510
+ function transformVectorSymmetry(s, m) {
9511
+ const center = { x: m[0] * s.center.x + m[2] * s.center.y + m[4], y: m[1] * s.center.x + m[3] * s.center.y + m[5] };
9512
+ const det = m[0] * m[3] - m[1] * m[2];
9513
+ const angle = Math.atan2(m[1], m[0]) * 180 / Math.PI;
9514
+ const rotation = det < 0 ? -(_nullishCoalesce(s.rotation, () => ( 0))) + 2 * angle : (_nullishCoalesce(s.rotation, () => ( 0))) + angle;
9515
+ const norm = (rotation % 360 + 360) % 360;
9516
+ return { ...s, center, ...Math.abs(norm) > 1e-9 && Math.abs(norm - 360) > 1e-9 ? { rotation: norm } : { rotation: void 0 } };
9351
9517
  }
9352
9518
 
9353
9519
 
@@ -9793,5 +9959,13 @@ function pathsCenter(paths) {
9793
9959
 
9794
9960
 
9795
9961
 
9796
- exports.isVectorMeshGradient = isVectorMeshGradient; exports.isVectorFreeformGradient = isVectorFreeformGradient; exports.isVectorShadedPaint = isVectorShadedPaint; exports.vectorRgbaToCss = vectorRgbaToCss; exports.VECTOR_MESH_MAX = VECTOR_MESH_MAX; exports.createVectorMeshGradient = createVectorMeshGradient; exports.vectorMeshPointAt = vectorMeshPointAt; exports.vectorMeshColorAt = vectorMeshColorAt; exports.vectorMeshLines = vectorMeshLines; exports.vectorFreeformSpreadScale = vectorFreeformSpreadScale; exports.vectorFreeformLineSegments = vectorFreeformLineSegments; exports.vectorFreeformField = vectorFreeformField; exports.sampleVectorFreeform = sampleVectorFreeform; exports.autoVectorFreeformGradient = autoVectorFreeformGradient; exports.vectorShadedSvgDefs = vectorShadedSvgDefs; exports.mapVectorShadedPaint = mapVectorShadedPaint; exports.transformVectorShadedPaint = transformVectorShadedPaint; exports.sanitizeVectorShadedPaint = sanitizeVectorShadedPaint; exports.removeVectorFreeformPoint = removeVectorFreeformPoint; exports.nearestVectorShadingPoint = nearestVectorShadingPoint; exports.VECTOR_CORNER_KINDS = VECTOR_CORNER_KINDS; exports.VECTOR_GRADIENT_TYPES = VECTOR_GRADIENT_TYPES; exports.VECTOR_GRADIENT_SPREADS = VECTOR_GRADIENT_SPREADS; exports.VECTOR_GRADIENT_INTERPOLATIONS = VECTOR_GRADIENT_INTERPOLATIONS; exports.VECTOR_STROKE_GRADIENT_MODES = VECTOR_STROKE_GRADIENT_MODES; exports.VECTOR_ARROWHEADS = VECTOR_ARROWHEADS; exports.VECTOR_BLEND_MODES = VECTOR_BLEND_MODES; exports.VECTOR_HORIZONTAL_RESIZING = VECTOR_HORIZONTAL_RESIZING; exports.VECTOR_VERTICAL_RESIZING = VECTOR_VERTICAL_RESIZING; exports.VECTOR_CONNECTOR_SIDES = VECTOR_CONNECTOR_SIDES; exports.VECTOR_CONNECTOR_ROUTES = VECTOR_CONNECTOR_ROUTES; exports.VECTOR_BLEND_SPACINGS = VECTOR_BLEND_SPACINGS; exports.VECTOR_MASK_TYPES = VECTOR_MASK_TYPES; exports.VECTOR_TEXT_ALIGNS = VECTOR_TEXT_ALIGNS; exports.VECTOR_PATH_TEXT_BASELINES = VECTOR_PATH_TEXT_BASELINES; exports.VECTOR_CONSTRAINT_KINDS = VECTOR_CONSTRAINT_KINDS; exports.VECTOR_TOOLS = VECTOR_TOOLS; exports.VECTOR_TRANSFORM_HANDLES = VECTOR_TRANSFORM_HANDLES; exports.VECTOR_PATHFINDER_OPERATIONS = VECTOR_PATHFINDER_OPERATIONS; exports.VECTOR_EFFECT_TYPES = VECTOR_EFFECT_TYPES; exports.VECTOR_MERGE_MODES = VECTOR_MERGE_MODES; exports.VECTOR_FILTER_TYPES = VECTOR_FILTER_TYPES; exports.isVectorGradient = isVectorGradient; exports.parseVectorColor = parseVectorColor; exports.VECTOR_GRADIENT_MIN_STOPS = VECTOR_GRADIENT_MIN_STOPS; exports.gradientMidpointRemap = gradientMidpointRemap; exports.sortedVectorGradientStops = sortedVectorGradientStops; exports.vectorGradientNeedsExpansion = vectorGradientNeedsExpansion; exports.vectorGradientRamp = vectorGradientRamp; exports.sampleVectorGradient = sampleVectorGradient; exports.expandVectorGradientStops = expandVectorGradientStops; exports.samplePlainStops = samplePlainStops; exports.reverseVectorGradient = reverseVectorGradient; exports.insertVectorGradientStop = insertVectorGradientStop; exports.moveVectorGradientStop = moveVectorGradientStop; exports.removeVectorGradientStop = removeVectorGradientStop; exports.vectorGradientMidpointPosition = vectorGradientMidpointPosition; exports.vectorGradientMidpointFromPosition = vectorGradientMidpointFromPosition; exports.spanVectorGradientStops = spanVectorGradientStops; exports.hasExplicitGradientGeometry = hasExplicitGradientGeometry; exports.vectorGradientPoints = vectorGradientPoints; exports.vectorBoxMatrix = vectorBoxMatrix; exports.vectorGradientUnitsMatrix = vectorGradientUnitsMatrix; exports.vectorGradientMatrix = vectorGradientMatrix; exports.vectorGradientFocalParam = vectorGradientFocalParam; exports.vectorGradientParam = vectorGradientParam; exports.applyVectorGradientSpread = applyVectorGradientSpread; exports.vectorGradientTAt = vectorGradientTAt; exports.sampleVectorGradientAt = sampleVectorGradientAt; exports.vectorGradientAspect = vectorGradientAspect; exports.explicitVectorGradient = explicitVectorGradient; exports.pinVectorGradient = pinVectorGradient; exports.transformVectorGradient = transformVectorGradient; exports.mapVectorGradient = mapVectorGradient; exports.mapVectorPaint = mapVectorPaint; exports.transformVectorPaint = transformVectorPaint; exports.isCentredVectorGradient = isCentredVectorGradient; exports.vectorGradientHandles = vectorGradientHandles; exports.moveVectorGradientHandle = moveVectorGradientHandle; exports.setVectorGradientVector = setVectorGradientVector; exports.VECTOR_GRADIENT_MAX_PERIODS = VECTOR_GRADIENT_MAX_PERIODS; exports.periodicVectorGradientStops = periodicVectorGradientStops; exports.expandVectorGradientSpread = expandVectorGradientSpread; exports.vectorGradientArea = vectorGradientArea; exports.patternAttrs = patternAttrs; exports.vectorGradientSvgDefs = vectorGradientSvgDefs; exports.sampleVectorPaintDefAt = sampleVectorPaintDefAt; exports.sanitizeVectorGradient = sanitizeVectorGradient; exports.convertVectorGradient = convertVectorGradient; exports.defaultVectorGradient = defaultVectorGradient; exports.applyVectorGradientPatch = applyVectorGradientPatch; exports.IDENTITY_MATRIX = IDENTITY_MATRIX; exports.multiplyMatrices = multiplyMatrices; exports.translateMatrix = translateMatrix; exports.scaleMatrix = scaleMatrix; exports.rotateMatrix = rotateMatrix; exports.matrixAbout = matrixAbout; exports.skewMatrix = skewMatrix; exports.applyMatrix = applyMatrix; exports.isIdentityMatrix = isIdentityMatrix; exports.invertMatrix = invertMatrix; exports.applyMatrixLinear = applyMatrixLinear; exports.matrixRotation = matrixRotation; exports.decomposeRigid = decomposeRigid; exports.vectorCornerAt = vectorCornerAt; exports.vectorCorners = vectorCorners; exports.cornerSetback = cornerSetback; exports.fitCornerRadius = fitCornerRadius; exports.cornerBisectorPoint = cornerBisectorPoint; exports.cornerRadiusChange = cornerRadiusChange; exports.hasVectorCorners = hasVectorCorners; exports.expandVectorCornersOf = expandVectorCornersOf; exports.expandVectorCorners = expandVectorCorners; exports.setAnchorCorner = setAnchorCorner; exports.nextVectorCornerKind = nextVectorCornerKind; exports.setSubpathCorners = setSubpathCorners; exports.VECTOR_WIDTH_PROFILE_MAX_POINTS = VECTOR_WIDTH_PROFILE_MAX_POINTS; exports.VECTOR_WIDTH_PROFILE_MAX_SCALE = VECTOR_WIDTH_PROFILE_MAX_SCALE; exports.VECTOR_WIDTH_SAME_T = VECTOR_WIDTH_SAME_T; exports.VECTOR_WIDTH_PRESETS = VECTOR_WIDTH_PRESETS; exports.VECTOR_WIDTH_PRESET_IDS = VECTOR_WIDTH_PRESET_IDS; exports.sanitizeWidthProfile = sanitizeWidthProfile; exports.isUniformWidthProfile = isUniformWidthProfile; exports.widthProfileAt = widthProfileAt; exports.widthProfileMaxScale = widthProfileMaxScale; exports.widthProfilePreset = widthProfilePreset; exports.widthProfilePresetId = widthProfilePresetId; exports.reverseWidthProfile = reverseWidthProfile; exports.mirrorWidthProfile = mirrorWidthProfile; exports.insertWidthPoint = insertWidthPoint; exports.setWidthPoint = setWidthPoint; exports.removeWidthPoints = removeWidthPoints; exports.taperWaveFactor = taperWaveFactor; exports.generateWidthProfile = generateWidthProfile; exports.VECTOR_PRESSURE_NOMINAL = VECTOR_PRESSURE_NOMINAL; exports.pressureWidthProfile = pressureWidthProfile; exports.dashIntervals = dashIntervals; exports.variableStrokeRings = variableStrokeRings; exports.variableStrokeOutline = variableStrokeOutline; exports.nearestStrokePosition = nearestStrokePosition; exports.strokePositionPoint = strokePositionPoint; exports.isClosedBezierShape = isClosedBezierShape; exports.effectiveStrokeAlign = effectiveStrokeAlign; exports.strokeWidthProfileOf = strokeWidthProfileOf; exports.hasStrokeExtras = hasStrokeExtras; exports.vectorStrokeLineArea = vectorStrokeLineArea; exports.arrowheadWeight = arrowheadWeight; exports.arrowheadInset = arrowheadInset; exports.arrowheadPath = arrowheadPath; exports.vectorStrokeParts = vectorStrokeParts; exports.vectorStrokeOutlinePath = vectorStrokeOutlinePath; exports.hitTestVectorStroke = hitTestVectorStroke; exports.vectorStrokeReach = vectorStrokeReach; exports.VECTOR_STROKE_SETTING_KEYS = VECTOR_STROKE_SETTING_KEYS; exports.VECTOR_BLEND_MODE_LABELS = VECTOR_BLEND_MODE_LABELS; exports.isVectorBlendMode = isVectorBlendMode; exports.vectorBlendModeCss = vectorBlendModeCss; exports.vectorBlendModeFromCss = vectorBlendModeFromCss; exports.isPlainVectorPaintLayer = isPlainVectorPaintLayer; exports.isDrawnVectorPaintLayer = isDrawnVectorPaintLayer; exports.vectorFills = vectorFills; exports.vectorStrokeSettings = vectorStrokeSettings; exports.vectorStrokes = vectorStrokes; exports.hasVectorPaintStacks = hasVectorPaintStacks; exports.withVectorFills = withVectorFills; exports.withVectorStrokes = withVectorStrokes; exports.normalizeVectorPaintStacks = normalizeVectorPaintStacks; exports.sanitizeVectorFills = sanitizeVectorFills; exports.sanitizeVectorStrokeSettings = sanitizeVectorStrokeSettings; exports.sanitizeVectorStrokes = sanitizeVectorStrokes; exports.vectorPaintLayerNodes = vectorPaintLayerNodes; exports.needsVectorPaintLayers = needsVectorPaintLayers; exports.vectorStrokeStackReach = vectorStrokeStackReach; exports.hitTestVectorPaintLayer = hitTestVectorPaintLayer; exports.hitTestVectorPaintStack = hitTestVectorPaintStack; exports.vectorStacksHaveGradient = vectorStacksHaveGradient; exports.newVectorStrokeLayer = newVectorStrokeLayer; exports.vectorTargetPaint = vectorTargetPaint; exports.withVectorTargetPaint = withVectorTargetPaint; exports.effectPathLength = effectPathLength; exports.effectPathVertexCount = effectPathVertexCount; exports.trimIntervals = trimIntervals; exports.trimPaths = trimPaths; exports.trimPathsIndividually = trimPathsIndividually; exports.puckerBloatPaths = puckerBloatPaths; exports.roundCornerPaths = roundCornerPaths; exports.offsetPaths = offsetPaths; exports.twistPaths = twistPaths; exports.zigzagPaths = zigzagPaths; exports.wigglePaths = wigglePaths; exports.mergePaths = mergePaths; exports.vectorRepeaterCopies = vectorRepeaterCopies; exports.repeatPaths = repeatPaths; exports.pathsCenter = pathsCenter; exports.mapVectorPoints = mapVectorPoints; exports.mapVectorSubpaths = mapVectorSubpaths; exports.mapBezierPath = mapBezierPath; exports.isVectorFrame = isVectorFrame; exports.vectorFrameRectPath = vectorFrameRectPath; exports.vectorFrameDrawn = vectorFrameDrawn; exports.vectorFrameContains = vectorFrameContains; exports.vectorFrameChildMatrix = vectorFrameChildMatrix; exports.sanitizeVectorFrame = sanitizeVectorFrame; exports.sanitizeVectorResizing = sanitizeVectorResizing; exports.VECTOR_HORIZONTAL_RESIZING_LABELS = VECTOR_HORIZONTAL_RESIZING_LABELS; exports.VECTOR_VERTICAL_RESIZING_LABELS = VECTOR_VERTICAL_RESIZING_LABELS; exports.vectorBoundsInside = vectorBoundsInside; exports.vectorArtboards = vectorArtboards; exports.vectorFrameDocument = vectorFrameDocument; exports.getVectorFramePanel = getVectorFramePanel; exports.splitIntoFaces = splitIntoFaces; exports.knifePath = knifePath; exports.eraserRegion = eraserRegion; exports.eraseFromFill = eraseFromFill; exports.eraseFromOutline = eraseFromOutline; exports.polylineBounds = polylineBounds; exports.simplifyPolyline = simplifyPolyline; exports.VECTOR_FILTER_DEFAULTS = VECTOR_FILTER_DEFAULTS; exports.VECTOR_FILTER_LABELS = VECTOR_FILTER_LABELS; exports.VECTOR_FILTER_PARAM_SPECS = VECTOR_FILTER_PARAM_SPECS; exports.isVectorFilterType = isVectorFilterType; exports.normalizeVectorFilterParams = normalizeVectorFilterParams; exports.vectorFilterParamKeys = vectorFilterParamKeys; exports.createVectorFilter = createVectorFilter; exports.sanitizeVectorFilters = sanitizeVectorFilters; exports.activeVectorFilters = activeVectorFilters; exports.vectorFilterReach = vectorFilterReach; exports.vectorFilterSvg = vectorFilterSvg; exports.vectorFilterMarkup = vectorFilterMarkup; exports.VECTOR_FILTER_MENU = VECTOR_FILTER_MENU; exports.isVectorMaskType = isVectorMaskType; exports.sanitizeVectorMask = sanitizeVectorMask; exports.isVectorMaskGroup = isVectorMaskGroup; exports.isVectorMaskActive = isVectorMaskActive; exports.vectorMaskSource = vectorMaskSource; exports.vectorMaskContents = vectorMaskContents; exports.vectorMaskOwner = vectorMaskOwner; exports.vectorMaskSummary = vectorMaskSummary; exports.vectorMaskRegionShapes = vectorMaskRegionShapes; exports.vectorMaskRegion = vectorMaskRegion; exports.vectorMaskRegionPath = vectorMaskRegionPath; exports.vectorMaskContains = vectorMaskContains; exports.vectorMaskedShapes = vectorMaskedShapes; exports.vectorMaskedGeometry = vectorMaskedGeometry; exports.vectorMaskedLocalBounds = vectorMaskedLocalBounds; exports.vectorMaskContentBounds = vectorMaskContentBounds; exports.vectorMaskRenderData = vectorMaskRenderData; exports.DEFAULT_TEXT_STYLE = DEFAULT_TEXT_STYLE; exports.DEFAULT_AUTO_LEADING = DEFAULT_AUTO_LEADING; exports.fitRuns = fitRuns; exports.styleAt = styleAt; exports.restyleRange = restyleRange; exports.spliceRuns = spliceRuns; exports.paragraphRanges = paragraphRanges; exports.fitParagraphRuns = fitParagraphRuns; exports.fontOf = fontOf; exports.isTextSpace = isTextSpace; exports.layoutText = layoutText; exports.textIndexAt = textIndexAt; exports.caretAt = caretAt; exports.textDecorations = textDecorations; exports.textRectPath = textRectPath; exports.textFragmentOutline = textFragmentOutline; exports.cssFontFamily = cssFontFamily; exports.cssFont = cssFont; exports.createCanvasTextShaper = createCanvasTextShaper; exports.createOutlineTextShaper = createOutlineTextShaper; exports.createMetricTextShaper = createMetricTextShaper; exports.setVectorTextShaper = setVectorTextShaper; exports.getVectorTextShaper = getVectorTextShaper; exports.vectorTextShaperGeneration = vectorTextShaperGeneration; exports.vectorTextHasOutlines = vectorTextHasOutlines; exports.vectorTextFamilies = vectorTextFamilies; exports.DEFAULT_VECTOR_FONT = DEFAULT_VECTOR_FONT; exports.VECTOR_CHARACTER_STYLE_KEYS = VECTOR_CHARACTER_STYLE_KEYS; exports.VECTOR_PARAGRAPH_STYLE_KEYS = VECTOR_PARAGRAPH_STYLE_KEYS; exports.VectorTextError = VectorTextError; exports.fitVectorTextRuns = fitVectorTextRuns; exports.vectorTextRuns = vectorTextRuns; exports.vectorTextStyleAt = vectorTextStyleAt; exports.measureVectorPath = measureVectorPath; exports.vectorPathAt = vectorPathAt; exports.vectorPathTextPositions = vectorPathTextPositions; exports.layoutVectorText = layoutVectorText; exports.glyphBox = glyphBox; exports.vectorTextPaths = vectorTextPaths; exports.vectorTextPaintSource = vectorTextPaintSource; exports.vectorTextCaret = vectorTextCaret; exports.vectorTextIndexAt = vectorTextIndexAt; exports.vectorTextSelectionQuads = vectorTextSelectionQuads; exports.patchVectorCharacterStyle = patchVectorCharacterStyle; exports.patchVectorParagraphStyle = patchVectorParagraphStyle; exports.sanitizeVectorTextFrame = sanitizeVectorTextFrame; exports.normalizeVectorTextRuns = normalizeVectorTextRuns; exports.sanitizeVectorTextFields = sanitizeVectorTextFields; exports.vectorTextRange = vectorTextRange; exports.replaceVectorText = replaceVectorText; exports.styleVectorText = styleVectorText; exports.bakeVectorTextGeometry = bakeVectorTextGeometry; exports.vectorTextName = vectorTextName; exports.pathTextFrameFromBezier = pathTextFrameFromBezier; exports.vectorTextBoxOutline = vectorTextBoxOutline; exports.vectorTextSpans = vectorTextSpans; exports.vectorTextGeometryNode = vectorTextGeometryNode; exports.vectorTextSpanSvg = vectorTextSpanSvg; exports.VECTOR_SYMBOL_MAX_DEPTH = VECTOR_SYMBOL_MAX_DEPTH; exports.vectorSymbolsUsedIn = vectorSymbolsUsedIn; exports.vectorSymbolUses = vectorSymbolUses; exports.resolveVectorSymbols = resolveVectorSymbols; exports.stripVectorSymbolArt = stripVectorSymbolArt; exports.scaleVectorStrokeWidths = scaleVectorStrokeWidths; exports.tintVectorNode = tintVectorNode; exports.prefixVectorIds = prefixVectorIds; exports.vectorInstanceGroup = vectorInstanceGroup; exports.composeVectorMatrices = composeVectorMatrices; exports.WARP_STYLES = WARP_STYLES; exports.WARP_STYLE_LABELS = WARP_STYLE_LABELS; exports.warpPresetGrid = warpPresetGrid; exports.warpPresetMesh = warpPresetMesh; exports.warpMeshColumns = warpMeshColumns; exports.warpMeshRows = warpMeshRows; exports.isValidWarpMesh = isValidWarpMesh; exports.fitWarpMesh = fitWarpMesh; exports.identityWarpMesh = identityWarpMesh; exports.evalWarpMesh = evalWarpMesh; exports.splitWarpMeshU = splitWarpMeshU; exports.splitWarpMeshV = splitWarpMeshV; exports.removeWarpMeshSplitU = removeWarpMeshSplitU; exports.removeWarpMeshSplitV = removeWarpMeshSplitV; exports.mapWarpMeshPoints = mapWarpMeshPoints; exports.resizeWarpMesh = resizeWarpMesh; exports.warpMeshControlBounds = warpMeshControlBounds; exports.warpMeshParamAt = warpMeshParamAt; exports.dragWarpMeshPoint = dragWarpMeshPoint; exports.pullWarpMesh = pullWarpMesh; exports.warpMeshEditPoints = warpMeshEditPoints; exports.warpMeshGridCurves = warpMeshGridCurves; exports.vectorMeshFromOutline = vectorMeshFromOutline; exports.vectorMeshOutline = vectorMeshOutline; exports.VECTOR_EFFECT_DEFAULTS = VECTOR_EFFECT_DEFAULTS; exports.VECTOR_EFFECT_LABELS = VECTOR_EFFECT_LABELS; exports.VECTOR_EFFECT_PARAM_SPECS = VECTOR_EFFECT_PARAM_SPECS; exports.vectorEnvelopeMesh = vectorEnvelopeMesh; exports.vectorEnvelopeMap = vectorEnvelopeMap; exports.normalizeVectorEffectParams = normalizeVectorEffectParams; exports.createVectorEffect = createVectorEffect; exports.activeVectorEffects = activeVectorEffects; exports.hasOwnVectorAppearance = hasOwnVectorAppearance; exports.hasVectorAppearance = hasVectorAppearance; exports.isVectorLiveBoolean = isVectorLiveBoolean; exports.vectorOperandOperation = vectorOperandOperation; exports.vectorLiveBooleanSteps = vectorLiveBooleanSteps; exports.clearVectorLiveBooleanCache = clearVectorLiveBooleanCache; exports.foldVectorBooleanOperands = foldVectorBooleanOperands; exports.applyVectorEffects = applyVectorEffects; exports.vectorInstanceDrawn = vectorInstanceDrawn; exports.vectorChildAppearanceShapes = vectorChildAppearanceShapes; exports.vectorEffectInputPaths = vectorEffectInputPaths; exports.vectorEffectInputBounds = vectorEffectInputBounds; exports.vectorNodeEnvelope = vectorNodeEnvelope; exports.vectorEnvelopeFrame = vectorEnvelopeFrame; exports.vectorAppearanceShapes = vectorAppearanceShapes; exports.vectorAppearanceOutline = vectorAppearanceOutline; exports.vectorAppearanceNodes = vectorAppearanceNodes; exports.expandVectorAppearance = expandVectorAppearance; exports.expandVectorAppearances = expandVectorAppearances; exports.sanitizeVectorEffects = sanitizeVectorEffects; exports.transformVectorEffects = transformVectorEffects; exports.vectorEnteredGroups = vectorEnteredGroups; exports.isVectorConnector = isVectorConnector; exports.vectorConnectionSites = vectorConnectionSites; exports.nearestVectorConnectionSite = nearestVectorConnectionSite; exports.vectorConnectorWorldAnchors = vectorConnectorWorldAnchors; exports.routeVectorConnector = routeVectorConnector; exports.rerouteVectorConnectors = rerouteVectorConnectors; exports.sanitizeVectorConnector = sanitizeVectorConnector; exports.VECTOR_CONNECTOR_ROUTE_LABELS = VECTOR_CONNECTOR_ROUTE_LABELS; exports.VECTOR_CONNECTOR_SIDE_LABELS = VECTOR_CONNECTOR_SIDE_LABELS; exports.getVectorConnectorPanel = getVectorConnectorPanel; exports.vectorConnectorTargetAt = vectorConnectorTargetAt; exports.vectorStrokeGradientDefs = vectorStrokeGradientDefs; exports.vectorCornersAttribute = vectorCornersAttribute; exports.applyVectorCornersAttribute = applyVectorCornersAttribute; exports.vectorPathLocalBounds = vectorPathLocalBounds; exports.vectorPaintToSvg = vectorPaintToSvg; exports.vectorStrokeSvgParts = vectorStrokeSvgParts; exports.vectorNodeLocalPaintBounds = vectorNodeLocalPaintBounds; exports.vectorNodeFilterSvg = vectorNodeFilterSvg; exports.widthProfileToAttribute = widthProfileToAttribute; exports.widthProfileFromAttribute = widthProfileFromAttribute; exports.vectorDocumentToSvg = vectorDocumentToSvg; exports.parseSvgTransform = parseSvgTransform; exports.parseVectorSvg = parseVectorSvg; exports.VECTOR_SPATIAL_MIN = VECTOR_SPATIAL_MIN; exports.VectorRTree = VectorRTree; exports.vectorNodePaintBox = vectorNodePaintBox; exports.vectorSpatialIndex = vectorSpatialIndex; exports.vectorNodesNear = vectorNodesNear; exports.cloneAnchor = cloneAnchor; exports.cloneSubpath = cloneSubpath; exports.cloneVectorNode = cloneVectorNode; exports.cloneVectorDocument = cloneVectorDocument; exports.hasPaint = hasPaint; exports.subpathSegmentCount = subpathSegmentCount; exports.subpathSegment = subpathSegment; exports.subpathsToBezier = subpathsToBezier; exports.vectorNodeToBezier = vectorNodeToBezier; exports.vectorPathData = vectorPathData; exports.inferAnchorType = inferAnchorType; exports.bezierToSubpaths = bezierToSubpaths; exports.walkVectorNodes = walkVectorNodes; exports.findVectorNode = findVectorNode; exports.locateVectorNode = locateVectorNode; exports.collectPaintedNodes = collectPaintedNodes; exports.collectPathNodes = collectPathNodes; exports.nodeMatrix = nodeMatrix; exports.vectorPathWorldBezier = vectorPathWorldBezier; exports.vectorNodeBounds = vectorNodeBounds; exports.unionBounds = unionBounds; exports.boundsIntersect = boundsIntersect; exports.boundsFromPoints = boundsFromPoints; exports.hitTestVectorNode = hitTestVectorNode; exports.vectorStrokeOutline = vectorStrokeOutline; exports.hitTestVectorNodes = hitTestVectorNodes; exports.nearestSegment = nearestSegment; exports.transformVectorNode = transformVectorNode; exports.vectorNodeRotation = vectorNodeRotation; exports.vectorWorldMatrix = vectorWorldMatrix; exports.vectorParentMatrix = vectorParentMatrix; exports.translateAnchor = translateAnchor; exports.moveAnchorHandle = moveAnchorHandle; exports.convertAnchor = convertAnchor; exports.insertAnchor = insertAnchor; exports.removeAnchors = removeAnchors; exports.reverseSubpath = reverseSubpath; exports.KAPPA = KAPPA2; exports.rectSubpath = rectSubpath; exports.ellipseSubpath = ellipseSubpath; exports.polygonSubpath = polygonSubpath; exports.starSubpath = starSubpath; exports.lineSubpath = lineSubpath; exports.roundSubpaths = roundSubpaths;
9797
- //# sourceMappingURL=chunk-FODKPD44.cjs.map
9962
+
9963
+
9964
+
9965
+
9966
+
9967
+
9968
+
9969
+
9970
+ exports.isVectorMeshGradient = isVectorMeshGradient; exports.isVectorFreeformGradient = isVectorFreeformGradient; exports.isVectorShadedPaint = isVectorShadedPaint; exports.vectorRgbaToCss = vectorRgbaToCss; exports.VECTOR_MESH_MAX = VECTOR_MESH_MAX; exports.createVectorMeshGradient = createVectorMeshGradient; exports.vectorMeshPointAt = vectorMeshPointAt; exports.vectorMeshColorAt = vectorMeshColorAt; exports.vectorMeshLines = vectorMeshLines; exports.vectorFreeformSpreadScale = vectorFreeformSpreadScale; exports.vectorFreeformLineSegments = vectorFreeformLineSegments; exports.vectorFreeformField = vectorFreeformField; exports.sampleVectorFreeform = sampleVectorFreeform; exports.autoVectorFreeformGradient = autoVectorFreeformGradient; exports.vectorShadedSvgDefs = vectorShadedSvgDefs; exports.mapVectorShadedPaint = mapVectorShadedPaint; exports.transformVectorShadedPaint = transformVectorShadedPaint; exports.sanitizeVectorShadedPaint = sanitizeVectorShadedPaint; exports.removeVectorFreeformPoint = removeVectorFreeformPoint; exports.nearestVectorShadingPoint = nearestVectorShadingPoint; exports.VECTOR_CORNER_KINDS = VECTOR_CORNER_KINDS; exports.VECTOR_GRADIENT_TYPES = VECTOR_GRADIENT_TYPES; exports.VECTOR_GRADIENT_SPREADS = VECTOR_GRADIENT_SPREADS; exports.VECTOR_GRADIENT_INTERPOLATIONS = VECTOR_GRADIENT_INTERPOLATIONS; exports.VECTOR_STROKE_GRADIENT_MODES = VECTOR_STROKE_GRADIENT_MODES; exports.VECTOR_ARROWHEADS = VECTOR_ARROWHEADS; exports.VECTOR_BLEND_MODES = VECTOR_BLEND_MODES; exports.VECTOR_HORIZONTAL_RESIZING = VECTOR_HORIZONTAL_RESIZING; exports.VECTOR_VERTICAL_RESIZING = VECTOR_VERTICAL_RESIZING; exports.VECTOR_CONNECTOR_SIDES = VECTOR_CONNECTOR_SIDES; exports.VECTOR_CONNECTOR_ROUTES = VECTOR_CONNECTOR_ROUTES; exports.VECTOR_BLEND_SPACINGS = VECTOR_BLEND_SPACINGS; exports.VECTOR_MASK_TYPES = VECTOR_MASK_TYPES; exports.VECTOR_SYMMETRY_MODES = VECTOR_SYMMETRY_MODES; exports.VECTOR_TEXT_ALIGNS = VECTOR_TEXT_ALIGNS; exports.VECTOR_PATH_TEXT_BASELINES = VECTOR_PATH_TEXT_BASELINES; exports.VECTOR_CONSTRAINT_KINDS = VECTOR_CONSTRAINT_KINDS; exports.VECTOR_TOOLS = VECTOR_TOOLS; exports.VECTOR_TRANSFORM_HANDLES = VECTOR_TRANSFORM_HANDLES; exports.VECTOR_PATHFINDER_OPERATIONS = VECTOR_PATHFINDER_OPERATIONS; exports.VECTOR_EFFECT_TYPES = VECTOR_EFFECT_TYPES; exports.VECTOR_MERGE_MODES = VECTOR_MERGE_MODES; exports.VECTOR_FILTER_TYPES = VECTOR_FILTER_TYPES; exports.isVectorGradient = isVectorGradient; exports.parseVectorColor = parseVectorColor; exports.VECTOR_GRADIENT_MIN_STOPS = VECTOR_GRADIENT_MIN_STOPS; exports.gradientMidpointRemap = gradientMidpointRemap; exports.sortedVectorGradientStops = sortedVectorGradientStops; exports.vectorGradientNeedsExpansion = vectorGradientNeedsExpansion; exports.vectorGradientRamp = vectorGradientRamp; exports.sampleVectorGradient = sampleVectorGradient; exports.expandVectorGradientStops = expandVectorGradientStops; exports.samplePlainStops = samplePlainStops; exports.reverseVectorGradient = reverseVectorGradient; exports.insertVectorGradientStop = insertVectorGradientStop; exports.moveVectorGradientStop = moveVectorGradientStop; exports.removeVectorGradientStop = removeVectorGradientStop; exports.vectorGradientMidpointPosition = vectorGradientMidpointPosition; exports.vectorGradientMidpointFromPosition = vectorGradientMidpointFromPosition; exports.spanVectorGradientStops = spanVectorGradientStops; exports.hasExplicitGradientGeometry = hasExplicitGradientGeometry; exports.vectorGradientPoints = vectorGradientPoints; exports.vectorBoxMatrix = vectorBoxMatrix; exports.vectorGradientUnitsMatrix = vectorGradientUnitsMatrix; exports.vectorGradientMatrix = vectorGradientMatrix; exports.vectorGradientFocalParam = vectorGradientFocalParam; exports.vectorGradientParam = vectorGradientParam; exports.applyVectorGradientSpread = applyVectorGradientSpread; exports.vectorGradientTAt = vectorGradientTAt; exports.sampleVectorGradientAt = sampleVectorGradientAt; exports.vectorGradientAspect = vectorGradientAspect; exports.explicitVectorGradient = explicitVectorGradient; exports.pinVectorGradient = pinVectorGradient; exports.transformVectorGradient = transformVectorGradient; exports.mapVectorGradient = mapVectorGradient; exports.mapVectorPaint = mapVectorPaint; exports.transformVectorPaint = transformVectorPaint; exports.isCentredVectorGradient = isCentredVectorGradient; exports.vectorGradientHandles = vectorGradientHandles; exports.moveVectorGradientHandle = moveVectorGradientHandle; exports.setVectorGradientVector = setVectorGradientVector; exports.VECTOR_GRADIENT_MAX_PERIODS = VECTOR_GRADIENT_MAX_PERIODS; exports.periodicVectorGradientStops = periodicVectorGradientStops; exports.expandVectorGradientSpread = expandVectorGradientSpread; exports.vectorGradientArea = vectorGradientArea; exports.patternAttrs = patternAttrs; exports.vectorGradientSvgDefs = vectorGradientSvgDefs; exports.sampleVectorPaintDefAt = sampleVectorPaintDefAt; exports.sanitizeVectorGradient = sanitizeVectorGradient; exports.convertVectorGradient = convertVectorGradient; exports.defaultVectorGradient = defaultVectorGradient; exports.applyVectorGradientPatch = applyVectorGradientPatch; exports.IDENTITY_MATRIX = IDENTITY_MATRIX; exports.multiplyMatrices = multiplyMatrices; exports.translateMatrix = translateMatrix; exports.scaleMatrix = scaleMatrix; exports.rotateMatrix = rotateMatrix; exports.matrixAbout = matrixAbout; exports.skewMatrix = skewMatrix; exports.applyMatrix = applyMatrix; exports.isIdentityMatrix = isIdentityMatrix; exports.invertMatrix = invertMatrix; exports.applyMatrixLinear = applyMatrixLinear; exports.matrixRotation = matrixRotation; exports.decomposeRigid = decomposeRigid; exports.isVectorSymmetryGroup = isVectorSymmetryGroup; exports.vectorSymmetryMatrices = vectorSymmetryMatrices; exports.vectorSymmetryDrawn = vectorSymmetryDrawn; exports.vectorSymmetryAxes = vectorSymmetryAxes; exports.sanitizeVectorSymmetry = sanitizeVectorSymmetry; exports.VECTOR_SYMMETRY_MODE_LABELS = VECTOR_SYMMETRY_MODE_LABELS; exports.transformVectorSymmetry = transformVectorSymmetry; exports.vectorCornerAt = vectorCornerAt; exports.vectorCorners = vectorCorners; exports.cornerSetback = cornerSetback; exports.fitCornerRadius = fitCornerRadius; exports.cornerBisectorPoint = cornerBisectorPoint; exports.cornerRadiusChange = cornerRadiusChange; exports.hasVectorCorners = hasVectorCorners; exports.expandVectorCornersOf = expandVectorCornersOf; exports.expandVectorCorners = expandVectorCorners; exports.setAnchorCorner = setAnchorCorner; exports.nextVectorCornerKind = nextVectorCornerKind; exports.setSubpathCorners = setSubpathCorners; exports.VECTOR_WIDTH_PROFILE_MAX_POINTS = VECTOR_WIDTH_PROFILE_MAX_POINTS; exports.VECTOR_WIDTH_PROFILE_MAX_SCALE = VECTOR_WIDTH_PROFILE_MAX_SCALE; exports.VECTOR_WIDTH_SAME_T = VECTOR_WIDTH_SAME_T; exports.VECTOR_WIDTH_PRESETS = VECTOR_WIDTH_PRESETS; exports.VECTOR_WIDTH_PRESET_IDS = VECTOR_WIDTH_PRESET_IDS; exports.sanitizeWidthProfile = sanitizeWidthProfile; exports.isUniformWidthProfile = isUniformWidthProfile; exports.widthProfileAt = widthProfileAt; exports.widthProfileMaxScale = widthProfileMaxScale; exports.widthProfilePreset = widthProfilePreset; exports.widthProfilePresetId = widthProfilePresetId; exports.reverseWidthProfile = reverseWidthProfile; exports.mirrorWidthProfile = mirrorWidthProfile; exports.insertWidthPoint = insertWidthPoint; exports.setWidthPoint = setWidthPoint; exports.removeWidthPoints = removeWidthPoints; exports.taperWaveFactor = taperWaveFactor; exports.generateWidthProfile = generateWidthProfile; exports.VECTOR_PRESSURE_NOMINAL = VECTOR_PRESSURE_NOMINAL; exports.pressureWidthProfile = pressureWidthProfile; exports.dashIntervals = dashIntervals; exports.variableStrokeRings = variableStrokeRings; exports.variableStrokeOutline = variableStrokeOutline; exports.nearestStrokePosition = nearestStrokePosition; exports.strokePositionPoint = strokePositionPoint; exports.isClosedBezierShape = isClosedBezierShape; exports.effectiveStrokeAlign = effectiveStrokeAlign; exports.strokeWidthProfileOf = strokeWidthProfileOf; exports.hasStrokeExtras = hasStrokeExtras; exports.vectorStrokeLineArea = vectorStrokeLineArea; exports.arrowheadWeight = arrowheadWeight; exports.arrowheadInset = arrowheadInset; exports.arrowheadPath = arrowheadPath; exports.vectorStrokeParts = vectorStrokeParts; exports.vectorStrokeOutlinePath = vectorStrokeOutlinePath; exports.hitTestVectorStroke = hitTestVectorStroke; exports.vectorStrokeReach = vectorStrokeReach; exports.VECTOR_STROKE_SETTING_KEYS = VECTOR_STROKE_SETTING_KEYS; exports.VECTOR_BLEND_MODE_LABELS = VECTOR_BLEND_MODE_LABELS; exports.isVectorBlendMode = isVectorBlendMode; exports.vectorBlendModeCss = vectorBlendModeCss; exports.vectorBlendModeFromCss = vectorBlendModeFromCss; exports.isPlainVectorPaintLayer = isPlainVectorPaintLayer; exports.isDrawnVectorPaintLayer = isDrawnVectorPaintLayer; exports.vectorFills = vectorFills; exports.vectorStrokeSettings = vectorStrokeSettings; exports.vectorStrokes = vectorStrokes; exports.hasVectorPaintStacks = hasVectorPaintStacks; exports.withVectorFills = withVectorFills; exports.withVectorStrokes = withVectorStrokes; exports.normalizeVectorPaintStacks = normalizeVectorPaintStacks; exports.sanitizeVectorFills = sanitizeVectorFills; exports.sanitizeVectorStrokeSettings = sanitizeVectorStrokeSettings; exports.sanitizeVectorStrokes = sanitizeVectorStrokes; exports.vectorPaintLayerNodes = vectorPaintLayerNodes; exports.needsVectorPaintLayers = needsVectorPaintLayers; exports.vectorStrokeStackReach = vectorStrokeStackReach; exports.hitTestVectorPaintLayer = hitTestVectorPaintLayer; exports.hitTestVectorPaintStack = hitTestVectorPaintStack; exports.vectorStacksHaveGradient = vectorStacksHaveGradient; exports.newVectorStrokeLayer = newVectorStrokeLayer; exports.vectorTargetPaint = vectorTargetPaint; exports.withVectorTargetPaint = withVectorTargetPaint; exports.effectPathLength = effectPathLength; exports.effectPathVertexCount = effectPathVertexCount; exports.trimIntervals = trimIntervals; exports.trimPaths = trimPaths; exports.trimPathsIndividually = trimPathsIndividually; exports.puckerBloatPaths = puckerBloatPaths; exports.roundCornerPaths = roundCornerPaths; exports.offsetPaths = offsetPaths; exports.twistPaths = twistPaths; exports.zigzagPaths = zigzagPaths; exports.wigglePaths = wigglePaths; exports.mergePaths = mergePaths; exports.vectorRepeaterCopies = vectorRepeaterCopies; exports.repeatPaths = repeatPaths; exports.pathsCenter = pathsCenter; exports.mapVectorPoints = mapVectorPoints; exports.mapVectorSubpaths = mapVectorSubpaths; exports.mapBezierPath = mapBezierPath; exports.isVectorFrame = isVectorFrame; exports.vectorFrameRectPath = vectorFrameRectPath; exports.vectorFrameDrawn = vectorFrameDrawn; exports.vectorFrameContains = vectorFrameContains; exports.vectorFrameChildMatrix = vectorFrameChildMatrix; exports.sanitizeVectorFrame = sanitizeVectorFrame; exports.sanitizeVectorResizing = sanitizeVectorResizing; exports.VECTOR_HORIZONTAL_RESIZING_LABELS = VECTOR_HORIZONTAL_RESIZING_LABELS; exports.VECTOR_VERTICAL_RESIZING_LABELS = VECTOR_VERTICAL_RESIZING_LABELS; exports.vectorBoundsInside = vectorBoundsInside; exports.vectorArtboards = vectorArtboards; exports.vectorFrameDocument = vectorFrameDocument; exports.getVectorFramePanel = getVectorFramePanel; exports.splitIntoFaces = splitIntoFaces; exports.knifePath = knifePath; exports.eraserRegion = eraserRegion; exports.eraseFromFill = eraseFromFill; exports.eraseFromOutline = eraseFromOutline; exports.polylineBounds = polylineBounds; exports.simplifyPolyline = simplifyPolyline; exports.VECTOR_FILTER_DEFAULTS = VECTOR_FILTER_DEFAULTS; exports.VECTOR_FILTER_LABELS = VECTOR_FILTER_LABELS; exports.VECTOR_FILTER_PARAM_SPECS = VECTOR_FILTER_PARAM_SPECS; exports.isVectorFilterType = isVectorFilterType; exports.normalizeVectorFilterParams = normalizeVectorFilterParams; exports.vectorFilterParamKeys = vectorFilterParamKeys; exports.createVectorFilter = createVectorFilter; exports.sanitizeVectorFilters = sanitizeVectorFilters; exports.activeVectorFilters = activeVectorFilters; exports.vectorFilterReach = vectorFilterReach; exports.vectorFilterSvg = vectorFilterSvg; exports.vectorFilterMarkup = vectorFilterMarkup; exports.VECTOR_FILTER_MENU = VECTOR_FILTER_MENU; exports.isVectorMaskType = isVectorMaskType; exports.sanitizeVectorMask = sanitizeVectorMask; exports.isVectorMaskGroup = isVectorMaskGroup; exports.isVectorMaskActive = isVectorMaskActive; exports.vectorMaskSource = vectorMaskSource; exports.vectorMaskContents = vectorMaskContents; exports.vectorMaskOwner = vectorMaskOwner; exports.vectorMaskSummary = vectorMaskSummary; exports.vectorMaskRegionShapes = vectorMaskRegionShapes; exports.vectorMaskRegion = vectorMaskRegion; exports.vectorMaskRegionPath = vectorMaskRegionPath; exports.vectorMaskContains = vectorMaskContains; exports.vectorMaskedShapes = vectorMaskedShapes; exports.vectorMaskedGeometry = vectorMaskedGeometry; exports.vectorMaskedLocalBounds = vectorMaskedLocalBounds; exports.vectorMaskContentBounds = vectorMaskContentBounds; exports.vectorMaskRenderData = vectorMaskRenderData; exports.DEFAULT_TEXT_STYLE = DEFAULT_TEXT_STYLE; exports.DEFAULT_AUTO_LEADING = DEFAULT_AUTO_LEADING; exports.fitRuns = fitRuns; exports.styleAt = styleAt; exports.restyleRange = restyleRange; exports.spliceRuns = spliceRuns; exports.paragraphRanges = paragraphRanges; exports.fitParagraphRuns = fitParagraphRuns; exports.fontOf = fontOf; exports.isTextSpace = isTextSpace; exports.layoutText = layoutText; exports.textIndexAt = textIndexAt; exports.caretAt = caretAt; exports.textDecorations = textDecorations; exports.textRectPath = textRectPath; exports.textFragmentOutline = textFragmentOutline; exports.cssFontFamily = cssFontFamily; exports.cssFont = cssFont; exports.createCanvasTextShaper = createCanvasTextShaper; exports.createOutlineTextShaper = createOutlineTextShaper; exports.createMetricTextShaper = createMetricTextShaper; exports.setVectorTextShaper = setVectorTextShaper; exports.getVectorTextShaper = getVectorTextShaper; exports.vectorTextShaperGeneration = vectorTextShaperGeneration; exports.vectorTextHasOutlines = vectorTextHasOutlines; exports.vectorTextFamilies = vectorTextFamilies; exports.DEFAULT_VECTOR_FONT = DEFAULT_VECTOR_FONT; exports.VECTOR_CHARACTER_STYLE_KEYS = VECTOR_CHARACTER_STYLE_KEYS; exports.VECTOR_PARAGRAPH_STYLE_KEYS = VECTOR_PARAGRAPH_STYLE_KEYS; exports.VectorTextError = VectorTextError; exports.fitVectorTextRuns = fitVectorTextRuns; exports.vectorTextRuns = vectorTextRuns; exports.vectorTextStyleAt = vectorTextStyleAt; exports.measureVectorPath = measureVectorPath; exports.vectorPathAt = vectorPathAt; exports.vectorPathTextPositions = vectorPathTextPositions; exports.layoutVectorText = layoutVectorText; exports.glyphBox = glyphBox; exports.vectorTextPaths = vectorTextPaths; exports.vectorTextPaintSource = vectorTextPaintSource; exports.vectorTextCaret = vectorTextCaret; exports.vectorTextIndexAt = vectorTextIndexAt; exports.vectorTextSelectionQuads = vectorTextSelectionQuads; exports.patchVectorCharacterStyle = patchVectorCharacterStyle; exports.patchVectorParagraphStyle = patchVectorParagraphStyle; exports.sanitizeVectorTextFrame = sanitizeVectorTextFrame; exports.normalizeVectorTextRuns = normalizeVectorTextRuns; exports.sanitizeVectorTextFields = sanitizeVectorTextFields; exports.vectorTextRange = vectorTextRange; exports.replaceVectorText = replaceVectorText; exports.styleVectorText = styleVectorText; exports.bakeVectorTextGeometry = bakeVectorTextGeometry; exports.vectorTextName = vectorTextName; exports.pathTextFrameFromBezier = pathTextFrameFromBezier; exports.vectorTextBoxOutline = vectorTextBoxOutline; exports.vectorTextSpans = vectorTextSpans; exports.vectorTextGeometryNode = vectorTextGeometryNode; exports.vectorTextSpanSvg = vectorTextSpanSvg; exports.VECTOR_SYMBOL_MAX_DEPTH = VECTOR_SYMBOL_MAX_DEPTH; exports.vectorSymbolsUsedIn = vectorSymbolsUsedIn; exports.vectorSymbolUses = vectorSymbolUses; exports.resolveVectorSymbols = resolveVectorSymbols; exports.stripVectorSymbolArt = stripVectorSymbolArt; exports.scaleVectorStrokeWidths = scaleVectorStrokeWidths; exports.tintVectorNode = tintVectorNode; exports.prefixVectorIds = prefixVectorIds; exports.vectorInstanceGroup = vectorInstanceGroup; exports.composeVectorMatrices = composeVectorMatrices; exports.WARP_STYLES = WARP_STYLES; exports.WARP_STYLE_LABELS = WARP_STYLE_LABELS; exports.warpPresetGrid = warpPresetGrid; exports.warpPresetMesh = warpPresetMesh; exports.warpMeshColumns = warpMeshColumns; exports.warpMeshRows = warpMeshRows; exports.isValidWarpMesh = isValidWarpMesh; exports.fitWarpMesh = fitWarpMesh; exports.identityWarpMesh = identityWarpMesh; exports.evalWarpMesh = evalWarpMesh; exports.splitWarpMeshU = splitWarpMeshU; exports.splitWarpMeshV = splitWarpMeshV; exports.removeWarpMeshSplitU = removeWarpMeshSplitU; exports.removeWarpMeshSplitV = removeWarpMeshSplitV; exports.mapWarpMeshPoints = mapWarpMeshPoints; exports.resizeWarpMesh = resizeWarpMesh; exports.warpMeshControlBounds = warpMeshControlBounds; exports.warpMeshParamAt = warpMeshParamAt; exports.dragWarpMeshPoint = dragWarpMeshPoint; exports.pullWarpMesh = pullWarpMesh; exports.warpMeshEditPoints = warpMeshEditPoints; exports.warpMeshGridCurves = warpMeshGridCurves; exports.vectorMeshFromOutline = vectorMeshFromOutline; exports.vectorMeshOutline = vectorMeshOutline; exports.VECTOR_EFFECT_DEFAULTS = VECTOR_EFFECT_DEFAULTS; exports.VECTOR_EFFECT_LABELS = VECTOR_EFFECT_LABELS; exports.VECTOR_EFFECT_PARAM_SPECS = VECTOR_EFFECT_PARAM_SPECS; exports.vectorEnvelopeMesh = vectorEnvelopeMesh; exports.vectorEnvelopeMap = vectorEnvelopeMap; exports.normalizeVectorEffectParams = normalizeVectorEffectParams; exports.createVectorEffect = createVectorEffect; exports.activeVectorEffects = activeVectorEffects; exports.hasOwnVectorAppearance = hasOwnVectorAppearance; exports.hasVectorAppearance = hasVectorAppearance; exports.isVectorLiveBoolean = isVectorLiveBoolean; exports.vectorOperandOperation = vectorOperandOperation; exports.vectorLiveBooleanSteps = vectorLiveBooleanSteps; exports.clearVectorLiveBooleanCache = clearVectorLiveBooleanCache; exports.foldVectorBooleanOperands = foldVectorBooleanOperands; exports.applyVectorEffects = applyVectorEffects; exports.vectorInstanceDrawn = vectorInstanceDrawn; exports.vectorChildAppearanceShapes = vectorChildAppearanceShapes; exports.vectorEffectInputPaths = vectorEffectInputPaths; exports.vectorEffectInputBounds = vectorEffectInputBounds; exports.vectorNodeEnvelope = vectorNodeEnvelope; exports.vectorEnvelopeFrame = vectorEnvelopeFrame; exports.vectorAppearanceShapes = vectorAppearanceShapes; exports.vectorAppearanceOutline = vectorAppearanceOutline; exports.vectorAppearanceNodes = vectorAppearanceNodes; exports.expandVectorAppearance = expandVectorAppearance; exports.expandVectorAppearances = expandVectorAppearances; exports.sanitizeVectorEffects = sanitizeVectorEffects; exports.transformVectorEffects = transformVectorEffects; exports.vectorEnteredGroups = vectorEnteredGroups; exports.isVectorConnector = isVectorConnector; exports.vectorConnectionSites = vectorConnectionSites; exports.nearestVectorConnectionSite = nearestVectorConnectionSite; exports.vectorConnectorWorldAnchors = vectorConnectorWorldAnchors; exports.routeVectorConnector = routeVectorConnector; exports.rerouteVectorConnectors = rerouteVectorConnectors; exports.sanitizeVectorConnector = sanitizeVectorConnector; exports.VECTOR_CONNECTOR_ROUTE_LABELS = VECTOR_CONNECTOR_ROUTE_LABELS; exports.VECTOR_CONNECTOR_SIDE_LABELS = VECTOR_CONNECTOR_SIDE_LABELS; exports.getVectorConnectorPanel = getVectorConnectorPanel; exports.vectorConnectorTargetAt = vectorConnectorTargetAt; exports.vectorStrokeGradientDefs = vectorStrokeGradientDefs; exports.vectorCornersAttribute = vectorCornersAttribute; exports.applyVectorCornersAttribute = applyVectorCornersAttribute; exports.vectorPathLocalBounds = vectorPathLocalBounds; exports.vectorPaintToSvg = vectorPaintToSvg; exports.vectorStrokeSvgParts = vectorStrokeSvgParts; exports.vectorNodeLocalPaintBounds = vectorNodeLocalPaintBounds; exports.vectorNodeFilterSvg = vectorNodeFilterSvg; exports.widthProfileToAttribute = widthProfileToAttribute; exports.widthProfileFromAttribute = widthProfileFromAttribute; exports.vectorDocumentToSvg = vectorDocumentToSvg; exports.parseSvgTransform = parseSvgTransform; exports.parseVectorSvg = parseVectorSvg; exports.VECTOR_SPATIAL_MIN = VECTOR_SPATIAL_MIN; exports.VectorRTree = VectorRTree; exports.vectorNodePaintBox = vectorNodePaintBox; exports.vectorSpatialIndex = vectorSpatialIndex; exports.vectorNodesNear = vectorNodesNear; exports.cloneAnchor = cloneAnchor; exports.cloneSubpath = cloneSubpath; exports.cloneVectorNode = cloneVectorNode; exports.cloneVectorDocument = cloneVectorDocument; exports.hasPaint = hasPaint; exports.subpathSegmentCount = subpathSegmentCount; exports.subpathSegment = subpathSegment; exports.subpathsToBezier = subpathsToBezier; exports.vectorNodeToBezier = vectorNodeToBezier; exports.vectorPathData = vectorPathData; exports.inferAnchorType = inferAnchorType; exports.bezierToSubpaths = bezierToSubpaths; exports.walkVectorNodes = walkVectorNodes; exports.findVectorNode = findVectorNode; exports.locateVectorNode = locateVectorNode; exports.collectPaintedNodes = collectPaintedNodes; exports.collectPathNodes = collectPathNodes; exports.nodeMatrix = nodeMatrix; exports.vectorPathWorldBezier = vectorPathWorldBezier; exports.vectorNodeBounds = vectorNodeBounds; exports.unionBounds = unionBounds; exports.boundsIntersect = boundsIntersect; exports.boundsFromPoints = boundsFromPoints; exports.hitTestVectorNode = hitTestVectorNode; exports.vectorStrokeOutline = vectorStrokeOutline; exports.hitTestVectorNodes = hitTestVectorNodes; exports.nearestSegment = nearestSegment; exports.transformVectorNode = transformVectorNode; exports.vectorNodeRotation = vectorNodeRotation; exports.vectorWorldMatrix = vectorWorldMatrix; exports.vectorParentMatrix = vectorParentMatrix; exports.translateAnchor = translateAnchor; exports.moveAnchorHandle = moveAnchorHandle; exports.convertAnchor = convertAnchor; exports.insertAnchor = insertAnchor; exports.removeAnchors = removeAnchors; exports.reverseSubpath = reverseSubpath; exports.KAPPA = KAPPA2; exports.rectSubpath = rectSubpath; exports.ellipseSubpath = ellipseSubpath; exports.polygonSubpath = polygonSubpath; exports.starSubpath = starSubpath; exports.lineSubpath = lineSubpath; exports.roundSubpaths = roundSubpaths;
9971
+ //# sourceMappingURL=chunk-LI3KTY7K.cjs.map