@pixerate/editor 0.270.0 → 0.272.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 (77) hide show
  1. package/dist/animation-editor/index.cjs +62 -62
  2. package/dist/animation-editor/index.js +5 -5
  3. package/dist/brushes/index.cjs +69 -66
  4. package/dist/brushes/index.js +6 -3
  5. package/dist/brushes/patch.d.cts +1 -1
  6. package/dist/brushes/patch.d.ts +1 -1
  7. package/dist/brushes/schema.d.cts +1 -0
  8. package/dist/brushes/schema.d.ts +1 -0
  9. package/dist/brushes/types.d.cts +8 -0
  10. package/dist/brushes/types.d.ts +8 -0
  11. package/dist/{brushstrokeRender-WR2N5HHY.cjs → brushstrokeRender-5YBCLFDQ.cjs} +15 -15
  12. package/dist/{brushstrokeRender-A727TTNQ.js → brushstrokeRender-DZGFU3J4.js} +3 -3
  13. package/dist/canvas/index.cjs +15 -15
  14. package/dist/canvas/index.js +2 -2
  15. package/dist/{chunk-THBJHPUL.js → chunk-2F3YDXCN.js} +1 -1
  16. package/dist/{chunk-4CPOKP27.js → chunk-2XDNF73E.js} +1 -1
  17. package/dist/{chunk-3KNQ2W6X.cjs → chunk-3JKCREEU.cjs} +59 -53
  18. package/dist/{chunk-4YSPQGZW.js → chunk-5HP2VSAS.js} +1 -1
  19. package/dist/{chunk-BPJSI4NT.cjs → chunk-7W2EQQBP.cjs} +2 -2
  20. package/dist/{chunk-LETF75CA.js → chunk-CLB2I2FU.js} +1 -1
  21. package/dist/{chunk-BAZMCFVL.js → chunk-DZVRH63Y.js} +1 -1
  22. package/dist/{chunk-PY4GWSE2.cjs → chunk-EBFPMSJO.cjs} +27 -5
  23. package/dist/{chunk-VBRHE4AM.cjs → chunk-FXVCB6YG.cjs} +35 -35
  24. package/dist/{chunk-EU2ZZA6L.cjs → chunk-GHGBIAWQ.cjs} +126 -39
  25. package/dist/{chunk-CBVNCWJM.cjs → chunk-LBDC5434.cjs} +2 -2
  26. package/dist/{chunk-2WOGXEDX.cjs → chunk-M3RZOF3G.cjs} +1 -1
  27. package/dist/{chunk-GSTSZPSR.js → chunk-N3SKPQEH.js} +225 -18
  28. package/dist/{chunk-J5VQYK7T.cjs → chunk-N5IMDAHM.cjs} +251 -44
  29. package/dist/{chunk-ININNHLM.js → chunk-NAHJV3O6.js} +11 -5
  30. package/dist/{chunk-MWUZCEFT.js → chunk-S2XPXA47.js} +1 -1
  31. package/dist/{chunk-56RHCIJV.cjs → chunk-SNAFFCAX.cjs} +296 -203
  32. package/dist/{chunk-EHLOCVWB.js → chunk-T2URHAJX.js} +27 -5
  33. package/dist/{chunk-BENSE3VX.cjs → chunk-TNLKFW7D.cjs} +23 -23
  34. package/dist/{chunk-KZI3YWKW.js → chunk-UXYCY3HP.js} +93 -6
  35. package/dist/{chunk-4NMPUJUK.cjs → chunk-YJANF2BL.cjs} +86 -86
  36. package/dist/{chunk-FUDP5QBB.js → chunk-ZEI7ZEA4.js} +101 -8
  37. package/dist/effects/index.cjs +5 -2
  38. package/dist/effects/index.js +4 -1
  39. package/dist/effects/pool.d.cts +9 -0
  40. package/dist/effects/pool.d.ts +9 -0
  41. package/dist/effects/types.d.cts +2 -0
  42. package/dist/effects/types.d.ts +2 -0
  43. package/dist/image-editor/index.cjs +791 -791
  44. package/dist/image-editor/index.js +6 -6
  45. package/dist/paint/index.cjs +2 -2
  46. package/dist/paint/index.js +1 -1
  47. package/dist/paint/wet/world.d.cts +37 -1
  48. package/dist/paint/wet/world.d.ts +37 -1
  49. package/dist/paint-editor/brush-controls.d.cts +2 -0
  50. package/dist/paint-editor/brush-controls.d.ts +2 -0
  51. package/dist/paint-editor/brush-model.d.cts +14 -1
  52. package/dist/paint-editor/brush-model.d.ts +14 -1
  53. package/dist/paint-editor/controller.d.cts +75 -4
  54. package/dist/paint-editor/controller.d.ts +75 -4
  55. package/dist/paint-editor/effect-paint.d.cts +33 -8
  56. package/dist/paint-editor/effect-paint.d.ts +33 -8
  57. package/dist/paint-editor/effects.d.cts +4 -0
  58. package/dist/paint-editor/effects.d.ts +4 -0
  59. package/dist/paint-editor/index.cjs +814 -483
  60. package/dist/paint-editor/index.js +408 -77
  61. package/dist/paint-editor/stroke.d.cts +13 -5
  62. package/dist/paint-editor/stroke.d.ts +13 -5
  63. package/dist/paint-editor/ui.d.cts +1 -1
  64. package/dist/paint-editor/ui.d.ts +1 -1
  65. package/dist/paint-editor/wet.d.cts +8 -1
  66. package/dist/paint-editor/wet.d.ts +8 -1
  67. package/dist/vector/index.cjs +999 -999
  68. package/dist/vector/index.js +5 -5
  69. package/dist/video-editor/index.cjs +317 -317
  70. package/dist/video-editor/index.js +2 -2
  71. package/package.json +1 -1
  72. package/skills/pixerate-brushes/SKILL.md +1 -0
  73. package/skills/pixerate-paint-editor/SKILL.md +6 -13
  74. package/skills/pixerate-paint-editor/references/brush-facets.md +1 -0
  75. package/skills/pixerate-paint-editor/references/effect-paint.md +28 -6
  76. package/skills/pixerate-paint-editor/references/ghost.md +47 -0
  77. package/skills/pixerate-paint-watercolour/SKILL.md +1 -0
@@ -8,7 +8,7 @@
8
8
 
9
9
 
10
10
 
11
- var _chunkEU2ZZA6Lcjs = require('./chunk-EU2ZZA6L.cjs');
11
+ var _chunkGHGBIAWQcjs = require('./chunk-GHGBIAWQ.cjs');
12
12
 
13
13
 
14
14
 
@@ -73,7 +73,8 @@ var _chunkJBZRVLXVcjs = require('./chunk-JBZRVLXV.cjs');
73
73
 
74
74
 
75
75
 
76
- var _chunkJ5VQYK7Tcjs = require('./chunk-J5VQYK7T.cjs');
76
+
77
+ var _chunkN5IMDAHMcjs = require('./chunk-N5IMDAHM.cjs');
77
78
 
78
79
 
79
80
 
@@ -2601,13 +2602,76 @@ function vectorExtrudeFaces(path, params) {
2601
2602
  // src/paint-editor/effect-paint.ts
2602
2603
  var EFFECT_STRIP_HEIGHT = 256;
2603
2604
  var EFFECT_MAP_REPEATS = ["repeat", "mirror", "clamp"];
2605
+ var MAX_EFFECT_PATH_POINTS = 256;
2606
+ var roundPathCoord = (v2) => Math.round(v2 * 100) / 100;
2607
+ function strokePathPoints(points, maxPoints = MAX_EFFECT_PATH_POINTS) {
2608
+ if (!points.length) return [];
2609
+ const clean2 = [points[0]];
2610
+ for (let i = 1; i < points.length; i++) {
2611
+ const p = points[i];
2612
+ const prev = clean2[clean2.length - 1];
2613
+ if (p.x !== prev.x || p.y !== prev.y) clean2.push(p);
2614
+ }
2615
+ if (clean2.length === 1) {
2616
+ const x = roundPathCoord(clean2[0].x);
2617
+ const y = roundPathCoord(clean2[0].y);
2618
+ return [x, y, x, y];
2619
+ }
2620
+ if (clean2.length <= maxPoints) {
2621
+ const out2 = [];
2622
+ for (const p of clean2) out2.push(roundPathCoord(p.x), roundPathCoord(p.y));
2623
+ return out2;
2624
+ }
2625
+ const lengths = [0];
2626
+ for (let i = 1; i < clean2.length; i++) {
2627
+ lengths.push(lengths[i - 1] + Math.hypot(clean2[i].x - clean2[i - 1].x, clean2[i].y - clean2[i - 1].y));
2628
+ }
2629
+ const total = lengths[lengths.length - 1];
2630
+ if (total <= 0) {
2631
+ const x = roundPathCoord(clean2[0].x);
2632
+ const y = roundPathCoord(clean2[0].y);
2633
+ return [x, y, x, y];
2634
+ }
2635
+ const out = [];
2636
+ let j = 0;
2637
+ for (let k = 0; k < maxPoints; k++) {
2638
+ const at2 = total * k / (maxPoints - 1);
2639
+ while (j < clean2.length - 2 && lengths[j + 1] < at2) j++;
2640
+ const span = lengths[j + 1] - lengths[j] || 1;
2641
+ const f = Math.min(1, Math.max(0, (at2 - lengths[j]) / span));
2642
+ const a = clean2[j];
2643
+ const b = clean2[j + 1];
2644
+ out.push(roundPathCoord(a.x + (b.x - a.x) * f), roundPathCoord(a.y + (b.y - a.y) * f));
2645
+ }
2646
+ return out;
2647
+ }
2648
+ function inferEffectPathControl(values) {
2649
+ if ("path" in values) return "path";
2650
+ for (const [k, v2] of Object.entries(values)) {
2651
+ if (Array.isArray(v2) && v2.length >= 4 && v2.every((n) => typeof n === "number")) return k;
2652
+ }
2653
+ for (const [k, v2] of Object.entries(values)) {
2654
+ if (typeof v2 === "string") return k;
2655
+ }
2656
+ return "path";
2657
+ }
2658
+ function withStrokePath(paint, points, control) {
2659
+ if (_optionalChain([paint, 'access', _55 => _55.map, 'optionalAccess', _56 => _56.by]) !== "path") return paint;
2660
+ const key = _nullishCoalesce(control, () => ( inferEffectPathControl(paint.values)));
2661
+ return {
2662
+ ...paint,
2663
+ values: { ...paint.values, [key]: strokePathPoints(points) }
2664
+ };
2665
+ }
2604
2666
  function effectPaintSize(p, canvas) {
2605
- return p.map ? { width: p.map.length, height: EFFECT_STRIP_HEIGHT } : { width: canvas.width, height: canvas.height };
2667
+ return _optionalChain([p, 'access', _57 => _57.map, 'optionalAccess', _58 => _58.by]) === "stroke" ? { width: p.map.length, height: EFFECT_STRIP_HEIGHT } : { width: canvas.width, height: canvas.height };
2606
2668
  }
2607
2669
  function readEffectStrokeMap(raw) {
2608
- if (raw === void 0 || raw === null || raw.by === "canvas") return void 0;
2670
+ if (raw === void 0 || raw === null || raw === "canvas" || raw.by === "canvas") return void 0;
2671
+ if (raw === "path") return { by: "path" };
2609
2672
  const r = raw;
2610
- if (r.by !== "stroke") throw new Error(`map.by ${JSON.stringify(r.by)} is not a mapping; use "canvas" (fixed to the canvas) or "stroke" (along each stroke).`);
2673
+ if (r.by === "path") return { by: "path" };
2674
+ if (r.by !== "stroke") throw new Error(`map.by ${JSON.stringify(r.by)} is not a mapping; use "canvas" (fixed to the canvas), "stroke" (along each stroke) or "path" (native path control).`);
2611
2675
  const length2 = r.length === void 0 ? 300 : Number(r.length);
2612
2676
  if (!(Number.isFinite(length2) && length2 >= 16 && length2 <= 4096)) throw new Error(`map.length ${JSON.stringify(r.length)} is out of range; use 16..4096 px of stroke per repeat.`);
2613
2677
  const repeat = r.repeat === void 0 ? "repeat" : r.repeat;
@@ -2729,7 +2793,7 @@ function effectDabField(img, rect, cov, centre, mixed, field, steps = 0, dab = n
2729
2793
  var samplers = /* @__PURE__ */ new WeakMap();
2730
2794
  function stampSampler(ref, art, hardness = 1) {
2731
2795
  const sampler = baseSampler(ref, art);
2732
- if (!sampler || hardness >= 1 || !_chunkEU2ZZA6Lcjs.isBrushSourceRef.call(void 0, ref)) return sampler;
2796
+ if (!sampler || hardness >= 1 || !_chunkGHGBIAWQcjs.isBrushSourceRef.call(void 0, ref)) return sampler;
2733
2797
  const h = Math.max(0, hardness);
2734
2798
  return (u, v2, seed) => {
2735
2799
  const r = Math.hypot(u, v2) / Math.SQRT2;
@@ -2749,7 +2813,7 @@ function baseSampler(ref, art) {
2749
2813
  const k = kind;
2750
2814
  return (u, v2, seed) => _chunkRDFHWAHLcjs.stampCoverage.call(void 0, k, u, v2, seed);
2751
2815
  }
2752
- const a = _optionalChain([art, 'optionalCall', _55 => _55(ref)]);
2816
+ const a = _optionalChain([art, 'optionalCall', _59 => _59(ref)]);
2753
2817
  if (!a || !(a.width > 0 && a.height > 0)) return null;
2754
2818
  const hit = samplers.get(a);
2755
2819
  if (hit) return hit;
@@ -2804,7 +2868,7 @@ function rasterizeStampDab(d, sample, seed, rect, out) {
2804
2868
  }
2805
2869
  function brushStickerRefs(brush) {
2806
2870
  const refs = brush.engine === "sticker" ? [...brush.sticker.stamps] : brush.engine === "particle" ? [...brush.particle.dotTextures] : brush.engine === "dab" && brush.stamp ? [brush.stamp] : [];
2807
- return [...new Set(refs.filter((r) => r.includes(":") && !r.startsWith("editor:") && !_chunkEU2ZZA6Lcjs.isBrushSourceRef.call(void 0, r)))];
2871
+ return [...new Set(refs.filter((r) => r.includes(":") && !r.startsWith("editor:") && !_chunkGHGBIAWQcjs.isBrushSourceRef.call(void 0, r)))];
2808
2872
  }
2809
2873
  function sprayDroplets(d, spray, seed) {
2810
2874
  const count = 1 + Math.round(spray.density * 31);
@@ -2871,8 +2935,8 @@ function clonePaper(p) {
2871
2935
  }
2872
2936
  function readOffset(raw, d) {
2873
2937
  const o = raw && typeof raw === "object" ? raw : null;
2874
- const x = o && typeof o.x === "number" && Number.isFinite(o.x) ? Math.round(o.x) : _nullishCoalesce(_optionalChain([d, 'optionalAccess', _56 => _56.x]), () => ( 0));
2875
- const y = o && typeof o.y === "number" && Number.isFinite(o.y) ? Math.round(o.y) : _nullishCoalesce(_optionalChain([d, 'optionalAccess', _57 => _57.y]), () => ( 0));
2938
+ const x = o && typeof o.x === "number" && Number.isFinite(o.x) ? Math.round(o.x) : _nullishCoalesce(_optionalChain([d, 'optionalAccess', _60 => _60.x]), () => ( 0));
2939
+ const y = o && typeof o.y === "number" && Number.isFinite(o.y) ? Math.round(o.y) : _nullishCoalesce(_optionalChain([d, 'optionalAccess', _61 => _61.y]), () => ( 0));
2876
2940
  return x || y ? { offset: { x, y } } : {};
2877
2941
  }
2878
2942
  function readTuning(raw, d) {
@@ -3001,7 +3065,7 @@ var TipGrain = class _TipGrain {
3001
3065
  const paper = new (0, _chunkNIBFKXMDcjs.PaperGrain)({ pattern: settings.source, seed: 0, scale: settings.scale, tiling: "repeat", dry: tuning2, wet: tuning2 });
3002
3066
  return new _TipGrain(paper, settings);
3003
3067
  }
3004
- const a = _optionalChain([art, 'optionalCall', _58 => _58(settings.source)]);
3068
+ const a = _optionalChain([art, 'optionalCall', _62 => _62(settings.source)]);
3005
3069
  if (!a || !(a.width > 0 && a.height > 0)) return null;
3006
3070
  return new _TipGrain(new ImageGrain(a.width, a.height, a.data, settings.contrast, settings.invert, settings.scale), settings);
3007
3071
  }
@@ -3262,7 +3326,7 @@ var DryStroke = (_class3 = class {
3262
3326
  this.stamp = brush.stamp ? stampSampler(brush.stamp, options.stampArt, brush.tip.hardness) : null;
3263
3327
  this.tipGrain = TipGrain.create(brush.tipGrain, options.stampArt);
3264
3328
  this.smoother = new PenSmoother(brush.tip.smoothing, brush.pressureSmoothing);
3265
- this.copies = _optionalChain([options, 'access', _59 => _59.copies, 'optionalAccess', _60 => _60.length]) ? options.copies : [IDENTITY_COPY];
3329
+ this.copies = _optionalChain([options, 'access', _63 => _63.copies, 'optionalAccess', _64 => _64.length]) ? options.copies : [IDENTITY_COPY];
3266
3330
  this.walkers = this.copies.map((c, i) => new PenDabWalker(brush, (_nullishCoalesce(options.seed, () => ( 0))) + i * 7919 | 0, c.linear));
3267
3331
  this.depth = options.grain && !options.grain.flat ? Math.min(1, Math.max(0, options.paperDepth * brush.grain)) : 0;
3268
3332
  }
@@ -3325,7 +3389,7 @@ var DryStroke = (_class3 = class {
3325
3389
  const vals = this.buf.subarray(0, n);
3326
3390
  if (this.stamp) rasterizeStampDab(m, this.stamp, d.index, rect, vals);
3327
3391
  else _chunkNIBFKXMDcjs.rasterizeDab.call(void 0, m, hardness, rect, vals);
3328
- _optionalChain([this, 'access', _61 => _61.tipGrain, 'optionalAccess', _62 => _62.apply, 'call', _63 => _63(vals, rect, { x: m.x, y: m.y, angle: m.angle, travel: d.travel })]);
3392
+ _optionalChain([this, 'access', _65 => _65.tipGrain, 'optionalAccess', _66 => _66.apply, 'call', _67 => _67(vals, rect, { x: m.x, y: m.y, angle: m.angle, travel: d.travel })]);
3329
3393
  if (this.depth > 0 && grain) {
3330
3394
  for (let yy = 0, k = 0; yy < rect.height; yy++) {
3331
3395
  const y = rect.y + yy + 0.5;
@@ -3406,7 +3470,7 @@ var PaintDabStroke = (_class4 = class {
3406
3470
  this.stamp = brush.engine === "dab" && brush.stamp ? stampSampler(brush.stamp, options.stampArt, brush.tip.hardness) : null;
3407
3471
  this.tipGrain = TipGrain.create(brush.tipGrain, options.stampArt);
3408
3472
  this.smoother = new PenSmoother(brush.tip.smoothing, brush.pressureSmoothing);
3409
- this.copies = _optionalChain([options, 'access', _64 => _64.copies, 'optionalAccess', _65 => _65.length]) ? options.copies : [IDENTITY_COPY];
3473
+ this.copies = _optionalChain([options, 'access', _68 => _68.copies, 'optionalAccess', _69 => _69.length]) ? options.copies : [IDENTITY_COPY];
3410
3474
  const exchanging = brush.engine === "mixer" || brush.engine === "dab";
3411
3475
  const rates = brush.engine === "mixer" ? _chunkNIBFKXMDcjs.mixerRates.call(void 0, brush.mixer) : _chunkNIBFKXMDcjs.exchangeRates.call(void 0, brush.behavior.pickup, brush.behavior.mix, 1, brush.behavior.mixing);
3412
3476
  this.mixing = brush.engine === "mixer" ? brush.mixer.mixing : brush.behavior.mixing;
@@ -3419,7 +3483,7 @@ var PaintDabStroke = (_class4 = class {
3419
3483
  this.depth = options.grain && !options.grain.flat ? Math.min(1, Math.max(0, options.paperDepth * brush.grain)) : 0;
3420
3484
  this.coverage = brush.engine === "dab" ? new (0, _chunkNIBFKXMDcjs.CoverageMap)() : null;
3421
3485
  this.sampler = exchanging && options.paint ? new (0, _chunkNIBFKXMDcjs.PaintGradientSampler)(options.paint, _nullishCoalesce(options.seed, () => ( 0))) : null;
3422
- const table = _optionalChain([this, 'access', _66 => _66.sampler, 'optionalAccess', _67 => _67.acrossTip]) ? this.sampler.tipTable(GRADIENT_STEPS) : null;
3486
+ const table = _optionalChain([this, 'access', _70 => _70.sampler, 'optionalAccess', _71 => _71.acrossTip]) ? this.sampler.tipTable(GRADIENT_STEPS) : null;
3423
3487
  this.gradient = table ? table.map((e) => e.rgb) : null;
3424
3488
  this.gradientAlpha = table && table.some((e) => e.alpha < 1) ? table.map((e) => e.alpha) : null;
3425
3489
  this.scratch = brush.engine === "blender" ? _chunkNIBFKXMDcjs.createBlenderScratch.call(void 0, ) : null;
@@ -3454,7 +3518,7 @@ var PaintDabStroke = (_class4 = class {
3454
3518
 
3455
3519
  /** What copy 0's brush carries after the dabs so far (mixer and wet-capable dab brushes). */
3456
3520
  get load() {
3457
- return _nullishCoalesce(_optionalChain([this, 'access', _68 => _68.states, 'access', _69 => _69[0], 'access', _70 => _70.exchange, 'optionalAccess', _71 => _71.load]), () => ( null));
3521
+ return _nullishCoalesce(_optionalChain([this, 'access', _72 => _72.states, 'access', _73 => _73[0], 'access', _74 => _74.exchange, 'optionalAccess', _75 => _75.load]), () => ( null));
3458
3522
  }
3459
3523
  push(points) {
3460
3524
  const rects = [];
@@ -3504,7 +3568,7 @@ var PaintDabStroke = (_class4 = class {
3504
3568
  tip.fill(0);
3505
3569
  if (this.stamp) rasterizeStampDab({ ...d, alpha: 1 }, this.stamp, d.index, rect, tip);
3506
3570
  else _chunkNIBFKXMDcjs.rasterizeDab.call(void 0, { ...d, alpha: 1 }, this.brush.tip.hardness, rect, tip);
3507
- _optionalChain([this, 'access', _72 => _72.tipGrain, 'optionalAccess', _73 => _73.apply, 'call', _74 => _74(tip, rect, d)]);
3571
+ _optionalChain([this, 'access', _76 => _76.tipGrain, 'optionalAccess', _77 => _77.apply, 'call', _78 => _78(tip, rect, d)]);
3508
3572
  if (!(this.depth > 0 && this.options.grain)) return { tip, cov: tip };
3509
3573
  const cov = this.cov.subarray(0, n);
3510
3574
  const grain = this.options.grain;
@@ -3636,7 +3700,7 @@ var PaintDabStroke = (_class4 = class {
3636
3700
 
3637
3701
  // src/paint-editor/wet.ts
3638
3702
  var STROKE_WATER = 0.9;
3639
- var STROKE_MASS = _chunkJ5VQYK7Tcjs.PIGMENT_UNIT * 2.5;
3703
+ var STROKE_MASS = _chunkN5IMDAHMcjs.PIGMENT_UNIT * 2.5;
3640
3704
  var STROKE_LIGHT = 1.5;
3641
3705
  var COVERAGE_STEPS = 4096;
3642
3706
  function union(a, b) {
@@ -3666,12 +3730,17 @@ var WetStrokeDriver = (_class5 = class {
3666
3730
  const spacing = Math.max(0.02, brush.tip.spacing);
3667
3731
  const perDab = Math.min(1, spacing * 1.2);
3668
3732
  const thin = wet.thinner;
3669
- this.medium = new (0, _chunkJ5VQYK7Tcjs.WetMedium)(init.world, init.laneId, {
3733
+ const body = wet.body * (1 - thin);
3734
+ this.medium = new (0, _chunkN5IMDAHMcjs.WetMedium)(init.world, init.laneId, {
3670
3735
  water: STROKE_WATER * Math.min(1, wet.water * (1 + thin)) * perDab,
3671
3736
  mass: STROKE_MASS * wet.pigment * (1 - 0.6 * thin) * perDab,
3672
- body: wet.body * (1 - thin),
3737
+ body,
3673
3738
  light: 0
3674
3739
  });
3740
+ if (wet.tool === "paint" && brush.ghost && wet.pigment > 0) {
3741
+ const one = _chunkN5IMDAHMcjs.pigmentOf.call(void 0, init.color, body);
3742
+ init.world.startGhost(init.laneId, [one[0], one[1], one[2], one[3]], brush.ghost.linger, _nullishCoalesce(init.speed, () => ( 120)));
3743
+ }
3675
3744
  this.lightBase = wet.tool === "paint" ? STROKE_LIGHT * brush.light.amount * (1 - 0.6 * thin) * perDab : 0;
3676
3745
  const rates = _chunkNIBFKXMDcjs.exchangeRates.call(void 0, brush.behavior.pickup, brush.behavior.mix, wet.load, brush.behavior.mixing);
3677
3746
  this.states = copies.map((c, i) => ({
@@ -3708,7 +3777,7 @@ var WetStrokeDriver = (_class5 = class {
3708
3777
 
3709
3778
  /** What copy 0's brush carries after the dabs so far. */
3710
3779
  get load() {
3711
- return _nullishCoalesce(_optionalChain([this, 'access', _75 => _75.states, 'access', _76 => _76[0], 'access', _77 => _77.exchange, 'optionalAccess', _78 => _78.load]), () => ( null));
3780
+ return _nullishCoalesce(_optionalChain([this, 'access', _79 => _79.states, 'access', _80 => _80[0], 'access', _81 => _81.exchange, 'optionalAccess', _82 => _82.load]), () => ( null));
3712
3781
  }
3713
3782
  /** Whether every point (and the end) has been applied. */
3714
3783
  get done() {
@@ -3800,6 +3869,22 @@ var WetStrokeDriver = (_class5 = class {
3800
3869
  if (!(k > 0)) return;
3801
3870
  switch (wet.tool) {
3802
3871
  case "paint": {
3872
+ if (brush.ghost) {
3873
+ const smear = brush.ghost.smear;
3874
+ if (wet.pigment > 0) {
3875
+ this.medium.options.light = this.medium.options.mass;
3876
+ this.medium.deposit(rect, cov, k, this.init.color, null);
3877
+ } else {
3878
+ this.medium.options.light = 0;
3879
+ world.paint(laneId, rect, cov, this.medium.options.water * k * (wet.water > 0 ? 1 : 0), null);
3880
+ }
3881
+ if (smear > 0) {
3882
+ const rw = Math.max(wet.rewet, 0.6) * smear;
3883
+ if (rw > 0) world.rewet(laneId, rect, cov, rw * k * 0.5, this.init.paperColor, true);
3884
+ if (st.last) world.drag(laneId, rect, tip, d.x - st.last.x, d.y - st.last.y, smear * k);
3885
+ }
3886
+ break;
3887
+ }
3803
3888
  const ex = st.exchange;
3804
3889
  this.medium.options.light = this.lightBase * (brush.light.pressure ? d.pressure : 1);
3805
3890
  let flow = 1;
@@ -3872,7 +3957,7 @@ var PaintWetLayers = (_class6 = class {
3872
3957
 
3873
3958
 
3874
3959
  __init41() {this.world = null}
3875
- __init42() {this.tilt = { ..._chunkJ5VQYK7Tcjs.FLAT }}
3960
+ __init42() {this.tilt = { ..._chunkN5IMDAHMcjs.FLAT }}
3876
3961
  __init43() {this.settings = /* @__PURE__ */ new Map()}
3877
3962
  __init44() {this.paused = false}
3878
3963
  /** Wet strokes dry as soon as they end (one undo step with the stroke). */
@@ -3896,8 +3981,8 @@ var PaintWetLayers = (_class6 = class {
3896
3981
  /** Starts the GPU engine for the world (once; it may turn out unavailable). */
3897
3982
  startGpu() {
3898
3983
  if (this.gpuMode === "off" || this.gpu || this.gpuStarting || this.gpuSupport) return;
3899
- const provider = this.options.gpuProvider === void 0 ? _chunkJ5VQYK7Tcjs.findWebGpu.call(void 0, ) : this.options.gpuProvider;
3900
- this.gpuStarting = _chunkJ5VQYK7Tcjs.createWetGpuEngine.call(void 0, provider).then(({ engine, support }) => {
3984
+ const provider = this.options.gpuProvider === void 0 ? _chunkN5IMDAHMcjs.findWebGpu.call(void 0, ) : this.options.gpuProvider;
3985
+ this.gpuStarting = _chunkN5IMDAHMcjs.createWetGpuEngine.call(void 0, provider).then(({ engine, support }) => {
3901
3986
  this.gpuSupport = support;
3902
3987
  if (!engine) return;
3903
3988
  if (this.gpuMode === "off" || !this.world) {
@@ -3927,8 +4012,8 @@ var PaintWetLayers = (_class6 = class {
3927
4012
  if (mode === this.gpuMode) return this.engineInfo();
3928
4013
  this.gpuMode = mode;
3929
4014
  if (mode === "off") {
3930
- _optionalChain([this, 'access', _79 => _79.world, 'optionalAccess', _80 => _80.attachGpu, 'call', _81 => _81(null)]);
3931
- _optionalChain([this, 'access', _82 => _82.gpu, 'optionalAccess', _83 => _83.destroy, 'call', _84 => _84()]);
4015
+ _optionalChain([this, 'access', _83 => _83.world, 'optionalAccess', _84 => _84.attachGpu, 'call', _85 => _85(null)]);
4016
+ _optionalChain([this, 'access', _86 => _86.gpu, 'optionalAccess', _87 => _87.destroy, 'call', _88 => _88()]);
3932
4017
  this.gpu = null;
3933
4018
  this.gpuSupport = null;
3934
4019
  } else if (this.world) this.startGpu();
@@ -3936,13 +4021,13 @@ var PaintWetLayers = (_class6 = class {
3936
4021
  }
3937
4022
  engineInfo() {
3938
4023
  const w = this.world;
3939
- const base = { mode: this.gpuMode, adapter: _nullishCoalesce(_optionalChain([this, 'access', _85 => _85.gpuSupport, 'optionalAccess', _86 => _86.adapter]), () => ( null)), maxTiles: _nullishCoalesce(_optionalChain([this, 'access', _87 => _87.gpuSupport, 'optionalAccess', _88 => _88.maxSlots]), () => ( 0)), minTiles: this.gpuMinTiles, activeTiles: _nullishCoalesce(_optionalChain([w, 'optionalAccess', _89 => _89.activeTiles, 'call', _90 => _90()]), () => ( 0)), cpu: this.backend() };
4024
+ const base = { mode: this.gpuMode, adapter: _nullishCoalesce(_optionalChain([this, 'access', _89 => _89.gpuSupport, 'optionalAccess', _90 => _90.adapter]), () => ( null)), maxTiles: _nullishCoalesce(_optionalChain([this, 'access', _91 => _91.gpuSupport, 'optionalAccess', _92 => _92.maxSlots]), () => ( 0)), minTiles: this.gpuMinTiles, activeTiles: _nullishCoalesce(_optionalChain([w, 'optionalAccess', _93 => _93.activeTiles, 'call', _94 => _94()]), () => ( 0)), cpu: this.backend() };
3940
4025
  if (this.gpuMode === "off") return { ...base, state: "off", reason: "Forced to the CPU." };
3941
4026
  if (this.gpuStarting) return { ...base, state: "starting", reason: null };
3942
- if (_optionalChain([w, 'optionalAccess', _91 => _91.gpuError])) return { ...base, state: "failed", reason: w.gpuError };
4027
+ if (_optionalChain([w, 'optionalAccess', _95 => _95.gpuError])) return { ...base, state: "failed", reason: w.gpuError };
3943
4028
  if (this.gpuSupport && !this.gpuSupport.supported) return { ...base, state: "unavailable", reason: this.gpuSupport.reason };
3944
4029
  if (!this.gpu) return { ...base, state: "not-started", reason: "Starts with the first wet stroke." };
3945
- if (_optionalChain([w, 'optionalAccess', _92 => _92.gpuActive])) return { ...base, state: "active", reason: null };
4030
+ if (_optionalChain([w, 'optionalAccess', _96 => _96.gpuActive])) return { ...base, state: "active", reason: null };
3946
4031
  return { ...base, state: "standby", reason: `The GPU takes over at ${this.gpuMinTiles} wet tiles (256 px).` };
3947
4032
  }
3948
4033
  /** The world (made on first use, at the canvas size). */
@@ -3956,7 +4041,7 @@ var PaintWetLayers = (_class6 = class {
3956
4041
  return this.world;
3957
4042
  }
3958
4043
  makeWorld(width, height, paper) {
3959
- const world = new (0, _chunkJ5VQYK7Tcjs.WetWorld)(width, height, wetPaperInput(paper), { kernel: this.options.kernel, threads: this.options.threads });
4044
+ const world = new (0, _chunkN5IMDAHMcjs.WetWorld)(width, height, wetPaperInput(paper), { kernel: this.options.kernel, threads: this.options.threads });
3960
4045
  world.setTilt(this.tilt);
3961
4046
  world.gpuMinTiles = this.gpuMinTiles;
3962
4047
  if (this.gpu) world.attachGpu(this.gpu);
@@ -3968,7 +4053,7 @@ var PaintWetLayers = (_class6 = class {
3968
4053
  * sides: the shift has to be whole wet tiles (256 px), and no wet stroke may be live.
3969
4054
  */
3970
4055
  canExtend(left2, top) {
3971
- return left2 % _chunkJ5VQYK7Tcjs.WET_TILE === 0 && top % _chunkJ5VQYK7Tcjs.WET_TILE === 0 && !this.driver;
4056
+ return left2 % _chunkN5IMDAHMcjs.WET_TILE === 0 && top % _chunkN5IMDAHMcjs.WET_TILE === 0 && !this.driver;
3972
4057
  }
3973
4058
  /**
3974
4059
  * Keeps the wet paint while the canvas grows to `width`×`height` by `left` / `top` on those
@@ -3981,17 +4066,17 @@ var PaintWetLayers = (_class6 = class {
3981
4066
  if (!this.canExtend(left2, top)) throw new Error("Wet paint only moves by whole 256 px tiles, between strokes.");
3982
4067
  for (const [id, s] of this.settings) if (s.flow.center) this.settings.set(id, { ...s, flow: { ...s.flow, center: { x: s.flow.center.x + left2, y: s.flow.center.y + top } } });
3983
4068
  const old = this.world;
3984
- const snap = _optionalChain([old, 'optionalAccess', _93 => _93.laneIds, 'call', _94 => _94(), 'access', _95 => _95.length]) ? old.snapshot() : null;
4069
+ const snap = _optionalChain([old, 'optionalAccess', _97 => _97.laneIds, 'call', _98 => _98(), 'access', _99 => _99.length]) ? old.snapshot() : null;
3985
4070
  this.dropWorld();
3986
4071
  this.lastTick = null;
3987
4072
  this.stepsOwed = 0;
3988
4073
  if (!old || !snap) return;
3989
- const moved = _chunkJ5VQYK7Tcjs.moveWetSnapshot.call(void 0, snap, old, { width, height }, left2, top, (l) => {
3990
- const flow = _optionalChain([this, 'access', _96 => _96.settings, 'access', _97 => _97.get, 'call', _98 => _98(l.id), 'optionalAccess', _99 => _99.flow]);
4074
+ const moved = _chunkN5IMDAHMcjs.moveWetSnapshot.call(void 0, snap, old, { width, height }, left2, top, (l) => {
4075
+ const flow = _optionalChain([this, 'access', _100 => _100.settings, 'access', _101 => _101.get, 'call', _102 => _102(l.id), 'optionalAccess', _103 => _103.flow]);
3991
4076
  return {
3992
4077
  base: _chunk474IQG74cjs.translateSurface.call(void 0, l.base, left2, top),
3993
4078
  ...l.light ? { light: _chunk474IQG74cjs.translateSurface.call(void 0, l.light, left2, top) } : {},
3994
- flow: l.flow && flow && flow.kind !== "none" ? _chunkJ5VQYK7Tcjs.flowField.call(void 0, flow, width, height) : l.flow
4079
+ flow: l.flow && flow && flow.kind !== "none" ? _chunkN5IMDAHMcjs.flowField.call(void 0, flow, width, height) : l.flow
3995
4080
  };
3996
4081
  });
3997
4082
  this.world = this.makeWorld(width, height, paper);
@@ -4006,11 +4091,11 @@ var PaintWetLayers = (_class6 = class {
4006
4091
  }
4007
4092
  /** Layers holding a wet layer (wet or drying). */
4008
4093
  wetLayerIds() {
4009
- return _nullishCoalesce(_optionalChain([this, 'access', _100 => _100.world, 'optionalAccess', _101 => _101.laneIds, 'call', _102 => _102()]), () => ( []));
4094
+ return _nullishCoalesce(_optionalChain([this, 'access', _104 => _104.world, 'optionalAccess', _105 => _105.laneIds, 'call', _106 => _106()]), () => ( []));
4010
4095
  }
4011
4096
  /** Whether a batch is running (edits wait). */
4012
4097
  get busy() {
4013
- return Boolean(_optionalChain([this, 'access', _103 => _103.world, 'optionalAccess', _104 => _104.busy]));
4098
+ return Boolean(_optionalChain([this, 'access', _107 => _107.world, 'optionalAccess', _108 => _108.busy]));
4014
4099
  }
4015
4100
  /** Resolves when no batch is running. */
4016
4101
  async idle() {
@@ -4019,7 +4104,7 @@ var PaintWetLayers = (_class6 = class {
4019
4104
  settingsOf(layerId, medium = "watercolor") {
4020
4105
  let s = this.settings.get(layerId);
4021
4106
  if (!s) {
4022
- s = { params: _chunkJ5VQYK7Tcjs.normalizeWetParams.call(void 0, WET_MEDIUM_PARAMS[medium], _chunkJ5VQYK7Tcjs.DEFAULT_WET_PARAMS), flow: { ..._chunkJ5VQYK7Tcjs.DEFAULT_FLOW } };
4107
+ s = { params: _chunkN5IMDAHMcjs.normalizeWetParams.call(void 0, WET_MEDIUM_PARAMS[medium], _chunkN5IMDAHMcjs.DEFAULT_WET_PARAMS), flow: { ..._chunkN5IMDAHMcjs.DEFAULT_FLOW } };
4023
4108
  this.settings.set(layerId, s);
4024
4109
  }
4025
4110
  return s;
@@ -4030,52 +4115,54 @@ var PaintWetLayers = (_class6 = class {
4030
4115
  if (!w.hasLane(layerId)) {
4031
4116
  const base = _nullishCoalesce(this.host.layerSurface(layerId), () => ( new (0, _chunk474IQG74cjs.TiledSurface)(4, /* @__PURE__ */ new Map(), 0)));
4032
4117
  const s = this.settingsOf(layerId, medium);
4033
- w.ensureLane(layerId, { params: s.params, base, light: this.host.layerLight(layerId) });
4118
+ w.ensureLane(layerId, { params: s.params, base, light: this.host.layerLight(layerId), ghost: s.ghost });
4034
4119
  const { width, height } = this.host.canvas();
4035
- if (s.flow.kind !== "none") w.setFlow(layerId, _chunkJ5VQYK7Tcjs.flowField.call(void 0, s.flow, width, height), s.flow.strength);
4120
+ if (s.flow.kind !== "none") w.setFlow(layerId, _chunkN5IMDAHMcjs.flowField.call(void 0, s.flow, width, height), s.flow.strength);
4036
4121
  }
4037
4122
  return w;
4038
4123
  }
4039
4124
  setParams(layerId, update) {
4040
4125
  const s = this.settingsOf(layerId);
4041
- s.params = _chunkJ5VQYK7Tcjs.normalizeWetParams.call(void 0, update, s.params);
4042
- if (_optionalChain([this, 'access', _105 => _105.world, 'optionalAccess', _106 => _106.hasLane, 'call', _107 => _107(layerId)])) this.world.setParams(layerId, s.params);
4126
+ s.params = _chunkN5IMDAHMcjs.normalizeWetParams.call(void 0, update, s.params);
4127
+ if (_optionalChain([this, 'access', _109 => _109.world, 'optionalAccess', _110 => _110.hasLane, 'call', _111 => _111(layerId)])) this.world.setParams(layerId, s.params);
4043
4128
  return { ...s.params };
4044
4129
  }
4045
4130
  setFlow(layerId, update) {
4046
4131
  const s = this.settingsOf(layerId);
4047
- s.flow = _chunkJ5VQYK7Tcjs.normalizeFlow.call(void 0, update, s.flow);
4048
- if (_optionalChain([this, 'access', _108 => _108.world, 'optionalAccess', _109 => _109.hasLane, 'call', _110 => _110(layerId)])) {
4132
+ s.flow = _chunkN5IMDAHMcjs.normalizeFlow.call(void 0, update, s.flow);
4133
+ if (_optionalChain([this, 'access', _112 => _112.world, 'optionalAccess', _113 => _113.hasLane, 'call', _114 => _114(layerId)])) {
4049
4134
  const { width, height } = this.host.canvas();
4050
- this.world.setFlow(layerId, _chunkJ5VQYK7Tcjs.flowField.call(void 0, s.flow, width, height), s.flow.strength);
4135
+ this.world.setFlow(layerId, _chunkN5IMDAHMcjs.flowField.call(void 0, s.flow, width, height), s.flow.strength);
4051
4136
  }
4052
4137
  return { ...s.flow };
4053
4138
  }
4054
4139
  setTilt(update) {
4055
- this.tilt = _chunkJ5VQYK7Tcjs.normalizeTilt.call(void 0, update, this.tilt);
4056
- _optionalChain([this, 'access', _111 => _111.world, 'optionalAccess', _112 => _112.setTilt, 'call', _113 => _113(this.tilt)]);
4140
+ this.tilt = _chunkN5IMDAHMcjs.normalizeTilt.call(void 0, update, this.tilt);
4141
+ _optionalChain([this, 'access', _115 => _115.world, 'optionalAccess', _116 => _116.setTilt, 'call', _117 => _117(this.tilt)]);
4057
4142
  return { ...this.tilt };
4058
4143
  }
4059
4144
  /** The paper changed. */
4060
4145
  paperChanged() {
4061
- _optionalChain([this, 'access', _114 => _114.world, 'optionalAccess', _115 => _115.setPaper, 'call', _116 => _116(wetPaperInput(this.host.paper()))]);
4146
+ _optionalChain([this, 'access', _118 => _118.world, 'optionalAccess', _119 => _119.setPaper, 'call', _120 => _120(wetPaperInput(this.host.paper()))]);
4062
4147
  }
4063
4148
  /** A layer as tools describe it. */
4064
4149
  info(layerId) {
4065
4150
  const s = this.settingsOf(layerId);
4066
- const st = _optionalChain([this, 'access', _117 => _117.world, 'optionalAccess', _118 => _118.hasLane, 'call', _119 => _119(layerId)]) ? this.world.stats(layerId) : null;
4151
+ const st = _optionalChain([this, 'access', _121 => _121.world, 'optionalAccess', _122 => _122.hasLane, 'call', _123 => _123(layerId)]) ? this.world.stats(layerId) : null;
4152
+ const g = _optionalChain([this, 'access', _124 => _124.world, 'optionalAccess', _125 => _125.hasLane, 'call', _126 => _126(layerId)]) ? this.world.getGhost(layerId) : _nullishCoalesce(s.ghost, () => ( null));
4067
4153
  return {
4068
4154
  layerId,
4069
4155
  wet: Boolean(st && st.wetCells > 0),
4070
- wetCells: _nullishCoalesce(_optionalChain([st, 'optionalAccess', _120 => _120.wetCells]), () => ( 0)),
4071
- wetBounds: _nullishCoalesce(_optionalChain([st, 'optionalAccess', _121 => _121.wetBounds]), () => ( null)),
4072
- activeTiles: _nullishCoalesce(_optionalChain([st, 'optionalAccess', _122 => _122.activeTiles]), () => ( 0)),
4156
+ wetCells: _nullishCoalesce(_optionalChain([st, 'optionalAccess', _127 => _127.wetCells]), () => ( 0)),
4157
+ wetBounds: _nullishCoalesce(_optionalChain([st, 'optionalAccess', _128 => _128.wetBounds]), () => ( null)),
4158
+ activeTiles: _nullishCoalesce(_optionalChain([st, 'optionalAccess', _129 => _129.activeTiles]), () => ( 0)),
4073
4159
  params: { ...s.params },
4074
- flow: { ...s.flow }
4160
+ flow: { ...s.flow },
4161
+ ...g ? { ghost: { remaining: Math.round(g.remaining * _chunkN5IMDAHMcjs.FREE_INTERVAL / this.speed * 100) / 100 } } : {}
4075
4162
  };
4076
4163
  }
4077
4164
  backend() {
4078
- return _nullishCoalesce(_optionalChain([this, 'access', _123 => _123.world, 'optionalAccess', _124 => _124.backend, 'call', _125 => _125()]), () => ( null));
4165
+ return _nullishCoalesce(_optionalChain([this, 'access', _130 => _130.world, 'optionalAccess', _131 => _131.backend, 'call', _132 => _132()]), () => ( null));
4079
4166
  }
4080
4167
  /** Shows the current wet pixels (at most `maxTiles` reshaded per layer). */
4081
4168
  syncDisplays(maxTiles = Infinity) {
@@ -4124,10 +4211,12 @@ var PaintWetLayers = (_class6 = class {
4124
4211
  const w = this.world;
4125
4212
  if (!w) return;
4126
4213
  for (const id of w.laneIds()) {
4127
- if (w.isActive(id) || _optionalChain([this, 'access', _126 => _126.driver, 'optionalAccess', _127 => _127.init, 'access', _128 => _128.laneId]) === id) continue;
4214
+ if (w.isActive(id) || _optionalChain([this, 'access', _133 => _133.driver, 'optionalAccess', _134 => _134.init, 'access', _135 => _135.laneId]) === id) continue;
4128
4215
  const base = w.getBase(id);
4129
4216
  const light = w.isLit(id) ? w.getLight(id) : null;
4130
4217
  w.removeLane(id);
4218
+ const s = this.settings.get(id);
4219
+ if (_optionalChain([s, 'optionalAccess', _136 => _136.ghost])) delete s.ghost;
4131
4220
  if (light && this.host.layerLight(id) !== light) this.host.updateLights(/* @__PURE__ */ new Map([[id, light]]));
4132
4221
  this.host.updateSurfaces(/* @__PURE__ */ new Map([[id, base]]), []);
4133
4222
  }
@@ -4206,7 +4295,7 @@ var PaintWetLayers = (_class6 = class {
4206
4295
  if (!d || !this.world) return;
4207
4296
  const rects = d.flush();
4208
4297
  if (rects.length) this.syncDisplays(DISPLAY_TILES_PER_TICK);
4209
- if (d.done) _optionalChain([this, 'access', _129 => _129.onDriverDone, 'optionalCall', _130 => _130(d)]);
4298
+ if (d.done) _optionalChain([this, 'access', _137 => _137.onDriverDone, 'optionalCall', _138 => _138(d)]);
4210
4299
  }
4211
4300
  /** Called when a live stroke that ended mid-batch has finished applying. */
4212
4301
  __init56() {this.onDriverDone = null}
@@ -4250,13 +4339,13 @@ var PaintWetLayers = (_class6 = class {
4250
4339
  /** The layer's light paint with all its wet paint dried (`null` without a wet layer or light), without changing anything. */
4251
4340
  bakedLight(layerId) {
4252
4341
  const w = this.world;
4253
- if (!_optionalChain([w, 'optionalAccess', _131 => _131.hasLane, 'call', _132 => _132(layerId)]) || !w.isLit(layerId)) return null;
4342
+ if (!_optionalChain([w, 'optionalAccess', _139 => _139.hasLane, 'call', _140 => _140(layerId)]) || !w.isLit(layerId)) return null;
4254
4343
  return w.bakedLight(layerId);
4255
4344
  }
4256
4345
  /** The layer's pixels with all its wet paint dried (deterministic), without changing anything. */
4257
4346
  bakedSurface(layerId) {
4258
4347
  const w = this.world;
4259
- if (!_optionalChain([w, 'optionalAccess', _133 => _133.hasLane, 'call', _134 => _134(layerId)])) return null;
4348
+ if (!_optionalChain([w, 'optionalAccess', _141 => _141.hasLane, 'call', _142 => _142(layerId)])) return null;
4260
4349
  return w.bakedSurface(layerId);
4261
4350
  }
4262
4351
  /** A snapshot of the world for undo (`null` when there is none). */
@@ -4277,13 +4366,13 @@ var PaintWetLayers = (_class6 = class {
4277
4366
  this.syncDisplays();
4278
4367
  }
4279
4368
  dropWorld() {
4280
- _optionalChain([this, 'access', _135 => _135.world, 'optionalAccess', _136 => _136.destroy, 'call', _137 => _137()]);
4369
+ _optionalChain([this, 'access', _143 => _143.world, 'optionalAccess', _144 => _144.destroy, 'call', _145 => _145()]);
4281
4370
  this.world = null;
4282
4371
  this.driver = null;
4283
4372
  }
4284
4373
  /** Forgets everything wet (a new canvas, a resize, opening a document). */
4285
4374
  reset() {
4286
- _optionalChain([this, 'access', _138 => _138.world, 'optionalAccess', _139 => _139.destroy, 'call', _140 => _140()]);
4375
+ _optionalChain([this, 'access', _146 => _146.world, 'optionalAccess', _147 => _147.destroy, 'call', _148 => _148()]);
4287
4376
  this.world = null;
4288
4377
  this.driver = null;
4289
4378
  this.settings.clear();
@@ -4313,15 +4402,15 @@ var PaintWetLayers = (_class6 = class {
4313
4402
  return out;
4314
4403
  }
4315
4404
  destroy() {
4316
- _optionalChain([this, 'access', _141 => _141.world, 'optionalAccess', _142 => _142.destroy, 'call', _143 => _143()]);
4405
+ _optionalChain([this, 'access', _149 => _149.world, 'optionalAccess', _150 => _150.destroy, 'call', _151 => _151()]);
4317
4406
  this.world = null;
4318
- _optionalChain([this, 'access', _144 => _144.gpu, 'optionalAccess', _145 => _145.destroy, 'call', _146 => _146()]);
4407
+ _optionalChain([this, 'access', _152 => _152.gpu, 'optionalAccess', _153 => _153.destroy, 'call', _154 => _154()]);
4319
4408
  this.gpu = null;
4320
4409
  }
4321
4410
  }, _class6);
4322
4411
  function wetPigmentOf(hex, body) {
4323
4412
  const [r, g, b] = hexToRgb8(hex);
4324
- return Array.from(_chunkJ5VQYK7Tcjs.pigmentOf.call(void 0, [r / 255, g / 255, b / 255], body));
4413
+ return Array.from(_chunkN5IMDAHMcjs.pigmentOf.call(void 0, [r / 255, g / 255, b / 255], body));
4325
4414
  }
4326
4415
 
4327
4416
  // src/vector/brushstrokeMedia.ts
@@ -4357,8 +4446,8 @@ function place(input, brush, options, pad = 0) {
4357
4446
  const [r, g, b, a] = options.color;
4358
4447
  const hex = "#" + [r, g, b].map((v2) => Math.round(Math.min(255, Math.max(0, v2))).toString(16).padStart(2, "0")).join("");
4359
4448
  const source = _nullishCoalesce(options.paint, () => ( null));
4360
- const paint = _optionalChain([source, 'optionalAccess', _147 => _147.type]) === "gradient" ? _chunkNIBFKXMDcjs.resolvePaintGradient.call(void 0, _chunkNIBFKXMDcjs.scalePaintGradient.call(void 0, source, scale3), { paint: hex, secondary: "#ffffff" }) : null;
4361
- const color2 = _optionalChain([source, 'optionalAccess', _148 => _148.type]) === "color" ? hexRgb(source.color) : [r / 255, g / 255, b / 255];
4449
+ const paint = _optionalChain([source, 'optionalAccess', _155 => _155.type]) === "gradient" ? _chunkNIBFKXMDcjs.resolvePaintGradient.call(void 0, _chunkNIBFKXMDcjs.scalePaintGradient.call(void 0, source, scale3), { paint: hex, secondary: "#ffffff" }) : null;
4450
+ const color2 = _optionalChain([source, 'optionalAccess', _156 => _156.type]) === "color" ? hexRgb(source.color) : [r / 255, g / 255, b / 255];
4362
4451
  return { points, brush: sized, rect, scale: scale3, color: color2, alpha: Math.min(1, Math.max(0, a / 255)), paint };
4363
4452
  }
4364
4453
  function hexRgb(hex) {
@@ -4409,7 +4498,7 @@ var WetBrushstrokeJob = (_class7 = class {
4409
4498
  return;
4410
4499
  }
4411
4500
  const { rect, points } = this.placed;
4412
- this.world = new (0, _chunkJ5VQYK7Tcjs.WetWorld)(rect.width, rect.height, wetPaperInput(DEFAULT_PAPER), { kernel: "typescript", threads: 0 });
4501
+ this.world = new (0, _chunkN5IMDAHMcjs.WetWorld)(rect.width, rect.height, wetPaperInput(DEFAULT_PAPER), { kernel: "typescript", threads: 0 });
4413
4502
  const medium = _nullishCoalesce(this.placed.brush.wet.medium, () => ( "watercolor"));
4414
4503
  this.world.ensureLane("s", { params: _nullishCoalesce(WET_MEDIUM_PARAMS[medium], () => ( {})) });
4415
4504
  const color2 = this.placed.color;
@@ -4468,7 +4557,7 @@ var WetBrushstrokeJob = (_class7 = class {
4468
4557
  return this.final;
4469
4558
  }
4470
4559
  destroy() {
4471
- _optionalChain([this, 'access', _149 => _149.world, 'optionalAccess', _150 => _150.destroy, 'call', _151 => _151()]);
4560
+ _optionalChain([this, 'access', _157 => _157.world, 'optionalAccess', _158 => _158.destroy, 'call', _159 => _159()]);
4472
4561
  }
4473
4562
  bake() {
4474
4563
  if (!this.world || !this.placed) return EMPTY;
@@ -4493,8 +4582,8 @@ function renderBackdropBrushstroke(input, brush, options) {
4493
4582
  const area = { x: 0, y: 0, width: rect.width, height: rect.height };
4494
4583
  const before = options.backdrop ? options.backdrop(rect, placed.scale) : new Uint8ClampedArray(rect.width * rect.height * 4);
4495
4584
  if (before.length !== rect.width * rect.height * 4) throw new Error(`The backdrop must be ${rect.width}\xD7${rect.height} RGBA pixels.`);
4496
- const cached = _optionalChain([options, 'access', _152 => _152.cache, 'optionalCall', _153 => _153(before)]);
4497
- const hit = _optionalChain([cached, 'optionalAccess', _154 => _154.get, 'call', _155 => _155()]);
4585
+ const cached = _optionalChain([options, 'access', _160 => _160.cache, 'optionalCall', _161 => _161(before)]);
4586
+ const hit = _optionalChain([cached, 'optionalAccess', _162 => _162.get, 'call', _163 => _163()]);
4498
4587
  if (hit) return hit;
4499
4588
  const base = _chunk474IQG74cjs.writeRegion.call(void 0, _chunk474IQG74cjs.emptySurface.call(void 0, 4), area, before);
4500
4589
  const live = /* @__PURE__ */ new Map();
@@ -4502,7 +4591,7 @@ function renderBackdropBrushstroke(input, brush, options) {
4502
4591
  offset: { x: 0, y: 0 },
4503
4592
  lockTransparency: false,
4504
4593
  selection: null,
4505
- readTile: (tx, ty) => _nullishCoalesce(_nullishCoalesce(live.get(_chunk474IQG74cjs.tileKey.call(void 0, tx, ty)), () => ( _optionalChain([base, 'access', _156 => _156.tiles, 'access', _157 => _157.get, 'call', _158 => _158(_chunk474IQG74cjs.tileKey.call(void 0, tx, ty)), 'optionalAccess', _159 => _159.data]))), () => ( null)),
4594
+ readTile: (tx, ty) => _nullishCoalesce(_nullishCoalesce(live.get(_chunk474IQG74cjs.tileKey.call(void 0, tx, ty)), () => ( _optionalChain([base, 'access', _164 => _164.tiles, 'access', _165 => _165.get, 'call', _166 => _166(_chunk474IQG74cjs.tileKey.call(void 0, tx, ty)), 'optionalAccess', _167 => _167.data]))), () => ( null)),
4506
4595
  writeTile: (tx, ty) => {
4507
4596
  const key = _chunk474IQG74cjs.tileKey.call(void 0, tx, ty);
4508
4597
  let t = live.get(key);
@@ -4520,17 +4609,17 @@ function renderBackdropBrushstroke(input, brush, options) {
4520
4609
  for (const [key, data] of live) tiles.set(key, { data, uniform: null });
4521
4610
  _chunk474IQG74cjs.readRegion.call(void 0, new (0, _chunk474IQG74cjs.TiledSurface)(4, tiles), area, after);
4522
4611
  const result = cropped(after, placed, stroke.dabCount, (i) => after[i] !== before[i] || after[i + 1] !== before[i + 1] || after[i + 2] !== before[i + 2] || after[i + 3] !== before[i + 3]);
4523
- _optionalChain([cached, 'optionalAccess', _160 => _160.set, 'call', _161 => _161(result)]);
4612
+ _optionalChain([cached, 'optionalAccess', _168 => _168.set, 'call', _169 => _169(result)]);
4524
4613
  return result;
4525
4614
  }
4526
4615
 
4527
4616
  // src/vector/brushstroke.ts
4528
4617
  var VECTOR_BRUSHSTROKE_SCALE = 2;
4529
- var PRESETS = _chunkEU2ZZA6Lcjs.listPresets.call(void 0, _chunkEU2ZZA6Lcjs.VECTOR_PROFILE).map((spec) => _chunkEU2ZZA6Lcjs.BUILTIN_BRUSHES.find((b) => b.id === spec.id));
4618
+ var PRESETS = _chunkGHGBIAWQcjs.listPresets.call(void 0, _chunkGHGBIAWQcjs.VECTOR_PROFILE).map((spec) => _chunkGHGBIAWQcjs.BUILTIN_BRUSHES.find((b) => b.id === spec.id));
4530
4619
  function admitted(spec) {
4531
4620
  try {
4532
- const brush = _chunkEU2ZZA6Lcjs.normalizeBrushSpec.call(void 0, spec);
4533
- return _chunkEU2ZZA6Lcjs.checkBrush.call(void 0, brush, _chunkEU2ZZA6Lcjs.VECTOR_PROFILE).ok && isVectorBrushstrokeEngine(_chunkEU2ZZA6Lcjs.resolveBrush.call(void 0, brush)) ? brush : null;
4621
+ const brush = _chunkGHGBIAWQcjs.normalizeBrushSpec.call(void 0, spec);
4622
+ return _chunkGHGBIAWQcjs.checkBrush.call(void 0, brush, _chunkGHGBIAWQcjs.VECTOR_PROFILE).ok && isVectorBrushstrokeEngine(_chunkGHGBIAWQcjs.resolveBrush.call(void 0, brush)) ? brush : null;
4534
4623
  } catch (e6) {
4535
4624
  return null;
4536
4625
  }
@@ -4542,7 +4631,7 @@ function vectorBrushstrokeBrushes(user = []) {
4542
4631
  const out = [...PRESETS];
4543
4632
  for (const raw of user) {
4544
4633
  const brush = admitted(raw);
4545
- if (brush && !out.some((b) => b.id === brush.id)) out.push(_chunkEU2ZZA6Lcjs.resolveBrush.call(void 0, brush));
4634
+ if (brush && !out.some((b) => b.id === brush.id)) out.push(_chunkGHGBIAWQcjs.resolveBrush.call(void 0, brush));
4546
4635
  }
4547
4636
  return out;
4548
4637
  }
@@ -4552,7 +4641,7 @@ function vectorBrushstrokeBrush(id) {
4552
4641
  function vectorBrushstrokeBrushOf(brush) {
4553
4642
  if (brush.spec) {
4554
4643
  const saved = admitted(brush.spec);
4555
- return saved && saved.id === brush.brushId ? _chunkEU2ZZA6Lcjs.resolveBrush.call(void 0, saved) : null;
4644
+ return saved && saved.id === brush.brushId ? _chunkGHGBIAWQcjs.resolveBrush.call(void 0, saved) : null;
4556
4645
  }
4557
4646
  return vectorBrushstrokeBrush(brush.brushId);
4558
4647
  }
@@ -4560,15 +4649,15 @@ function vectorBrushstrokeBrushError(id, user = []) {
4560
4649
  if (vectorBrushstrokeBrush(id)) return null;
4561
4650
  const saved = user.find((b) => b.id === id);
4562
4651
  const ids = vectorBrushstrokeBrushes(user).map((b) => b.id);
4563
- const reasons = (b) => _chunkEU2ZZA6Lcjs.checkBrush.call(void 0, b, _chunkEU2ZZA6Lcjs.VECTOR_PROFILE).issues.filter((i) => i.severity === "error").map((i) => `${i.reason} ${i.fix}`).join(" ") || "its engine does not paint brushstrokes.";
4652
+ const reasons = (b) => _chunkGHGBIAWQcjs.checkBrush.call(void 0, b, _chunkGHGBIAWQcjs.VECTOR_PROFILE).issues.filter((i) => i.severity === "error").map((i) => `${i.reason} ${i.fix}`).join(" ") || "its engine does not paint brushstrokes.";
4564
4653
  if (saved) return admitted(saved) ? null : `Brush "${id}" (${saved.name}) can't paint a brushstroke: ${reasons(saved)} Use one of: ${ids.join(", ")}.`;
4565
- const preset2 = _chunkEU2ZZA6Lcjs.BRUSH_PRESETS.find((b) => b.id === id);
4654
+ const preset2 = _chunkGHGBIAWQcjs.BRUSH_PRESETS.find((b) => b.id === id);
4566
4655
  if (preset2) return `Brush "${id}" (${preset2.name}) can't paint a brushstroke: ${reasons(preset2)} Use one of: ${ids.join(", ")}.`;
4567
- return `Unknown brush "${id}". ${_chunkEU2ZZA6Lcjs.closest.call(void 0, id, ids)}Use one of: ${ids.join(", ")} (vector.listBrushes lists them).`;
4656
+ return `Unknown brush "${id}". ${_chunkGHGBIAWQcjs.closest.call(void 0, id, ids)}Use one of: ${ids.join(", ")} (vector.listBrushes lists them).`;
4568
4657
  }
4569
4658
  function vectorBrushstrokeDefaultColour(id, user = [], scheme = "light") {
4570
- const brush = _nullishCoalesce(_chunkEU2ZZA6Lcjs.BRUSH_PRESETS.find((b) => b.id === id), () => ( user.find((b) => b.id === id)));
4571
- return brush ? _chunkJBZRVLXVcjs.brushColourHex.call(void 0, _optionalChain([brush, 'access', _162 => _162.colour, 'optionalAccess', _163 => _163.default]), scheme) : null;
4659
+ const brush = _nullishCoalesce(_chunkGHGBIAWQcjs.BRUSH_PRESETS.find((b) => b.id === id), () => ( user.find((b) => b.id === id)));
4660
+ return brush ? _chunkJBZRVLXVcjs.brushColourHex.call(void 0, _optionalChain([brush, 'access', _170 => _170.colour, 'optionalAccess', _171 => _171.default]), scheme) : null;
4572
4661
  }
4573
4662
  function sanitizeVectorBrushstroke(value, user = []) {
4574
4663
  if (!value || typeof value !== "object") return null;
@@ -4692,7 +4781,7 @@ function strokePaintOf(node, layer, brush, length2) {
4692
4781
  const color2 = [c[0] * 255, c[1] * 255, c[2] * 255, c[3] * 255].map(Math.round);
4693
4782
  if (layer.brush.paint) return { color: color2, paint: layer.brush.paint, within: null };
4694
4783
  const g = layer.paint;
4695
- if (isVectorGradient(g) && _optionalChain([g, 'access', _164 => _164.stops, 'optionalAccess', _165 => _165.length])) {
4784
+ if (isVectorGradient(g) && _optionalChain([g, 'access', _172 => _172.stops, 'optionalAccess', _173 => _173.length])) {
4696
4785
  const mode = _nullishCoalesce(g.strokeMode, () => ( "within"));
4697
4786
  if (mode === "along") return { color: [color2[0], color2[1], color2[2], 255], paint: gradientPaint(g, { by: "distance", length: Math.max(1, length2), repeat: REPEAT[_nullishCoalesce(g.spread, () => ( "pad"))], unit: "px" }), within: null };
4698
4787
  if (mode === "across") return { color: [color2[0], color2[1], color2[2], 255], paint: gradientPaint(g, { by: "across-tip" }), within: null };
@@ -4847,7 +4936,7 @@ function vectorBrushstrokeImages(node, layer, context = {}) {
4847
4936
  const source = usesVectorBackdrop(engine) && backdropSource ? backdropSource(document2, node, Math.max(0, index), settle) : null;
4848
4937
  const deps = source ? [...source.deps, wetGeneration] : null;
4849
4938
  let byLayer = layerCache.get(node);
4850
- const hit = _optionalChain([byLayer, 'optionalAccess', _166 => _166.get, 'call', _167 => _167(layer)]);
4939
+ const hit = _optionalChain([byLayer, 'optionalAccess', _174 => _174.get, 'call', _175 => _175(layer)]);
4851
4940
  const stale = hit && (hit.pending.length && hit.pending.some((k) => wetSettled.has(k)) || settle === "now" && !hit.settled);
4852
4941
  if (hit && sameDeps(hit.deps, deps) && !stale) return hit.images;
4853
4942
  const brush = layer.brush.size ? { ...preset2, tip: { ...preset2.tip, size: layer.brush.size } } : preset2;
@@ -4872,7 +4961,7 @@ function vectorBrushstrokeImages(node, layer, context = {}) {
4872
4961
  const key = mediaKey(input, brush, options);
4873
4962
  stroke = renderBackdropBrushstroke(input, brush, {
4874
4963
  ...options,
4875
- backdrop: _nullishCoalesce(_optionalChain([source, 'optionalAccess', _168 => _168.backdrop]), () => ( null)),
4964
+ backdrop: _nullishCoalesce(_optionalChain([source, 'optionalAccess', _176 => _176.backdrop]), () => ( null)),
4876
4965
  cache: (bytes) => {
4877
4966
  const k = `${key}:${hashBytes(bytes).toString(16)}`;
4878
4967
  return { get: () => backdropResults.get(k), set: (img) => backdropResults.set(k, img) };
@@ -4976,7 +5065,7 @@ function withVectorFills(node, fills) {
4976
5065
  const next = { ...node };
4977
5066
  if (fills.length === 0 || fills.length === 1 && isPlainVectorPaintLayer(fills[0])) {
4978
5067
  delete next.fills;
4979
- next.fill = _nullishCoalesce(_optionalChain([fills, 'access', _169 => _169[0], 'optionalAccess', _170 => _170.paint]), () => ( null));
5068
+ next.fill = _nullishCoalesce(_optionalChain([fills, 'access', _177 => _177[0], 'optionalAccess', _178 => _178.paint]), () => ( null));
4980
5069
  return next;
4981
5070
  }
4982
5071
  next.fills = fills.map((l) => ({ ...l }));
@@ -5001,8 +5090,8 @@ function withVectorStrokes(node, strokes) {
5001
5090
  var json = (v2) => JSON.stringify(_nullishCoalesce(v2, () => ( null)));
5002
5091
  function strokeShorthandDiff(node, top) {
5003
5092
  const out = [];
5004
- if (json(node.stroke) !== json(_optionalChain([top, 'optionalAccess', _171 => _171.paint]))) out.push("stroke");
5005
- for (const key of VECTOR_STROKE_SETTING_KEYS) if (json(node[key]) !== json(_optionalChain([top, 'optionalAccess', _172 => _172[key]]))) out.push(key);
5093
+ if (json(node.stroke) !== json(_optionalChain([top, 'optionalAccess', _179 => _179.paint]))) out.push("stroke");
5094
+ for (const key of VECTOR_STROKE_SETTING_KEYS) if (json(node[key]) !== json(_optionalChain([top, 'optionalAccess', _180 => _180[key]]))) out.push(key);
5006
5095
  return out;
5007
5096
  }
5008
5097
  var checked = /* @__PURE__ */ new WeakSet();
@@ -5019,7 +5108,7 @@ function normalizeVectorPaintStacks(node, prefer = "shorthand") {
5019
5108
  if (Array.isArray(node.fills)) {
5020
5109
  let fills = node.fills;
5021
5110
  const top = fills[fills.length - 1];
5022
- if (prefer === "shorthand" && json(node.fill) !== json(_optionalChain([top, 'optionalAccess', _173 => _173.paint]))) {
5111
+ if (prefer === "shorthand" && json(node.fill) !== json(_optionalChain([top, 'optionalAccess', _181 => _181.paint]))) {
5023
5112
  if (!draws(node.fill)) fills = [];
5024
5113
  else fills = top ? [...fills.slice(0, -1), { ...top, paint: node.fill }] : [{ paint: node.fill }];
5025
5114
  }
@@ -5235,8 +5324,8 @@ var Measured = class {
5235
5324
  append(sa, sb, out) {
5236
5325
  for (const piece of _chunkGF2RBSDMcjs.trimSegments.call(void 0, this.segs, sa, sb, this.lens)) {
5237
5326
  if (degenerate(piece)) continue;
5238
- const last = _optionalChain([out, 'access', _174 => _174[out.length - 1], 'optionalAccess', _175 => _175.segs]);
5239
- const end = _optionalChain([last, 'optionalAccess', _176 => _176[last.length - 1], 'optionalAccess', _177 => _177.at, 'call', _178 => _178(-1)]);
5327
+ const last = _optionalChain([out, 'access', _182 => _182[out.length - 1], 'optionalAccess', _183 => _183.segs]);
5328
+ const end = _optionalChain([last, 'optionalAccess', _184 => _184[last.length - 1], 'optionalAccess', _185 => _185.at, 'call', _186 => _186(-1)]);
5240
5329
  if (!end || Math.hypot(end[0] - piece[0][0], end[1] - piece[0][1]) > 1e-6) out.push({ segs: [piece], closed: false });
5241
5330
  else last.push(piece);
5242
5331
  }
@@ -5548,9 +5637,9 @@ function vectorRepeaterCopies(r, pivot) {
5548
5637
  for (let i = 0; i < n; i++) {
5549
5638
  const k = i + offset;
5550
5639
  let m = translateMatrix(-pivot.x, -pivot.y);
5551
- m = multiplyMatrices(m, scaleMatrix(Math.pow((_nullishCoalesce(_optionalChain([r, 'access', _179 => _179.scale, 'optionalAccess', _180 => _180.x]), () => ( 100))) / 100, k), Math.pow((_nullishCoalesce(_optionalChain([r, 'access', _181 => _181.scale, 'optionalAccess', _182 => _182.y]), () => ( 100))) / 100, k)));
5640
+ m = multiplyMatrices(m, scaleMatrix(Math.pow((_nullishCoalesce(_optionalChain([r, 'access', _187 => _187.scale, 'optionalAccess', _188 => _188.x]), () => ( 100))) / 100, k), Math.pow((_nullishCoalesce(_optionalChain([r, 'access', _189 => _189.scale, 'optionalAccess', _190 => _190.y]), () => ( 100))) / 100, k)));
5552
5641
  m = multiplyMatrices(m, rotateMatrix((_nullishCoalesce(r.rotation, () => ( 0))) * k));
5553
- m = multiplyMatrices(m, translateMatrix(pivot.x + (_nullishCoalesce(_optionalChain([r, 'access', _183 => _183.position, 'optionalAccess', _184 => _184.x]), () => ( 0))) * k, pivot.y + (_nullishCoalesce(_optionalChain([r, 'access', _185 => _185.position, 'optionalAccess', _186 => _186.y]), () => ( 0))) * k));
5642
+ m = multiplyMatrices(m, translateMatrix(pivot.x + (_nullishCoalesce(_optionalChain([r, 'access', _191 => _191.position, 'optionalAccess', _192 => _192.x]), () => ( 0))) * k, pivot.y + (_nullishCoalesce(_optionalChain([r, 'access', _193 => _193.position, 'optionalAccess', _194 => _194.y]), () => ( 0))) * k));
5554
5643
  const t = n > 1 ? i / (n - 1) : 0;
5555
5644
  const partial = i + 1 === n && fract > 0 ? fract : 1;
5556
5645
  out.push({ index: i, matrix: m, opacity: Math.min(1, Math.max(0, (so + (eo - so) * t) * partial)) });
@@ -5714,7 +5803,7 @@ function mapBezierPath(path, f, tolerance = 0.1, options = {}) {
5714
5803
 
5715
5804
  // src/vector/frames.ts
5716
5805
  function isVectorFrame(node) {
5717
- return _optionalChain([node, 'optionalAccess', _187 => _187.type]) === "group" && !!node.frame && !node.blend && !node.liveBoolean && !node.mask;
5806
+ return _optionalChain([node, 'optionalAccess', _195 => _195.type]) === "group" && !!node.frame && !node.blend && !node.liveBoolean && !node.mask;
5718
5807
  }
5719
5808
  function vectorFrameRectPath(frame) {
5720
5809
  const { x, y, width: w, height: h } = frame;
@@ -5759,8 +5848,8 @@ function placeSpan(rule, a0, a1, f0, f1, g0, g1) {
5759
5848
  }
5760
5849
  }
5761
5850
  function vectorFrameChildMatrix(resizing, box, from, to) {
5762
- const [x0, x1] = placeSpan(_nullishCoalesce(H[_nullishCoalesce(_optionalChain([resizing, 'optionalAccess', _188 => _188.horizontal]), () => ( "left"))], () => ( "start")), box.x, box.x + box.width, from.x, from.x + from.width, to.x, to.x + to.width);
5763
- const [y0, y1] = placeSpan(_nullishCoalesce(V[_nullishCoalesce(_optionalChain([resizing, 'optionalAccess', _189 => _189.vertical]), () => ( "top"))], () => ( "start")), box.y, box.y + box.height, from.y, from.y + from.height, to.y, to.y + to.height);
5851
+ const [x0, x1] = placeSpan(_nullishCoalesce(H[_nullishCoalesce(_optionalChain([resizing, 'optionalAccess', _196 => _196.horizontal]), () => ( "left"))], () => ( "start")), box.x, box.x + box.width, from.x, from.x + from.width, to.x, to.x + to.width);
5852
+ const [y0, y1] = placeSpan(_nullishCoalesce(V[_nullishCoalesce(_optionalChain([resizing, 'optionalAccess', _197 => _197.vertical]), () => ( "top"))], () => ( "start")), box.y, box.y + box.height, from.y, from.y + from.height, to.y, to.y + to.height);
5764
5853
  const sx = box.width > 1e-9 ? (x1 - x0) / box.width : 1;
5765
5854
  const sy = box.height > 1e-9 ? (y1 - y0) / box.height : 1;
5766
5855
  return [sx, 0, 0, sy, x0 - sx * box.x, y0 - sy * box.y];
@@ -5816,7 +5905,7 @@ function vectorFrameDocument(doc, id, find) {
5816
5905
  height,
5817
5906
  ...doc.background ? { background: doc.background } : {},
5818
5907
  nodes: [placed],
5819
- ..._optionalChain([doc, 'access', _190 => _190.symbols, 'optionalAccess', _191 => _191.length]) ? { symbols: doc.symbols } : {}
5908
+ ..._optionalChain([doc, 'access', _198 => _198.symbols, 'optionalAccess', _199 => _199.length]) ? { symbols: doc.symbols } : {}
5820
5909
  };
5821
5910
  }
5822
5911
  function getVectorFramePanel(state) {
@@ -5836,7 +5925,7 @@ function getVectorFramePanel(state) {
5836
5925
  const one = (values) => values.every((v2) => v2 === values[0]) ? values[0] : "mixed";
5837
5926
  return {
5838
5927
  frame: f ? { id: f.id, name: _nullishCoalesce(f.name, () => ( "Frame")), artboard: parents.get(f.id) === null, frame: f.frame } : null,
5839
- resizing: children.length ? { ids: children.map((c) => c.id), horizontal: one(children.map((c) => _nullishCoalesce(_optionalChain([c, 'access', _192 => _192.resizing, 'optionalAccess', _193 => _193.horizontal]), () => ( "left")))), vertical: one(children.map((c) => _nullishCoalesce(_optionalChain([c, 'access', _194 => _194.resizing, 'optionalAccess', _195 => _195.vertical]), () => ( "top")))) } : null
5928
+ resizing: children.length ? { ids: children.map((c) => c.id), horizontal: one(children.map((c) => _nullishCoalesce(_optionalChain([c, 'access', _200 => _200.resizing, 'optionalAccess', _201 => _201.horizontal]), () => ( "left")))), vertical: one(children.map((c) => _nullishCoalesce(_optionalChain([c, 'access', _202 => _202.resizing, 'optionalAccess', _203 => _203.vertical]), () => ( "top")))) } : null
5840
5929
  };
5841
5930
  }
5842
5931
 
@@ -6222,7 +6311,7 @@ function normalizeVectorFilterParams(type, params, base) {
6222
6311
  if (!isVectorFilterType(type)) return null;
6223
6312
  const out = { ...VECTOR_FILTER_DEFAULTS[type], ..._nullishCoalesce(base, () => ( {})) };
6224
6313
  for (const spec of VECTOR_FILTER_PARAM_SPECS[type]) {
6225
- const v2 = _optionalChain([params, 'optionalAccess', _196 => _196[spec.key]]);
6314
+ const v2 = _optionalChain([params, 'optionalAccess', _204 => _204[spec.key]]);
6226
6315
  if (v2 === void 0) continue;
6227
6316
  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));
6228
6317
  else if (spec.kind === "color" && typeof v2 === "string" && v2.trim()) out[spec.key] = v2.trim();
@@ -6354,7 +6443,7 @@ function vectorFilterSvg(filters, id, bounds) {
6354
6443
  primitives.push(fe("feGaussianBlur", { in: body, stdDeviation: round(f.params.radius / 2), result: name("body") }));
6355
6444
  body = name("body");
6356
6445
  }
6357
- const lastResult = _optionalChain([primitives, 'access', _197 => _197[primitives.length - 1], 'optionalAccess', _198 => _198.attrs, 'access', _199 => _199.result]);
6446
+ const lastResult = _optionalChain([primitives, 'access', _205 => _205[primitives.length - 1], 'optionalAccess', _206 => _206.attrs, 'access', _207 => _207.result]);
6358
6447
  if (lastResult !== body) primitives.push(fe("feMerge", {}, [fe("feMergeNode", { in: body })]));
6359
6448
  const pad = vectorFilterReach(active) + 2;
6360
6449
  return {
@@ -6369,7 +6458,7 @@ function vectorFilterSvg(filters, id, bounds) {
6369
6458
  var escapeAttr = (value) => value.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
6370
6459
  function primitiveMarkup(p) {
6371
6460
  const attrs = Object.entries(p.attrs).map(([k, v2]) => ` ${k}="${escapeAttr(String(v2))}"`).join("");
6372
- return _optionalChain([p, 'access', _200 => _200.children, 'optionalAccess', _201 => _201.length]) ? `<${p.tag}${attrs}>${p.children.map(primitiveMarkup).join("")}</${p.tag}>` : `<${p.tag}${attrs}/>`;
6461
+ return _optionalChain([p, 'access', _208 => _208.children, 'optionalAccess', _209 => _209.length]) ? `<${p.tag}${attrs}>${p.children.map(primitiveMarkup).join("")}</${p.tag}>` : `<${p.tag}${attrs}/>`;
6373
6462
  }
6374
6463
  function vectorFilterMarkup(filter, extra = "") {
6375
6464
  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>`;
@@ -6387,7 +6476,7 @@ function sanitizeVectorMask(value) {
6387
6476
  return r.invert === true ? { type: r.type, invert: true } : { type: r.type };
6388
6477
  }
6389
6478
  function isVectorMaskGroup(node) {
6390
- return _optionalChain([node, 'optionalAccess', _202 => _202.type]) === "group" && !!node.mask && isVectorMaskType(node.mask.type) && !node.blend && !node.liveBoolean && node.children.length > 0;
6479
+ return _optionalChain([node, 'optionalAccess', _210 => _210.type]) === "group" && !!node.mask && isVectorMaskType(node.mask.type) && !node.blend && !node.liveBoolean && node.children.length > 0;
6391
6480
  }
6392
6481
  function isVectorMaskActive(node) {
6393
6482
  return isVectorMaskGroup(node) && node.children[0].visible !== false;
@@ -6422,7 +6511,7 @@ function vectorMaskRegionShapes(node, type, parent = IDENTITY_MATRIX, self = tru
6422
6511
  if (!self && node.visible === false) return [];
6423
6512
  if (isVectorFrame(node)) node = vectorFrameDrawn(node);
6424
6513
  const m = multiplyMatrices(nodeMatrix(node), parent);
6425
- if (isVectorMaskActive(node) || node.type === "group" && _optionalChain([node, 'access', _203 => _203.effects, 'optionalAccess', _204 => _204.length])) {
6514
+ if (isVectorMaskActive(node) || node.type === "group" && _optionalChain([node, 'access', _211 => _211.effects, 'optionalAccess', _212 => _212.length])) {
6426
6515
  return vectorAppearanceShapes(node).flatMap((s) => regionOfPath(s.path, s.source, type, m));
6427
6516
  }
6428
6517
  const drawn = expandVectorAppearance(node);
@@ -6627,7 +6716,7 @@ function fitRuns(runs, length2, fallback) {
6627
6716
  }
6628
6717
  if (left2 > 0) {
6629
6718
  if (out.length) out[out.length - 1] = { ...out[out.length - 1], length: out[out.length - 1].length + left2 };
6630
- else out.push({ length: left2, style: _nullishCoalesce(_optionalChain([runs, 'access', _205 => _205[runs.length - 1], 'optionalAccess', _206 => _206.style]), () => ( fallback)) });
6719
+ else out.push({ length: left2, style: _nullishCoalesce(_optionalChain([runs, 'access', _213 => _213[runs.length - 1], 'optionalAccess', _214 => _214.style]), () => ( fallback)) });
6631
6720
  }
6632
6721
  return compact(out);
6633
6722
  }
@@ -6637,7 +6726,7 @@ function styleAt(runs, index, fallback) {
6637
6726
  if (index < at2 + r.length) return r.style;
6638
6727
  at2 += r.length;
6639
6728
  }
6640
- return _nullishCoalesce(_optionalChain([runs, 'access', _207 => _207[runs.length - 1], 'optionalAccess', _208 => _208.style]), () => ( fallback));
6729
+ return _nullishCoalesce(_optionalChain([runs, 'access', _215 => _215[runs.length - 1], 'optionalAccess', _216 => _216.style]), () => ( fallback));
6641
6730
  }
6642
6731
  function restyleRange(runs, start, end, patch) {
6643
6732
  const out = [];
@@ -6693,7 +6782,7 @@ function paragraphRanges(text) {
6693
6782
  return out;
6694
6783
  }
6695
6784
  function fitParagraphRuns(runs, text) {
6696
- const fallback = _nullishCoalesce(_optionalChain([runs, 'access', _209 => _209[0], 'optionalAccess', _210 => _210.style]), () => ( {}));
6785
+ const fallback = _nullishCoalesce(_optionalChain([runs, 'access', _217 => _217[0], 'optionalAccess', _218 => _218.style]), () => ( {}));
6697
6786
  const out = compact(paragraphRanges(text).map((p) => ({ length: p.end - p.start, style: styleAt(runs, p.start, fallback) })));
6698
6787
  return out.length ? out : [{ length: 0, style: fallback }];
6699
6788
  }
@@ -6743,7 +6832,7 @@ function textLineRect(l) {
6743
6832
  var layoutCache = /* @__PURE__ */ new WeakMap();
6744
6833
  function layoutText(layer, shaper) {
6745
6834
  let byShaper = layoutCache.get(layer);
6746
- const hit = _optionalChain([byShaper, 'optionalAccess', _211 => _211.get, 'call', _212 => _212(shaper.id)]);
6835
+ const hit = _optionalChain([byShaper, 'optionalAccess', _219 => _219.get, 'call', _220 => _220(shaper.id)]);
6747
6836
  if (hit) return hit;
6748
6837
  const out = computeLayout(layer, shaper);
6749
6838
  if (!byShaper) {
@@ -6807,7 +6896,7 @@ function computeLayout(layer, shaper) {
6807
6896
  const code = seg.charCodeAt(k);
6808
6897
  if (isLow(code) && index > 0 && isHigh(text.charCodeAt(index - 1))) {
6809
6898
  const prev = chars[chars.length - 1];
6810
- if (_optionalChain([prev, 'optionalAccess', _213 => _213.up])) {
6899
+ if (_optionalChain([prev, 'optionalAccess', _221 => _221.up])) {
6811
6900
  chars.push({ index, ch: seg[k], advance: 0, style, up: prev.up, low: true });
6812
6901
  } else chars.push({ index, ch: seg[k], advance, style, low: true });
6813
6902
  continue;
@@ -7135,7 +7224,7 @@ function createCanvasTextShaper(options = {}) {
7135
7224
  return null;
7136
7225
  })));
7137
7226
  const canvas = make(1, 1);
7138
- const ctx = _optionalChain([canvas, 'optionalAccess', _214 => _214.getContext, 'call', _215 => _215("2d")]);
7227
+ const ctx = _optionalChain([canvas, 'optionalAccess', _222 => _222.getContext, 'call', _223 => _223("2d")]);
7139
7228
  if (!ctx || typeof ctx.measureText !== "function") return null;
7140
7229
  const fallback = _nullishCoalesce(options.fallbackFamily, () => ( "sans-serif"));
7141
7230
  const available = /* @__PURE__ */ new Map();
@@ -7208,10 +7297,10 @@ function createOutlineTextShaper(fonts, options = {}) {
7208
7297
  const entries = fonts.map((f) => {
7209
7298
  const e = "face" in f ? f : { face: f };
7210
7299
  const names = e.face.names;
7211
- const family = _nullishCoalesce(_nullishCoalesce(_nullishCoalesce(e.family, () => ( _optionalChain([names, 'optionalAccess', _216 => _216.fontFamily, 'optionalAccess', _217 => _217.en]))), () => ( Object.values(_nullishCoalesce(_optionalChain([names, 'optionalAccess', _218 => _218.fontFamily]), () => ( {})))[0])), () => ( "Font"));
7212
- const weight = _nullishCoalesce(_nullishCoalesce(e.weight, () => ( _optionalChain([e, 'access', _219 => _219.face, 'access', _220 => _220.tables, 'optionalAccess', _221 => _221.os2, 'optionalAccess', _222 => _222.usWeightClass]))), () => ( 400));
7213
- const italic = _nullishCoalesce(e.italic, () => ( Boolean((_nullishCoalesce(_optionalChain([e, 'access', _223 => _223.face, 'access', _224 => _224.tables, 'optionalAccess', _225 => _225.os2, 'optionalAccess', _226 => _226.fsSelection]), () => ( 0))) & 1)));
7214
- const postScript = _nullishCoalesce(_optionalChain([names, 'optionalAccess', _227 => _227.postScriptName, 'optionalAccess', _228 => _228.en]), () => ( Object.values(_nullishCoalesce(_optionalChain([names, 'optionalAccess', _229 => _229.postScriptName]), () => ( {})))[0]));
7300
+ const family = _nullishCoalesce(_nullishCoalesce(_nullishCoalesce(e.family, () => ( _optionalChain([names, 'optionalAccess', _224 => _224.fontFamily, 'optionalAccess', _225 => _225.en]))), () => ( Object.values(_nullishCoalesce(_optionalChain([names, 'optionalAccess', _226 => _226.fontFamily]), () => ( {})))[0])), () => ( "Font"));
7301
+ const weight = _nullishCoalesce(_nullishCoalesce(e.weight, () => ( _optionalChain([e, 'access', _227 => _227.face, 'access', _228 => _228.tables, 'optionalAccess', _229 => _229.os2, 'optionalAccess', _230 => _230.usWeightClass]))), () => ( 400));
7302
+ const italic = _nullishCoalesce(e.italic, () => ( Boolean((_nullishCoalesce(_optionalChain([e, 'access', _231 => _231.face, 'access', _232 => _232.tables, 'optionalAccess', _233 => _233.os2, 'optionalAccess', _234 => _234.fsSelection]), () => ( 0))) & 1)));
7303
+ const postScript = _nullishCoalesce(_optionalChain([names, 'optionalAccess', _235 => _235.postScriptName, 'optionalAccess', _236 => _236.en]), () => ( Object.values(_nullishCoalesce(_optionalChain([names, 'optionalAccess', _237 => _237.postScriptName]), () => ( {})))[0]));
7215
7304
  return { face: e.face, family, key: family.toLowerCase(), weight, italic, postScript };
7216
7305
  });
7217
7306
  const fallbackKey = (_nullishCoalesce(options.fallback, () => ( entries[0].family))).toLowerCase();
@@ -7258,12 +7347,12 @@ function createOutlineTextShaper(fonts, options = {}) {
7258
7347
  return out;
7259
7348
  },
7260
7349
  outline(text, font, x, y, opts) {
7261
- return toPath(pick(font).entry.face.getPath(text, x, y, font.size, _optionalChain([opts, 'optionalAccess', _230 => _230.vertical]) ? { kerning: true, vertical: true } : { kerning: true }).commands);
7350
+ return toPath(pick(font).entry.face.getPath(text, x, y, font.size, _optionalChain([opts, 'optionalAccess', _238 => _238.vertical]) ? { kerning: true, vertical: true } : { kerning: true }).commands);
7262
7351
  },
7263
7352
  vertical(char, font) {
7264
7353
  const { face } = pick(font).entry;
7265
7354
  const k = font.size / face.unitsPerEm;
7266
- const v2 = _optionalChain([face, 'access', _231 => _231.getVerticalMetrics, 'optionalCall', _232 => _232(char)]);
7355
+ const v2 = _optionalChain([face, 'access', _239 => _239.getVerticalMetrics, 'optionalCall', _240 => _240(char)]);
7267
7356
  if (v2) return { advance: v2.advance * k, originY: v2.originY * k, alternate: v2.alternate };
7268
7357
  return { advance: (face.ascender - face.descender) * k, originY: face.ascender * k, alternate: false };
7269
7358
  },
@@ -7324,7 +7413,7 @@ function vectorTextHasOutlines() {
7324
7413
  return typeof getVectorTextShaper().outline === "function";
7325
7414
  }
7326
7415
  function vectorTextFamilies() {
7327
- return _nullishCoalesce(_optionalChain([getVectorTextShaper, 'call', _233 => _233(), 'access', _234 => _234.families, 'optionalCall', _235 => _235()]), () => ( ["sans-serif", "serif", "monospace"]));
7416
+ return _nullishCoalesce(_optionalChain([getVectorTextShaper, 'call', _241 => _241(), 'access', _242 => _242.families, 'optionalCall', _243 => _243()]), () => ( ["sans-serif", "serif", "monospace"]));
7328
7417
  }
7329
7418
  var DEFAULT_VECTOR_FONT = { fontFamily: "sans-serif", fontWeight: 400, fontSize: 24 };
7330
7419
  var VECTOR_CHARACTER_STYLE_KEYS = ["fontFamily", "fontWeight", "italic", "fontSize", "tracking", "leading", "baselineShift", "underline", "strikethrough", "upright"];
@@ -7500,7 +7589,7 @@ function computeLayout2(node, shaper) {
7500
7589
  const fragments = [];
7501
7590
  const lines = [];
7502
7591
  let overflow = false;
7503
- const fillOf = (f) => _optionalChain([runs, 'access', _236 => _236.find, 'call', _237 => _237((r) => f.start >= r.start && f.start < r.end), 'optionalAccess', _238 => _238.fill]);
7592
+ const fillOf = (f) => _optionalChain([runs, 'access', _244 => _244.find, 'call', _245 => _245((r) => f.start >= r.start && f.start < r.end), 'optionalAccess', _246 => _246.fill]);
7504
7593
  const styleOf = (f) => {
7505
7594
  const { color: _c, opacity: _o, postScriptName: _p, ...style } = f.style;
7506
7595
  return style;
@@ -7539,11 +7628,11 @@ function computeLayout2(node, shaper) {
7539
7628
  } else {
7540
7629
  const line = text.lines[0];
7541
7630
  const measure = measureVectorPath(subpathPath(frame.path), !!frame.flip);
7542
- const align = _nullishCoalesce(_optionalChain([node, 'access', _239 => _239.paragraph, 'optionalAccess', _240 => _240.align]), () => ( "left"));
7631
+ const align = _nullishCoalesce(_optionalChain([node, 'access', _247 => _247.paragraph, 'optionalAccess', _248 => _248.align]), () => ( "left"));
7543
7632
  const start = Math.max(0, _nullishCoalesce(frame.start, () => ( 0)));
7544
7633
  const end = Math.max(0, _nullishCoalesce(frame.end, () => ( 0)));
7545
7634
  const upright = frame.orientation === "upright";
7546
- const baselineOffset = pathBaselineOffset(_nullishCoalesce(frame.baseline, () => ( "baseline")), _nullishCoalesce(_optionalChain([line, 'optionalAccess', _241 => _241.ascent]), () => ( 0)), _nullishCoalesce(_optionalChain([line, 'optionalAccess', _242 => _242.descent]), () => ( 0)));
7635
+ const baselineOffset = pathBaselineOffset(_nullishCoalesce(frame.baseline, () => ( "baseline")), _nullishCoalesce(_optionalChain([line, 'optionalAccess', _249 => _249.ascent]), () => ( 0)), _nullishCoalesce(_optionalChain([line, 'optionalAccess', _250 => _250.descent]), () => ( 0)));
7547
7636
  if (line) {
7548
7637
  const chars = line.chars.filter((c) => {
7549
7638
  const lo = block.text.charCodeAt(c.index);
@@ -7552,7 +7641,7 @@ function computeLayout2(node, shaper) {
7552
7641
  const advanceOf = (c) => {
7553
7642
  const pair = charAt(block.text, c.index).length === 2;
7554
7643
  const low = pair ? line.chars.find((d) => d.index === c.index + 1) : void 0;
7555
- return c.advance + (_nullishCoalesce(_optionalChain([low, 'optionalAccess', _243 => _243.advance]), () => ( 0)));
7644
+ return c.advance + (_nullishCoalesce(_optionalChain([low, 'optionalAccess', _251 => _251.advance]), () => ( 0)));
7556
7645
  };
7557
7646
  const pivots = chars.map((c) => c.x + advanceOf(c) / 2);
7558
7647
  const positions = vectorPathTextPositions(pivots, [line.x, line.x + line.width], align, measure.length, start, end);
@@ -7607,7 +7696,7 @@ function computeLayout2(node, shaper) {
7607
7696
  if (x0 < Infinity) bounds = { x: x0, y: y0, width: x1 - x0, height: y1 - y0 };
7608
7697
  else if (frame.kind === "point") {
7609
7698
  const l = text.lines[0];
7610
- bounds = { x: frame.x, y: frame.y - (_nullishCoalesce(_optionalChain([l, 'optionalAccess', _244 => _244.ascent]), () => ( 0))), width: 0, height: (_nullishCoalesce(_optionalChain([l, 'optionalAccess', _245 => _245.ascent]), () => ( 0))) + (_nullishCoalesce(_optionalChain([l, 'optionalAccess', _246 => _246.descent]), () => ( 0))) };
7699
+ bounds = { x: frame.x, y: frame.y - (_nullishCoalesce(_optionalChain([l, 'optionalAccess', _252 => _252.ascent]), () => ( 0))), width: 0, height: (_nullishCoalesce(_optionalChain([l, 'optionalAccess', _253 => _253.ascent]), () => ( 0))) + (_nullishCoalesce(_optionalChain([l, 'optionalAccess', _254 => _254.descent]), () => ( 0))) };
7611
7700
  }
7612
7701
  }
7613
7702
  return { shaper: shaper.id, glyphs, fragments, lines, origin, text, bounds, overflow, missingFonts: text.missingFonts };
@@ -7728,7 +7817,7 @@ function vectorTextCaret(node, index) {
7728
7817
  const t = { x: Math.cos(r), y: Math.sin(r) };
7729
7818
  const n2 = { x: -t.y, y: t.x };
7730
7819
  const o = { x: g2.x + t.x * u, y: g2.y + t.y * u };
7731
- 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', _247 => _247.fragments, 'access', _248 => _248[g2.fragment], 'optionalAccess', _249 => _249.line]), () => ( 0)) };
7820
+ 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', _255 => _255.fragments, 'access', _256 => _256[g2.fragment], 'optionalAccess', _257 => _257.line]), () => ( 0)) };
7732
7821
  };
7733
7822
  if (node.frame.kind !== "path") {
7734
7823
  const c = caretAt(layout.text, index);
@@ -7868,7 +7957,7 @@ function sanitizeVectorTextFrame(value, path = "frame") {
7868
7957
  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) };
7869
7958
  if (f.kind === "path") {
7870
7959
  const sp = f.path;
7871
- if (!sp || !Array.isArray(sp.anchors) || sp.anchors.length < 2 || !sp.anchors.every((a) => isNum(_optionalChain([a, 'optionalAccess', _250 => _250.x])) && isNum(_optionalChain([a, 'optionalAccess', _251 => _251.y])))) fail(`${path}.path must be a subpath with at least two anchors.`);
7960
+ if (!sp || !Array.isArray(sp.anchors) || sp.anchors.length < 2 || !sp.anchors.every((a) => isNum(_optionalChain([a, 'optionalAccess', _258 => _258.x])) && isNum(_optionalChain([a, 'optionalAccess', _259 => _259.y])))) fail(`${path}.path must be a subpath with at least two anchors.`);
7872
7961
  const out = { kind: "path", path: { closed: !!sp.closed, anchors: sp.anchors.map((a) => ({ ...a })) } };
7873
7962
  if (f.start !== void 0 && f.start !== 0) out.start = num2(f.start, `${path}.start`, 0, 1e7);
7874
7963
  if (f.end !== void 0 && f.end !== 0) out.end = num2(f.end, `${path}.end`, 0, 1e7);
@@ -7886,7 +7975,7 @@ function sanitizeVectorTextFrame(value, path = "frame") {
7886
7975
  return fail(`${path}.kind must be point, area or path, got ${JSON.stringify(f.kind)}.`);
7887
7976
  }
7888
7977
  function normalizeVectorTextRuns(text, runs) {
7889
- if (!_optionalChain([runs, 'optionalAccess', _252 => _252.length])) return null;
7978
+ if (!_optionalChain([runs, 'optionalAccess', _260 => _260.length])) return null;
7890
7979
  const cleaned = fitVectorTextRuns(
7891
7980
  runs.map((r) => ({ length: r.length, style: stripUndefined(r.style) })),
7892
7981
  text.length
@@ -7926,7 +8015,7 @@ function replaceVectorText(node, start, end, insert) {
7926
8015
  const clean2 = insert.replace(/\r\n?/g, "\n");
7927
8016
  const text = node.text.slice(0, start) + clean2 + node.text.slice(end);
7928
8017
  let runs = null;
7929
- if (_optionalChain([node, 'access', _253 => _253.runs, 'optionalAccess', _254 => _254.length])) {
8018
+ if (_optionalChain([node, 'access', _261 => _261.runs, 'optionalAccess', _262 => _262.length])) {
7930
8019
  const fitted = fitVectorTextRuns(node.runs, node.text.length);
7931
8020
  const style = styleAt(fitted, start > 0 ? start - 1 : start, {});
7932
8021
  runs = normalizeVectorTextRuns(text, spliceRuns(fitted, start, end, clean2.length, style));
@@ -7942,7 +8031,7 @@ function styleVectorText(node, start, end, patch) {
7942
8031
  if (whole) {
7943
8032
  let next2 = { ...node, font: patchVectorCharacterStyle(node.font, fields, "style") };
7944
8033
  const keys = Object.keys(fields).filter((k) => fields[k] !== void 0);
7945
- if (_optionalChain([next2, 'access', _255 => _255.runs, 'optionalAccess', _256 => _256.length]) && (keys.length || fill !== void 0)) {
8034
+ if (_optionalChain([next2, 'access', _263 => _263.runs, 'optionalAccess', _264 => _264.length]) && (keys.length || fill !== void 0)) {
7946
8035
  const runs2 = normalizeVectorTextRuns(
7947
8036
  next2.text,
7948
8037
  next2.runs.map((r) => {
@@ -7987,7 +8076,7 @@ function bakeVectorTextGeometry(node, m) {
7987
8076
  ...s.baselineShift !== void 0 ? { baselineShift: s.baselineShift * k } : {}
7988
8077
  });
7989
8078
  const font = scaleStyle(node.font);
7990
- const runs = _optionalChain([node, 'access', _257 => _257.runs, 'optionalAccess', _258 => _258.map, 'call', _259 => _259((r) => ({ length: r.length, style: scaleStyle(r.style) }))]);
8079
+ const runs = _optionalChain([node, 'access', _265 => _265.runs, 'optionalAccess', _266 => _266.map, 'call', _267 => _267((r) => ({ length: r.length, style: scaleStyle(r.style) }))]);
7991
8080
  const p = node.paragraph;
7992
8081
  const paragraph = p ? {
7993
8082
  ...p,
@@ -8276,7 +8365,7 @@ function vectorInstanceGroup(node, bake) {
8276
8365
  const m = _nullishCoalesce(node.transform, () => ( [1, 0, 0, 1, 0, 0]));
8277
8366
  const { rigid, residual } = decomposeRigid(m);
8278
8367
  const k = Math.sqrt(Math.abs(residual[0] * residual[3] - residual[1] * residual[2]));
8279
- const hidden = new Set(_nullishCoalesce(_optionalChain([node, 'access', _260 => _260.overrides, 'optionalAccess', _261 => _261.hidden]), () => ( [])));
8368
+ const hidden = new Set(_nullishCoalesce(_optionalChain([node, 'access', _268 => _268.overrides, 'optionalAccess', _269 => _269.hidden]), () => ( [])));
8280
8369
  const keep = (list) => list.filter((n) => !hidden.has(n.id)).map((n) => n.type === "group" ? { ...n, children: keep(n.children) } : n);
8281
8370
  let children = prefixVectorIds(keep(_nullishCoalesce(node.art, () => ( []))), node.id);
8282
8371
  if (!isIdentityMatrix(residual)) children = children.map((c) => bake(c, residual));
@@ -8289,8 +8378,8 @@ function vectorInstanceGroup(node, bake) {
8289
8378
  if (node.locked) group.locked = true;
8290
8379
  if (node.opacity !== void 0) group.opacity = node.opacity;
8291
8380
  if (node.blendMode) group.blendMode = node.blendMode;
8292
- if (_optionalChain([node, 'access', _262 => _262.filters, 'optionalAccess', _263 => _263.length])) group.filters = node.filters;
8293
- if (_optionalChain([node, 'access', _264 => _264.effects, 'optionalAccess', _265 => _265.length])) group.effects = node.effects;
8381
+ if (_optionalChain([node, 'access', _270 => _270.filters, 'optionalAccess', _271 => _271.length])) group.filters = node.filters;
8382
+ if (_optionalChain([node, 'access', _272 => _272.effects, 'optionalAccess', _273 => _273.length])) group.effects = node.effects;
8294
8383
  if (node.booleanOperation) group.booleanOperation = node.booleanOperation;
8295
8384
  if (node.blendStep) group.blendStep = true;
8296
8385
  return group;
@@ -8543,8 +8632,8 @@ function vectorLensDrawn(node) {
8543
8632
  if (wire) {
8544
8633
  contents.push(shapePath(shape, id, changed, { fill: null, fills: void 0, stroke: wire, strokes: void 0, strokeWidth: 1, strokeAlign: void 0, strokeDasharray: void 0, strokeWidthProfile: void 0, opacity: Math.min(1, Math.max(0, lens.amount / 100)) }));
8545
8634
  } else if (recolour) {
8546
- const fills = _optionalChain([shape, 'access', _266 => _266.source, 'access', _267 => _267.fills, 'optionalAccess', _268 => _268.map, 'call', _269 => _269((l) => ({ ...l, paint: _nullishCoalesce(mapVectorPaintColors(l.paint, recolour), () => ( null)) }))]);
8547
- const strokes = _optionalChain([shape, 'access', _270 => _270.source, 'access', _271 => _271.strokes, 'optionalAccess', _272 => _272.map, 'call', _273 => _273((l) => ({ ...l, paint: _nullishCoalesce(mapVectorPaintColors(l.paint, recolour), () => ( null)) }))]);
8635
+ const fills = _optionalChain([shape, 'access', _274 => _274.source, 'access', _275 => _275.fills, 'optionalAccess', _276 => _276.map, 'call', _277 => _277((l) => ({ ...l, paint: _nullishCoalesce(mapVectorPaintColors(l.paint, recolour), () => ( null)) }))]);
8636
+ const strokes = _optionalChain([shape, 'access', _278 => _278.source, 'access', _279 => _279.strokes, 'optionalAccess', _280 => _280.map, 'call', _281 => _281((l) => ({ ...l, paint: _nullishCoalesce(mapVectorPaintColors(l.paint, recolour), () => ( null)) }))]);
8548
8637
  contents.push(shapePath(shape, id, changed, { fill: _nullishCoalesce(mapVectorPaintColors(shape.source.fill, recolour), () => ( null)), stroke: _nullishCoalesce(mapVectorPaintColors(shape.source.stroke, recolour), () => ( null)), ...fills ? { fills } : {}, ...strokes ? { strokes } : {} }));
8549
8638
  } else contents.push(shapePath(shape, id, changed));
8550
8639
  }
@@ -8557,7 +8646,7 @@ function vectorLensDrawn(node) {
8557
8646
  const { lens: _l, lensView: _v, transform: _t, opacity: _o, effects: _e, blendMode: _bm, filters: _f, ...style } = node;
8558
8647
  const fillOpacity = lens.type === "transparency" ? 1 - Math.min(100, Math.max(0, lens.amount)) / 100 : 0;
8559
8648
  children.push({ ...style, id: `${node.id}~lens-fill`, stroke: null, strokes: void 0, opacity: fillOpacity });
8560
- const stroked = (_nullishCoalesce(_optionalChain([node, 'access', _274 => _274.strokes, 'optionalAccess', _275 => _275.length]), () => ( 0))) > 0 || node.stroke != null && node.stroke !== "none";
8649
+ const stroked = (_nullishCoalesce(_optionalChain([node, 'access', _282 => _282.strokes, 'optionalAccess', _283 => _283.length]), () => ( 0))) > 0 || node.stroke != null && node.stroke !== "none";
8561
8650
  if (stroked) children.push({ ...style, id: `${node.id}~lens-stroke`, fill: null, fills: void 0 });
8562
8651
  const out = {
8563
8652
  id: node.id,
@@ -8566,7 +8655,7 @@ function vectorLensDrawn(node) {
8566
8655
  ...node.transform ? { transform: node.transform } : {},
8567
8656
  ...node.opacity !== void 0 ? { opacity: node.opacity } : {},
8568
8657
  ...node.blendMode ? { blendMode: node.blendMode } : {},
8569
- ..._optionalChain([node, 'access', _276 => _276.filters, 'optionalAccess', _277 => _277.length]) ? { filters: node.filters } : {},
8658
+ ..._optionalChain([node, 'access', _284 => _284.filters, 'optionalAccess', _285 => _285.length]) ? { filters: node.filters } : {},
8570
8659
  children
8571
8660
  };
8572
8661
  drawnCache2.set(node, out);
@@ -9567,7 +9656,7 @@ function normalizeVectorEffectParams(type, params, base) {
9567
9656
  if (!defaults) return null;
9568
9657
  const out = { ...defaults, ..._nullishCoalesce(base, () => ( {})) };
9569
9658
  for (const spec of VECTOR_EFFECT_PARAM_SPECS[type]) {
9570
- const v2 = _optionalChain([params, 'optionalAccess', _278 => _278[spec.key]]);
9659
+ const v2 = _optionalChain([params, 'optionalAccess', _286 => _286[spec.key]]);
9571
9660
  if (v2 === void 0) continue;
9572
9661
  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));
9573
9662
  else if (spec.kind === "boolean" && typeof v2 === "boolean") out[spec.key] = v2;
@@ -9579,7 +9668,7 @@ function normalizeVectorEffectParams(type, params, base) {
9579
9668
  const o = out;
9580
9669
  o.rows = Math.round(o.rows);
9581
9670
  o.columns = Math.round(o.columns);
9582
- const given = _optionalChain([params, 'optionalAccess', _279 => _279.mesh]);
9671
+ const given = _optionalChain([params, 'optionalAccess', _287 => _287.mesh]);
9583
9672
  let mesh = given !== void 0 ? isValidWarpMesh(given) ? cloneMesh(given) : null : o.mesh;
9584
9673
  if (o.style !== "mesh") mesh = null;
9585
9674
  if (mesh && given !== void 0) {
@@ -9596,10 +9685,10 @@ function createVectorEffect(type, id, params) {
9596
9685
  }
9597
9686
  var isEnabled = (e) => e.enabled !== false && !!VECTOR_EFFECT_DEFAULTS[e.type];
9598
9687
  function activeVectorEffects(node) {
9599
- return _nullishCoalesce(_optionalChain([node, 'access', _280 => _280.effects, 'optionalAccess', _281 => _281.filter, 'call', _282 => _282(isEnabled)]), () => ( []));
9688
+ return _nullishCoalesce(_optionalChain([node, 'access', _288 => _288.effects, 'optionalAccess', _289 => _289.filter, 'call', _290 => _290(isEnabled)]), () => ( []));
9600
9689
  }
9601
9690
  function hasOwnVectorAppearance(node) {
9602
- return node.type === "text" || node.type === "instance" || node.type === "group" && !!node.liveBoolean || isVectorFrame(node) || isVectorSymmetryGroup(node) || isVectorLens(node) || !!_optionalChain([node, 'access', _283 => _283.effects, 'optionalAccess', _284 => _284.some, 'call', _285 => _285(isEnabled)]);
9691
+ return node.type === "text" || node.type === "instance" || node.type === "group" && !!node.liveBoolean || isVectorFrame(node) || isVectorSymmetryGroup(node) || isVectorLens(node) || !!_optionalChain([node, 'access', _291 => _291.effects, 'optionalAccess', _292 => _292.some, 'call', _293 => _293(isEnabled)]);
9603
9692
  }
9604
9693
  var liveCache = /* @__PURE__ */ new WeakMap();
9605
9694
  function hasVectorAppearance(node) {
@@ -9611,7 +9700,7 @@ function hasVectorAppearance(node) {
9611
9700
  return v2;
9612
9701
  }
9613
9702
  function isVectorLiveBoolean(node) {
9614
- return _optionalChain([node, 'optionalAccess', _286 => _286.type]) === "group" && !!node.liveBoolean;
9703
+ return _optionalChain([node, 'optionalAccess', _294 => _294.type]) === "group" && !!node.liveBoolean;
9615
9704
  }
9616
9705
  function vectorOperandOperation(group, child) {
9617
9706
  return _nullishCoalesce(_nullishCoalesce(child.booleanOperation, () => ( group.liveBoolean)), () => ( "union"));
@@ -9728,7 +9817,7 @@ var compareOrder = (a, b) => {
9728
9817
  for (let i = 0; i < n; i++) if (a[i] !== b[i]) return a[i] - b[i];
9729
9818
  return a.length - b.length;
9730
9819
  };
9731
- var add3 = (a, b) => ({ x: a.x + (_nullishCoalesce(_optionalChain([b, 'optionalAccess', _287 => _287.x]), () => ( 0))), y: a.y + (_nullishCoalesce(_optionalChain([b, 'optionalAccess', _288 => _288.y]), () => ( 0))) });
9820
+ var add3 = (a, b) => ({ x: a.x + (_nullishCoalesce(_optionalChain([b, 'optionalAccess', _295 => _295.x]), () => ( 0))), y: a.y + (_nullishCoalesce(_optionalChain([b, 'optionalAccess', _296 => _296.y]), () => ( 0))) });
9732
9821
  var mapPaths = (shapes, fn) => {
9733
9822
  const out = fn(shapes.map((s) => s.path));
9734
9823
  return shapes.map((s, i) => ({ ...s, path: _nullishCoalesce(out[i], () => ( [])) }));
@@ -9756,7 +9845,7 @@ function contourShapes(shapes, c) {
9756
9845
  const power = 2 ** (Math.min(100, Math.max(-100, c.acceleration)) / 50);
9757
9846
  for (let k = 1; k <= n; k++) {
9758
9847
  const [path] = offsetPaths([s.path], (outside ? 1 : -1) * step * k, c.join, c.miterLimit, 1, 0);
9759
- if (!_optionalChain([path, 'optionalAccess', _289 => _289.length])) break;
9848
+ if (!_optionalChain([path, 'optionalAccess', _297 => _297.length])) break;
9760
9849
  const t = (k / n) ** power;
9761
9850
  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 };
9762
9851
  out.push({ source, path, opacity: s.opacity, order: [outside ? n - k : k, ...s.order] });
@@ -9831,8 +9920,8 @@ function bevelShapes(shapes, b) {
9831
9920
  out.push({ source, path: f.path, opacity: s.opacity, order: [...s.order, 1, k] });
9832
9921
  });
9833
9922
  const [middle] = offsetPaths([s.path], -b.width, "miter", 4, 1, 0);
9834
- if (_optionalChain([middle, 'optionalAccess', _290 => _290.length])) out.push({ ...s, source: fillOnly, path: middle, order: [...s.order, 2] });
9835
- const hasStroke = _optionalChain([s, 'access', _291 => _291.source, 'access', _292 => _292.strokes, 'optionalAccess', _293 => _293.length]) || s.source.stroke != null && s.source.stroke !== "none";
9923
+ if (_optionalChain([middle, 'optionalAccess', _298 => _298.length])) out.push({ ...s, source: fillOnly, path: middle, order: [...s.order, 2] });
9924
+ const hasStroke = _optionalChain([s, 'access', _299 => _299.source, 'access', _300 => _300.strokes, 'optionalAccess', _301 => _301.length]) || s.source.stroke != null && s.source.stroke !== "none";
9836
9925
  if (hasStroke) out.push({ ...s, source: { ...s.source, fill: null, fills: void 0 }, order: [...s.order, 3] });
9837
9926
  }
9838
9927
  return out;
@@ -9965,10 +10054,10 @@ function vectorEffectInputBounds(node, effectId) {
9965
10054
  return paths ? pathsBounds(paths) : null;
9966
10055
  }
9967
10056
  function vectorNodeEnvelope(node) {
9968
- return _nullishCoalesce(_optionalChain([node, 'optionalAccess', _294 => _294.effects, 'optionalAccess', _295 => _295.find, 'call', _296 => _296((e) => e.type === "envelope" && e.enabled !== false)]), () => ( null));
10057
+ return _nullishCoalesce(_optionalChain([node, 'optionalAccess', _302 => _302.effects, 'optionalAccess', _303 => _303.find, 'call', _304 => _304((e) => e.type === "envelope" && e.enabled !== false)]), () => ( null));
9969
10058
  }
9970
10059
  function vectorEnvelopeFrame(node, effectId) {
9971
- const e = effectId ? _optionalChain([node, 'access', _297 => _297.effects, 'optionalAccess', _298 => _298.find, 'call', _299 => _299((x) => x.id === effectId)]) : vectorNodeEnvelope(node);
10060
+ const e = effectId ? _optionalChain([node, 'access', _305 => _305.effects, 'optionalAccess', _306 => _306.find, 'call', _307 => _307((x) => x.id === effectId)]) : vectorNodeEnvelope(node);
9972
10061
  if (!e || e.type !== "envelope") return null;
9973
10062
  const bounds = vectorEffectInputBounds(node, e.id);
9974
10063
  if (!bounds || !(bounds.width > 0 && bounds.height > 0)) return null;
@@ -10029,7 +10118,7 @@ function placement(node) {
10029
10118
  ...node.blendStep ? { blendStep: true } : {},
10030
10119
  ...node.booleanOperation ? { booleanOperation: node.booleanOperation } : {},
10031
10120
  ...node.blendMode ? { blendMode: node.blendMode } : {},
10032
- ..._optionalChain([node, 'access', _300 => _300.filters, 'optionalAccess', _301 => _301.length]) ? { filters: node.filters } : {}
10121
+ ..._optionalChain([node, 'access', _308 => _308.filters, 'optionalAccess', _309 => _309.length]) ? { filters: node.filters } : {}
10033
10122
  };
10034
10123
  }
10035
10124
  function vectorAppearanceNodes(node) {
@@ -10161,7 +10250,7 @@ function vectorMasterPages(doc) {
10161
10250
  function fillTokens(node, page, pages) {
10162
10251
  const map = (s) => s.replace(/\{page\}/g, String(page)).replace(/\{pages\}/g, String(pages));
10163
10252
  if (!/\{pages?\}/.test(node.text)) return node;
10164
- if (!_optionalChain([node, 'access', _302 => _302.runs, 'optionalAccess', _303 => _303.length])) return { ...node, text: map(node.text) };
10253
+ if (!_optionalChain([node, 'access', _310 => _310.runs, 'optionalAccess', _311 => _311.length])) return { ...node, text: map(node.text) };
10165
10254
  let at2 = 0;
10166
10255
  let text = "";
10167
10256
  const runs = [];
@@ -10184,7 +10273,7 @@ function vectorMasterArt(master, page, number, count) {
10184
10273
  const f = page.frame;
10185
10274
  const key = `${page.id}|${f.x}|${f.y}|${f.width}|${f.height}|${number}|${count}`;
10186
10275
  let byKey = artCache.get(master);
10187
- const hit = _optionalChain([byKey, 'optionalAccess', _304 => _304.get, 'call', _305 => _305(key)]);
10276
+ const hit = _optionalChain([byKey, 'optionalAccess', _312 => _312.get, 'call', _313 => _313(key)]);
10188
10277
  if (hit) return hit;
10189
10278
  const art = master.children.filter((c) => c.visible !== false).map((c) => {
10190
10279
  const box = vectorNodeBounds(c);
@@ -10229,7 +10318,7 @@ function stripVectorMasterArt(doc) {
10229
10318
  // src/vector/connectors.ts
10230
10319
  var SIDES = ["top", "right", "bottom", "left", "center"];
10231
10320
  function isVectorConnector(node) {
10232
- return _optionalChain([node, 'optionalAccess', _306 => _306.type]) === "path" && !!node.connector;
10321
+ return _optionalChain([node, 'optionalAccess', _314 => _314.type]) === "path" && !!node.connector;
10233
10322
  }
10234
10323
  function vectorConnectionSites(nodes, id) {
10235
10324
  const node = findVectorNode(nodes, id);
@@ -10286,7 +10375,7 @@ function facingSite(sites, toward) {
10286
10375
  }
10287
10376
  function storedEnds(node, world) {
10288
10377
  const sp = node.subpaths[0];
10289
- if (!_optionalChain([sp, 'optionalAccess', _307 => _307.anchors, 'access', _308 => _308.length])) return null;
10378
+ if (!_optionalChain([sp, 'optionalAccess', _315 => _315.anchors, 'access', _316 => _316.length])) return null;
10290
10379
  const a = sp.anchors[0];
10291
10380
  const b = sp.anchors[sp.anchors.length - 1];
10292
10381
  return [applyMatrix(world, a), applyMatrix(world, b)];
@@ -10393,8 +10482,8 @@ function routeVectorConnector(nodes, id) {
10393
10482
  }));
10394
10483
  return {
10395
10484
  subpaths: [{ closed: false, anchors: local }],
10396
- startSide: _nullishCoalesce(_optionalChain([s, 'optionalAccess', _309 => _309.side]), () => ( null)),
10397
- endSide: _nullishCoalesce(_optionalChain([e, 'optionalAccess', _310 => _310.side]), () => ( null)),
10485
+ startSide: _nullishCoalesce(_optionalChain([s, 'optionalAccess', _317 => _317.side]), () => ( null)),
10486
+ endSide: _nullishCoalesce(_optionalChain([e, 'optionalAccess', _318 => _318.side]), () => ( null)),
10398
10487
  dropped: { start: !!startGlue && !s, end: !!endGlue && !e }
10399
10488
  };
10400
10489
  }
@@ -10406,7 +10495,7 @@ function sameSubpaths(a, b) {
10406
10495
  const o = b[i];
10407
10496
  return sp.closed === o.closed && sp.anchors.length === o.anchors.length && sp.anchors.every((p, k) => {
10408
10497
  const q = o.anchors[k];
10409
- return samePoint(p, q) && samePoint(p.in, q.in) && samePoint(p.out, q.out) && (_nullishCoalesce(_optionalChain([p, 'access', _311 => _311.corner, 'optionalAccess', _312 => _312.radius]), () => ( 0))) === (_nullishCoalesce(_optionalChain([q, 'access', _313 => _313.corner, 'optionalAccess', _314 => _314.radius]), () => ( 0)));
10498
+ return samePoint(p, q) && samePoint(p.in, q.in) && samePoint(p.out, q.out) && (_nullishCoalesce(_optionalChain([p, 'access', _319 => _319.corner, 'optionalAccess', _320 => _320.radius]), () => ( 0))) === (_nullishCoalesce(_optionalChain([q, 'access', _321 => _321.corner, 'optionalAccess', _322 => _322.radius]), () => ( 0)));
10410
10499
  });
10411
10500
  });
10412
10501
  }
@@ -10685,7 +10774,7 @@ function applyVectorCornersAttribute(subpaths, value) {
10685
10774
  for (const item of value.trim().split(/\s+/)) {
10686
10775
  const m = /^(\d+)\.(\d+):([\d.eE+-]+)(?::([a-z]+))?$/.exec(item);
10687
10776
  if (!m) continue;
10688
- const a = _optionalChain([subpaths, 'access', _315 => _315[+m[1]], 'optionalAccess', _316 => _316.anchors, 'access', _317 => _317[+m[2]]]);
10777
+ const a = _optionalChain([subpaths, 'access', _323 => _323[+m[1]], 'optionalAccess', _324 => _324.anchors, 'access', _325 => _325[+m[2]]]);
10689
10778
  const radius = parseFloat(m[3]);
10690
10779
  if (!a || !(radius > 0)) continue;
10691
10780
  const kind = VECTOR_CORNER_KINDS.includes(m[4]) ? m[4] : void 0;
@@ -10710,7 +10799,7 @@ function vectorPaintToSvg(paint, gradientId, options = {}) {
10710
10799
  const area2 = bounds2 ? { x: bounds2.x - reach2, y: bounds2.y - reach2, width: bounds2.width + 2 * reach2, height: bounds2.height + 2 * reach2 } : null;
10711
10800
  const key2 = `${gradientId}|${_nullishCoalesce(options.role, () => ( "fill"))}|${_nullishCoalesce(options.precision, () => ( 3))}|${area2 ? [area2.x, area2.y, area2.width, area2.height].join(",") : ""}`;
10712
10801
  let byKey2 = paintCache.get(paint);
10713
- const hit = _optionalChain([byKey2, 'optionalAccess', _318 => _318.get, 'call', _319 => _319(key2)]);
10802
+ const hit = _optionalChain([byKey2, 'optionalAccess', _326 => _326.get, 'call', _327 => _327(key2)]);
10714
10803
  if (hit) return { value: `url(#${gradientId})`, defs: hit };
10715
10804
  const defs2 = vectorShadedSvgDefs(paint, gradientId, { bounds: bounds2, area: area2, precision: _nullishCoalesce(options.precision, () => ( 3)) });
10716
10805
  if (!byKey2) paintCache.set(paint, byKey2 = /* @__PURE__ */ new Map());
@@ -10722,7 +10811,7 @@ function vectorPaintToSvg(paint, gradientId, options = {}) {
10722
10811
  const precision = _nullishCoalesce(options.precision, () => ( 3));
10723
10812
  const key = `${gradientId}|${role}|${precision}`;
10724
10813
  const owner = _nullishCoalesce(options.node, () => ( paint));
10725
- const cached = _optionalChain([paintCache, 'access', _320 => _320.get, 'call', _321 => _321(owner), 'optionalAccess', _322 => _322.get, 'call', _323 => _323(key)]);
10814
+ const cached = _optionalChain([paintCache, 'access', _328 => _328.get, 'call', _329 => _329(owner), 'optionalAccess', _330 => _330.get, 'call', _331 => _331(key)]);
10726
10815
  if (cached && (!options.node || (role === "fill" ? options.node.fill : options.node.stroke) === paint)) return { value: `url(#${gradientId})`, defs: cached };
10727
10816
  const node = options.node;
10728
10817
  const bounds = node ? vectorPathLocalBounds(node) : null;
@@ -10776,7 +10865,7 @@ function vectorNodeLocalPaintBounds(node) {
10776
10865
  }
10777
10866
  var filterCache = /* @__PURE__ */ new WeakMap();
10778
10867
  function vectorNodeFilterSvg(node, id) {
10779
- if (!_optionalChain([node, 'access', _324 => _324.filters, 'optionalAccess', _325 => _325.length])) return null;
10868
+ if (!_optionalChain([node, 'access', _332 => _332.filters, 'optionalAccess', _333 => _333.length])) return null;
10780
10869
  const hit = filterCache.get(node);
10781
10870
  if (hit && hit.id === id) return hit.filter;
10782
10871
  const active = activeVectorFilters(node);
@@ -10862,7 +10951,7 @@ function vectorDocumentToSvg(doc, options = {}) {
10862
10951
  if (node.type === "path" && node.lens) out2 += ` data-vector-lens="${escapeAttr2(JSON.stringify(node.lens))}"`;
10863
10952
  const blend = vectorBlendModeCss(node.blendMode);
10864
10953
  if (blend) out2 += ` style="mix-blend-mode:${blend}"`;
10865
- if (_optionalChain([node, 'access', _326 => _326.filters, 'optionalAccess', _327 => _327.length])) {
10954
+ if (_optionalChain([node, 'access', _334 => _334.filters, 'optionalAccess', _335 => _335.length])) {
10866
10955
  const filter = vectorNodeFilterSvg(node, `${prefix}filter-${node.id}`);
10867
10956
  const data = ` data-vector-filters="${escapeAttr2(JSON.stringify(node.filters))}"`;
10868
10957
  if (filter) {
@@ -10909,7 +10998,7 @@ function vectorDocumentToSvg(doc, options = {}) {
10909
10998
  let out2 = ` stroke="${escapeAttr2(strokeValue)}" stroke-width="${num3(width)}"`;
10910
10999
  if (node.strokeLinecap && node.strokeLinecap !== "butt") out2 += ` stroke-linecap="${node.strokeLinecap}"`;
10911
11000
  if (node.strokeLinejoin && node.strokeLinejoin !== "miter") out2 += ` stroke-linejoin="${node.strokeLinejoin}"`;
10912
- if (_optionalChain([node, 'access', _328 => _328.strokeDasharray, 'optionalAccess', _329 => _329.length])) out2 += ` stroke-dasharray="${node.strokeDasharray.map(num3).join(" ")}"`;
11001
+ if (_optionalChain([node, 'access', _336 => _336.strokeDasharray, 'optionalAccess', _337 => _337.length])) out2 += ` stroke-dasharray="${node.strokeDasharray.map(num3).join(" ")}"`;
10913
11002
  return out2;
10914
11003
  };
10915
11004
  const liveCorners = (node) => {
@@ -10958,7 +11047,7 @@ function vectorDocumentToSvg(doc, options = {}) {
10958
11047
  };
10959
11048
  const emit2 = (node, depth) => {
10960
11049
  if (node.visible === false && !options.includeHidden) return;
10961
- const wrappers = _nullishCoalesce(_optionalChain([options, 'access', _330 => _330.wrap, 'optionalAccess', _331 => _331[node.id]]), () => ( []));
11050
+ const wrappers = _nullishCoalesce(_optionalChain([options, 'access', _338 => _338.wrap, 'optionalAccess', _339 => _339[node.id]]), () => ( []));
10962
11051
  wrappers.forEach((w2, i) => {
10963
11052
  let attrs = w2.id !== void 0 ? ` id="${escapeAttr2(w2.id)}"` : "";
10964
11053
  if (w2.transform) attrs += ` transform="${escapeAttr2(w2.transform)}"`;
@@ -10979,7 +11068,7 @@ function vectorDocumentToSvg(doc, options = {}) {
10979
11068
  };
10980
11069
  const emitMaskGroup = (node, depth) => {
10981
11070
  const [source, ...contents] = node.children;
10982
- const body = _optionalChain([node, 'access', _332 => _332.effects, 'optionalAccess', _333 => _333.length]) && contents.length ? [{ id: `${node.id}~content`, type: "group", effects: node.effects, children: contents }] : contents;
11071
+ const body = _optionalChain([node, 'access', _340 => _340.effects, 'optionalAccess', _341 => _341.length]) && contents.length ? [{ id: `${node.id}~content`, type: "group", effects: node.effects, children: contents }] : contents;
10983
11072
  const settings = { type: node.mask.type, ...node.mask.invert ? { invert: true } : {} };
10984
11073
  lines.push(`${indent(depth)}<g${common(node)} data-vector-mask="${escapeAttr2(JSON.stringify(settings))}">`);
10985
11074
  const mask = vectorMaskRenderData(node, `${prefix}mask-${node.id}`, `${prefix}mask-filter-${node.id}`, precision);
@@ -10996,7 +11085,7 @@ function vectorDocumentToSvg(doc, options = {}) {
10996
11085
  lines.push(`${indent(depth + 1)}<g data-vector-part="mask-source" display="none">`);
10997
11086
  emitNode(source, depth + 2);
10998
11087
  lines.push(`${indent(depth + 1)}</g>`);
10999
- if (_optionalChain([mask, 'optionalAccess', _334 => _334.clip])) {
11088
+ if (_optionalChain([mask, 'optionalAccess', _342 => _342.clip])) {
11000
11089
  defs.push(`<clipPath id="${escapeAttr2(mask.id)}">${mask.clip.map((c) => `<path d="${c.d}" clip-rule="${c.clipRule}"/>`).join("")}</clipPath>`);
11001
11090
  ref = ` clip-path="url(#${escapeAttr2(mask.id)})"`;
11002
11091
  }
@@ -11008,7 +11097,7 @@ function vectorDocumentToSvg(doc, options = {}) {
11008
11097
  };
11009
11098
  const emitTextElement = (node, depth, attrs) => {
11010
11099
  const geometry = vectorTextGeometryNode(node);
11011
- const fields = { text: node.text, font: node.font, ..._optionalChain([node, 'access', _335 => _335.runs, 'optionalAccess', _336 => _336.length]) ? { runs: node.runs } : {}, ...node.paragraph ? { paragraph: node.paragraph } : {}, frame: node.frame, ...node.orientation ? { orientation: node.orientation } : {}, ..._optionalChain([node, 'access', _337 => _337.effects, 'optionalAccess', _338 => _338.length]) ? { effects: node.effects } : {} };
11100
+ const fields = { text: node.text, font: node.font, ..._optionalChain([node, 'access', _343 => _343.runs, 'optionalAccess', _344 => _344.length]) ? { runs: node.runs } : {}, ...node.paragraph ? { paragraph: node.paragraph } : {}, frame: node.frame, ...node.orientation ? { orientation: node.orientation } : {}, ..._optionalChain([node, 'access', _345 => _345.effects, 'optionalAccess', _346 => _346.length]) ? { effects: node.effects } : {} };
11012
11101
  let data = ` data-vector-text="${escapeAttr2(JSON.stringify(fields))}"`;
11013
11102
  if (hasVectorPaintStacks(node)) data += ` data-vector-fills="${escapeAttr2(JSON.stringify(vectorFills(node)))}" data-vector-strokes="${escapeAttr2(JSON.stringify(vectorStrokes(node)))}"`;
11014
11103
  else {
@@ -11050,12 +11139,12 @@ function vectorDocumentToSvg(doc, options = {}) {
11050
11139
  };
11051
11140
  const emitText = (node, depth) => {
11052
11141
  const outlines = vectorTextPaths(node).outlines;
11053
- const effects = !!_optionalChain([node, 'access', _339 => _339.effects, 'optionalAccess', _340 => _340.some, 'call', _341 => _341((e) => e.enabled !== false)]);
11142
+ const effects = !!_optionalChain([node, 'access', _347 => _347.effects, 'optionalAccess', _348 => _348.some, 'call', _349 => _349((e) => e.enabled !== false)]);
11054
11143
  if (!outlines || !effects && options.text !== "outlines") {
11055
11144
  emitTextElement(node, depth, common(node));
11056
11145
  return;
11057
11146
  }
11058
- lines.push(`${indent(depth)}<g${common(node)} data-vector-live="${escapeAttr2(JSON.stringify({ kind: "text", ..._optionalChain([node, 'access', _342 => _342.effects, 'optionalAccess', _343 => _343.length]) ? { effects: node.effects } : {} }))}">`);
11147
+ lines.push(`${indent(depth)}<g${common(node)} data-vector-live="${escapeAttr2(JSON.stringify({ kind: "text", ..._optionalChain([node, 'access', _350 => _350.effects, 'optionalAccess', _351 => _351.length]) ? { effects: node.effects } : {} }))}">`);
11059
11148
  lines.push(`${indent(depth + 1)}<g data-vector-part="appearance">`);
11060
11149
  for (const shape of vectorAppearanceNodes(node)) emit2(shape, depth + 2);
11061
11150
  lines.push(`${indent(depth + 1)}</g>`);
@@ -11069,7 +11158,7 @@ function vectorDocumentToSvg(doc, options = {}) {
11069
11158
  const symbolRef = (symbolId) => {
11070
11159
  const hit = symbolIds.get(symbolId);
11071
11160
  if (hit) return hit;
11072
- const sym2 = _optionalChain([doc, 'access', _344 => _344.symbols, 'optionalAccess', _345 => _345.find, 'call', _346 => _346((x) => x.id === symbolId)]);
11161
+ const sym2 = _optionalChain([doc, 'access', _352 => _352.symbols, 'optionalAccess', _353 => _353.find, 'call', _354 => _354((x) => x.id === symbolId)]);
11073
11162
  if (!sym2) return null;
11074
11163
  const id = `${prefix}symbol-${symbolId}`;
11075
11164
  symbolIds.set(symbolId, id);
@@ -11079,20 +11168,20 @@ function vectorDocumentToSvg(doc, options = {}) {
11079
11168
  };
11080
11169
  const emitInstance = (node, depth) => {
11081
11170
  const data = { symbolId: node.symbolId, ...node.scaleStrokes === false ? { scaleStrokes: false } : {}, ...node.overrides ? { overrides: node.overrides } : {} };
11082
- const exact2 = !node.overrides && node.scaleStrokes !== false && !_optionalChain([node, 'access', _347 => _347.effects, 'optionalAccess', _348 => _348.length]) && !_optionalChain([node, 'access', _349 => _349.filters, 'optionalAccess', _350 => _350.length]);
11171
+ const exact2 = !node.overrides && node.scaleStrokes !== false && !_optionalChain([node, 'access', _355 => _355.effects, 'optionalAccess', _356 => _356.length]) && !_optionalChain([node, 'access', _357 => _357.filters, 'optionalAccess', _358 => _358.length]);
11083
11172
  const ref = symbolRef(node.symbolId);
11084
11173
  if (exact2 && ref) {
11085
11174
  lines.push(`${indent(depth)}<use${common(node)} href="#${escapeAttr2(ref)}" data-vector-instance="${escapeAttr2(JSON.stringify(data))}"/>`);
11086
11175
  return;
11087
11176
  }
11088
- const full = { ...data, ...node.transform ? { transform: node.transform } : {}, ..._optionalChain([node, 'access', _351 => _351.effects, 'optionalAccess', _352 => _352.length]) ? { effects: node.effects } : {} };
11177
+ const full = { ...data, ...node.transform ? { transform: node.transform } : {}, ..._optionalChain([node, 'access', _359 => _359.effects, 'optionalAccess', _360 => _360.length]) ? { effects: node.effects } : {} };
11089
11178
  lines.push(`${indent(depth)}<g data-vector-instance="${escapeAttr2(JSON.stringify(full))}">`);
11090
11179
  emitNode(vectorInstanceDrawn(node), depth + 1);
11091
11180
  lines.push(`${indent(depth)}</g>`);
11092
11181
  };
11093
11182
  const emitFrame = (node, depth) => {
11094
11183
  const f = node.frame;
11095
- const data = { ...f, ..._optionalChain([node, 'access', _353 => _353.effects, 'optionalAccess', _354 => _354.length]) ? { effects: node.effects } : {} };
11184
+ const data = { ...f, ..._optionalChain([node, 'access', _361 => _361.effects, 'optionalAccess', _362 => _362.length]) ? { effects: node.effects } : {} };
11096
11185
  lines.push(`${indent(depth)}<g${common(node)} data-vector-frame="${escapeAttr2(JSON.stringify(data))}">`);
11097
11186
  const rect = vectorFrameRectPath(f);
11098
11187
  if (f.fill !== void 0 && f.fill !== null && f.fill !== "none") {
@@ -11107,7 +11196,7 @@ function vectorDocumentToSvg(doc, options = {}) {
11107
11196
  ref = ` clip-path="url(#${escapeAttr2(id)})"`;
11108
11197
  }
11109
11198
  lines.push(`${indent(depth + 1)}<g data-vector-part="frame-contents"${ref}>`);
11110
- if (_optionalChain([node, 'access', _355 => _355.masterArt, 'optionalAccess', _356 => _356.length])) {
11199
+ if (_optionalChain([node, 'access', _363 => _363.masterArt, 'optionalAccess', _364 => _364.length])) {
11111
11200
  lines.push(`${indent(depth + 2)}<g data-vector-part="frame-master">`);
11112
11201
  for (const child of node.masterArt) emit2(child, depth + 3);
11113
11202
  lines.push(`${indent(depth + 2)}</g>`);
@@ -11136,7 +11225,7 @@ function vectorDocumentToSvg(doc, options = {}) {
11136
11225
  if (hasOwnVectorAppearance(node)) {
11137
11226
  const live2 = {
11138
11227
  kind: node.type,
11139
- ..._optionalChain([node, 'access', _357 => _357.effects, 'optionalAccess', _358 => _358.length]) ? { effects: node.effects } : {},
11228
+ ..._optionalChain([node, 'access', _365 => _365.effects, 'optionalAccess', _366 => _366.length]) ? { effects: node.effects } : {},
11140
11229
  ...node.type === "group" && node.liveBoolean ? { liveBoolean: node.liveBoolean } : {},
11141
11230
  ...node.type === "group" && node.symmetry ? { symmetry: node.symmetry } : {}
11142
11231
  };
@@ -11187,7 +11276,7 @@ function vectorDocumentToSvg(doc, options = {}) {
11187
11276
  data += ` data-vector-width-profile="${widthProfileToAttribute(profile)}"`;
11188
11277
  if (node.strokeLinecap && node.strokeLinecap !== "butt") data += ` data-vector-stroke-linecap="${node.strokeLinecap}"`;
11189
11278
  if (node.strokeLinejoin && node.strokeLinejoin !== "miter") data += ` data-vector-stroke-linejoin="${node.strokeLinejoin}"`;
11190
- if (_optionalChain([node, 'access', _359 => _359.strokeDasharray, 'optionalAccess', _360 => _360.length])) data += ` data-vector-stroke-dasharray="${node.strokeDasharray.map(num3).join(" ")}"`;
11279
+ if (_optionalChain([node, 'access', _367 => _367.strokeDasharray, 'optionalAccess', _368 => _368.length])) data += ` data-vector-stroke-dasharray="${node.strokeDasharray.map(num3).join(" ")}"`;
11191
11280
  }
11192
11281
  lines.push(`${indent(depth)}<g${common(node)}${data}>`);
11193
11282
  lines.push(`${indent(depth + 1)}<path data-vector-part="fill" d="${d}"${fillAttrs}${live}/>`);
@@ -11368,7 +11457,7 @@ function readStyle(el, parent, cssRules) {
11368
11457
  const { mixBlendMode: _m, filter: _f, ...inherited } = parent;
11369
11458
  const out = { ...inherited };
11370
11459
  for (const [attr, key] of Object.entries(STYLE_KEYS)) if (el.attrs[attr] !== void 0) out[key] = el.attrs[attr].trim();
11371
- if (_optionalChain([cssRules, 'optionalAccess', _361 => _361.length])) {
11460
+ if (_optionalChain([cssRules, 'optionalAccess', _369 => _369.length])) {
11372
11461
  for (const rule of cssRules) {
11373
11462
  if (matchesSelector(el, rule.selector)) {
11374
11463
  for (const [prop, val] of Object.entries(rule.properties)) {
@@ -11424,7 +11513,7 @@ function attrOrStyle(el, name) {
11424
11513
  return el.attrs[name];
11425
11514
  }
11426
11515
  function urlId(value) {
11427
- return _nullishCoalesce(_optionalChain([/^url\(\s*['"]?#([^'")\s]+)['"]?\s*\)/, 'access', _362 => _362.exec, 'call', _363 => _363((_nullishCoalesce(value, () => ( ""))).trim()), 'optionalAccess', _364 => _364[1]]), () => ( null));
11516
+ return _nullishCoalesce(_optionalChain([/^url\(\s*['"]?#([^'")\s]+)['"]?\s*\)/, 'access', _370 => _370.exec, 'call', _371 => _371((_nullishCoalesce(value, () => ( ""))).trim()), 'optionalAccess', _372 => _372[1]]), () => ( null));
11428
11517
  }
11429
11518
  function clipRulesAsFillRules(el) {
11430
11519
  const attrs = { ...el.attrs };
@@ -11489,9 +11578,9 @@ function resolveGradient(id, raw) {
11489
11578
  for (let el = first; el && !chain.includes(el) && chain.length < 32; ) {
11490
11579
  chain.push(el);
11491
11580
  const href = _nullishCoalesce(el.attrs.href, () => ( el.attrs["xlink:href"]));
11492
- el = _optionalChain([href, 'optionalAccess', _365 => _365.startsWith, 'call', _366 => _366("#")]) ? raw.get(href.slice(1)) : void 0;
11581
+ el = _optionalChain([href, 'optionalAccess', _373 => _373.startsWith, 'call', _374 => _374("#")]) ? raw.get(href.slice(1)) : void 0;
11493
11582
  }
11494
- const attr = (name) => _optionalChain([chain, 'access', _367 => _367.find, 'call', _368 => _368((el) => el.attrs[name] !== void 0), 'optionalAccess', _369 => _369.attrs, 'access', _370 => _370[name]]);
11583
+ const attr = (name) => _optionalChain([chain, 'access', _375 => _375.find, 'call', _376 => _376((el) => el.attrs[name] !== void 0), 'optionalAccess', _377 => _377.attrs, 'access', _378 => _378[name]]);
11495
11584
  const stops = _nullishCoalesce(chain.map(readStops).find((s) => s.length), () => ( []));
11496
11585
  if (!stops.length) return null;
11497
11586
  const user = attr("gradientUnits") === "userSpaceOnUse";
@@ -11663,7 +11752,7 @@ function parseVectorSvg(svg, options = {}) {
11663
11752
  const stackedPath = (g, _style, m, meta) => {
11664
11753
  const fillEl = g.children.find((c) => c.name === "path" && c.attrs["data-vector-part"] === "fill");
11665
11754
  const subpaths = fillEl ? shapeOf(fillEl) : null;
11666
- if (!_optionalChain([subpaths, 'optionalAccess', _371 => _371.length])) return null;
11755
+ if (!_optionalChain([subpaths, 'optionalAccess', _379 => _379.length])) return null;
11667
11756
  const parse = (v2) => {
11668
11757
  try {
11669
11758
  return v2 ? JSON.parse(v2) : [];
@@ -11682,7 +11771,7 @@ function parseVectorSvg(svg, options = {}) {
11682
11771
  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))]);
11683
11772
  for (const n of nodes2) {
11684
11773
  const prev = out[out.length - 1];
11685
- if (_optionalChain([prev, 'optionalAccess', _372 => _372.type]) === "path" && n.type === "path" && key(prev) === key(n)) {
11774
+ if (_optionalChain([prev, 'optionalAccess', _380 => _380.type]) === "path" && n.type === "path" && key(prev) === key(n)) {
11686
11775
  const fills = vectorFills(n);
11687
11776
  const strokesBefore = vectorStrokes(prev);
11688
11777
  if (!(fills.length && strokesBefore.length)) {
@@ -11700,7 +11789,7 @@ function parseVectorSvg(svg, options = {}) {
11700
11789
  const part = (name) => g.children.find((c) => c.name === "path" && c.attrs["data-vector-part"] === name);
11701
11790
  const fillEl = part("fill");
11702
11791
  const subpaths = fillEl ? shapeOf(fillEl) : null;
11703
- if (!fillEl || !_optionalChain([subpaths, 'optionalAccess', _373 => _373.length])) return null;
11792
+ if (!fillEl || !_optionalChain([subpaths, 'optionalAccess', _381 => _381.length])) return null;
11704
11793
  const a = g.attrs;
11705
11794
  const fs = readStyle(fillEl, style, styleRules);
11706
11795
  const strokeEl = part("stroke");
@@ -11737,7 +11826,7 @@ function parseVectorSvg(svg, options = {}) {
11737
11826
  ...profile.length ? { strokeWidthProfile: profile } : {},
11738
11827
  ...keptCap ? { strokeLinecap: keptCap } : {},
11739
11828
  ...keptJoin ? { strokeLinejoin: keptJoin } : {},
11740
- ..._optionalChain([keptDash, 'optionalAccess', _374 => _374.length]) ? { strokeDasharray: keptDash } : {}
11829
+ ..._optionalChain([keptDash, 'optionalAccess', _382 => _382.length]) ? { strokeDasharray: keptDash } : {}
11741
11830
  };
11742
11831
  return placed(node, m);
11743
11832
  };
@@ -11802,8 +11891,8 @@ function parseVectorSvg(svg, options = {}) {
11802
11891
  } else {
11803
11892
  const fill = json2(g.attrs["data-vector-fill"]);
11804
11893
  const stroke = json2(g.attrs["data-vector-stroke"]);
11805
- node.fill = fill == null ? null : _nullishCoalesce(_optionalChain([sanitizeVectorFills, 'call', _375 => _375([{ paint: fill }]), 'access', _376 => _376[0], 'optionalAccess', _377 => _377.paint]), () => ( null));
11806
- node.stroke = stroke == null ? null : _nullishCoalesce(_optionalChain([sanitizeVectorFills, 'call', _378 => _378([{ paint: stroke }]), 'access', _379 => _379[0], 'optionalAccess', _380 => _380.paint]), () => ( null));
11894
+ node.fill = fill == null ? null : _nullishCoalesce(_optionalChain([sanitizeVectorFills, 'call', _383 => _383([{ paint: fill }]), 'access', _384 => _384[0], 'optionalAccess', _385 => _385.paint]), () => ( null));
11895
+ node.stroke = stroke == null ? null : _nullishCoalesce(_optionalChain([sanitizeVectorFills, 'call', _386 => _386([{ paint: stroke }]), 'access', _387 => _387[0], 'optionalAccess', _388 => _388.paint]), () => ( null));
11807
11896
  const settings = json2(g.attrs["data-vector-stroke-settings"]);
11808
11897
  if (settings && typeof settings === "object") {
11809
11898
  const strokes = sanitizeVectorStrokes([{ paint: _nullishCoalesce(node.stroke, () => ( "#000")), ...settings }]);
@@ -11839,8 +11928,8 @@ function parseVectorSvg(svg, options = {}) {
11839
11928
  const anchor = attrOrStyle(el, "text-anchor");
11840
11929
  const first0 = (v2) => _nullishCoalesce(numberList(v2)[0], () => ( 0));
11841
11930
  const tspan = el.children.find((c) => c.name === "tspan");
11842
- const x = el.attrs.x !== void 0 ? first0(el.attrs.x) : first0(_optionalChain([tspan, 'optionalAccess', _381 => _381.attrs, 'access', _382 => _382.x]));
11843
- const y = el.attrs.y !== void 0 ? first0(el.attrs.y) : first0(_optionalChain([tspan, 'optionalAccess', _383 => _383.attrs, 'access', _384 => _384.y]));
11931
+ const x = el.attrs.x !== void 0 ? first0(el.attrs.x) : first0(_optionalChain([tspan, 'optionalAccess', _389 => _389.attrs, 'access', _390 => _390.x]));
11932
+ const y = el.attrs.y !== void 0 ? first0(el.attrs.y) : first0(_optionalChain([tspan, 'optionalAccess', _391 => _391.attrs, 'access', _392 => _392.y]));
11844
11933
  const fillValue = _nullishCoalesce(attrOrStyle(el, "fill"), () => ( style.fill));
11845
11934
  let node = {
11846
11935
  id: idFor(el),
@@ -11871,12 +11960,12 @@ function parseVectorSvg(svg, options = {}) {
11871
11960
  if (symbolOfElement.has(el)) return symbolOfElement.get(el);
11872
11961
  symbolOfElement.set(el, null);
11873
11962
  const own = json2(el.attrs["data-vector-symbol"]);
11874
- let id = typeof _optionalChain([own, 'optionalAccess', _385 => _385.id]) === "string" && own.id ? own.id : _nullishCoalesce(el.attrs.id, () => ( createId()));
11963
+ let id = typeof _optionalChain([own, 'optionalAccess', _393 => _393.id]) === "string" && own.id ? own.id : _nullishCoalesce(el.attrs.id, () => ( createId()));
11875
11964
  while (usedSymbolIds.has(id)) id = `${id}-${usedSymbolIds.size}`;
11876
11965
  usedSymbolIds.add(id);
11877
11966
  const style = readStyle(el, rootStyle, styleRules);
11878
11967
  const nodes2 = el.name === "symbol" ? visit2(el, style, IDENTITY_MATRIX) : visitOne({ ...el, attrs: { ...el.attrs, transform: "" } }, rootStyle, parseSvgTransform(el.attrs.transform));
11879
- symbols.push({ id, name: typeof _optionalChain([own, 'optionalAccess', _386 => _386.name]) === "string" && own.name ? own.name : _nullishCoalesce(el.attrs.id, () => ( "Symbol")), nodes: nodes2 });
11968
+ symbols.push({ id, name: typeof _optionalChain([own, 'optionalAccess', _394 => _394.name]) === "string" && own.name ? own.name : _nullishCoalesce(el.attrs.id, () => ( "Symbol")), nodes: nodes2 });
11880
11969
  symbolOfElement.set(el, id);
11881
11970
  return id;
11882
11971
  };
@@ -11888,13 +11977,13 @@ function parseVectorSvg(svg, options = {}) {
11888
11977
  if (!symbolId) return null;
11889
11978
  const own = json2(el.attrs["data-vector-instance"]);
11890
11979
  const place3 = multiplyMatrices(translateMatrix(length(el.attrs.x), length(el.attrs.y)), m);
11891
- const node = { id: idFor(el), type: "instance", ...meta, symbolId, ..._optionalChain([own, 'optionalAccess', _387 => _387.scaleStrokes]) === false ? { scaleStrokes: false } : {}, ..._optionalChain([own, 'optionalAccess', _388 => _388.overrides]) ? { overrides: own.overrides } : {} };
11980
+ const node = { id: idFor(el), type: "instance", ...meta, symbolId, ..._optionalChain([own, 'optionalAccess', _395 => _395.scaleStrokes]) === false ? { scaleStrokes: false } : {}, ..._optionalChain([own, 'optionalAccess', _396 => _396.overrides]) ? { overrides: own.overrides } : {} };
11892
11981
  return isIdentityMatrix(place3) ? node : { ...node, transform: place3 };
11893
11982
  };
11894
11983
  const ownInstance = (g, m, meta) => {
11895
11984
  const raw = json2(g.attrs["data-vector-instance"]);
11896
11985
  if (!raw || typeof raw.symbolId !== "string") return null;
11897
- const sym2 = [...byId.values()].find((e) => e.name === "symbol" && _optionalChain([json2, 'call', _389 => _389(e.attrs["data-vector-symbol"]), 'optionalAccess', _390 => _390.id]) === raw.symbolId);
11986
+ const sym2 = [...byId.values()].find((e) => e.name === "symbol" && _optionalChain([json2, 'call', _397 => _397(e.attrs["data-vector-symbol"]), 'optionalAccess', _398 => _398.id]) === raw.symbolId);
11898
11987
  const symbolId = sym2 ? symbolFor(sym2) : raw.symbolId;
11899
11988
  if (!symbolId) return null;
11900
11989
  const t = Array.isArray(raw.transform) && raw.transform.length === 6 && raw.transform.every(Number.isFinite) ? raw.transform : IDENTITY_MATRIX;
@@ -11902,7 +11991,7 @@ function parseVectorSvg(svg, options = {}) {
11902
11991
  const drawn = g.children.find((c) => c.name === "g");
11903
11992
  const effects = sanitizeVectorEffects(raw.effects);
11904
11993
  const node = {
11905
- id: _nullishCoalesce(_optionalChain([drawn, 'optionalAccess', _391 => _391.attrs, 'access', _392 => _392.id]), () => ( idFor(g))),
11994
+ id: _nullishCoalesce(_optionalChain([drawn, 'optionalAccess', _399 => _399.attrs, 'access', _400 => _400.id]), () => ( idFor(g))),
11906
11995
  type: "instance",
11907
11996
  ...meta,
11908
11997
  symbolId,
@@ -11959,12 +12048,12 @@ function parseVectorSvg(svg, options = {}) {
11959
12048
  const masked = (el, nodes2, m) => {
11960
12049
  let out = nodes2;
11961
12050
  const clipEl = rawMasks.get(_nullishCoalesce(urlId(attrOrStyle(el, "clip-path")), () => ( "")));
11962
- if (_optionalChain([clipEl, 'optionalAccess', _393 => _393.name]) === "clipPath") {
12051
+ if (_optionalChain([clipEl, 'optionalAccess', _401 => _401.name]) === "clipPath") {
11963
12052
  const source = maskNode(clipEl, m, out, clipEl.attrs.clipPathUnits);
11964
12053
  if (source) out = [{ id: idFor({ name: "g", attrs: {}, children: [] }), type: "group", name: "Clip Group", mask: { type: "clip" }, children: [source, ...out] }];
11965
12054
  }
11966
12055
  const maskEl = rawMasks.get(_nullishCoalesce(urlId(attrOrStyle(el, "mask")), () => ( "")));
11967
- if (_optionalChain([maskEl, 'optionalAccess', _394 => _394.name]) === "mask") {
12056
+ if (_optionalChain([maskEl, 'optionalAccess', _402 => _402.name]) === "mask") {
11968
12057
  const source = maskNode(maskEl, m, out, maskEl.attrs.maskContentUnits);
11969
12058
  const type = attrOrStyle(maskEl, "mask-type") === "alpha" ? "alpha" : "luminance";
11970
12059
  if (source) out = [{ id: idFor({ name: "g", attrs: {}, children: [] }), type: "group", name: "Opacity Mask", mask: { type }, children: [source, ...out] }];
@@ -11986,19 +12075,19 @@ function parseVectorSvg(svg, options = {}) {
11986
12075
  let sourceEl = part("mask-source");
11987
12076
  if (!sourceEl) {
11988
12077
  const el = rawMasks.get(_nullishCoalesce(urlId(maskedEl.attrs.mask), () => ( "")));
11989
- const invert2 = _optionalChain([el, 'optionalAccess', _395 => _395.children, 'access', _396 => _396.find, 'call', _397 => _397((c) => c.name === "g" && c.attrs["data-vector-part"] === "mask-invert")]);
12078
+ const invert2 = _optionalChain([el, 'optionalAccess', _403 => _403.children, 'access', _404 => _404.find, 'call', _405 => _405((c) => c.name === "g" && c.attrs["data-vector-part"] === "mask-invert")]);
11990
12079
  sourceEl = _nullishCoalesce(invert2, () => ( el));
11991
12080
  }
11992
12081
  const source = sourceEl ? visit2(sourceEl, style, m)[0] : void 0;
11993
12082
  let contents = visit2(maskedEl, style, m);
11994
12083
  let effects;
11995
12084
  const wrapper = contents.length === 1 && contents[0].type === "group" && contents[0].id === `${id}~content` ? contents[0] : null;
11996
- if (_optionalChain([wrapper, 'optionalAccess', _398 => _398.type]) === "group") {
12085
+ if (_optionalChain([wrapper, 'optionalAccess', _406 => _406.type]) === "group") {
11997
12086
  effects = _nullishCoalesce(wrapper.effects, () => ( void 0));
11998
12087
  contents = wrapper.children;
11999
12088
  }
12000
12089
  if (!source) return contents.length ? { id, type: "group", ...meta, children: contents } : null;
12001
- return { id, type: "group", ...meta, mask, ..._optionalChain([effects, 'optionalAccess', _399 => _399.length]) ? { effects } : {}, children: [source, ...contents] };
12090
+ return { id, type: "group", ...meta, mask, ..._optionalChain([effects, 'optionalAccess', _407 => _407.length]) ? { effects } : {}, children: [source, ...contents] };
12002
12091
  };
12003
12092
  const frameGroup = (g, style, m, meta) => {
12004
12093
  const raw = parseJson(g.attrs["data-vector-frame"]);
@@ -12010,7 +12099,7 @@ function parseVectorSvg(svg, options = {}) {
12010
12099
  const { rigid, residual } = decomposeRigid(m);
12011
12100
  const r = _chunkGF2RBSDMcjs.bezierPathBounds.call(void 0, _chunkGF2RBSDMcjs.transformBezierPath.call(void 0, subpathsToBezier(vectorFrameRectPath(frame)), residual));
12012
12101
  const back = invertMatrix(rigid);
12013
- const effects = sanitizeVectorEffects(_optionalChain([raw, 'optionalAccess', _400 => _400.effects]));
12102
+ const effects = sanitizeVectorEffects(_optionalChain([raw, 'optionalAccess', _408 => _408.effects]));
12014
12103
  return {
12015
12104
  id,
12016
12105
  type: "group",
@@ -12482,13 +12571,13 @@ function hitTestVectorNode(node, p, tolerance = 0, parent = IDENTITY_MATRIX, opt
12482
12571
  }
12483
12572
  if (isVectorMaskGroup(node)) {
12484
12573
  const m = multiplyMatrices(nodeMatrix(node), parent);
12485
- const entered = !!_optionalChain([options, 'access', _401 => _401.entered, 'optionalAccess', _402 => _402.has, 'call', _403 => _403(node.id)]);
12574
+ const entered = !!_optionalChain([options, 'access', _409 => _409.entered, 'optionalAccess', _410 => _410.has, 'call', _411 => _411(node.id)]);
12486
12575
  if (!entered && isVectorMaskActive(node) && !vectorMaskContains(node, applyMatrix(invertMatrix(m), p), tolerance)) return false;
12487
12576
  const shown = !entered && hasOwnVectorAppearance(node) ? expandVectorAppearance(node).children : node.children;
12488
12577
  for (let i = shown.length - 1; i >= 1; i--) if (hitTestVectorNode(shown[i], p, tolerance, m, options)) return true;
12489
12578
  return entered && hitTestVectorMaskSource(node, p, tolerance, m, options);
12490
12579
  }
12491
- if (!(node.type === "group" && (!hasOwnVectorAppearance(node) || _optionalChain([options, 'access', _404 => _404.entered, 'optionalAccess', _405 => _405.has, 'call', _406 => _406(node.id)])))) node = expandVectorAppearance(node);
12580
+ if (!(node.type === "group" && (!hasOwnVectorAppearance(node) || _optionalChain([options, 'access', _412 => _412.entered, 'optionalAccess', _413 => _413.has, 'call', _414 => _414(node.id)])))) node = expandVectorAppearance(node);
12492
12581
  if (node.type === "group") {
12493
12582
  const m = multiplyMatrices(nodeMatrix(node), parent);
12494
12583
  return node.children.some((c) => hitTestVectorNode(c, p, tolerance, m, options));
@@ -12500,7 +12589,7 @@ function hitTestVectorNode(node, p, tolerance = 0, parent = IDENTITY_MATRIX, opt
12500
12589
  function hitTestVectorMaskSource(group, p, tolerance, m, options) {
12501
12590
  const source = group.children[0];
12502
12591
  if (source.visible === false) return false;
12503
- if (_optionalChain([group, 'access', _407 => _407.mask, 'optionalAccess', _408 => _408.type]) !== "clip") return hitTestVectorNode(source, p, tolerance, m, options);
12592
+ if (_optionalChain([group, 'access', _415 => _415.mask, 'optionalAccess', _416 => _416.type]) !== "clip") return hitTestVectorNode(source, p, tolerance, m, options);
12504
12593
  const paths = collectPathNodes(source).filter((n) => n.visible !== false);
12505
12594
  const pt2 = [p.x, p.y];
12506
12595
  return paths.some((n) => {
@@ -12549,24 +12638,24 @@ function mapAnchor(a, m) {
12549
12638
  }
12550
12639
  function bakeIntoGeometry(node, m) {
12551
12640
  if (isIdentityMatrix(m)) return node;
12552
- if (_optionalChain([node, 'access', _409 => _409.effects, 'optionalAccess', _410 => _410.length])) node = { ...node, effects: transformVectorEffects(node.effects, m, node) };
12641
+ if (_optionalChain([node, 'access', _417 => _417.effects, 'optionalAccess', _418 => _418.length])) node = { ...node, effects: transformVectorEffects(node.effects, m, node) };
12553
12642
  if (isVectorFrame(node)) return bakeFrame(node, m);
12554
12643
  if (node.type === "group") {
12555
12644
  const group = node;
12556
12645
  const children = group.children.map((c) => transformVectorNode(c, m));
12557
12646
  const sym2 = group.symmetry ? { symmetry: transformVectorSymmetry(group.symmetry, m) } : {};
12558
- const spine = _optionalChain([group, 'access', _411 => _411.blend, 'optionalAccess', _412 => _412.spine]);
12647
+ const spine = _optionalChain([group, 'access', _419 => _419.blend, 'optionalAccess', _420 => _420.spine]);
12559
12648
  if (!spine) return { ...group, ...sym2, children };
12560
12649
  const moved = { closed: spine.closed, anchors: spine.anchors.map((a) => mapAnchor(a, m)) };
12561
12650
  return { ...group, children, blend: { ...group.blend, spine: moved } };
12562
12651
  }
12563
12652
  const path = node.type === "text" ? bakeVectorTextGeometry(node, m) : node;
12564
12653
  const flips = m[0] * m[3] - m[1] * m[2] < 0;
12565
- const mirrored = flips && _optionalChain([path, 'access', _413 => _413.strokeWidthProfile, 'optionalAccess', _414 => _414.length]);
12654
+ const mirrored = flips && _optionalChain([path, 'access', _421 => _421.strokeWidthProfile, 'optionalAccess', _422 => _422.length]);
12566
12655
  const layer = (l) => ({
12567
12656
  ...l,
12568
12657
  ...isVectorGradient(l.paint) || isVectorShadedPaint(l.paint) ? { paint: transformVectorPaint(l.paint, m) } : {},
12569
- ...flips && _optionalChain([l, 'access', _415 => _415.strokeWidthProfile, 'optionalAccess', _416 => _416.length]) ? { strokeWidthProfile: mirrorWidthProfile(l.strokeWidthProfile) } : {}
12658
+ ...flips && _optionalChain([l, 'access', _423 => _423.strokeWidthProfile, 'optionalAccess', _424 => _424.length]) ? { strokeWidthProfile: mirrorWidthProfile(l.strokeWidthProfile) } : {}
12570
12659
  });
12571
12660
  return {
12572
12661
  ...path,
@@ -12801,7 +12890,7 @@ function roundSubpaths(subpaths, precision = 3) {
12801
12890
 
12802
12891
  // src/vector/symmetry.ts
12803
12892
  function isVectorSymmetryGroup(node) {
12804
- return _optionalChain([node, 'optionalAccess', _417 => _417.type]) === "group" && !!node.symmetry && !node.blend && !node.liveBoolean && !node.mask && !node.frame;
12893
+ return _optionalChain([node, 'optionalAccess', _425 => _425.type]) === "group" && !!node.symmetry && !node.blend && !node.liveBoolean && !node.mask && !node.frame;
12805
12894
  }
12806
12895
  var rad = (deg) => deg * Math.PI / 180;
12807
12896
  var exact = (v2) => Math.abs(v2) < 1e-12 ? 0 : v2;
@@ -13444,4 +13533,8 @@ function transformVectorSymmetry(s, m) {
13444
13533
 
13445
13534
 
13446
13535
 
13447
- 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_LENS_TYPES = VECTOR_LENS_TYPES; 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_PERSPECTIVE_PLANES = VECTOR_PERSPECTIVE_PLANES; 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.vectorPaintSolid = vectorPaintSolid; exports.shadeVectorColor = shadeVectorColor; exports.vectorPathRings = vectorPathRings; exports.vectorExtrudeFaces = vectorExtrudeFaces; exports.EFFECT_STRIP_HEIGHT = EFFECT_STRIP_HEIGHT; exports.EFFECT_MAP_REPEATS = EFFECT_MAP_REPEATS; exports.effectPaintSize = effectPaintSize; exports.readEffectStrokeMap = readEffectStrokeMap; exports.effectPaintKey = effectPaintKey; exports.isPaintEffectPaint = isPaintEffectPaint; exports.readPaintEffectPaint = readPaintEffectPaint; exports.sampleEffectField = sampleEffectField; exports.sampleEffectAt = sampleEffectAt; exports.effectDabField = effectDabField; exports.stampSampler = stampSampler; exports.brushStickerRefs = brushStickerRefs; exports.PAPER_FAMILIES = PAPER_FAMILIES; exports.PAPER_LIBRARY = PAPER_LIBRARY; exports.DEFAULT_PAPER = DEFAULT_PAPER; exports.paperPreset = paperPreset; exports.clonePaper = clonePaper; exports.normalizePaper = normalizePaper; exports.hexToRgb8 = hexToRgb8; exports.renderPaper = renderPaper; exports.TipGrain = TipGrain; exports.penOrientation = penOrientation; exports.tiltToOrientation = tiltToOrientation; exports.PenSmoother = PenSmoother; exports.IDENTITY_COPY = IDENTITY_COPY; exports.PenDabWalker = PenDabWalker; exports.DryStroke = DryStroke; exports.mixerTip = mixerTip; exports.toStrokePoint = toStrokePoint; exports.multiColorPalette = multiColorPalette; exports.multiColorGradient = multiColorGradient; exports.multiColorForDab = multiColorForDab; exports.PaintDabStroke = PaintDabStroke; exports.wetPaperInput = wetPaperInput; exports.WetStrokeDriver = WetStrokeDriver; exports.WET_MEDIUM_PARAMS = WET_MEDIUM_PARAMS; exports.WET_GPU_MODES = WET_GPU_MODES; exports.GPU_LEAD = GPU_LEAD; exports.PaintWetLayers = PaintWetLayers; exports.wetPigmentOf = wetPigmentOf; exports.VECTOR_WET_STEPS = VECTOR_WET_STEPS; exports.vectorMediaEngine = vectorMediaEngine; exports.usesVectorBackdrop = usesVectorBackdrop; exports.WetBrushstrokeJob = WetBrushstrokeJob; exports.renderWetBrushstroke = renderWetBrushstroke; exports.vectorBackdropRect = vectorBackdropRect; exports.renderBackdropBrushstroke = renderBackdropBrushstroke; exports.VECTOR_BRUSHSTROKE_SCALE = VECTOR_BRUSHSTROKE_SCALE; exports.isVectorBrushstrokeEngine = isVectorBrushstrokeEngine; exports.vectorBrushstrokeBrushes = vectorBrushstrokeBrushes; exports.vectorBrushstrokeBrush = vectorBrushstrokeBrush; exports.vectorBrushstrokeBrushOf = vectorBrushstrokeBrushOf; exports.vectorBrushstrokeBrushError = vectorBrushstrokeBrushError; exports.vectorBrushstrokeDefaultColour = vectorBrushstrokeDefaultColour; exports.sanitizeVectorBrushstroke = sanitizeVectorBrushstroke; exports.vectorBrushstrokePaintError = vectorBrushstrokePaintError; exports.readVectorBrushstrokePaint = readVectorBrushstrokePaint; exports.VECTOR_BRUSHSTROKE_MAX_SEED = VECTOR_BRUSHSTROKE_MAX_SEED; exports.sanitizeVectorBrushstrokePaper = sanitizeVectorBrushstrokePaper; exports.vectorBrushstrokeCharacterError = vectorBrushstrokeCharacterError; exports.randomVectorBrushstrokeSeed = randomVectorBrushstrokeSeed; exports.isVectorBrushstrokeLayer = isVectorBrushstrokeLayer; exports.vectorBrushstrokeReach = vectorBrushstrokeReach; exports.setVectorBackdropSource = setVectorBackdropSource; exports.onVectorBrushstrokesSettled = onVectorBrushstrokesSettled; exports.vectorBrushstrokesSettling = vectorBrushstrokesSettling; exports.settleVectorBrushstrokes = settleVectorBrushstrokes; exports.vectorBrushstrokeImages = vectorBrushstrokeImages; 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.sweepPath = sweepPath; 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.transformTextRect = transformTextRect; exports.lineToTextSpace = lineToTextSpace; exports.layoutText = layoutText; exports.textIndexAt = textIndexAt; exports.caretAt = caretAt; exports.textSelectionQuads = textSelectionQuads; exports.textArrowStep = textArrowStep; exports.textLineMove = textLineMove; exports.textDecorations = textDecorations; exports.textRectPath = textRectPath; exports.textFragmentOutline = textFragmentOutline; exports.drawTextFragment = drawTextFragment; 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.vectorTextOrientation = vectorTextOrientation; 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.vectorBevelFaces = vectorBevelFaces; exports.isVectorLens = isVectorLens; exports.VECTOR_LENS_LABELS = VECTOR_LENS_LABELS; exports.VECTOR_LENS_SPECS = VECTOR_LENS_SPECS; exports.sanitizeVectorLens = sanitizeVectorLens; exports.vectorLensColorMap = vectorLensColorMap; exports.mapVectorPaintColors = mapVectorPaintColors; exports.vectorLensDrawn = vectorLensDrawn; exports.resolveVectorLenses = resolveVectorLenses; exports.stripVectorLensViews = stripVectorLensViews; 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.isVectorMasterPage = isVectorMasterPage; exports.vectorPages = vectorPages; exports.vectorMasterPages = vectorMasterPages; exports.vectorMasterArt = vectorMasterArt; exports.resolveVectorMasterPages = resolveVectorMasterPages; exports.stripVectorMasterArt = stripVectorMasterArt; 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;
13536
+
13537
+
13538
+
13539
+
13540
+ 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_LENS_TYPES = VECTOR_LENS_TYPES; 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_PERSPECTIVE_PLANES = VECTOR_PERSPECTIVE_PLANES; 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.vectorPaintSolid = vectorPaintSolid; exports.shadeVectorColor = shadeVectorColor; exports.vectorPathRings = vectorPathRings; exports.vectorExtrudeFaces = vectorExtrudeFaces; exports.EFFECT_STRIP_HEIGHT = EFFECT_STRIP_HEIGHT; exports.EFFECT_MAP_REPEATS = EFFECT_MAP_REPEATS; exports.MAX_EFFECT_PATH_POINTS = MAX_EFFECT_PATH_POINTS; exports.strokePathPoints = strokePathPoints; exports.inferEffectPathControl = inferEffectPathControl; exports.withStrokePath = withStrokePath; exports.effectPaintSize = effectPaintSize; exports.readEffectStrokeMap = readEffectStrokeMap; exports.effectPaintKey = effectPaintKey; exports.isPaintEffectPaint = isPaintEffectPaint; exports.readPaintEffectPaint = readPaintEffectPaint; exports.sampleEffectField = sampleEffectField; exports.sampleEffectAt = sampleEffectAt; exports.effectDabField = effectDabField; exports.stampSampler = stampSampler; exports.brushStickerRefs = brushStickerRefs; exports.PAPER_FAMILIES = PAPER_FAMILIES; exports.PAPER_LIBRARY = PAPER_LIBRARY; exports.DEFAULT_PAPER = DEFAULT_PAPER; exports.paperPreset = paperPreset; exports.clonePaper = clonePaper; exports.normalizePaper = normalizePaper; exports.hexToRgb8 = hexToRgb8; exports.renderPaper = renderPaper; exports.TipGrain = TipGrain; exports.penOrientation = penOrientation; exports.tiltToOrientation = tiltToOrientation; exports.PenSmoother = PenSmoother; exports.IDENTITY_COPY = IDENTITY_COPY; exports.PenDabWalker = PenDabWalker; exports.DryStroke = DryStroke; exports.mixerTip = mixerTip; exports.toStrokePoint = toStrokePoint; exports.multiColorPalette = multiColorPalette; exports.multiColorGradient = multiColorGradient; exports.multiColorForDab = multiColorForDab; exports.PaintDabStroke = PaintDabStroke; exports.wetPaperInput = wetPaperInput; exports.WetStrokeDriver = WetStrokeDriver; exports.WET_MEDIUM_PARAMS = WET_MEDIUM_PARAMS; exports.WET_GPU_MODES = WET_GPU_MODES; exports.GPU_LEAD = GPU_LEAD; exports.PaintWetLayers = PaintWetLayers; exports.wetPigmentOf = wetPigmentOf; exports.VECTOR_WET_STEPS = VECTOR_WET_STEPS; exports.vectorMediaEngine = vectorMediaEngine; exports.usesVectorBackdrop = usesVectorBackdrop; exports.WetBrushstrokeJob = WetBrushstrokeJob; exports.renderWetBrushstroke = renderWetBrushstroke; exports.vectorBackdropRect = vectorBackdropRect; exports.renderBackdropBrushstroke = renderBackdropBrushstroke; exports.VECTOR_BRUSHSTROKE_SCALE = VECTOR_BRUSHSTROKE_SCALE; exports.isVectorBrushstrokeEngine = isVectorBrushstrokeEngine; exports.vectorBrushstrokeBrushes = vectorBrushstrokeBrushes; exports.vectorBrushstrokeBrush = vectorBrushstrokeBrush; exports.vectorBrushstrokeBrushOf = vectorBrushstrokeBrushOf; exports.vectorBrushstrokeBrushError = vectorBrushstrokeBrushError; exports.vectorBrushstrokeDefaultColour = vectorBrushstrokeDefaultColour; exports.sanitizeVectorBrushstroke = sanitizeVectorBrushstroke; exports.vectorBrushstrokePaintError = vectorBrushstrokePaintError; exports.readVectorBrushstrokePaint = readVectorBrushstrokePaint; exports.VECTOR_BRUSHSTROKE_MAX_SEED = VECTOR_BRUSHSTROKE_MAX_SEED; exports.sanitizeVectorBrushstrokePaper = sanitizeVectorBrushstrokePaper; exports.vectorBrushstrokeCharacterError = vectorBrushstrokeCharacterError; exports.randomVectorBrushstrokeSeed = randomVectorBrushstrokeSeed; exports.isVectorBrushstrokeLayer = isVectorBrushstrokeLayer; exports.vectorBrushstrokeReach = vectorBrushstrokeReach; exports.setVectorBackdropSource = setVectorBackdropSource; exports.onVectorBrushstrokesSettled = onVectorBrushstrokesSettled; exports.vectorBrushstrokesSettling = vectorBrushstrokesSettling; exports.settleVectorBrushstrokes = settleVectorBrushstrokes; exports.vectorBrushstrokeImages = vectorBrushstrokeImages; 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.sweepPath = sweepPath; 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.transformTextRect = transformTextRect; exports.lineToTextSpace = lineToTextSpace; exports.layoutText = layoutText; exports.textIndexAt = textIndexAt; exports.caretAt = caretAt; exports.textSelectionQuads = textSelectionQuads; exports.textArrowStep = textArrowStep; exports.textLineMove = textLineMove; exports.textDecorations = textDecorations; exports.textRectPath = textRectPath; exports.textFragmentOutline = textFragmentOutline; exports.drawTextFragment = drawTextFragment; 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.vectorTextOrientation = vectorTextOrientation; 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.vectorBevelFaces = vectorBevelFaces; exports.isVectorLens = isVectorLens; exports.VECTOR_LENS_LABELS = VECTOR_LENS_LABELS; exports.VECTOR_LENS_SPECS = VECTOR_LENS_SPECS; exports.sanitizeVectorLens = sanitizeVectorLens; exports.vectorLensColorMap = vectorLensColorMap; exports.mapVectorPaintColors = mapVectorPaintColors; exports.vectorLensDrawn = vectorLensDrawn; exports.resolveVectorLenses = resolveVectorLenses; exports.stripVectorLensViews = stripVectorLensViews; 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.isVectorMasterPage = isVectorMasterPage; exports.vectorPages = vectorPages; exports.vectorMasterPages = vectorMasterPages; exports.vectorMasterArt = vectorMasterArt; exports.resolveVectorMasterPages = resolveVectorMasterPages; exports.stripVectorMasterArt = stripVectorMasterArt; 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;