@pixerate/editor 0.100.0 → 0.101.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.
@@ -75,6 +75,25 @@ var VECTOR_GRADIENT_SPREADS = ["pad", "reflect", "repeat"];
75
75
  var VECTOR_GRADIENT_INTERPOLATIONS = ["srgb", "linear", "oklab"];
76
76
  var VECTOR_STROKE_GRADIENT_MODES = ["within", "along", "across"];
77
77
  var VECTOR_ARROWHEADS = ["triangle", "arrow", "open", "circle", "square", "bar"];
78
+ var VECTOR_BLEND_MODES = [
79
+ "normal",
80
+ "darken",
81
+ "multiply",
82
+ "color-burn",
83
+ "lighten",
84
+ "screen",
85
+ "color-dodge",
86
+ "linear-dodge",
87
+ "overlay",
88
+ "soft-light",
89
+ "hard-light",
90
+ "difference",
91
+ "exclusion",
92
+ "hue",
93
+ "saturation",
94
+ "color",
95
+ "luminosity"
96
+ ];
78
97
  var VECTOR_BLEND_SPACINGS = ["steps", "distance", "smoothColor"];
79
98
  var VECTOR_TOOLS = [
80
99
  "select",
@@ -100,6 +119,7 @@ var VECTOR_TRANSFORM_HANDLES = ["nw", "n", "ne", "e", "se", "s", "sw", "w", "rot
100
119
  var VECTOR_PATHFINDER_OPERATIONS = ["divide", "trim", "merge", "crop", "outline", "minusBack"];
101
120
  var VECTOR_EFFECT_TYPES = ["trim", "roundCorners", "puckerBloat", "twist", "zigzag", "wiggle", "offset", "merge", "repeater", "envelope"];
102
121
  var VECTOR_MERGE_MODES = ["merge", "add", "subtract", "intersect", "exclude"];
122
+ var VECTOR_FILTER_TYPES = ["dropShadow", "innerShadow", "outerGlow", "innerGlow", "layerBlur", "feather"];
103
123
 
104
124
  // src/vector/gradient.ts
105
125
  var clamp = (v2, lo, hi) => Math.min(hi, Math.max(lo, v2));
@@ -1255,8 +1275,8 @@ function removeWidthPoints(points, indices) {
1255
1275
  }
1256
1276
  function ease(u, e) {
1257
1277
  const x = Math.min(Math.max(u, 0), 1);
1258
- const round = Math.sqrt(Math.max(0, 1 - (1 - x) * (1 - x)));
1259
- return x + (round - x) * Math.min(Math.max(e, 0), 1);
1278
+ const round3 = Math.sqrt(Math.max(0, 1 - (1 - x) * (1 - x)));
1279
+ return x + (round3 - x) * Math.min(Math.max(e, 0), 1);
1260
1280
  }
1261
1281
  function taperWaveFactor(t, taper, wave) {
1262
1282
  let k = 1;
@@ -1880,6 +1900,278 @@ function vectorStrokeReach(style) {
1880
1900
  return reach;
1881
1901
  }
1882
1902
 
1903
+ // src/vector/paintLayers.ts
1904
+ var VECTOR_STROKE_SETTING_KEYS = [
1905
+ "strokeWidth",
1906
+ "strokeLinecap",
1907
+ "strokeLinejoin",
1908
+ "strokeDasharray",
1909
+ "strokeAlign",
1910
+ "startArrow",
1911
+ "endArrow",
1912
+ "arrowAlign",
1913
+ "startArrowScale",
1914
+ "endArrowScale",
1915
+ "strokeWidthProfile"
1916
+ ];
1917
+ var VECTOR_BLEND_MODE_LABELS = {
1918
+ normal: "Normal",
1919
+ darken: "Darken",
1920
+ multiply: "Multiply",
1921
+ "color-burn": "Color Burn",
1922
+ lighten: "Lighten",
1923
+ screen: "Screen",
1924
+ "color-dodge": "Color Dodge",
1925
+ "linear-dodge": "Linear Dodge (Add)",
1926
+ overlay: "Overlay",
1927
+ "soft-light": "Soft Light",
1928
+ "hard-light": "Hard Light",
1929
+ difference: "Difference",
1930
+ exclusion: "Exclusion",
1931
+ hue: "Hue",
1932
+ saturation: "Saturation",
1933
+ color: "Color",
1934
+ luminosity: "Luminosity"
1935
+ };
1936
+ function isVectorBlendMode(value) {
1937
+ return typeof value === "string" && VECTOR_BLEND_MODES.includes(value);
1938
+ }
1939
+ function vectorBlendModeCss(mode) {
1940
+ if (!mode || mode === "normal" || !isVectorBlendMode(mode)) return void 0;
1941
+ return mode === "linear-dodge" ? "plus-lighter" : mode;
1942
+ }
1943
+ function vectorBlendModeFromCss(value) {
1944
+ const v2 = (_nullishCoalesce(value, () => ( ""))).trim().toLowerCase();
1945
+ if (v2 === "plus-lighter") return "linear-dodge";
1946
+ return isVectorBlendMode(v2) ? v2 : null;
1947
+ }
1948
+ var draws = (paint) => {
1949
+ if (paint === void 0 || paint === null) return false;
1950
+ if (typeof paint === "string") {
1951
+ const p = paint.trim().toLowerCase();
1952
+ return p !== "" && p !== "none" && p !== "transparent";
1953
+ }
1954
+ return true;
1955
+ };
1956
+ function isPlainVectorPaintLayer(layer) {
1957
+ return (_nullishCoalesce(layer.opacity, () => ( 1))) >= 1 && (_nullishCoalesce(layer.blendMode, () => ( "normal"))) === "normal" && layer.visible !== false && (_nullishCoalesce(layer.kind, () => ( "paint"))) === "paint";
1958
+ }
1959
+ function isDrawnVectorPaintLayer(layer) {
1960
+ return layer.visible !== false && (_nullishCoalesce(layer.kind, () => ( "paint"))) === "paint" && draws(layer.paint) && (_nullishCoalesce(layer.opacity, () => ( 1))) > 0;
1961
+ }
1962
+ function vectorFills(style) {
1963
+ if (Array.isArray(style.fills)) return style.fills;
1964
+ return draws(style.fill) ? [{ paint: style.fill }] : [];
1965
+ }
1966
+ function vectorStrokeSettings(style) {
1967
+ const out = {};
1968
+ for (const key of VECTOR_STROKE_SETTING_KEYS) {
1969
+ const v2 = style[key];
1970
+ if (v2 !== void 0 && v2 !== null) out[key] = v2;
1971
+ }
1972
+ return out;
1973
+ }
1974
+ function vectorStrokes(style) {
1975
+ if (Array.isArray(style.strokes)) return style.strokes;
1976
+ return draws(style.stroke) ? [{ paint: style.stroke, ...vectorStrokeSettings(style) }] : [];
1977
+ }
1978
+ function hasVectorPaintStacks(style) {
1979
+ return Array.isArray(style.fills) || Array.isArray(style.strokes);
1980
+ }
1981
+ function withVectorFills(node, fills) {
1982
+ const next = { ...node };
1983
+ if (fills.length === 0 || fills.length === 1 && isPlainVectorPaintLayer(fills[0])) {
1984
+ delete next.fills;
1985
+ next.fill = _nullishCoalesce(_optionalChain([fills, 'access', _38 => _38[0], 'optionalAccess', _39 => _39.paint]), () => ( null));
1986
+ return next;
1987
+ }
1988
+ next.fills = fills.map((l) => ({ ...l }));
1989
+ next.fill = fills[fills.length - 1].paint;
1990
+ return next;
1991
+ }
1992
+ function withVectorStrokes(node, strokes) {
1993
+ const next = { ...node };
1994
+ if (strokes.length === 0) {
1995
+ delete next.strokes;
1996
+ next.stroke = null;
1997
+ return next;
1998
+ }
1999
+ const top = strokes[strokes.length - 1];
2000
+ for (const key of VECTOR_STROKE_SETTING_KEYS) delete next[key];
2001
+ Object.assign(next, vectorStrokeSettings(top));
2002
+ next.stroke = top.paint;
2003
+ if (strokes.length === 1 && isPlainVectorPaintLayer(top)) delete next.strokes;
2004
+ else next.strokes = strokes.map((l) => ({ ...l }));
2005
+ return next;
2006
+ }
2007
+ var json = (v2) => JSON.stringify(_nullishCoalesce(v2, () => ( null)));
2008
+ function strokeShorthandDiff(node, top) {
2009
+ const out = [];
2010
+ if (json(node.stroke) !== json(_optionalChain([top, 'optionalAccess', _40 => _40.paint]))) out.push("stroke");
2011
+ for (const key of VECTOR_STROKE_SETTING_KEYS) if (json(node[key]) !== json(_optionalChain([top, 'optionalAccess', _41 => _41[key]]))) out.push(key);
2012
+ return out;
2013
+ }
2014
+ var checked = /* @__PURE__ */ new WeakSet();
2015
+ function normalizeVectorPaintStacks(node, prefer = "shorthand") {
2016
+ if (!hasVectorPaintStacks(node)) {
2017
+ if (!("fills" in node) && !("strokes" in node)) return node;
2018
+ const next2 = { ...node };
2019
+ delete next2.fills;
2020
+ delete next2.strokes;
2021
+ return next2;
2022
+ }
2023
+ if (checked.has(node)) return node;
2024
+ let next = node;
2025
+ if (Array.isArray(node.fills)) {
2026
+ let fills = node.fills;
2027
+ const top = fills[fills.length - 1];
2028
+ if (prefer === "shorthand" && json(node.fill) !== json(_optionalChain([top, 'optionalAccess', _42 => _42.paint]))) {
2029
+ if (!draws(node.fill)) fills = [];
2030
+ else fills = top ? [...fills.slice(0, -1), { ...top, paint: node.fill }] : [{ paint: node.fill }];
2031
+ }
2032
+ next = withVectorFills(next, fills);
2033
+ }
2034
+ if (Array.isArray(node.strokes)) {
2035
+ let strokes = node.strokes;
2036
+ const top = strokes[strokes.length - 1];
2037
+ const diff = prefer === "shorthand" ? strokeShorthandDiff(node, top) : [];
2038
+ if (diff.length) {
2039
+ if (diff.includes("stroke") && !draws(node.stroke)) strokes = [];
2040
+ else {
2041
+ const layer = top ? { ...top } : { paint: _nullishCoalesce(node.stroke, () => ( null)) };
2042
+ for (const key of diff) {
2043
+ if (key === "stroke") layer.paint = _nullishCoalesce(node.stroke, () => ( null));
2044
+ else if (node[key] === void 0 || node[key] === null) delete layer[key];
2045
+ else layer[key] = node[key];
2046
+ }
2047
+ strokes = top ? [...strokes.slice(0, -1), layer] : [layer];
2048
+ }
2049
+ }
2050
+ next = withVectorStrokes(next, strokes);
2051
+ }
2052
+ const keys = ["fill", "fills", "stroke", "strokes", ...VECTOR_STROKE_SETTING_KEYS];
2053
+ const same2 = keys.every((k) => k in next === k in node && json(next[k]) === json(node[k]));
2054
+ const out = same2 ? node : next;
2055
+ checked.add(out);
2056
+ return out;
2057
+ }
2058
+ function sanitizePaint(value) {
2059
+ if (value === null || value === void 0) return null;
2060
+ if (typeof value === "string") return value;
2061
+ return sanitizeVectorGradient(value);
2062
+ }
2063
+ function sanitizeLayerBase(raw) {
2064
+ const out = { paint: sanitizePaint(raw.paint) };
2065
+ if (typeof raw.opacity === "number" && Number.isFinite(raw.opacity) && raw.opacity < 1) out.opacity = Math.max(0, raw.opacity);
2066
+ if (isVectorBlendMode(raw.blendMode) && raw.blendMode !== "normal") out.blendMode = raw.blendMode;
2067
+ if (raw.visible === false) out.visible = false;
2068
+ return out;
2069
+ }
2070
+ function sanitizeVectorFills(value) {
2071
+ if (!Array.isArray(value)) return [];
2072
+ return value.filter((l) => !!l && typeof l === "object").map(sanitizeLayerBase);
2073
+ }
2074
+ var ARROW_ALIGNS = ["extend", "tip"];
2075
+ function sanitizeVectorStrokeSettings(raw) {
2076
+ const out = {};
2077
+ const num2 = (v2) => typeof v2 === "number" && Number.isFinite(v2) ? v2 : void 0;
2078
+ const width = num2(raw.strokeWidth);
2079
+ if (width !== void 0 && width >= 0) out.strokeWidth = width;
2080
+ if (raw.strokeLinecap === "butt" || raw.strokeLinecap === "round" || raw.strokeLinecap === "square") out.strokeLinecap = raw.strokeLinecap;
2081
+ if (raw.strokeLinejoin === "miter" || raw.strokeLinejoin === "round" || raw.strokeLinejoin === "bevel") out.strokeLinejoin = raw.strokeLinejoin;
2082
+ if (Array.isArray(raw.strokeDasharray)) {
2083
+ const dash = raw.strokeDasharray.filter((n) => typeof n === "number" && Number.isFinite(n) && n >= 0);
2084
+ if (dash.length && dash.some((n) => n > 0)) out.strokeDasharray = dash;
2085
+ }
2086
+ if (raw.strokeAlign === "center" || raw.strokeAlign === "inside" || raw.strokeAlign === "outside") out.strokeAlign = raw.strokeAlign;
2087
+ for (const key of ["startArrow", "endArrow"]) if (VECTOR_ARROWHEADS.includes(raw[key])) out[key] = raw[key];
2088
+ if (ARROW_ALIGNS.includes(raw.arrowAlign)) out.arrowAlign = raw.arrowAlign;
2089
+ for (const key of ["startArrowScale", "endArrowScale"]) {
2090
+ const n = num2(raw[key]);
2091
+ if (n !== void 0 && n > 0) out[key] = n;
2092
+ }
2093
+ if (Array.isArray(raw.strokeWidthProfile)) {
2094
+ const p = sanitizeWidthProfile(raw.strokeWidthProfile);
2095
+ if (p.length) out.strokeWidthProfile = p;
2096
+ }
2097
+ return out;
2098
+ }
2099
+ function sanitizeVectorStrokes(value) {
2100
+ if (!Array.isArray(value)) return [];
2101
+ return value.filter((l) => !!l && typeof l === "object").map((raw) => {
2102
+ if (raw.kind !== void 0 && raw.kind !== "paint") return { ...raw };
2103
+ return { ...sanitizeLayerBase(raw), ...sanitizeVectorStrokeSettings(raw) };
2104
+ });
2105
+ }
2106
+ var layerNodeCache = /* @__PURE__ */ new WeakMap();
2107
+ function vectorPaintLayerNodes(node) {
2108
+ const hit = layerNodeCache.get(node);
2109
+ if (hit) return hit;
2110
+ const { fills: _f, strokes: _s, ...base } = node;
2111
+ const plain2 = { ...base };
2112
+ for (const key of VECTOR_STROKE_SETTING_KEYS) delete plain2[key];
2113
+ const out = [];
2114
+ vectorFills(node).forEach((layer, index) => {
2115
+ out.push({ kind: "fill", index, layer, node: { ...plain2, fill: layer.paint, stroke: null }, drawn: isDrawnVectorPaintLayer(layer) });
2116
+ });
2117
+ vectorStrokes(node).forEach((layer, index) => {
2118
+ const settings = (_nullishCoalesce(layer.kind, () => ( "paint"))) === "paint" ? vectorStrokeSettings(layer) : {};
2119
+ out.push({ kind: "stroke", index, layer, node: { ...plain2, fill: null, ...settings, stroke: layer.paint }, drawn: isDrawnVectorPaintLayer(layer) });
2120
+ });
2121
+ layerNodeCache.set(node, out);
2122
+ return out;
2123
+ }
2124
+ function needsVectorPaintLayers(node) {
2125
+ if (!hasVectorPaintStacks(node)) return false;
2126
+ const fills = vectorFills(node);
2127
+ const strokes = vectorStrokes(node);
2128
+ return fills.length > 1 || strokes.length > 1 || fills.some((l) => !isPlainVectorPaintLayer(l)) || strokes.some((l) => !isPlainVectorPaintLayer(l));
2129
+ }
2130
+ function vectorStrokeStackReach(node) {
2131
+ let reach = 0;
2132
+ for (const l of vectorPaintLayerNodes(node)) if (l.kind === "stroke" && l.drawn) reach = Math.max(reach, vectorStrokeReach(l.node));
2133
+ return reach;
2134
+ }
2135
+ function hitTestVectorPaintLayer(node, path, p, tolerance = 0) {
2136
+ if (!path.length) return null;
2137
+ const layers = vectorPaintLayerNodes(node);
2138
+ for (let i = layers.length - 1; i >= 0; i--) {
2139
+ const l = layers[i];
2140
+ if (!l.drawn) continue;
2141
+ if (l.kind === "stroke") {
2142
+ if ((_nullishCoalesce(l.node.strokeWidth, () => ( 1))) > 0 && hitTestVectorStroke(path, p, l.node, tolerance)) return { kind: "stroke", index: l.index };
2143
+ } else if (_chunkXGD3FSNCcjs.pointInBezierPath.call(void 0, path, [p.x, p.y], _nullishCoalesce(node.fillRule, () => ( "nonzero")))) return { kind: "fill", index: l.index };
2144
+ }
2145
+ return null;
2146
+ }
2147
+ function hitTestVectorPaintStack(node, path, p, tolerance = 0) {
2148
+ if (hitTestVectorPaintLayer(node, path, p, tolerance)) return true;
2149
+ if (vectorPaintLayerNodes(node).some((l) => l.kind === "stroke" && l.drawn)) return false;
2150
+ return _chunkXGD3FSNCcjs.distanceToBezierPath.call(void 0, path, [p.x, p.y]) <= tolerance;
2151
+ }
2152
+ function vectorStacksHaveGradient(style) {
2153
+ return [..._nullishCoalesce(style.fills, () => ( [])), ..._nullishCoalesce(style.strokes, () => ( []))].some((l) => isVectorGradient(l.paint));
2154
+ }
2155
+ function newVectorStrokeLayer(node, patch = {}) {
2156
+ const top = vectorStrokes(node).at(-1);
2157
+ const settings = top && (_nullishCoalesce(top.kind, () => ( "paint"))) === "paint" ? vectorStrokeSettings(top) : { strokeWidth: _nullishCoalesce(node.strokeWidth, () => ( 1)) };
2158
+ return { paint: "#000000", ...settings, ...patch };
2159
+ }
2160
+ function vectorTargetPaint(style, target, layer = null) {
2161
+ if (layer === null) return style[target];
2162
+ const stack = target === "fill" ? vectorFills(style) : vectorStrokes(style);
2163
+ return stack[layer] ? stack[layer].paint : style[target];
2164
+ }
2165
+ function withVectorTargetPaint(node, target, layer, paint) {
2166
+ const stack = target === "fill" ? vectorFills(node) : vectorStrokes(node);
2167
+ if (layer === null || !stack[layer]) {
2168
+ if (!stack.length) return { ...node, [target]: paint };
2169
+ layer = stack.length - 1;
2170
+ }
2171
+ const next = stack.map((l, i) => i === layer ? { ...l, paint } : l);
2172
+ return target === "fill" ? withVectorFills(node, next) : withVectorStrokes(node, next);
2173
+ }
2174
+
1883
2175
  // src/vector/pathMap.ts
1884
2176
  var MAX_PIECES = 1 << 20;
1885
2177
  var MAX_DEPTH = 6;
@@ -2312,7 +2604,7 @@ function normalizeVectorEffectParams(type, params, base) {
2312
2604
  if (!defaults) return null;
2313
2605
  const out = { ...defaults, ..._nullishCoalesce(base, () => ( {})) };
2314
2606
  for (const spec of VECTOR_EFFECT_PARAM_SPECS[type]) {
2315
- const v2 = _optionalChain([params, 'optionalAccess', _38 => _38[spec.key]]);
2607
+ const v2 = _optionalChain([params, 'optionalAccess', _43 => _43[spec.key]]);
2316
2608
  if (v2 === void 0) continue;
2317
2609
  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));
2318
2610
  else if (spec.kind === "boolean" && typeof v2 === "boolean") out[spec.key] = v2;
@@ -2323,7 +2615,7 @@ function normalizeVectorEffectParams(type, params, base) {
2323
2615
  const o = out;
2324
2616
  o.rows = Math.round(o.rows);
2325
2617
  o.columns = Math.round(o.columns);
2326
- const given = _optionalChain([params, 'optionalAccess', _39 => _39.mesh]);
2618
+ const given = _optionalChain([params, 'optionalAccess', _44 => _44.mesh]);
2327
2619
  let mesh = given !== void 0 ? _chunkDWGZUSEScjs.isValidWarpMesh.call(void 0, given) ? cloneMesh(given) : null : o.mesh;
2328
2620
  if (o.style !== "mesh") mesh = null;
2329
2621
  if (mesh && given !== void 0) {
@@ -2340,10 +2632,10 @@ function createVectorEffect(type, id, params) {
2340
2632
  }
2341
2633
  var isEnabled = (e) => e.enabled !== false && !!VECTOR_EFFECT_DEFAULTS[e.type];
2342
2634
  function activeVectorEffects(node) {
2343
- return _nullishCoalesce(_optionalChain([node, 'access', _40 => _40.effects, 'optionalAccess', _41 => _41.filter, 'call', _42 => _42(isEnabled)]), () => ( []));
2635
+ return _nullishCoalesce(_optionalChain([node, 'access', _45 => _45.effects, 'optionalAccess', _46 => _46.filter, 'call', _47 => _47(isEnabled)]), () => ( []));
2344
2636
  }
2345
2637
  function hasOwnVectorAppearance(node) {
2346
- return node.type === "group" && !!node.liveBoolean || !!_optionalChain([node, 'access', _43 => _43.effects, 'optionalAccess', _44 => _44.some, 'call', _45 => _45(isEnabled)]);
2638
+ return node.type === "group" && !!node.liveBoolean || !!_optionalChain([node, 'access', _48 => _48.effects, 'optionalAccess', _49 => _49.some, 'call', _50 => _50(isEnabled)]);
2347
2639
  }
2348
2640
  var liveCache = /* @__PURE__ */ new WeakMap();
2349
2641
  function hasVectorAppearance(node) {
@@ -2355,7 +2647,7 @@ function hasVectorAppearance(node) {
2355
2647
  return v2;
2356
2648
  }
2357
2649
  function isVectorLiveBoolean(node) {
2358
- return _optionalChain([node, 'optionalAccess', _46 => _46.type]) === "group" && !!node.liveBoolean;
2650
+ return _optionalChain([node, 'optionalAccess', _51 => _51.type]) === "group" && !!node.liveBoolean;
2359
2651
  }
2360
2652
  function vectorOperandOperation(group, child) {
2361
2653
  return _nullishCoalesce(_nullishCoalesce(child.booleanOperation, () => ( group.liveBoolean)), () => ( "union"));
@@ -2472,7 +2764,7 @@ var compareOrder = (a, b) => {
2472
2764
  for (let i = 0; i < n; i++) if (a[i] !== b[i]) return a[i] - b[i];
2473
2765
  return a.length - b.length;
2474
2766
  };
2475
- var add3 = (a, b) => ({ x: a.x + (_nullishCoalesce(_optionalChain([b, 'optionalAccess', _47 => _47.x]), () => ( 0))), y: a.y + (_nullishCoalesce(_optionalChain([b, 'optionalAccess', _48 => _48.y]), () => ( 0))) });
2767
+ var add3 = (a, b) => ({ x: a.x + (_nullishCoalesce(_optionalChain([b, 'optionalAccess', _52 => _52.x]), () => ( 0))), y: a.y + (_nullishCoalesce(_optionalChain([b, 'optionalAccess', _53 => _53.y]), () => ( 0))) });
2476
2768
  var mapPaths = (shapes, fn) => {
2477
2769
  const out = fn(shapes.map((s) => s.path));
2478
2770
  return shapes.map((s, i) => ({ ...s, path: _nullishCoalesce(out[i], () => ( [])) }));
@@ -2579,10 +2871,10 @@ function vectorEffectInputBounds(node, effectId) {
2579
2871
  return paths ? pathsBounds(paths) : null;
2580
2872
  }
2581
2873
  function vectorNodeEnvelope(node) {
2582
- return _nullishCoalesce(_optionalChain([node, 'optionalAccess', _49 => _49.effects, 'optionalAccess', _50 => _50.find, 'call', _51 => _51((e) => e.type === "envelope" && e.enabled !== false)]), () => ( null));
2874
+ return _nullishCoalesce(_optionalChain([node, 'optionalAccess', _54 => _54.effects, 'optionalAccess', _55 => _55.find, 'call', _56 => _56((e) => e.type === "envelope" && e.enabled !== false)]), () => ( null));
2583
2875
  }
2584
2876
  function vectorEnvelopeFrame(node, effectId) {
2585
- const e = effectId ? _optionalChain([node, 'access', _52 => _52.effects, 'optionalAccess', _53 => _53.find, 'call', _54 => _54((x) => x.id === effectId)]) : vectorNodeEnvelope(node);
2877
+ const e = effectId ? _optionalChain([node, 'access', _57 => _57.effects, 'optionalAccess', _58 => _58.find, 'call', _59 => _59((x) => x.id === effectId)]) : vectorNodeEnvelope(node);
2586
2878
  if (!e || e.type !== "envelope") return null;
2587
2879
  const bounds = vectorEffectInputBounds(node, e.id);
2588
2880
  if (!bounds || !(bounds.width > 0 && bounds.height > 0)) return null;
@@ -2616,6 +2908,9 @@ function shapeNode(shape, id) {
2616
2908
  locked: _l,
2617
2909
  visible: _v,
2618
2910
  opacity: _o,
2911
+ // The node's own blend mode and filters stay on the node, not on each shape it draws.
2912
+ blendMode: _bm,
2913
+ filters: _fl,
2619
2914
  ...style
2620
2915
  } = shape.source;
2621
2916
  return { ...style, id, type: "path", subpaths: bezierToSubpaths(shape.path), ...shape.opacity < 1 ? { opacity: shape.opacity } : {} };
@@ -2627,7 +2922,9 @@ function placement(node) {
2627
2922
  ...node.visible === false ? { visible: false } : {},
2628
2923
  ...node.locked ? { locked: true } : {},
2629
2924
  ...node.blendStep ? { blendStep: true } : {},
2630
- ...node.booleanOperation ? { booleanOperation: node.booleanOperation } : {}
2925
+ ...node.booleanOperation ? { booleanOperation: node.booleanOperation } : {},
2926
+ ...node.blendMode ? { blendMode: node.blendMode } : {},
2927
+ ..._optionalChain([node, 'access', _60 => _60.filters, 'optionalAccess', _61 => _61.length]) ? { filters: node.filters } : {}
2631
2928
  };
2632
2929
  }
2633
2930
  function vectorAppearanceNodes(node) {
@@ -2935,17 +3232,14 @@ function boundsFromPoints(a, b) {
2935
3232
  }
2936
3233
  function hitTestVectorNode(node, p, tolerance = 0, parent = _chunkDWGZUSEScjs.IDENTITY_MATRIX, options = {}) {
2937
3234
  if (node.visible === false) return false;
2938
- if (!(node.type === "group" && (!hasOwnVectorAppearance(node) || _optionalChain([options, 'access', _55 => _55.entered, 'optionalAccess', _56 => _56.has, 'call', _57 => _57(node.id)])))) node = expandVectorAppearance(node);
3235
+ if (!(node.type === "group" && (!hasOwnVectorAppearance(node) || _optionalChain([options, 'access', _62 => _62.entered, 'optionalAccess', _63 => _63.has, 'call', _64 => _64(node.id)])))) node = expandVectorAppearance(node);
2939
3236
  if (node.type === "group") {
2940
3237
  const m = _chunkDWGZUSEScjs.multiplyMatrices.call(void 0, nodeMatrix(node), parent);
2941
3238
  return node.children.some((c) => hitTestVectorNode(c, p, tolerance, m, options));
2942
3239
  }
2943
3240
  const path = vectorPathWorldBezier(node, parent);
2944
3241
  if (path.length === 0) return false;
2945
- const point = [p.x, p.y];
2946
- if (hasPaint(node.fill) && _chunkXGD3FSNCcjs.pointInBezierPath.call(void 0, path, point, _nullishCoalesce(node.fillRule, () => ( "nonzero")))) return true;
2947
- if (hasPaint(node.stroke)) return hitTestVectorStroke(path, p, node, tolerance);
2948
- return _chunkXGD3FSNCcjs.distanceToBezierPath.call(void 0, path, point) <= tolerance;
3242
+ return hitTestVectorPaintStack(node, path, p, tolerance);
2949
3243
  }
2950
3244
  function vectorStrokeOutline(node, parent = _chunkDWGZUSEScjs.IDENTITY_MATRIX) {
2951
3245
  if (!hasPaint(node.stroke) || !((_nullishCoalesce(node.strokeWidth, () => ( 1))) > 0)) return [];
@@ -2985,23 +3279,31 @@ function mapAnchor(a, m) {
2985
3279
  }
2986
3280
  function bakeIntoGeometry(node, m) {
2987
3281
  if (_chunkDWGZUSEScjs.isIdentityMatrix.call(void 0, m)) return node;
2988
- if (_optionalChain([node, 'access', _58 => _58.effects, 'optionalAccess', _59 => _59.length])) node = { ...node, effects: transformVectorEffects(node.effects, m, node) };
3282
+ if (_optionalChain([node, 'access', _65 => _65.effects, 'optionalAccess', _66 => _66.length])) node = { ...node, effects: transformVectorEffects(node.effects, m, node) };
2989
3283
  if (node.type === "group") {
2990
3284
  const group = node;
2991
3285
  const children = group.children.map((c) => transformVectorNode(c, m));
2992
- const spine = _optionalChain([group, 'access', _60 => _60.blend, 'optionalAccess', _61 => _61.spine]);
3286
+ const spine = _optionalChain([group, 'access', _67 => _67.blend, 'optionalAccess', _68 => _68.spine]);
2993
3287
  if (!spine) return { ...group, children };
2994
3288
  const moved = { closed: spine.closed, anchors: spine.anchors.map((a) => mapAnchor(a, m)) };
2995
3289
  return { ...group, children, blend: { ...group.blend, spine: moved } };
2996
3290
  }
2997
3291
  const path = node;
2998
- const mirrored = m[0] * m[3] - m[1] * m[2] < 0 && _optionalChain([path, 'access', _62 => _62.strokeWidthProfile, 'optionalAccess', _63 => _63.length]);
3292
+ const flips = m[0] * m[3] - m[1] * m[2] < 0;
3293
+ const mirrored = flips && _optionalChain([path, 'access', _69 => _69.strokeWidthProfile, 'optionalAccess', _70 => _70.length]);
3294
+ const layer = (l) => ({
3295
+ ...l,
3296
+ ...isVectorGradient(l.paint) ? { paint: transformVectorPaint(l.paint, m) } : {},
3297
+ ...flips && _optionalChain([l, 'access', _71 => _71.strokeWidthProfile, 'optionalAccess', _72 => _72.length]) ? { strokeWidthProfile: mirrorWidthProfile(l.strokeWidthProfile) } : {}
3298
+ });
2999
3299
  return {
3000
3300
  ...path,
3001
3301
  ...mirrored ? { strokeWidthProfile: mirrorWidthProfile(path.strokeWidthProfile) } : {},
3002
3302
  // Gradients in the node's own space move with its geometry.
3003
3303
  ...isVectorGradient(path.fill) ? { fill: transformVectorPaint(path.fill, m) } : {},
3004
3304
  ...isVectorGradient(path.stroke) ? { stroke: transformVectorPaint(path.stroke, m) } : {},
3305
+ ...Array.isArray(path.fills) ? { fills: path.fills.map(layer) } : {},
3306
+ ...Array.isArray(path.strokes) ? { strokes: path.strokes.map(layer) } : {},
3005
3307
  subpaths: path.subpaths.map((sp) => ({
3006
3308
  closed: sp.closed,
3007
3309
  anchors: sp.anchors.map((a) => mapAnchor(a, m))
@@ -3256,8 +3558,8 @@ var Measured = class {
3256
3558
  append(sa, sb, out) {
3257
3559
  for (const piece of _chunkXGD3FSNCcjs.trimSegments.call(void 0, this.segs, sa, sb, this.lens)) {
3258
3560
  if (degenerate(piece)) continue;
3259
- const last = _optionalChain([out, 'access', _64 => _64[out.length - 1], 'optionalAccess', _65 => _65.segs]);
3260
- const end = _optionalChain([last, 'optionalAccess', _66 => _66[last.length - 1], 'optionalAccess', _67 => _67.at, 'call', _68 => _68(-1)]);
3561
+ const last = _optionalChain([out, 'access', _73 => _73[out.length - 1], 'optionalAccess', _74 => _74.segs]);
3562
+ const end = _optionalChain([last, 'optionalAccess', _75 => _75[last.length - 1], 'optionalAccess', _76 => _76.at, 'call', _77 => _77(-1)]);
3261
3563
  if (!end || Math.hypot(end[0] - piece[0][0], end[1] - piece[0][1]) > 1e-6) out.push({ segs: [piece], closed: false });
3262
3564
  else last.push(piece);
3263
3565
  }
@@ -3551,9 +3853,9 @@ function vectorRepeaterCopies(r, pivot) {
3551
3853
  for (let i = 0; i < n; i++) {
3552
3854
  const k = i + offset;
3553
3855
  let m = _chunkDWGZUSEScjs.translateMatrix.call(void 0, -pivot.x, -pivot.y);
3554
- m = _chunkDWGZUSEScjs.multiplyMatrices.call(void 0, m, _chunkDWGZUSEScjs.scaleMatrix.call(void 0, Math.pow((_nullishCoalesce(_optionalChain([r, 'access', _69 => _69.scale, 'optionalAccess', _70 => _70.x]), () => ( 100))) / 100, k), Math.pow((_nullishCoalesce(_optionalChain([r, 'access', _71 => _71.scale, 'optionalAccess', _72 => _72.y]), () => ( 100))) / 100, k)));
3856
+ m = _chunkDWGZUSEScjs.multiplyMatrices.call(void 0, m, _chunkDWGZUSEScjs.scaleMatrix.call(void 0, Math.pow((_nullishCoalesce(_optionalChain([r, 'access', _78 => _78.scale, 'optionalAccess', _79 => _79.x]), () => ( 100))) / 100, k), Math.pow((_nullishCoalesce(_optionalChain([r, 'access', _80 => _80.scale, 'optionalAccess', _81 => _81.y]), () => ( 100))) / 100, k)));
3555
3857
  m = _chunkDWGZUSEScjs.multiplyMatrices.call(void 0, m, _chunkDWGZUSEScjs.rotateMatrix.call(void 0, (_nullishCoalesce(r.rotation, () => ( 0))) * k));
3556
- m = _chunkDWGZUSEScjs.multiplyMatrices.call(void 0, m, _chunkDWGZUSEScjs.translateMatrix.call(void 0, pivot.x + (_nullishCoalesce(_optionalChain([r, 'access', _73 => _73.position, 'optionalAccess', _74 => _74.x]), () => ( 0))) * k, pivot.y + (_nullishCoalesce(_optionalChain([r, 'access', _75 => _75.position, 'optionalAccess', _76 => _76.y]), () => ( 0))) * k));
3858
+ m = _chunkDWGZUSEScjs.multiplyMatrices.call(void 0, m, _chunkDWGZUSEScjs.translateMatrix.call(void 0, pivot.x + (_nullishCoalesce(_optionalChain([r, 'access', _82 => _82.position, 'optionalAccess', _83 => _83.x]), () => ( 0))) * k, pivot.y + (_nullishCoalesce(_optionalChain([r, 'access', _84 => _84.position, 'optionalAccess', _85 => _85.y]), () => ( 0))) * k));
3557
3859
  const t = n > 1 ? i / (n - 1) : 0;
3558
3860
  const partial = i + 1 === n && fract > 0 ? fract : 1;
3559
3861
  out.push({ index: i, matrix: m, opacity: Math.min(1, Math.max(0, (so + (eo - so) * t) * partial)) });
@@ -4086,7 +4388,7 @@ function interpolateVectorPaint(a, b, t) {
4086
4388
  return t < 0.5 ? a : b;
4087
4389
  }
4088
4390
  function interpolateWidthProfiles(a, b, t) {
4089
- if (!_optionalChain([a, 'optionalAccess', _77 => _77.length]) && !_optionalChain([b, 'optionalAccess', _78 => _78.length])) return null;
4391
+ if (!_optionalChain([a, 'optionalAccess', _86 => _86.length]) && !_optionalChain([b, 'optionalAccess', _87 => _87.length])) return null;
4090
4392
  const at2 = [..._nullishCoalesce(a, () => ( [])), ..._nullishCoalesce(b, () => ( [])), { t: 0 }, { t: 1 }].map((p) => p.t).sort((x, y) => x - y);
4091
4393
  const ts = at2.filter((v2, i) => i === 0 || v2 - at2[i - 1] > 1e-6);
4092
4394
  return ts.map((pos) => {
@@ -4096,7 +4398,7 @@ function interpolateWidthProfiles(a, b, t) {
4096
4398
  });
4097
4399
  }
4098
4400
  function lerpDashes(a, b, t) {
4099
- const dashed = (d) => !!_optionalChain([d, 'optionalAccess', _79 => _79.length]) && d.some((v2) => v2 > 0);
4401
+ const dashed = (d) => !!_optionalChain([d, 'optionalAccess', _88 => _88.length]) && d.some((v2) => v2 > 0);
4100
4402
  if (!dashed(a) && !dashed(b)) return t < 0.5 ? a : b;
4101
4403
  const even = (p) => p.length % 2 ? [...p, ...p] : p;
4102
4404
  const solid = (p) => {
@@ -4123,7 +4425,7 @@ function interpolateVectorStyle(a, b, t) {
4123
4425
  for (const key of ["startArrowScale", "endArrowScale"])
4124
4426
  if (a[key] !== void 0 || b[key] !== void 0) out[key] = lerpN(_nullishCoalesce(a[key], () => ( 1)), _nullishCoalesce(b[key], () => ( 1)), t);
4125
4427
  const dash = lerpDashes(a.strokeDasharray, b.strokeDasharray, t);
4126
- if (_optionalChain([dash, 'optionalAccess', _80 => _80.length])) out.strokeDasharray = dash;
4428
+ if (_optionalChain([dash, 'optionalAccess', _89 => _89.length])) out.strokeDasharray = dash;
4127
4429
  const profile = interpolateWidthProfiles(a.strokeWidthProfile, b.strokeWidthProfile, t);
4128
4430
  if (profile) out.strokeWidthProfile = profile;
4129
4431
  return out;
@@ -4134,7 +4436,7 @@ function reversedStyle(s) {
4134
4436
  out.endArrow = s.startArrow;
4135
4437
  out.startArrowScale = s.endArrowScale;
4136
4438
  out.endArrowScale = s.startArrowScale;
4137
- if (_optionalChain([s, 'access', _81 => _81.strokeWidthProfile, 'optionalAccess', _82 => _82.length])) out.strokeWidthProfile = reverseWidthProfile(s.strokeWidthProfile);
4439
+ if (_optionalChain([s, 'access', _90 => _90.strokeWidthProfile, 'optionalAccess', _91 => _91.length])) out.strokeWidthProfile = reverseWidthProfile(s.strokeWidthProfile);
4138
4440
  for (const k of ["startArrow", "endArrow", "startArrowScale", "endArrowScale"]) if (out[k] === void 0) delete out[k];
4139
4441
  return out;
4140
4442
  }
@@ -4267,6 +4569,201 @@ function evaluateVectorPathKeyframes(keyframes, time, options = {}) {
4267
4569
  return morph.at(u);
4268
4570
  }
4269
4571
 
4572
+ // src/vector/filters.ts
4573
+ var VECTOR_FILTER_DEFAULTS = {
4574
+ dropShadow: { color: "#000000", opacity: 0.25, offsetX: 0, offsetY: 4, blur: 4, spread: 0 },
4575
+ innerShadow: { color: "#000000", opacity: 0.25, offsetX: 0, offsetY: 4, blur: 4, spread: 0 },
4576
+ outerGlow: { color: "#ffffbe", opacity: 0.75, blur: 10, spread: 0 },
4577
+ innerGlow: { color: "#ffffbe", opacity: 0.75, blur: 10, spread: 0 },
4578
+ layerBlur: { radius: 4 },
4579
+ feather: { radius: 8 }
4580
+ };
4581
+ var VECTOR_FILTER_LABELS = {
4582
+ dropShadow: "Drop Shadow",
4583
+ innerShadow: "Inner Shadow",
4584
+ outerGlow: "Outer Glow",
4585
+ innerGlow: "Inner Glow",
4586
+ layerBlur: "Layer Blur",
4587
+ feather: "Feather"
4588
+ };
4589
+ var SHADOW_SPECS = [
4590
+ { key: "color", label: "Color", kind: "color" },
4591
+ { key: "opacity", label: "Opacity", kind: "number", min: 0, max: 1, step: 0.01, slider: true },
4592
+ { key: "offsetX", label: "X", kind: "number", min: -1e3, max: 1e3, step: 1 },
4593
+ { key: "offsetY", label: "Y", kind: "number", min: -1e3, max: 1e3, step: 1 },
4594
+ { key: "blur", label: "Blur", kind: "number", min: 0, max: 500, step: 1 },
4595
+ { key: "spread", label: "Spread", kind: "number", min: 0, max: 500, step: 1 }
4596
+ ];
4597
+ var GLOW_SPECS = SHADOW_SPECS.filter((s) => s.key !== "offsetX" && s.key !== "offsetY");
4598
+ var VECTOR_FILTER_PARAM_SPECS = {
4599
+ dropShadow: SHADOW_SPECS,
4600
+ innerShadow: SHADOW_SPECS.map((s) => s.key === "spread" ? { ...s, label: "Choke" } : s),
4601
+ outerGlow: GLOW_SPECS,
4602
+ innerGlow: GLOW_SPECS.map((s) => s.key === "spread" ? { ...s, label: "Choke" } : s),
4603
+ layerBlur: [{ key: "radius", label: "Radius", kind: "number", min: 0, max: 500, step: 1, slider: true }],
4604
+ feather: [{ key: "radius", label: "Radius", kind: "number", min: 0, max: 500, step: 1, slider: true }]
4605
+ };
4606
+ function isVectorFilterType(value) {
4607
+ return typeof value === "string" && VECTOR_FILTER_TYPES.includes(value);
4608
+ }
4609
+ function normalizeVectorFilterParams(type, params, base) {
4610
+ if (!isVectorFilterType(type)) return null;
4611
+ const out = { ...VECTOR_FILTER_DEFAULTS[type], ..._nullishCoalesce(base, () => ( {})) };
4612
+ for (const spec of VECTOR_FILTER_PARAM_SPECS[type]) {
4613
+ const v2 = _optionalChain([params, 'optionalAccess', _92 => _92[spec.key]]);
4614
+ if (v2 === void 0) continue;
4615
+ 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));
4616
+ else if (spec.kind === "color" && typeof v2 === "string" && v2.trim()) out[spec.key] = v2.trim();
4617
+ }
4618
+ return out;
4619
+ }
4620
+ function vectorFilterParamKeys(type) {
4621
+ return VECTOR_FILTER_PARAM_SPECS[type].map((s) => s.key);
4622
+ }
4623
+ function createVectorFilter(type, id, params) {
4624
+ const p = normalizeVectorFilterParams(type, params);
4625
+ return p ? { id, type, params: p } : null;
4626
+ }
4627
+ function sanitizeVectorFilters(value) {
4628
+ if (!Array.isArray(value)) return [];
4629
+ const out = [];
4630
+ const used = /* @__PURE__ */ new Set();
4631
+ for (const raw of value) {
4632
+ if (!raw || typeof raw !== "object") continue;
4633
+ const r = raw;
4634
+ if (!isVectorFilterType(r.type)) continue;
4635
+ let id = typeof r.id === "string" && r.id && !used.has(r.id) ? r.id : "";
4636
+ for (let k = out.length + 1; !id; k++) if (!used.has(`filter${k}`)) id = `filter${k}`;
4637
+ used.add(id);
4638
+ const filter = createVectorFilter(r.type, id, _nullishCoalesce(r.params, () => ( {})));
4639
+ out.push(r.enabled === false ? { ...filter, enabled: false } : filter);
4640
+ }
4641
+ return out;
4642
+ }
4643
+ function activeVectorFilters(node) {
4644
+ return (_nullishCoalesce(node.filters, () => ( []))).filter((f) => {
4645
+ if (f.enabled === false || !isVectorFilterType(f.type)) return false;
4646
+ if (f.type === "layerBlur" || f.type === "feather") return f.params.radius > 0;
4647
+ return f.params.opacity > 0;
4648
+ });
4649
+ }
4650
+ function vectorFilterReach(filters) {
4651
+ let outer = 0;
4652
+ let blur = 0;
4653
+ for (const f of filters) {
4654
+ switch (f.type) {
4655
+ case "dropShadow":
4656
+ case "innerShadow":
4657
+ outer = Math.max(outer, Math.max(Math.abs(f.params.offsetX), Math.abs(f.params.offsetY)) + f.params.blur * 1.5 + f.params.spread);
4658
+ break;
4659
+ case "outerGlow":
4660
+ case "innerGlow":
4661
+ outer = Math.max(outer, f.params.blur * 1.5 + f.params.spread);
4662
+ break;
4663
+ case "layerBlur":
4664
+ blur += f.params.radius * 1.5;
4665
+ break;
4666
+ }
4667
+ }
4668
+ return outer + blur;
4669
+ }
4670
+ var round = (n) => Math.round(n * 1e3) / 1e3;
4671
+ var fe = (tag, attrs, children) => ({ tag, attrs, ...children ? { children } : {} });
4672
+ function vectorFilterSvg(filters, id, bounds) {
4673
+ const active = filters.filter((f) => activeVectorFilters({ filters: [f] }).length);
4674
+ if (!active.length || !bounds) return null;
4675
+ const primitives = [];
4676
+ let body = "SourceGraphic";
4677
+ let n = 0;
4678
+ const name = (part) => `${part}${n}`;
4679
+ for (const f of active) {
4680
+ if (f.type !== "innerShadow" && f.type !== "innerGlow") continue;
4681
+ n++;
4682
+ const p = f.params;
4683
+ primitives.push(fe("feComponentTransfer", { in: "SourceAlpha", result: name("inv") }, [fe("feFuncA", { type: "table", tableValues: "1 0" })]));
4684
+ let last = name("inv");
4685
+ if (f.type === "innerShadow" && (f.params.offsetX || f.params.offsetY)) {
4686
+ primitives.push(fe("feOffset", { in: last, dx: round(f.params.offsetX), dy: round(f.params.offsetY), result: name("off") }));
4687
+ last = name("off");
4688
+ }
4689
+ if (p.spread > 0) {
4690
+ primitives.push(fe("feMorphology", { in: last, operator: "dilate", radius: round(p.spread), result: name("grow") }));
4691
+ last = name("grow");
4692
+ }
4693
+ if (p.blur > 0) {
4694
+ primitives.push(fe("feGaussianBlur", { in: last, stdDeviation: round(p.blur / 2), result: name("blur") }));
4695
+ last = name("blur");
4696
+ }
4697
+ primitives.push(fe("feFlood", { "flood-color": p.color, "flood-opacity": round(p.opacity), result: name("color") }));
4698
+ primitives.push(fe("feComposite", { in: name("color"), in2: last, operator: "in", result: name("tint") }));
4699
+ primitives.push(fe("feComposite", { in: name("tint"), in2: "SourceAlpha", operator: "in", result: name("inner") }));
4700
+ primitives.push(fe("feComposite", { in: name("inner"), in2: body, operator: "over", result: name("body") }));
4701
+ body = name("body");
4702
+ }
4703
+ for (const f of active) {
4704
+ if (f.type !== "feather") continue;
4705
+ n++;
4706
+ const r = f.params.radius;
4707
+ primitives.push(fe("feMorphology", { in: "SourceAlpha", operator: "erode", radius: round(r / 2), result: name("core") }));
4708
+ primitives.push(fe("feGaussianBlur", { in: name("core"), stdDeviation: round(r / 4), result: name("fade") }));
4709
+ primitives.push(fe("feComposite", { in: body, in2: name("fade"), operator: "in", result: name("body") }));
4710
+ body = name("body");
4711
+ }
4712
+ const under = [];
4713
+ for (const f of active) {
4714
+ if (f.type !== "dropShadow" && f.type !== "outerGlow") continue;
4715
+ n++;
4716
+ const p = f.params;
4717
+ let last = "SourceAlpha";
4718
+ if (p.spread > 0) {
4719
+ primitives.push(fe("feMorphology", { in: last, operator: "dilate", radius: round(p.spread), result: name("grow") }));
4720
+ last = name("grow");
4721
+ }
4722
+ if (p.blur > 0) {
4723
+ primitives.push(fe("feGaussianBlur", { in: last, stdDeviation: round(p.blur / 2), result: name("blur") }));
4724
+ last = name("blur");
4725
+ }
4726
+ if (f.type === "dropShadow" && (f.params.offsetX || f.params.offsetY)) {
4727
+ primitives.push(fe("feOffset", { in: last, dx: round(f.params.offsetX), dy: round(f.params.offsetY), result: name("off") }));
4728
+ last = name("off");
4729
+ }
4730
+ primitives.push(fe("feFlood", { "flood-color": p.color, "flood-opacity": round(p.opacity), result: name("color") }));
4731
+ primitives.push(fe("feComposite", { in: name("color"), in2: last, operator: "in", result: name("shadow") }));
4732
+ under.push(name("shadow"));
4733
+ }
4734
+ if (under.length) {
4735
+ n++;
4736
+ primitives.push(fe("feMerge", { result: name("merged") }, [...under, body].map((i) => fe("feMergeNode", { in: i }))));
4737
+ body = name("merged");
4738
+ }
4739
+ for (const f of active) {
4740
+ if (f.type !== "layerBlur") continue;
4741
+ n++;
4742
+ primitives.push(fe("feGaussianBlur", { in: body, stdDeviation: round(f.params.radius / 2), result: name("body") }));
4743
+ body = name("body");
4744
+ }
4745
+ const lastResult = _optionalChain([primitives, 'access', _93 => _93[primitives.length - 1], 'optionalAccess', _94 => _94.attrs, 'access', _95 => _95.result]);
4746
+ if (lastResult !== body) primitives.push(fe("feMerge", {}, [fe("feMergeNode", { in: body })]));
4747
+ const pad = vectorFilterReach(active) + 2;
4748
+ return {
4749
+ id,
4750
+ x: round(bounds.x - pad),
4751
+ y: round(bounds.y - pad),
4752
+ width: round(bounds.width + 2 * pad),
4753
+ height: round(bounds.height + 2 * pad),
4754
+ primitives
4755
+ };
4756
+ }
4757
+ var escapeAttr = (value) => value.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
4758
+ function primitiveMarkup(p) {
4759
+ const attrs = Object.entries(p.attrs).map(([k, v2]) => ` ${k}="${escapeAttr(String(v2))}"`).join("");
4760
+ return _optionalChain([p, 'access', _96 => _96.children, 'optionalAccess', _97 => _97.length]) ? `<${p.tag}${attrs}>${p.children.map(primitiveMarkup).join("")}</${p.tag}>` : `<${p.tag}${attrs}/>`;
4761
+ }
4762
+ function vectorFilterMarkup(filter, extra = "") {
4763
+ 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>`;
4764
+ }
4765
+ var VECTOR_FILTER_MENU = VECTOR_FILTER_TYPES.map((type) => ({ type, label: VECTOR_FILTER_LABELS[type] }));
4766
+
4270
4767
  // src/vector/gradientStroke.ts
4271
4768
  var SHARP = 1.25;
4272
4769
  var TOLERANCE = 0.2;
@@ -4442,7 +4939,7 @@ function applyVectorCornersAttribute(subpaths, value) {
4442
4939
  for (const item of value.trim().split(/\s+/)) {
4443
4940
  const m = /^(\d+)\.(\d+):([\d.eE+-]+)(?::([a-z]+))?$/.exec(item);
4444
4941
  if (!m) continue;
4445
- const a = _optionalChain([subpaths, 'access', _83 => _83[+m[1]], 'optionalAccess', _84 => _84.anchors, 'access', _85 => _85[+m[2]]]);
4942
+ const a = _optionalChain([subpaths, 'access', _98 => _98[+m[1]], 'optionalAccess', _99 => _99.anchors, 'access', _100 => _100[+m[2]]]);
4446
4943
  const radius = parseFloat(m[3]);
4447
4944
  if (!a || !(radius > 0)) continue;
4448
4945
  const kind = VECTOR_CORNER_KINDS.includes(m[4]) ? m[4] : void 0;
@@ -4450,7 +4947,7 @@ function applyVectorCornersAttribute(subpaths, value) {
4450
4947
  }
4451
4948
  return subpaths;
4452
4949
  }
4453
- var escapeAttr = (value) => value.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
4950
+ var escapeAttr2 = (value) => value.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
4454
4951
  function vectorPathLocalBounds(node) {
4455
4952
  const b = _chunkXGD3FSNCcjs.bezierPathBounds.call(void 0, subpathsToBezier(node.subpaths));
4456
4953
  return b ? { x: b.minX, y: b.minY, width: b.maxX - b.minX, height: b.maxY - b.minY } : null;
@@ -4464,7 +4961,7 @@ function vectorPaintToSvg(paint, gradientId, options = {}) {
4464
4961
  const precision = _nullishCoalesce(options.precision, () => ( 3));
4465
4962
  const key = `${gradientId}|${role}|${precision}`;
4466
4963
  const owner = _nullishCoalesce(options.node, () => ( paint));
4467
- const cached = _optionalChain([paintCache, 'access', _86 => _86.get, 'call', _87 => _87(owner), 'optionalAccess', _88 => _88.get, 'call', _89 => _89(key)]);
4964
+ const cached = _optionalChain([paintCache, 'access', _101 => _101.get, 'call', _102 => _102(owner), 'optionalAccess', _103 => _103.get, 'call', _104 => _104(key)]);
4468
4965
  if (cached && (!options.node || (role === "fill" ? options.node.fill : options.node.stroke) === paint)) return { value: `url(#${gradientId})`, defs: cached };
4469
4966
  const node = options.node;
4470
4967
  const bounds = node ? vectorPathLocalBounds(node) : null;
@@ -4506,6 +5003,26 @@ function computeStrokeSvgParts(node, clipId, precision) {
4506
5003
  heads: parts.heads.map((h) => _chunkXGD3FSNCcjs.bezierPathToSvg.call(void 0, h.path, { precision }))
4507
5004
  };
4508
5005
  }
5006
+ function vectorNodeLocalPaintBounds(node) {
5007
+ const drawn = expandVectorAppearance(node);
5008
+ const reach = (n) => n.type === "path" ? vectorStrokeStackReach(n) : Math.max(0, ...n.children.map(reach));
5009
+ let b;
5010
+ if (drawn.type === "path") b = vectorPathLocalBounds(drawn);
5011
+ else b = unionBounds(drawn.children.filter((c) => c.visible !== false).map((c) => vectorNodeBounds(c, _chunkDWGZUSEScjs.IDENTITY_MATRIX)));
5012
+ if (!b) return null;
5013
+ const pad = reach(drawn);
5014
+ return { x: b.x - pad, y: b.y - pad, width: b.width + 2 * pad, height: b.height + 2 * pad };
5015
+ }
5016
+ var filterCache = /* @__PURE__ */ new WeakMap();
5017
+ function vectorNodeFilterSvg(node, id) {
5018
+ if (!_optionalChain([node, 'access', _105 => _105.filters, 'optionalAccess', _106 => _106.length])) return null;
5019
+ const hit = filterCache.get(node);
5020
+ if (hit && hit.id === id) return hit.filter;
5021
+ const active = activeVectorFilters(node);
5022
+ const filter = active.length ? vectorFilterSvg(active, id, vectorNodeLocalPaintBounds(node)) : null;
5023
+ filterCache.set(node, { id, filter });
5024
+ return filter;
5025
+ }
4509
5026
  function widthProfileToAttribute(points, precision = 4) {
4510
5027
  return points.map((p) => [p.t, p.left, p.right].map((n) => _chunkXGD3FSNCcjs.formatNumber.call(void 0, n, precision)).join(",")).join(";");
4511
5028
  }
@@ -4521,16 +5038,16 @@ function widthProfileFromAttribute(value) {
4521
5038
  var round2 = (n) => Math.round(n * 100) / 100;
4522
5039
  function gradientMarkup(def, extra = "") {
4523
5040
  const tag = def.type === "radial" ? "radialGradient" : "linearGradient";
4524
- const attrs = Object.entries(def.attrs).map(([k, v2]) => ` ${k}="${escapeAttr(String(v2))}"`).join("");
4525
- const stops = def.stops.map((s) => `<stop offset="${s.offset}" stop-color="${escapeAttr(s.stopColor)}"${s.stopOpacity !== void 0 ? ` stop-opacity="${s.stopOpacity}"` : ""}/>`).join("");
4526
- return `<${tag} id="${escapeAttr(def.id)}"${attrs}${extra}>${stops}</${tag}>`;
5041
+ const attrs = Object.entries(def.attrs).map(([k, v2]) => ` ${k}="${escapeAttr2(String(v2))}"`).join("");
5042
+ const stops = def.stops.map((s) => `<stop offset="${s.offset}" stop-color="${escapeAttr2(s.stopColor)}"${s.stopOpacity !== void 0 ? ` stop-opacity="${s.stopOpacity}"` : ""}/>`).join("");
5043
+ return `<${tag} id="${escapeAttr2(def.id)}"${attrs}${extra}>${stops}</${tag}>`;
4527
5044
  }
4528
5045
  function paintDefMarkup(def, gradient) {
4529
- const extra = gradient ? ` data-vector-gradient="${escapeAttr(JSON.stringify(gradient))}"` : "";
5046
+ const extra = gradient ? ` data-vector-gradient="${escapeAttr2(JSON.stringify(gradient))}"` : "";
4530
5047
  if (def.type !== "pattern") return gradientMarkup(def, extra);
4531
- const attrs = Object.entries(def.attrs).map(([k, v2]) => ` ${k}="${escapeAttr(String(v2))}"`).join("");
4532
- const inner = def.gradients.map((g) => gradientMarkup(g)).join("") + def.tiles.map((t) => `<path d="${t.d}" fill="${escapeAttr(t.fill)}"/>`).join("");
4533
- return `<pattern id="${escapeAttr(def.id)}"${attrs}${extra}>${inner}</pattern>`;
5048
+ const attrs = Object.entries(def.attrs).map(([k, v2]) => ` ${k}="${escapeAttr2(String(v2))}"`).join("");
5049
+ const inner = def.gradients.map((g) => gradientMarkup(g)).join("") + def.tiles.map((t) => `<path d="${t.d}" fill="${escapeAttr2(t.fill)}"/>`).join("");
5050
+ return `<pattern id="${escapeAttr2(def.id)}"${attrs}${extra}>${inner}</pattern>`;
4534
5051
  }
4535
5052
  var paintMarkup = (paint, defs) => defs.map((d, i) => paintDefMarkup(d, i === 0 && isVectorGradient(paint) ? paint : void 0));
4536
5053
  function blendFromAttribute(value, m) {
@@ -4569,25 +5086,113 @@ function vectorDocumentToSvg(doc, options = {}) {
4569
5086
  const num2 = (n) => _chunkXGD3FSNCcjs.formatNumber.call(void 0, n, precision);
4570
5087
  const indent = (depth) => pretty ? " ".repeat(depth) : "";
4571
5088
  const common = (node) => {
4572
- let out2 = ` id="${escapeAttr(node.id)}"`;
5089
+ let out2 = ` id="${escapeAttr2(node.id)}"`;
4573
5090
  if (node.transform) out2 += ` transform="matrix(${node.transform.map((n) => _chunkXGD3FSNCcjs.formatNumber.call(void 0, n, 6)).join(" ")})"`;
4574
5091
  if (node.opacity !== void 0 && node.opacity < 1) out2 += ` opacity="${num2(node.opacity)}"`;
4575
5092
  if (node.visible === false) out2 += ` display="none"`;
4576
5093
  if (node.blendStep) out2 += ` data-vector-blend-step=""`;
4577
- if (node.type === "group" && node.blend) out2 += ` data-vector-blend="${escapeAttr(JSON.stringify(node.blend))}"`;
5094
+ if (node.type === "group" && node.blend) out2 += ` data-vector-blend="${escapeAttr2(JSON.stringify(node.blend))}"`;
4578
5095
  if (node.booleanOperation) out2 += ` data-vector-boolean-operation="${node.booleanOperation}"`;
5096
+ const blend = vectorBlendModeCss(node.blendMode);
5097
+ if (blend) out2 += ` style="mix-blend-mode:${blend}"`;
5098
+ if (_optionalChain([node, 'access', _107 => _107.filters, 'optionalAccess', _108 => _108.length])) {
5099
+ const filter = vectorNodeFilterSvg(node, `${prefix}filter-${node.id}`);
5100
+ const data = ` data-vector-filters="${escapeAttr2(JSON.stringify(node.filters))}"`;
5101
+ if (filter) {
5102
+ defs.push(vectorFilterMarkup(filter, data));
5103
+ out2 += ` filter="url(#${escapeAttr2(filter.id)})"`;
5104
+ } else out2 += data;
5105
+ }
5106
+ return out2;
5107
+ };
5108
+ const layerAttrs = (layer) => {
5109
+ let out2 = "";
5110
+ if (layer.opacity !== void 0 && layer.opacity < 1) out2 += ` opacity="${num2(layer.opacity)}"`;
5111
+ const blend = vectorBlendModeCss(layer.blendMode);
5112
+ if (blend) out2 += ` style="mix-blend-mode:${blend}"`;
4579
5113
  return out2;
4580
5114
  };
5115
+ const strokePartLines = (node, parts, strokeValue, d, lineAttrs, depth) => {
5116
+ const out2 = [];
5117
+ if (options.strokes === "outline") {
5118
+ const area = _chunkXGD3FSNCcjs.bezierPathToSvg.call(void 0, vectorStrokeOutlinePath(subpathsToBezier(node.subpaths), node), { precision });
5119
+ out2.push(`${indent(depth)}<path data-vector-part="stroke-outline" d="${area}" fill="${escapeAttr2(strokeValue)}"/>`);
5120
+ return out2;
5121
+ }
5122
+ let clip = "";
5123
+ if (parts.clip) {
5124
+ const rule = node.fillRule === "evenodd" ? "evenodd" : "nonzero";
5125
+ const id = escapeAttr2(parts.clip.id);
5126
+ if (parts.clip.kind === "clip") {
5127
+ defs.push(`<clipPath id="${id}"><path d="${d}" clip-rule="${rule}"/></clipPath>`);
5128
+ clip = ` clip-path="url(#${id})"`;
5129
+ } else {
5130
+ const b = parts.clip.bounds;
5131
+ const box = `x="${num2(b.x)}" y="${num2(b.y)}" width="${num2(b.width)}" height="${num2(b.height)}"`;
5132
+ defs.push(`<mask id="${id}" maskUnits="userSpaceOnUse" ${box}><rect ${box} fill="#fff"/><path d="${d}" fill="#000" fill-rule="${rule}"/></mask>`);
5133
+ clip = ` mask="url(#${id})"`;
5134
+ }
5135
+ }
5136
+ if (parts.outline !== void 0) out2.push(`${indent(depth)}<path data-vector-part="stroke-outline" d="${parts.outline}" fill="${escapeAttr2(strokeValue)}"${clip}/>`);
5137
+ else out2.push(`${indent(depth)}<path data-vector-part="stroke" d="${parts.d}" fill="none"${lineAttrs(parts.width)}${clip}/>`);
5138
+ for (const h2 of parts.heads) out2.push(`${indent(depth)}<path data-vector-part="head" d="${h2}" fill="${escapeAttr2(strokeValue)}"/>`);
5139
+ return out2;
5140
+ };
5141
+ const lineAttrsOf = (node, strokeValue) => (width) => {
5142
+ let out2 = ` stroke="${escapeAttr2(strokeValue)}" stroke-width="${num2(width)}"`;
5143
+ if (node.strokeLinecap && node.strokeLinecap !== "butt") out2 += ` stroke-linecap="${node.strokeLinecap}"`;
5144
+ if (node.strokeLinejoin && node.strokeLinejoin !== "miter") out2 += ` stroke-linejoin="${node.strokeLinejoin}"`;
5145
+ if (_optionalChain([node, 'access', _109 => _109.strokeDasharray, 'optionalAccess', _110 => _110.length])) out2 += ` stroke-dasharray="${node.strokeDasharray.map(num2).join(" ")}"`;
5146
+ return out2;
5147
+ };
5148
+ const liveCorners = (node) => {
5149
+ const corners = vectorCornersAttribute(node.subpaths, precision);
5150
+ return corners ? ` data-vector-d="${_chunkXGD3FSNCcjs.bezierPathToSvg.call(void 0, subpathsToBezier(node.subpaths, { corners: false }), { precision })}" data-vector-corners="${corners}"` : "";
5151
+ };
5152
+ const emitStacked = (node, depth) => {
5153
+ const d = vectorPathData(node, precision);
5154
+ const rule = node.fillRule === "evenodd" ? ` fill-rule="evenodd"` : "";
5155
+ let data = ` data-vector-path="" data-vector-fills="${escapeAttr2(JSON.stringify(vectorFills(node)))}" data-vector-strokes="${escapeAttr2(JSON.stringify(vectorStrokes(node)))}"`;
5156
+ if (node.fillRule === "evenodd") data += ` data-vector-fill-rule="evenodd"`;
5157
+ lines.push(`${indent(depth)}<g${common(node)}${data}>`);
5158
+ const layers = vectorPaintLayerNodes(node).filter((l) => l.drawn);
5159
+ let geometry = liveCorners(node);
5160
+ if (!layers.some((l) => l.kind === "fill")) {
5161
+ lines.push(`${indent(depth + 1)}<path data-vector-part="fill" d="${d}" fill="none"${rule}${geometry}/>`);
5162
+ geometry = "";
5163
+ }
5164
+ for (const l of layers) {
5165
+ const id = `${prefix}${l.kind}-${node.id}-${l.index}`;
5166
+ const paint = vectorPaintToSvg(l.layer.paint, id, { node: l.node, precision, ...l.kind === "stroke" ? { role: "stroke" } : {} });
5167
+ defs.push(...paintMarkup(l.layer.paint, paint.defs));
5168
+ const attrs = ` data-vector-layer="${l.index}"${layerAttrs(l.layer)}`;
5169
+ if (l.kind === "fill") {
5170
+ lines.push(`${indent(depth + 1)}<path data-vector-part="fill"${attrs} d="${d}" fill="${escapeAttr2(paint.value)}"${rule}${geometry}/>`);
5171
+ geometry = "";
5172
+ continue;
5173
+ }
5174
+ const lineAttrs = lineAttrsOf(l.node, paint.value);
5175
+ const parts = vectorStrokeSvgParts(l.node, `${prefix}clip-${node.id}-${l.index}`, precision);
5176
+ if (!parts) {
5177
+ lines.push(`${indent(depth + 1)}<path data-vector-part="stroke"${attrs} d="${d}" fill="none"${lineAttrs(_nullishCoalesce(l.node.strokeWidth, () => ( 1)))}/>`);
5178
+ continue;
5179
+ }
5180
+ lines.push(`${indent(depth + 1)}<g data-vector-part="stroke-layer"${attrs}>`);
5181
+ lines.push(...strokePartLines(l.node, parts, paint.value, d, lineAttrs, depth + 2));
5182
+ lines.push(`${indent(depth + 1)}</g>`);
5183
+ }
5184
+ lines.push(`${indent(depth)}</g>`);
5185
+ };
4581
5186
  const emit2 = (node, depth) => {
4582
5187
  if (node.visible === false && !options.includeHidden) return;
4583
- const wrappers = _nullishCoalesce(_optionalChain([options, 'access', _90 => _90.wrap, 'optionalAccess', _91 => _91[node.id]]), () => ( []));
5188
+ const wrappers = _nullishCoalesce(_optionalChain([options, 'access', _111 => _111.wrap, 'optionalAccess', _112 => _112[node.id]]), () => ( []));
4584
5189
  wrappers.forEach((w2, i) => {
4585
- let attrs = w2.id !== void 0 ? ` id="${escapeAttr(w2.id)}"` : "";
4586
- if (w2.transform) attrs += ` transform="${escapeAttr(w2.transform)}"`;
5190
+ let attrs = w2.id !== void 0 ? ` id="${escapeAttr2(w2.id)}"` : "";
5191
+ if (w2.transform) attrs += ` transform="${escapeAttr2(w2.transform)}"`;
4587
5192
  if (w2.clip) {
4588
5193
  const shape = Object.entries(w2.clip.attrs).map(([k, v2]) => ` ${k}="${_chunkXGD3FSNCcjs.formatNumber.call(void 0, v2, 4)}"`).join("");
4589
- defs.push(`<clipPath id="${escapeAttr(w2.clip.id)}" clipPathUnits="objectBoundingBox"><${w2.clip.shape}${w2.clip.shapeId !== void 0 ? ` id="${escapeAttr(w2.clip.shapeId)}"` : ""}${shape}/></clipPath>`);
4590
- attrs += ` clip-path="url(#${escapeAttr(w2.clip.id)})"`;
5194
+ defs.push(`<clipPath id="${escapeAttr2(w2.clip.id)}" clipPathUnits="objectBoundingBox"><${w2.clip.shape}${w2.clip.shapeId !== void 0 ? ` id="${escapeAttr2(w2.clip.shapeId)}"` : ""}${shape}/></clipPath>`);
5195
+ attrs += ` clip-path="url(#${escapeAttr2(w2.clip.id)})"`;
4591
5196
  }
4592
5197
  lines.push(`${indent(depth + i)}<g${attrs}>`);
4593
5198
  });
@@ -4598,16 +5203,16 @@ function vectorDocumentToSvg(doc, options = {}) {
4598
5203
  if (hasOwnVectorAppearance(node)) {
4599
5204
  const live2 = {
4600
5205
  kind: node.type,
4601
- ..._optionalChain([node, 'access', _92 => _92.effects, 'optionalAccess', _93 => _93.length]) ? { effects: node.effects } : {},
5206
+ ..._optionalChain([node, 'access', _113 => _113.effects, 'optionalAccess', _114 => _114.length]) ? { effects: node.effects } : {},
4602
5207
  ...node.type === "group" && node.liveBoolean ? { liveBoolean: node.liveBoolean } : {}
4603
5208
  };
4604
- lines.push(`${indent(depth)}<g${common(node)} data-vector-live="${escapeAttr(JSON.stringify(live2))}">`);
5209
+ lines.push(`${indent(depth)}<g${common(node)} data-vector-live="${escapeAttr2(JSON.stringify(live2))}">`);
4605
5210
  lines.push(`${indent(depth + 1)}<g data-vector-part="appearance">`);
4606
5211
  for (const shape of vectorAppearanceNodes(node)) emit2(shape, depth + 2);
4607
5212
  lines.push(`${indent(depth + 1)}</g>`);
4608
5213
  lines.push(`${indent(depth + 1)}<g data-vector-part="source" display="none">`);
4609
5214
  if (node.type === "path") {
4610
- const { effects: _e, transform: _t, opacity: _o, visible: _v, booleanOperation: _b, blendStep: _s, ...source } = node;
5215
+ const { effects: _e, transform: _t, opacity: _o, visible: _v, booleanOperation: _b, blendStep: _s, blendMode: _bm, filters: _f, ...source } = node;
4611
5216
  emit2({ ...source, id: `${node.id}~src` }, depth + 2);
4612
5217
  } else for (const child of node.children) emit2(child, depth + 2);
4613
5218
  lines.push(`${indent(depth + 1)}</g>`);
@@ -4620,20 +5225,17 @@ function vectorDocumentToSvg(doc, options = {}) {
4620
5225
  lines.push(`${indent(depth)}</g>`);
4621
5226
  return;
4622
5227
  }
5228
+ if (needsVectorPaintLayers(node)) {
5229
+ emitStacked(node, depth);
5230
+ return;
5231
+ }
4623
5232
  const fill = vectorPaintToSvg(node.fill, `${prefix}fill-${node.id}`, { node, precision });
4624
5233
  const stroke = vectorPaintToSvg(node.stroke, `${prefix}stroke-${node.id}`, { node, role: "stroke", precision });
4625
5234
  defs.push(...paintMarkup(node.fill, fill.defs), ...paintMarkup(node.stroke, stroke.defs));
4626
5235
  const d = vectorPathData(node, precision);
4627
- const corners = vectorCornersAttribute(node.subpaths, precision);
4628
- const live = corners ? ` data-vector-d="${_chunkXGD3FSNCcjs.bezierPathToSvg.call(void 0, subpathsToBezier(node.subpaths, { corners: false }), { precision })}" data-vector-corners="${corners}"` : "";
4629
- const fillAttrs = ` fill="${escapeAttr(fill.value)}"${node.fillRule === "evenodd" ? ` fill-rule="evenodd"` : ""}`;
4630
- const lineAttrs = (width) => {
4631
- let out2 = ` stroke="${escapeAttr(stroke.value)}" stroke-width="${num2(width)}"`;
4632
- if (node.strokeLinecap && node.strokeLinecap !== "butt") out2 += ` stroke-linecap="${node.strokeLinecap}"`;
4633
- if (node.strokeLinejoin && node.strokeLinejoin !== "miter") out2 += ` stroke-linejoin="${node.strokeLinejoin}"`;
4634
- if (_optionalChain([node, 'access', _94 => _94.strokeDasharray, 'optionalAccess', _95 => _95.length])) out2 += ` stroke-dasharray="${node.strokeDasharray.map(num2).join(" ")}"`;
4635
- return out2;
4636
- };
5236
+ const live = liveCorners(node);
5237
+ const fillAttrs = ` fill="${escapeAttr2(fill.value)}"${node.fillRule === "evenodd" ? ` fill-rule="evenodd"` : ""}`;
5238
+ const lineAttrs = lineAttrsOf(node, stroke.value);
4637
5239
  const parts = stroke.value !== "none" ? vectorStrokeSvgParts(node, `${prefix}clip-${node.id}`, precision) : void 0;
4638
5240
  if (!parts) {
4639
5241
  lines.push(`${indent(depth)}<path${common(node)} d="${d}"${fillAttrs}${stroke.value !== "none" ? lineAttrs(_nullishCoalesce(node.strokeWidth, () => ( 1))) : ""}${live}/>`);
@@ -4651,32 +5253,11 @@ function vectorDocumentToSvg(doc, options = {}) {
4651
5253
  data += ` data-vector-width-profile="${widthProfileToAttribute(profile)}"`;
4652
5254
  if (node.strokeLinecap && node.strokeLinecap !== "butt") data += ` data-vector-stroke-linecap="${node.strokeLinecap}"`;
4653
5255
  if (node.strokeLinejoin && node.strokeLinejoin !== "miter") data += ` data-vector-stroke-linejoin="${node.strokeLinejoin}"`;
4654
- if (_optionalChain([node, 'access', _96 => _96.strokeDasharray, 'optionalAccess', _97 => _97.length])) data += ` data-vector-stroke-dasharray="${node.strokeDasharray.map(num2).join(" ")}"`;
5256
+ if (_optionalChain([node, 'access', _115 => _115.strokeDasharray, 'optionalAccess', _116 => _116.length])) data += ` data-vector-stroke-dasharray="${node.strokeDasharray.map(num2).join(" ")}"`;
4655
5257
  }
4656
5258
  lines.push(`${indent(depth)}<g${common(node)}${data}>`);
4657
5259
  lines.push(`${indent(depth + 1)}<path data-vector-part="fill" d="${d}"${fillAttrs}${live}/>`);
4658
- if (options.strokes === "outline") {
4659
- const area = _chunkXGD3FSNCcjs.bezierPathToSvg.call(void 0, vectorStrokeOutlinePath(subpathsToBezier(node.subpaths), node), { precision });
4660
- lines.push(`${indent(depth + 1)}<path data-vector-part="stroke-outline" d="${area}" fill="${escapeAttr(stroke.value)}"/>`);
4661
- } else {
4662
- let clip = "";
4663
- if (parts.clip) {
4664
- const rule = node.fillRule === "evenodd" ? "evenodd" : "nonzero";
4665
- const id = escapeAttr(parts.clip.id);
4666
- if (parts.clip.kind === "clip") {
4667
- defs.push(`<clipPath id="${id}"><path d="${d}" clip-rule="${rule}"/></clipPath>`);
4668
- clip = ` clip-path="url(#${id})"`;
4669
- } else {
4670
- const b = parts.clip.bounds;
4671
- const box = `x="${num2(b.x)}" y="${num2(b.y)}" width="${num2(b.width)}" height="${num2(b.height)}"`;
4672
- defs.push(`<mask id="${id}" maskUnits="userSpaceOnUse" ${box}><rect ${box} fill="#fff"/><path d="${d}" fill="#000" fill-rule="${rule}"/></mask>`);
4673
- clip = ` mask="url(#${id})"`;
4674
- }
4675
- }
4676
- if (parts.outline !== void 0) lines.push(`${indent(depth + 1)}<path data-vector-part="stroke-outline" d="${parts.outline}" fill="${escapeAttr(stroke.value)}"${clip}/>`);
4677
- else lines.push(`${indent(depth + 1)}<path data-vector-part="stroke" d="${parts.d}" fill="none"${lineAttrs(parts.width)}${clip}/>`);
4678
- for (const h2 of parts.heads) lines.push(`${indent(depth + 1)}<path data-vector-part="head" d="${h2}" fill="${escapeAttr(stroke.value)}"/>`);
4679
- }
5260
+ lines.push(...strokePartLines(node, parts, stroke.value, d, lineAttrs, depth + 1));
4680
5261
  lines.push(`${indent(depth)}</g>`);
4681
5262
  };
4682
5263
  for (const node of doc.nodes) emit2(node, 1);
@@ -4686,7 +5267,7 @@ function vectorDocumentToSvg(doc, options = {}) {
4686
5267
  const out = [`<svg xmlns="http://www.w3.org/2000/svg" width="${w}" height="${h}" viewBox="0 0 ${w} ${h}">`];
4687
5268
  if (defs.length) out.push(`${indent(1)}<defs>${defs.join("")}</defs>`);
4688
5269
  if (doc.background && options.background !== false && hasPaint(doc.background)) {
4689
- out.push(`${indent(1)}<rect width="${w}" height="${h}" fill="${escapeAttr(doc.background)}"/>`);
5270
+ out.push(`${indent(1)}<rect width="${w}" height="${h}" fill="${escapeAttr2(doc.background)}"/>`);
4690
5271
  }
4691
5272
  out.push(...lines, "</svg>");
4692
5273
  return out.join(nl);
@@ -4777,10 +5358,15 @@ var STYLE_KEYS2 = {
4777
5358
  "stroke-linecap": "strokeLinecap",
4778
5359
  "stroke-linejoin": "strokeLinejoin",
4779
5360
  "stroke-dasharray": "strokeDasharray",
4780
- "fill-rule": "fillRule"
5361
+ "fill-rule": "fillRule",
5362
+ "fill-opacity": "fillOpacity",
5363
+ "stroke-opacity": "strokeOpacity",
5364
+ "mix-blend-mode": "mixBlendMode",
5365
+ filter: "filter"
4781
5366
  };
4782
5367
  function readStyle(el, parent) {
4783
- const out = { ...parent };
5368
+ const { mixBlendMode: _m, filter: _f, ...inherited } = parent;
5369
+ const out = { ...inherited };
4784
5370
  for (const [attr, key] of Object.entries(STYLE_KEYS2)) if (el.attrs[attr] !== void 0) out[key] = el.attrs[attr].trim();
4785
5371
  for (const decl of (_nullishCoalesce(el.attrs.style, () => ( ""))).split(";")) {
4786
5372
  const i = decl.indexOf(":");
@@ -4816,11 +5402,50 @@ function collectGradients(el, raw) {
4816
5402
  if (PAINT_SERVERS.has(el.name) && el.attrs.id) raw.set(el.attrs.id, el);
4817
5403
  for (const c of el.children) collectGradients(c, raw);
4818
5404
  }
5405
+ function collectFilters(el, raw) {
5406
+ if (el.name === "filter" && el.attrs.id) raw.set(el.attrs.id, el);
5407
+ for (const c of el.children) collectFilters(c, raw);
5408
+ }
5409
+ function filtersFromElement(el) {
5410
+ const own = el.attrs["data-vector-filters"];
5411
+ if (own !== void 0) {
5412
+ try {
5413
+ return sanitizeVectorFilters(JSON.parse(own));
5414
+ } catch (e4) {
5415
+ return [];
5416
+ }
5417
+ }
5418
+ const prims = el.children.filter((c) => c.name.startsWith("fe"));
5419
+ const out = [];
5420
+ for (const p of prims) {
5421
+ const std = _nullishCoalesce(numberList(p.attrs.stdDeviation)[0], () => ( 0));
5422
+ if (p.name === "feDropShadow") {
5423
+ const style = Object.fromEntries(
5424
+ (_nullishCoalesce(p.attrs.style, () => ( ""))).split(";").map((d) => d.split(":").map((x) => x.trim())).filter((d) => d.length === 2)
5425
+ );
5426
+ const opacity = parseFloat(_nullishCoalesce(_nullishCoalesce(style["flood-opacity"], () => ( p.attrs["flood-opacity"])), () => ( "1")));
5427
+ out.push({
5428
+ type: "dropShadow",
5429
+ params: {
5430
+ color: _nullishCoalesce(_nullishCoalesce(style["flood-color"], () => ( p.attrs["flood-color"])), () => ( "#000000")),
5431
+ opacity: Number.isFinite(opacity) ? opacity : 1,
5432
+ offsetX: length(p.attrs.dx, 2),
5433
+ offsetY: length(p.attrs.dy, 2),
5434
+ blur: std * 2,
5435
+ spread: 0
5436
+ }
5437
+ });
5438
+ } else if (p.name === "feGaussianBlur" && prims.length === 1 && (p.attrs.in === void 0 || p.attrs.in === "SourceGraphic")) {
5439
+ out.push({ type: "layerBlur", params: { radius: std * 2 } });
5440
+ } else return [];
5441
+ }
5442
+ return sanitizeVectorFilters(out);
5443
+ }
4819
5444
  function gradientFromAttribute(value) {
4820
5445
  if (!value) return null;
4821
5446
  try {
4822
5447
  return sanitizeVectorGradient(JSON.parse(value));
4823
- } catch (e4) {
5448
+ } catch (e5) {
4824
5449
  return null;
4825
5450
  }
4826
5451
  }
@@ -4834,9 +5459,9 @@ function resolveGradient(id, raw) {
4834
5459
  for (let el = first; el && !chain.includes(el) && chain.length < 32; ) {
4835
5460
  chain.push(el);
4836
5461
  const href = _nullishCoalesce(el.attrs.href, () => ( el.attrs["xlink:href"]));
4837
- el = _optionalChain([href, 'optionalAccess', _98 => _98.startsWith, 'call', _99 => _99("#")]) ? raw.get(href.slice(1)) : void 0;
5462
+ el = _optionalChain([href, 'optionalAccess', _117 => _117.startsWith, 'call', _118 => _118("#")]) ? raw.get(href.slice(1)) : void 0;
4838
5463
  }
4839
- const attr = (name) => _optionalChain([chain, 'access', _100 => _100.find, 'call', _101 => _101((el) => el.attrs[name] !== void 0), 'optionalAccess', _102 => _102.attrs, 'access', _103 => _103[name]]);
5464
+ const attr = (name) => _optionalChain([chain, 'access', _119 => _119.find, 'call', _120 => _120((el) => el.attrs[name] !== void 0), 'optionalAccess', _121 => _121.attrs, 'access', _122 => _122[name]]);
4840
5465
  const stops = _nullishCoalesce(chain.map(readStops).find((s) => s.length), () => ( []));
4841
5466
  if (!stops.length) return null;
4842
5467
  const user = attr("gradientUnits") === "userSpaceOnUse";
@@ -4913,6 +5538,13 @@ function parseVectorSvg(svg, options = {}) {
4913
5538
  };
4914
5539
  const rawGradients = /* @__PURE__ */ new Map();
4915
5540
  collectGradients(root, rawGradients);
5541
+ const rawFilters = /* @__PURE__ */ new Map();
5542
+ collectFilters(root, rawFilters);
5543
+ const filtersOf = (value) => {
5544
+ const url = /^url\(\s*['"]?#([^'")\s]+)['"]?\s*\)/.exec((_nullishCoalesce(value, () => ( ""))).trim());
5545
+ const el = url ? rawFilters.get(url[1]) : void 0;
5546
+ return el ? filtersFromElement(el) : [];
5547
+ };
4916
5548
  const paint = (value) => {
4917
5549
  const v2 = value.trim();
4918
5550
  const url = /^url\(\s*['"]?#([^'")\s]+)['"]?\s*\)/.exec(v2);
@@ -4979,14 +5611,61 @@ function parseVectorSvg(svg, options = {}) {
4979
5611
  if (m === _chunkDWGZUSEScjs.IDENTITY_MATRIX) return node;
4980
5612
  const next = transformVectorNode(node, m);
4981
5613
  const strokeScale = Math.sqrt(Math.abs(m[0] * m[3] - m[1] * m[2]));
4982
- if (hasPaint(next.stroke) && strokeScale > 0 && Math.abs(strokeScale - 1) > 1e-9) next.strokeWidth = (_nullishCoalesce(next.strokeWidth, () => ( 1))) * strokeScale;
4983
- return next;
5614
+ if (strokeScale > 0 && Math.abs(strokeScale - 1) > 1e-9) {
5615
+ if (hasPaint(next.stroke)) next.strokeWidth = (_nullishCoalesce(next.strokeWidth, () => ( 1))) * strokeScale;
5616
+ if (Array.isArray(next.strokes)) next.strokes = next.strokes.map((l) => (_nullishCoalesce(l.kind, () => ( "paint"))) === "paint" ? { ...l, strokeWidth: (_nullishCoalesce(l.strokeWidth, () => ( 1))) * strokeScale } : l);
5617
+ }
5618
+ return normalizeVectorPaintStacks(next, "stack");
5619
+ };
5620
+ const withOpacities = (node, s) => {
5621
+ let out = node;
5622
+ const fo = s.fillOpacity !== void 0 ? fraction(s.fillOpacity, 1) : 1;
5623
+ const so = s.strokeOpacity !== void 0 ? fraction(s.strokeOpacity, 1) : 1;
5624
+ if (fo < 1 && hasPaint(out.fill)) out = withVectorFills(out, [{ paint: out.fill, opacity: Math.max(0, fo) }]);
5625
+ if (so < 1 && hasPaint(out.stroke)) out = withVectorStrokes(out, vectorStrokes(out).map((l) => ({ ...l, opacity: Math.max(0, so) })));
5626
+ return out;
5627
+ };
5628
+ const stackedPath = (g, _style, m, meta) => {
5629
+ const fillEl = g.children.find((c) => c.name === "path" && c.attrs["data-vector-part"] === "fill");
5630
+ const subpaths = fillEl ? shapeOf(fillEl) : null;
5631
+ if (!_optionalChain([subpaths, 'optionalAccess', _123 => _123.length])) return null;
5632
+ const parse = (v2) => {
5633
+ try {
5634
+ return v2 ? JSON.parse(v2) : [];
5635
+ } catch (e6) {
5636
+ return [];
5637
+ }
5638
+ };
5639
+ let node = { id: idFor(g), type: "path", ...meta, subpaths, fill: null, stroke: null };
5640
+ if (g.attrs["data-vector-fill-rule"] === "evenodd") node.fillRule = "evenodd";
5641
+ node = withVectorFills(node, sanitizeVectorFills(parse(g.attrs["data-vector-fills"])));
5642
+ node = withVectorStrokes(node, sanitizeVectorStrokes(parse(g.attrs["data-vector-strokes"])));
5643
+ return placed(node, m);
5644
+ };
5645
+ const mergeStacked = (nodes2) => {
5646
+ const out = [];
5647
+ 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))]);
5648
+ for (const n of nodes2) {
5649
+ const prev = out[out.length - 1];
5650
+ if (_optionalChain([prev, 'optionalAccess', _124 => _124.type]) === "path" && n.type === "path" && key(prev) === key(n)) {
5651
+ const fills = vectorFills(n);
5652
+ const strokesBefore = vectorStrokes(prev);
5653
+ if (!(fills.length && strokesBefore.length)) {
5654
+ let merged = withVectorFills(prev, [...vectorFills(prev), ...fills]);
5655
+ merged = withVectorStrokes(merged, [...strokesBefore, ...vectorStrokes(n)]);
5656
+ out[out.length - 1] = merged;
5657
+ continue;
5658
+ }
5659
+ }
5660
+ out.push(n);
5661
+ }
5662
+ return out;
4984
5663
  };
4985
5664
  const mergedPath = (g, style, m, meta) => {
4986
5665
  const part = (name) => g.children.find((c) => c.name === "path" && c.attrs["data-vector-part"] === name);
4987
5666
  const fillEl = part("fill");
4988
5667
  const subpaths = fillEl ? shapeOf(fillEl) : null;
4989
- if (!fillEl || !_optionalChain([subpaths, 'optionalAccess', _104 => _104.length])) return null;
5668
+ if (!fillEl || !_optionalChain([subpaths, 'optionalAccess', _125 => _125.length])) return null;
4990
5669
  const a = g.attrs;
4991
5670
  const fs = readStyle(fillEl, style);
4992
5671
  const strokeEl = part("stroke");
@@ -5023,7 +5702,7 @@ function parseVectorSvg(svg, options = {}) {
5023
5702
  ...profile.length ? { strokeWidthProfile: profile } : {},
5024
5703
  ...keptCap ? { strokeLinecap: keptCap } : {},
5025
5704
  ...keptJoin ? { strokeLinejoin: keptJoin } : {},
5026
- ..._optionalChain([keptDash, 'optionalAccess', _105 => _105.length]) ? { strokeDasharray: keptDash } : {}
5705
+ ..._optionalChain([keptDash, 'optionalAccess', _126 => _126.length]) ? { strokeDasharray: keptDash } : {}
5027
5706
  };
5028
5707
  return placed(node, m);
5029
5708
  };
@@ -5031,7 +5710,7 @@ function parseVectorSvg(svg, options = {}) {
5031
5710
  let raw = {};
5032
5711
  try {
5033
5712
  raw = _nullishCoalesce(JSON.parse(g.attrs["data-vector-live"]), () => ( {}));
5034
- } catch (e5) {
5713
+ } catch (e7) {
5035
5714
  raw = {};
5036
5715
  }
5037
5716
  const sourceEl = g.children.find((c) => c.name === "g" && c.attrs["data-vector-part"] === "source");
@@ -5063,10 +5742,14 @@ function parseVectorSvg(svg, options = {}) {
5063
5742
  const s = readStyle(child, style);
5064
5743
  const opacity = child.attrs.opacity !== void 0 ? parseFloat(child.attrs.opacity) : void 0;
5065
5744
  const hidden = child.attrs.display === "none" || child.attrs.visibility === "hidden";
5745
+ const blendMode = vectorBlendModeFromCss(s.mixBlendMode);
5746
+ const filters = filtersOf(s.filter);
5066
5747
  const meta = {
5067
5748
  ...child.attrs["inkscape:label"] || child.attrs["data-name"] ? { name: _nullishCoalesce(child.attrs["inkscape:label"], () => ( child.attrs["data-name"])) } : {},
5068
5749
  ...opacity !== void 0 && Number.isFinite(opacity) && opacity < 1 ? { opacity } : {},
5069
- ...hidden ? { visible: false } : {}
5750
+ ...hidden ? { visible: false } : {},
5751
+ ...blendMode && blendMode !== "normal" ? { blendMode } : {},
5752
+ ...filters.length ? { filters } : {}
5070
5753
  };
5071
5754
  if (child.attrs["data-vector-blend-step"] !== void 0) continue;
5072
5755
  const operation = child.attrs["data-vector-boolean-operation"];
@@ -5076,6 +5759,11 @@ function parseVectorSvg(svg, options = {}) {
5076
5759
  if (node2) out.push(node2);
5077
5760
  continue;
5078
5761
  }
5762
+ if (child.name === "g" && child.attrs["data-vector-path"] !== void 0 && child.attrs["data-vector-fills"] !== void 0) {
5763
+ const node2 = stackedPath(child, s, m, meta);
5764
+ if (node2) out.push(node2);
5765
+ continue;
5766
+ }
5079
5767
  if (child.name === "g" && child.attrs["data-vector-path"] !== void 0) {
5080
5768
  const node2 = mergedPath(child, s, m, meta);
5081
5769
  if (node2) out.push(node2);
@@ -5093,20 +5781,23 @@ function parseVectorSvg(svg, options = {}) {
5093
5781
  const subpaths = shapeOf(child);
5094
5782
  if (!subpaths || !subpaths.length) continue;
5095
5783
  const node = placed(
5096
- {
5097
- id: idFor(child),
5098
- type: "path",
5099
- ...meta,
5100
- subpaths,
5101
- fill: child.name === "line" ? null : paint(s.fill),
5102
- stroke: paint(s.stroke),
5103
- ...strokeStyle(s)
5104
- },
5784
+ withOpacities(
5785
+ {
5786
+ id: idFor(child),
5787
+ type: "path",
5788
+ ...meta,
5789
+ subpaths,
5790
+ fill: child.name === "line" ? null : paint(s.fill),
5791
+ stroke: paint(s.stroke),
5792
+ ...strokeStyle(s)
5793
+ },
5794
+ s
5795
+ ),
5105
5796
  m
5106
5797
  );
5107
5798
  out.push(node);
5108
5799
  }
5109
- return out;
5800
+ return options.mergeStackedShapes ? mergeStacked(out) : out;
5110
5801
  };
5111
5802
  const nodes = visit(root, readStyle(root, { fill: "#000", stroke: "none", strokeWidth: "" }), rootMatrix);
5112
5803
  return { width, height, nodes };
@@ -5342,5 +6033,48 @@ function parseVectorSvg(svg, options = {}) {
5342
6033
 
5343
6034
 
5344
6035
 
5345
- 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_SPACINGS = VECTOR_BLEND_SPACINGS; 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.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.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.effectPathLength = effectPathLength; exports.effectPathVertexCount = effectPathVertexCount; exports.trimIntervals = trimIntervals; exports.trimPaths = trimPaths; exports.trimPathsIndividually = trimPathsIndividually; exports.puckerBloatPaths = puckerBloatPaths; exports.roundCornerPaths = roundCornerPaths; exports.offsetPaths = offsetPaths; exports.twistPaths = twistPaths; exports.zigzagPaths = zigzagPaths; exports.wigglePaths = wigglePaths; exports.mergePaths = mergePaths; exports.vectorRepeaterCopies = vectorRepeaterCopies; exports.repeatPaths = repeatPaths; exports.pathsCenter = pathsCenter; exports.mapVectorPoints = mapVectorPoints; exports.mapVectorSubpaths = mapVectorSubpaths; exports.mapBezierPath = mapBezierPath; exports.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.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.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.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; exports.subpathToMorphContour = subpathToMorphContour; exports.morphContourToSubpath = morphContourToSubpath; exports.refineMorphContour = refineMorphContour; exports.reverseMorphContour = reverseMorphContour; exports.turnMorphContour = turnMorphContour; exports.correspondMorphContours = correspondMorphContours; exports.morphPathsCross = morphPathsCross; exports.interpolateMorphContours = interpolateMorphContours; exports.interpolateRigidMatrix = interpolateRigidMatrix; exports.interpolateVectorColor = interpolateVectorColor; exports.resampleGradientStops = resampleGradientStops; exports.interpolateVectorPaint = interpolateVectorPaint; exports.interpolateWidthProfiles = interpolateWidthProfiles; exports.interpolateVectorStyle = interpolateVectorStyle; exports.createVectorMorph = createVectorMorph; exports.interpolateVectorPaths = interpolateVectorPaths; exports.evaluateVectorPathKeyframes = evaluateVectorPathKeyframes; exports.vectorStrokeGradientDefs = vectorStrokeGradientDefs; exports.vectorCornersAttribute = vectorCornersAttribute; exports.applyVectorCornersAttribute = applyVectorCornersAttribute; exports.vectorPathLocalBounds = vectorPathLocalBounds; exports.vectorPaintToSvg = vectorPaintToSvg; exports.vectorStrokeSvgParts = vectorStrokeSvgParts; exports.widthProfileToAttribute = widthProfileToAttribute; exports.widthProfileFromAttribute = widthProfileFromAttribute; exports.vectorDocumentToSvg = vectorDocumentToSvg; exports.parseSvgTransform = parseSvgTransform; exports.parseVectorSvg = parseVectorSvg;
5346
- //# sourceMappingURL=chunk-JF5PXN7W.cjs.map
6036
+
6037
+
6038
+
6039
+
6040
+
6041
+
6042
+
6043
+
6044
+
6045
+
6046
+
6047
+
6048
+
6049
+
6050
+
6051
+
6052
+
6053
+
6054
+
6055
+
6056
+
6057
+
6058
+
6059
+
6060
+
6061
+
6062
+
6063
+
6064
+
6065
+
6066
+
6067
+
6068
+
6069
+
6070
+
6071
+
6072
+
6073
+
6074
+
6075
+
6076
+
6077
+
6078
+
6079
+ 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_BLEND_SPACINGS = VECTOR_BLEND_SPACINGS; 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.vectorCornerAt = vectorCornerAt; exports.vectorCorners = vectorCorners; exports.cornerSetback = cornerSetback; exports.fitCornerRadius = fitCornerRadius; exports.cornerBisectorPoint = cornerBisectorPoint; exports.cornerRadiusChange = cornerRadiusChange; exports.hasVectorCorners = hasVectorCorners; exports.expandVectorCornersOf = expandVectorCornersOf; exports.expandVectorCorners = expandVectorCorners; exports.setAnchorCorner = setAnchorCorner; exports.nextVectorCornerKind = nextVectorCornerKind; exports.setSubpathCorners = setSubpathCorners; exports.VECTOR_WIDTH_PROFILE_MAX_POINTS = VECTOR_WIDTH_PROFILE_MAX_POINTS; exports.VECTOR_WIDTH_PROFILE_MAX_SCALE = VECTOR_WIDTH_PROFILE_MAX_SCALE; exports.VECTOR_WIDTH_SAME_T = VECTOR_WIDTH_SAME_T; exports.VECTOR_WIDTH_PRESETS = VECTOR_WIDTH_PRESETS; exports.VECTOR_WIDTH_PRESET_IDS = VECTOR_WIDTH_PRESET_IDS; exports.sanitizeWidthProfile = sanitizeWidthProfile; exports.isUniformWidthProfile = isUniformWidthProfile; exports.widthProfileAt = widthProfileAt; exports.widthProfileMaxScale = widthProfileMaxScale; exports.widthProfilePreset = widthProfilePreset; exports.widthProfilePresetId = widthProfilePresetId; exports.reverseWidthProfile = reverseWidthProfile; exports.mirrorWidthProfile = mirrorWidthProfile; exports.insertWidthPoint = insertWidthPoint; exports.setWidthPoint = setWidthPoint; exports.removeWidthPoints = removeWidthPoints; exports.taperWaveFactor = taperWaveFactor; exports.generateWidthProfile = generateWidthProfile; exports.VECTOR_PRESSURE_NOMINAL = VECTOR_PRESSURE_NOMINAL; exports.pressureWidthProfile = pressureWidthProfile; exports.dashIntervals = dashIntervals; exports.variableStrokeRings = variableStrokeRings; exports.variableStrokeOutline = variableStrokeOutline; exports.nearestStrokePosition = nearestStrokePosition; exports.strokePositionPoint = strokePositionPoint; exports.isClosedBezierShape = isClosedBezierShape; exports.effectiveStrokeAlign = effectiveStrokeAlign; exports.strokeWidthProfileOf = strokeWidthProfileOf; exports.hasStrokeExtras = hasStrokeExtras; exports.vectorStrokeLineArea = vectorStrokeLineArea; exports.arrowheadWeight = arrowheadWeight; exports.arrowheadInset = arrowheadInset; exports.arrowheadPath = arrowheadPath; exports.vectorStrokeParts = vectorStrokeParts; exports.vectorStrokeOutlinePath = vectorStrokeOutlinePath; exports.hitTestVectorStroke = hitTestVectorStroke; exports.vectorStrokeReach = vectorStrokeReach; exports.VECTOR_STROKE_SETTING_KEYS = VECTOR_STROKE_SETTING_KEYS; exports.VECTOR_BLEND_MODE_LABELS = VECTOR_BLEND_MODE_LABELS; exports.isVectorBlendMode = isVectorBlendMode; exports.vectorBlendModeCss = vectorBlendModeCss; exports.vectorBlendModeFromCss = vectorBlendModeFromCss; exports.isPlainVectorPaintLayer = isPlainVectorPaintLayer; exports.isDrawnVectorPaintLayer = isDrawnVectorPaintLayer; exports.vectorFills = vectorFills; exports.vectorStrokeSettings = vectorStrokeSettings; exports.vectorStrokes = vectorStrokes; exports.hasVectorPaintStacks = hasVectorPaintStacks; exports.withVectorFills = withVectorFills; exports.withVectorStrokes = withVectorStrokes; exports.normalizeVectorPaintStacks = normalizeVectorPaintStacks; exports.sanitizeVectorFills = sanitizeVectorFills; exports.sanitizeVectorStrokeSettings = sanitizeVectorStrokeSettings; exports.sanitizeVectorStrokes = sanitizeVectorStrokes; exports.vectorPaintLayerNodes = vectorPaintLayerNodes; exports.needsVectorPaintLayers = needsVectorPaintLayers; exports.vectorStrokeStackReach = vectorStrokeStackReach; exports.hitTestVectorPaintLayer = hitTestVectorPaintLayer; exports.hitTestVectorPaintStack = hitTestVectorPaintStack; exports.vectorStacksHaveGradient = vectorStacksHaveGradient; exports.newVectorStrokeLayer = newVectorStrokeLayer; exports.vectorTargetPaint = vectorTargetPaint; exports.withVectorTargetPaint = withVectorTargetPaint; exports.effectPathLength = effectPathLength; exports.effectPathVertexCount = effectPathVertexCount; exports.trimIntervals = trimIntervals; exports.trimPaths = trimPaths; exports.trimPathsIndividually = trimPathsIndividually; exports.puckerBloatPaths = puckerBloatPaths; exports.roundCornerPaths = roundCornerPaths; exports.offsetPaths = offsetPaths; exports.twistPaths = twistPaths; exports.zigzagPaths = zigzagPaths; exports.wigglePaths = wigglePaths; exports.mergePaths = mergePaths; exports.vectorRepeaterCopies = vectorRepeaterCopies; exports.repeatPaths = repeatPaths; exports.pathsCenter = pathsCenter; exports.mapVectorPoints = mapVectorPoints; exports.mapVectorSubpaths = mapVectorSubpaths; exports.mapBezierPath = mapBezierPath; exports.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.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.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.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; exports.subpathToMorphContour = subpathToMorphContour; exports.morphContourToSubpath = morphContourToSubpath; exports.refineMorphContour = refineMorphContour; exports.reverseMorphContour = reverseMorphContour; exports.turnMorphContour = turnMorphContour; exports.correspondMorphContours = correspondMorphContours; exports.morphPathsCross = morphPathsCross; exports.interpolateMorphContours = interpolateMorphContours; exports.interpolateRigidMatrix = interpolateRigidMatrix; exports.interpolateVectorColor = interpolateVectorColor; exports.resampleGradientStops = resampleGradientStops; exports.interpolateVectorPaint = interpolateVectorPaint; exports.interpolateWidthProfiles = interpolateWidthProfiles; exports.interpolateVectorStyle = interpolateVectorStyle; exports.createVectorMorph = createVectorMorph; exports.interpolateVectorPaths = interpolateVectorPaths; exports.evaluateVectorPathKeyframes = evaluateVectorPathKeyframes; 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.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;
6080
+ //# sourceMappingURL=chunk-KANRAHTL.cjs.map