@pixerate/editor 0.270.0 → 0.271.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 (41) hide show
  1. package/dist/animation-editor/index.cjs +60 -60
  2. package/dist/animation-editor/index.js +3 -3
  3. package/dist/canvas/index.cjs +2 -2
  4. package/dist/canvas/index.js +1 -1
  5. package/dist/{chunk-4YSPQGZW.js → chunk-B5W677L7.js} +1 -1
  6. package/dist/{chunk-4NMPUJUK.cjs → chunk-DDL3ZBHK.cjs} +86 -86
  7. package/dist/{chunk-PY4GWSE2.cjs → chunk-EBFPMSJO.cjs} +27 -5
  8. package/dist/{chunk-56RHCIJV.cjs → chunk-JJ2H25JG.cjs} +237 -170
  9. package/dist/{chunk-CBVNCWJM.cjs → chunk-LBDC5434.cjs} +2 -2
  10. package/dist/{chunk-BENSE3VX.cjs → chunk-M2ZVPU7L.cjs} +23 -23
  11. package/dist/{chunk-4CPOKP27.js → chunk-QYXUE37Q.js} +1 -1
  12. package/dist/{chunk-MWUZCEFT.js → chunk-S2XPXA47.js} +1 -1
  13. package/dist/{chunk-EHLOCVWB.js → chunk-T2URHAJX.js} +27 -5
  14. package/dist/{chunk-FUDP5QBB.js → chunk-TNHDCP4R.js} +70 -3
  15. package/dist/{chunk-VBRHE4AM.cjs → chunk-U2ASNGO6.cjs} +35 -35
  16. package/dist/{chunk-THBJHPUL.js → chunk-YNFSH72F.js} +1 -1
  17. package/dist/effects/index.cjs +5 -2
  18. package/dist/effects/index.js +4 -1
  19. package/dist/effects/pool.d.cts +9 -0
  20. package/dist/effects/pool.d.ts +9 -0
  21. package/dist/effects/types.d.cts +2 -0
  22. package/dist/effects/types.d.ts +2 -0
  23. package/dist/image-editor/index.cjs +784 -784
  24. package/dist/image-editor/index.js +4 -4
  25. package/dist/paint-editor/controller.d.cts +75 -4
  26. package/dist/paint-editor/controller.d.ts +75 -4
  27. package/dist/paint-editor/effect-paint.d.cts +33 -8
  28. package/dist/paint-editor/effect-paint.d.ts +33 -8
  29. package/dist/paint-editor/effects.d.cts +4 -0
  30. package/dist/paint-editor/effects.d.ts +4 -0
  31. package/dist/paint-editor/index.cjs +692 -398
  32. package/dist/paint-editor/index.js +362 -68
  33. package/dist/paint-editor/stroke.d.cts +13 -5
  34. package/dist/paint-editor/stroke.d.ts +13 -5
  35. package/dist/vector/index.cjs +996 -996
  36. package/dist/vector/index.js +3 -3
  37. package/dist/video-editor/index.cjs +317 -317
  38. package/dist/video-editor/index.js +2 -2
  39. package/package.json +1 -1
  40. package/skills/pixerate-paint-editor/SKILL.md +2 -2
  41. package/skills/pixerate-paint-editor/references/effect-paint.md +28 -6
@@ -2601,13 +2601,76 @@ function vectorExtrudeFaces(path, params) {
2601
2601
  // src/paint-editor/effect-paint.ts
2602
2602
  var EFFECT_STRIP_HEIGHT = 256;
2603
2603
  var EFFECT_MAP_REPEATS = ["repeat", "mirror", "clamp"];
2604
+ var MAX_EFFECT_PATH_POINTS = 256;
2605
+ var roundPathCoord = (v2) => Math.round(v2 * 100) / 100;
2606
+ function strokePathPoints(points, maxPoints = MAX_EFFECT_PATH_POINTS) {
2607
+ if (!points.length) return [];
2608
+ const clean2 = [points[0]];
2609
+ for (let i = 1; i < points.length; i++) {
2610
+ const p = points[i];
2611
+ const prev = clean2[clean2.length - 1];
2612
+ if (p.x !== prev.x || p.y !== prev.y) clean2.push(p);
2613
+ }
2614
+ if (clean2.length === 1) {
2615
+ const x = roundPathCoord(clean2[0].x);
2616
+ const y = roundPathCoord(clean2[0].y);
2617
+ return [x, y, x, y];
2618
+ }
2619
+ if (clean2.length <= maxPoints) {
2620
+ const out2 = [];
2621
+ for (const p of clean2) out2.push(roundPathCoord(p.x), roundPathCoord(p.y));
2622
+ return out2;
2623
+ }
2624
+ const lengths = [0];
2625
+ for (let i = 1; i < clean2.length; i++) {
2626
+ lengths.push(lengths[i - 1] + Math.hypot(clean2[i].x - clean2[i - 1].x, clean2[i].y - clean2[i - 1].y));
2627
+ }
2628
+ const total = lengths[lengths.length - 1];
2629
+ if (total <= 0) {
2630
+ const x = roundPathCoord(clean2[0].x);
2631
+ const y = roundPathCoord(clean2[0].y);
2632
+ return [x, y, x, y];
2633
+ }
2634
+ const out = [];
2635
+ let j = 0;
2636
+ for (let k = 0; k < maxPoints; k++) {
2637
+ const at2 = total * k / (maxPoints - 1);
2638
+ while (j < clean2.length - 2 && lengths[j + 1] < at2) j++;
2639
+ const span = lengths[j + 1] - lengths[j] || 1;
2640
+ const f = Math.min(1, Math.max(0, (at2 - lengths[j]) / span));
2641
+ const a = clean2[j];
2642
+ const b = clean2[j + 1];
2643
+ out.push(roundPathCoord(a.x + (b.x - a.x) * f), roundPathCoord(a.y + (b.y - a.y) * f));
2644
+ }
2645
+ return out;
2646
+ }
2647
+ function inferEffectPathControl(values) {
2648
+ if ("path" in values) return "path";
2649
+ for (const [k, v2] of Object.entries(values)) {
2650
+ if (Array.isArray(v2) && v2.length >= 4 && v2.every((n) => typeof n === "number")) return k;
2651
+ }
2652
+ for (const [k, v2] of Object.entries(values)) {
2653
+ if (typeof v2 === "string") return k;
2654
+ }
2655
+ return "path";
2656
+ }
2657
+ function withStrokePath(paint, points, control) {
2658
+ if (_optionalChain([paint, 'access', _55 => _55.map, 'optionalAccess', _56 => _56.by]) !== "path") return paint;
2659
+ const key = _nullishCoalesce(control, () => ( inferEffectPathControl(paint.values)));
2660
+ return {
2661
+ ...paint,
2662
+ values: { ...paint.values, [key]: strokePathPoints(points) }
2663
+ };
2664
+ }
2604
2665
  function effectPaintSize(p, canvas) {
2605
- return p.map ? { width: p.map.length, height: EFFECT_STRIP_HEIGHT } : { width: canvas.width, height: canvas.height };
2666
+ 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
2667
  }
2607
2668
  function readEffectStrokeMap(raw) {
2608
- if (raw === void 0 || raw === null || raw.by === "canvas") return void 0;
2669
+ if (raw === void 0 || raw === null || raw === "canvas" || raw.by === "canvas") return void 0;
2670
+ if (raw === "path") return { by: "path" };
2609
2671
  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).`);
2672
+ if (r.by === "path") return { by: "path" };
2673
+ 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
2674
  const length2 = r.length === void 0 ? 300 : Number(r.length);
2612
2675
  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
2676
  const repeat = r.repeat === void 0 ? "repeat" : r.repeat;
@@ -2749,7 +2812,7 @@ function baseSampler(ref, art) {
2749
2812
  const k = kind;
2750
2813
  return (u, v2, seed) => _chunkRDFHWAHLcjs.stampCoverage.call(void 0, k, u, v2, seed);
2751
2814
  }
2752
- const a = _optionalChain([art, 'optionalCall', _55 => _55(ref)]);
2815
+ const a = _optionalChain([art, 'optionalCall', _59 => _59(ref)]);
2753
2816
  if (!a || !(a.width > 0 && a.height > 0)) return null;
2754
2817
  const hit = samplers.get(a);
2755
2818
  if (hit) return hit;
@@ -2871,8 +2934,8 @@ function clonePaper(p) {
2871
2934
  }
2872
2935
  function readOffset(raw, d) {
2873
2936
  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));
2937
+ const x = o && typeof o.x === "number" && Number.isFinite(o.x) ? Math.round(o.x) : _nullishCoalesce(_optionalChain([d, 'optionalAccess', _60 => _60.x]), () => ( 0));
2938
+ const y = o && typeof o.y === "number" && Number.isFinite(o.y) ? Math.round(o.y) : _nullishCoalesce(_optionalChain([d, 'optionalAccess', _61 => _61.y]), () => ( 0));
2876
2939
  return x || y ? { offset: { x, y } } : {};
2877
2940
  }
2878
2941
  function readTuning(raw, d) {
@@ -3001,7 +3064,7 @@ var TipGrain = class _TipGrain {
3001
3064
  const paper = new (0, _chunkNIBFKXMDcjs.PaperGrain)({ pattern: settings.source, seed: 0, scale: settings.scale, tiling: "repeat", dry: tuning2, wet: tuning2 });
3002
3065
  return new _TipGrain(paper, settings);
3003
3066
  }
3004
- const a = _optionalChain([art, 'optionalCall', _58 => _58(settings.source)]);
3067
+ const a = _optionalChain([art, 'optionalCall', _62 => _62(settings.source)]);
3005
3068
  if (!a || !(a.width > 0 && a.height > 0)) return null;
3006
3069
  return new _TipGrain(new ImageGrain(a.width, a.height, a.data, settings.contrast, settings.invert, settings.scale), settings);
3007
3070
  }
@@ -3262,7 +3325,7 @@ var DryStroke = (_class3 = class {
3262
3325
  this.stamp = brush.stamp ? stampSampler(brush.stamp, options.stampArt, brush.tip.hardness) : null;
3263
3326
  this.tipGrain = TipGrain.create(brush.tipGrain, options.stampArt);
3264
3327
  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];
3328
+ this.copies = _optionalChain([options, 'access', _63 => _63.copies, 'optionalAccess', _64 => _64.length]) ? options.copies : [IDENTITY_COPY];
3266
3329
  this.walkers = this.copies.map((c, i) => new PenDabWalker(brush, (_nullishCoalesce(options.seed, () => ( 0))) + i * 7919 | 0, c.linear));
3267
3330
  this.depth = options.grain && !options.grain.flat ? Math.min(1, Math.max(0, options.paperDepth * brush.grain)) : 0;
3268
3331
  }
@@ -3325,7 +3388,7 @@ var DryStroke = (_class3 = class {
3325
3388
  const vals = this.buf.subarray(0, n);
3326
3389
  if (this.stamp) rasterizeStampDab(m, this.stamp, d.index, rect, vals);
3327
3390
  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 })]);
3391
+ _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
3392
  if (this.depth > 0 && grain) {
3330
3393
  for (let yy = 0, k = 0; yy < rect.height; yy++) {
3331
3394
  const y = rect.y + yy + 0.5;
@@ -3406,7 +3469,7 @@ var PaintDabStroke = (_class4 = class {
3406
3469
  this.stamp = brush.engine === "dab" && brush.stamp ? stampSampler(brush.stamp, options.stampArt, brush.tip.hardness) : null;
3407
3470
  this.tipGrain = TipGrain.create(brush.tipGrain, options.stampArt);
3408
3471
  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];
3472
+ this.copies = _optionalChain([options, 'access', _68 => _68.copies, 'optionalAccess', _69 => _69.length]) ? options.copies : [IDENTITY_COPY];
3410
3473
  const exchanging = brush.engine === "mixer" || brush.engine === "dab";
3411
3474
  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
3475
  this.mixing = brush.engine === "mixer" ? brush.mixer.mixing : brush.behavior.mixing;
@@ -3419,7 +3482,7 @@ var PaintDabStroke = (_class4 = class {
3419
3482
  this.depth = options.grain && !options.grain.flat ? Math.min(1, Math.max(0, options.paperDepth * brush.grain)) : 0;
3420
3483
  this.coverage = brush.engine === "dab" ? new (0, _chunkNIBFKXMDcjs.CoverageMap)() : null;
3421
3484
  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;
3485
+ const table = _optionalChain([this, 'access', _70 => _70.sampler, 'optionalAccess', _71 => _71.acrossTip]) ? this.sampler.tipTable(GRADIENT_STEPS) : null;
3423
3486
  this.gradient = table ? table.map((e) => e.rgb) : null;
3424
3487
  this.gradientAlpha = table && table.some((e) => e.alpha < 1) ? table.map((e) => e.alpha) : null;
3425
3488
  this.scratch = brush.engine === "blender" ? _chunkNIBFKXMDcjs.createBlenderScratch.call(void 0, ) : null;
@@ -3454,7 +3517,7 @@ var PaintDabStroke = (_class4 = class {
3454
3517
 
3455
3518
  /** What copy 0's brush carries after the dabs so far (mixer and wet-capable dab brushes). */
3456
3519
  get load() {
3457
- return _nullishCoalesce(_optionalChain([this, 'access', _68 => _68.states, 'access', _69 => _69[0], 'access', _70 => _70.exchange, 'optionalAccess', _71 => _71.load]), () => ( null));
3520
+ return _nullishCoalesce(_optionalChain([this, 'access', _72 => _72.states, 'access', _73 => _73[0], 'access', _74 => _74.exchange, 'optionalAccess', _75 => _75.load]), () => ( null));
3458
3521
  }
3459
3522
  push(points) {
3460
3523
  const rects = [];
@@ -3504,7 +3567,7 @@ var PaintDabStroke = (_class4 = class {
3504
3567
  tip.fill(0);
3505
3568
  if (this.stamp) rasterizeStampDab({ ...d, alpha: 1 }, this.stamp, d.index, rect, tip);
3506
3569
  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)]);
3570
+ _optionalChain([this, 'access', _76 => _76.tipGrain, 'optionalAccess', _77 => _77.apply, 'call', _78 => _78(tip, rect, d)]);
3508
3571
  if (!(this.depth > 0 && this.options.grain)) return { tip, cov: tip };
3509
3572
  const cov = this.cov.subarray(0, n);
3510
3573
  const grain = this.options.grain;
@@ -3708,7 +3771,7 @@ var WetStrokeDriver = (_class5 = class {
3708
3771
 
3709
3772
  /** What copy 0's brush carries after the dabs so far. */
3710
3773
  get load() {
3711
- return _nullishCoalesce(_optionalChain([this, 'access', _75 => _75.states, 'access', _76 => _76[0], 'access', _77 => _77.exchange, 'optionalAccess', _78 => _78.load]), () => ( null));
3774
+ return _nullishCoalesce(_optionalChain([this, 'access', _79 => _79.states, 'access', _80 => _80[0], 'access', _81 => _81.exchange, 'optionalAccess', _82 => _82.load]), () => ( null));
3712
3775
  }
3713
3776
  /** Whether every point (and the end) has been applied. */
3714
3777
  get done() {
@@ -3927,8 +3990,8 @@ var PaintWetLayers = (_class6 = class {
3927
3990
  if (mode === this.gpuMode) return this.engineInfo();
3928
3991
  this.gpuMode = mode;
3929
3992
  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()]);
3993
+ _optionalChain([this, 'access', _83 => _83.world, 'optionalAccess', _84 => _84.attachGpu, 'call', _85 => _85(null)]);
3994
+ _optionalChain([this, 'access', _86 => _86.gpu, 'optionalAccess', _87 => _87.destroy, 'call', _88 => _88()]);
3932
3995
  this.gpu = null;
3933
3996
  this.gpuSupport = null;
3934
3997
  } else if (this.world) this.startGpu();
@@ -3936,13 +3999,13 @@ var PaintWetLayers = (_class6 = class {
3936
3999
  }
3937
4000
  engineInfo() {
3938
4001
  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() };
4002
+ 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
4003
  if (this.gpuMode === "off") return { ...base, state: "off", reason: "Forced to the CPU." };
3941
4004
  if (this.gpuStarting) return { ...base, state: "starting", reason: null };
3942
- if (_optionalChain([w, 'optionalAccess', _91 => _91.gpuError])) return { ...base, state: "failed", reason: w.gpuError };
4005
+ if (_optionalChain([w, 'optionalAccess', _95 => _95.gpuError])) return { ...base, state: "failed", reason: w.gpuError };
3943
4006
  if (this.gpuSupport && !this.gpuSupport.supported) return { ...base, state: "unavailable", reason: this.gpuSupport.reason };
3944
4007
  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 };
4008
+ if (_optionalChain([w, 'optionalAccess', _96 => _96.gpuActive])) return { ...base, state: "active", reason: null };
3946
4009
  return { ...base, state: "standby", reason: `The GPU takes over at ${this.gpuMinTiles} wet tiles (256 px).` };
3947
4010
  }
3948
4011
  /** The world (made on first use, at the canvas size). */
@@ -3981,13 +4044,13 @@ var PaintWetLayers = (_class6 = class {
3981
4044
  if (!this.canExtend(left2, top)) throw new Error("Wet paint only moves by whole 256 px tiles, between strokes.");
3982
4045
  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
4046
  const old = this.world;
3984
- const snap = _optionalChain([old, 'optionalAccess', _93 => _93.laneIds, 'call', _94 => _94(), 'access', _95 => _95.length]) ? old.snapshot() : null;
4047
+ const snap = _optionalChain([old, 'optionalAccess', _97 => _97.laneIds, 'call', _98 => _98(), 'access', _99 => _99.length]) ? old.snapshot() : null;
3985
4048
  this.dropWorld();
3986
4049
  this.lastTick = null;
3987
4050
  this.stepsOwed = 0;
3988
4051
  if (!old || !snap) return;
3989
4052
  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]);
4053
+ const flow = _optionalChain([this, 'access', _100 => _100.settings, 'access', _101 => _101.get, 'call', _102 => _102(l.id), 'optionalAccess', _103 => _103.flow]);
3991
4054
  return {
3992
4055
  base: _chunk474IQG74cjs.translateSurface.call(void 0, l.base, left2, top),
3993
4056
  ...l.light ? { light: _chunk474IQG74cjs.translateSurface.call(void 0, l.light, left2, top) } : {},
@@ -4006,11 +4069,11 @@ var PaintWetLayers = (_class6 = class {
4006
4069
  }
4007
4070
  /** Layers holding a wet layer (wet or drying). */
4008
4071
  wetLayerIds() {
4009
- return _nullishCoalesce(_optionalChain([this, 'access', _100 => _100.world, 'optionalAccess', _101 => _101.laneIds, 'call', _102 => _102()]), () => ( []));
4072
+ return _nullishCoalesce(_optionalChain([this, 'access', _104 => _104.world, 'optionalAccess', _105 => _105.laneIds, 'call', _106 => _106()]), () => ( []));
4010
4073
  }
4011
4074
  /** Whether a batch is running (edits wait). */
4012
4075
  get busy() {
4013
- return Boolean(_optionalChain([this, 'access', _103 => _103.world, 'optionalAccess', _104 => _104.busy]));
4076
+ return Boolean(_optionalChain([this, 'access', _107 => _107.world, 'optionalAccess', _108 => _108.busy]));
4014
4077
  }
4015
4078
  /** Resolves when no batch is running. */
4016
4079
  async idle() {
@@ -4039,13 +4102,13 @@ var PaintWetLayers = (_class6 = class {
4039
4102
  setParams(layerId, update) {
4040
4103
  const s = this.settingsOf(layerId);
4041
4104
  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);
4105
+ if (_optionalChain([this, 'access', _109 => _109.world, 'optionalAccess', _110 => _110.hasLane, 'call', _111 => _111(layerId)])) this.world.setParams(layerId, s.params);
4043
4106
  return { ...s.params };
4044
4107
  }
4045
4108
  setFlow(layerId, update) {
4046
4109
  const s = this.settingsOf(layerId);
4047
4110
  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)])) {
4111
+ if (_optionalChain([this, 'access', _112 => _112.world, 'optionalAccess', _113 => _113.hasLane, 'call', _114 => _114(layerId)])) {
4049
4112
  const { width, height } = this.host.canvas();
4050
4113
  this.world.setFlow(layerId, _chunkJ5VQYK7Tcjs.flowField.call(void 0, s.flow, width, height), s.flow.strength);
4051
4114
  }
@@ -4053,29 +4116,29 @@ var PaintWetLayers = (_class6 = class {
4053
4116
  }
4054
4117
  setTilt(update) {
4055
4118
  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)]);
4119
+ _optionalChain([this, 'access', _115 => _115.world, 'optionalAccess', _116 => _116.setTilt, 'call', _117 => _117(this.tilt)]);
4057
4120
  return { ...this.tilt };
4058
4121
  }
4059
4122
  /** The paper changed. */
4060
4123
  paperChanged() {
4061
- _optionalChain([this, 'access', _114 => _114.world, 'optionalAccess', _115 => _115.setPaper, 'call', _116 => _116(wetPaperInput(this.host.paper()))]);
4124
+ _optionalChain([this, 'access', _118 => _118.world, 'optionalAccess', _119 => _119.setPaper, 'call', _120 => _120(wetPaperInput(this.host.paper()))]);
4062
4125
  }
4063
4126
  /** A layer as tools describe it. */
4064
4127
  info(layerId) {
4065
4128
  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;
4129
+ const st = _optionalChain([this, 'access', _121 => _121.world, 'optionalAccess', _122 => _122.hasLane, 'call', _123 => _123(layerId)]) ? this.world.stats(layerId) : null;
4067
4130
  return {
4068
4131
  layerId,
4069
4132
  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)),
4133
+ wetCells: _nullishCoalesce(_optionalChain([st, 'optionalAccess', _124 => _124.wetCells]), () => ( 0)),
4134
+ wetBounds: _nullishCoalesce(_optionalChain([st, 'optionalAccess', _125 => _125.wetBounds]), () => ( null)),
4135
+ activeTiles: _nullishCoalesce(_optionalChain([st, 'optionalAccess', _126 => _126.activeTiles]), () => ( 0)),
4073
4136
  params: { ...s.params },
4074
4137
  flow: { ...s.flow }
4075
4138
  };
4076
4139
  }
4077
4140
  backend() {
4078
- return _nullishCoalesce(_optionalChain([this, 'access', _123 => _123.world, 'optionalAccess', _124 => _124.backend, 'call', _125 => _125()]), () => ( null));
4141
+ return _nullishCoalesce(_optionalChain([this, 'access', _127 => _127.world, 'optionalAccess', _128 => _128.backend, 'call', _129 => _129()]), () => ( null));
4079
4142
  }
4080
4143
  /** Shows the current wet pixels (at most `maxTiles` reshaded per layer). */
4081
4144
  syncDisplays(maxTiles = Infinity) {
@@ -4124,7 +4187,7 @@ var PaintWetLayers = (_class6 = class {
4124
4187
  const w = this.world;
4125
4188
  if (!w) return;
4126
4189
  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;
4190
+ if (w.isActive(id) || _optionalChain([this, 'access', _130 => _130.driver, 'optionalAccess', _131 => _131.init, 'access', _132 => _132.laneId]) === id) continue;
4128
4191
  const base = w.getBase(id);
4129
4192
  const light = w.isLit(id) ? w.getLight(id) : null;
4130
4193
  w.removeLane(id);
@@ -4206,7 +4269,7 @@ var PaintWetLayers = (_class6 = class {
4206
4269
  if (!d || !this.world) return;
4207
4270
  const rects = d.flush();
4208
4271
  if (rects.length) this.syncDisplays(DISPLAY_TILES_PER_TICK);
4209
- if (d.done) _optionalChain([this, 'access', _129 => _129.onDriverDone, 'optionalCall', _130 => _130(d)]);
4272
+ if (d.done) _optionalChain([this, 'access', _133 => _133.onDriverDone, 'optionalCall', _134 => _134(d)]);
4210
4273
  }
4211
4274
  /** Called when a live stroke that ended mid-batch has finished applying. */
4212
4275
  __init56() {this.onDriverDone = null}
@@ -4250,13 +4313,13 @@ var PaintWetLayers = (_class6 = class {
4250
4313
  /** The layer's light paint with all its wet paint dried (`null` without a wet layer or light), without changing anything. */
4251
4314
  bakedLight(layerId) {
4252
4315
  const w = this.world;
4253
- if (!_optionalChain([w, 'optionalAccess', _131 => _131.hasLane, 'call', _132 => _132(layerId)]) || !w.isLit(layerId)) return null;
4316
+ if (!_optionalChain([w, 'optionalAccess', _135 => _135.hasLane, 'call', _136 => _136(layerId)]) || !w.isLit(layerId)) return null;
4254
4317
  return w.bakedLight(layerId);
4255
4318
  }
4256
4319
  /** The layer's pixels with all its wet paint dried (deterministic), without changing anything. */
4257
4320
  bakedSurface(layerId) {
4258
4321
  const w = this.world;
4259
- if (!_optionalChain([w, 'optionalAccess', _133 => _133.hasLane, 'call', _134 => _134(layerId)])) return null;
4322
+ if (!_optionalChain([w, 'optionalAccess', _137 => _137.hasLane, 'call', _138 => _138(layerId)])) return null;
4260
4323
  return w.bakedSurface(layerId);
4261
4324
  }
4262
4325
  /** A snapshot of the world for undo (`null` when there is none). */
@@ -4277,13 +4340,13 @@ var PaintWetLayers = (_class6 = class {
4277
4340
  this.syncDisplays();
4278
4341
  }
4279
4342
  dropWorld() {
4280
- _optionalChain([this, 'access', _135 => _135.world, 'optionalAccess', _136 => _136.destroy, 'call', _137 => _137()]);
4343
+ _optionalChain([this, 'access', _139 => _139.world, 'optionalAccess', _140 => _140.destroy, 'call', _141 => _141()]);
4281
4344
  this.world = null;
4282
4345
  this.driver = null;
4283
4346
  }
4284
4347
  /** Forgets everything wet (a new canvas, a resize, opening a document). */
4285
4348
  reset() {
4286
- _optionalChain([this, 'access', _138 => _138.world, 'optionalAccess', _139 => _139.destroy, 'call', _140 => _140()]);
4349
+ _optionalChain([this, 'access', _142 => _142.world, 'optionalAccess', _143 => _143.destroy, 'call', _144 => _144()]);
4287
4350
  this.world = null;
4288
4351
  this.driver = null;
4289
4352
  this.settings.clear();
@@ -4313,9 +4376,9 @@ var PaintWetLayers = (_class6 = class {
4313
4376
  return out;
4314
4377
  }
4315
4378
  destroy() {
4316
- _optionalChain([this, 'access', _141 => _141.world, 'optionalAccess', _142 => _142.destroy, 'call', _143 => _143()]);
4379
+ _optionalChain([this, 'access', _145 => _145.world, 'optionalAccess', _146 => _146.destroy, 'call', _147 => _147()]);
4317
4380
  this.world = null;
4318
- _optionalChain([this, 'access', _144 => _144.gpu, 'optionalAccess', _145 => _145.destroy, 'call', _146 => _146()]);
4381
+ _optionalChain([this, 'access', _148 => _148.gpu, 'optionalAccess', _149 => _149.destroy, 'call', _150 => _150()]);
4319
4382
  this.gpu = null;
4320
4383
  }
4321
4384
  }, _class6);
@@ -4357,8 +4420,8 @@ function place(input, brush, options, pad = 0) {
4357
4420
  const [r, g, b, a] = options.color;
4358
4421
  const hex = "#" + [r, g, b].map((v2) => Math.round(Math.min(255, Math.max(0, v2))).toString(16).padStart(2, "0")).join("");
4359
4422
  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];
4423
+ const paint = _optionalChain([source, 'optionalAccess', _151 => _151.type]) === "gradient" ? _chunkNIBFKXMDcjs.resolvePaintGradient.call(void 0, _chunkNIBFKXMDcjs.scalePaintGradient.call(void 0, source, scale3), { paint: hex, secondary: "#ffffff" }) : null;
4424
+ const color2 = _optionalChain([source, 'optionalAccess', _152 => _152.type]) === "color" ? hexRgb(source.color) : [r / 255, g / 255, b / 255];
4362
4425
  return { points, brush: sized, rect, scale: scale3, color: color2, alpha: Math.min(1, Math.max(0, a / 255)), paint };
4363
4426
  }
4364
4427
  function hexRgb(hex) {
@@ -4468,7 +4531,7 @@ var WetBrushstrokeJob = (_class7 = class {
4468
4531
  return this.final;
4469
4532
  }
4470
4533
  destroy() {
4471
- _optionalChain([this, 'access', _149 => _149.world, 'optionalAccess', _150 => _150.destroy, 'call', _151 => _151()]);
4534
+ _optionalChain([this, 'access', _153 => _153.world, 'optionalAccess', _154 => _154.destroy, 'call', _155 => _155()]);
4472
4535
  }
4473
4536
  bake() {
4474
4537
  if (!this.world || !this.placed) return EMPTY;
@@ -4493,8 +4556,8 @@ function renderBackdropBrushstroke(input, brush, options) {
4493
4556
  const area = { x: 0, y: 0, width: rect.width, height: rect.height };
4494
4557
  const before = options.backdrop ? options.backdrop(rect, placed.scale) : new Uint8ClampedArray(rect.width * rect.height * 4);
4495
4558
  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()]);
4559
+ const cached = _optionalChain([options, 'access', _156 => _156.cache, 'optionalCall', _157 => _157(before)]);
4560
+ const hit = _optionalChain([cached, 'optionalAccess', _158 => _158.get, 'call', _159 => _159()]);
4498
4561
  if (hit) return hit;
4499
4562
  const base = _chunk474IQG74cjs.writeRegion.call(void 0, _chunk474IQG74cjs.emptySurface.call(void 0, 4), area, before);
4500
4563
  const live = /* @__PURE__ */ new Map();
@@ -4502,7 +4565,7 @@ function renderBackdropBrushstroke(input, brush, options) {
4502
4565
  offset: { x: 0, y: 0 },
4503
4566
  lockTransparency: false,
4504
4567
  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)),
4568
+ readTile: (tx, ty) => _nullishCoalesce(_nullishCoalesce(live.get(_chunk474IQG74cjs.tileKey.call(void 0, tx, ty)), () => ( _optionalChain([base, 'access', _160 => _160.tiles, 'access', _161 => _161.get, 'call', _162 => _162(_chunk474IQG74cjs.tileKey.call(void 0, tx, ty)), 'optionalAccess', _163 => _163.data]))), () => ( null)),
4506
4569
  writeTile: (tx, ty) => {
4507
4570
  const key = _chunk474IQG74cjs.tileKey.call(void 0, tx, ty);
4508
4571
  let t = live.get(key);
@@ -4520,7 +4583,7 @@ function renderBackdropBrushstroke(input, brush, options) {
4520
4583
  for (const [key, data] of live) tiles.set(key, { data, uniform: null });
4521
4584
  _chunk474IQG74cjs.readRegion.call(void 0, new (0, _chunk474IQG74cjs.TiledSurface)(4, tiles), area, after);
4522
4585
  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)]);
4586
+ _optionalChain([cached, 'optionalAccess', _164 => _164.set, 'call', _165 => _165(result)]);
4524
4587
  return result;
4525
4588
  }
4526
4589
 
@@ -4568,7 +4631,7 @@ function vectorBrushstrokeBrushError(id, user = []) {
4568
4631
  }
4569
4632
  function vectorBrushstrokeDefaultColour(id, user = [], scheme = "light") {
4570
4633
  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;
4634
+ return brush ? _chunkJBZRVLXVcjs.brushColourHex.call(void 0, _optionalChain([brush, 'access', _166 => _166.colour, 'optionalAccess', _167 => _167.default]), scheme) : null;
4572
4635
  }
4573
4636
  function sanitizeVectorBrushstroke(value, user = []) {
4574
4637
  if (!value || typeof value !== "object") return null;
@@ -4692,7 +4755,7 @@ function strokePaintOf(node, layer, brush, length2) {
4692
4755
  const color2 = [c[0] * 255, c[1] * 255, c[2] * 255, c[3] * 255].map(Math.round);
4693
4756
  if (layer.brush.paint) return { color: color2, paint: layer.brush.paint, within: null };
4694
4757
  const g = layer.paint;
4695
- if (isVectorGradient(g) && _optionalChain([g, 'access', _164 => _164.stops, 'optionalAccess', _165 => _165.length])) {
4758
+ if (isVectorGradient(g) && _optionalChain([g, 'access', _168 => _168.stops, 'optionalAccess', _169 => _169.length])) {
4696
4759
  const mode = _nullishCoalesce(g.strokeMode, () => ( "within"));
4697
4760
  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
4761
  if (mode === "across") return { color: [color2[0], color2[1], color2[2], 255], paint: gradientPaint(g, { by: "across-tip" }), within: null };
@@ -4847,7 +4910,7 @@ function vectorBrushstrokeImages(node, layer, context = {}) {
4847
4910
  const source = usesVectorBackdrop(engine) && backdropSource ? backdropSource(document2, node, Math.max(0, index), settle) : null;
4848
4911
  const deps = source ? [...source.deps, wetGeneration] : null;
4849
4912
  let byLayer = layerCache.get(node);
4850
- const hit = _optionalChain([byLayer, 'optionalAccess', _166 => _166.get, 'call', _167 => _167(layer)]);
4913
+ const hit = _optionalChain([byLayer, 'optionalAccess', _170 => _170.get, 'call', _171 => _171(layer)]);
4851
4914
  const stale = hit && (hit.pending.length && hit.pending.some((k) => wetSettled.has(k)) || settle === "now" && !hit.settled);
4852
4915
  if (hit && sameDeps(hit.deps, deps) && !stale) return hit.images;
4853
4916
  const brush = layer.brush.size ? { ...preset2, tip: { ...preset2.tip, size: layer.brush.size } } : preset2;
@@ -4872,7 +4935,7 @@ function vectorBrushstrokeImages(node, layer, context = {}) {
4872
4935
  const key = mediaKey(input, brush, options);
4873
4936
  stroke = renderBackdropBrushstroke(input, brush, {
4874
4937
  ...options,
4875
- backdrop: _nullishCoalesce(_optionalChain([source, 'optionalAccess', _168 => _168.backdrop]), () => ( null)),
4938
+ backdrop: _nullishCoalesce(_optionalChain([source, 'optionalAccess', _172 => _172.backdrop]), () => ( null)),
4876
4939
  cache: (bytes) => {
4877
4940
  const k = `${key}:${hashBytes(bytes).toString(16)}`;
4878
4941
  return { get: () => backdropResults.get(k), set: (img) => backdropResults.set(k, img) };
@@ -4976,7 +5039,7 @@ function withVectorFills(node, fills) {
4976
5039
  const next = { ...node };
4977
5040
  if (fills.length === 0 || fills.length === 1 && isPlainVectorPaintLayer(fills[0])) {
4978
5041
  delete next.fills;
4979
- next.fill = _nullishCoalesce(_optionalChain([fills, 'access', _169 => _169[0], 'optionalAccess', _170 => _170.paint]), () => ( null));
5042
+ next.fill = _nullishCoalesce(_optionalChain([fills, 'access', _173 => _173[0], 'optionalAccess', _174 => _174.paint]), () => ( null));
4980
5043
  return next;
4981
5044
  }
4982
5045
  next.fills = fills.map((l) => ({ ...l }));
@@ -5001,8 +5064,8 @@ function withVectorStrokes(node, strokes) {
5001
5064
  var json = (v2) => JSON.stringify(_nullishCoalesce(v2, () => ( null)));
5002
5065
  function strokeShorthandDiff(node, top) {
5003
5066
  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);
5067
+ if (json(node.stroke) !== json(_optionalChain([top, 'optionalAccess', _175 => _175.paint]))) out.push("stroke");
5068
+ for (const key of VECTOR_STROKE_SETTING_KEYS) if (json(node[key]) !== json(_optionalChain([top, 'optionalAccess', _176 => _176[key]]))) out.push(key);
5006
5069
  return out;
5007
5070
  }
5008
5071
  var checked = /* @__PURE__ */ new WeakSet();
@@ -5019,7 +5082,7 @@ function normalizeVectorPaintStacks(node, prefer = "shorthand") {
5019
5082
  if (Array.isArray(node.fills)) {
5020
5083
  let fills = node.fills;
5021
5084
  const top = fills[fills.length - 1];
5022
- if (prefer === "shorthand" && json(node.fill) !== json(_optionalChain([top, 'optionalAccess', _173 => _173.paint]))) {
5085
+ if (prefer === "shorthand" && json(node.fill) !== json(_optionalChain([top, 'optionalAccess', _177 => _177.paint]))) {
5023
5086
  if (!draws(node.fill)) fills = [];
5024
5087
  else fills = top ? [...fills.slice(0, -1), { ...top, paint: node.fill }] : [{ paint: node.fill }];
5025
5088
  }
@@ -5235,8 +5298,8 @@ var Measured = class {
5235
5298
  append(sa, sb, out) {
5236
5299
  for (const piece of _chunkGF2RBSDMcjs.trimSegments.call(void 0, this.segs, sa, sb, this.lens)) {
5237
5300
  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)]);
5301
+ const last = _optionalChain([out, 'access', _178 => _178[out.length - 1], 'optionalAccess', _179 => _179.segs]);
5302
+ const end = _optionalChain([last, 'optionalAccess', _180 => _180[last.length - 1], 'optionalAccess', _181 => _181.at, 'call', _182 => _182(-1)]);
5240
5303
  if (!end || Math.hypot(end[0] - piece[0][0], end[1] - piece[0][1]) > 1e-6) out.push({ segs: [piece], closed: false });
5241
5304
  else last.push(piece);
5242
5305
  }
@@ -5548,9 +5611,9 @@ function vectorRepeaterCopies(r, pivot) {
5548
5611
  for (let i = 0; i < n; i++) {
5549
5612
  const k = i + offset;
5550
5613
  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)));
5614
+ m = multiplyMatrices(m, scaleMatrix(Math.pow((_nullishCoalesce(_optionalChain([r, 'access', _183 => _183.scale, 'optionalAccess', _184 => _184.x]), () => ( 100))) / 100, k), Math.pow((_nullishCoalesce(_optionalChain([r, 'access', _185 => _185.scale, 'optionalAccess', _186 => _186.y]), () => ( 100))) / 100, k)));
5552
5615
  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));
5616
+ m = multiplyMatrices(m, translateMatrix(pivot.x + (_nullishCoalesce(_optionalChain([r, 'access', _187 => _187.position, 'optionalAccess', _188 => _188.x]), () => ( 0))) * k, pivot.y + (_nullishCoalesce(_optionalChain([r, 'access', _189 => _189.position, 'optionalAccess', _190 => _190.y]), () => ( 0))) * k));
5554
5617
  const t = n > 1 ? i / (n - 1) : 0;
5555
5618
  const partial = i + 1 === n && fract > 0 ? fract : 1;
5556
5619
  out.push({ index: i, matrix: m, opacity: Math.min(1, Math.max(0, (so + (eo - so) * t) * partial)) });
@@ -5714,7 +5777,7 @@ function mapBezierPath(path, f, tolerance = 0.1, options = {}) {
5714
5777
 
5715
5778
  // src/vector/frames.ts
5716
5779
  function isVectorFrame(node) {
5717
- return _optionalChain([node, 'optionalAccess', _187 => _187.type]) === "group" && !!node.frame && !node.blend && !node.liveBoolean && !node.mask;
5780
+ return _optionalChain([node, 'optionalAccess', _191 => _191.type]) === "group" && !!node.frame && !node.blend && !node.liveBoolean && !node.mask;
5718
5781
  }
5719
5782
  function vectorFrameRectPath(frame) {
5720
5783
  const { x, y, width: w, height: h } = frame;
@@ -5759,8 +5822,8 @@ function placeSpan(rule, a0, a1, f0, f1, g0, g1) {
5759
5822
  }
5760
5823
  }
5761
5824
  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);
5825
+ const [x0, x1] = placeSpan(_nullishCoalesce(H[_nullishCoalesce(_optionalChain([resizing, 'optionalAccess', _192 => _192.horizontal]), () => ( "left"))], () => ( "start")), box.x, box.x + box.width, from.x, from.x + from.width, to.x, to.x + to.width);
5826
+ const [y0, y1] = placeSpan(_nullishCoalesce(V[_nullishCoalesce(_optionalChain([resizing, 'optionalAccess', _193 => _193.vertical]), () => ( "top"))], () => ( "start")), box.y, box.y + box.height, from.y, from.y + from.height, to.y, to.y + to.height);
5764
5827
  const sx = box.width > 1e-9 ? (x1 - x0) / box.width : 1;
5765
5828
  const sy = box.height > 1e-9 ? (y1 - y0) / box.height : 1;
5766
5829
  return [sx, 0, 0, sy, x0 - sx * box.x, y0 - sy * box.y];
@@ -5816,7 +5879,7 @@ function vectorFrameDocument(doc, id, find) {
5816
5879
  height,
5817
5880
  ...doc.background ? { background: doc.background } : {},
5818
5881
  nodes: [placed],
5819
- ..._optionalChain([doc, 'access', _190 => _190.symbols, 'optionalAccess', _191 => _191.length]) ? { symbols: doc.symbols } : {}
5882
+ ..._optionalChain([doc, 'access', _194 => _194.symbols, 'optionalAccess', _195 => _195.length]) ? { symbols: doc.symbols } : {}
5820
5883
  };
5821
5884
  }
5822
5885
  function getVectorFramePanel(state) {
@@ -5836,7 +5899,7 @@ function getVectorFramePanel(state) {
5836
5899
  const one = (values) => values.every((v2) => v2 === values[0]) ? values[0] : "mixed";
5837
5900
  return {
5838
5901
  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
5902
+ resizing: children.length ? { ids: children.map((c) => c.id), horizontal: one(children.map((c) => _nullishCoalesce(_optionalChain([c, 'access', _196 => _196.resizing, 'optionalAccess', _197 => _197.horizontal]), () => ( "left")))), vertical: one(children.map((c) => _nullishCoalesce(_optionalChain([c, 'access', _198 => _198.resizing, 'optionalAccess', _199 => _199.vertical]), () => ( "top")))) } : null
5840
5903
  };
5841
5904
  }
5842
5905
 
@@ -6222,7 +6285,7 @@ function normalizeVectorFilterParams(type, params, base) {
6222
6285
  if (!isVectorFilterType(type)) return null;
6223
6286
  const out = { ...VECTOR_FILTER_DEFAULTS[type], ..._nullishCoalesce(base, () => ( {})) };
6224
6287
  for (const spec of VECTOR_FILTER_PARAM_SPECS[type]) {
6225
- const v2 = _optionalChain([params, 'optionalAccess', _196 => _196[spec.key]]);
6288
+ const v2 = _optionalChain([params, 'optionalAccess', _200 => _200[spec.key]]);
6226
6289
  if (v2 === void 0) continue;
6227
6290
  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
6291
  else if (spec.kind === "color" && typeof v2 === "string" && v2.trim()) out[spec.key] = v2.trim();
@@ -6354,7 +6417,7 @@ function vectorFilterSvg(filters, id, bounds) {
6354
6417
  primitives.push(fe("feGaussianBlur", { in: body, stdDeviation: round(f.params.radius / 2), result: name("body") }));
6355
6418
  body = name("body");
6356
6419
  }
6357
- const lastResult = _optionalChain([primitives, 'access', _197 => _197[primitives.length - 1], 'optionalAccess', _198 => _198.attrs, 'access', _199 => _199.result]);
6420
+ const lastResult = _optionalChain([primitives, 'access', _201 => _201[primitives.length - 1], 'optionalAccess', _202 => _202.attrs, 'access', _203 => _203.result]);
6358
6421
  if (lastResult !== body) primitives.push(fe("feMerge", {}, [fe("feMergeNode", { in: body })]));
6359
6422
  const pad = vectorFilterReach(active) + 2;
6360
6423
  return {
@@ -6369,7 +6432,7 @@ function vectorFilterSvg(filters, id, bounds) {
6369
6432
  var escapeAttr = (value) => value.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
6370
6433
  function primitiveMarkup(p) {
6371
6434
  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}/>`;
6435
+ return _optionalChain([p, 'access', _204 => _204.children, 'optionalAccess', _205 => _205.length]) ? `<${p.tag}${attrs}>${p.children.map(primitiveMarkup).join("")}</${p.tag}>` : `<${p.tag}${attrs}/>`;
6373
6436
  }
6374
6437
  function vectorFilterMarkup(filter, extra = "") {
6375
6438
  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 +6450,7 @@ function sanitizeVectorMask(value) {
6387
6450
  return r.invert === true ? { type: r.type, invert: true } : { type: r.type };
6388
6451
  }
6389
6452
  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;
6453
+ return _optionalChain([node, 'optionalAccess', _206 => _206.type]) === "group" && !!node.mask && isVectorMaskType(node.mask.type) && !node.blend && !node.liveBoolean && node.children.length > 0;
6391
6454
  }
6392
6455
  function isVectorMaskActive(node) {
6393
6456
  return isVectorMaskGroup(node) && node.children[0].visible !== false;
@@ -6422,7 +6485,7 @@ function vectorMaskRegionShapes(node, type, parent = IDENTITY_MATRIX, self = tru
6422
6485
  if (!self && node.visible === false) return [];
6423
6486
  if (isVectorFrame(node)) node = vectorFrameDrawn(node);
6424
6487
  const m = multiplyMatrices(nodeMatrix(node), parent);
6425
- if (isVectorMaskActive(node) || node.type === "group" && _optionalChain([node, 'access', _203 => _203.effects, 'optionalAccess', _204 => _204.length])) {
6488
+ if (isVectorMaskActive(node) || node.type === "group" && _optionalChain([node, 'access', _207 => _207.effects, 'optionalAccess', _208 => _208.length])) {
6426
6489
  return vectorAppearanceShapes(node).flatMap((s) => regionOfPath(s.path, s.source, type, m));
6427
6490
  }
6428
6491
  const drawn = expandVectorAppearance(node);
@@ -6627,7 +6690,7 @@ function fitRuns(runs, length2, fallback) {
6627
6690
  }
6628
6691
  if (left2 > 0) {
6629
6692
  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)) });
6693
+ else out.push({ length: left2, style: _nullishCoalesce(_optionalChain([runs, 'access', _209 => _209[runs.length - 1], 'optionalAccess', _210 => _210.style]), () => ( fallback)) });
6631
6694
  }
6632
6695
  return compact(out);
6633
6696
  }
@@ -6637,7 +6700,7 @@ function styleAt(runs, index, fallback) {
6637
6700
  if (index < at2 + r.length) return r.style;
6638
6701
  at2 += r.length;
6639
6702
  }
6640
- return _nullishCoalesce(_optionalChain([runs, 'access', _207 => _207[runs.length - 1], 'optionalAccess', _208 => _208.style]), () => ( fallback));
6703
+ return _nullishCoalesce(_optionalChain([runs, 'access', _211 => _211[runs.length - 1], 'optionalAccess', _212 => _212.style]), () => ( fallback));
6641
6704
  }
6642
6705
  function restyleRange(runs, start, end, patch) {
6643
6706
  const out = [];
@@ -6693,7 +6756,7 @@ function paragraphRanges(text) {
6693
6756
  return out;
6694
6757
  }
6695
6758
  function fitParagraphRuns(runs, text) {
6696
- const fallback = _nullishCoalesce(_optionalChain([runs, 'access', _209 => _209[0], 'optionalAccess', _210 => _210.style]), () => ( {}));
6759
+ const fallback = _nullishCoalesce(_optionalChain([runs, 'access', _213 => _213[0], 'optionalAccess', _214 => _214.style]), () => ( {}));
6697
6760
  const out = compact(paragraphRanges(text).map((p) => ({ length: p.end - p.start, style: styleAt(runs, p.start, fallback) })));
6698
6761
  return out.length ? out : [{ length: 0, style: fallback }];
6699
6762
  }
@@ -6743,7 +6806,7 @@ function textLineRect(l) {
6743
6806
  var layoutCache = /* @__PURE__ */ new WeakMap();
6744
6807
  function layoutText(layer, shaper) {
6745
6808
  let byShaper = layoutCache.get(layer);
6746
- const hit = _optionalChain([byShaper, 'optionalAccess', _211 => _211.get, 'call', _212 => _212(shaper.id)]);
6809
+ const hit = _optionalChain([byShaper, 'optionalAccess', _215 => _215.get, 'call', _216 => _216(shaper.id)]);
6747
6810
  if (hit) return hit;
6748
6811
  const out = computeLayout(layer, shaper);
6749
6812
  if (!byShaper) {
@@ -6807,7 +6870,7 @@ function computeLayout(layer, shaper) {
6807
6870
  const code = seg.charCodeAt(k);
6808
6871
  if (isLow(code) && index > 0 && isHigh(text.charCodeAt(index - 1))) {
6809
6872
  const prev = chars[chars.length - 1];
6810
- if (_optionalChain([prev, 'optionalAccess', _213 => _213.up])) {
6873
+ if (_optionalChain([prev, 'optionalAccess', _217 => _217.up])) {
6811
6874
  chars.push({ index, ch: seg[k], advance: 0, style, up: prev.up, low: true });
6812
6875
  } else chars.push({ index, ch: seg[k], advance, style, low: true });
6813
6876
  continue;
@@ -7135,7 +7198,7 @@ function createCanvasTextShaper(options = {}) {
7135
7198
  return null;
7136
7199
  })));
7137
7200
  const canvas = make(1, 1);
7138
- const ctx = _optionalChain([canvas, 'optionalAccess', _214 => _214.getContext, 'call', _215 => _215("2d")]);
7201
+ const ctx = _optionalChain([canvas, 'optionalAccess', _218 => _218.getContext, 'call', _219 => _219("2d")]);
7139
7202
  if (!ctx || typeof ctx.measureText !== "function") return null;
7140
7203
  const fallback = _nullishCoalesce(options.fallbackFamily, () => ( "sans-serif"));
7141
7204
  const available = /* @__PURE__ */ new Map();
@@ -7208,10 +7271,10 @@ function createOutlineTextShaper(fonts, options = {}) {
7208
7271
  const entries = fonts.map((f) => {
7209
7272
  const e = "face" in f ? f : { face: f };
7210
7273
  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]));
7274
+ const family = _nullishCoalesce(_nullishCoalesce(_nullishCoalesce(e.family, () => ( _optionalChain([names, 'optionalAccess', _220 => _220.fontFamily, 'optionalAccess', _221 => _221.en]))), () => ( Object.values(_nullishCoalesce(_optionalChain([names, 'optionalAccess', _222 => _222.fontFamily]), () => ( {})))[0])), () => ( "Font"));
7275
+ const weight = _nullishCoalesce(_nullishCoalesce(e.weight, () => ( _optionalChain([e, 'access', _223 => _223.face, 'access', _224 => _224.tables, 'optionalAccess', _225 => _225.os2, 'optionalAccess', _226 => _226.usWeightClass]))), () => ( 400));
7276
+ const italic = _nullishCoalesce(e.italic, () => ( Boolean((_nullishCoalesce(_optionalChain([e, 'access', _227 => _227.face, 'access', _228 => _228.tables, 'optionalAccess', _229 => _229.os2, 'optionalAccess', _230 => _230.fsSelection]), () => ( 0))) & 1)));
7277
+ const postScript = _nullishCoalesce(_optionalChain([names, 'optionalAccess', _231 => _231.postScriptName, 'optionalAccess', _232 => _232.en]), () => ( Object.values(_nullishCoalesce(_optionalChain([names, 'optionalAccess', _233 => _233.postScriptName]), () => ( {})))[0]));
7215
7278
  return { face: e.face, family, key: family.toLowerCase(), weight, italic, postScript };
7216
7279
  });
7217
7280
  const fallbackKey = (_nullishCoalesce(options.fallback, () => ( entries[0].family))).toLowerCase();
@@ -7258,12 +7321,12 @@ function createOutlineTextShaper(fonts, options = {}) {
7258
7321
  return out;
7259
7322
  },
7260
7323
  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);
7324
+ return toPath(pick(font).entry.face.getPath(text, x, y, font.size, _optionalChain([opts, 'optionalAccess', _234 => _234.vertical]) ? { kerning: true, vertical: true } : { kerning: true }).commands);
7262
7325
  },
7263
7326
  vertical(char, font) {
7264
7327
  const { face } = pick(font).entry;
7265
7328
  const k = font.size / face.unitsPerEm;
7266
- const v2 = _optionalChain([face, 'access', _231 => _231.getVerticalMetrics, 'optionalCall', _232 => _232(char)]);
7329
+ const v2 = _optionalChain([face, 'access', _235 => _235.getVerticalMetrics, 'optionalCall', _236 => _236(char)]);
7267
7330
  if (v2) return { advance: v2.advance * k, originY: v2.originY * k, alternate: v2.alternate };
7268
7331
  return { advance: (face.ascender - face.descender) * k, originY: face.ascender * k, alternate: false };
7269
7332
  },
@@ -7324,7 +7387,7 @@ function vectorTextHasOutlines() {
7324
7387
  return typeof getVectorTextShaper().outline === "function";
7325
7388
  }
7326
7389
  function vectorTextFamilies() {
7327
- return _nullishCoalesce(_optionalChain([getVectorTextShaper, 'call', _233 => _233(), 'access', _234 => _234.families, 'optionalCall', _235 => _235()]), () => ( ["sans-serif", "serif", "monospace"]));
7390
+ return _nullishCoalesce(_optionalChain([getVectorTextShaper, 'call', _237 => _237(), 'access', _238 => _238.families, 'optionalCall', _239 => _239()]), () => ( ["sans-serif", "serif", "monospace"]));
7328
7391
  }
7329
7392
  var DEFAULT_VECTOR_FONT = { fontFamily: "sans-serif", fontWeight: 400, fontSize: 24 };
7330
7393
  var VECTOR_CHARACTER_STYLE_KEYS = ["fontFamily", "fontWeight", "italic", "fontSize", "tracking", "leading", "baselineShift", "underline", "strikethrough", "upright"];
@@ -7500,7 +7563,7 @@ function computeLayout2(node, shaper) {
7500
7563
  const fragments = [];
7501
7564
  const lines = [];
7502
7565
  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]);
7566
+ const fillOf = (f) => _optionalChain([runs, 'access', _240 => _240.find, 'call', _241 => _241((r) => f.start >= r.start && f.start < r.end), 'optionalAccess', _242 => _242.fill]);
7504
7567
  const styleOf = (f) => {
7505
7568
  const { color: _c, opacity: _o, postScriptName: _p, ...style } = f.style;
7506
7569
  return style;
@@ -7539,11 +7602,11 @@ function computeLayout2(node, shaper) {
7539
7602
  } else {
7540
7603
  const line = text.lines[0];
7541
7604
  const measure = measureVectorPath(subpathPath(frame.path), !!frame.flip);
7542
- const align = _nullishCoalesce(_optionalChain([node, 'access', _239 => _239.paragraph, 'optionalAccess', _240 => _240.align]), () => ( "left"));
7605
+ const align = _nullishCoalesce(_optionalChain([node, 'access', _243 => _243.paragraph, 'optionalAccess', _244 => _244.align]), () => ( "left"));
7543
7606
  const start = Math.max(0, _nullishCoalesce(frame.start, () => ( 0)));
7544
7607
  const end = Math.max(0, _nullishCoalesce(frame.end, () => ( 0)));
7545
7608
  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)));
7609
+ const baselineOffset = pathBaselineOffset(_nullishCoalesce(frame.baseline, () => ( "baseline")), _nullishCoalesce(_optionalChain([line, 'optionalAccess', _245 => _245.ascent]), () => ( 0)), _nullishCoalesce(_optionalChain([line, 'optionalAccess', _246 => _246.descent]), () => ( 0)));
7547
7610
  if (line) {
7548
7611
  const chars = line.chars.filter((c) => {
7549
7612
  const lo = block.text.charCodeAt(c.index);
@@ -7552,7 +7615,7 @@ function computeLayout2(node, shaper) {
7552
7615
  const advanceOf = (c) => {
7553
7616
  const pair = charAt(block.text, c.index).length === 2;
7554
7617
  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)));
7618
+ return c.advance + (_nullishCoalesce(_optionalChain([low, 'optionalAccess', _247 => _247.advance]), () => ( 0)));
7556
7619
  };
7557
7620
  const pivots = chars.map((c) => c.x + advanceOf(c) / 2);
7558
7621
  const positions = vectorPathTextPositions(pivots, [line.x, line.x + line.width], align, measure.length, start, end);
@@ -7607,7 +7670,7 @@ function computeLayout2(node, shaper) {
7607
7670
  if (x0 < Infinity) bounds = { x: x0, y: y0, width: x1 - x0, height: y1 - y0 };
7608
7671
  else if (frame.kind === "point") {
7609
7672
  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))) };
7673
+ bounds = { x: frame.x, y: frame.y - (_nullishCoalesce(_optionalChain([l, 'optionalAccess', _248 => _248.ascent]), () => ( 0))), width: 0, height: (_nullishCoalesce(_optionalChain([l, 'optionalAccess', _249 => _249.ascent]), () => ( 0))) + (_nullishCoalesce(_optionalChain([l, 'optionalAccess', _250 => _250.descent]), () => ( 0))) };
7611
7674
  }
7612
7675
  }
7613
7676
  return { shaper: shaper.id, glyphs, fragments, lines, origin, text, bounds, overflow, missingFonts: text.missingFonts };
@@ -7728,7 +7791,7 @@ function vectorTextCaret(node, index) {
7728
7791
  const t = { x: Math.cos(r), y: Math.sin(r) };
7729
7792
  const n2 = { x: -t.y, y: t.x };
7730
7793
  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)) };
7794
+ 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', _251 => _251.fragments, 'access', _252 => _252[g2.fragment], 'optionalAccess', _253 => _253.line]), () => ( 0)) };
7732
7795
  };
7733
7796
  if (node.frame.kind !== "path") {
7734
7797
  const c = caretAt(layout.text, index);
@@ -7868,7 +7931,7 @@ function sanitizeVectorTextFrame(value, path = "frame") {
7868
7931
  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
7932
  if (f.kind === "path") {
7870
7933
  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.`);
7934
+ if (!sp || !Array.isArray(sp.anchors) || sp.anchors.length < 2 || !sp.anchors.every((a) => isNum(_optionalChain([a, 'optionalAccess', _254 => _254.x])) && isNum(_optionalChain([a, 'optionalAccess', _255 => _255.y])))) fail(`${path}.path must be a subpath with at least two anchors.`);
7872
7935
  const out = { kind: "path", path: { closed: !!sp.closed, anchors: sp.anchors.map((a) => ({ ...a })) } };
7873
7936
  if (f.start !== void 0 && f.start !== 0) out.start = num2(f.start, `${path}.start`, 0, 1e7);
7874
7937
  if (f.end !== void 0 && f.end !== 0) out.end = num2(f.end, `${path}.end`, 0, 1e7);
@@ -7886,7 +7949,7 @@ function sanitizeVectorTextFrame(value, path = "frame") {
7886
7949
  return fail(`${path}.kind must be point, area or path, got ${JSON.stringify(f.kind)}.`);
7887
7950
  }
7888
7951
  function normalizeVectorTextRuns(text, runs) {
7889
- if (!_optionalChain([runs, 'optionalAccess', _252 => _252.length])) return null;
7952
+ if (!_optionalChain([runs, 'optionalAccess', _256 => _256.length])) return null;
7890
7953
  const cleaned = fitVectorTextRuns(
7891
7954
  runs.map((r) => ({ length: r.length, style: stripUndefined(r.style) })),
7892
7955
  text.length
@@ -7926,7 +7989,7 @@ function replaceVectorText(node, start, end, insert) {
7926
7989
  const clean2 = insert.replace(/\r\n?/g, "\n");
7927
7990
  const text = node.text.slice(0, start) + clean2 + node.text.slice(end);
7928
7991
  let runs = null;
7929
- if (_optionalChain([node, 'access', _253 => _253.runs, 'optionalAccess', _254 => _254.length])) {
7992
+ if (_optionalChain([node, 'access', _257 => _257.runs, 'optionalAccess', _258 => _258.length])) {
7930
7993
  const fitted = fitVectorTextRuns(node.runs, node.text.length);
7931
7994
  const style = styleAt(fitted, start > 0 ? start - 1 : start, {});
7932
7995
  runs = normalizeVectorTextRuns(text, spliceRuns(fitted, start, end, clean2.length, style));
@@ -7942,7 +8005,7 @@ function styleVectorText(node, start, end, patch) {
7942
8005
  if (whole) {
7943
8006
  let next2 = { ...node, font: patchVectorCharacterStyle(node.font, fields, "style") };
7944
8007
  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)) {
8008
+ if (_optionalChain([next2, 'access', _259 => _259.runs, 'optionalAccess', _260 => _260.length]) && (keys.length || fill !== void 0)) {
7946
8009
  const runs2 = normalizeVectorTextRuns(
7947
8010
  next2.text,
7948
8011
  next2.runs.map((r) => {
@@ -7987,7 +8050,7 @@ function bakeVectorTextGeometry(node, m) {
7987
8050
  ...s.baselineShift !== void 0 ? { baselineShift: s.baselineShift * k } : {}
7988
8051
  });
7989
8052
  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) }))]);
8053
+ const runs = _optionalChain([node, 'access', _261 => _261.runs, 'optionalAccess', _262 => _262.map, 'call', _263 => _263((r) => ({ length: r.length, style: scaleStyle(r.style) }))]);
7991
8054
  const p = node.paragraph;
7992
8055
  const paragraph = p ? {
7993
8056
  ...p,
@@ -8276,7 +8339,7 @@ function vectorInstanceGroup(node, bake) {
8276
8339
  const m = _nullishCoalesce(node.transform, () => ( [1, 0, 0, 1, 0, 0]));
8277
8340
  const { rigid, residual } = decomposeRigid(m);
8278
8341
  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]), () => ( [])));
8342
+ const hidden = new Set(_nullishCoalesce(_optionalChain([node, 'access', _264 => _264.overrides, 'optionalAccess', _265 => _265.hidden]), () => ( [])));
8280
8343
  const keep = (list) => list.filter((n) => !hidden.has(n.id)).map((n) => n.type === "group" ? { ...n, children: keep(n.children) } : n);
8281
8344
  let children = prefixVectorIds(keep(_nullishCoalesce(node.art, () => ( []))), node.id);
8282
8345
  if (!isIdentityMatrix(residual)) children = children.map((c) => bake(c, residual));
@@ -8289,8 +8352,8 @@ function vectorInstanceGroup(node, bake) {
8289
8352
  if (node.locked) group.locked = true;
8290
8353
  if (node.opacity !== void 0) group.opacity = node.opacity;
8291
8354
  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;
8355
+ if (_optionalChain([node, 'access', _266 => _266.filters, 'optionalAccess', _267 => _267.length])) group.filters = node.filters;
8356
+ if (_optionalChain([node, 'access', _268 => _268.effects, 'optionalAccess', _269 => _269.length])) group.effects = node.effects;
8294
8357
  if (node.booleanOperation) group.booleanOperation = node.booleanOperation;
8295
8358
  if (node.blendStep) group.blendStep = true;
8296
8359
  return group;
@@ -8543,8 +8606,8 @@ function vectorLensDrawn(node) {
8543
8606
  if (wire) {
8544
8607
  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
8608
  } 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)) }))]);
8609
+ const fills = _optionalChain([shape, 'access', _270 => _270.source, 'access', _271 => _271.fills, 'optionalAccess', _272 => _272.map, 'call', _273 => _273((l) => ({ ...l, paint: _nullishCoalesce(mapVectorPaintColors(l.paint, recolour), () => ( null)) }))]);
8610
+ const strokes = _optionalChain([shape, 'access', _274 => _274.source, 'access', _275 => _275.strokes, 'optionalAccess', _276 => _276.map, 'call', _277 => _277((l) => ({ ...l, paint: _nullishCoalesce(mapVectorPaintColors(l.paint, recolour), () => ( null)) }))]);
8548
8611
  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
8612
  } else contents.push(shapePath(shape, id, changed));
8550
8613
  }
@@ -8557,7 +8620,7 @@ function vectorLensDrawn(node) {
8557
8620
  const { lens: _l, lensView: _v, transform: _t, opacity: _o, effects: _e, blendMode: _bm, filters: _f, ...style } = node;
8558
8621
  const fillOpacity = lens.type === "transparency" ? 1 - Math.min(100, Math.max(0, lens.amount)) / 100 : 0;
8559
8622
  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";
8623
+ const stroked = (_nullishCoalesce(_optionalChain([node, 'access', _278 => _278.strokes, 'optionalAccess', _279 => _279.length]), () => ( 0))) > 0 || node.stroke != null && node.stroke !== "none";
8561
8624
  if (stroked) children.push({ ...style, id: `${node.id}~lens-stroke`, fill: null, fills: void 0 });
8562
8625
  const out = {
8563
8626
  id: node.id,
@@ -8566,7 +8629,7 @@ function vectorLensDrawn(node) {
8566
8629
  ...node.transform ? { transform: node.transform } : {},
8567
8630
  ...node.opacity !== void 0 ? { opacity: node.opacity } : {},
8568
8631
  ...node.blendMode ? { blendMode: node.blendMode } : {},
8569
- ..._optionalChain([node, 'access', _276 => _276.filters, 'optionalAccess', _277 => _277.length]) ? { filters: node.filters } : {},
8632
+ ..._optionalChain([node, 'access', _280 => _280.filters, 'optionalAccess', _281 => _281.length]) ? { filters: node.filters } : {},
8570
8633
  children
8571
8634
  };
8572
8635
  drawnCache2.set(node, out);
@@ -9567,7 +9630,7 @@ function normalizeVectorEffectParams(type, params, base) {
9567
9630
  if (!defaults) return null;
9568
9631
  const out = { ...defaults, ..._nullishCoalesce(base, () => ( {})) };
9569
9632
  for (const spec of VECTOR_EFFECT_PARAM_SPECS[type]) {
9570
- const v2 = _optionalChain([params, 'optionalAccess', _278 => _278[spec.key]]);
9633
+ const v2 = _optionalChain([params, 'optionalAccess', _282 => _282[spec.key]]);
9571
9634
  if (v2 === void 0) continue;
9572
9635
  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
9636
  else if (spec.kind === "boolean" && typeof v2 === "boolean") out[spec.key] = v2;
@@ -9579,7 +9642,7 @@ function normalizeVectorEffectParams(type, params, base) {
9579
9642
  const o = out;
9580
9643
  o.rows = Math.round(o.rows);
9581
9644
  o.columns = Math.round(o.columns);
9582
- const given = _optionalChain([params, 'optionalAccess', _279 => _279.mesh]);
9645
+ const given = _optionalChain([params, 'optionalAccess', _283 => _283.mesh]);
9583
9646
  let mesh = given !== void 0 ? isValidWarpMesh(given) ? cloneMesh(given) : null : o.mesh;
9584
9647
  if (o.style !== "mesh") mesh = null;
9585
9648
  if (mesh && given !== void 0) {
@@ -9596,10 +9659,10 @@ function createVectorEffect(type, id, params) {
9596
9659
  }
9597
9660
  var isEnabled = (e) => e.enabled !== false && !!VECTOR_EFFECT_DEFAULTS[e.type];
9598
9661
  function activeVectorEffects(node) {
9599
- return _nullishCoalesce(_optionalChain([node, 'access', _280 => _280.effects, 'optionalAccess', _281 => _281.filter, 'call', _282 => _282(isEnabled)]), () => ( []));
9662
+ return _nullishCoalesce(_optionalChain([node, 'access', _284 => _284.effects, 'optionalAccess', _285 => _285.filter, 'call', _286 => _286(isEnabled)]), () => ( []));
9600
9663
  }
9601
9664
  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)]);
9665
+ return node.type === "text" || node.type === "instance" || node.type === "group" && !!node.liveBoolean || isVectorFrame(node) || isVectorSymmetryGroup(node) || isVectorLens(node) || !!_optionalChain([node, 'access', _287 => _287.effects, 'optionalAccess', _288 => _288.some, 'call', _289 => _289(isEnabled)]);
9603
9666
  }
9604
9667
  var liveCache = /* @__PURE__ */ new WeakMap();
9605
9668
  function hasVectorAppearance(node) {
@@ -9611,7 +9674,7 @@ function hasVectorAppearance(node) {
9611
9674
  return v2;
9612
9675
  }
9613
9676
  function isVectorLiveBoolean(node) {
9614
- return _optionalChain([node, 'optionalAccess', _286 => _286.type]) === "group" && !!node.liveBoolean;
9677
+ return _optionalChain([node, 'optionalAccess', _290 => _290.type]) === "group" && !!node.liveBoolean;
9615
9678
  }
9616
9679
  function vectorOperandOperation(group, child) {
9617
9680
  return _nullishCoalesce(_nullishCoalesce(child.booleanOperation, () => ( group.liveBoolean)), () => ( "union"));
@@ -9728,7 +9791,7 @@ var compareOrder = (a, b) => {
9728
9791
  for (let i = 0; i < n; i++) if (a[i] !== b[i]) return a[i] - b[i];
9729
9792
  return a.length - b.length;
9730
9793
  };
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))) });
9794
+ var add3 = (a, b) => ({ x: a.x + (_nullishCoalesce(_optionalChain([b, 'optionalAccess', _291 => _291.x]), () => ( 0))), y: a.y + (_nullishCoalesce(_optionalChain([b, 'optionalAccess', _292 => _292.y]), () => ( 0))) });
9732
9795
  var mapPaths = (shapes, fn) => {
9733
9796
  const out = fn(shapes.map((s) => s.path));
9734
9797
  return shapes.map((s, i) => ({ ...s, path: _nullishCoalesce(out[i], () => ( [])) }));
@@ -9756,7 +9819,7 @@ function contourShapes(shapes, c) {
9756
9819
  const power = 2 ** (Math.min(100, Math.max(-100, c.acceleration)) / 50);
9757
9820
  for (let k = 1; k <= n; k++) {
9758
9821
  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;
9822
+ if (!_optionalChain([path, 'optionalAccess', _293 => _293.length])) break;
9760
9823
  const t = (k / n) ** power;
9761
9824
  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
9825
  out.push({ source, path, opacity: s.opacity, order: [outside ? n - k : k, ...s.order] });
@@ -9831,8 +9894,8 @@ function bevelShapes(shapes, b) {
9831
9894
  out.push({ source, path: f.path, opacity: s.opacity, order: [...s.order, 1, k] });
9832
9895
  });
9833
9896
  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";
9897
+ if (_optionalChain([middle, 'optionalAccess', _294 => _294.length])) out.push({ ...s, source: fillOnly, path: middle, order: [...s.order, 2] });
9898
+ const hasStroke = _optionalChain([s, 'access', _295 => _295.source, 'access', _296 => _296.strokes, 'optionalAccess', _297 => _297.length]) || s.source.stroke != null && s.source.stroke !== "none";
9836
9899
  if (hasStroke) out.push({ ...s, source: { ...s.source, fill: null, fills: void 0 }, order: [...s.order, 3] });
9837
9900
  }
9838
9901
  return out;
@@ -9965,10 +10028,10 @@ function vectorEffectInputBounds(node, effectId) {
9965
10028
  return paths ? pathsBounds(paths) : null;
9966
10029
  }
9967
10030
  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));
10031
+ return _nullishCoalesce(_optionalChain([node, 'optionalAccess', _298 => _298.effects, 'optionalAccess', _299 => _299.find, 'call', _300 => _300((e) => e.type === "envelope" && e.enabled !== false)]), () => ( null));
9969
10032
  }
9970
10033
  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);
10034
+ const e = effectId ? _optionalChain([node, 'access', _301 => _301.effects, 'optionalAccess', _302 => _302.find, 'call', _303 => _303((x) => x.id === effectId)]) : vectorNodeEnvelope(node);
9972
10035
  if (!e || e.type !== "envelope") return null;
9973
10036
  const bounds = vectorEffectInputBounds(node, e.id);
9974
10037
  if (!bounds || !(bounds.width > 0 && bounds.height > 0)) return null;
@@ -10029,7 +10092,7 @@ function placement(node) {
10029
10092
  ...node.blendStep ? { blendStep: true } : {},
10030
10093
  ...node.booleanOperation ? { booleanOperation: node.booleanOperation } : {},
10031
10094
  ...node.blendMode ? { blendMode: node.blendMode } : {},
10032
- ..._optionalChain([node, 'access', _300 => _300.filters, 'optionalAccess', _301 => _301.length]) ? { filters: node.filters } : {}
10095
+ ..._optionalChain([node, 'access', _304 => _304.filters, 'optionalAccess', _305 => _305.length]) ? { filters: node.filters } : {}
10033
10096
  };
10034
10097
  }
10035
10098
  function vectorAppearanceNodes(node) {
@@ -10161,7 +10224,7 @@ function vectorMasterPages(doc) {
10161
10224
  function fillTokens(node, page, pages) {
10162
10225
  const map = (s) => s.replace(/\{page\}/g, String(page)).replace(/\{pages\}/g, String(pages));
10163
10226
  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) };
10227
+ if (!_optionalChain([node, 'access', _306 => _306.runs, 'optionalAccess', _307 => _307.length])) return { ...node, text: map(node.text) };
10165
10228
  let at2 = 0;
10166
10229
  let text = "";
10167
10230
  const runs = [];
@@ -10184,7 +10247,7 @@ function vectorMasterArt(master, page, number, count) {
10184
10247
  const f = page.frame;
10185
10248
  const key = `${page.id}|${f.x}|${f.y}|${f.width}|${f.height}|${number}|${count}`;
10186
10249
  let byKey = artCache.get(master);
10187
- const hit = _optionalChain([byKey, 'optionalAccess', _304 => _304.get, 'call', _305 => _305(key)]);
10250
+ const hit = _optionalChain([byKey, 'optionalAccess', _308 => _308.get, 'call', _309 => _309(key)]);
10188
10251
  if (hit) return hit;
10189
10252
  const art = master.children.filter((c) => c.visible !== false).map((c) => {
10190
10253
  const box = vectorNodeBounds(c);
@@ -10229,7 +10292,7 @@ function stripVectorMasterArt(doc) {
10229
10292
  // src/vector/connectors.ts
10230
10293
  var SIDES = ["top", "right", "bottom", "left", "center"];
10231
10294
  function isVectorConnector(node) {
10232
- return _optionalChain([node, 'optionalAccess', _306 => _306.type]) === "path" && !!node.connector;
10295
+ return _optionalChain([node, 'optionalAccess', _310 => _310.type]) === "path" && !!node.connector;
10233
10296
  }
10234
10297
  function vectorConnectionSites(nodes, id) {
10235
10298
  const node = findVectorNode(nodes, id);
@@ -10286,7 +10349,7 @@ function facingSite(sites, toward) {
10286
10349
  }
10287
10350
  function storedEnds(node, world) {
10288
10351
  const sp = node.subpaths[0];
10289
- if (!_optionalChain([sp, 'optionalAccess', _307 => _307.anchors, 'access', _308 => _308.length])) return null;
10352
+ if (!_optionalChain([sp, 'optionalAccess', _311 => _311.anchors, 'access', _312 => _312.length])) return null;
10290
10353
  const a = sp.anchors[0];
10291
10354
  const b = sp.anchors[sp.anchors.length - 1];
10292
10355
  return [applyMatrix(world, a), applyMatrix(world, b)];
@@ -10393,8 +10456,8 @@ function routeVectorConnector(nodes, id) {
10393
10456
  }));
10394
10457
  return {
10395
10458
  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)),
10459
+ startSide: _nullishCoalesce(_optionalChain([s, 'optionalAccess', _313 => _313.side]), () => ( null)),
10460
+ endSide: _nullishCoalesce(_optionalChain([e, 'optionalAccess', _314 => _314.side]), () => ( null)),
10398
10461
  dropped: { start: !!startGlue && !s, end: !!endGlue && !e }
10399
10462
  };
10400
10463
  }
@@ -10406,7 +10469,7 @@ function sameSubpaths(a, b) {
10406
10469
  const o = b[i];
10407
10470
  return sp.closed === o.closed && sp.anchors.length === o.anchors.length && sp.anchors.every((p, k) => {
10408
10471
  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)));
10472
+ return samePoint(p, q) && samePoint(p.in, q.in) && samePoint(p.out, q.out) && (_nullishCoalesce(_optionalChain([p, 'access', _315 => _315.corner, 'optionalAccess', _316 => _316.radius]), () => ( 0))) === (_nullishCoalesce(_optionalChain([q, 'access', _317 => _317.corner, 'optionalAccess', _318 => _318.radius]), () => ( 0)));
10410
10473
  });
10411
10474
  });
10412
10475
  }
@@ -10685,7 +10748,7 @@ function applyVectorCornersAttribute(subpaths, value) {
10685
10748
  for (const item of value.trim().split(/\s+/)) {
10686
10749
  const m = /^(\d+)\.(\d+):([\d.eE+-]+)(?::([a-z]+))?$/.exec(item);
10687
10750
  if (!m) continue;
10688
- const a = _optionalChain([subpaths, 'access', _315 => _315[+m[1]], 'optionalAccess', _316 => _316.anchors, 'access', _317 => _317[+m[2]]]);
10751
+ const a = _optionalChain([subpaths, 'access', _319 => _319[+m[1]], 'optionalAccess', _320 => _320.anchors, 'access', _321 => _321[+m[2]]]);
10689
10752
  const radius = parseFloat(m[3]);
10690
10753
  if (!a || !(radius > 0)) continue;
10691
10754
  const kind = VECTOR_CORNER_KINDS.includes(m[4]) ? m[4] : void 0;
@@ -10710,7 +10773,7 @@ function vectorPaintToSvg(paint, gradientId, options = {}) {
10710
10773
  const area2 = bounds2 ? { x: bounds2.x - reach2, y: bounds2.y - reach2, width: bounds2.width + 2 * reach2, height: bounds2.height + 2 * reach2 } : null;
10711
10774
  const key2 = `${gradientId}|${_nullishCoalesce(options.role, () => ( "fill"))}|${_nullishCoalesce(options.precision, () => ( 3))}|${area2 ? [area2.x, area2.y, area2.width, area2.height].join(",") : ""}`;
10712
10775
  let byKey2 = paintCache.get(paint);
10713
- const hit = _optionalChain([byKey2, 'optionalAccess', _318 => _318.get, 'call', _319 => _319(key2)]);
10776
+ const hit = _optionalChain([byKey2, 'optionalAccess', _322 => _322.get, 'call', _323 => _323(key2)]);
10714
10777
  if (hit) return { value: `url(#${gradientId})`, defs: hit };
10715
10778
  const defs2 = vectorShadedSvgDefs(paint, gradientId, { bounds: bounds2, area: area2, precision: _nullishCoalesce(options.precision, () => ( 3)) });
10716
10779
  if (!byKey2) paintCache.set(paint, byKey2 = /* @__PURE__ */ new Map());
@@ -10722,7 +10785,7 @@ function vectorPaintToSvg(paint, gradientId, options = {}) {
10722
10785
  const precision = _nullishCoalesce(options.precision, () => ( 3));
10723
10786
  const key = `${gradientId}|${role}|${precision}`;
10724
10787
  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)]);
10788
+ const cached = _optionalChain([paintCache, 'access', _324 => _324.get, 'call', _325 => _325(owner), 'optionalAccess', _326 => _326.get, 'call', _327 => _327(key)]);
10726
10789
  if (cached && (!options.node || (role === "fill" ? options.node.fill : options.node.stroke) === paint)) return { value: `url(#${gradientId})`, defs: cached };
10727
10790
  const node = options.node;
10728
10791
  const bounds = node ? vectorPathLocalBounds(node) : null;
@@ -10776,7 +10839,7 @@ function vectorNodeLocalPaintBounds(node) {
10776
10839
  }
10777
10840
  var filterCache = /* @__PURE__ */ new WeakMap();
10778
10841
  function vectorNodeFilterSvg(node, id) {
10779
- if (!_optionalChain([node, 'access', _324 => _324.filters, 'optionalAccess', _325 => _325.length])) return null;
10842
+ if (!_optionalChain([node, 'access', _328 => _328.filters, 'optionalAccess', _329 => _329.length])) return null;
10780
10843
  const hit = filterCache.get(node);
10781
10844
  if (hit && hit.id === id) return hit.filter;
10782
10845
  const active = activeVectorFilters(node);
@@ -10862,7 +10925,7 @@ function vectorDocumentToSvg(doc, options = {}) {
10862
10925
  if (node.type === "path" && node.lens) out2 += ` data-vector-lens="${escapeAttr2(JSON.stringify(node.lens))}"`;
10863
10926
  const blend = vectorBlendModeCss(node.blendMode);
10864
10927
  if (blend) out2 += ` style="mix-blend-mode:${blend}"`;
10865
- if (_optionalChain([node, 'access', _326 => _326.filters, 'optionalAccess', _327 => _327.length])) {
10928
+ if (_optionalChain([node, 'access', _330 => _330.filters, 'optionalAccess', _331 => _331.length])) {
10866
10929
  const filter = vectorNodeFilterSvg(node, `${prefix}filter-${node.id}`);
10867
10930
  const data = ` data-vector-filters="${escapeAttr2(JSON.stringify(node.filters))}"`;
10868
10931
  if (filter) {
@@ -10909,7 +10972,7 @@ function vectorDocumentToSvg(doc, options = {}) {
10909
10972
  let out2 = ` stroke="${escapeAttr2(strokeValue)}" stroke-width="${num3(width)}"`;
10910
10973
  if (node.strokeLinecap && node.strokeLinecap !== "butt") out2 += ` stroke-linecap="${node.strokeLinecap}"`;
10911
10974
  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(" ")}"`;
10975
+ if (_optionalChain([node, 'access', _332 => _332.strokeDasharray, 'optionalAccess', _333 => _333.length])) out2 += ` stroke-dasharray="${node.strokeDasharray.map(num3).join(" ")}"`;
10913
10976
  return out2;
10914
10977
  };
10915
10978
  const liveCorners = (node) => {
@@ -10958,7 +11021,7 @@ function vectorDocumentToSvg(doc, options = {}) {
10958
11021
  };
10959
11022
  const emit2 = (node, depth) => {
10960
11023
  if (node.visible === false && !options.includeHidden) return;
10961
- const wrappers = _nullishCoalesce(_optionalChain([options, 'access', _330 => _330.wrap, 'optionalAccess', _331 => _331[node.id]]), () => ( []));
11024
+ const wrappers = _nullishCoalesce(_optionalChain([options, 'access', _334 => _334.wrap, 'optionalAccess', _335 => _335[node.id]]), () => ( []));
10962
11025
  wrappers.forEach((w2, i) => {
10963
11026
  let attrs = w2.id !== void 0 ? ` id="${escapeAttr2(w2.id)}"` : "";
10964
11027
  if (w2.transform) attrs += ` transform="${escapeAttr2(w2.transform)}"`;
@@ -10979,7 +11042,7 @@ function vectorDocumentToSvg(doc, options = {}) {
10979
11042
  };
10980
11043
  const emitMaskGroup = (node, depth) => {
10981
11044
  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;
11045
+ const body = _optionalChain([node, 'access', _336 => _336.effects, 'optionalAccess', _337 => _337.length]) && contents.length ? [{ id: `${node.id}~content`, type: "group", effects: node.effects, children: contents }] : contents;
10983
11046
  const settings = { type: node.mask.type, ...node.mask.invert ? { invert: true } : {} };
10984
11047
  lines.push(`${indent(depth)}<g${common(node)} data-vector-mask="${escapeAttr2(JSON.stringify(settings))}">`);
10985
11048
  const mask = vectorMaskRenderData(node, `${prefix}mask-${node.id}`, `${prefix}mask-filter-${node.id}`, precision);
@@ -10996,7 +11059,7 @@ function vectorDocumentToSvg(doc, options = {}) {
10996
11059
  lines.push(`${indent(depth + 1)}<g data-vector-part="mask-source" display="none">`);
10997
11060
  emitNode(source, depth + 2);
10998
11061
  lines.push(`${indent(depth + 1)}</g>`);
10999
- if (_optionalChain([mask, 'optionalAccess', _334 => _334.clip])) {
11062
+ if (_optionalChain([mask, 'optionalAccess', _338 => _338.clip])) {
11000
11063
  defs.push(`<clipPath id="${escapeAttr2(mask.id)}">${mask.clip.map((c) => `<path d="${c.d}" clip-rule="${c.clipRule}"/>`).join("")}</clipPath>`);
11001
11064
  ref = ` clip-path="url(#${escapeAttr2(mask.id)})"`;
11002
11065
  }
@@ -11008,7 +11071,7 @@ function vectorDocumentToSvg(doc, options = {}) {
11008
11071
  };
11009
11072
  const emitTextElement = (node, depth, attrs) => {
11010
11073
  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 } : {} };
11074
+ const fields = { text: node.text, font: node.font, ..._optionalChain([node, 'access', _339 => _339.runs, 'optionalAccess', _340 => _340.length]) ? { runs: node.runs } : {}, ...node.paragraph ? { paragraph: node.paragraph } : {}, frame: node.frame, ...node.orientation ? { orientation: node.orientation } : {}, ..._optionalChain([node, 'access', _341 => _341.effects, 'optionalAccess', _342 => _342.length]) ? { effects: node.effects } : {} };
11012
11075
  let data = ` data-vector-text="${escapeAttr2(JSON.stringify(fields))}"`;
11013
11076
  if (hasVectorPaintStacks(node)) data += ` data-vector-fills="${escapeAttr2(JSON.stringify(vectorFills(node)))}" data-vector-strokes="${escapeAttr2(JSON.stringify(vectorStrokes(node)))}"`;
11014
11077
  else {
@@ -11050,12 +11113,12 @@ function vectorDocumentToSvg(doc, options = {}) {
11050
11113
  };
11051
11114
  const emitText = (node, depth) => {
11052
11115
  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)]);
11116
+ const effects = !!_optionalChain([node, 'access', _343 => _343.effects, 'optionalAccess', _344 => _344.some, 'call', _345 => _345((e) => e.enabled !== false)]);
11054
11117
  if (!outlines || !effects && options.text !== "outlines") {
11055
11118
  emitTextElement(node, depth, common(node));
11056
11119
  return;
11057
11120
  }
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 } : {} }))}">`);
11121
+ lines.push(`${indent(depth)}<g${common(node)} data-vector-live="${escapeAttr2(JSON.stringify({ kind: "text", ..._optionalChain([node, 'access', _346 => _346.effects, 'optionalAccess', _347 => _347.length]) ? { effects: node.effects } : {} }))}">`);
11059
11122
  lines.push(`${indent(depth + 1)}<g data-vector-part="appearance">`);
11060
11123
  for (const shape of vectorAppearanceNodes(node)) emit2(shape, depth + 2);
11061
11124
  lines.push(`${indent(depth + 1)}</g>`);
@@ -11069,7 +11132,7 @@ function vectorDocumentToSvg(doc, options = {}) {
11069
11132
  const symbolRef = (symbolId) => {
11070
11133
  const hit = symbolIds.get(symbolId);
11071
11134
  if (hit) return hit;
11072
- const sym2 = _optionalChain([doc, 'access', _344 => _344.symbols, 'optionalAccess', _345 => _345.find, 'call', _346 => _346((x) => x.id === symbolId)]);
11135
+ const sym2 = _optionalChain([doc, 'access', _348 => _348.symbols, 'optionalAccess', _349 => _349.find, 'call', _350 => _350((x) => x.id === symbolId)]);
11073
11136
  if (!sym2) return null;
11074
11137
  const id = `${prefix}symbol-${symbolId}`;
11075
11138
  symbolIds.set(symbolId, id);
@@ -11079,20 +11142,20 @@ function vectorDocumentToSvg(doc, options = {}) {
11079
11142
  };
11080
11143
  const emitInstance = (node, depth) => {
11081
11144
  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]);
11145
+ const exact2 = !node.overrides && node.scaleStrokes !== false && !_optionalChain([node, 'access', _351 => _351.effects, 'optionalAccess', _352 => _352.length]) && !_optionalChain([node, 'access', _353 => _353.filters, 'optionalAccess', _354 => _354.length]);
11083
11146
  const ref = symbolRef(node.symbolId);
11084
11147
  if (exact2 && ref) {
11085
11148
  lines.push(`${indent(depth)}<use${common(node)} href="#${escapeAttr2(ref)}" data-vector-instance="${escapeAttr2(JSON.stringify(data))}"/>`);
11086
11149
  return;
11087
11150
  }
11088
- const full = { ...data, ...node.transform ? { transform: node.transform } : {}, ..._optionalChain([node, 'access', _351 => _351.effects, 'optionalAccess', _352 => _352.length]) ? { effects: node.effects } : {} };
11151
+ const full = { ...data, ...node.transform ? { transform: node.transform } : {}, ..._optionalChain([node, 'access', _355 => _355.effects, 'optionalAccess', _356 => _356.length]) ? { effects: node.effects } : {} };
11089
11152
  lines.push(`${indent(depth)}<g data-vector-instance="${escapeAttr2(JSON.stringify(full))}">`);
11090
11153
  emitNode(vectorInstanceDrawn(node), depth + 1);
11091
11154
  lines.push(`${indent(depth)}</g>`);
11092
11155
  };
11093
11156
  const emitFrame = (node, depth) => {
11094
11157
  const f = node.frame;
11095
- const data = { ...f, ..._optionalChain([node, 'access', _353 => _353.effects, 'optionalAccess', _354 => _354.length]) ? { effects: node.effects } : {} };
11158
+ const data = { ...f, ..._optionalChain([node, 'access', _357 => _357.effects, 'optionalAccess', _358 => _358.length]) ? { effects: node.effects } : {} };
11096
11159
  lines.push(`${indent(depth)}<g${common(node)} data-vector-frame="${escapeAttr2(JSON.stringify(data))}">`);
11097
11160
  const rect = vectorFrameRectPath(f);
11098
11161
  if (f.fill !== void 0 && f.fill !== null && f.fill !== "none") {
@@ -11107,7 +11170,7 @@ function vectorDocumentToSvg(doc, options = {}) {
11107
11170
  ref = ` clip-path="url(#${escapeAttr2(id)})"`;
11108
11171
  }
11109
11172
  lines.push(`${indent(depth + 1)}<g data-vector-part="frame-contents"${ref}>`);
11110
- if (_optionalChain([node, 'access', _355 => _355.masterArt, 'optionalAccess', _356 => _356.length])) {
11173
+ if (_optionalChain([node, 'access', _359 => _359.masterArt, 'optionalAccess', _360 => _360.length])) {
11111
11174
  lines.push(`${indent(depth + 2)}<g data-vector-part="frame-master">`);
11112
11175
  for (const child of node.masterArt) emit2(child, depth + 3);
11113
11176
  lines.push(`${indent(depth + 2)}</g>`);
@@ -11136,7 +11199,7 @@ function vectorDocumentToSvg(doc, options = {}) {
11136
11199
  if (hasOwnVectorAppearance(node)) {
11137
11200
  const live2 = {
11138
11201
  kind: node.type,
11139
- ..._optionalChain([node, 'access', _357 => _357.effects, 'optionalAccess', _358 => _358.length]) ? { effects: node.effects } : {},
11202
+ ..._optionalChain([node, 'access', _361 => _361.effects, 'optionalAccess', _362 => _362.length]) ? { effects: node.effects } : {},
11140
11203
  ...node.type === "group" && node.liveBoolean ? { liveBoolean: node.liveBoolean } : {},
11141
11204
  ...node.type === "group" && node.symmetry ? { symmetry: node.symmetry } : {}
11142
11205
  };
@@ -11187,7 +11250,7 @@ function vectorDocumentToSvg(doc, options = {}) {
11187
11250
  data += ` data-vector-width-profile="${widthProfileToAttribute(profile)}"`;
11188
11251
  if (node.strokeLinecap && node.strokeLinecap !== "butt") data += ` data-vector-stroke-linecap="${node.strokeLinecap}"`;
11189
11252
  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(" ")}"`;
11253
+ if (_optionalChain([node, 'access', _363 => _363.strokeDasharray, 'optionalAccess', _364 => _364.length])) data += ` data-vector-stroke-dasharray="${node.strokeDasharray.map(num3).join(" ")}"`;
11191
11254
  }
11192
11255
  lines.push(`${indent(depth)}<g${common(node)}${data}>`);
11193
11256
  lines.push(`${indent(depth + 1)}<path data-vector-part="fill" d="${d}"${fillAttrs}${live}/>`);
@@ -11368,7 +11431,7 @@ function readStyle(el, parent, cssRules) {
11368
11431
  const { mixBlendMode: _m, filter: _f, ...inherited } = parent;
11369
11432
  const out = { ...inherited };
11370
11433
  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])) {
11434
+ if (_optionalChain([cssRules, 'optionalAccess', _365 => _365.length])) {
11372
11435
  for (const rule of cssRules) {
11373
11436
  if (matchesSelector(el, rule.selector)) {
11374
11437
  for (const [prop, val] of Object.entries(rule.properties)) {
@@ -11424,7 +11487,7 @@ function attrOrStyle(el, name) {
11424
11487
  return el.attrs[name];
11425
11488
  }
11426
11489
  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));
11490
+ return _nullishCoalesce(_optionalChain([/^url\(\s*['"]?#([^'")\s]+)['"]?\s*\)/, 'access', _366 => _366.exec, 'call', _367 => _367((_nullishCoalesce(value, () => ( ""))).trim()), 'optionalAccess', _368 => _368[1]]), () => ( null));
11428
11491
  }
11429
11492
  function clipRulesAsFillRules(el) {
11430
11493
  const attrs = { ...el.attrs };
@@ -11489,9 +11552,9 @@ function resolveGradient(id, raw) {
11489
11552
  for (let el = first; el && !chain.includes(el) && chain.length < 32; ) {
11490
11553
  chain.push(el);
11491
11554
  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;
11555
+ el = _optionalChain([href, 'optionalAccess', _369 => _369.startsWith, 'call', _370 => _370("#")]) ? raw.get(href.slice(1)) : void 0;
11493
11556
  }
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]]);
11557
+ const attr = (name) => _optionalChain([chain, 'access', _371 => _371.find, 'call', _372 => _372((el) => el.attrs[name] !== void 0), 'optionalAccess', _373 => _373.attrs, 'access', _374 => _374[name]]);
11495
11558
  const stops = _nullishCoalesce(chain.map(readStops).find((s) => s.length), () => ( []));
11496
11559
  if (!stops.length) return null;
11497
11560
  const user = attr("gradientUnits") === "userSpaceOnUse";
@@ -11663,7 +11726,7 @@ function parseVectorSvg(svg, options = {}) {
11663
11726
  const stackedPath = (g, _style, m, meta) => {
11664
11727
  const fillEl = g.children.find((c) => c.name === "path" && c.attrs["data-vector-part"] === "fill");
11665
11728
  const subpaths = fillEl ? shapeOf(fillEl) : null;
11666
- if (!_optionalChain([subpaths, 'optionalAccess', _371 => _371.length])) return null;
11729
+ if (!_optionalChain([subpaths, 'optionalAccess', _375 => _375.length])) return null;
11667
11730
  const parse = (v2) => {
11668
11731
  try {
11669
11732
  return v2 ? JSON.parse(v2) : [];
@@ -11682,7 +11745,7 @@ function parseVectorSvg(svg, options = {}) {
11682
11745
  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
11746
  for (const n of nodes2) {
11684
11747
  const prev = out[out.length - 1];
11685
- if (_optionalChain([prev, 'optionalAccess', _372 => _372.type]) === "path" && n.type === "path" && key(prev) === key(n)) {
11748
+ if (_optionalChain([prev, 'optionalAccess', _376 => _376.type]) === "path" && n.type === "path" && key(prev) === key(n)) {
11686
11749
  const fills = vectorFills(n);
11687
11750
  const strokesBefore = vectorStrokes(prev);
11688
11751
  if (!(fills.length && strokesBefore.length)) {
@@ -11700,7 +11763,7 @@ function parseVectorSvg(svg, options = {}) {
11700
11763
  const part = (name) => g.children.find((c) => c.name === "path" && c.attrs["data-vector-part"] === name);
11701
11764
  const fillEl = part("fill");
11702
11765
  const subpaths = fillEl ? shapeOf(fillEl) : null;
11703
- if (!fillEl || !_optionalChain([subpaths, 'optionalAccess', _373 => _373.length])) return null;
11766
+ if (!fillEl || !_optionalChain([subpaths, 'optionalAccess', _377 => _377.length])) return null;
11704
11767
  const a = g.attrs;
11705
11768
  const fs = readStyle(fillEl, style, styleRules);
11706
11769
  const strokeEl = part("stroke");
@@ -11737,7 +11800,7 @@ function parseVectorSvg(svg, options = {}) {
11737
11800
  ...profile.length ? { strokeWidthProfile: profile } : {},
11738
11801
  ...keptCap ? { strokeLinecap: keptCap } : {},
11739
11802
  ...keptJoin ? { strokeLinejoin: keptJoin } : {},
11740
- ..._optionalChain([keptDash, 'optionalAccess', _374 => _374.length]) ? { strokeDasharray: keptDash } : {}
11803
+ ..._optionalChain([keptDash, 'optionalAccess', _378 => _378.length]) ? { strokeDasharray: keptDash } : {}
11741
11804
  };
11742
11805
  return placed(node, m);
11743
11806
  };
@@ -11802,8 +11865,8 @@ function parseVectorSvg(svg, options = {}) {
11802
11865
  } else {
11803
11866
  const fill = json2(g.attrs["data-vector-fill"]);
11804
11867
  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));
11868
+ node.fill = fill == null ? null : _nullishCoalesce(_optionalChain([sanitizeVectorFills, 'call', _379 => _379([{ paint: fill }]), 'access', _380 => _380[0], 'optionalAccess', _381 => _381.paint]), () => ( null));
11869
+ node.stroke = stroke == null ? null : _nullishCoalesce(_optionalChain([sanitizeVectorFills, 'call', _382 => _382([{ paint: stroke }]), 'access', _383 => _383[0], 'optionalAccess', _384 => _384.paint]), () => ( null));
11807
11870
  const settings = json2(g.attrs["data-vector-stroke-settings"]);
11808
11871
  if (settings && typeof settings === "object") {
11809
11872
  const strokes = sanitizeVectorStrokes([{ paint: _nullishCoalesce(node.stroke, () => ( "#000")), ...settings }]);
@@ -11839,8 +11902,8 @@ function parseVectorSvg(svg, options = {}) {
11839
11902
  const anchor = attrOrStyle(el, "text-anchor");
11840
11903
  const first0 = (v2) => _nullishCoalesce(numberList(v2)[0], () => ( 0));
11841
11904
  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]));
11905
+ const x = el.attrs.x !== void 0 ? first0(el.attrs.x) : first0(_optionalChain([tspan, 'optionalAccess', _385 => _385.attrs, 'access', _386 => _386.x]));
11906
+ const y = el.attrs.y !== void 0 ? first0(el.attrs.y) : first0(_optionalChain([tspan, 'optionalAccess', _387 => _387.attrs, 'access', _388 => _388.y]));
11844
11907
  const fillValue = _nullishCoalesce(attrOrStyle(el, "fill"), () => ( style.fill));
11845
11908
  let node = {
11846
11909
  id: idFor(el),
@@ -11871,12 +11934,12 @@ function parseVectorSvg(svg, options = {}) {
11871
11934
  if (symbolOfElement.has(el)) return symbolOfElement.get(el);
11872
11935
  symbolOfElement.set(el, null);
11873
11936
  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()));
11937
+ let id = typeof _optionalChain([own, 'optionalAccess', _389 => _389.id]) === "string" && own.id ? own.id : _nullishCoalesce(el.attrs.id, () => ( createId()));
11875
11938
  while (usedSymbolIds.has(id)) id = `${id}-${usedSymbolIds.size}`;
11876
11939
  usedSymbolIds.add(id);
11877
11940
  const style = readStyle(el, rootStyle, styleRules);
11878
11941
  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 });
11942
+ symbols.push({ id, name: typeof _optionalChain([own, 'optionalAccess', _390 => _390.name]) === "string" && own.name ? own.name : _nullishCoalesce(el.attrs.id, () => ( "Symbol")), nodes: nodes2 });
11880
11943
  symbolOfElement.set(el, id);
11881
11944
  return id;
11882
11945
  };
@@ -11888,13 +11951,13 @@ function parseVectorSvg(svg, options = {}) {
11888
11951
  if (!symbolId) return null;
11889
11952
  const own = json2(el.attrs["data-vector-instance"]);
11890
11953
  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 } : {} };
11954
+ const node = { id: idFor(el), type: "instance", ...meta, symbolId, ..._optionalChain([own, 'optionalAccess', _391 => _391.scaleStrokes]) === false ? { scaleStrokes: false } : {}, ..._optionalChain([own, 'optionalAccess', _392 => _392.overrides]) ? { overrides: own.overrides } : {} };
11892
11955
  return isIdentityMatrix(place3) ? node : { ...node, transform: place3 };
11893
11956
  };
11894
11957
  const ownInstance = (g, m, meta) => {
11895
11958
  const raw = json2(g.attrs["data-vector-instance"]);
11896
11959
  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);
11960
+ const sym2 = [...byId.values()].find((e) => e.name === "symbol" && _optionalChain([json2, 'call', _393 => _393(e.attrs["data-vector-symbol"]), 'optionalAccess', _394 => _394.id]) === raw.symbolId);
11898
11961
  const symbolId = sym2 ? symbolFor(sym2) : raw.symbolId;
11899
11962
  if (!symbolId) return null;
11900
11963
  const t = Array.isArray(raw.transform) && raw.transform.length === 6 && raw.transform.every(Number.isFinite) ? raw.transform : IDENTITY_MATRIX;
@@ -11902,7 +11965,7 @@ function parseVectorSvg(svg, options = {}) {
11902
11965
  const drawn = g.children.find((c) => c.name === "g");
11903
11966
  const effects = sanitizeVectorEffects(raw.effects);
11904
11967
  const node = {
11905
- id: _nullishCoalesce(_optionalChain([drawn, 'optionalAccess', _391 => _391.attrs, 'access', _392 => _392.id]), () => ( idFor(g))),
11968
+ id: _nullishCoalesce(_optionalChain([drawn, 'optionalAccess', _395 => _395.attrs, 'access', _396 => _396.id]), () => ( idFor(g))),
11906
11969
  type: "instance",
11907
11970
  ...meta,
11908
11971
  symbolId,
@@ -11959,12 +12022,12 @@ function parseVectorSvg(svg, options = {}) {
11959
12022
  const masked = (el, nodes2, m) => {
11960
12023
  let out = nodes2;
11961
12024
  const clipEl = rawMasks.get(_nullishCoalesce(urlId(attrOrStyle(el, "clip-path")), () => ( "")));
11962
- if (_optionalChain([clipEl, 'optionalAccess', _393 => _393.name]) === "clipPath") {
12025
+ if (_optionalChain([clipEl, 'optionalAccess', _397 => _397.name]) === "clipPath") {
11963
12026
  const source = maskNode(clipEl, m, out, clipEl.attrs.clipPathUnits);
11964
12027
  if (source) out = [{ id: idFor({ name: "g", attrs: {}, children: [] }), type: "group", name: "Clip Group", mask: { type: "clip" }, children: [source, ...out] }];
11965
12028
  }
11966
12029
  const maskEl = rawMasks.get(_nullishCoalesce(urlId(attrOrStyle(el, "mask")), () => ( "")));
11967
- if (_optionalChain([maskEl, 'optionalAccess', _394 => _394.name]) === "mask") {
12030
+ if (_optionalChain([maskEl, 'optionalAccess', _398 => _398.name]) === "mask") {
11968
12031
  const source = maskNode(maskEl, m, out, maskEl.attrs.maskContentUnits);
11969
12032
  const type = attrOrStyle(maskEl, "mask-type") === "alpha" ? "alpha" : "luminance";
11970
12033
  if (source) out = [{ id: idFor({ name: "g", attrs: {}, children: [] }), type: "group", name: "Opacity Mask", mask: { type }, children: [source, ...out] }];
@@ -11986,19 +12049,19 @@ function parseVectorSvg(svg, options = {}) {
11986
12049
  let sourceEl = part("mask-source");
11987
12050
  if (!sourceEl) {
11988
12051
  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")]);
12052
+ const invert2 = _optionalChain([el, 'optionalAccess', _399 => _399.children, 'access', _400 => _400.find, 'call', _401 => _401((c) => c.name === "g" && c.attrs["data-vector-part"] === "mask-invert")]);
11990
12053
  sourceEl = _nullishCoalesce(invert2, () => ( el));
11991
12054
  }
11992
12055
  const source = sourceEl ? visit2(sourceEl, style, m)[0] : void 0;
11993
12056
  let contents = visit2(maskedEl, style, m);
11994
12057
  let effects;
11995
12058
  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") {
12059
+ if (_optionalChain([wrapper, 'optionalAccess', _402 => _402.type]) === "group") {
11997
12060
  effects = _nullishCoalesce(wrapper.effects, () => ( void 0));
11998
12061
  contents = wrapper.children;
11999
12062
  }
12000
12063
  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] };
12064
+ return { id, type: "group", ...meta, mask, ..._optionalChain([effects, 'optionalAccess', _403 => _403.length]) ? { effects } : {}, children: [source, ...contents] };
12002
12065
  };
12003
12066
  const frameGroup = (g, style, m, meta) => {
12004
12067
  const raw = parseJson(g.attrs["data-vector-frame"]);
@@ -12010,7 +12073,7 @@ function parseVectorSvg(svg, options = {}) {
12010
12073
  const { rigid, residual } = decomposeRigid(m);
12011
12074
  const r = _chunkGF2RBSDMcjs.bezierPathBounds.call(void 0, _chunkGF2RBSDMcjs.transformBezierPath.call(void 0, subpathsToBezier(vectorFrameRectPath(frame)), residual));
12012
12075
  const back = invertMatrix(rigid);
12013
- const effects = sanitizeVectorEffects(_optionalChain([raw, 'optionalAccess', _400 => _400.effects]));
12076
+ const effects = sanitizeVectorEffects(_optionalChain([raw, 'optionalAccess', _404 => _404.effects]));
12014
12077
  return {
12015
12078
  id,
12016
12079
  type: "group",
@@ -12482,13 +12545,13 @@ function hitTestVectorNode(node, p, tolerance = 0, parent = IDENTITY_MATRIX, opt
12482
12545
  }
12483
12546
  if (isVectorMaskGroup(node)) {
12484
12547
  const m = multiplyMatrices(nodeMatrix(node), parent);
12485
- const entered = !!_optionalChain([options, 'access', _401 => _401.entered, 'optionalAccess', _402 => _402.has, 'call', _403 => _403(node.id)]);
12548
+ const entered = !!_optionalChain([options, 'access', _405 => _405.entered, 'optionalAccess', _406 => _406.has, 'call', _407 => _407(node.id)]);
12486
12549
  if (!entered && isVectorMaskActive(node) && !vectorMaskContains(node, applyMatrix(invertMatrix(m), p), tolerance)) return false;
12487
12550
  const shown = !entered && hasOwnVectorAppearance(node) ? expandVectorAppearance(node).children : node.children;
12488
12551
  for (let i = shown.length - 1; i >= 1; i--) if (hitTestVectorNode(shown[i], p, tolerance, m, options)) return true;
12489
12552
  return entered && hitTestVectorMaskSource(node, p, tolerance, m, options);
12490
12553
  }
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);
12554
+ if (!(node.type === "group" && (!hasOwnVectorAppearance(node) || _optionalChain([options, 'access', _408 => _408.entered, 'optionalAccess', _409 => _409.has, 'call', _410 => _410(node.id)])))) node = expandVectorAppearance(node);
12492
12555
  if (node.type === "group") {
12493
12556
  const m = multiplyMatrices(nodeMatrix(node), parent);
12494
12557
  return node.children.some((c) => hitTestVectorNode(c, p, tolerance, m, options));
@@ -12500,7 +12563,7 @@ function hitTestVectorNode(node, p, tolerance = 0, parent = IDENTITY_MATRIX, opt
12500
12563
  function hitTestVectorMaskSource(group, p, tolerance, m, options) {
12501
12564
  const source = group.children[0];
12502
12565
  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);
12566
+ if (_optionalChain([group, 'access', _411 => _411.mask, 'optionalAccess', _412 => _412.type]) !== "clip") return hitTestVectorNode(source, p, tolerance, m, options);
12504
12567
  const paths = collectPathNodes(source).filter((n) => n.visible !== false);
12505
12568
  const pt2 = [p.x, p.y];
12506
12569
  return paths.some((n) => {
@@ -12549,24 +12612,24 @@ function mapAnchor(a, m) {
12549
12612
  }
12550
12613
  function bakeIntoGeometry(node, m) {
12551
12614
  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) };
12615
+ if (_optionalChain([node, 'access', _413 => _413.effects, 'optionalAccess', _414 => _414.length])) node = { ...node, effects: transformVectorEffects(node.effects, m, node) };
12553
12616
  if (isVectorFrame(node)) return bakeFrame(node, m);
12554
12617
  if (node.type === "group") {
12555
12618
  const group = node;
12556
12619
  const children = group.children.map((c) => transformVectorNode(c, m));
12557
12620
  const sym2 = group.symmetry ? { symmetry: transformVectorSymmetry(group.symmetry, m) } : {};
12558
- const spine = _optionalChain([group, 'access', _411 => _411.blend, 'optionalAccess', _412 => _412.spine]);
12621
+ const spine = _optionalChain([group, 'access', _415 => _415.blend, 'optionalAccess', _416 => _416.spine]);
12559
12622
  if (!spine) return { ...group, ...sym2, children };
12560
12623
  const moved = { closed: spine.closed, anchors: spine.anchors.map((a) => mapAnchor(a, m)) };
12561
12624
  return { ...group, children, blend: { ...group.blend, spine: moved } };
12562
12625
  }
12563
12626
  const path = node.type === "text" ? bakeVectorTextGeometry(node, m) : node;
12564
12627
  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]);
12628
+ const mirrored = flips && _optionalChain([path, 'access', _417 => _417.strokeWidthProfile, 'optionalAccess', _418 => _418.length]);
12566
12629
  const layer = (l) => ({
12567
12630
  ...l,
12568
12631
  ...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) } : {}
12632
+ ...flips && _optionalChain([l, 'access', _419 => _419.strokeWidthProfile, 'optionalAccess', _420 => _420.length]) ? { strokeWidthProfile: mirrorWidthProfile(l.strokeWidthProfile) } : {}
12570
12633
  });
12571
12634
  return {
12572
12635
  ...path,
@@ -12801,7 +12864,7 @@ function roundSubpaths(subpaths, precision = 3) {
12801
12864
 
12802
12865
  // src/vector/symmetry.ts
12803
12866
  function isVectorSymmetryGroup(node) {
12804
- return _optionalChain([node, 'optionalAccess', _417 => _417.type]) === "group" && !!node.symmetry && !node.blend && !node.liveBoolean && !node.mask && !node.frame;
12867
+ return _optionalChain([node, 'optionalAccess', _421 => _421.type]) === "group" && !!node.symmetry && !node.blend && !node.liveBoolean && !node.mask && !node.frame;
12805
12868
  }
12806
12869
  var rad = (deg) => deg * Math.PI / 180;
12807
12870
  var exact = (v2) => Math.abs(v2) < 1e-12 ? 0 : v2;
@@ -13444,4 +13507,8 @@ function transformVectorSymmetry(s, m) {
13444
13507
 
13445
13508
 
13446
13509
 
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;
13510
+
13511
+
13512
+
13513
+
13514
+ 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;