@diagrammo/dgmo 0.46.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 (232) hide show
  1. package/dist/advanced.d.cts +3 -855
  2. package/dist/advanced.d.ts +3 -855
  3. package/dist/advanced.js +541 -70107
  4. package/dist/analyzer-UYKBXAKR.js +15 -0
  5. package/dist/auto.cjs +1 -1
  6. package/dist/auto.js +1 -1
  7. package/dist/auto.mjs +1 -1
  8. package/dist/block.js +83 -69417
  9. package/dist/calculator-LDYQCDDY.js +11 -0
  10. package/dist/charts-d3-QOZHKTCT.js +25 -0
  11. package/dist/chunk-2DXMZRWJ.js +800 -0
  12. package/dist/chunk-2LACINWN.js +786 -0
  13. package/dist/chunk-33LCUH4H.js +893 -0
  14. package/dist/chunk-3CIOJ5YJ.js +35 -0
  15. package/dist/chunk-3HDBAXF5.js +86 -0
  16. package/dist/chunk-3JLKYGBQ.js +290 -0
  17. package/dist/chunk-3MQQNXPD.js +415 -0
  18. package/dist/chunk-3R5POCTZ.js +967 -0
  19. package/dist/chunk-3SMGIJDD.js +112 -0
  20. package/dist/chunk-44CM72SQ.js +409 -0
  21. package/dist/chunk-4GRI7MEB.js +1604 -0
  22. package/dist/chunk-4OHACBGX.js +606 -0
  23. package/dist/chunk-5DH3KYFH.js +21 -0
  24. package/dist/chunk-5MLYVTYM.js +76 -0
  25. package/dist/chunk-5QXL4NYS.js +553 -0
  26. package/dist/chunk-5WRI5ZAA.js +31 -0
  27. package/dist/chunk-6EK55ART.js +117 -0
  28. package/dist/chunk-6FZYCKXB.js +2065 -0
  29. package/dist/chunk-6HO5ZTXK.js +277 -0
  30. package/dist/chunk-6KFWC4CO.js +7 -0
  31. package/dist/chunk-6MTWIQVO.js +121 -0
  32. package/dist/chunk-6NYWYNBI.js +329 -0
  33. package/dist/chunk-6SM5NJQH.js +620 -0
  34. package/dist/chunk-725LDASD.js +422 -0
  35. package/dist/chunk-76OWZ3BA.js +130 -0
  36. package/dist/chunk-7JEGTRLD.js +338 -0
  37. package/dist/chunk-A44USUV7.js +923 -0
  38. package/dist/chunk-A4GOY3PE.js +25 -0
  39. package/dist/chunk-A4VFQH5G.js +251 -0
  40. package/dist/chunk-AELOBFW5.js +375 -0
  41. package/dist/chunk-AN2MOO5T.js +522 -0
  42. package/dist/chunk-BMR4CIEO.js +41 -0
  43. package/dist/chunk-BS7SV7C3.js +51 -0
  44. package/dist/chunk-BUPDIHML.js +613 -0
  45. package/dist/chunk-BUVJFRPY.js +887 -0
  46. package/dist/chunk-C3Z4DX3V.js +112 -0
  47. package/dist/chunk-CI2G3OEB.js +1818 -0
  48. package/dist/chunk-CKNVO24D.js +54 -0
  49. package/dist/chunk-CUVHQHZ7.js +391 -0
  50. package/dist/chunk-CXK4DZH3.js +114 -0
  51. package/dist/chunk-DKEPS5LH.js +315 -0
  52. package/dist/chunk-DU7W62N5.js +487 -0
  53. package/dist/chunk-DZAQBW35.js +751 -0
  54. package/dist/chunk-EB6FPQUP.js +316 -0
  55. package/dist/chunk-EMS2SK26.js +376 -0
  56. package/dist/chunk-ERLBPDGU.js +510 -0
  57. package/dist/chunk-EVCVDTXE.js +732 -0
  58. package/dist/chunk-FCIIHT24.js +384 -0
  59. package/dist/chunk-FFUN5D66.js +97 -0
  60. package/dist/chunk-FITOLXSX.js +714 -0
  61. package/dist/chunk-FMDSF3OV.js +68 -0
  62. package/dist/chunk-FNB3PNGF.js +410 -0
  63. package/dist/chunk-G2H74XJZ.js +2104 -0
  64. package/dist/chunk-GMR5MFHJ.js +339 -0
  65. package/dist/chunk-H6PI3KJT.js +305 -0
  66. package/dist/chunk-I46X5VUA.js +59 -0
  67. package/dist/chunk-I5IGB56C.js +255 -0
  68. package/dist/chunk-IH6ZMVQ5.js +3950 -0
  69. package/dist/chunk-IJZFN3HM.js +463 -0
  70. package/dist/chunk-IPWPWM6R.js +3079 -0
  71. package/dist/chunk-IYULMRBE.js +23 -0
  72. package/dist/chunk-IZMRON6C.js +167 -0
  73. package/dist/chunk-J5FIXQRT.js +813 -0
  74. package/dist/chunk-JED6ZDEE.js +73 -0
  75. package/dist/chunk-JEUJOX5X.js +136 -0
  76. package/dist/chunk-JM4LEPY3.js +436 -0
  77. package/dist/chunk-L3UHP6TD.js +101 -0
  78. package/dist/chunk-L66GEFB6.js +524 -0
  79. package/dist/chunk-LIOHW36Z.js +469 -0
  80. package/dist/chunk-LP7EC4MI.js +16 -0
  81. package/dist/chunk-MITI6NOL.js +548 -0
  82. package/dist/chunk-MO5YHHMQ.js +168 -0
  83. package/dist/chunk-MZSBFAPJ.js +885 -0
  84. package/dist/chunk-NNAAJVBU.js +9 -0
  85. package/dist/chunk-NOTA6TEI.js +47 -0
  86. package/dist/chunk-NURGB5Z4.js +335 -0
  87. package/dist/chunk-NX4EQS3U.js +1062 -0
  88. package/dist/chunk-NXMESY4J.js +1 -0
  89. package/dist/chunk-OJR3MQYV.js +1458 -0
  90. package/dist/chunk-OURHMODR.js +454 -0
  91. package/dist/chunk-P235SVAH.js +1057 -0
  92. package/dist/chunk-P4RH4OSP.js +1038 -0
  93. package/dist/chunk-P6T66CCZ.js +226 -0
  94. package/dist/chunk-PBAHEPLQ.js +223 -0
  95. package/dist/chunk-PBHE5UG6.js +1530 -0
  96. package/dist/chunk-PDKUANDZ.js +35 -0
  97. package/dist/chunk-PWIHZ6NJ.js +296 -0
  98. package/dist/chunk-QEBUY5NY.js +1685 -0
  99. package/dist/chunk-QLCCJEJI.js +253 -0
  100. package/dist/chunk-QOOUC2J5.js +52 -0
  101. package/dist/chunk-QYTPPDAO.js +402 -0
  102. package/dist/chunk-R3XI2VC7.js +801 -0
  103. package/dist/chunk-RCERWOJR.js +154 -0
  104. package/dist/chunk-RJE5JTVK.js +362 -0
  105. package/dist/chunk-RTLBSQ3G.js +1155 -0
  106. package/dist/chunk-RUNNI6VE.js +448 -0
  107. package/dist/chunk-RVMRZAPB.js +354 -0
  108. package/dist/chunk-RYEGFMUO.js +955 -0
  109. package/dist/chunk-RZCF2VVM.js +528 -0
  110. package/dist/chunk-SML67VPV.js +1025 -0
  111. package/dist/chunk-SQ7IY53Q.js +44 -0
  112. package/dist/chunk-SQAG3UXH.js +161 -0
  113. package/dist/chunk-SRTU6HMQ.js +1851 -0
  114. package/dist/chunk-T2OE3YQB.js +550 -0
  115. package/dist/chunk-T3UBLACL.js +299 -0
  116. package/dist/chunk-TLVIHFRO.js +296 -0
  117. package/dist/chunk-TYS6CSS5.js +52 -0
  118. package/dist/chunk-U6EQI3U6.js +130 -0
  119. package/dist/chunk-UJ4FJLBF.js +86 -0
  120. package/dist/chunk-ULOEATBZ.js +347 -0
  121. package/dist/chunk-UNCCZ3NU.js +127 -0
  122. package/dist/chunk-USZW2HHU.js +197 -0
  123. package/dist/chunk-UWN33VNX.js +1610 -0
  124. package/dist/chunk-UZ7EZW3B.js +40 -0
  125. package/dist/chunk-VOKGH627.js +37 -0
  126. package/dist/chunk-WBRZJOEC.js +204 -0
  127. package/dist/chunk-WCSOJFU3.js +380 -0
  128. package/dist/chunk-WCT3NYCV.js +160 -0
  129. package/dist/chunk-WVAJFAIA.js +529 -0
  130. package/dist/chunk-X5LCYCL5.js +394 -0
  131. package/dist/chunk-XAKEUMEJ.js +1256 -0
  132. package/dist/chunk-Y2ZE3MSG.js +590 -0
  133. package/dist/chunk-Y3J7VR52.js +646 -0
  134. package/dist/chunk-Y5QGVTVC.js +33 -0
  135. package/dist/chunk-YAA6IID3.js +548 -0
  136. package/dist/chunk-YGJTDXVR.js +692 -0
  137. package/dist/chunk-YRYKTYMQ.js +186 -0
  138. package/dist/chunk-YYVTBZZC.js +61 -0
  139. package/dist/chunk-Z5CGSFJB.js +647 -0
  140. package/dist/chunk-Z72XRXD4.js +787 -0
  141. package/dist/chunk-ZGR7ULFJ.js +978 -0
  142. package/dist/chunk-ZJEL4H2R.js +851 -0
  143. package/dist/chunk-ZO27FGJS.js +554 -0
  144. package/dist/collapse-CLPJD2RL.js +11 -0
  145. package/dist/collapse-SLINJQW6.js +9 -0
  146. package/dist/collapse-ZWUFFCK2.js +9 -0
  147. package/dist/compute-G55RG53N.js +8 -0
  148. package/dist/dgmo-router-DZCIDUO5.js +73 -0
  149. package/dist/dimensions-J3FHIMJ6.js +22 -0
  150. package/dist/element.cjs +1 -1
  151. package/dist/element.js +1 -1
  152. package/dist/element.mjs +1 -1
  153. package/dist/flowchart-parser-ZNSKIBVR.js +21 -0
  154. package/dist/flowchart-renderer-ZAEOL4DX.js +35 -0
  155. package/dist/index.cjs +3 -3
  156. package/dist/index.d.cts +3 -469
  157. package/dist/index.d.ts +3 -469
  158. package/dist/index.js +137 -69685
  159. package/dist/layout-46N4JJYK.js +17 -0
  160. package/dist/layout-5RA6QWR6.js +26 -0
  161. package/dist/layout-5T6RH5M6.js +14 -0
  162. package/dist/layout-7QXCNOVS.js +13 -0
  163. package/dist/layout-EE6GE46Y.js +17 -0
  164. package/dist/layout-G23F7LDH.js +9 -0
  165. package/dist/layout-HRBZPFCN.js +23 -0
  166. package/dist/layout-HWDSRX5E.js +20 -0
  167. package/dist/layout-HYZPWAK5.js +18 -0
  168. package/dist/layout-N76NR4ZO.js +19 -0
  169. package/dist/layout-OB3RI63S.js +14 -0
  170. package/dist/layout-S2QBYSK2.js +15 -0
  171. package/dist/layout-UM5F4DJB.js +15 -0
  172. package/dist/layout-search-OYV77HHS.js +1655 -0
  173. package/dist/load-data-EHDDZ5ZS.js +8 -0
  174. package/dist/palettes-PRJ2RI6D.js +56 -0
  175. package/dist/parser-2MFP2H2E.js +11 -0
  176. package/dist/parser-3STE62GB.js +21 -0
  177. package/dist/parser-4FL2CMDG.js +18 -0
  178. package/dist/parser-4OGOBJJ4.js +13 -0
  179. package/dist/parser-6BTRLKRZ.js +15 -0
  180. package/dist/parser-AQETEVRW.js +21 -0
  181. package/dist/parser-CFZD5IBL.js +12 -0
  182. package/dist/parser-FUSKFGZN.js +16 -0
  183. package/dist/parser-I6KXEYFK.js +13 -0
  184. package/dist/parser-IXSZZQHY.js +18 -0
  185. package/dist/parser-JAL2HD4I.js +13 -0
  186. package/dist/parser-KNSQSKQO.js +20 -0
  187. package/dist/parser-N5O4IHUN.js +13 -0
  188. package/dist/parser-NGU3ETO6.js +16 -0
  189. package/dist/parser-NRAI6O25.js +19 -0
  190. package/dist/parser-O5J4VBII.js +11 -0
  191. package/dist/parser-OV7NOBW6.js +21 -0
  192. package/dist/parser-PQ3POX45.js +23 -0
  193. package/dist/parser-TFZFBVWN.js +11 -0
  194. package/dist/parser-TRTHDFPP.js +18 -0
  195. package/dist/parser-VQP2UJ6W.js +11 -0
  196. package/dist/parser-XDVELHRK.js +13 -0
  197. package/dist/parser-XKRP7QKP.js +11 -0
  198. package/dist/parser-Y6WTBU76.js +14 -0
  199. package/dist/parser-ZSDPZYQP.js +12 -0
  200. package/dist/renderer-2XQQQ6QR.js +28 -0
  201. package/dist/renderer-5NDVNDAZ.js +26 -0
  202. package/dist/renderer-6EEZHMH4.js +26 -0
  203. package/dist/renderer-6W5462RB.js +43 -0
  204. package/dist/renderer-7MVLWWQD.js +22 -0
  205. package/dist/renderer-AWWAF6XD.js +33 -0
  206. package/dist/renderer-BYCNMBF7.js +34 -0
  207. package/dist/renderer-CLJHQPBJ.js +29 -0
  208. package/dist/renderer-GHPZMFU2.js +15 -0
  209. package/dist/renderer-JGBKUCZD.js +16 -0
  210. package/dist/renderer-KQB7UGDS.js +19 -0
  211. package/dist/renderer-PGX2TKVS.js +24 -0
  212. package/dist/renderer-QIWVHWZO.js +15 -0
  213. package/dist/renderer-RPOA5YPZ.js +35 -0
  214. package/dist/renderer-SMIBCRVB.js +24 -0
  215. package/dist/renderer-T7YKC5VP.js +28 -0
  216. package/dist/renderer-TOCOVLHS.js +37 -0
  217. package/dist/renderer-UWA5XS74.js +39 -0
  218. package/dist/renderer-VACVQYML.js +25 -0
  219. package/dist/renderer-W4M6QLIJ.js +37 -0
  220. package/dist/renderer-WZRREQ2P.js +23 -0
  221. package/dist/renderer-YY2OSF6E.js +27 -0
  222. package/dist/renderer-Z7I3W2PP.js +24 -0
  223. package/dist/renderer-ZGNTUWC4.js +22 -0
  224. package/dist/renderer-ZTR3DER3.js +19 -0
  225. package/dist/renderer-radial-C32GPJQ7.js +21 -0
  226. package/dist/resolver-NOAA7ID7.js +13 -0
  227. package/dist/state-collapse-HCGD6IVJ.js +8 -0
  228. package/dist/state-parser-Z2V23ATR.js +18 -0
  229. package/dist/state-renderer-RFYHSP4K.js +34 -0
  230. package/dist/themes-1-CuKpeH.d.cts +908 -0
  231. package/dist/themes-1-CuKpeH.d.ts +908 -0
  232. package/package.json +1 -1
@@ -0,0 +1,813 @@
1
+ import {
2
+ LEGEND_CAPSULE_PAD,
3
+ LEGEND_DOT_R,
4
+ LEGEND_ENTRY_DOT_GAP,
5
+ LEGEND_ENTRY_FONT_SIZE,
6
+ LEGEND_ENTRY_TRAIL,
7
+ LEGEND_EYE_GAP,
8
+ LEGEND_EYE_SIZE,
9
+ LEGEND_GROUP_GAP,
10
+ LEGEND_HEIGHT,
11
+ LEGEND_PILL_FONT_SIZE,
12
+ LEGEND_PILL_PAD,
13
+ measureLegendText
14
+ } from "./chunk-QOOUC2J5.js";
15
+ import {
16
+ measureText
17
+ } from "./chunk-WCT3NYCV.js";
18
+ import {
19
+ injectDefaultTagMetadata,
20
+ resolveTagColor,
21
+ tagAttrKey
22
+ } from "./chunk-QLCCJEJI.js";
23
+
24
+ // src/org/layout.ts
25
+ import { hierarchy, tree } from "d3-hierarchy";
26
+ var LABEL_FONT_SIZE = 13;
27
+ var META_FONT_SIZE = 11;
28
+ var META_LINE_HEIGHT = 16;
29
+ var HEADER_HEIGHT = 28;
30
+ var SEPARATOR_GAP = 6;
31
+ var CARD_H_PAD = 20;
32
+ var CARD_V_PAD = 10;
33
+ var MIN_CARD_WIDTH = 140;
34
+ var H_GAP = 30;
35
+ var V_GAP = 50;
36
+ var MARGIN = 40;
37
+ var CONTAINER_PAD_X = 24;
38
+ var CONTAINER_PAD_BOTTOM = 24;
39
+ var CONTAINER_LABEL_HEIGHT = 28;
40
+ var CONTAINER_META_LINE_HEIGHT = 16;
41
+ var STACK_V_GAP = 20;
42
+ function countDescendantNodes(node, hiddenCounts) {
43
+ let count = 0;
44
+ for (const child of node.children) {
45
+ count += (child.isContainer ? 0 : 1) + countDescendantNodes(child, hiddenCounts);
46
+ const hc = hiddenCounts?.get(child.id);
47
+ if (hc) count += hc;
48
+ }
49
+ return count;
50
+ }
51
+ function filterMetadata(metadata, hiddenAttributes) {
52
+ if (!hiddenAttributes || hiddenAttributes.size === 0) return metadata;
53
+ const filtered = {};
54
+ for (const [key, value] of Object.entries(metadata)) {
55
+ if (!hiddenAttributes.has(key)) {
56
+ filtered[key] = value;
57
+ }
58
+ }
59
+ return filtered;
60
+ }
61
+ function computeCardWidth(label, meta) {
62
+ let maxTextWidth = measureText(label, LABEL_FONT_SIZE);
63
+ for (const [key, value] of Object.entries(meta)) {
64
+ const lineWidth = measureText(`${key}: ${value}`, META_FONT_SIZE);
65
+ if (lineWidth > maxTextWidth) maxTextWidth = lineWidth;
66
+ }
67
+ return Math.max(MIN_CARD_WIDTH, Math.ceil(maxTextWidth) + CARD_H_PAD * 2);
68
+ }
69
+ function computeCardHeight(meta) {
70
+ const metaCount = Object.keys(meta).length;
71
+ if (metaCount === 0) return HEADER_HEIGHT + CARD_V_PAD;
72
+ return HEADER_HEIGHT + SEPARATOR_GAP + metaCount * META_LINE_HEIGHT + CARD_V_PAD;
73
+ }
74
+ function resolveNodeColor(node, tagGroups, activeGroupName) {
75
+ if (node.color) return node.color;
76
+ return resolveTagColor(
77
+ node.metadata,
78
+ [...tagGroups],
79
+ activeGroupName,
80
+ node.isContainer
81
+ );
82
+ }
83
+ function buildTreeNodes(nodes, hiddenCounts, hiddenAttributes, subNodeLabel, showSubNodeCount) {
84
+ return nodes.map((orgNode) => {
85
+ const meta = filterMetadata(orgNode.metadata, hiddenAttributes);
86
+ const hc = hiddenCounts?.get(orgNode.id);
87
+ if (!orgNode.isContainer && showSubNodeCount && !(hc != null && hc > 0)) {
88
+ const count = countDescendantNodes(orgNode, hiddenCounts);
89
+ if (count > 0) {
90
+ meta[subNodeLabel ?? "Sub-node Count"] = String(count);
91
+ }
92
+ }
93
+ return {
94
+ orgNode,
95
+ children: buildTreeNodes(
96
+ orgNode.children,
97
+ hiddenCounts,
98
+ hiddenAttributes,
99
+ subNodeLabel,
100
+ showSubNodeCount
101
+ ),
102
+ width: computeCardWidth(orgNode.label, meta),
103
+ height: computeCardHeight(meta)
104
+ };
105
+ });
106
+ }
107
+ function countDescendants(node) {
108
+ let count = 0;
109
+ for (const child of node.children) {
110
+ count += 1 + countDescendants(child);
111
+ }
112
+ return count;
113
+ }
114
+ function centerHeavyChildren(node) {
115
+ for (const child of node.children) {
116
+ centerHeavyChildren(child);
117
+ }
118
+ if (node.children.length <= 2) return;
119
+ const weighted = node.children.map((child) => ({ child, weight: countDescendants(child) })).sort((a, b) => b.weight - a.weight);
120
+ const result = new Array(weighted.length);
121
+ const mid = Math.floor((weighted.length - 1) / 2);
122
+ let left = mid;
123
+ let right = mid;
124
+ for (let i = 0; i < weighted.length; i++) {
125
+ const w = weighted[i];
126
+ if (i === 0) {
127
+ result[mid] = w.child;
128
+ } else if (i % 2 === 1) {
129
+ right++;
130
+ result[right] = w.child;
131
+ } else {
132
+ left--;
133
+ result[left] = w.child;
134
+ }
135
+ }
136
+ node.children = result;
137
+ }
138
+ function computeLegendGroups(tagGroups, showEyeIcons, usedValuesByGroup) {
139
+ const groups = [];
140
+ for (const group of tagGroups) {
141
+ if (group.entries.length === 0) continue;
142
+ const usedValues = usedValuesByGroup?.get(tagAttrKey(group.name));
143
+ const visibleEntries = usedValues ? group.entries.filter((e) => usedValues.has(e.value.toLowerCase())) : group.entries;
144
+ if (visibleEntries.length === 0) continue;
145
+ const pillWidth = measureLegendText(group.name, LEGEND_PILL_FONT_SIZE) + LEGEND_PILL_PAD;
146
+ const minPillWidth = pillWidth;
147
+ let entriesWidth = 0;
148
+ for (const entry of visibleEntries) {
149
+ entriesWidth += LEGEND_DOT_R * 2 + LEGEND_ENTRY_DOT_GAP + measureLegendText(entry.value, LEGEND_ENTRY_FONT_SIZE) + LEGEND_ENTRY_TRAIL;
150
+ }
151
+ const eyeSpace = showEyeIcons ? LEGEND_EYE_SIZE + LEGEND_EYE_GAP : 0;
152
+ const capsuleWidth = LEGEND_CAPSULE_PAD * 2 + pillWidth + 4 + eyeSpace + entriesWidth;
153
+ groups.push({
154
+ name: group.name,
155
+ ...group.alias !== void 0 && { alias: group.alias },
156
+ entries: visibleEntries.map((e) => ({
157
+ value: e.value,
158
+ color: e.color
159
+ })),
160
+ x: 0,
161
+ y: 0,
162
+ width: capsuleWidth,
163
+ height: LEGEND_HEIGHT,
164
+ minifiedWidth: minPillWidth,
165
+ minifiedHeight: LEGEND_HEIGHT
166
+ });
167
+ }
168
+ return groups;
169
+ }
170
+ function injectDefaultMetadata(roots, tagGroups) {
171
+ const allNodes = [];
172
+ const collect = (node) => {
173
+ allNodes.push(node);
174
+ for (const child of node.children) collect(child);
175
+ };
176
+ for (const root of roots) collect(root);
177
+ injectDefaultTagMetadata(
178
+ allNodes,
179
+ tagGroups,
180
+ (entity) => entity.isContainer
181
+ );
182
+ }
183
+ function layoutOrg(parsed, hiddenCounts, activeTagGroup, hiddenAttributes, expandAllLegend) {
184
+ if (parsed.roots.length === 0) {
185
+ const showEyeIcons2 = hiddenAttributes !== void 0;
186
+ const legendGroups2 = computeLegendGroups(parsed.tagGroups, showEyeIcons2);
187
+ if (legendGroups2.length === 0) {
188
+ return {
189
+ nodes: [],
190
+ edges: [],
191
+ containers: [],
192
+ legend: [],
193
+ width: 0,
194
+ height: 0
195
+ };
196
+ }
197
+ let cy = MARGIN;
198
+ let maxWidth2 = 0;
199
+ for (const g of legendGroups2) {
200
+ g.x = MARGIN;
201
+ g.y = cy;
202
+ cy += LEGEND_HEIGHT + LEGEND_GROUP_GAP;
203
+ if (g.width > maxWidth2) maxWidth2 = g.width;
204
+ }
205
+ return {
206
+ nodes: [],
207
+ edges: [],
208
+ containers: [],
209
+ legend: legendGroups2,
210
+ width: maxWidth2 + MARGIN * 2,
211
+ height: cy - LEGEND_GROUP_GAP + MARGIN
212
+ };
213
+ }
214
+ injectDefaultMetadata(parsed.roots, parsed.tagGroups);
215
+ const subNodeLabel = parsed.options["sub-node-label"] ?? void 0;
216
+ const showSubNodeCount = ["yes", "on"].includes(
217
+ parsed.options["show-sub-node-count"]?.toLowerCase() ?? ""
218
+ );
219
+ const treeNodes = buildTreeNodes(
220
+ parsed.roots,
221
+ hiddenCounts,
222
+ hiddenAttributes,
223
+ subNodeLabel,
224
+ showSubNodeCount
225
+ );
226
+ let root;
227
+ if (treeNodes.length === 1) {
228
+ root = treeNodes[0];
229
+ } else {
230
+ root = {
231
+ orgNode: {
232
+ id: "__virtual_root__",
233
+ label: "",
234
+ metadata: {},
235
+ children: parsed.roots,
236
+ parentId: null,
237
+ isContainer: false,
238
+ lineNumber: 0
239
+ },
240
+ children: treeNodes,
241
+ width: 0,
242
+ height: 0
243
+ };
244
+ }
245
+ let maxWidth = 0;
246
+ let maxHeight = 0;
247
+ const allTreeNodes = [];
248
+ const collectNodes = (tn) => {
249
+ if (tn.orgNode.id !== "__virtual_root__") {
250
+ allTreeNodes.push(tn);
251
+ if (tn.width > maxWidth) maxWidth = tn.width;
252
+ if (tn.height > maxHeight) maxHeight = tn.height;
253
+ }
254
+ for (const child of tn.children) collectNodes(child);
255
+ };
256
+ collectNodes(root);
257
+ for (const tn of allTreeNodes) {
258
+ tn.width = maxWidth;
259
+ }
260
+ const leafStacks = /* @__PURE__ */ new Map();
261
+ const collapseLeafContainers = (tn) => {
262
+ for (const child of tn.children) collapseLeafContainers(child);
263
+ if (tn.orgNode.isContainer && tn.children.length > 0 && tn.children.every((c) => c.children.length === 0)) {
264
+ const placeholderId = `__stack_${tn.orgNode.id}`;
265
+ leafStacks.set(tn.orgNode.id, {
266
+ children: [...tn.children],
267
+ placeholderId
268
+ });
269
+ const maxW = Math.max(...tn.children.map((c) => c.width));
270
+ for (const child of tn.children) {
271
+ child.width = maxW;
272
+ }
273
+ const totalH = tn.children.reduce((s, c) => s + c.height, 0) + (tn.children.length - 1) * STACK_V_GAP;
274
+ tn.children = [
275
+ {
276
+ orgNode: {
277
+ id: placeholderId,
278
+ label: "",
279
+ metadata: {},
280
+ children: [],
281
+ parentId: tn.orgNode.id,
282
+ isContainer: false,
283
+ lineNumber: 0
284
+ },
285
+ children: [],
286
+ width: maxW,
287
+ height: totalH
288
+ }
289
+ ];
290
+ }
291
+ };
292
+ collapseLeafContainers(root);
293
+ centerHeavyChildren(root);
294
+ const h = hierarchy(root, (d) => d.children);
295
+ const treeLayout = tree().nodeSize([
296
+ maxWidth + H_GAP,
297
+ maxHeight + V_GAP
298
+ ]);
299
+ treeLayout(h);
300
+ {
301
+ const descendants = h.descendants().filter((d) => d.data.orgNode.id !== "__virtual_root__");
302
+ const levelMaxHeight = /* @__PURE__ */ new Map();
303
+ for (const d of descendants) {
304
+ if (d.data.orgNode.id.startsWith("__stack_")) continue;
305
+ const cur = levelMaxHeight.get(d.depth) ?? 0;
306
+ if (d.data.height > cur) levelMaxHeight.set(d.depth, d.data.height);
307
+ }
308
+ const maxDepth = Math.max(...levelMaxHeight.keys(), 0);
309
+ const compactedY = /* @__PURE__ */ new Map();
310
+ const rootDepth = treeNodes.length === 1 ? 0 : 1;
311
+ compactedY.set(rootDepth, 0);
312
+ for (let d = rootDepth + 1; d <= maxDepth; d++) {
313
+ const parentH = levelMaxHeight.get(d - 1) ?? maxHeight;
314
+ const prevY = compactedY.get(d - 1) ?? 0;
315
+ compactedY.set(d, prevY + parentH + V_GAP);
316
+ }
317
+ for (const d of h.descendants()) {
318
+ if (d.data.orgNode.id === "__virtual_root__") continue;
319
+ d.y = compactedY.get(d.depth) ?? d.y;
320
+ }
321
+ }
322
+ for (const d of h.descendants()) {
323
+ if (d.data.orgNode.id === "__virtual_root__") continue;
324
+ if (!d.data.orgNode.isContainer) continue;
325
+ if (!d.children || d.children.length === 0) continue;
326
+ const childY = d.children[0].y;
327
+ const actualLevelGap = childY - d.y;
328
+ const metaCount = Object.keys(d.data.orgNode.metadata).length;
329
+ const headerHeight = CONTAINER_LABEL_HEIGHT + metaCount * CONTAINER_META_LINE_HEIGHT;
330
+ const desiredGap = headerHeight + 15;
331
+ const shiftUp = actualLevelGap - desiredGap;
332
+ if (shiftUp <= 0) continue;
333
+ const shift = (node) => {
334
+ if (node.children) {
335
+ for (const child of node.children) {
336
+ child.y -= shiftUp;
337
+ shift(child);
338
+ }
339
+ }
340
+ };
341
+ shift(d);
342
+ }
343
+ for (const d of h.descendants()) {
344
+ if (d.data.orgNode.id === "__virtual_root__") continue;
345
+ if (d.data.orgNode.isContainer) continue;
346
+ if (!d.children || d.children.length === 0) continue;
347
+ if (!d.children.every((c) => c.data.orgNode.isContainer)) continue;
348
+ const parentBottomY = d.y + d.data.height;
349
+ const firstChildY = Math.min(...d.children.map((c) => c.y));
350
+ const currentGap = firstChildY - parentBottomY;
351
+ const desiredGap = V_GAP * 0.6;
352
+ const shiftUp = currentGap - desiredGap;
353
+ if (shiftUp <= 0) continue;
354
+ const shiftDown = (node) => {
355
+ node.y -= shiftUp;
356
+ if (node.children) {
357
+ for (const child of node.children) {
358
+ shiftDown(child);
359
+ }
360
+ }
361
+ };
362
+ for (const child of d.children) {
363
+ shiftDown(child);
364
+ }
365
+ }
366
+ {
367
+ const subtreeExtent = (node) => {
368
+ let min = node.x - node.data.width / 2;
369
+ let max = node.x + node.data.width / 2;
370
+ if (node.children) {
371
+ for (const child of node.children) {
372
+ const childExt = subtreeExtent(child);
373
+ if (childExt.minX < min) min = childExt.minX;
374
+ if (childExt.maxX > max) max = childExt.maxX;
375
+ }
376
+ }
377
+ if (node.data.orgNode.isContainer) {
378
+ min -= CONTAINER_PAD_X;
379
+ max += CONTAINER_PAD_X;
380
+ }
381
+ return { minX: min, maxX: max };
382
+ };
383
+ const shiftX = (node, dx) => {
384
+ node.x += dx;
385
+ if (node.children) node.children.forEach((c) => shiftX(c, dx));
386
+ };
387
+ const internalNodes = h.descendants().filter((d) => d.children && d.children.length >= 2).sort((a, b) => b.depth - a.depth);
388
+ for (const parent of internalNodes) {
389
+ const children = parent.children;
390
+ const extents = children.map((child) => {
391
+ const ext = subtreeExtent(child);
392
+ return {
393
+ relLeft: ext.minX - child.x,
394
+ relRight: ext.maxX - child.x
395
+ };
396
+ });
397
+ const currentCenter = (children[0].x + children[children.length - 1].x) / 2;
398
+ const positions = [0];
399
+ for (let i = 1; i < children.length; i++) {
400
+ const prevRight = positions[i - 1] + extents[i - 1].relRight;
401
+ positions[i] = prevRight + H_GAP - extents[i].relLeft;
402
+ }
403
+ const newCenter = (positions[0] + positions[positions.length - 1]) / 2;
404
+ const centerShift = currentCenter - newCenter;
405
+ for (let i = 0; i < children.length; i++) {
406
+ const newX = positions[i] + centerShift;
407
+ const dx = newX - children[i].x;
408
+ if (Math.abs(dx) > 1e-3) {
409
+ shiftX(children[i], dx);
410
+ }
411
+ }
412
+ }
413
+ }
414
+ {
415
+ const parentNodes = h.descendants().filter(
416
+ (d) => d.children && d.children.length >= 1 && d.data.orgNode.id !== "__virtual_root__"
417
+ ).sort((a, b) => b.depth - a.depth);
418
+ for (const parent of parentNodes) {
419
+ const childXs = parent.children.map((c) => c.x);
420
+ const desiredX = (Math.min(...childXs) + Math.max(...childXs)) / 2;
421
+ parent.x = desiredX;
422
+ }
423
+ }
424
+ const layoutNodes = [];
425
+ const layoutEdges = [];
426
+ let minX = Infinity;
427
+ let maxX = -Infinity;
428
+ let minY = Infinity;
429
+ let maxY = -Infinity;
430
+ const expandedChildren = [];
431
+ for (const d of h.descendants()) {
432
+ if (d.data.orgNode.id === "__virtual_root__") continue;
433
+ if (!d.data.orgNode.id.startsWith("__stack_")) continue;
434
+ const containerId = d.data.orgNode.id.replace("__stack_", "");
435
+ const stack = leafStacks.get(containerId);
436
+ if (!stack) continue;
437
+ let currentY = d.y;
438
+ for (const child of stack.children) {
439
+ expandedChildren.push({
440
+ orgNode: child.orgNode,
441
+ width: child.width,
442
+ height: child.height,
443
+ cx: d.x,
444
+ cy: currentY
445
+ });
446
+ currentY += child.height + STACK_V_GAP;
447
+ }
448
+ }
449
+ for (const d of h.descendants()) {
450
+ if (d.data.orgNode.id === "__virtual_root__") continue;
451
+ if (d.data.orgNode.id.startsWith("__stack_")) continue;
452
+ const w = d.data.width;
453
+ const ht = d.data.height;
454
+ const cx = d.x;
455
+ const cy = d.y;
456
+ if (cx - w / 2 < minX) minX = cx - w / 2;
457
+ if (cx + w / 2 > maxX) maxX = cx + w / 2;
458
+ if (cy < minY) minY = cy;
459
+ if (cy + ht > maxY) maxY = cy + ht;
460
+ }
461
+ for (const ec of expandedChildren) {
462
+ if (ec.cx - ec.width / 2 < minX) minX = ec.cx - ec.width / 2;
463
+ if (ec.cx + ec.width / 2 > maxX) maxX = ec.cx + ec.width / 2;
464
+ if (ec.cy < minY) minY = ec.cy;
465
+ if (ec.cy + ec.height > maxY) maxY = ec.cy + ec.height;
466
+ }
467
+ const offsetX = -minX + MARGIN;
468
+ const offsetY = -minY + MARGIN;
469
+ const subNodeKey = subNodeLabel ?? "Sub-node Count";
470
+ for (const ec of expandedChildren) {
471
+ const hc = hiddenCounts?.get(ec.orgNode.id);
472
+ const meta = filterMetadata(ec.orgNode.metadata, hiddenAttributes);
473
+ if (!ec.orgNode.isContainer && showSubNodeCount && !(hc != null && hc > 0)) {
474
+ const count = countDescendantNodes(ec.orgNode, hiddenCounts);
475
+ if (count > 0) meta[subNodeKey] = String(count);
476
+ }
477
+ const ecColor = resolveNodeColor(
478
+ ec.orgNode,
479
+ parsed.tagGroups,
480
+ activeTagGroup ?? null
481
+ );
482
+ const ecHasChildren = ec.orgNode.children.length > 0 || hc != null && hc > 0 || void 0;
483
+ layoutNodes.push({
484
+ id: ec.orgNode.id,
485
+ label: ec.orgNode.label,
486
+ metadata: meta,
487
+ tagMetadata: { ...ec.orgNode.metadata },
488
+ isContainer: ec.orgNode.isContainer,
489
+ lineNumber: ec.orgNode.lineNumber,
490
+ ...ecColor !== void 0 && { color: ecColor },
491
+ x: ec.cx + offsetX,
492
+ y: ec.cy + offsetY,
493
+ width: ec.width,
494
+ height: ec.height,
495
+ ...hc !== void 0 && { hiddenCount: hc },
496
+ ...ecHasChildren !== void 0 && { hasChildren: ecHasChildren }
497
+ });
498
+ }
499
+ const busGroups = /* @__PURE__ */ new Map();
500
+ for (const d of h.descendants()) {
501
+ if (d.data.orgNode.id === "__virtual_root__") continue;
502
+ if (d.data.orgNode.id.startsWith("__stack_")) continue;
503
+ const orgNode = d.data.orgNode;
504
+ const w = d.data.width;
505
+ const ht = d.data.height;
506
+ const x = d.x + offsetX;
507
+ const y = d.y + offsetY;
508
+ const hc = hiddenCounts?.get(orgNode.id);
509
+ const nodeMeta = filterMetadata(orgNode.metadata, hiddenAttributes);
510
+ if (!orgNode.isContainer && showSubNodeCount && !(hc != null && hc > 0)) {
511
+ const count = countDescendantNodes(orgNode, hiddenCounts);
512
+ if (count > 0) nodeMeta[subNodeKey] = String(count);
513
+ }
514
+ const nodeColor = resolveNodeColor(
515
+ orgNode,
516
+ parsed.tagGroups,
517
+ activeTagGroup ?? null
518
+ );
519
+ const nodeHasChildren = d.children != null && d.children.length > 0 || hc != null && hc > 0 || void 0;
520
+ layoutNodes.push({
521
+ id: orgNode.id,
522
+ label: orgNode.label,
523
+ metadata: nodeMeta,
524
+ tagMetadata: { ...orgNode.metadata },
525
+ isContainer: orgNode.isContainer,
526
+ lineNumber: orgNode.lineNumber,
527
+ ...nodeColor !== void 0 && { color: nodeColor },
528
+ x,
529
+ y,
530
+ width: w,
531
+ height: ht,
532
+ ...hc !== void 0 && { hiddenCount: hc },
533
+ ...nodeHasChildren !== void 0 && { hasChildren: nodeHasChildren }
534
+ });
535
+ const parentIsContainerBox = d.parent?.data.orgNode.isContainer && d.parent.children && d.parent.children.length > 0;
536
+ if (d.parent && d.parent.data.orgNode.id !== "__virtual_root__" && !parentIsContainerBox) {
537
+ const parentId = d.parent.data.orgNode.id;
538
+ if (!busGroups.has(parentId)) {
539
+ const px = d.parent.x + offsetX;
540
+ const py = d.parent.y + offsetY;
541
+ const parentH = d.parent.data.height;
542
+ busGroups.set(parentId, {
543
+ parentX: px,
544
+ parentBottomY: py + parentH,
545
+ children: []
546
+ });
547
+ }
548
+ busGroups.get(parentId).children.push({
549
+ id: orgNode.id,
550
+ x,
551
+ topY: y
552
+ });
553
+ }
554
+ }
555
+ for (const [parentId, group] of busGroups) {
556
+ const { parentX, parentBottomY, children } = group;
557
+ if (children.length === 1) {
558
+ const child = children[0];
559
+ const midY = (parentBottomY + child.topY) / 2;
560
+ layoutEdges.push({
561
+ sourceId: parentId,
562
+ targetId: child.id,
563
+ points: [
564
+ { x: parentX, y: parentBottomY },
565
+ { x: parentX, y: midY },
566
+ { x: child.x, y: midY },
567
+ { x: child.x, y: child.topY }
568
+ ]
569
+ });
570
+ } else {
571
+ const midY = (parentBottomY + children[0].topY) / 2;
572
+ const childXs = children.map((c) => c.x);
573
+ const leftX = Math.min(...childXs);
574
+ const rightX = Math.max(...childXs);
575
+ layoutEdges.push({
576
+ sourceId: parentId,
577
+ targetId: parentId,
578
+ points: [
579
+ { x: parentX, y: parentBottomY },
580
+ { x: parentX, y: midY }
581
+ ]
582
+ });
583
+ layoutEdges.push({
584
+ sourceId: parentId,
585
+ targetId: parentId,
586
+ points: [
587
+ { x: leftX, y: midY },
588
+ { x: rightX, y: midY }
589
+ ]
590
+ });
591
+ for (const child of children) {
592
+ layoutEdges.push({
593
+ sourceId: parentId,
594
+ targetId: child.id,
595
+ points: [
596
+ { x: child.x, y: midY },
597
+ { x: child.x, y: child.topY }
598
+ ]
599
+ });
600
+ }
601
+ }
602
+ }
603
+ const allContainerNodes = h.descendants().filter(
604
+ (d) => d.data.orgNode.id !== "__virtual_root__" && d.data.orgNode.isContainer
605
+ );
606
+ const containerBoundsMap = /* @__PURE__ */ new Map();
607
+ const containers = [];
608
+ const EMPTY_CONTAINER_MIN_HEIGHT = 60;
609
+ for (const d of allContainerNodes) {
610
+ if (d.children && d.children.length > 0) continue;
611
+ const cx = d.x + offsetX;
612
+ const cy = d.y + offsetY;
613
+ const metaCount = Object.keys(d.data.orgNode.metadata).length;
614
+ const labelHeight = CONTAINER_LABEL_HEIGHT + metaCount * CONTAINER_META_LINE_HEIGHT;
615
+ const boxWidth = d.data.width;
616
+ const boxHeight = Math.max(
617
+ labelHeight + CONTAINER_PAD_BOTTOM,
618
+ EMPTY_CONTAINER_MIN_HEIGHT
619
+ );
620
+ const boxX = cx - boxWidth / 2;
621
+ const boxY = cy;
622
+ containerBoundsMap.set(d.data.orgNode.id, {
623
+ minX: boxX,
624
+ maxX: boxX + boxWidth,
625
+ minY: boxY,
626
+ maxY: boxY + boxHeight
627
+ });
628
+ const chc = hiddenCounts?.get(d.data.orgNode.id);
629
+ const cMeta = filterMetadata(d.data.orgNode.metadata, hiddenAttributes);
630
+ const cColor = resolveNodeColor(
631
+ d.data.orgNode,
632
+ parsed.tagGroups,
633
+ activeTagGroup ?? null
634
+ );
635
+ const cHasChildren = chc != null && chc > 0 || void 0;
636
+ containers.push({
637
+ nodeId: d.data.orgNode.id,
638
+ label: d.data.orgNode.label,
639
+ lineNumber: d.data.orgNode.lineNumber,
640
+ ...cColor !== void 0 && { color: cColor },
641
+ metadata: cMeta,
642
+ tagMetadata: { ...d.data.orgNode.metadata },
643
+ x: boxX,
644
+ y: boxY,
645
+ width: boxWidth,
646
+ height: boxHeight,
647
+ labelHeight,
648
+ ...chc !== void 0 && { hiddenCount: chc },
649
+ ...cHasChildren !== void 0 && { hasChildren: cHasChildren }
650
+ });
651
+ }
652
+ const containerCandidates = allContainerNodes.filter(
653
+ (d) => d.children && d.children.length > 0
654
+ );
655
+ containerCandidates.sort((a, b) => b.depth - a.depth);
656
+ for (const d of containerCandidates) {
657
+ const allDesc = [];
658
+ const collectDesc = (node) => {
659
+ if (node.children) {
660
+ for (const child of node.children) {
661
+ allDesc.push(child);
662
+ collectDesc(child);
663
+ }
664
+ }
665
+ };
666
+ collectDesc(d);
667
+ if (allDesc.length === 0) continue;
668
+ let descMinX = Infinity;
669
+ let descMaxX = -Infinity;
670
+ let descMaxY = -Infinity;
671
+ for (const desc of allDesc) {
672
+ const innerBounds = containerBoundsMap.get(desc.data.orgNode.id);
673
+ if (innerBounds) {
674
+ if (innerBounds.minX < descMinX) descMinX = innerBounds.minX;
675
+ if (innerBounds.maxX > descMaxX) descMaxX = innerBounds.maxX;
676
+ if (innerBounds.maxY > descMaxY) descMaxY = innerBounds.maxY;
677
+ } else if (desc.data.orgNode.id.startsWith("__stack_")) {
678
+ const cid = desc.data.orgNode.id.replace("__stack_", "");
679
+ const stack = leafStacks.get(cid);
680
+ if (stack) {
681
+ for (const ec of expandedChildren) {
682
+ if (ec.orgNode.parentId !== cid) continue;
683
+ const ex = ec.cx + offsetX;
684
+ const ey = ec.cy + offsetY;
685
+ if (ex - ec.width / 2 < descMinX) descMinX = ex - ec.width / 2;
686
+ if (ex + ec.width / 2 > descMaxX) descMaxX = ex + ec.width / 2;
687
+ if (ey + ec.height > descMaxY) descMaxY = ey + ec.height;
688
+ }
689
+ }
690
+ } else {
691
+ const dw = desc.data.width;
692
+ const dh = desc.data.height;
693
+ const dx = desc.x + offsetX;
694
+ const dy = desc.y + offsetY;
695
+ if (dx - dw / 2 < descMinX) descMinX = dx - dw / 2;
696
+ if (dx + dw / 2 > descMaxX) descMaxX = dx + dw / 2;
697
+ if (dy + dh > descMaxY) descMaxY = dy + dh;
698
+ }
699
+ }
700
+ const containerX = d.x + offsetX;
701
+ const containerY = d.y + offsetY;
702
+ const metaCount = Object.keys(d.data.orgNode.metadata).length;
703
+ const labelHeight = CONTAINER_LABEL_HEIGHT + metaCount * CONTAINER_META_LINE_HEIGHT;
704
+ const boxY = containerY;
705
+ const boxHeight = descMaxY - containerY + CONTAINER_PAD_BOTTOM;
706
+ const boxX = descMinX - CONTAINER_PAD_X;
707
+ const contentWidth = descMaxX - descMinX + CONTAINER_PAD_X * 2;
708
+ const finalBoxWidth = Math.max(contentWidth, d.data.width);
709
+ const centeredBoxX = finalBoxWidth > contentWidth ? containerX - finalBoxWidth / 2 : boxX;
710
+ containerBoundsMap.set(d.data.orgNode.id, {
711
+ minX: centeredBoxX,
712
+ maxX: centeredBoxX + finalBoxWidth,
713
+ minY: boxY,
714
+ maxY: boxY + boxHeight
715
+ });
716
+ const chc2 = hiddenCounts?.get(d.data.orgNode.id);
717
+ const cMeta2 = filterMetadata(d.data.orgNode.metadata, hiddenAttributes);
718
+ const c2Color = resolveNodeColor(
719
+ d.data.orgNode,
720
+ parsed.tagGroups,
721
+ activeTagGroup ?? null
722
+ );
723
+ containers.push({
724
+ nodeId: d.data.orgNode.id,
725
+ label: d.data.orgNode.label,
726
+ lineNumber: d.data.orgNode.lineNumber,
727
+ ...c2Color !== void 0 && { color: c2Color },
728
+ metadata: cMeta2,
729
+ tagMetadata: { ...d.data.orgNode.metadata },
730
+ x: centeredBoxX,
731
+ y: boxY,
732
+ width: finalBoxWidth,
733
+ height: boxHeight,
734
+ labelHeight,
735
+ ...chc2 !== void 0 && { hiddenCount: chc2 },
736
+ hasChildren: true
737
+ });
738
+ }
739
+ containers.reverse();
740
+ let finalMinX = minX;
741
+ let finalMaxX = maxX;
742
+ let finalMaxY = maxY;
743
+ for (const c of containers) {
744
+ const cLeft = c.x - offsetX;
745
+ const cRight = cLeft + c.width;
746
+ const cBottom = c.y - offsetY + c.height;
747
+ if (cLeft < finalMinX) finalMinX = cLeft;
748
+ if (cRight > finalMaxX) finalMaxX = cRight;
749
+ if (cBottom > finalMaxY) finalMaxY = cBottom;
750
+ }
751
+ const totalWidth = finalMaxX - finalMinX + MARGIN * 2;
752
+ const totalHeight = finalMaxY - minY + MARGIN * 2;
753
+ const usedValuesByGroup = /* @__PURE__ */ new Map();
754
+ for (const group of parsed.tagGroups) {
755
+ const key = tagAttrKey(group.name);
756
+ const used = /* @__PURE__ */ new Set();
757
+ const walk = (node) => {
758
+ if (!node.isContainer && node.metadata[key]) {
759
+ used.add(node.metadata[key].toLowerCase());
760
+ }
761
+ for (const child of node.children) walk(child);
762
+ };
763
+ for (const root2 of parsed.roots) walk(root2);
764
+ usedValuesByGroup.set(key, used);
765
+ }
766
+ const showEyeIcons = hiddenAttributes !== void 0;
767
+ const legendGroups = computeLegendGroups(
768
+ parsed.tagGroups,
769
+ showEyeIcons,
770
+ usedValuesByGroup
771
+ );
772
+ let finalWidth = totalWidth;
773
+ let finalHeight = totalHeight;
774
+ const visibleGroups = activeTagGroup != null ? legendGroups.filter(
775
+ (g) => g.name.toLowerCase() === activeTagGroup.toLowerCase()
776
+ ) : legendGroups;
777
+ const allExpanded = expandAllLegend && activeTagGroup == null;
778
+ const effectiveW = (g) => activeTagGroup != null || allExpanded ? g.width : g.minifiedWidth;
779
+ if (visibleGroups.length > 0) {
780
+ const legendShift = LEGEND_HEIGHT + LEGEND_GROUP_GAP;
781
+ for (const n of layoutNodes) n.y += legendShift;
782
+ for (const c of containers) c.y += legendShift;
783
+ for (const e of layoutEdges) {
784
+ for (const p of e.points)
785
+ p.y += legendShift;
786
+ }
787
+ const totalGroupsWidth = visibleGroups.reduce((s, g) => s + effectiveW(g), 0) + (visibleGroups.length - 1) * LEGEND_GROUP_GAP;
788
+ let cx = MARGIN;
789
+ for (const g of visibleGroups) {
790
+ g.x = cx;
791
+ g.y = MARGIN;
792
+ cx += effectiveW(g) + LEGEND_GROUP_GAP;
793
+ }
794
+ finalHeight += legendShift;
795
+ const neededWidth = totalGroupsWidth + MARGIN * 2;
796
+ if (neededWidth > finalWidth) {
797
+ finalWidth = neededWidth;
798
+ }
799
+ }
800
+ return {
801
+ nodes: layoutNodes,
802
+ edges: layoutEdges,
803
+ containers,
804
+ legend: legendGroups,
805
+ width: finalWidth,
806
+ height: finalHeight
807
+ };
808
+ }
809
+
810
+ export {
811
+ layoutOrg
812
+ };
813
+ //# sourceMappingURL=chunk-J5FIXQRT.js.map