@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,54 @@
1
+ import {
2
+ buildMapProjection
3
+ } from "./chunk-IPWPWM6R.js";
4
+ import {
5
+ TITLE_FONT_SIZE,
6
+ TITLE_Y
7
+ } from "./chunk-A4GOY3PE.js";
8
+
9
+ // src/map/dimensions.ts
10
+ import { geoPath } from "d3-geo";
11
+ var FIT_PAD = 24;
12
+ var TITLE_GAP = 16;
13
+ var ASPECT_MAX = 3;
14
+ var ASPECT_MIN = 0.9;
15
+ var GLOBAL_HEIGHT_BOOST = 1.12;
16
+ var MIN_MAP_BAND = 200;
17
+ var FALLBACK_ASPECT = 1.5;
18
+ var REF = 1e3;
19
+ function mapContentAspect(resolved, data, ref = REF) {
20
+ const { projection, fitTarget } = buildMapProjection(resolved, data);
21
+ projection.fitSize([ref, ref], fitTarget);
22
+ const b = geoPath(projection).bounds(fitTarget);
23
+ const w = b[1][0] - b[0][0];
24
+ const h = b[1][1] - b[0][1];
25
+ const aspect = w / h;
26
+ return Number.isFinite(aspect) && aspect > 0 ? aspect : FALLBACK_ASPECT;
27
+ }
28
+ function mapExportDimensions(resolved, data, baseWidth = 1200, aspectOverride) {
29
+ const useOverride = aspectOverride !== void 0 && Number.isFinite(aspectOverride) && aspectOverride > 0;
30
+ const raw = useOverride ? aspectOverride : mapContentAspect(resolved, data);
31
+ const isGlobal = !useOverride && buildMapProjection(resolved, data).fitIsGlobal;
32
+ const target = isGlobal ? raw / GLOBAL_HEIGHT_BOOST : raw;
33
+ const clamped = useOverride ? raw : Math.max(ASPECT_MIN, Math.min(ASPECT_MAX, target));
34
+ const width = baseWidth;
35
+ let height = Math.round(width / clamped);
36
+ let chromeReserve = 0;
37
+ if (resolved.title && resolved.pois.length > 0) {
38
+ const bannerBottom = (resolved.subtitle ? TITLE_Y + TITLE_FONT_SIZE : TITLE_Y) + TITLE_FONT_SIZE / 2;
39
+ chromeReserve += Math.max(FIT_PAD, bannerBottom + TITLE_GAP) - FIT_PAD;
40
+ }
41
+ let floored = false;
42
+ if (height - chromeReserve < MIN_MAP_BAND) {
43
+ height = Math.round(chromeReserve + MIN_MAP_BAND);
44
+ floored = true;
45
+ }
46
+ const preferContain = useOverride ? floored : clamped !== target || floored;
47
+ return { width, height, preferContain };
48
+ }
49
+
50
+ export {
51
+ mapContentAspect,
52
+ mapExportDimensions
53
+ };
54
+ //# sourceMappingURL=chunk-CKNVO24D.js.map
@@ -0,0 +1,391 @@
1
+ import {
2
+ computeNodeText,
3
+ layoutMindmap
4
+ } from "./chunk-T2OE3YQB.js";
5
+ import {
6
+ renderInlineText
7
+ } from "./chunk-3HDBAXF5.js";
8
+ import {
9
+ extractExportSvg,
10
+ runInExportContainer
11
+ } from "./chunk-Y5QGVTVC.js";
12
+ import {
13
+ COLLAPSE_BAR_HEIGHT,
14
+ EDGE_STROKE_WIDTH,
15
+ NODE_STROKE_WIDTH
16
+ } from "./chunk-3CIOJ5YJ.js";
17
+ import {
18
+ renderIntegratedLegend
19
+ } from "./chunk-PWIHZ6NJ.js";
20
+ import {
21
+ ScaleContext
22
+ } from "./chunk-YYVTBZZC.js";
23
+ import {
24
+ getMaxLegendReservedHeight
25
+ } from "./chunk-YAA6IID3.js";
26
+ import {
27
+ TITLE_FONT_SIZE,
28
+ TITLE_FONT_WEIGHT
29
+ } from "./chunk-A4GOY3PE.js";
30
+ import {
31
+ FONT_FAMILY
32
+ } from "./chunk-6KFWC4CO.js";
33
+ import {
34
+ LEGEND_GROUP_GAP
35
+ } from "./chunk-QOOUC2J5.js";
36
+ import {
37
+ parseMindmap
38
+ } from "./chunk-EB6FPQUP.js";
39
+ import {
40
+ preprocessDescriptionLine
41
+ } from "./chunk-IYULMRBE.js";
42
+ import {
43
+ contrastText,
44
+ shapeFill
45
+ } from "./chunk-P6T66CCZ.js";
46
+ import {
47
+ tagAttrKey
48
+ } from "./chunk-QLCCJEJI.js";
49
+
50
+ // src/mindmap/renderer.ts
51
+ import * as d3Selection from "d3-selection";
52
+ var DIAGRAM_PADDING = 20;
53
+ var TITLE_HEIGHT = 30;
54
+ var SINGLE_LABEL_HEIGHT = 28;
55
+ var LABEL_LINE_HEIGHT = 18;
56
+ var DESC_LINE_HEIGHT = 14;
57
+ var NODE_RADIUS = 6;
58
+ var ROOT_STROKE_WIDTH = 2.5;
59
+ function nodeFill(palette, isDark, nodeColor, solid) {
60
+ const color = nodeColor ?? palette.primary;
61
+ return shapeFill(palette, color, isDark, {
62
+ ...solid !== void 0 && { solid }
63
+ });
64
+ }
65
+ function nodeStroke(palette, nodeColor) {
66
+ return nodeColor ?? palette.primary;
67
+ }
68
+ var DEPTH_COLOR_KEYS = [
69
+ "red",
70
+ "orange",
71
+ "yellow",
72
+ "green",
73
+ "blue",
74
+ "purple",
75
+ "teal",
76
+ "cyan"
77
+ ];
78
+ function depthColor(depth, palette) {
79
+ const key = DEPTH_COLOR_KEYS[depth];
80
+ if (key && key in palette.colors) {
81
+ return palette.colors[key];
82
+ }
83
+ return palette.colors.gray;
84
+ }
85
+ function renderMindmap(container, parsed, layout, palette, isDark, onClickItem, exportDims, onToggleNode, hideDescriptions, activeTagGroup, options) {
86
+ const isExport = !!exportDims;
87
+ const containerWidth = exportDims?.width ?? (container.getBoundingClientRect().width || 800);
88
+ const containerHeight = exportDims?.height ?? (container.getBoundingClientRect().height || 600);
89
+ d3Selection.select(container).selectAll("*").remove();
90
+ const svg = d3Selection.select(container).append("svg").attr("width", containerWidth).attr("height", containerHeight).attr("viewBox", `0 0 ${containerWidth} ${containerHeight}`).attr("preserveAspectRatio", "xMidYMin meet").style("font-family", FONT_FAMILY);
91
+ const appHosted = options?.controlsHost === "app";
92
+ const hasControls = !!options?.onToggleColorByDepth || !!options?.onToggleDescriptions;
93
+ const hasLegend = parsed.tagGroups.length > 0 || hasControls && !appHosted;
94
+ const fixedLegend = !isExport && hasLegend;
95
+ const legendReserve = fixedLegend ? getMaxLegendReservedHeight(
96
+ {
97
+ groups: parsed.tagGroups,
98
+ position: { placement: "top-center", titleRelation: "below-title" },
99
+ mode: "preview"
100
+ },
101
+ containerWidth
102
+ ) + LEGEND_GROUP_GAP : 0;
103
+ const showTitle = !!parsed.title && parsed.options["no-title"] !== "on";
104
+ const fixedTitle = !isExport && showTitle;
105
+ const titleReserve = fixedTitle ? TITLE_HEIGHT : 0;
106
+ const availWidth = containerWidth;
107
+ const availHeight = containerHeight - DIAGRAM_PADDING * 2 - legendReserve - titleReserve;
108
+ let ctx = isExport ? ScaleContext.identity() : ScaleContext.fromBox(
109
+ availWidth,
110
+ layout.width,
111
+ availHeight,
112
+ layout.height
113
+ );
114
+ let renderLayout = layout;
115
+ if (ctx.factor < 1) {
116
+ const hiddenCounts = /* @__PURE__ */ new Map();
117
+ for (const n of layout.nodes) {
118
+ if (n.hiddenCount != null && n.hiddenCount > 0) {
119
+ hiddenCounts.set(n.id, n.hiddenCount);
120
+ }
121
+ }
122
+ const relayout = (c) => layoutMindmap(parsed, palette, {
123
+ interactive: !isExport,
124
+ ...hiddenCounts.size > 0 && { hiddenCounts },
125
+ activeTagGroup: activeTagGroup ?? null,
126
+ ...hideDescriptions !== void 0 && { hideDescriptions },
127
+ ctx: c
128
+ });
129
+ renderLayout = relayout(ctx);
130
+ for (let i = 0; i < 3 && !ctx.isBelowFloor; i++) {
131
+ const refit = Math.min(
132
+ availWidth / renderLayout.width,
133
+ availHeight / renderLayout.height
134
+ );
135
+ if (refit >= 0.999) break;
136
+ ctx = ScaleContext.fromFactor(ctx.factor * refit);
137
+ renderLayout = relayout(ctx);
138
+ }
139
+ }
140
+ const fitScale = isExport ? 1 : Math.min(
141
+ 1,
142
+ renderLayout.width > 0 ? availWidth / renderLayout.width : 1,
143
+ renderLayout.height > 0 ? availHeight / renderLayout.height : 1
144
+ );
145
+ const scaledWidth = renderLayout.width * fitScale;
146
+ const scaledHeight = renderLayout.height * fitScale;
147
+ const offsetX = Math.max(0, (availWidth - scaledWidth) / 2);
148
+ const offsetY = DIAGRAM_PADDING + legendReserve + titleReserve + Math.max(0, (availHeight - scaledHeight) / 2);
149
+ const mainG = svg.append("g").attr(
150
+ "transform",
151
+ `translate(${offsetX}, ${offsetY})${fitScale < 1 ? ` scale(${fitScale})` : ""}`
152
+ );
153
+ if (ctx.isBelowFloor) {
154
+ svg.attr("width", "100%");
155
+ }
156
+ if (showTitle) {
157
+ const titleParent = fixedTitle ? svg : mainG;
158
+ const titleX = fixedTitle ? containerWidth / 2 : renderLayout.width / 2;
159
+ const titleY = fixedTitle ? DIAGRAM_PADDING + TITLE_FONT_SIZE : TITLE_FONT_SIZE;
160
+ const titleText = titleParent.append("text").attr("x", titleX).attr("y", titleY).attr("text-anchor", "middle").attr("font-size", TITLE_FONT_SIZE).attr("font-weight", TITLE_FONT_WEIGHT).attr("fill", palette.text).attr("class", "chart-title").text(parsed.title);
161
+ if (parsed.titleLineNumber) {
162
+ titleText.attr("data-line-number", parsed.titleLineNumber);
163
+ }
164
+ if (onClickItem && parsed.titleLineNumber) {
165
+ titleText.style("cursor", "pointer").on("click", () => onClickItem(parsed.titleLineNumber));
166
+ }
167
+ }
168
+ if (fixedLegend) {
169
+ const legendG = svg.append("g").attr("class", "mindmap-legend-fixed").attr("transform", `translate(0, ${DIAGRAM_PADDING + titleReserve})`);
170
+ const usedValues = /* @__PURE__ */ new Map();
171
+ for (const node of renderLayout.nodes) {
172
+ for (const tg of parsed.tagGroups) {
173
+ const key = tg.name.toLowerCase();
174
+ const val = node.metadata[key];
175
+ if (val) {
176
+ if (!usedValues.has(key)) usedValues.set(key, /* @__PURE__ */ new Set());
177
+ usedValues.get(key).add(val.toLowerCase());
178
+ }
179
+ }
180
+ }
181
+ const toggles = [];
182
+ if (options?.onToggleDescriptions) {
183
+ toggles.push({
184
+ id: "descriptions",
185
+ type: "toggle",
186
+ label: "Descriptions",
187
+ active: !hideDescriptions,
188
+ onToggle: (active) => options.onToggleDescriptions(active)
189
+ });
190
+ }
191
+ if (options?.onToggleColorByDepth) {
192
+ toggles.push({
193
+ id: "depth-colors",
194
+ type: "toggle",
195
+ label: "Depth Colors",
196
+ active: options.colorByDepth ?? false,
197
+ onToggle: options.onToggleColorByDepth
198
+ });
199
+ }
200
+ const controlsToggles = toggles.length > 0 ? { toggles } : void 0;
201
+ const legendConfig = {
202
+ groups: parsed.tagGroups.map((tg) => {
203
+ const used = usedValues.get(tg.name.toLowerCase());
204
+ return {
205
+ name: tg.name,
206
+ ...tg.alias !== void 0 && { alias: tg.alias },
207
+ entries: tg.entries.filter((e) => used?.has(e.value.toLowerCase())).map((e) => ({ value: e.value, color: e.color }))
208
+ };
209
+ }),
210
+ position: { placement: "top-center", titleRelation: "below-title" },
211
+ mode: options?.exportMode ? "export" : "preview",
212
+ ...controlsToggles !== void 0 && { controlsGroup: controlsToggles },
213
+ ...options?.controlsHost !== void 0 && {
214
+ controlsHost: options.controlsHost
215
+ }
216
+ };
217
+ const legendPalette = {
218
+ text: palette.text,
219
+ textMuted: palette.textMuted,
220
+ bg: palette.bg,
221
+ surface: palette.surface,
222
+ primary: palette.primary
223
+ };
224
+ const legendCallbacks = {
225
+ ...options?.onToggleControlsExpand !== void 0 && {
226
+ onControlsExpand: options.onToggleControlsExpand
227
+ },
228
+ onControlsToggle: (id, active) => {
229
+ if (id === "depth-colors" && options?.onToggleColorByDepth) {
230
+ options.onToggleColorByDepth(active);
231
+ }
232
+ if (id === "descriptions" && options?.onToggleDescriptions) {
233
+ options.onToggleDescriptions(active);
234
+ }
235
+ }
236
+ };
237
+ renderIntegratedLegend(legendG, {
238
+ ...legendConfig,
239
+ palette: legendPalette,
240
+ isDark,
241
+ width: containerWidth,
242
+ activeGroup: options?.colorByDepth ? null : activeTagGroup !== void 0 ? activeTagGroup : parsed.options["active-tag"] ?? null,
243
+ hiddenAttributes: /* @__PURE__ */ new Set(),
244
+ ...options?.controlsExpanded !== void 0 && {
245
+ controlsExpanded: options.controlsExpanded
246
+ },
247
+ callbacks: legendCallbacks
248
+ });
249
+ }
250
+ for (const edge of renderLayout.edges) {
251
+ mainG.append("path").attr("class", "mindmap-edge").attr("d", edge.path).attr("fill", "none").attr("stroke", palette.textMuted).attr("stroke-width", EDGE_STROKE_WIDTH).attr("stroke-opacity", 0.5);
252
+ }
253
+ for (const node of renderLayout.nodes) {
254
+ const isRoot = node.radius === 0 && renderLayout.nodes.indexOf(node) === 0;
255
+ const strokeW = isRoot ? ROOT_STROKE_WIDTH : NODE_STROKE_WIDTH;
256
+ const effectiveColor = options?.colorByDepth ? depthColor(node.depth, palette) : node.color;
257
+ const fill = nodeFill(
258
+ palette,
259
+ isDark,
260
+ effectiveColor,
261
+ parsed.options["solid-fill"] === "on"
262
+ );
263
+ const stroke = nodeStroke(palette, effectiveColor);
264
+ const onFillText = contrastText(
265
+ fill,
266
+ palette.textOnFillLight,
267
+ palette.textOnFillDark
268
+ );
269
+ const nodeG = mainG.append("g").attr("class", "mindmap-node").attr("data-line-number", node.lineNumber);
270
+ if (activeTagGroup) {
271
+ const tagKey = tagAttrKey(activeTagGroup);
272
+ const metaValue = node.metadata[tagKey];
273
+ if (metaValue) {
274
+ nodeG.attr(`data-tag-${tagKey}`, metaValue.toLowerCase());
275
+ }
276
+ }
277
+ if (node.hasChildren) {
278
+ nodeG.attr("data-node-toggle", node.id).attr("tabindex", "0").attr("role", "button").attr(
279
+ "aria-expanded",
280
+ node.hiddenCount != null && node.hiddenCount > 0 ? "false" : "true"
281
+ ).attr("aria-label", node.label);
282
+ }
283
+ nodeG.append("rect").attr("x", node.x).attr("y", node.y).attr("width", node.width).attr("height", node.height).attr("rx", NODE_RADIUS).attr("ry", NODE_RADIUS).attr("fill", fill).attr("stroke", stroke).attr("stroke-width", strokeW);
284
+ const collapsed = node.hiddenCount != null && node.hiddenCount > 0;
285
+ const showDesc = !hideDescriptions && !!node.description && !collapsed;
286
+ const textLayout = computeNodeText(
287
+ node.label,
288
+ node.description,
289
+ node.depth,
290
+ node.width,
291
+ hideDescriptions || collapsed
292
+ );
293
+ const {
294
+ labelLines,
295
+ labelFontSize: fontSize,
296
+ descLines,
297
+ descFontSize
298
+ } = textLayout;
299
+ const labelLineCount = labelLines.length;
300
+ const labelZoneH = labelLineCount <= 1 ? SINGLE_LABEL_HEIGHT : LABEL_LINE_HEIGHT * labelLineCount;
301
+ const labelZoneHeight = showDesc ? labelZoneH : node.height;
302
+ const centerX = node.x + node.width / 2;
303
+ if (labelLineCount <= 1) {
304
+ const labelY = node.y + labelZoneHeight / 2 + fontSize * 0.35;
305
+ nodeG.append("text").attr("x", centerX).attr("y", labelY).attr("text-anchor", "middle").attr("font-size", fontSize).attr("font-weight", isRoot ? "bold" : "normal").attr("fill", onFillText).text(labelLines[0]);
306
+ } else {
307
+ const blockH = LABEL_LINE_HEIGHT * (labelLineCount - 1);
308
+ const firstBaselineY = node.y + labelZoneHeight / 2 - blockH / 2 + fontSize * 0.35;
309
+ const textEl = nodeG.append("text").attr("x", centerX).attr("text-anchor", "middle").attr("font-size", fontSize).attr("font-weight", isRoot ? "bold" : "normal").attr("fill", onFillText);
310
+ for (let i = 0; i < labelLines.length; i++) {
311
+ textEl.append("tspan").attr("x", centerX).attr("y", firstBaselineY + i * LABEL_LINE_HEIGHT).text(labelLines[i]);
312
+ }
313
+ }
314
+ if (labelLines.length > 1 || labelLines[0] !== node.label) {
315
+ nodeG.append("title").text(node.label);
316
+ }
317
+ if (showDesc && descLines.length > 0) {
318
+ const separatorY = node.y + labelZoneH;
319
+ nodeG.append("line").attr("x1", node.x).attr("y1", separatorY).attr("x2", node.x + node.width).attr("y2", separatorY).attr("stroke", stroke).attr("stroke-opacity", 0.3).attr("stroke-width", 1);
320
+ if (descLines.length <= 1) {
321
+ const descY = separatorY + 4 + descFontSize;
322
+ const processed = preprocessDescriptionLine(descLines[0]);
323
+ const textEl = nodeG.append("text").attr("x", centerX).attr("y", descY).attr("text-anchor", "middle").attr("font-size", descFontSize).attr("fill", onFillText);
324
+ renderInlineText(textEl, processed, palette, descFontSize);
325
+ } else {
326
+ const descStartY = separatorY + 4 + descFontSize;
327
+ for (let i = 0; i < descLines.length; i++) {
328
+ const processed = preprocessDescriptionLine(descLines[i]);
329
+ const textEl = nodeG.append("text").attr("x", centerX).attr("y", descStartY + i * DESC_LINE_HEIGHT).attr("text-anchor", "middle").attr("font-size", descFontSize).attr("fill", onFillText);
330
+ renderInlineText(textEl, processed, palette, descFontSize);
331
+ }
332
+ }
333
+ }
334
+ if (!isExport && node.hiddenCount != null && node.hiddenCount > 0) {
335
+ const clipId = `collapse-clip-${node.id}`;
336
+ const defs = mainG.append("defs");
337
+ defs.append("clipPath").attr("id", clipId).append("rect").attr("x", node.x).attr("y", node.y).attr("width", node.width).attr("height", node.height).attr("rx", NODE_RADIUS).attr("ry", NODE_RADIUS);
338
+ nodeG.append("rect").attr("class", "collapse-bar").attr("x", node.x).attr("y", node.y + node.height - COLLAPSE_BAR_HEIGHT).attr("width", node.width).attr("height", COLLAPSE_BAR_HEIGHT).attr("fill", stroke).attr("clip-path", `url(#${clipId})`);
339
+ }
340
+ if (onClickItem) {
341
+ nodeG.style("cursor", "pointer").on("click", (event) => {
342
+ if (node.hasChildren && onToggleNode) {
343
+ event.stopPropagation();
344
+ onToggleNode(node.id);
345
+ } else {
346
+ onClickItem(node.lineNumber);
347
+ }
348
+ });
349
+ }
350
+ if (!isExport) {
351
+ nodeG.on("mouseenter", function() {
352
+ d3Selection.select(this).attr("opacity", 0.7);
353
+ }).on("mouseleave", function() {
354
+ d3Selection.select(this).attr("opacity", 1);
355
+ });
356
+ }
357
+ }
358
+ }
359
+ function renderMindmapForExport(content, theme, palette) {
360
+ const parsed = parseMindmap(content, palette);
361
+ if (parsed.error) return "";
362
+ const isDark = theme === "dark";
363
+ const hideDescriptions = parsed.options["no-descriptions"] === "true";
364
+ const layout = layoutMindmap(parsed, palette, {
365
+ interactive: false,
366
+ hideDescriptions
367
+ });
368
+ const titleOffset = parsed.title && parsed.options["no-title"] !== "on" ? TITLE_HEIGHT : 0;
369
+ const exportWidth = layout.width + DIAGRAM_PADDING * 2;
370
+ const exportHeight = layout.height + DIAGRAM_PADDING * 2 + titleOffset;
371
+ return runInExportContainer(exportWidth, exportHeight, (container) => {
372
+ renderMindmap(
373
+ container,
374
+ parsed,
375
+ layout,
376
+ palette,
377
+ isDark,
378
+ void 0,
379
+ { width: exportWidth, height: exportHeight },
380
+ void 0,
381
+ hideDescriptions
382
+ );
383
+ return extractExportSvg(container, theme);
384
+ });
385
+ }
386
+
387
+ export {
388
+ renderMindmap,
389
+ renderMindmapForExport
390
+ };
391
+ //# sourceMappingURL=chunk-CUVHQHZ7.js.map
@@ -0,0 +1,114 @@
1
+ // src/diagnostics.ts
2
+ function makeDgmoError(line, message, severity = "error", code) {
3
+ return code !== void 0 ? { line, message, severity, code } : { line, message, severity };
4
+ }
5
+ function emit(spec, line, params = {}, opts = {}) {
6
+ const message = typeof spec.message === "function" ? spec.message(params) : spec.message;
7
+ const err = {
8
+ line,
9
+ message,
10
+ severity: spec.severity,
11
+ code: spec.code
12
+ };
13
+ if (opts.column !== void 0) err.column = opts.column;
14
+ return err;
15
+ }
16
+ function dedupeDiagnostics(diagnostics) {
17
+ const seen = /* @__PURE__ */ new Set();
18
+ const out = [];
19
+ for (const d of diagnostics) {
20
+ const key = `${d.line}\0${d.column ?? ""}\0${d.severity}\0${d.code ?? ""}\0${d.message}`;
21
+ if (seen.has(key)) continue;
22
+ seen.add(key);
23
+ out.push(d);
24
+ }
25
+ return out;
26
+ }
27
+ function formatDgmoError(err) {
28
+ return err.line > 0 ? `Line ${err.line}: ${err.message}` : err.message;
29
+ }
30
+ function makeFail(result) {
31
+ return (line, message) => {
32
+ const diag = makeDgmoError(line, message);
33
+ result.diagnostics.push(diag);
34
+ result.error = formatDgmoError(diag);
35
+ return result;
36
+ };
37
+ }
38
+ function levenshtein(a, b) {
39
+ const m = a.length;
40
+ const n = b.length;
41
+ const dp = Array(n + 1).fill(0).map((_, i) => i);
42
+ for (let i = 1; i <= m; i++) {
43
+ let prev = dp[0];
44
+ dp[0] = i;
45
+ for (let j = 1; j <= n; j++) {
46
+ const tmp = dp[j];
47
+ dp[j] = a[i - 1] === b[j - 1] ? prev : 1 + Math.min(prev, dp[j], dp[j - 1]);
48
+ prev = tmp;
49
+ }
50
+ }
51
+ return dp[n];
52
+ }
53
+ function suggest(input, candidates) {
54
+ if (!input || candidates.length === 0) return null;
55
+ const lower = input.toLowerCase();
56
+ const threshold = Math.max(2, Math.floor(lower.length / 3));
57
+ let best = null;
58
+ let bestDist = Infinity;
59
+ for (const c of candidates) {
60
+ const dist = levenshtein(lower, c.toLowerCase());
61
+ if (dist < bestDist && dist <= threshold && dist > 0) {
62
+ bestDist = dist;
63
+ best = c;
64
+ }
65
+ }
66
+ return best ? `Did you mean '${best}'?` : null;
67
+ }
68
+ var NAME_DIAGNOSTIC_CODES = {
69
+ /**
70
+ * Warning: two source-distinct names normalized to the same key
71
+ * (case- or whitespace-only difference). The first occurrence wins
72
+ * for display; subsequent occurrences fold into it. Suppressible
73
+ * per-line via `# allow-merge` annotation when intentional.
74
+ *
75
+ * Note: the `I_` prefix is intentionally preserved for stability —
76
+ * callers may have pinned this string. The diagnostic emits at
77
+ * `warning` severity (no `info` severity exists in DgmoError).
78
+ */
79
+ NAME_MERGED: "I_NAME_MERGED"
80
+ };
81
+ function nameMergedMessage(args) {
82
+ return `merged '${args.incomingDisplay}' (line ${args.incomingLine}) into '${args.existingDisplay}' (line ${args.existingLine}) \u2014 names differ only in case/whitespace`;
83
+ }
84
+ var METADATA_DIAGNOSTIC_CODES = {
85
+ /**
86
+ * Error: a `tag` declaration appears after the first non-tag
87
+ * content line. The reserved-key registry is finalized before
88
+ * content-line mode begins; downstream-declared tag aliases
89
+ * cannot retroactively apply to earlier lines.
90
+ */
91
+ TAG_DECLARED_AFTER_CONTENT: "E_TAG_DECLARED_AFTER_CONTENT",
92
+ /**
93
+ * Warning: a metadata pair has an empty value (`Foo c:`). The
94
+ * pair is dropped from the entity's metadata.
95
+ */
96
+ EMPTY_METADATA_VALUE: "W_EMPTY_METADATA_VALUE"
97
+ };
98
+ function emptyMetadataValueMessage(key) {
99
+ return `Metadata key '${key}:' has no value \u2014 the pair is dropped. Provide a value or remove the key.`;
100
+ }
101
+
102
+ export {
103
+ makeDgmoError,
104
+ emit,
105
+ dedupeDiagnostics,
106
+ formatDgmoError,
107
+ makeFail,
108
+ suggest,
109
+ NAME_DIAGNOSTIC_CODES,
110
+ nameMergedMessage,
111
+ METADATA_DIAGNOSTIC_CODES,
112
+ emptyMetadataValueMessage
113
+ };
114
+ //# sourceMappingURL=chunk-CXK4DZH3.js.map