schematex 0.4.2 → 0.5.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 (150) hide show
  1. package/README.md +24 -3
  2. package/dist/ai/ai-sdk.cjs +17 -15
  3. package/dist/ai/ai-sdk.cjs.map +1 -1
  4. package/dist/ai/ai-sdk.d.cts +2 -2
  5. package/dist/ai/ai-sdk.d.ts +2 -2
  6. package/dist/ai/ai-sdk.js +12 -10
  7. package/dist/ai/ai-sdk.js.map +1 -1
  8. package/dist/ai/index.cjs +20 -18
  9. package/dist/ai/index.d.cts +3 -3
  10. package/dist/ai/index.d.ts +3 -3
  11. package/dist/ai/index.js +12 -10
  12. package/dist/{api-BIj9t4Oc.d.cts → api-C5UcmT7n.d.cts} +1 -1
  13. package/dist/{api-BIj9t4Oc.d.ts → api-C5UcmT7n.d.ts} +1 -1
  14. package/dist/browser.cjs +14 -12
  15. package/dist/browser.cjs.map +1 -1
  16. package/dist/browser.d.cts +2 -2
  17. package/dist/browser.d.ts +2 -2
  18. package/dist/browser.js +12 -10
  19. package/dist/browser.js.map +1 -1
  20. package/dist/chunk-2KTQ75LN.js +67 -0
  21. package/dist/chunk-2KTQ75LN.js.map +1 -0
  22. package/dist/chunk-3KRL2EGN.cjs +70 -0
  23. package/dist/chunk-3KRL2EGN.cjs.map +1 -0
  24. package/dist/{chunk-YWDODCW2.js → chunk-3M6T7KB4.js} +60 -14
  25. package/dist/chunk-3M6T7KB4.js.map +1 -0
  26. package/dist/{chunk-OIZ4MYSF.cjs → chunk-3M6WB62Y.cjs} +43 -9
  27. package/dist/chunk-3M6WB62Y.cjs.map +1 -0
  28. package/dist/{chunk-DHHVYSQX.cjs → chunk-3YUUC6RN.cjs} +5145 -295
  29. package/dist/chunk-3YUUC6RN.cjs.map +1 -0
  30. package/dist/{chunk-JDBG5DU2.js → chunk-6OSUNBZY.js} +43 -9
  31. package/dist/chunk-6OSUNBZY.js.map +1 -0
  32. package/dist/{chunk-O5POCPXZ.cjs → chunk-EGSUMHCS.cjs} +21 -10
  33. package/dist/chunk-EGSUMHCS.cjs.map +1 -0
  34. package/dist/{chunk-Z5NGIM4Z.js → chunk-GTDQAN2Z.js} +5134 -287
  35. package/dist/chunk-GTDQAN2Z.js.map +1 -0
  36. package/dist/{chunk-J7JWMQD5.js → chunk-HUPDIRBX.js} +119 -4
  37. package/dist/chunk-HUPDIRBX.js.map +1 -0
  38. package/dist/{chunk-5FF2IT3C.js → chunk-IBRW3UOA.js} +51 -10
  39. package/dist/chunk-IBRW3UOA.js.map +1 -0
  40. package/dist/{chunk-YTLGK5BZ.js → chunk-IM4RCUHA.js} +238 -1788
  41. package/dist/chunk-IM4RCUHA.js.map +1 -0
  42. package/dist/{chunk-LPKVIRYT.js → chunk-JHDR56XO.js} +18 -9
  43. package/dist/chunk-JHDR56XO.js.map +1 -0
  44. package/dist/{chunk-GZY4CJ23.cjs → chunk-N7W5KZK7.cjs} +51 -10
  45. package/dist/chunk-N7W5KZK7.cjs.map +1 -0
  46. package/dist/{chunk-Z5UECSNM.cjs → chunk-NWPCY65Z.cjs} +240 -1790
  47. package/dist/chunk-NWPCY65Z.cjs.map +1 -0
  48. package/dist/chunk-PIV2A3HG.js +55 -0
  49. package/dist/chunk-PIV2A3HG.js.map +1 -0
  50. package/dist/{chunk-E2EJRVWS.cjs → chunk-QTNPMIO2.cjs} +158 -15
  51. package/dist/chunk-QTNPMIO2.cjs.map +1 -0
  52. package/dist/chunk-SBB6C4OP.cjs +57 -0
  53. package/dist/chunk-SBB6C4OP.cjs.map +1 -0
  54. package/dist/{chunk-K6RAUXRQ.cjs → chunk-TZTCIAYW.cjs} +7 -6
  55. package/dist/chunk-TZTCIAYW.cjs.map +1 -0
  56. package/dist/{chunk-KVP7AORH.js → chunk-UFTYX73U.js} +158 -15
  57. package/dist/chunk-UFTYX73U.js.map +1 -0
  58. package/dist/{chunk-6WORZSL3.cjs → chunk-VFZOPRQP.cjs} +60 -14
  59. package/dist/chunk-VFZOPRQP.cjs.map +1 -0
  60. package/dist/{chunk-WHNIK4LK.js → chunk-VJGMEGMR.js} +7 -6
  61. package/dist/chunk-VJGMEGMR.js.map +1 -0
  62. package/dist/{chunk-3MJKJX27.cjs → chunk-VZ5LDNHK.cjs} +18 -9
  63. package/dist/chunk-VZ5LDNHK.cjs.map +1 -0
  64. package/dist/{chunk-2Z543TC3.cjs → chunk-XRCY75UV.cjs} +119 -4
  65. package/dist/chunk-XRCY75UV.cjs.map +1 -0
  66. package/dist/{chunk-6XGSEG3K.js → chunk-ZL5RB4UV.js} +21 -10
  67. package/dist/chunk-ZL5RB4UV.js.map +1 -0
  68. package/dist/diagrams/blockdiagram/index.d.cts +1 -1
  69. package/dist/diagrams/blockdiagram/index.d.ts +1 -1
  70. package/dist/diagrams/circuit/index.cjs +7 -7
  71. package/dist/diagrams/circuit/index.d.cts +1 -1
  72. package/dist/diagrams/circuit/index.d.ts +1 -1
  73. package/dist/diagrams/circuit/index.js +1 -1
  74. package/dist/diagrams/ecomap/index.cjs +7 -6
  75. package/dist/diagrams/ecomap/index.d.cts +1 -1
  76. package/dist/diagrams/ecomap/index.d.ts +1 -1
  77. package/dist/diagrams/ecomap/index.js +2 -1
  78. package/dist/diagrams/entity/index.d.cts +1 -1
  79. package/dist/diagrams/entity/index.d.ts +1 -1
  80. package/dist/diagrams/fishbone/index.cjs +8 -7
  81. package/dist/diagrams/fishbone/index.d.cts +1 -1
  82. package/dist/diagrams/fishbone/index.d.ts +1 -1
  83. package/dist/diagrams/fishbone/index.js +2 -1
  84. package/dist/diagrams/flowchart/index.cjs +8 -7
  85. package/dist/diagrams/flowchart/index.d.cts +2 -2
  86. package/dist/diagrams/flowchart/index.d.ts +2 -2
  87. package/dist/diagrams/flowchart/index.js +2 -1
  88. package/dist/diagrams/genogram/index.cjs +9 -8
  89. package/dist/diagrams/genogram/index.d.cts +1 -1
  90. package/dist/diagrams/genogram/index.d.ts +1 -1
  91. package/dist/diagrams/genogram/index.js +2 -1
  92. package/dist/diagrams/ladder/index.cjs +7 -5
  93. package/dist/diagrams/ladder/index.d.cts +1 -1
  94. package/dist/diagrams/ladder/index.d.ts +1 -1
  95. package/dist/diagrams/ladder/index.js +3 -1
  96. package/dist/diagrams/logic/index.d.cts +1 -1
  97. package/dist/diagrams/logic/index.d.ts +1 -1
  98. package/dist/diagrams/orgchart/index.d.cts +1 -1
  99. package/dist/diagrams/orgchart/index.d.ts +1 -1
  100. package/dist/diagrams/pedigree/index.cjs +7 -6
  101. package/dist/diagrams/pedigree/index.d.cts +1 -1
  102. package/dist/diagrams/pedigree/index.d.ts +1 -1
  103. package/dist/diagrams/pedigree/index.js +2 -1
  104. package/dist/diagrams/phylo/index.d.cts +1 -1
  105. package/dist/diagrams/phylo/index.d.ts +1 -1
  106. package/dist/diagrams/sld/index.cjs +7 -5
  107. package/dist/diagrams/sld/index.d.cts +1 -1
  108. package/dist/diagrams/sld/index.d.ts +1 -1
  109. package/dist/diagrams/sld/index.js +3 -1
  110. package/dist/diagrams/sociogram/index.d.cts +1 -1
  111. package/dist/diagrams/sociogram/index.d.ts +1 -1
  112. package/dist/diagrams/timing/index.d.cts +1 -1
  113. package/dist/diagrams/timing/index.d.ts +1 -1
  114. package/dist/diagrams/venn/index.d.cts +1 -1
  115. package/dist/diagrams/venn/index.d.ts +1 -1
  116. package/dist/{index-CGK0xVls.d.ts → index-C9A0h-CB.d.cts} +1 -2
  117. package/dist/{index-OW8eDrKj.d.cts → index-CJai_TEZ.d.ts} +1 -2
  118. package/dist/index.cjs +37 -23
  119. package/dist/index.d.cts +10 -4
  120. package/dist/index.d.ts +10 -4
  121. package/dist/index.js +11 -9
  122. package/dist/react.cjs +12 -10
  123. package/dist/react.cjs.map +1 -1
  124. package/dist/react.d.cts +1 -1
  125. package/dist/react.d.ts +1 -1
  126. package/dist/react.js +11 -9
  127. package/dist/react.js.map +1 -1
  128. package/dist/{types-Gkyab1sL.d.ts → types-BOAsqHoU.d.cts} +3 -3
  129. package/dist/{types-Gkyab1sL.d.cts → types-BOAsqHoU.d.ts} +3 -3
  130. package/package.json +2 -2
  131. package/dist/chunk-2Z543TC3.cjs.map +0 -1
  132. package/dist/chunk-3MJKJX27.cjs.map +0 -1
  133. package/dist/chunk-5FF2IT3C.js.map +0 -1
  134. package/dist/chunk-6WORZSL3.cjs.map +0 -1
  135. package/dist/chunk-6XGSEG3K.js.map +0 -1
  136. package/dist/chunk-DHHVYSQX.cjs.map +0 -1
  137. package/dist/chunk-E2EJRVWS.cjs.map +0 -1
  138. package/dist/chunk-GZY4CJ23.cjs.map +0 -1
  139. package/dist/chunk-J7JWMQD5.js.map +0 -1
  140. package/dist/chunk-JDBG5DU2.js.map +0 -1
  141. package/dist/chunk-K6RAUXRQ.cjs.map +0 -1
  142. package/dist/chunk-KVP7AORH.js.map +0 -1
  143. package/dist/chunk-LPKVIRYT.js.map +0 -1
  144. package/dist/chunk-O5POCPXZ.cjs.map +0 -1
  145. package/dist/chunk-OIZ4MYSF.cjs.map +0 -1
  146. package/dist/chunk-WHNIK4LK.js.map +0 -1
  147. package/dist/chunk-YTLGK5BZ.js.map +0 -1
  148. package/dist/chunk-YWDODCW2.js.map +0 -1
  149. package/dist/chunk-Z5NGIM4Z.js.map +0 -1
  150. package/dist/chunk-Z5UECSNM.cjs.map +0 -1
@@ -0,0 +1,55 @@
1
+ // src/core/dsl-suggest.ts
2
+ function distance(a, b, cap) {
3
+ if (a === b) return 0;
4
+ if (Math.abs(a.length - b.length) > cap) return cap + 1;
5
+ const al = a.length;
6
+ const bl = b.length;
7
+ const prev = new Array(bl + 1);
8
+ const curr = new Array(bl + 1);
9
+ for (let j = 0; j <= bl; j++) prev[j] = j;
10
+ for (let i = 1; i <= al; i++) {
11
+ curr[0] = i;
12
+ let rowMin = i;
13
+ for (let j = 1; j <= bl; j++) {
14
+ const cost = a[i - 1] === b[j - 1] ? 0 : 1;
15
+ curr[j] = Math.min(
16
+ prev[j] + 1,
17
+ // deletion
18
+ curr[j - 1] + 1,
19
+ // insertion
20
+ prev[j - 1] + cost
21
+ // substitution
22
+ );
23
+ if (curr[j] < rowMin) rowMin = curr[j];
24
+ }
25
+ if (rowMin > cap) return cap + 1;
26
+ for (let j = 0; j <= bl; j++) prev[j] = curr[j];
27
+ }
28
+ return prev[bl];
29
+ }
30
+ function suggestKeyword(input, candidates) {
31
+ const needle = input.toLowerCase();
32
+ let best = null;
33
+ let secondBest = Infinity;
34
+ for (const c of candidates) {
35
+ const d = distance(needle, c.toLowerCase(), 2);
36
+ if (d > 2) continue;
37
+ if (best === null || d < best.dist) {
38
+ secondBest = best?.dist ?? Infinity;
39
+ best = { word: c, dist: d };
40
+ } else if (d < secondBest) {
41
+ secondBest = d;
42
+ }
43
+ }
44
+ if (best === null) return null;
45
+ if (secondBest <= best.dist) return null;
46
+ return best.word;
47
+ }
48
+ function didYouMean(input, candidates) {
49
+ const s = suggestKeyword(input, candidates);
50
+ return s ? ` (did you mean '${s}'?)` : "";
51
+ }
52
+
53
+ export { didYouMean };
54
+ //# sourceMappingURL=chunk-PIV2A3HG.js.map
55
+ //# sourceMappingURL=chunk-PIV2A3HG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/dsl-suggest.ts"],"names":[],"mappings":"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","file":"chunk-PIV2A3HG.js","sourcesContent":["/**\n * \"Did you mean…?\" helper for parser error messages.\n *\n * Every diagram parser eventually rejects an unknown keyword (an unknown\n * node type, an unknown directive, a misspelled mode). The bare error\n * \"unknown element type 'RES'\" tells the LLM nothing — but\n * \"unknown element type 'RES' (did you mean 'OTE'?)\" gives it the bump\n * it needs to self-correct on the next attempt.\n *\n * Implementation is a textbook Levenshtein distance with an early-exit\n * cap of 3. We only suggest if the closest valid keyword is within 2\n * edits AND meaningfully closer than the second-best — that avoids the\n * \"did you mean 'a'?\" noise when input was nonsense.\n */\n\n/** Edit distance with an upper-bound short-circuit. */\nfunction distance(a: string, b: string, cap: number): number {\n if (a === b) return 0;\n if (Math.abs(a.length - b.length) > cap) return cap + 1;\n const al = a.length;\n const bl = b.length;\n // Pre-pad shorter to longer.\n const prev = new Array<number>(bl + 1);\n const curr = new Array<number>(bl + 1);\n for (let j = 0; j <= bl; j++) prev[j] = j;\n for (let i = 1; i <= al; i++) {\n curr[0] = i;\n let rowMin = i;\n for (let j = 1; j <= bl; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n curr[j] = Math.min(\n prev[j]! + 1, // deletion\n curr[j - 1]! + 1, // insertion\n prev[j - 1]! + cost // substitution\n );\n if (curr[j]! < rowMin) rowMin = curr[j]!;\n }\n if (rowMin > cap) return cap + 1;\n for (let j = 0; j <= bl; j++) prev[j] = curr[j]!;\n }\n return prev[bl]!;\n}\n\n/**\n * Suggest the closest valid keyword to `input` from `candidates`.\n *\n * Returns the keyword if it's within edit distance 2 AND strictly closer\n * than every other candidate (i.e. unambiguous). Returns null otherwise.\n *\n * Comparison is case-insensitive. The returned suggestion preserves the\n * casing of the candidate, not the input.\n */\nexport function suggestKeyword(\n input: string,\n candidates: Iterable<string>\n): string | null {\n const needle = input.toLowerCase();\n let best: { word: string; dist: number } | null = null;\n let secondBest = Infinity;\n for (const c of candidates) {\n const d = distance(needle, c.toLowerCase(), 2);\n if (d > 2) continue;\n if (best === null || d < best.dist) {\n secondBest = best?.dist ?? Infinity;\n best = { word: c, dist: d };\n } else if (d < secondBest) {\n secondBest = d;\n }\n }\n if (best === null) return null;\n // Require strict separation so we don't pick arbitrarily between two\n // equally-close candidates (\"OTE\" vs \"OTL\" for \"OTX\" — useless).\n if (secondBest <= best.dist) return null;\n return best.word;\n}\n\n/**\n * Build a \"(did you mean 'X'?)\" suffix, or empty string if no good match.\n * Convenience wrapper so call sites read as one expression.\n */\nexport function didYouMean(input: string, candidates: Iterable<string>): string {\n const s = suggestKeyword(input, candidates);\n return s ? ` (did you mean '${s}'?)` : \"\";\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  'use strict';
2
2
 
3
+ var chunk3KRL2EGN_cjs = require('./chunk-3KRL2EGN.cjs');
3
4
  var chunkD7EHZFK4_cjs = require('./chunk-D7EHZFK4.cjs');
4
5
  var chunk3WNW5Y7P_cjs = require('./chunk-3WNW5Y7P.cjs');
5
6
 
@@ -291,6 +292,47 @@ function parseCssProps(s) {
291
292
  }
292
293
  return props;
293
294
  }
295
+ function extractInlineClasses(line2) {
296
+ const pairs = [];
297
+ let out = line2;
298
+ const re = /:::([A-Za-z_][\w-]*)/g;
299
+ let m;
300
+ const hits = [];
301
+ while ((m = re.exec(out)) !== null) {
302
+ hits.push({ start: m.index, end: m.index + m[0].length, name: m[1] });
303
+ }
304
+ if (hits.length === 0) return { stripped: line2, pairs };
305
+ for (let h = hits.length - 1; h >= 0; h--) {
306
+ const hit = hits[h];
307
+ const before = out.slice(0, hit.start);
308
+ let cursor = before.length;
309
+ const lastCh = before[cursor - 1];
310
+ if (lastCh === "]" || lastCh === ")" || lastCh === "}") {
311
+ const closer = lastCh;
312
+ const opener = closer === "]" ? "[" : closer === ")" ? "(" : "{";
313
+ let depth = 0;
314
+ let i = cursor - 1;
315
+ for (; i >= 0; i--) {
316
+ if (before[i] === closer) depth++;
317
+ else if (before[i] === opener) {
318
+ depth--;
319
+ if (depth === 0) break;
320
+ }
321
+ }
322
+ if (i >= 0) cursor = i;
323
+ }
324
+ const idEnd = cursor;
325
+ let idStart = idEnd;
326
+ while (idStart > 0 && /[A-Za-z0-9_-]/.test(before[idStart - 1])) idStart--;
327
+ if (idStart === idEnd) {
328
+ continue;
329
+ }
330
+ const id = before.slice(idStart, idEnd);
331
+ pairs.push({ id, className: hit.name });
332
+ out = out.slice(0, hit.start) + out.slice(hit.end);
333
+ }
334
+ return { stripped: out, pairs };
335
+ }
294
336
  function parseFlowchart(source) {
295
337
  const lines = source.replace(/\r\n/g, "\n").split("\n");
296
338
  const ast = {
@@ -333,10 +375,18 @@ function parseFlowchart(source) {
333
375
  ast.title = mQuoted ? mQuoted[1] : extra;
334
376
  }
335
377
  const subgraphStack = [];
378
+ const pendingInlineClasses = [];
336
379
  for (let i = headerIdx + 1; i < lines.length; i++) {
337
- const raw = lines[i];
380
+ const rawOriginal = lines[i];
381
+ const originalTrimmed = rawOriginal.trim();
382
+ if (originalTrimmed.length === 0 || originalTrimmed.startsWith("%%")) {
383
+ continue;
384
+ }
385
+ const { stripped, pairs } = extractInlineClasses(rawOriginal);
386
+ for (const p of pairs) pendingInlineClasses.push(p);
387
+ const raw = stripped;
338
388
  const trimmed = raw.trim();
339
- if (trimmed.length === 0 || trimmed.startsWith("%%")) continue;
389
+ if (trimmed.length === 0) continue;
340
390
  const sgMatch = /^subgraph(?:\s+(.*))?$/.exec(trimmed);
341
391
  if (sgMatch) {
342
392
  const sg = parseSubgraphHeader(sgMatch[1] ?? "", ast.subgraphs.length);
@@ -459,6 +509,11 @@ function parseFlowchart(source) {
459
509
  ast.edges.push(edge);
460
510
  }
461
511
  }
512
+ for (const { id, className } of pendingInlineClasses) {
513
+ const existing = nodeMap.get(id);
514
+ if (!existing) continue;
515
+ existing.classes = [...existing.classes ?? [], className];
516
+ }
462
517
  return ast;
463
518
  }
464
519
 
@@ -769,15 +824,27 @@ function isFullWidth(code) {
769
824
  if (code >= 131072 && code <= 196607) return true;
770
825
  return false;
771
826
  }
772
- function measureLabelWidth(label) {
827
+ function labelLines(label) {
828
+ return String(label).split(/<br\s*\/?>|\n/i).map((line2) => line2.replace(/<\/?[bi]>/gi, ""));
829
+ }
830
+ function measureLineWidth(line2) {
773
831
  let w = 0;
774
- for (const ch of label) {
832
+ for (const ch of line2) {
775
833
  const code = ch.codePointAt(0) ?? 0;
776
834
  if (isFullWidth(code)) w += FC_CONST.cjkCharWidth;
777
835
  else w += FC_CONST.charWidth;
778
836
  }
779
837
  return w;
780
838
  }
839
+ function measureLabelWidth(label) {
840
+ const lines = labelLines(label);
841
+ let max = 0;
842
+ for (const line2 of lines) {
843
+ const w = measureLineWidth(line2);
844
+ if (w > max) max = w;
845
+ }
846
+ return max;
847
+ }
781
848
  function greedyFAS(nodeIds, edges) {
782
849
  const outAdj = /* @__PURE__ */ new Map();
783
850
  const inAdj = /* @__PURE__ */ new Map();
@@ -1210,6 +1277,85 @@ function laneBasedXCoords(layerNodes, pathOf, nodeSpacingX, segments) {
1210
1277
  }
1211
1278
  return result;
1212
1279
  }
1280
+ function enforceSequentialClusterLayers(ast, layerMap, edges) {
1281
+ const sgParent = /* @__PURE__ */ new Map();
1282
+ for (const sg of ast.subgraphs) {
1283
+ for (const childSg of sg.subgraphs) sgParent.set(childSg, sg.id);
1284
+ if (!sgParent.has(sg.id)) sgParent.set(sg.id, void 0);
1285
+ }
1286
+ const topLevel = ast.subgraphs.filter((sg) => !sgParent.get(sg.id));
1287
+ if (topLevel.length < 2) return;
1288
+ const collect = (sgId) => {
1289
+ const sg = ast.subgraphs.find((s) => s.id === sgId);
1290
+ if (!sg) return [];
1291
+ const ids = [...sg.children];
1292
+ for (const childSgId of sg.subgraphs) ids.push(...collect(childSgId));
1293
+ return ids;
1294
+ };
1295
+ const adjOut = /* @__PURE__ */ new Map();
1296
+ for (const e of edges) {
1297
+ if (!adjOut.has(e.from)) adjOut.set(e.from, []);
1298
+ adjOut.get(e.from).push(e.to);
1299
+ }
1300
+ const hasForwardEdge = (srcSgId, dstSgId) => {
1301
+ const srcIds = new Set(collect(srcSgId));
1302
+ const dstIds = new Set(collect(dstSgId));
1303
+ for (const id of srcIds) {
1304
+ for (const t of adjOut.get(id) ?? []) {
1305
+ if (dstIds.has(t)) return true;
1306
+ }
1307
+ }
1308
+ return false;
1309
+ };
1310
+ const chains = [];
1311
+ let cur = [];
1312
+ for (let i = 0; i < topLevel.length; i++) {
1313
+ const sg = topLevel[i];
1314
+ if (i === 0 || !hasForwardEdge(topLevel[i - 1].id, sg.id)) {
1315
+ if (cur.length > 1) chains.push(cur);
1316
+ cur = [sg.id];
1317
+ } else {
1318
+ cur.push(sg.id);
1319
+ }
1320
+ }
1321
+ if (cur.length > 1) chains.push(cur);
1322
+ if (chains.length === 0) return;
1323
+ for (const chain of chains) {
1324
+ let prevMax = -Infinity;
1325
+ for (const clusterId of chain) {
1326
+ const ids = collect(clusterId);
1327
+ if (ids.length === 0) continue;
1328
+ let curMin = Infinity;
1329
+ let curMax = -Infinity;
1330
+ for (const id of ids) {
1331
+ const l = layerMap.get(id) ?? 0;
1332
+ if (l < curMin) curMin = l;
1333
+ if (l > curMax) curMax = l;
1334
+ }
1335
+ const requiredMin = prevMax === -Infinity ? curMin : prevMax + 1;
1336
+ if (curMin < requiredMin) {
1337
+ const shift = requiredMin - curMin;
1338
+ const toShift = new Set(ids);
1339
+ const queue = [...ids];
1340
+ while (queue.length > 0) {
1341
+ const u = queue.shift();
1342
+ for (const t of adjOut.get(u) ?? []) {
1343
+ if (!toShift.has(t)) {
1344
+ toShift.add(t);
1345
+ queue.push(t);
1346
+ }
1347
+ }
1348
+ }
1349
+ for (const id of toShift) {
1350
+ layerMap.set(id, (layerMap.get(id) ?? 0) + shift);
1351
+ }
1352
+ prevMax = curMax + shift;
1353
+ } else {
1354
+ prevMax = curMax;
1355
+ }
1356
+ }
1357
+ }
1358
+ }
1213
1359
  function hasOverlappingTopLevelClusters(ast, layerMap, sgParent) {
1214
1360
  const topLevel = ast.subgraphs.filter((sg) => !sgParent.get(sg.id));
1215
1361
  if (topLevel.length < 2) return false;
@@ -1246,7 +1392,9 @@ function layoutFlowchart(ast) {
1246
1392
  Math.ceil(rawTextW) + FC_CONST.labelHPad * 2
1247
1393
  );
1248
1394
  let shapeW = Math.max(FC_CONST.minNodeWidth, labelW);
1249
- let shapeH = FC_CONST.nodeHeight;
1395
+ const nLines = labelLines(n.label).length;
1396
+ const multilineH = nLines > 1 ? FC_CONST.nodeHeight + (nLines - 1) * 14 : FC_CONST.nodeHeight;
1397
+ let shapeH = multilineH;
1250
1398
  if (n.shape === "diamond") {
1251
1399
  shapeW = Math.max(shapeW, labelW * 1.4);
1252
1400
  shapeH = Math.max(shapeH, 52);
@@ -1303,6 +1451,7 @@ function layoutFlowchart(ast) {
1303
1451
  };
1304
1452
  });
1305
1453
  const layerMap = longestPathLayers(allIds, ledges);
1454
+ enforceSequentialClusterLayers(ast, layerMap, ledges);
1306
1455
  let dummyCounter = 0;
1307
1456
  const dummies = [];
1308
1457
  const { updatedEdges } = insertDummies(ledges, layerMap, () => {
@@ -2079,14 +2228,8 @@ function renderFlowchart(text2, themeName = "default") {
2079
2228
  var flowchart = {
2080
2229
  type: "flowchart",
2081
2230
  detect(text2) {
2082
- for (const raw of text2.split(/\r?\n/)) {
2083
- const t = raw.trim();
2084
- if (t.length === 0) continue;
2085
- if (t.startsWith("%%")) continue;
2086
- const first = t.split(/\s+/)[0]?.toLowerCase() ?? "";
2087
- return first === "flowchart" || first === "graph";
2088
- }
2089
- return false;
2231
+ const first = chunk3KRL2EGN_cjs.firstContentLine(text2)?.split(/\s+/)[0]?.toLowerCase() ?? "";
2232
+ return first === "flowchart" || first === "graph";
2090
2233
  },
2091
2234
  parse: parseFlowchart,
2092
2235
  render(text2, config) {
@@ -2101,5 +2244,5 @@ exports.layoutFlowchart = layoutFlowchart;
2101
2244
  exports.parseFlowchart = parseFlowchart;
2102
2245
  exports.renderFlowchart = renderFlowchart;
2103
2246
  exports.renderFlowchartAST = renderFlowchartAST;
2104
- //# sourceMappingURL=chunk-E2EJRVWS.cjs.map
2105
- //# sourceMappingURL=chunk-E2EJRVWS.cjs.map
2247
+ //# sourceMappingURL=chunk-QTNPMIO2.cjs.map
2248
+ //# sourceMappingURL=chunk-QTNPMIO2.cjs.map