@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,548 @@
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_GEAR_PILL_W,
8
+ LEGEND_GROUP_GAP,
9
+ LEGEND_HEIGHT,
10
+ LEGEND_MAX_ENTRY_ROWS,
11
+ LEGEND_PILL_FONT_SIZE,
12
+ LEGEND_PILL_PAD,
13
+ LEGEND_TOGGLE_DOT_R,
14
+ measureLegendText,
15
+ truncateLegendText
16
+ } from "./chunk-QOOUC2J5.js";
17
+
18
+ // src/utils/number-format.ts
19
+ function compactNumber(n) {
20
+ if (!Number.isFinite(n)) return String(n);
21
+ const abs = Math.abs(n);
22
+ if (abs < 1e3) {
23
+ return Number.isInteger(n) ? String(n) : String(Math.round(n * 10) / 10);
24
+ }
25
+ const sign = n < 0 ? "-" : "";
26
+ const units = [
27
+ [1e12, "T"],
28
+ [1e9, "B"],
29
+ [1e6, "M"],
30
+ [1e3, "K"]
31
+ ];
32
+ for (const [factor, suffix] of units) {
33
+ if (abs >= factor) {
34
+ const scaled = Math.round(abs / factor * 10) / 10;
35
+ const body = Number.isInteger(scaled) ? String(scaled) : scaled.toFixed(1);
36
+ return `${sign}${body}${suffix}`;
37
+ }
38
+ }
39
+ return String(n);
40
+ }
41
+
42
+ // src/utils/legend-layout.ts
43
+ var CONTROL_PILL_PAD = 16;
44
+ var CONTROL_FONT_SIZE = 11;
45
+ var CONTROL_ICON_GAP = 4;
46
+ var CONTROL_GAP = 8;
47
+ var RAMP_LEGEND_W = 80;
48
+ var RAMP_LEGEND_H = 8;
49
+ var RAMP_LABEL_GAP = 6;
50
+ function fmtRamp(n) {
51
+ return compactNumber(n);
52
+ }
53
+ function gradientCapsuleWidth(name, gradient) {
54
+ const pw = pillWidth(name);
55
+ const minW = measureLegendText(fmtRamp(gradient.min), LEGEND_ENTRY_FONT_SIZE);
56
+ const maxW = measureLegendText(fmtRamp(gradient.max), LEGEND_ENTRY_FONT_SIZE);
57
+ return LEGEND_CAPSULE_PAD + pw + 4 + minW + RAMP_LABEL_GAP + RAMP_LEGEND_W + RAMP_LABEL_GAP + maxW + LEGEND_CAPSULE_PAD;
58
+ }
59
+ function buildGradientCapsuleLayout(group, gradient) {
60
+ const pw = pillWidth(group.name);
61
+ const minText = fmtRamp(gradient.min);
62
+ const maxText = fmtRamp(gradient.max);
63
+ const minW = measureLegendText(minText, LEGEND_ENTRY_FONT_SIZE);
64
+ const gx = LEGEND_CAPSULE_PAD + pw + 4;
65
+ const minX = gx;
66
+ const rampX = gx + minW + RAMP_LABEL_GAP;
67
+ const maxX = rampX + RAMP_LEGEND_W + RAMP_LABEL_GAP;
68
+ const width = gradientCapsuleWidth(group.name, gradient);
69
+ return {
70
+ groupName: group.name,
71
+ x: 0,
72
+ y: 0,
73
+ width,
74
+ height: LEGEND_HEIGHT,
75
+ pill: {
76
+ groupName: group.name,
77
+ x: LEGEND_CAPSULE_PAD,
78
+ y: LEGEND_CAPSULE_PAD,
79
+ width: pw,
80
+ height: LEGEND_HEIGHT - LEGEND_CAPSULE_PAD * 2,
81
+ isActive: true
82
+ },
83
+ entries: [],
84
+ gradient: {
85
+ rampX,
86
+ rampY: (LEGEND_HEIGHT - RAMP_LEGEND_H) / 2,
87
+ rampW: RAMP_LEGEND_W,
88
+ rampH: RAMP_LEGEND_H,
89
+ min: gradient.min,
90
+ max: gradient.max,
91
+ minText,
92
+ minX,
93
+ maxText,
94
+ maxX,
95
+ textY: LEGEND_HEIGHT / 2,
96
+ low: gradient.low,
97
+ high: gradient.high
98
+ }
99
+ };
100
+ }
101
+ function pillWidth(name) {
102
+ return measureLegendText(name, LEGEND_PILL_FONT_SIZE) + LEGEND_PILL_PAD;
103
+ }
104
+ function entriesWidth(entries) {
105
+ let w = 0;
106
+ for (const e of entries) {
107
+ w += LEGEND_DOT_R * 2 + LEGEND_ENTRY_DOT_GAP + measureLegendText(e.value, LEGEND_ENTRY_FONT_SIZE) + LEGEND_ENTRY_TRAIL;
108
+ }
109
+ return w;
110
+ }
111
+ function entryWidth(value) {
112
+ return LEGEND_DOT_R * 2 + LEGEND_ENTRY_DOT_GAP + measureLegendText(value, LEGEND_ENTRY_FONT_SIZE) + LEGEND_ENTRY_TRAIL;
113
+ }
114
+ function controlWidth(control) {
115
+ let w = CONTROL_PILL_PAD;
116
+ if (control.label) {
117
+ w += measureLegendText(control.label, CONTROL_FONT_SIZE);
118
+ if (control.icon) w += CONTROL_ICON_GAP;
119
+ }
120
+ if (control.icon) w += 14;
121
+ if (control.children) {
122
+ for (const child of control.children) {
123
+ w += measureLegendText(child.label, CONTROL_FONT_SIZE) + 12;
124
+ }
125
+ }
126
+ return w;
127
+ }
128
+ function capsuleWidth(name, entries, containerWidth, addonWidth = 0) {
129
+ const pw = pillWidth(name);
130
+ const maxCapsuleW = containerWidth;
131
+ const baseW = LEGEND_CAPSULE_PAD * 2 + pw + 4 + addonWidth;
132
+ const ew = entriesWidth(entries);
133
+ const singleRowW = baseW + ew;
134
+ if (singleRowW <= maxCapsuleW + 0.5) {
135
+ return {
136
+ width: singleRowW,
137
+ entryRows: 1,
138
+ moreCount: 0,
139
+ visibleEntries: entries.length
140
+ };
141
+ }
142
+ const rowWidth = maxCapsuleW - LEGEND_CAPSULE_PAD;
143
+ let row = 1;
144
+ let rowX = LEGEND_CAPSULE_PAD + pw + 4 + addonWidth;
145
+ let visible = 0;
146
+ for (let i = 0; i < entries.length; i++) {
147
+ let ew2 = entryWidth(entries[i].value);
148
+ const availW = rowWidth - rowX;
149
+ if (ew2 > availW && i > 0) {
150
+ row++;
151
+ rowX = LEGEND_CAPSULE_PAD + pw + 4 + addonWidth;
152
+ if (row > LEGEND_MAX_ENTRY_ROWS) {
153
+ return {
154
+ width: maxCapsuleW,
155
+ entryRows: LEGEND_MAX_ENTRY_ROWS,
156
+ moreCount: entries.length - visible,
157
+ visibleEntries: visible
158
+ };
159
+ }
160
+ }
161
+ ew2 = Math.min(ew2, rowWidth - rowX);
162
+ rowX += ew2;
163
+ visible++;
164
+ }
165
+ return {
166
+ width: maxCapsuleW,
167
+ entryRows: row,
168
+ moreCount: 0,
169
+ visibleEntries: entries.length
170
+ };
171
+ }
172
+ function controlsGroupCapsuleWidth(toggles) {
173
+ let w = LEGEND_CAPSULE_PAD * 2 + LEGEND_GEAR_PILL_W + 4;
174
+ for (const t of toggles) {
175
+ w += LEGEND_TOGGLE_DOT_R * 2 + LEGEND_ENTRY_DOT_GAP + measureLegendText(t.label, LEGEND_ENTRY_FONT_SIZE) + LEGEND_ENTRY_TRAIL;
176
+ }
177
+ return w;
178
+ }
179
+ function isAppHostedControls(config, isExport) {
180
+ return !isExport && config.controlsHost === "app" && !!config.controlsGroup && config.controlsGroup.toggles.length > 0;
181
+ }
182
+ function buildControlsGroupLayout(config, state) {
183
+ const cg = config.controlsGroup;
184
+ if (!cg || cg.toggles.length === 0) return void 0;
185
+ const expanded = !!state.controlsExpanded;
186
+ const pillH = LEGEND_HEIGHT - LEGEND_CAPSULE_PAD * 2;
187
+ if (!expanded) {
188
+ return {
189
+ x: 0,
190
+ y: 0,
191
+ width: LEGEND_GEAR_PILL_W,
192
+ height: LEGEND_HEIGHT,
193
+ expanded: false,
194
+ pill: { x: 0, y: 0, width: LEGEND_GEAR_PILL_W, height: LEGEND_HEIGHT },
195
+ toggles: []
196
+ };
197
+ }
198
+ const capsuleW = controlsGroupCapsuleWidth(cg.toggles);
199
+ const toggleLayouts = [];
200
+ let tx = LEGEND_CAPSULE_PAD + LEGEND_GEAR_PILL_W + 4;
201
+ for (const toggle of cg.toggles) {
202
+ const dotCx = tx + LEGEND_TOGGLE_DOT_R;
203
+ const dotCy = LEGEND_HEIGHT / 2;
204
+ const textX = tx + LEGEND_TOGGLE_DOT_R * 2 + LEGEND_ENTRY_DOT_GAP;
205
+ const textY = LEGEND_HEIGHT / 2;
206
+ toggleLayouts.push({
207
+ id: toggle.id,
208
+ label: toggle.label,
209
+ active: toggle.active,
210
+ dotCx,
211
+ dotCy,
212
+ textX,
213
+ textY
214
+ });
215
+ tx += LEGEND_TOGGLE_DOT_R * 2 + LEGEND_ENTRY_DOT_GAP + measureLegendText(toggle.label, LEGEND_ENTRY_FONT_SIZE) + LEGEND_ENTRY_TRAIL;
216
+ }
217
+ return {
218
+ x: 0,
219
+ y: 0,
220
+ width: capsuleW,
221
+ height: LEGEND_HEIGHT,
222
+ expanded: true,
223
+ pill: {
224
+ x: LEGEND_CAPSULE_PAD,
225
+ y: LEGEND_CAPSULE_PAD,
226
+ width: LEGEND_GEAR_PILL_W - LEGEND_CAPSULE_PAD * 2,
227
+ height: pillH
228
+ },
229
+ toggles: toggleLayouts
230
+ };
231
+ }
232
+ function computeLegendLayout(config, state, containerWidth) {
233
+ const { groups, controls: configControls, mode } = config;
234
+ const isExport = mode === "export";
235
+ const gated = isAppHostedControls(config, isExport);
236
+ const activeGroupName = state.activeGroup?.toLowerCase() ?? null;
237
+ if (isExport && !activeGroupName) {
238
+ return {
239
+ height: 0,
240
+ width: 0,
241
+ rows: [],
242
+ controls: [],
243
+ pills: []
244
+ };
245
+ }
246
+ const controlsGroupLayout = isExport || gated ? void 0 : buildControlsGroupLayout(config, state);
247
+ const visibleGroups = config.showEmptyGroups ? groups : groups.filter((g) => g.entries.length > 0 || !!g.gradient);
248
+ if (visibleGroups.length === 0 && (!configControls || configControls.length === 0) && !controlsGroupLayout) {
249
+ return {
250
+ height: 0,
251
+ width: 0,
252
+ rows: [],
253
+ controls: [],
254
+ pills: []
255
+ };
256
+ }
257
+ const controlLayouts = [];
258
+ let totalControlsW = 0;
259
+ if (configControls && !isExport) {
260
+ for (const ctrl of configControls) {
261
+ const w = controlWidth(ctrl);
262
+ const children = ctrl.children?.map((c) => ({
263
+ id: c.id,
264
+ label: c.label,
265
+ x: 0,
266
+ y: 0,
267
+ width: measureLegendText(c.label, CONTROL_FONT_SIZE) + 12,
268
+ ...c.isActive !== void 0 && { isActive: c.isActive }
269
+ }));
270
+ controlLayouts.push({
271
+ id: ctrl.id,
272
+ x: 0,
273
+ // positioned later
274
+ y: 0,
275
+ width: w,
276
+ height: LEGEND_HEIGHT,
277
+ icon: ctrl.icon,
278
+ ...ctrl.label !== void 0 && { label: ctrl.label },
279
+ exportBehavior: ctrl.exportBehavior,
280
+ ...children !== void 0 && { children }
281
+ });
282
+ totalControlsW += w + CONTROL_GAP;
283
+ }
284
+ if (totalControlsW > 0) totalControlsW -= CONTROL_GAP;
285
+ } else if (configControls && isExport) {
286
+ for (const ctrl of configControls) {
287
+ if (ctrl.exportBehavior === "strip") continue;
288
+ const w = controlWidth(ctrl);
289
+ const children = ctrl.children?.map((c) => ({
290
+ id: c.id,
291
+ label: c.label,
292
+ x: 0,
293
+ y: 0,
294
+ width: measureLegendText(c.label, CONTROL_FONT_SIZE) + 12,
295
+ ...c.isActive !== void 0 && { isActive: c.isActive }
296
+ }));
297
+ controlLayouts.push({
298
+ id: ctrl.id,
299
+ x: 0,
300
+ y: 0,
301
+ width: w,
302
+ height: LEGEND_HEIGHT,
303
+ icon: ctrl.icon,
304
+ ...ctrl.label !== void 0 && { label: ctrl.label },
305
+ exportBehavior: ctrl.exportBehavior,
306
+ ...children !== void 0 && { children }
307
+ });
308
+ totalControlsW += w + CONTROL_GAP;
309
+ }
310
+ if (totalControlsW > 0) totalControlsW -= CONTROL_GAP;
311
+ }
312
+ const controlsSpace = totalControlsW > 0 ? totalControlsW + LEGEND_GROUP_GAP * 2 : 0;
313
+ const gearSpace = controlsGroupLayout ? controlsGroupLayout.width + LEGEND_GROUP_GAP : 0;
314
+ const groupAvailW = containerWidth - controlsSpace - gearSpace;
315
+ const pills = [];
316
+ let activeCapsule;
317
+ for (const g of visibleGroups) {
318
+ const isActive = activeGroupName === g.name.toLowerCase();
319
+ if (isExport && !isActive) continue;
320
+ if (isActive) {
321
+ activeCapsule = buildCapsuleLayout(
322
+ g,
323
+ groupAvailW,
324
+ config.capsulePillAddonWidth ?? 0
325
+ );
326
+ } else if (!activeGroupName || config.showInactivePills) {
327
+ const pw = pillWidth(g.name);
328
+ pills.push({
329
+ groupName: g.name,
330
+ x: 0,
331
+ y: 0,
332
+ width: pw,
333
+ height: LEGEND_HEIGHT,
334
+ isActive: false
335
+ });
336
+ }
337
+ }
338
+ const alignLeft = config.position.titleRelation === "inline-with-title";
339
+ const rows = layoutRows(
340
+ activeCapsule,
341
+ pills,
342
+ controlLayouts,
343
+ groupAvailW,
344
+ containerWidth,
345
+ totalControlsW,
346
+ alignLeft,
347
+ controlsGroupLayout
348
+ );
349
+ const height = rows.length * LEGEND_HEIGHT;
350
+ const width = containerWidth;
351
+ return {
352
+ height,
353
+ width,
354
+ rows,
355
+ ...activeCapsule !== void 0 && { activeCapsule },
356
+ controls: controlLayouts,
357
+ pills,
358
+ ...controlsGroupLayout !== void 0 && {
359
+ controlsGroup: controlsGroupLayout
360
+ }
361
+ };
362
+ }
363
+ function buildCapsuleLayout(group, containerWidth, addonWidth = 0) {
364
+ if (group.gradient) return buildGradientCapsuleLayout(group, group.gradient);
365
+ const pw = pillWidth(group.name);
366
+ const info = capsuleWidth(
367
+ group.name,
368
+ group.entries,
369
+ containerWidth,
370
+ addonWidth
371
+ );
372
+ const pill = {
373
+ groupName: group.name,
374
+ x: LEGEND_CAPSULE_PAD,
375
+ y: LEGEND_CAPSULE_PAD,
376
+ width: pw,
377
+ height: LEGEND_HEIGHT - LEGEND_CAPSULE_PAD * 2,
378
+ isActive: true
379
+ };
380
+ const entries = [];
381
+ const ex = LEGEND_CAPSULE_PAD + pw + 4 + addonWidth;
382
+ let ey = 0;
383
+ let rowX = ex;
384
+ const maxRowW = containerWidth - LEGEND_CAPSULE_PAD;
385
+ let currentRow = 0;
386
+ for (let i = 0; i < info.visibleEntries; i++) {
387
+ const entry = group.entries[i];
388
+ let ew = entryWidth(entry.value);
389
+ if (info.entryRows > 1 && rowX + ew > maxRowW && rowX > ex && i > 0) {
390
+ currentRow++;
391
+ rowX = ex;
392
+ ey = currentRow * LEGEND_HEIGHT;
393
+ }
394
+ let displayValue;
395
+ const availW = maxRowW - rowX;
396
+ if (ew > availW) {
397
+ const textAvail = availW - (LEGEND_DOT_R * 2 + LEGEND_ENTRY_DOT_GAP + LEGEND_ENTRY_TRAIL);
398
+ if (textAvail > 0) {
399
+ displayValue = truncateLegendText(
400
+ entry.value,
401
+ LEGEND_ENTRY_FONT_SIZE,
402
+ textAvail
403
+ );
404
+ ew = LEGEND_DOT_R * 2 + LEGEND_ENTRY_DOT_GAP + measureLegendText(displayValue, LEGEND_ENTRY_FONT_SIZE) + LEGEND_ENTRY_TRAIL;
405
+ }
406
+ }
407
+ const dotCx = rowX + LEGEND_DOT_R;
408
+ const dotCy = ey + LEGEND_HEIGHT / 2;
409
+ const textX = rowX + LEGEND_DOT_R * 2 + LEGEND_ENTRY_DOT_GAP;
410
+ const textY = ey + LEGEND_HEIGHT / 2;
411
+ entries.push({
412
+ value: entry.value,
413
+ color: entry.color,
414
+ x: rowX,
415
+ y: ey,
416
+ width: ew,
417
+ dotCx,
418
+ dotCy,
419
+ textX,
420
+ textY,
421
+ ...displayValue !== void 0 && { displayValue }
422
+ });
423
+ rowX += ew;
424
+ }
425
+ const totalRows = info.entryRows;
426
+ const capsuleH = totalRows * LEGEND_HEIGHT;
427
+ return {
428
+ groupName: group.name,
429
+ x: 0,
430
+ y: 0,
431
+ width: info.width,
432
+ height: capsuleH,
433
+ pill,
434
+ entries,
435
+ ...info.moreCount > 0 && { moreCount: info.moreCount },
436
+ ...addonWidth > 0 && { addonX: LEGEND_CAPSULE_PAD + pw + 4 }
437
+ };
438
+ }
439
+ function layoutRows(activeCapsule, pills, controls, groupAvailW, containerWidth, totalControlsW, alignLeft = false, controlsGroup) {
440
+ const rows = [];
441
+ const groupItems = [];
442
+ if (activeCapsule) groupItems.push(activeCapsule);
443
+ groupItems.push(...pills);
444
+ const gearW = controlsGroup ? controlsGroup.width + LEGEND_GROUP_GAP : 0;
445
+ let currentRowItems = [];
446
+ let currentRowW = 0;
447
+ let rowY = 0;
448
+ for (const item of groupItems) {
449
+ const itemW = item.width + LEGEND_GROUP_GAP;
450
+ if (currentRowW + item.width > groupAvailW && currentRowItems.length > 0) {
451
+ if (!alignLeft) {
452
+ const rowGearW = rows.length === 0 ? gearW : 0;
453
+ centerRowItems(
454
+ currentRowItems,
455
+ containerWidth,
456
+ totalControlsW,
457
+ rowGearW
458
+ );
459
+ }
460
+ rows.push({ y: rowY, items: currentRowItems });
461
+ rowY += LEGEND_HEIGHT;
462
+ currentRowItems = [];
463
+ currentRowW = 0;
464
+ }
465
+ item.x = currentRowW;
466
+ item.y = rowY;
467
+ currentRowItems.push(item);
468
+ currentRowW += itemW;
469
+ }
470
+ if (controls.length > 0) {
471
+ let cx = containerWidth;
472
+ for (let i = controls.length - 1; i >= 0; i--) {
473
+ const ctrl = controls[i];
474
+ cx -= ctrl.width;
475
+ ctrl.x = cx;
476
+ ctrl.y = 0;
477
+ cx -= CONTROL_GAP;
478
+ }
479
+ if (rows.length > 0) {
480
+ rows[0].items.push(...controls);
481
+ } else if (currentRowItems.length > 0) {
482
+ currentRowItems.push(...controls);
483
+ } else {
484
+ currentRowItems.push(...controls);
485
+ }
486
+ }
487
+ if (currentRowItems.length > 0) {
488
+ if (!alignLeft) {
489
+ centerRowItems(currentRowItems, containerWidth, totalControlsW, gearW);
490
+ }
491
+ rows.push({ y: rowY, items: currentRowItems });
492
+ }
493
+ if (controlsGroup) {
494
+ const row0Items = rows[0]?.items ?? [];
495
+ const groupItemsInRow0 = row0Items.filter(
496
+ (it) => "groupName" in it
497
+ );
498
+ if (groupItemsInRow0.length > 0) {
499
+ const last = groupItemsInRow0[groupItemsInRow0.length - 1];
500
+ controlsGroup.x = last.x + last.width + LEGEND_GROUP_GAP;
501
+ } else {
502
+ controlsGroup.x = (containerWidth - controlsGroup.width) / 2;
503
+ }
504
+ controlsGroup.y = 0;
505
+ }
506
+ if (rows.length === 0) {
507
+ rows.push({ y: 0, items: [] });
508
+ }
509
+ return rows;
510
+ }
511
+ function centerRowItems(items, containerWidth, totalControlsW, controlsGroupW = 0) {
512
+ const groupItems = items.filter((it) => "groupName" in it);
513
+ if (groupItems.length === 0) return;
514
+ const totalGroupW = groupItems.reduce((s, it) => s + it.width, 0) + (groupItems.length - 1) * LEGEND_GROUP_GAP;
515
+ const availW = containerWidth - (totalControlsW > 0 ? totalControlsW + LEGEND_GROUP_GAP * 2 : 0) - controlsGroupW;
516
+ const offset = Math.max(0, (availW - totalGroupW) / 2);
517
+ let x = offset;
518
+ for (const item of groupItems) {
519
+ item.x = x;
520
+ x += item.width + LEGEND_GROUP_GAP;
521
+ }
522
+ }
523
+ function getLegendReservedHeight(config, state, containerWidth) {
524
+ const layout = computeLegendLayout(config, state, containerWidth);
525
+ return layout.height;
526
+ }
527
+ function getMaxLegendReservedHeight(config, containerWidth) {
528
+ const groups = config.groups;
529
+ if (groups.length === 0) return LEGEND_HEIGHT;
530
+ const addon = config.capsulePillAddonWidth ?? 0;
531
+ let max = LEGEND_HEIGHT;
532
+ for (const g of groups) {
533
+ if (g.entries.length === 0) continue;
534
+ const info = capsuleWidth(g.name, g.entries, containerWidth, addon);
535
+ const h = info.entryRows * LEGEND_HEIGHT;
536
+ if (h > max) max = h;
537
+ }
538
+ return max;
539
+ }
540
+
541
+ export {
542
+ compactNumber,
543
+ controlsGroupCapsuleWidth,
544
+ computeLegendLayout,
545
+ getLegendReservedHeight,
546
+ getMaxLegendReservedHeight
547
+ };
548
+ //# sourceMappingURL=chunk-YAA6IID3.js.map