stickyflow 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +1 -1
  3. package/dist/binding/index.cjs +9 -9
  4. package/dist/binding/index.d.cts +4 -4
  5. package/dist/binding/index.d.ts +4 -4
  6. package/dist/binding/index.js +3 -3
  7. package/dist/{chunk-XPM3E7NV.cjs → chunk-B3YRZVMR.cjs} +23 -23
  8. package/dist/chunk-B3YRZVMR.cjs.map +1 -0
  9. package/dist/{chunk-CZW3ARXQ.js → chunk-BUVUJMWT.js} +5 -5
  10. package/dist/chunk-BUVUJMWT.js.map +1 -0
  11. package/dist/{chunk-LFEGZJWC.js → chunk-CM35H45Z.js} +3 -3
  12. package/dist/{chunk-LFEGZJWC.js.map → chunk-CM35H45Z.js.map} +1 -1
  13. package/dist/{chunk-GLZVHUSW.js → chunk-D2266VBZ.js} +393 -5
  14. package/dist/chunk-D2266VBZ.js.map +1 -0
  15. package/dist/{chunk-MAPNY7MJ.js → chunk-FS6L462E.js} +128 -15
  16. package/dist/chunk-FS6L462E.js.map +1 -0
  17. package/dist/{chunk-FQ7GMLCM.cjs → chunk-OUWGWDJ2.cjs} +15 -15
  18. package/dist/{chunk-FQ7GMLCM.cjs.map → chunk-OUWGWDJ2.cjs.map} +1 -1
  19. package/dist/{chunk-LNW5VIEA.cjs → chunk-QL7MNEMT.cjs} +393 -4
  20. package/dist/chunk-QL7MNEMT.cjs.map +1 -0
  21. package/dist/{chunk-IR2T47NW.cjs → chunk-SQBF2BKT.cjs} +257 -75
  22. package/dist/chunk-SQBF2BKT.cjs.map +1 -0
  23. package/dist/{chunk-VOYX6JMW.cjs → chunk-YSXD5IVZ.cjs} +778 -665
  24. package/dist/chunk-YSXD5IVZ.cjs.map +1 -0
  25. package/dist/{chunk-EDOPENSE.js → chunk-ZCGZJBAT.js} +228 -46
  26. package/dist/chunk-ZCGZJBAT.js.map +1 -0
  27. package/dist/index.cjs +36 -36
  28. package/dist/index.d.cts +5 -5
  29. package/dist/index.d.ts +5 -5
  30. package/dist/index.js +5 -5
  31. package/dist/interaction/index.cjs +232 -230
  32. package/dist/interaction/index.cjs.map +1 -1
  33. package/dist/interaction/index.d.cts +2 -2
  34. package/dist/interaction/index.d.ts +2 -2
  35. package/dist/interaction/index.js +4 -2
  36. package/dist/interaction/index.js.map +1 -1
  37. package/dist/{render-Bp2FLEzv.d.cts → render-DU4lYbRl.d.cts} +19 -11
  38. package/dist/{render-Bp2FLEzv.d.ts → render-DU4lYbRl.d.ts} +19 -11
  39. package/dist/{runtime-DIag-XBa.d.cts → runtime-DG8X3Fwf.d.cts} +2 -2
  40. package/dist/{runtime-CWIGxRcL.d.ts → runtime-kqD1RS17.d.ts} +2 -2
  41. package/dist/{runtimeTypes-C7sSLfOK.d.ts → runtimeTypes-CvjlBZds.d.cts} +7 -3
  42. package/dist/{runtimeTypes-BYODuxHk.d.cts → runtimeTypes-vRaHOIHi.d.ts} +7 -3
  43. package/dist/stickyflow-diagram.global.js +192 -40
  44. package/dist/stickyflow-diagram.global.js.map +1 -1
  45. package/dist/{types-D2w6D_wG.d.cts → types-B5jrEEcF.d.cts} +1 -1
  46. package/dist/{types-B9QM_H3R.d.ts → types-B7IkZ0w4.d.ts} +1 -1
  47. package/dist/viewer/index.cjs +9 -9
  48. package/dist/viewer/index.d.cts +4 -4
  49. package/dist/viewer/index.d.ts +4 -4
  50. package/dist/viewer/index.js +4 -4
  51. package/dist/web-component/index.cjs +6 -6
  52. package/dist/web-component/index.d.cts +2 -2
  53. package/dist/web-component/index.d.ts +2 -2
  54. package/dist/web-component/index.js +4 -4
  55. package/package.json +1 -1
  56. package/dist/chunk-CZW3ARXQ.js.map +0 -1
  57. package/dist/chunk-EDOPENSE.js.map +0 -1
  58. package/dist/chunk-GLZVHUSW.js.map +0 -1
  59. package/dist/chunk-IR2T47NW.cjs.map +0 -1
  60. package/dist/chunk-LNW5VIEA.cjs.map +0 -1
  61. package/dist/chunk-MAPNY7MJ.js.map +0 -1
  62. package/dist/chunk-VOYX6JMW.cjs.map +0 -1
  63. package/dist/chunk-XPM3E7NV.cjs.map +0 -1
@@ -1069,7 +1069,8 @@ var NAMED_BLOCK_KINDS = [
1069
1069
  "Net",
1070
1070
  "Symbol",
1071
1071
  "Port",
1072
- "DataSource"
1072
+ "DataSource",
1073
+ "Repeat"
1073
1074
  ];
1074
1075
  var SIDES = ["top", "bottom", "left", "right"];
1075
1076
  var isSide = (s) => SIDES.includes(s);
@@ -1128,7 +1129,43 @@ function parseList(cursor) {
1128
1129
  cursor.expect("rbracket", "']'");
1129
1130
  return { type: "list", values };
1130
1131
  }
1132
+ var ARITHMETIC = /* @__PURE__ */ new Set(["+", "-", "*", "/", ">", "<", ">=", "<=", "==", "!=", "&&", "||"]);
1133
+ function startsComputed(cursor) {
1134
+ const first = cursor.peek();
1135
+ if (first.type === "op" && first.value === "-") {
1136
+ return true;
1137
+ }
1138
+ if (first.type !== "number" && first.type !== "ident" && first.type !== "lparen") {
1139
+ return false;
1140
+ }
1141
+ for (let offset = 0; ; offset++) {
1142
+ const token = cursor.peek(offset);
1143
+ if (token.type === "newline" || token.type === "semi" || token.type === "rbrace" || token.type === "eof") {
1144
+ return false;
1145
+ }
1146
+ if (token.type === "lparen" || token.type === "op" && ARITHMETIC.has(token.value)) {
1147
+ return true;
1148
+ }
1149
+ if (token.type === "ident" && cursor.peek(offset - 1).type === "comma") {
1150
+ return true;
1151
+ }
1152
+ if (offset === 0 && token.type === "ident" && cursor.peek(1).type === "comma") {
1153
+ return true;
1154
+ }
1155
+ }
1156
+ }
1157
+ function parseComputed(cursor) {
1158
+ const items = [parseExpression(cursor)];
1159
+ while (cursor.at("comma")) {
1160
+ cursor.next();
1161
+ items.push(parseExpression(cursor));
1162
+ }
1163
+ return { type: "expr", items };
1164
+ }
1131
1165
  function parseValue(cursor, allowTuple = true) {
1166
+ if (allowTuple && startsComputed(cursor)) {
1167
+ return parseComputed(cursor);
1168
+ }
1132
1169
  const token = cursor.peek();
1133
1170
  switch (token.type) {
1134
1171
  case "string":
@@ -1594,6 +1631,8 @@ function emitValue(value) {
1594
1631
  return `[${value.values.map(emitValue).join(", ")}]`;
1595
1632
  case "ident":
1596
1633
  return value.segments.join(".");
1634
+ case "expr":
1635
+ return value.items.map((item) => emitExpression(item)).join(", ");
1597
1636
  case "endpoint": {
1598
1637
  let output = value.segments.join(".");
1599
1638
  if (value.side) {
@@ -1673,6 +1712,8 @@ var STYLE_ORDER = [
1673
1712
  "dash",
1674
1713
  "shadow",
1675
1714
  "opacity",
1715
+ "blur",
1716
+ "blend",
1676
1717
  "icon",
1677
1718
  "route",
1678
1719
  "marker",
@@ -1851,6 +1892,353 @@ function isSwimlaneObject(canvasObject) {
1851
1892
  return canvasObject.objectType === "swimlane" && canvasObject.swimlane !== void 0;
1852
1893
  }
1853
1894
 
1895
+ // src/sflLanguage/expansion/repeat.ts
1896
+ var RESERVED = /* @__PURE__ */ new Set(["columns", "rows", "count", "step", "origin", "seed", "jitter", "chance", "order", "where"]);
1897
+ var MAX_CELLS = 2e4;
1898
+ var MAX_VALUES = 1e6;
1899
+ var Random = class {
1900
+ state;
1901
+ constructor(seed) {
1902
+ this.state = seed >>> 0;
1903
+ }
1904
+ // mulberry32: a small generator that gives the same numbers for the same seed, on every machine.
1905
+ next() {
1906
+ this.state = this.state + 1831565813 >>> 0;
1907
+ let t = this.state;
1908
+ t = Math.imul(t ^ t >>> 15, t | 1);
1909
+ t ^= t + Math.imul(t ^ t >>> 7, t | 61);
1910
+ return ((t ^ t >>> 14) >>> 0) / 4294967296;
1911
+ }
1912
+ };
1913
+ function fail(scope, message) {
1914
+ throw new Error(`Repeat ${scope.repeat}: ${message}`);
1915
+ }
1916
+ function numberOf(scope, value, what) {
1917
+ if (typeof value !== "number" || !Number.isFinite(value)) {
1918
+ fail(scope, `${what} needs a number`);
1919
+ }
1920
+ return value;
1921
+ }
1922
+ function rgbOf(scope, value) {
1923
+ const match = typeof value === "string" ? /^#([0-9a-f]{6})$/i.exec(value) : null;
1924
+ if (!match) {
1925
+ fail(scope, 'a color has to be written as "#rrggbb"');
1926
+ }
1927
+ const n = Number.parseInt(match[1], 16);
1928
+ return [n >> 16 & 255, n >> 8 & 255, n & 255];
1929
+ }
1930
+ var hexOf = (rgb) => `#${rgb.map(
1931
+ (channel) => Math.round(Math.max(0, Math.min(255, channel))).toString(16).padStart(2, "0")
1932
+ ).join("")}`;
1933
+ function callFunction(scope, name, args) {
1934
+ const number = (index) => numberOf(scope, args[index], `${name}()`);
1935
+ switch (name) {
1936
+ case "random": {
1937
+ if (args.length === 0) {
1938
+ return scope.random.next();
1939
+ }
1940
+ const low = args.length === 1 ? 0 : number(0);
1941
+ const high = args.length === 1 ? number(0) : number(1);
1942
+ return low + scope.random.next() * (high - low);
1943
+ }
1944
+ case "pick": {
1945
+ if (args.length === 0) {
1946
+ fail(scope, "pick() needs at least one value");
1947
+ }
1948
+ return args[Math.floor(scope.random.next() * args.length)];
1949
+ }
1950
+ case "exp":
1951
+ return Math.exp(number(0));
1952
+ case "pow":
1953
+ return number(0) ** number(1);
1954
+ case "dist":
1955
+ return Math.hypot(number(0) - number(2), number(1) - number(3));
1956
+ case "mix": {
1957
+ const from = rgbOf(scope, args[0]);
1958
+ const to = rgbOf(scope, args[1]);
1959
+ const amount = Math.max(0, Math.min(1, number(2)));
1960
+ return hexOf(from.map((channel, index) => channel + (to[index] - channel) * amount));
1961
+ }
1962
+ case "shade": {
1963
+ const factor = number(1);
1964
+ return hexOf(rgbOf(scope, args[0]).map((channel) => channel * factor));
1965
+ }
1966
+ case "floor":
1967
+ return Math.floor(number(0));
1968
+ case "ceil":
1969
+ return Math.ceil(number(0));
1970
+ case "round":
1971
+ return Math.round(number(0));
1972
+ case "abs":
1973
+ return Math.abs(number(0));
1974
+ case "sqrt":
1975
+ return Math.sqrt(number(0));
1976
+ case "sin":
1977
+ return Math.sin(number(0));
1978
+ case "cos":
1979
+ return Math.cos(number(0));
1980
+ case "min":
1981
+ return Math.min(...args.map((_, index) => number(index)));
1982
+ case "max":
1983
+ return Math.max(...args.map((_, index) => number(index)));
1984
+ case "when":
1985
+ return args[0] ? args[1] : args[2];
1986
+ default:
1987
+ return fail(scope, `unknown function ${name}()`);
1988
+ }
1989
+ }
1990
+ function evaluate(scope, expr) {
1991
+ switch (expr.kind) {
1992
+ case "number":
1993
+ case "string":
1994
+ case "boolean":
1995
+ return expr.value;
1996
+ case "ref": {
1997
+ const name = expr.path.join(".");
1998
+ const value = scope.vars.get(name);
1999
+ if (value === void 0) {
2000
+ fail(scope, `unknown name ${name}`);
2001
+ }
2002
+ return value;
2003
+ }
2004
+ case "unary": {
2005
+ const operand = evaluate(scope, expr.operand);
2006
+ return expr.operator === "-" ? -numberOf(scope, operand, "a minus") : !operand;
2007
+ }
2008
+ case "call":
2009
+ return callFunction(
2010
+ scope,
2011
+ expr.callee.join("."),
2012
+ expr.args.map((arg) => evaluate(scope, arg))
2013
+ );
2014
+ case "binary": {
2015
+ const left = evaluate(scope, expr.left);
2016
+ const right = evaluate(scope, expr.right);
2017
+ switch (expr.operator) {
2018
+ case "+":
2019
+ return typeof left === "string" || typeof right === "string" ? `${left}${right}` : numberOf(scope, left, "+") + numberOf(scope, right, "+");
2020
+ case "-":
2021
+ return numberOf(scope, left, "-") - numberOf(scope, right, "-");
2022
+ case "*":
2023
+ return numberOf(scope, left, "*") * numberOf(scope, right, "*");
2024
+ case "/":
2025
+ return numberOf(scope, left, "/") / numberOf(scope, right, "/");
2026
+ case ">":
2027
+ return numberOf(scope, left, ">") > numberOf(scope, right, ">");
2028
+ case "<":
2029
+ return numberOf(scope, left, "<") < numberOf(scope, right, "<");
2030
+ case ">=":
2031
+ return numberOf(scope, left, ">=") >= numberOf(scope, right, ">=");
2032
+ case "<=":
2033
+ return numberOf(scope, left, "<=") <= numberOf(scope, right, "<=");
2034
+ case "==":
2035
+ return left === right;
2036
+ case "!=":
2037
+ return left !== right;
2038
+ case "&&":
2039
+ return Boolean(left) && Boolean(right);
2040
+ case "||":
2041
+ return Boolean(left) || Boolean(right);
2042
+ }
2043
+ }
2044
+ }
2045
+ }
2046
+ var round2 = (value) => Math.round(value * 1e3) / 1e3;
2047
+ function resolveValue(scope, value) {
2048
+ if (value.type !== "expr") {
2049
+ return value;
2050
+ }
2051
+ const results = value.items.map((item) => evaluate(scope, item));
2052
+ if (results.length === 1) {
2053
+ const [only] = results;
2054
+ if (typeof only === "number") {
2055
+ return { type: "number", value: round2(numberOf(scope, only, "a value")) };
2056
+ }
2057
+ if (typeof only === "string") {
2058
+ return { type: "string", value: only };
2059
+ }
2060
+ return { type: "ident", segments: [String(only)] };
2061
+ }
2062
+ return { type: "tuple", values: results.map((result) => round2(numberOf(scope, result, "a tuple"))) };
2063
+ }
2064
+ function propertiesOf(scope, properties) {
2065
+ return properties.map((property) => ({ key: property.key, value: resolveValue(scope, property.value) }));
2066
+ }
2067
+ function entryOf(scope, entry, suffix) {
2068
+ switch (entry.type) {
2069
+ case "property":
2070
+ return {
2071
+ type: "property",
2072
+ property: { key: entry.property.key, value: resolveValue(scope, entry.property.value) }
2073
+ };
2074
+ case "layout":
2075
+ return { type: "layout", layout: { properties: propertiesOf(scope, entry.layout.properties) } };
2076
+ case "style":
2077
+ return { type: "style", style: { ...entry.style, properties: propertiesOf(scope, entry.style.properties) } };
2078
+ case "block":
2079
+ return { type: "block", block: instance(scope, entry.block, suffix) };
2080
+ default:
2081
+ return entry;
2082
+ }
2083
+ }
2084
+ function instance(scope, block2, suffix) {
2085
+ return {
2086
+ ...block2,
2087
+ name: `${block2.name}${suffix}`,
2088
+ entries: block2.entries.map((entry) => entryOf(scope, entry, suffix))
2089
+ };
2090
+ }
2091
+ function propertyOf(block2, key) {
2092
+ for (const entry of block2.entries) {
2093
+ if (entry.type === "property" && entry.property.key === key) {
2094
+ return entry.property.value;
2095
+ }
2096
+ }
2097
+ return void 0;
2098
+ }
2099
+ function numbersOf(block2, key) {
2100
+ for (const entry of block2.entries) {
2101
+ if (entry.type === "property" && entry.property.key === key) {
2102
+ const value = entry.property.value;
2103
+ if (value.type === "number") {
2104
+ return [value.value];
2105
+ }
2106
+ if (value.type === "tuple") {
2107
+ return value.values;
2108
+ }
2109
+ }
2110
+ }
2111
+ return void 0;
2112
+ }
2113
+ function expandRepeat(block2) {
2114
+ const scope = { vars: /* @__PURE__ */ new Map(), random: new Random(0), repeat: block2.name };
2115
+ const count = numbersOf(block2, "count")?.[0];
2116
+ const columns = Math.max(1, Math.floor(count ?? numbersOf(block2, "columns")?.[0] ?? 1));
2117
+ const rows = count === void 0 ? Math.max(1, Math.floor(numbersOf(block2, "rows")?.[0] ?? 1)) : 1;
2118
+ const total = columns * rows;
2119
+ if (total > MAX_CELLS) {
2120
+ fail(scope, `${total} cells are too many, the limit is ${MAX_CELLS}`);
2121
+ }
2122
+ const [stepX = 0, stepY = stepX] = numbersOf(block2, "step") ?? [];
2123
+ const [originX = 0, originY = 0] = numbersOf(block2, "origin") ?? [];
2124
+ const seed = numbersOf(block2, "seed")?.[0] ?? 0;
2125
+ const jitter = numbersOf(block2, "jitter")?.[0] ?? 0;
2126
+ const chance = numbersOf(block2, "chance")?.[0] ?? 1;
2127
+ const diagonal = propertyOf(block2, "order")?.type === "ident" && propertyOf(block2, "order").segments[0] === "diagonal";
2128
+ const condition = propertyOf(block2, "where");
2129
+ const helpers = block2.entries.flatMap(
2130
+ (entry) => entry.type === "property" && entry.property.value.type === "expr" && !RESERVED.has(entry.property.key) ? [entry.property] : []
2131
+ );
2132
+ const templates = block2.entries.flatMap((entry) => entry.type === "block" ? [entry.block] : []);
2133
+ if (templates.some((template) => template.kind === "Repeat")) {
2134
+ fail(scope, "a Repeat cannot hold another Repeat");
2135
+ }
2136
+ if (total * Math.max(1, templates.length) > MAX_VALUES) {
2137
+ fail(scope, "too many blocks");
2138
+ }
2139
+ const cells = [];
2140
+ for (let row = 0; row < rows; row++) {
2141
+ for (let col = 0; col < columns; col++) {
2142
+ cells.push([col, row]);
2143
+ }
2144
+ }
2145
+ if (diagonal) {
2146
+ cells.sort((a, b) => a[0] + a[1] - (b[0] + b[1]) || a[0] - b[0]);
2147
+ }
2148
+ const out = [];
2149
+ for (const [col, row] of cells) {
2150
+ {
2151
+ const index = row * columns + col;
2152
+ scope.random = new Random(Math.imul(seed + 1, 2654435761) ^ Math.imul(index + 1, 2246822507));
2153
+ if (chance < 1 && scope.random.next() >= chance) {
2154
+ continue;
2155
+ }
2156
+ const spread = () => jitter > 0 ? (scope.random.next() * 2 - 1) * jitter : 0;
2157
+ scope.vars = /* @__PURE__ */ new Map([
2158
+ ["col", col],
2159
+ ["row", row],
2160
+ ["index", index],
2161
+ ["count", total],
2162
+ ["columns", columns],
2163
+ ["rows", rows],
2164
+ ["x", round2(originX + col * stepX + spread())],
2165
+ ["y", round2(originY + row * stepY + spread())]
2166
+ ]);
2167
+ for (const helper of helpers) {
2168
+ const value = resolveValue(scope, helper.value);
2169
+ if (value.type === "number" || value.type === "string") {
2170
+ scope.vars.set(helper.key, value.value);
2171
+ } else if (value.type === "ident") {
2172
+ scope.vars.set(helper.key, value.segments[0] === "true" ? 1 : 0);
2173
+ } else {
2174
+ fail(scope, `${helper.key} needs a number`);
2175
+ }
2176
+ }
2177
+ if (condition && condition.type === "expr") {
2178
+ const result = condition.items.map((item) => evaluate(scope, item))[0];
2179
+ if (!result) {
2180
+ continue;
2181
+ }
2182
+ }
2183
+ const suffix = rows === 1 ? `_${col}` : `_${col}_${row}`;
2184
+ for (const template of templates) {
2185
+ out.push(instance(scope, template, suffix));
2186
+ }
2187
+ }
2188
+ }
2189
+ return out;
2190
+ }
2191
+ function expandBlocks(blocks) {
2192
+ return blocks.flatMap((block2) => {
2193
+ if (block2.kind === "Repeat") {
2194
+ return expandRepeat(block2);
2195
+ }
2196
+ if (!block2.entries.some((entry) => entry.type === "block")) {
2197
+ return [block2];
2198
+ }
2199
+ return [
2200
+ {
2201
+ ...block2,
2202
+ entries: block2.entries.flatMap(
2203
+ (entry) => entry.type === "block" ? (entry.block.kind === "Repeat" ? expandRepeat(entry.block) : expandBlocks([entry.block])).map((child) => ({
2204
+ type: "block",
2205
+ block: child
2206
+ })) : [entry]
2207
+ )
2208
+ }
2209
+ ];
2210
+ });
2211
+ }
2212
+ function checkNoComputed(blocks) {
2213
+ for (const block2 of blocks) {
2214
+ for (const entry of block2.entries) {
2215
+ const properties = entry.type === "property" ? [entry.property] : entry.type === "layout" ? entry.layout.properties : entry.type === "style" ? entry.style.properties : [];
2216
+ for (const property of properties) {
2217
+ if (property.value.type === "expr") {
2218
+ throw new Error(
2219
+ `${block2.kind} ${block2.name}: ${property.key} is computed, and only a Repeat can work out a computed value`
2220
+ );
2221
+ }
2222
+ }
2223
+ if (entry.type === "block") {
2224
+ checkNoComputed([entry.block]);
2225
+ }
2226
+ }
2227
+ }
2228
+ }
2229
+ function expandRepeats(doc) {
2230
+ const has = (blocks) => blocks.some(
2231
+ (block2) => block2.kind === "Repeat" || block2.entries.some((entry) => entry.type === "block" ? has([entry.block]) : false)
2232
+ );
2233
+ if (!has(doc.blocks)) {
2234
+ checkNoComputed(doc.blocks);
2235
+ return doc;
2236
+ }
2237
+ const expanded = { ...doc, blocks: expandBlocks(doc.blocks) };
2238
+ checkNoComputed(expanded.blocks);
2239
+ return expanded;
2240
+ }
2241
+
1854
2242
  // src/sflSemantic/ast/valueAccess.ts
1855
2243
  function asString(value) {
1856
2244
  if (!value) {
@@ -3155,7 +3543,7 @@ function resolveCanvasState(document) {
3155
3543
 
3156
3544
  // src/sflSemantic/sflToCanvasState.ts
3157
3545
  function sflToCanvasState(source) {
3158
- return resolveCanvasState(parseSource(source));
3546
+ return resolveCanvasState(expandRepeats(parseSource(source)));
3159
3547
  }
3160
3548
 
3161
3549
  // src/svg/domContract/version.ts
@@ -5412,6 +5800,7 @@ exports.elementCenter = elementCenter;
5412
5800
  exports.ellipsizeToWidth = ellipsizeToWidth;
5413
5801
  exports.errorBarRange = errorBarRange;
5414
5802
  exports.estimateTextWidth = estimateTextWidth;
5803
+ exports.expandRepeats = expandRepeats;
5415
5804
  exports.extrudeFootprint = extrudeFootprint;
5416
5805
  exports.finite = finite;
5417
5806
  exports.flattenPath = flattenPath;
@@ -5503,5 +5892,5 @@ exports.tokenizeSource = tokenizeSource;
5503
5892
  exports.topRoundedRectPath = topRoundedRectPath;
5504
5893
  exports.wrapText = wrapText;
5505
5894
  exports.zoneColorAtValue = zoneColorAtValue;
5506
- //# sourceMappingURL=chunk-LNW5VIEA.cjs.map
5507
- //# sourceMappingURL=chunk-LNW5VIEA.cjs.map
5895
+ //# sourceMappingURL=chunk-QL7MNEMT.cjs.map
5896
+ //# sourceMappingURL=chunk-QL7MNEMT.cjs.map