@diagrammo/dgmo 0.45.0 → 0.47.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 (250) hide show
  1. package/dist/advanced.cjs +31 -25
  2. package/dist/advanced.d.cts +3 -855
  3. package/dist/advanced.d.ts +3 -855
  4. package/dist/advanced.js +541 -70101
  5. package/dist/analyzer-UYKBXAKR.js +15 -0
  6. package/dist/auto.cjs +500 -341
  7. package/dist/auto.css +342 -159
  8. package/dist/auto.d.cts +10 -8
  9. package/dist/auto.d.ts +10 -8
  10. package/dist/auto.js +373 -265
  11. package/dist/auto.mjs +500 -341
  12. package/dist/block.cjs +31 -25
  13. package/dist/block.js +83 -69411
  14. package/dist/calculator-LDYQCDDY.js +11 -0
  15. package/dist/charts-d3-QOZHKTCT.js +25 -0
  16. package/dist/chunk-2DXMZRWJ.js +800 -0
  17. package/dist/chunk-2LACINWN.js +786 -0
  18. package/dist/chunk-33LCUH4H.js +893 -0
  19. package/dist/chunk-3CIOJ5YJ.js +35 -0
  20. package/dist/chunk-3HDBAXF5.js +86 -0
  21. package/dist/chunk-3JLKYGBQ.js +290 -0
  22. package/dist/chunk-3MQQNXPD.js +415 -0
  23. package/dist/chunk-3R5POCTZ.js +967 -0
  24. package/dist/chunk-3SMGIJDD.js +112 -0
  25. package/dist/chunk-44CM72SQ.js +409 -0
  26. package/dist/chunk-4GRI7MEB.js +1604 -0
  27. package/dist/chunk-4OHACBGX.js +606 -0
  28. package/dist/chunk-5DH3KYFH.js +21 -0
  29. package/dist/chunk-5MLYVTYM.js +76 -0
  30. package/dist/chunk-5QXL4NYS.js +553 -0
  31. package/dist/chunk-5WRI5ZAA.js +31 -0
  32. package/dist/chunk-6EK55ART.js +117 -0
  33. package/dist/chunk-6FZYCKXB.js +2065 -0
  34. package/dist/chunk-6HO5ZTXK.js +277 -0
  35. package/dist/chunk-6KFWC4CO.js +7 -0
  36. package/dist/chunk-6MTWIQVO.js +121 -0
  37. package/dist/chunk-6NYWYNBI.js +329 -0
  38. package/dist/chunk-6SM5NJQH.js +620 -0
  39. package/dist/chunk-725LDASD.js +422 -0
  40. package/dist/chunk-76OWZ3BA.js +130 -0
  41. package/dist/chunk-7JEGTRLD.js +338 -0
  42. package/dist/chunk-A44USUV7.js +923 -0
  43. package/dist/chunk-A4GOY3PE.js +25 -0
  44. package/dist/chunk-A4VFQH5G.js +251 -0
  45. package/dist/chunk-AELOBFW5.js +375 -0
  46. package/dist/chunk-AN2MOO5T.js +522 -0
  47. package/dist/chunk-BMR4CIEO.js +41 -0
  48. package/dist/chunk-BS7SV7C3.js +51 -0
  49. package/dist/chunk-BUPDIHML.js +613 -0
  50. package/dist/chunk-BUVJFRPY.js +887 -0
  51. package/dist/chunk-C3Z4DX3V.js +112 -0
  52. package/dist/chunk-CI2G3OEB.js +1818 -0
  53. package/dist/chunk-CKNVO24D.js +54 -0
  54. package/dist/chunk-CUVHQHZ7.js +391 -0
  55. package/dist/chunk-CXK4DZH3.js +114 -0
  56. package/dist/chunk-DKEPS5LH.js +315 -0
  57. package/dist/chunk-DU7W62N5.js +487 -0
  58. package/dist/chunk-DZAQBW35.js +751 -0
  59. package/dist/chunk-EB6FPQUP.js +316 -0
  60. package/dist/chunk-EMS2SK26.js +376 -0
  61. package/dist/chunk-ERLBPDGU.js +510 -0
  62. package/dist/chunk-EVCVDTXE.js +732 -0
  63. package/dist/chunk-FCIIHT24.js +384 -0
  64. package/dist/chunk-FFUN5D66.js +97 -0
  65. package/dist/chunk-FITOLXSX.js +714 -0
  66. package/dist/chunk-FMDSF3OV.js +68 -0
  67. package/dist/chunk-FNB3PNGF.js +410 -0
  68. package/dist/chunk-G2H74XJZ.js +2104 -0
  69. package/dist/chunk-GMR5MFHJ.js +339 -0
  70. package/dist/chunk-H6PI3KJT.js +305 -0
  71. package/dist/chunk-I46X5VUA.js +59 -0
  72. package/dist/chunk-I5IGB56C.js +255 -0
  73. package/dist/chunk-IH6ZMVQ5.js +3950 -0
  74. package/dist/chunk-IJZFN3HM.js +463 -0
  75. package/dist/chunk-IPWPWM6R.js +3079 -0
  76. package/dist/chunk-IYULMRBE.js +23 -0
  77. package/dist/chunk-IZMRON6C.js +167 -0
  78. package/dist/chunk-J5FIXQRT.js +813 -0
  79. package/dist/chunk-JED6ZDEE.js +73 -0
  80. package/dist/chunk-JEUJOX5X.js +136 -0
  81. package/dist/chunk-JM4LEPY3.js +436 -0
  82. package/dist/chunk-L3UHP6TD.js +101 -0
  83. package/dist/chunk-L66GEFB6.js +524 -0
  84. package/dist/chunk-LIOHW36Z.js +469 -0
  85. package/dist/chunk-LP7EC4MI.js +16 -0
  86. package/dist/chunk-MITI6NOL.js +548 -0
  87. package/dist/chunk-MO5YHHMQ.js +168 -0
  88. package/dist/chunk-MZSBFAPJ.js +885 -0
  89. package/dist/chunk-NNAAJVBU.js +9 -0
  90. package/dist/chunk-NOTA6TEI.js +47 -0
  91. package/dist/chunk-NURGB5Z4.js +335 -0
  92. package/dist/chunk-NX4EQS3U.js +1062 -0
  93. package/dist/chunk-NXMESY4J.js +1 -0
  94. package/dist/chunk-OJR3MQYV.js +1458 -0
  95. package/dist/chunk-OURHMODR.js +454 -0
  96. package/dist/chunk-P235SVAH.js +1057 -0
  97. package/dist/chunk-P4RH4OSP.js +1038 -0
  98. package/dist/chunk-P6T66CCZ.js +226 -0
  99. package/dist/chunk-PBAHEPLQ.js +223 -0
  100. package/dist/chunk-PBHE5UG6.js +1530 -0
  101. package/dist/chunk-PDKUANDZ.js +35 -0
  102. package/dist/chunk-PWIHZ6NJ.js +296 -0
  103. package/dist/chunk-QEBUY5NY.js +1685 -0
  104. package/dist/chunk-QLCCJEJI.js +253 -0
  105. package/dist/chunk-QOOUC2J5.js +52 -0
  106. package/dist/chunk-QYTPPDAO.js +402 -0
  107. package/dist/chunk-R3XI2VC7.js +801 -0
  108. package/dist/chunk-RCERWOJR.js +154 -0
  109. package/dist/chunk-RJE5JTVK.js +362 -0
  110. package/dist/chunk-RTLBSQ3G.js +1155 -0
  111. package/dist/chunk-RUNNI6VE.js +448 -0
  112. package/dist/chunk-RVMRZAPB.js +354 -0
  113. package/dist/chunk-RYEGFMUO.js +955 -0
  114. package/dist/chunk-RZCF2VVM.js +528 -0
  115. package/dist/chunk-SML67VPV.js +1025 -0
  116. package/dist/chunk-SQ7IY53Q.js +44 -0
  117. package/dist/chunk-SQAG3UXH.js +161 -0
  118. package/dist/chunk-SRTU6HMQ.js +1851 -0
  119. package/dist/chunk-T2OE3YQB.js +550 -0
  120. package/dist/chunk-T3UBLACL.js +299 -0
  121. package/dist/chunk-TLVIHFRO.js +296 -0
  122. package/dist/chunk-TYS6CSS5.js +52 -0
  123. package/dist/chunk-U6EQI3U6.js +130 -0
  124. package/dist/chunk-UJ4FJLBF.js +86 -0
  125. package/dist/chunk-ULOEATBZ.js +347 -0
  126. package/dist/chunk-UNCCZ3NU.js +127 -0
  127. package/dist/chunk-USZW2HHU.js +197 -0
  128. package/dist/chunk-UWN33VNX.js +1610 -0
  129. package/dist/chunk-UZ7EZW3B.js +40 -0
  130. package/dist/chunk-VOKGH627.js +37 -0
  131. package/dist/chunk-WBRZJOEC.js +204 -0
  132. package/dist/chunk-WCSOJFU3.js +380 -0
  133. package/dist/chunk-WCT3NYCV.js +160 -0
  134. package/dist/chunk-WVAJFAIA.js +529 -0
  135. package/dist/chunk-X5LCYCL5.js +394 -0
  136. package/dist/chunk-XAKEUMEJ.js +1256 -0
  137. package/dist/chunk-Y2ZE3MSG.js +590 -0
  138. package/dist/chunk-Y3J7VR52.js +646 -0
  139. package/dist/chunk-Y5QGVTVC.js +33 -0
  140. package/dist/chunk-YAA6IID3.js +548 -0
  141. package/dist/chunk-YGJTDXVR.js +692 -0
  142. package/dist/chunk-YRYKTYMQ.js +186 -0
  143. package/dist/chunk-YYVTBZZC.js +61 -0
  144. package/dist/chunk-Z5CGSFJB.js +647 -0
  145. package/dist/chunk-Z72XRXD4.js +787 -0
  146. package/dist/chunk-ZGR7ULFJ.js +978 -0
  147. package/dist/chunk-ZJEL4H2R.js +851 -0
  148. package/dist/chunk-ZO27FGJS.js +554 -0
  149. package/dist/cli.cjs +112 -112
  150. package/dist/collapse-CLPJD2RL.js +11 -0
  151. package/dist/collapse-SLINJQW6.js +9 -0
  152. package/dist/collapse-ZWUFFCK2.js +9 -0
  153. package/dist/compute-G55RG53N.js +8 -0
  154. package/dist/dgmo-router-DZCIDUO5.js +73 -0
  155. package/dist/dimensions-J3FHIMJ6.js +22 -0
  156. package/dist/element.cjs +492 -325
  157. package/dist/element.js +367 -259
  158. package/dist/element.mjs +492 -325
  159. package/dist/flowchart-parser-ZNSKIBVR.js +21 -0
  160. package/dist/flowchart-renderer-ZAEOL4DX.js +35 -0
  161. package/dist/index.cjs +34 -28
  162. package/dist/index.d.cts +3 -469
  163. package/dist/index.d.ts +3 -469
  164. package/dist/index.js +137 -69679
  165. package/dist/layout-46N4JJYK.js +17 -0
  166. package/dist/layout-5RA6QWR6.js +26 -0
  167. package/dist/layout-5T6RH5M6.js +14 -0
  168. package/dist/layout-7QXCNOVS.js +13 -0
  169. package/dist/layout-EE6GE46Y.js +17 -0
  170. package/dist/layout-G23F7LDH.js +9 -0
  171. package/dist/layout-HRBZPFCN.js +23 -0
  172. package/dist/layout-HWDSRX5E.js +20 -0
  173. package/dist/layout-HYZPWAK5.js +18 -0
  174. package/dist/layout-N76NR4ZO.js +19 -0
  175. package/dist/layout-OB3RI63S.js +14 -0
  176. package/dist/layout-S2QBYSK2.js +15 -0
  177. package/dist/layout-UM5F4DJB.js +15 -0
  178. package/dist/layout-search-OYV77HHS.js +1655 -0
  179. package/dist/load-data-EHDDZ5ZS.js +8 -0
  180. package/dist/palettes-PRJ2RI6D.js +56 -0
  181. package/dist/parser-2MFP2H2E.js +11 -0
  182. package/dist/parser-3STE62GB.js +21 -0
  183. package/dist/parser-4FL2CMDG.js +18 -0
  184. package/dist/parser-4OGOBJJ4.js +13 -0
  185. package/dist/parser-6BTRLKRZ.js +15 -0
  186. package/dist/parser-AQETEVRW.js +21 -0
  187. package/dist/parser-CFZD5IBL.js +12 -0
  188. package/dist/parser-FUSKFGZN.js +16 -0
  189. package/dist/parser-I6KXEYFK.js +13 -0
  190. package/dist/parser-IXSZZQHY.js +18 -0
  191. package/dist/parser-JAL2HD4I.js +13 -0
  192. package/dist/parser-KNSQSKQO.js +20 -0
  193. package/dist/parser-N5O4IHUN.js +13 -0
  194. package/dist/parser-NGU3ETO6.js +16 -0
  195. package/dist/parser-NRAI6O25.js +19 -0
  196. package/dist/parser-O5J4VBII.js +11 -0
  197. package/dist/parser-OV7NOBW6.js +21 -0
  198. package/dist/parser-PQ3POX45.js +23 -0
  199. package/dist/parser-TFZFBVWN.js +11 -0
  200. package/dist/parser-TRTHDFPP.js +18 -0
  201. package/dist/parser-VQP2UJ6W.js +11 -0
  202. package/dist/parser-XDVELHRK.js +13 -0
  203. package/dist/parser-XKRP7QKP.js +11 -0
  204. package/dist/parser-Y6WTBU76.js +14 -0
  205. package/dist/parser-ZSDPZYQP.js +12 -0
  206. package/dist/renderer-2XQQQ6QR.js +28 -0
  207. package/dist/renderer-5NDVNDAZ.js +26 -0
  208. package/dist/renderer-6EEZHMH4.js +26 -0
  209. package/dist/renderer-6W5462RB.js +43 -0
  210. package/dist/renderer-7MVLWWQD.js +22 -0
  211. package/dist/renderer-AWWAF6XD.js +33 -0
  212. package/dist/renderer-BYCNMBF7.js +34 -0
  213. package/dist/renderer-CLJHQPBJ.js +29 -0
  214. package/dist/renderer-GHPZMFU2.js +15 -0
  215. package/dist/renderer-JGBKUCZD.js +16 -0
  216. package/dist/renderer-KQB7UGDS.js +19 -0
  217. package/dist/renderer-PGX2TKVS.js +24 -0
  218. package/dist/renderer-QIWVHWZO.js +15 -0
  219. package/dist/renderer-RPOA5YPZ.js +35 -0
  220. package/dist/renderer-SMIBCRVB.js +24 -0
  221. package/dist/renderer-T7YKC5VP.js +28 -0
  222. package/dist/renderer-TOCOVLHS.js +37 -0
  223. package/dist/renderer-UWA5XS74.js +39 -0
  224. package/dist/renderer-VACVQYML.js +25 -0
  225. package/dist/renderer-W4M6QLIJ.js +37 -0
  226. package/dist/renderer-WZRREQ2P.js +23 -0
  227. package/dist/renderer-YY2OSF6E.js +27 -0
  228. package/dist/renderer-Z7I3W2PP.js +24 -0
  229. package/dist/renderer-ZGNTUWC4.js +22 -0
  230. package/dist/renderer-ZTR3DER3.js +19 -0
  231. package/dist/renderer-radial-C32GPJQ7.js +21 -0
  232. package/dist/resolver-NOAA7ID7.js +13 -0
  233. package/dist/state-collapse-HCGD6IVJ.js +8 -0
  234. package/dist/state-parser-Z2V23ATR.js +18 -0
  235. package/dist/state-renderer-RFYHSP4K.js +34 -0
  236. package/dist/themes-1-CuKpeH.d.cts +908 -0
  237. package/dist/themes-1-CuKpeH.d.ts +908 -0
  238. package/package.json +1 -1
  239. package/src/auto/index.ts +55 -57
  240. package/src/auto/shared.ts +142 -142
  241. package/src/auto/styles.ts +44 -199
  242. package/src/c4/renderer.ts +2 -2
  243. package/src/element/index.ts +29 -21
  244. package/src/infra/renderer.ts +1 -1
  245. package/src/render.ts +34 -14
  246. package/src/sitemap/renderer.ts +1 -1
  247. package/src/timeline/renderer.ts +1 -1
  248. package/src/utils/hover-styles.ts +6 -1
  249. package/src/utils/legend-d3.ts +1 -4
  250. package/src/utils/legend-svg.ts +1 -1
@@ -0,0 +1,550 @@
1
+ import {
2
+ ScaleContext
3
+ } from "./chunk-YYVTBZZC.js";
4
+ import {
5
+ measureText,
6
+ truncateText
7
+ } from "./chunk-WCT3NYCV.js";
8
+ import {
9
+ preprocessDescriptionLine
10
+ } from "./chunk-IYULMRBE.js";
11
+ import {
12
+ injectDefaultTagMetadata,
13
+ resolveTagColor
14
+ } from "./chunk-QLCCJEJI.js";
15
+
16
+ // src/mindmap/text-wrap.ts
17
+ var H_PAD = 16;
18
+ var MAX_LABEL_LINES = 3;
19
+ var MAX_DESC_LINES = 2;
20
+ function tokenize(text) {
21
+ const tokens = [];
22
+ const parts = text.split(/(\s+)/);
23
+ for (const part of parts) {
24
+ if (/^\s+$/.test(part)) continue;
25
+ const hyphenParts = part.split(/(?<=-)(?=\S)/);
26
+ tokens.push(...hyphenParts);
27
+ }
28
+ return tokens;
29
+ }
30
+ function tryWrap(tokens, maxWidth, fontSize, maxLines) {
31
+ const availWidth = maxWidth - H_PAD;
32
+ const lines = [];
33
+ let currentLine = "";
34
+ for (const token of tokens) {
35
+ const sep = currentLine && !currentLine.endsWith("-") ? " " : "";
36
+ const candidate = currentLine + sep + token;
37
+ if (measureText(candidate, fontSize) <= availWidth) {
38
+ currentLine = candidate;
39
+ } else if (!currentLine) {
40
+ currentLine = token;
41
+ } else {
42
+ lines.push(currentLine);
43
+ if (lines.length >= maxLines) {
44
+ return null;
45
+ }
46
+ currentLine = token;
47
+ }
48
+ }
49
+ if (currentLine) {
50
+ lines.push(currentLine);
51
+ }
52
+ if (lines.length > maxLines) return null;
53
+ return lines;
54
+ }
55
+ function truncateLastLine(lines, maxWidth, fontSize) {
56
+ const availWidth = maxWidth - H_PAD;
57
+ const result = [...lines];
58
+ const last = result[result.length - 1];
59
+ if (measureText(last, fontSize) > availWidth) {
60
+ result[result.length - 1] = truncateText(last, fontSize, availWidth);
61
+ }
62
+ return result;
63
+ }
64
+ function wrapText(text, maxWidth, baseFontSize, minFontSize, maxLines = MAX_LABEL_LINES) {
65
+ if (!text) return { lines: [""], fontSize: baseFontSize };
66
+ const tokens = tokenize(text);
67
+ for (let fs = baseFontSize; fs >= minFontSize; fs--) {
68
+ const lines = tryWrap(tokens, maxWidth, fs, maxLines);
69
+ if (lines) {
70
+ return { lines: truncateLastLine(lines, maxWidth, fs), fontSize: fs };
71
+ }
72
+ }
73
+ const allLines = tryWrap(tokens, maxWidth, minFontSize, 999) ?? [text];
74
+ const capped = allLines.slice(0, maxLines);
75
+ const truncated = truncateLastLine(capped, maxWidth, minFontSize);
76
+ if (allLines.length > maxLines) {
77
+ const last = truncated[truncated.length - 1];
78
+ if (!last.endsWith("\u2026")) {
79
+ const availWidth = maxWidth - H_PAD;
80
+ if (measureText(last + "\u2026", minFontSize) > availWidth) {
81
+ truncated[truncated.length - 1] = truncateText(
82
+ last,
83
+ minFontSize,
84
+ availWidth
85
+ );
86
+ } else {
87
+ truncated[truncated.length - 1] = last + "\u2026";
88
+ }
89
+ }
90
+ }
91
+ return {
92
+ lines: truncated,
93
+ fontSize: minFontSize
94
+ };
95
+ }
96
+ var ROOT_FONT_SIZE = 17;
97
+ var MIN_FONT_SIZE = 9;
98
+ var FONT_STEP = 3;
99
+ var DESC_FONT_SIZE = 10;
100
+ function labelFontSize(depth) {
101
+ return Math.max(MIN_FONT_SIZE, ROOT_FONT_SIZE - depth * FONT_STEP);
102
+ }
103
+ function computeNodeText(label, description, depth, nodeWidth, hideDescriptions) {
104
+ const baseFontSize = labelFontSize(depth);
105
+ const labelResult = wrapText(
106
+ label,
107
+ nodeWidth,
108
+ baseFontSize,
109
+ MIN_FONT_SIZE,
110
+ MAX_LABEL_LINES
111
+ );
112
+ const descLines = [];
113
+ let descFontSize = DESC_FONT_SIZE;
114
+ if (!hideDescriptions && description && description.length > 0) {
115
+ let remaining = MAX_DESC_LINES;
116
+ for (const rawLine of description) {
117
+ if (remaining <= 0) break;
118
+ const line = preprocessDescriptionLine(rawLine);
119
+ const lineResult = wrapText(
120
+ line,
121
+ nodeWidth,
122
+ DESC_FONT_SIZE,
123
+ DESC_FONT_SIZE,
124
+ remaining
125
+ );
126
+ descLines.push(...lineResult.lines);
127
+ remaining -= lineResult.lines.length;
128
+ descFontSize = lineResult.fontSize;
129
+ }
130
+ }
131
+ return {
132
+ labelLines: labelResult.lines,
133
+ labelFontSize: labelResult.fontSize,
134
+ descLines,
135
+ descFontSize
136
+ };
137
+ }
138
+
139
+ // src/mindmap/layout.ts
140
+ var ROOT_WIDTH = 180;
141
+ var DEPTH1_WIDTH = 150;
142
+ var LEAF_WIDTH = 120;
143
+ var SINGLE_LABEL_HEIGHT = 28;
144
+ var LABEL_LINE_HEIGHT = 18;
145
+ var DESC_LINE_HEIGHT = 14;
146
+ var NODE_V_PAD = 10;
147
+ var H_GAP = 40;
148
+ var V_GAP = 12;
149
+ var MARGIN = 40;
150
+ var MULTI_ROOT_GAP = 60;
151
+ function layoutMindmap(parsed, _palette, options) {
152
+ const roots = parsed.roots;
153
+ if (roots.length === 0) {
154
+ return { nodes: [], edges: [], width: 0, height: 0 };
155
+ }
156
+ const hiddenCounts = options?.hiddenCounts ?? /* @__PURE__ */ new Map();
157
+ const activeTagGroup = options?.activeTagGroup ?? null;
158
+ const hideDescriptions = options?.hideDescriptions ?? false;
159
+ const ctx = options?.ctx ?? ScaleContext.identity();
160
+ const sc = {
161
+ rootWidth: ctx.structural(ROOT_WIDTH),
162
+ depth1Width: ctx.structural(DEPTH1_WIDTH),
163
+ leafWidth: ctx.structural(LEAF_WIDTH),
164
+ hGap: ctx.aesthetic(H_GAP),
165
+ vGap: ctx.aesthetic(V_GAP),
166
+ margin: ctx.aesthetic(MARGIN),
167
+ multiRootGap: ctx.aesthetic(MULTI_ROOT_GAP)
168
+ };
169
+ populateDepthCache(roots);
170
+ const allNodes = [];
171
+ const collectAll = (nodes) => {
172
+ for (const n of nodes) {
173
+ allNodes.push(n);
174
+ collectAll(n.children);
175
+ }
176
+ };
177
+ collectAll(roots);
178
+ injectDefaultTagMetadata(allNodes, parsed.tagGroups);
179
+ const tagGroups = parsed.tagGroups;
180
+ if (roots.length === 1) {
181
+ return layoutSingleRoot(
182
+ roots[0],
183
+ hiddenCounts,
184
+ hideDescriptions,
185
+ tagGroups,
186
+ activeTagGroup,
187
+ sc
188
+ );
189
+ }
190
+ return layoutMultiRoot(
191
+ roots,
192
+ parsed,
193
+ hiddenCounts,
194
+ hideDescriptions,
195
+ tagGroups,
196
+ activeTagGroup,
197
+ sc
198
+ );
199
+ }
200
+ function layoutSingleRoot(root, hiddenCounts, hideDescriptions, tagGroups = [], activeTagGroup = null, sc) {
201
+ const positioned = [];
202
+ const rootW = nodeWidthS(0, sc);
203
+ const rootH = nodeHeightS(root, hideDescriptions, sc);
204
+ const children = root.children;
205
+ const { right: rightChildren, left: leftChildren } = balancedSplitS(
206
+ children,
207
+ hideDescriptions,
208
+ sc
209
+ );
210
+ const rightHeight = computeGroupHeightS(
211
+ rightChildren,
212
+ 1,
213
+ hideDescriptions,
214
+ sc
215
+ );
216
+ const leftHeight = computeGroupHeightS(leftChildren, 1, hideDescriptions, sc);
217
+ const maxSideHeight = Math.max(rightHeight, leftHeight, rootH);
218
+ const rootX = 0;
219
+ const rootY = maxSideHeight / 2 - rootH / 2;
220
+ positioned.push({
221
+ node: root,
222
+ x: rootX,
223
+ y: rootY,
224
+ width: rootW,
225
+ height: rootH,
226
+ depth: 0,
227
+ direction: "right",
228
+ subtreeHeight: maxSideHeight
229
+ });
230
+ const rootCenterY = rootY + rootH / 2;
231
+ const rightStartX = rootX + rootW + sc.hGap;
232
+ layoutSideS(
233
+ rightChildren,
234
+ rightStartX,
235
+ rootCenterY,
236
+ 1,
237
+ "right",
238
+ hideDescriptions,
239
+ positioned,
240
+ sc
241
+ );
242
+ const leftStartX = rootX - sc.hGap;
243
+ layoutSideS(
244
+ leftChildren,
245
+ leftStartX,
246
+ rootCenterY,
247
+ 1,
248
+ "left",
249
+ hideDescriptions,
250
+ positioned,
251
+ sc
252
+ );
253
+ return finalizeS(
254
+ positioned,
255
+ hiddenCounts,
256
+ hideDescriptions,
257
+ root,
258
+ tagGroups,
259
+ activeTagGroup,
260
+ sc
261
+ );
262
+ }
263
+ function layoutMultiRoot(roots, _parsed, hiddenCounts, hideDescriptions, tagGroups, activeTagGroup, sc) {
264
+ const subResults = [];
265
+ for (const r of roots) {
266
+ subResults.push(
267
+ layoutSingleRoot(
268
+ r,
269
+ hiddenCounts,
270
+ hideDescriptions,
271
+ tagGroups,
272
+ activeTagGroup,
273
+ sc
274
+ )
275
+ );
276
+ }
277
+ const totalWidth = subResults.reduce((sum, r) => sum + r.width, 0) + sc.multiRootGap * (subResults.length - 1);
278
+ const maxHeight = Math.max(...subResults.map((r) => r.height));
279
+ const allNodes = [];
280
+ const allEdges = [];
281
+ let xOffset = 0;
282
+ for (const sub of subResults) {
283
+ const yOffset = (maxHeight - sub.height) / 2;
284
+ for (const n of sub.nodes) {
285
+ allNodes.push({ ...n, x: n.x + xOffset, y: n.y + yOffset });
286
+ }
287
+ for (const e of sub.edges) {
288
+ allEdges.push({
289
+ sourceId: e.sourceId,
290
+ targetId: e.targetId,
291
+ path: offsetPath(e.path, xOffset, yOffset)
292
+ });
293
+ }
294
+ xOffset += sub.width + sc.multiRootGap;
295
+ }
296
+ return {
297
+ nodes: allNodes,
298
+ edges: allEdges,
299
+ width: totalWidth,
300
+ height: maxHeight
301
+ };
302
+ }
303
+ function layoutSideS(children, startX, parentCenterY, depth, direction, hideDescriptions, positioned, sc) {
304
+ if (children.length === 0) return;
305
+ const groupHeight = computeGroupHeightS(
306
+ children,
307
+ depth,
308
+ hideDescriptions,
309
+ sc
310
+ );
311
+ let currentY = parentCenterY - groupHeight / 2;
312
+ for (const child of children) {
313
+ const w = nodeWidthS(depth, sc);
314
+ const h = nodeHeightS(child, hideDescriptions, sc);
315
+ const subtreeH = computeSubtreeHeightS(child, depth, hideDescriptions, sc);
316
+ const nodeY = currentY + subtreeH / 2 - h / 2;
317
+ const nodeX = direction === "right" ? startX : startX - w;
318
+ positioned.push({
319
+ node: child,
320
+ x: nodeX,
321
+ y: nodeY,
322
+ width: w,
323
+ height: h,
324
+ depth,
325
+ direction,
326
+ subtreeHeight: subtreeH
327
+ });
328
+ if (child.children.length > 0) {
329
+ const childCenterY = nodeY + h / 2;
330
+ const nextX = direction === "right" ? nodeX + w + sc.hGap : nodeX - sc.hGap;
331
+ layoutSideS(
332
+ child.children,
333
+ nextX,
334
+ childCenterY,
335
+ depth + 1,
336
+ direction,
337
+ hideDescriptions,
338
+ positioned,
339
+ sc
340
+ );
341
+ }
342
+ currentY += subtreeH + sc.vGap;
343
+ }
344
+ }
345
+ function computeGroupHeightS(children, depth, hideDescriptions, sc) {
346
+ if (children.length === 0) return 0;
347
+ let total = 0;
348
+ for (const child of children) {
349
+ total += computeSubtreeHeightS(child, depth, hideDescriptions, sc);
350
+ }
351
+ total += sc.vGap * (children.length - 1);
352
+ return total;
353
+ }
354
+ function computeSubtreeHeightS(node, depth, hideDescriptions, sc) {
355
+ const h = nodeHeightS(node, hideDescriptions, sc);
356
+ if (node.children.length === 0) return h;
357
+ const childrenHeight = computeGroupHeightS(
358
+ node.children,
359
+ depth + 1,
360
+ hideDescriptions,
361
+ sc
362
+ );
363
+ return Math.max(h, childrenHeight);
364
+ }
365
+ function resolveNodeColor(node, tagGroups, activeGroupName) {
366
+ if (node.color) return node.color;
367
+ return resolveTagColor(node.metadata, [...tagGroups], activeGroupName);
368
+ }
369
+ function finalizeS(positioned, hiddenCounts, _hideDescriptions, _rootMindmapNode, tagGroups = [], activeTagGroup = null, sc) {
370
+ let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
371
+ for (const p of positioned) {
372
+ minX = Math.min(minX, p.x);
373
+ minY = Math.min(minY, p.y);
374
+ maxX = Math.max(maxX, p.x + p.width);
375
+ maxY = Math.max(maxY, p.y + p.height);
376
+ }
377
+ const offsetX = -minX + sc.margin;
378
+ const offsetY = -minY + sc.margin;
379
+ const totalWidth = maxX - minX + sc.margin * 2;
380
+ const totalHeight = maxY - minY + sc.margin * 2;
381
+ const nodeMap = /* @__PURE__ */ new Map();
382
+ for (const p of positioned) {
383
+ nodeMap.set(p.node.id, p);
384
+ }
385
+ const nodes = [];
386
+ const edges = [];
387
+ for (const p of positioned) {
388
+ const resolvedColor = resolveNodeColor(p.node, tagGroups, activeTagGroup);
389
+ const hiddenCount = hiddenCounts.get(p.node.id);
390
+ nodes.push({
391
+ id: p.node.id,
392
+ label: p.node.label,
393
+ ...p.node.description !== void 0 && {
394
+ description: [...p.node.description]
395
+ },
396
+ metadata: { ...p.node.metadata },
397
+ lineNumber: p.node.lineNumber,
398
+ ...resolvedColor !== void 0 && { color: resolvedColor },
399
+ x: p.x + offsetX,
400
+ y: p.y + offsetY,
401
+ width: p.width,
402
+ height: p.height,
403
+ depth: p.depth,
404
+ angle: 0,
405
+ radius: 0,
406
+ ...hiddenCount !== void 0 && { hiddenCount },
407
+ hasChildren: hiddenCounts.has(p.node.id) || p.node.children.length > 0
408
+ });
409
+ }
410
+ const childrenByParent = /* @__PURE__ */ new Map();
411
+ for (const p of positioned) {
412
+ if (p.node.parentId) {
413
+ const arr = childrenByParent.get(p.node.parentId) ?? [];
414
+ arr.push(p);
415
+ childrenByParent.set(p.node.parentId, arr);
416
+ }
417
+ }
418
+ const groupedEdges = [];
419
+ for (const [parentId, children] of childrenByParent) {
420
+ const rightKids = children.filter((c) => c.direction === "right");
421
+ const leftKids = children.filter((c) => c.direction === "left");
422
+ if (rightKids.length > 0) groupedEdges.push([parentId, rightKids]);
423
+ if (leftKids.length > 0) groupedEdges.push([parentId, leftKids]);
424
+ }
425
+ for (const [parentId, children] of groupedEdges) {
426
+ const parent = nodeMap.get(parentId);
427
+ const px = parent.x + offsetX;
428
+ const py = parent.y + offsetY;
429
+ const isLeft = children[0].direction === "left";
430
+ const srcX = isLeft ? px : px + parent.width;
431
+ const srcY = py + parent.height / 2;
432
+ const firstChild = children[0];
433
+ const childEdgeX = isLeft ? firstChild.x + offsetX + firstChild.width : firstChild.x + offsetX;
434
+ const midX = (srcX + childEdgeX) / 2;
435
+ if (children.length === 1) {
436
+ const c = children[0];
437
+ const tgtX = isLeft ? c.x + offsetX + c.width : c.x + offsetX;
438
+ const tgtY = c.y + offsetY + c.height / 2;
439
+ edges.push({
440
+ sourceId: parentId,
441
+ targetId: c.node.id,
442
+ path: `M ${srcX} ${srcY} L ${midX} ${srcY} L ${midX} ${tgtY} L ${tgtX} ${tgtY}`
443
+ });
444
+ } else {
445
+ edges.push({
446
+ sourceId: parentId,
447
+ targetId: parentId,
448
+ // self-ref = trunk
449
+ path: `M ${srcX} ${srcY} L ${midX} ${srcY}`
450
+ });
451
+ const childYs = children.map((c) => c.y + offsetY + c.height / 2);
452
+ const minChildY = Math.min(...childYs);
453
+ const maxChildY = Math.max(...childYs);
454
+ edges.push({
455
+ sourceId: parentId,
456
+ targetId: parentId,
457
+ // self-ref = bar
458
+ path: `M ${midX} ${minChildY} L ${midX} ${maxChildY}`
459
+ });
460
+ for (let i = 0; i < children.length; i++) {
461
+ const c = children[i];
462
+ const tgtX = isLeft ? c.x + offsetX + c.width : c.x + offsetX;
463
+ const tgtY = childYs[i];
464
+ edges.push({
465
+ sourceId: parentId,
466
+ targetId: c.node.id,
467
+ path: `M ${midX} ${tgtY} L ${tgtX} ${tgtY}`
468
+ });
469
+ }
470
+ }
471
+ }
472
+ return { nodes, edges, width: totalWidth, height: totalHeight };
473
+ }
474
+ function balancedSplitS(children, hideDescriptions, sc) {
475
+ if (children.length <= 1) {
476
+ return { right: [...children], left: [] };
477
+ }
478
+ if (children.length === 2) {
479
+ return { right: [children[0]], left: [children[1]] };
480
+ }
481
+ const weights = children.map((c, i) => ({
482
+ index: i,
483
+ node: c,
484
+ height: computeSubtreeHeightS(c, 1, hideDescriptions, sc)
485
+ }));
486
+ const right = [];
487
+ const left = [];
488
+ let rightWeight = 0;
489
+ let leftWeight = 0;
490
+ for (const w of weights) {
491
+ if (rightWeight <= leftWeight) {
492
+ right.push(w.node);
493
+ rightWeight += w.height;
494
+ } else {
495
+ left.push(w.node);
496
+ leftWeight += w.height;
497
+ }
498
+ }
499
+ return { right, left };
500
+ }
501
+ function offsetPath(path, dx, dy) {
502
+ if (dx === 0 && dy === 0) return path;
503
+ return path.replace(
504
+ /([ML])\s*([\d.e+-]+)\s+([\d.e+-]+)/g,
505
+ (_, cmd, x, y) => `${cmd} ${parseFloat(x) + dx} ${parseFloat(y) + dy}`
506
+ );
507
+ }
508
+ function nodeWidthS(depth, sc) {
509
+ if (depth === 0) return sc.rootWidth;
510
+ if (depth === 1) return sc.depth1Width;
511
+ return sc.leafWidth;
512
+ }
513
+ function nodeHeightS(node, hideDescriptions, sc) {
514
+ const depth = getNodeDepth(node);
515
+ const w = nodeWidthS(depth, sc);
516
+ const text = computeNodeText(
517
+ node.label,
518
+ node.description ? [...node.description] : void 0,
519
+ depth,
520
+ w,
521
+ hideDescriptions
522
+ );
523
+ const labelLineCount = text.labelLines.length;
524
+ const labelH = labelLineCount <= 1 ? SINGLE_LABEL_HEIGHT : LABEL_LINE_HEIGHT * labelLineCount;
525
+ let h = labelH + NODE_V_PAD;
526
+ if (text.descLines.length > 0) {
527
+ h += DESC_LINE_HEIGHT * text.descLines.length + 4;
528
+ }
529
+ return h;
530
+ }
531
+ function getNodeDepth(node) {
532
+ return nodeDepthCache.get(node.id) ?? 0;
533
+ }
534
+ var nodeDepthCache = /* @__PURE__ */ new Map();
535
+ function populateDepthCache(roots) {
536
+ nodeDepthCache.clear();
537
+ const walk = (nodes, depth) => {
538
+ for (const n of nodes) {
539
+ nodeDepthCache.set(n.id, depth);
540
+ walk(n.children, depth + 1);
541
+ }
542
+ };
543
+ walk(roots, 0);
544
+ }
545
+
546
+ export {
547
+ computeNodeText,
548
+ layoutMindmap
549
+ };
550
+ //# sourceMappingURL=chunk-T2OE3YQB.js.map