@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,384 @@
1
+ import {
2
+ buildHeatScale,
3
+ buildLegend,
4
+ compactNumber,
5
+ formatPct,
6
+ resolveCellColor,
7
+ resolveColorMode
8
+ } from "./chunk-IZMRON6C.js";
9
+ import {
10
+ renderIntegratedLegend
11
+ } from "./chunk-PWIHZ6NJ.js";
12
+ import {
13
+ getMaxLegendReservedHeight
14
+ } from "./chunk-YAA6IID3.js";
15
+ import {
16
+ TITLE_FONT_SIZE,
17
+ TITLE_FONT_WEIGHT,
18
+ TITLE_Y
19
+ } from "./chunk-A4GOY3PE.js";
20
+ import {
21
+ FONT_FAMILY
22
+ } from "./chunk-6KFWC4CO.js";
23
+ import {
24
+ LEGEND_GROUP_GAP
25
+ } from "./chunk-QOOUC2J5.js";
26
+ import {
27
+ measureText
28
+ } from "./chunk-WCT3NYCV.js";
29
+ import {
30
+ contrastText,
31
+ getSeriesColors,
32
+ mix
33
+ } from "./chunk-P6T66CCZ.js";
34
+ import {
35
+ tagAttrKey
36
+ } from "./chunk-QLCCJEJI.js";
37
+
38
+ // src/treemap/renderer.ts
39
+ import * as d3Selection from "d3-selection";
40
+
41
+ // src/treemap/layout.ts
42
+ import {
43
+ hierarchy,
44
+ treemap,
45
+ treemapSquarify
46
+ } from "d3-hierarchy";
47
+ function toDatum(node) {
48
+ if (node.children.length === 0) {
49
+ return {
50
+ ref: node,
51
+ label: node.label,
52
+ value: node.value ?? 0,
53
+ ...node.heat !== void 0 && { heat: node.heat },
54
+ lineNumber: node.lineNumber
55
+ };
56
+ }
57
+ return {
58
+ ref: node,
59
+ label: node.label,
60
+ ...node.heat !== void 0 && { heat: node.heat },
61
+ lineNumber: node.lineNumber,
62
+ children: node.children.map((c) => toDatum(c))
63
+ };
64
+ }
65
+ function datumHeat(node) {
66
+ if (node.data.heat !== void 0) return node.data.heat;
67
+ const xs = [];
68
+ for (const l of node.leaves()) {
69
+ if (l.data.heat !== void 0) xs.push(l.data.heat);
70
+ }
71
+ if (xs.length === 0) return void 0;
72
+ return xs.reduce((a, b) => a + b, 0) / xs.length;
73
+ }
74
+ function layoutTreemap(roots, opts) {
75
+ const maxDepth = opts.maxDepth ?? Infinity;
76
+ const rootDatum = {
77
+ label: "__root",
78
+ children: roots.map((r) => toDatum(r))
79
+ };
80
+ const h = hierarchy(rootDatum).sum((d) => d.children?.length ? 0 : d.value ?? 0).sort((a, b) => (b.value ?? 0) - (a.value ?? 0));
81
+ const hroot = treemap().tile(treemapSquarify).size([opts.width, opts.height]).paddingOuter(opts.paddingOuter ?? 3).paddingTop(opts.headerH > 0 ? opts.headerH : opts.paddingInner ?? 2).paddingInner(opts.paddingInner ?? 2).round(true)(h);
82
+ const total = hroot.value ?? 0;
83
+ (hroot.children ?? []).forEach((top, i) => {
84
+ top.each((d) => {
85
+ d._topIndex = i;
86
+ });
87
+ });
88
+ const cells = [];
89
+ for (const d of hroot.descendants()) {
90
+ if (d.depth === 0) continue;
91
+ if (d.depth > maxDepth) continue;
92
+ const hasChildren = !!d.children && d.children.length > 0;
93
+ const isCollapsed = hasChildren && d.depth >= maxDepth;
94
+ const isContainer = hasChildren && !isCollapsed;
95
+ const path = [];
96
+ let p = d;
97
+ while (p && p.depth > 0) {
98
+ path.unshift(p.data.label);
99
+ p = p.parent;
100
+ }
101
+ const heatVal = datumHeat(d);
102
+ cells.push({
103
+ node: d.data.ref ?? null,
104
+ label: d.data.label,
105
+ x0: d.x0,
106
+ y0: d.y0,
107
+ x1: d.x1,
108
+ y1: d.y1,
109
+ depth: d.depth,
110
+ value: d.value ?? 0,
111
+ isContainer,
112
+ isCollapsed,
113
+ topIndex: d._topIndex ?? 0,
114
+ pctOfRoot: total > 0 ? (d.value ?? 0) / total : 0,
115
+ pctOfParent: d.parent && (d.parent.value ?? 0) > 0 ? (d.value ?? 0) / (d.parent.value ?? 1) : 1,
116
+ ...heatVal !== void 0 && { heat: heatVal },
117
+ path,
118
+ ...d.data.lineNumber !== void 0 && { lineNumber: d.data.lineNumber }
119
+ });
120
+ }
121
+ return { cells, total };
122
+ }
123
+
124
+ // src/treemap/renderer.ts
125
+ var PADDING = 12;
126
+ var HEADER_H = 18;
127
+ var TITLE_BAND = 36;
128
+ var LEAF_MUTE_PCT = 50;
129
+ var LEGEND_POSITION = {
130
+ placement: "top-center",
131
+ titleRelation: "below-title"
132
+ };
133
+ function renderTreemapForExport(container, parsed, palette, isDark, exportDims, options) {
134
+ renderTreemap(container, parsed, palette, isDark, exportDims, {
135
+ exportMode: true,
136
+ ...options
137
+ });
138
+ }
139
+ function renderTreemap(container, parsed, palette, isDark, exportDims, options = {}) {
140
+ if (parsed.error || parsed.roots.length === 0) return;
141
+ void isDark;
142
+ d3Selection.select(container).selectAll(":not([data-d3-tooltip])").remove();
143
+ const width = exportDims?.width ?? container.clientWidth;
144
+ const height = exportDims?.height ?? container.clientHeight;
145
+ if (width <= 0 || height <= 0) return;
146
+ const mode = resolveColorMode(parsed, options.colorMode);
147
+ const opts = parsed.options;
148
+ const solid = opts.solidFill;
149
+ const exportMode = options.exportMode ?? false;
150
+ const seriesColorsTop = getSeriesColors(palette);
151
+ const showTitle = !!parsed.title;
152
+ const titleH = showTitle ? TITLE_BAND : 0;
153
+ const heat = buildHeatScale(parsed, palette);
154
+ const legend = !opts.noLegend ? buildLegend(mode, parsed, heat, seriesColorsTop, options.colorOffset ?? 0) : null;
155
+ const legendReserve = legend ? getMaxLegendReservedHeight(
156
+ { groups: legend.groups, position: LEGEND_POSITION, mode: "preview" },
157
+ width
158
+ ) + LEGEND_GROUP_GAP : 0;
159
+ const headerH = opts.noHeaders ? 0 : HEADER_H;
160
+ const areaX = PADDING;
161
+ const areaY = titleH + legendReserve + PADDING;
162
+ const areaW = Math.max(1, width - PADDING * 2);
163
+ const areaH = Math.max(1, height - areaY - PADDING);
164
+ const layout = layoutTreemap(parsed.roots, {
165
+ width: areaW,
166
+ height: areaH,
167
+ headerH,
168
+ ...options.maxDepth !== void 0 && { maxDepth: options.maxDepth }
169
+ });
170
+ const svg = d3Selection.select(container).append("svg").attr("width", width).attr("height", height).attr("viewBox", `0 0 ${width} ${height}`).attr("preserveAspectRatio", "xMidYMin meet").attr("xmlns", "http://www.w3.org/2000/svg").attr("class", "dgmo-treemap").style("font-family", FONT_FAMILY);
171
+ svg.append("style").text(
172
+ ".dgmo-treemap-focus{opacity:.3;transition:opacity .12s}.dgmo-treemap-cell:hover .dgmo-treemap-focus{opacity:.7}"
173
+ );
174
+ svg.append("rect").attr("width", width).attr("height", height).attr("fill", palette.bg);
175
+ if (showTitle) {
176
+ const title = svg.append("text").attr("class", "chart-title").attr("x", width / 2).attr("y", TITLE_Y).attr("text-anchor", "middle").attr("fill", palette.text).attr("font-family", FONT_FAMILY).attr("font-size", TITLE_FONT_SIZE).attr("font-weight", TITLE_FONT_WEIGHT).text(parsed.title);
177
+ if (parsed.titleLineNumber !== null) {
178
+ title.attr("data-line-number", parsed.titleLineNumber);
179
+ }
180
+ }
181
+ const root = svg.append("g").attr("class", "dgmo-treemap-cells").attr("transform", `translate(${areaX},${areaY})`);
182
+ const seriesColors = seriesColorsTop;
183
+ const colorOffset = options.colorOffset ?? 0;
184
+ const activeGroup = parsed.tagGroups.length > 0 ? parsed.tagGroups[0].name : null;
185
+ const rootIndexByLabel = new Map(parsed.roots.map((r, i) => [r.label, i]));
186
+ const colorCtx = {
187
+ mode,
188
+ heat,
189
+ tagGroups: parsed.tagGroups,
190
+ activeGroup,
191
+ rootIndexByLabel,
192
+ seriesColors,
193
+ colorOffset,
194
+ bg: palette.bg
195
+ };
196
+ for (const cell of layout.cells) {
197
+ const w = Math.max(0, cell.x1 - cell.x0);
198
+ const h = Math.max(0, cell.y1 - cell.y0);
199
+ if (w <= 0 || h <= 0) continue;
200
+ const baseColor = resolveCellColor(cell, colorCtx);
201
+ const fill = cell.isContainer ? baseColor : solid ? baseColor : mix(baseColor, palette.bg, LEAF_MUTE_PCT);
202
+ const drillable = cell.isContainer || cell.isCollapsed;
203
+ const g = root.append("g").attr("class", "dgmo-treemap-cell").attr("transform", `translate(${cell.x0},${cell.y0})`).attr("data-node-path", cell.path.join(" / "));
204
+ if (cell.lineNumber !== void 0) {
205
+ g.attr("data-line-number", cell.lineNumber);
206
+ }
207
+ if (cell.heat !== void 0) g.attr("data-heat", cell.heat);
208
+ if (cell.node && activeGroup) {
209
+ const key = tagAttrKey(activeGroup);
210
+ const tagVal = cell.node.metadata[key];
211
+ if (tagVal) g.attr(`data-tag-${key}`, tagVal);
212
+ }
213
+ const rect = g.append("rect").attr(
214
+ "class",
215
+ cell.isContainer ? "dgmo-treemap-rect branch" : "dgmo-treemap-rect"
216
+ ).attr("width", w).attr("height", h).attr("rx", 2).attr("fill", fill).attr("fill-opacity", 1).attr("stroke", palette.bg).attr("stroke-width", cell.isContainer ? 1 : 0);
217
+ if (drillable && options.onClickItem && cell.lineNumber !== void 0) {
218
+ const ln = cell.lineNumber;
219
+ rect.style("cursor", "pointer").on("click", () => options.onClickItem(ln));
220
+ }
221
+ const ink = contrastText(
222
+ fill,
223
+ palette.textOnFillLight,
224
+ palette.textOnFillDark
225
+ );
226
+ if (cell.isContainer && headerH > 0 && w > 34 && h > headerH) {
227
+ const valParts = [];
228
+ if (!opts.noValues) valParts.push(compactNumber(cell.value));
229
+ if (!opts.noPercent) valParts.push(formatPct(cell.pctOfRoot));
230
+ const valStr = valParts.join(" \xB7 ");
231
+ const ICON_RESERVE = drillable ? 16 : 4;
232
+ const showVal = valStr.length > 0 && w > 110;
233
+ const valW = showVal ? measureText(valStr, 10.5) : 0;
234
+ const labelMax = w - 8 - ICON_RESERVE - (showVal ? valW + 10 : 0);
235
+ g.append("text").attr("class", "dgmo-treemap-header").attr("x", 6).attr("y", 13).attr("font-size", 11).attr("font-weight", 700).attr("fill", ink).text(clipLabel(cell.label, Math.max(0, labelMax), 11));
236
+ if (showVal) {
237
+ g.append("text").attr("class", "dgmo-treemap-header-value").attr("x", w - ICON_RESERVE - 4).attr("y", 13).attr("text-anchor", "end").attr("font-size", 10.5).attr("fill", ink).attr("opacity", 0.75).text(valStr);
238
+ }
239
+ }
240
+ const PAD = Math.max(4, Math.min(14, Math.floor(Math.min(w, h) / 5)));
241
+ const MIN_FS = 7;
242
+ if (!cell.isContainer && w >= 2 * PAD + 8 && h >= 2 * PAD + 8) {
243
+ const maxW = w - 2 * PAD;
244
+ const horizMinW = measureText(cell.label, MIN_FS) * 1.06;
245
+ if (horizMinW > maxW && h > w * 1.25 && h - 2 * PAD > maxW) {
246
+ drawVerticalLabel(g, cell.label, w, h, PAD, ink);
247
+ if (drillable && w > 30 && h > 22) drawFocusIcon(g, w, ink, 9);
248
+ continue;
249
+ }
250
+ let fs = clamp(Math.round(Math.min(w / 3.6, h / 3.4)), MIN_FS, 72);
251
+ const nameW = measureText(cell.label, fs) * 1.06;
252
+ if (nameW > maxW) fs = Math.max(MIN_FS, Math.floor(fs * maxW / nameW));
253
+ const tg = clamp((fs - MIN_FS) / (72 - MIN_FS), 0, 1);
254
+ const nameOpacity = 0.95 - tg * 0.5;
255
+ const vfs = clamp(Math.round(fs * 0.42), 11, 28);
256
+ const valOpacity = Math.max(0.45, nameOpacity - 0.1);
257
+ let y = PAD + Math.round(fs * 0.78);
258
+ g.append("text").attr("class", "dgmo-treemap-label").attr("x", PAD).attr("y", y).attr("font-size", fs).attr("font-weight", 600).attr("fill", ink).attr("opacity", nameOpacity).text(clipLabel(cell.label, maxW, fs));
259
+ const valParts = [
260
+ opts.noValues ? "" : compactNumber(cell.value),
261
+ opts.noPercent ? "" : formatPct(cell.pctOfRoot)
262
+ ].filter(Boolean);
263
+ const combined = valParts.join(" \xB7 ");
264
+ const nameBaseY = y;
265
+ const addLineAt = (text, yy, size, opacity) => {
266
+ g.append("text").attr("class", "dgmo-treemap-value").attr("x", PAD).attr("y", yy).attr("font-size", size).attr("fill", ink).attr("opacity", opacity).text(text);
267
+ };
268
+ if (combined) {
269
+ const fitsW = measureText(combined, vfs) <= maxW;
270
+ const valY = y + lineDrop(fs, vfs);
271
+ const roomBelow = valY + descent(vfs) <= h - PAD;
272
+ if (fitsW && roomBelow) {
273
+ addLineAt(combined, valY, vfs, valOpacity);
274
+ } else if (fitsW) {
275
+ const ivfs = clamp(Math.round(fs * 0.5), 11, Math.max(11, vfs));
276
+ const rendered = clipLabel(cell.label, maxW, fs);
277
+ const nW = measureText(rendered, fs) * 1.12;
278
+ const gap = Math.max(12, Math.round(fs * 0.25));
279
+ if (PAD + nW + gap + measureText(combined, ivfs) <= w - PAD) {
280
+ g.append("text").attr("class", "dgmo-treemap-value").attr("x", PAD + nW + gap).attr("y", nameBaseY).attr("font-size", ivfs).attr("fill", ink).attr("opacity", valOpacity).text(combined);
281
+ }
282
+ } else if (valParts.length === 2) {
283
+ const d1 = lineDrop(fs, vfs);
284
+ if (y + d1 + descent(vfs) <= h - PAD) {
285
+ y += d1;
286
+ addLineAt(valParts[0], y, vfs, valOpacity);
287
+ }
288
+ const pfs = Math.max(10, Math.round(vfs * 0.9));
289
+ const d2 = lineDrop(vfs, pfs);
290
+ if (y + d2 + descent(pfs) <= h - PAD) {
291
+ y += d2;
292
+ addLineAt(valParts[1], y, pfs, valOpacity);
293
+ }
294
+ } else {
295
+ const onlyY = y + lineDrop(fs, vfs);
296
+ if (onlyY + descent(vfs) <= h - PAD) {
297
+ addLineAt(combined, onlyY, vfs, valOpacity);
298
+ }
299
+ }
300
+ }
301
+ }
302
+ if (drillable && w > 30 && h > 22) {
303
+ drawFocusIcon(g, w, ink, 9);
304
+ }
305
+ }
306
+ if (legend) {
307
+ const legendG = svg.append("g").attr("class", "dgmo-treemap-legend").attr("transform", `translate(0, ${titleH})`);
308
+ renderIntegratedLegend(legendG, {
309
+ groups: legend.groups,
310
+ palette: {
311
+ bg: palette.bg,
312
+ surface: palette.surface,
313
+ text: palette.text,
314
+ textMuted: palette.textMuted,
315
+ primary: palette.primary
316
+ },
317
+ isDark,
318
+ width,
319
+ mode: exportMode ? "export" : "preview",
320
+ position: LEGEND_POSITION,
321
+ activeGroup: legend.activeGroup,
322
+ // The color-mode switcher is the legend itself: each applicable mode is a
323
+ // group pill; the active one is the open capsule, the rest are clickable
324
+ // pills that switch mode. Export shows only the active group.
325
+ showInactivePills: !exportMode,
326
+ showEmptyGroups: !exportMode,
327
+ ...options.onSelectMode !== void 0 && {
328
+ callbacks: {
329
+ onGroupToggle: (name) => {
330
+ const m = legend.modeByName.get(name);
331
+ if (m) options.onSelectMode(m);
332
+ }
333
+ }
334
+ }
335
+ });
336
+ }
337
+ }
338
+ function drawFocusIcon(g, w, ink, cy) {
339
+ const r = 4.5;
340
+ const cx = w - r - 5;
341
+ const fi = g.append("g").attr("class", "dgmo-treemap-focus").attr("data-export-ignore", "true");
342
+ fi.append("rect").attr("x", cx - 9).attr("y", cy - 9).attr("width", 18).attr("height", 18).attr("fill", "transparent");
343
+ fi.append("circle").attr("cx", cx).attr("cy", cy).attr("r", r).attr("fill", "none").attr("stroke", ink).attr("stroke-width", 1.25);
344
+ fi.append("circle").attr("cx", cx).attr("cy", cy).attr("r", 1.4).attr("fill", ink);
345
+ }
346
+ function drawVerticalLabel(g, label, w, h, pad, ink) {
347
+ const MIN_FS = 6;
348
+ const availLen = h - 2 * pad;
349
+ const availThick = w - 2 * pad;
350
+ let fs = clamp(Math.round(Math.min(availThick / 0.8, 14)), MIN_FS, 22);
351
+ const nameW = measureText(label, fs) * 1.06;
352
+ if (nameW > availLen)
353
+ fs = Math.max(MIN_FS, Math.floor(fs * availLen / nameW));
354
+ const text = clipLabel(label, availLen, fs);
355
+ if (!text) return;
356
+ g.append("text").attr("class", "dgmo-treemap-label").attr("transform", `translate(${w / 2},${h / 2}) rotate(-90)`).attr("y", Math.round(fs * 0.28)).attr("text-anchor", "middle").attr("font-size", fs).attr("font-weight", 600).attr("fill", ink).attr("opacity", 0.95).text(text);
357
+ }
358
+ function descent(fs) {
359
+ return Math.ceil(fs * 0.26);
360
+ }
361
+ function lineDrop(prevFs, nextFs, gap = 4) {
362
+ return descent(prevFs) + gap + Math.round(nextFs * 0.72);
363
+ }
364
+ function clamp(x, lo, hi) {
365
+ return Math.max(lo, Math.min(hi, x));
366
+ }
367
+ function clipLabel(s, maxWidth, fs) {
368
+ if (measureText(s, fs) <= maxWidth) return s;
369
+ let lo = 0;
370
+ let hi = s.length;
371
+ while (lo < hi) {
372
+ const mid = Math.ceil((lo + hi) / 2);
373
+ if (measureText(s.slice(0, mid) + "\u2026", fs) <= maxWidth) lo = mid;
374
+ else hi = mid - 1;
375
+ }
376
+ return lo <= 0 ? "" : s.slice(0, lo) + "\u2026";
377
+ }
378
+
379
+ export {
380
+ layoutTreemap,
381
+ renderTreemapForExport,
382
+ renderTreemap
383
+ };
384
+ //# sourceMappingURL=chunk-FCIIHT24.js.map
@@ -0,0 +1,97 @@
1
+ import {
2
+ makeDgmoError
3
+ } from "./chunk-CXK4DZH3.js";
4
+
5
+ // src/utils/arrows.ts
6
+ var ARROW_DIAGNOSTIC_CODES = {
7
+ /** Active: label contains `->` or `~>` substring (TD-13). */
8
+ ARROW_SUBSTRING_IN_LABEL: "E_ARROW_SUBSTRING_IN_LABEL",
9
+ /** Active: label contains a forbidden control character (TD-14). */
10
+ CONTROL_CHAR_IN_LABEL: "E_CONTROL_CHAR_IN_LABEL"
11
+ };
12
+ function validateLabelCharacters(label, lineNumber) {
13
+ const out = [];
14
+ if (label.includes("->") || label.includes("~>")) {
15
+ out.push(
16
+ makeDgmoError(
17
+ lineNumber,
18
+ 'Arrow symbols (-> or ~>) are not allowed inside a label. Move the label after the arrow: "A -> B: uses -> to chain". See "In-Arrow Message Labels" \u2192 Forbidden.',
19
+ "error",
20
+ ARROW_DIAGNOSTIC_CODES.ARROW_SUBSTRING_IN_LABEL
21
+ )
22
+ );
23
+ }
24
+ for (const ch of label) {
25
+ const cp = ch.codePointAt(0);
26
+ const isC0 = cp >= 0 && cp <= 31 && cp !== 9;
27
+ const isDel = cp === 127;
28
+ if (isC0 || isDel) {
29
+ const hex = cp.toString(16).toUpperCase().padStart(4, "0");
30
+ out.push(
31
+ makeDgmoError(
32
+ lineNumber,
33
+ `Label contains a control character (U+${hex}). Remove it and use plain text.`,
34
+ "error",
35
+ ARROW_DIAGNOSTIC_CODES.CONTROL_CHAR_IN_LABEL
36
+ )
37
+ );
38
+ break;
39
+ }
40
+ }
41
+ return out;
42
+ }
43
+ function parseInArrowLabel(rawLabel, lineNumber) {
44
+ const trimmed = rawLabel.trim();
45
+ if (trimmed.length === 0) {
46
+ return { label: void 0, diagnostics: [] };
47
+ }
48
+ const diagnostics = validateLabelCharacters(trimmed, lineNumber);
49
+ return { label: trimmed, diagnostics };
50
+ }
51
+ var SYNC_LABELED_RE = /^(.+?)\s*-(.+)->\s*(.+)$/;
52
+ var ASYNC_LABELED_RE = /^(.+?)\s*~(.+)~>\s*(.+)$/;
53
+ var RETURN_SYNC_LABELED_RE = /^(.+?)\s*<-(.+)-\s*(.+)$/;
54
+ var RETURN_ASYNC_LABELED_RE = /^(.+?)\s*<~(.+)~\s*(.+)$/;
55
+ var BIDI_SYNC_RE = /^(.+?)\s*<-(.+)->\s*(.+)$/;
56
+ var BIDI_ASYNC_RE = /^(.+?)\s*<~(.+)~>\s*(.+)$/;
57
+ function parseArrow(line) {
58
+ if (BIDI_SYNC_RE.test(line) || BIDI_ASYNC_RE.test(line)) {
59
+ return {
60
+ error: "Bidirectional arrows are no longer supported. Use two separate lines: 'A -msg-> B' and 'B -msg-> A'"
61
+ };
62
+ }
63
+ if (RETURN_SYNC_LABELED_RE.test(line) || RETURN_ASYNC_LABELED_RE.test(line)) {
64
+ const m = line.match(RETURN_SYNC_LABELED_RE) ?? line.match(RETURN_ASYNC_LABELED_RE);
65
+ const from = m[3];
66
+ const to = m[1];
67
+ const label = m[2].trim();
68
+ return {
69
+ error: `Left-pointing arrows are no longer supported. Write '${from} -${label}-> ${to}' instead`
70
+ };
71
+ }
72
+ const patterns = [
73
+ { re: SYNC_LABELED_RE, async: false },
74
+ { re: ASYNC_LABELED_RE, async: true }
75
+ ];
76
+ for (const { re, async: isAsync } of patterns) {
77
+ const m = line.match(re);
78
+ if (!m) continue;
79
+ const label = m[2].trim();
80
+ if (!label) return null;
81
+ return {
82
+ from: m[1],
83
+ to: m[3],
84
+ label,
85
+ async: isAsync
86
+ };
87
+ }
88
+ return null;
89
+ }
90
+
91
+ export {
92
+ ARROW_DIAGNOSTIC_CODES,
93
+ validateLabelCharacters,
94
+ parseInArrowLabel,
95
+ parseArrow
96
+ };
97
+ //# sourceMappingURL=chunk-FFUN5D66.js.map