@diagrammo/dgmo 0.87.0 → 0.89.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 (149) hide show
  1. package/README.md +4 -2
  2. package/dist/advanced.d.ts +47 -11
  3. package/dist/advanced.js +110 -106
  4. package/dist/{analyzer-R5UBTRO2.js → analyzer-7ZGAZIE6.js} +2 -2
  5. package/dist/block.js +26 -25
  6. package/dist/{chart-meta-PbgpGwYo.d.ts → chart-meta-Bev5Ebjr.d.ts} +1 -1
  7. package/dist/chart-meta.d.ts +2 -2
  8. package/dist/chart-meta.js +11 -11
  9. package/dist/{chart-types-Db_EGf1o.d.ts → chart-types-Bf8C5QQW.d.ts} +1 -1
  10. package/dist/{charts-d3-3BZRSZV6.js → charts-d3-KEQSUWKP.js} +10 -10
  11. package/dist/{chunk-LJFXC3IP.js → chunk-2GM7N5TV.js} +10 -10
  12. package/dist/{chunk-H2GEIFUF.js → chunk-3AQJNY65.js} +8 -8
  13. package/dist/chunk-44FTCIRI.js +438 -0
  14. package/dist/{chunk-WZ23JJ7U.js → chunk-4AJKOUBO.js} +11 -11
  15. package/dist/{chunk-YK4N6TBN.js → chunk-4R6OMKXB.js} +7 -7
  16. package/dist/{chunk-HEYGGSNQ.js → chunk-5LE2CTLS.js} +2 -2
  17. package/dist/{chunk-AGO3PFGS.js → chunk-7C2RAGPT.js} +46 -31
  18. package/dist/{chunk-VJ2KROJ5.js → chunk-7KPHRTND.js} +1 -1
  19. package/dist/{chunk-LHL6HDUL.js → chunk-7SX4IY6T.js} +84 -12
  20. package/dist/{chunk-LSQGJN5H.js → chunk-7W4XLIVH.js} +15 -15
  21. package/dist/{chunk-Q2U5635V.js → chunk-ABP5BUD6.js} +9 -430
  22. package/dist/{chunk-XUDGZJTJ.js → chunk-AZ24RI5L.js} +6 -6
  23. package/dist/{chunk-UMRZPRAN.js → chunk-BB6QKWHZ.js} +15 -15
  24. package/dist/{chunk-6I5UN4FD.js → chunk-C4FRGZGX.js} +4 -4
  25. package/dist/{chunk-3DOQOXXI.js → chunk-CNUN5GO6.js} +1 -1
  26. package/dist/{chunk-5KGM44TG.js → chunk-CX6OH5WP.js} +1 -1
  27. package/dist/{chunk-D4M25W6R.js → chunk-DDPGEGHB.js} +5 -5
  28. package/dist/{chunk-B7CU2HW5.js → chunk-DZPHN2WN.js} +9 -9
  29. package/dist/{chunk-O6MMQQLF.js → chunk-ECMA6XE2.js} +10 -10
  30. package/dist/{chunk-MGBV4JEI.js → chunk-EDXGEQW3.js} +1 -1
  31. package/dist/{chunk-FBKPSU3A.js → chunk-EXKCRXPO.js} +9 -9
  32. package/dist/{chunk-HTPZDZKQ.js → chunk-FKLE6QA3.js} +13 -13
  33. package/dist/{chunk-ERNCPKD4.js → chunk-G2KHLANR.js} +1 -1
  34. package/dist/{chunk-NJIGYGZS.js → chunk-HAMF4F3P.js} +12 -7
  35. package/dist/{chunk-UY6TEJJH.js → chunk-HJRP6PXL.js} +1 -1
  36. package/dist/{chunk-LNO3ASX5.js → chunk-HUNDJTTH.js} +1 -1
  37. package/dist/{chunk-RH2PROYG.js → chunk-I6GGMCTV.js} +4 -2
  38. package/dist/{chunk-DOXBS7F5.js → chunk-ID2K3IHI.js} +4 -4
  39. package/dist/{chunk-33FQ6HNV.js → chunk-IQ6P3HDE.js} +9 -9
  40. package/dist/{chunk-BAZT6CIF.js → chunk-ITSBBQTH.js} +7 -7
  41. package/dist/{chunk-UNNJCSSQ.js → chunk-JVZ7KFAX.js} +1 -1
  42. package/dist/{chunk-AQIBKTPG.js → chunk-K5XT7NHD.js} +3 -3
  43. package/dist/{chunk-HAH5X345.js → chunk-KATED53P.js} +1 -1
  44. package/dist/{chunk-7HWY4QAJ.js → chunk-L24LESXF.js} +1 -0
  45. package/dist/{chunk-VPASQOR3.js → chunk-LFKSHDVI.js} +1 -1
  46. package/dist/{chunk-XVSJYAK7.js → chunk-LPYYZCSI.js} +2 -2
  47. package/dist/{chunk-BV6PKJUS.js → chunk-LR6RRDWN.js} +5 -5
  48. package/dist/{chunk-DAX42XVH.js → chunk-LYLNMN77.js} +8 -8
  49. package/dist/{chunk-PJQZWJ5I.js → chunk-M2BCY7H3.js} +1015 -146
  50. package/dist/{chunk-A4XPI4YN.js → chunk-MFW6P7WH.js} +27 -0
  51. package/dist/{chunk-CFBY77QJ.js → chunk-N4BBSDWI.js} +9 -9
  52. package/dist/{chunk-IDJGV6VM.js → chunk-NIUO2TNR.js} +215 -1
  53. package/dist/{chunk-PLE2432T.js → chunk-NRPELUB6.js} +2 -2
  54. package/dist/{chunk-FM3WAVB6.js → chunk-NS7L7YKH.js} +1 -1
  55. package/dist/{chunk-YMG7JDEY.js → chunk-NSR2CGV6.js} +71 -24
  56. package/dist/{chunk-LD2JSKU3.js → chunk-OOCVGX4W.js} +15 -0
  57. package/dist/{chunk-N4XHXBDQ.js → chunk-PMNITNPR.js} +4 -4
  58. package/dist/{chunk-MSXRNVHB.js → chunk-Q6SQISHT.js} +12 -11
  59. package/dist/{chunk-UNAP6O26.js → chunk-QIOYTQDZ.js} +9 -9
  60. package/dist/{chunk-BT2WH2XT.js → chunk-RGWYZR3S.js} +1 -1
  61. package/dist/{chunk-PPH6ILHL.js → chunk-RPKBWJBB.js} +4 -4
  62. package/dist/{chunk-JD4RHBNX.js → chunk-RXIKESRI.js} +7 -7
  63. package/dist/{chunk-BMUWF77V.js → chunk-S2WE7TVK.js} +4 -4
  64. package/dist/{chunk-QFIXL3OK.js → chunk-SEKNYIMO.js} +1 -1
  65. package/dist/{chunk-FPXMCGS5.js → chunk-SLQT3JP3.js} +1 -1
  66. package/dist/{chunk-LL6D3MES.js → chunk-SOPM5PLO.js} +9 -9
  67. package/dist/{chunk-J7Q4VPBJ.js → chunk-TAP2NZEU.js} +22 -16
  68. package/dist/{chunk-RE6TVIAV.js → chunk-UKJLPA7R.js} +4 -4
  69. package/dist/{chunk-RGI64U3A.js → chunk-UQLHKLF4.js} +9 -9
  70. package/dist/{chunk-LPXC4I4R.js → chunk-UWKRPQZO.js} +61 -32
  71. package/dist/{chunk-XIFK423U.js → chunk-W7QN5BC5.js} +4 -4
  72. package/dist/{chunk-XWYR5T52.js → chunk-WEF6MXFG.js} +14 -14
  73. package/dist/{chunk-P5V63L35.js → chunk-WP22MHH6.js} +17 -17
  74. package/dist/{chunk-PUVTFUNH.js → chunk-WRCAH3UO.js} +18 -18
  75. package/dist/{chunk-N7XRBWXA.js → chunk-XJ2TBXHA.js} +10 -10
  76. package/dist/{chunk-DSG6GBUQ.js → chunk-XUCQVKLQ.js} +6 -6
  77. package/dist/{chunk-NZCSVD4M.js → chunk-Y7PSAHAY.js} +8 -8
  78. package/dist/{chunk-AAMCXQPP.js → chunk-YMFQLWZ2.js} +6 -6
  79. package/dist/completion-registry.d.ts +1 -1
  80. package/dist/completion-registry.js +4 -16
  81. package/dist/countdown.js +1 -1
  82. package/dist/{dgmo-router-F2DSURTR.js → dgmo-router-7WANZOBD.js} +11 -11
  83. package/dist/{dimensions-6QAWEGIR.js → dimensions-7MF7VSGS.js} +6 -6
  84. package/dist/{flowchart-renderer-THC6Y7EH.js → flowchart-renderer-DZQZRL2F.js} +6 -5
  85. package/dist/index.d.ts +1 -1
  86. package/dist/index.js +28 -27
  87. package/dist/{layout-P6DTD4RT.js → layout-4RRC7XU7.js} +2 -2
  88. package/dist/{layout-QX5T6ZNE.js → layout-6L3BIFEZ.js} +4 -4
  89. package/dist/{layout-SOPAVXIH.js → layout-DXVAYF6W.js} +3 -3
  90. package/dist/{layout-LUQKAGGT.js → layout-EFEZ533S.js} +4 -4
  91. package/dist/{layout-EHTYSMV4.js → layout-H4K54IW3.js} +2 -2
  92. package/dist/{layout-AM57TGN5.js → layout-IGAVGDME.js} +3 -3
  93. package/dist/{layout-5NPBHV5F.js → layout-PP36LUTA.js} +2 -2
  94. package/dist/{layout-CUFA7XJD.js → layout-Q3RYSODA.js} +4 -4
  95. package/dist/layout-XUW444O5.js +1 -1
  96. package/dist/{layout-BOVTLAOT.js → layout-ZP7XYVXF.js} +2 -2
  97. package/dist/{layout-search-VKSBUCDM.js → layout-search-YKUL4VBV.js} +105 -6
  98. package/dist/{legend-constants-ZVO4FLAK.js → legend-constants-HE7FVDJP.js} +4 -2
  99. package/dist/{palettes-BIV54XLS.js → palettes-WZAIQTEG.js} +6 -4
  100. package/dist/{parser-ACW6C6OY.js → parser-337TACHB.js} +1 -1
  101. package/dist/{parser-WUK6CP5X.js → parser-GCCWMBTU.js} +3 -3
  102. package/dist/{parser-GPW4ZHPQ.js → parser-IMM2JJX3.js} +2 -1
  103. package/dist/{parser-JXS4426S.js → parser-P4TOQYNN.js} +2 -2
  104. package/dist/{parser-PVIWHVGY.js → parser-TL3JA4RI.js} +1 -1
  105. package/dist/{parser-C327BBE3.js → parser-UTXFJG4X.js} +1 -1
  106. package/dist/{renderer-RWJ45DWH.js → renderer-2ZQ6DPVD.js} +3 -3
  107. package/dist/{renderer-NHPKNNBD.js → renderer-3AD4NDF5.js} +9 -9
  108. package/dist/{renderer-2KVQGGTT.js → renderer-43ESBXVY.js} +8 -8
  109. package/dist/{renderer-A4LMOBZL.js → renderer-4JE5ORRO.js} +12 -12
  110. package/dist/{renderer-RAATRF6W.js → renderer-5GZNGZU5.js} +7 -7
  111. package/dist/{renderer-RMGN3Q7D.js → renderer-6OQM32X3.js} +3 -3
  112. package/dist/{renderer-222OTVQV.js → renderer-7HOSI6JJ.js} +4 -4
  113. package/dist/{renderer-NX4YKWCJ.js → renderer-7L7J4DHO.js} +8 -8
  114. package/dist/{renderer-DCFQDBGJ.js → renderer-7MCC6GKH.js} +2 -2
  115. package/dist/{renderer-3FF4QVGW.js → renderer-7VQOKAII.js} +8 -8
  116. package/dist/{renderer-4BHOELCE.js → renderer-BLHN3RCY.js} +3 -3
  117. package/dist/{renderer-PQYO2HCE.js → renderer-CEIX5JPA.js} +3 -3
  118. package/dist/{renderer-2OOPQ4CH.js → renderer-CHQZES6G.js} +3 -3
  119. package/dist/{renderer-36JH4OMC.js → renderer-DBNDLKPE.js} +9 -9
  120. package/dist/{renderer-KVAQE7PQ.js → renderer-DCJ4AQ3N.js} +7 -7
  121. package/dist/{renderer-LODEVN3V.js → renderer-EAORWLVK.js} +10 -10
  122. package/dist/{renderer-XRALFCIN.js → renderer-FCXRDYSJ.js} +8 -8
  123. package/dist/{renderer-YDAVCRTP.js → renderer-IR5GGAPB.js} +8 -8
  124. package/dist/{renderer-QM23SWAM.js → renderer-J4OS77PK.js} +2 -2
  125. package/dist/{renderer-4BIMRO4X.js → renderer-JR2XNZAH.js} +6 -6
  126. package/dist/{renderer-JKV2DBYP.js → renderer-JRVY7HAD.js} +6 -6
  127. package/dist/{renderer-R34GJL7U.js → renderer-NAA7D33G.js} +11 -11
  128. package/dist/{renderer-SDUSBCJI.js → renderer-P4XCRNCY.js} +7 -7
  129. package/dist/{renderer-A6ACVK4X.js → renderer-QQHQY3GT.js} +6 -6
  130. package/dist/{renderer-YIZ7G4HU.js → renderer-TJJGFQGT.js} +13 -13
  131. package/dist/{renderer-3CTUWCO7.js → renderer-VGQMJC5K.js} +12 -12
  132. package/dist/{renderer-ELYPDPNF.js → renderer-VYWCMRWA.js} +8 -7
  133. package/dist/{renderer-WH2HWE5Z.js → renderer-WB75JME5.js} +8 -8
  134. package/dist/{renderer-BICLPGAH.js → renderer-WQ654YT5.js} +2 -2
  135. package/dist/{renderer-6BUUTWVS.js → renderer-XFEZ5UBE.js} +8 -8
  136. package/dist/{renderer-4NZZ5J2F.js → renderer-XHEMXBQM.js} +7 -7
  137. package/dist/{renderer-RENDISO5.js → renderer-YTEZK3GC.js} +12 -12
  138. package/dist/{renderer-X5A5VIRD.js → renderer-ZXQXRNDR.js} +8 -8
  139. package/dist/{renderer-radial-XZ5TKUT4.js → renderer-radial-NA5DVBG4.js} +7 -7
  140. package/dist/{state-renderer-5IQ4OJUI.js → state-renderer-4S2C2CHB.js} +9 -9
  141. package/docs/ai-integration.md +5 -3
  142. package/docs/language-reference.md +2 -2
  143. package/package.json +1 -1
  144. package/dist/{chunk-3TYUXC7D.js → chunk-2SKMEL7V.js} +0 -0
  145. package/dist/{chunk-CLQIXD2C.js → chunk-7Z2VFRP5.js} +3 -3
  146. package/dist/{chunk-NF5YKFRH.js → chunk-B3S76BZO.js} +0 -0
  147. package/dist/{chunk-UIUXIDBX.js → chunk-CUYHST3B.js} +4 -4
  148. package/dist/{chunk-GUYVKGFN.js → chunk-DPSMX4EY.js} +0 -0
  149. package/dist/{chunk-2A4DQAXG.js → chunk-IIOLFAGJ.js} +3 -3
@@ -1,4 +1,8 @@
1
1
  import {
2
+ layoutBracket
3
+ } from "./chunk-ABP5BUD6.js";
4
+ import {
5
+ REGISTRY_BY_ID,
2
6
  getRenderCategory,
3
7
  parseArc,
4
8
  parseDgmo,
@@ -8,19 +12,36 @@ import {
8
12
  parseVenn,
9
13
  parseVisualization,
10
14
  parseWordcloud
11
- } from "./chunk-MSXRNVHB.js";
15
+ } from "./chunk-Q6SQISHT.js";
12
16
  import {
13
17
  MAP_DX
14
18
  } from "./chunk-EOYPX6SF.js";
19
+ import {
20
+ parseClock
21
+ } from "./chunk-WP2RLGDI.js";
22
+ import {
23
+ parseBracket
24
+ } from "./chunk-ZUCXFXLD.js";
25
+ import {
26
+ parseBody
27
+ } from "./chunk-47E5UTXE.js";
15
28
  import {
16
29
  renderDataChartD3
17
- } from "./chunk-H2GEIFUF.js";
30
+ } from "./chunk-3AQJNY65.js";
18
31
  import {
19
32
  computeQuadrantPointLabels
20
33
  } from "./chunk-KMU65FYM.js";
34
+ import {
35
+ parseChart,
36
+ parseFunctionChart,
37
+ parseFunnel,
38
+ parseHeatmap,
39
+ parseSankey,
40
+ parseScatter
41
+ } from "./chunk-7UDAIP6W.js";
21
42
  import {
22
43
  renderTimeline
23
- } from "./chunk-LPXC4I4R.js";
44
+ } from "./chunk-UWKRPQZO.js";
24
45
  import {
25
46
  ScaleContext
26
47
  } from "./chunk-24YPR5EH.js";
@@ -39,29 +60,134 @@ import {
39
60
  renderChartTitle,
40
61
  resolveExportPalette,
41
62
  showTooltip
42
- } from "./chunk-RE6TVIAV.js";
63
+ } from "./chunk-UKJLPA7R.js";
43
64
  import {
44
65
  legendInlineSupported
45
- } from "./chunk-3DOQOXXI.js";
66
+ } from "./chunk-CNUN5GO6.js";
67
+ import {
68
+ compactNumber
69
+ } from "./chunk-NS7L7YKH.js";
46
70
  import {
47
71
  FONT_FAMILY
48
72
  } from "./chunk-ICLB27PZ.js";
49
73
  import {
50
- measureText,
51
- wrapTextToWidth
52
- } from "./chunk-KAO7JL4I.js";
74
+ parseCycle
75
+ } from "./chunk-WQ6G6FFM.js";
76
+ import {
77
+ parseJourneyMap
78
+ } from "./chunk-B3S76BZO.js";
79
+ import {
80
+ parsePyramid
81
+ } from "./chunk-PIXJL77H.js";
82
+ import {
83
+ parseRing
84
+ } from "./chunk-3C2FWS2J.js";
85
+ import {
86
+ parseTreemap
87
+ } from "./chunk-P3SKSKJI.js";
88
+ import {
89
+ parseBlock
90
+ } from "./chunk-MY6GUH26.js";
91
+ import {
92
+ isBlockNode
93
+ } from "./chunk-XSVWUOUZ.js";
94
+ import {
95
+ parseGoal
96
+ } from "./chunk-BOO24UMJ.js";
97
+ import {
98
+ parseCountdown
99
+ } from "./chunk-JQ57AWDL.js";
100
+ import {
101
+ parseMap
102
+ } from "./chunk-HTWH2XQL.js";
103
+ import {
104
+ parseBoxesAndLines
105
+ } from "./chunk-MHAYUS65.js";
106
+ import {
107
+ parseSketch
108
+ } from "./chunk-RU725VCJ.js";
109
+ import {
110
+ parseSwimlane
111
+ } from "./chunk-C7QRRTAW.js";
112
+ import {
113
+ parseFamily
114
+ } from "./chunk-FKZ2Y3Q5.js";
115
+ import {
116
+ parseMindmap
117
+ } from "./chunk-NGC3IZRY.js";
118
+ import {
119
+ parseTechRadar
120
+ } from "./chunk-6K7RODXG.js";
121
+ import {
122
+ parseEventLine
123
+ } from "./chunk-66YFDTT6.js";
124
+ import {
125
+ parseTimelineDate
126
+ } from "./chunk-GDJW64XE.js";
127
+ import {
128
+ parseVersionControl
129
+ } from "./chunk-QFHWYWQL.js";
130
+ import {
131
+ parseKanban
132
+ } from "./chunk-DPSMX4EY.js";
133
+ import {
134
+ parseC4
135
+ } from "./chunk-GSYZZFI5.js";
136
+ import {
137
+ parseInfra
138
+ } from "./chunk-GUTZCRBT.js";
139
+ import {
140
+ parseGantt
141
+ } from "./chunk-ITSBBQTH.js";
142
+ import {
143
+ parseRaci
144
+ } from "./chunk-3RYBTEF5.js";
145
+ import {
146
+ parsePert
147
+ } from "./chunk-JVZ7KFAX.js";
148
+ import {
149
+ parseLiveLink
150
+ } from "./chunk-7WGCQE2E.js";
151
+ import {
152
+ getPalette
153
+ } from "./chunk-NIUO2TNR.js";
154
+ import {
155
+ parseSequenceDgmo
156
+ } from "./chunk-LFKSHDVI.js";
157
+ import {
158
+ parseFlowchart
159
+ } from "./chunk-JRUEIRJB.js";
160
+ import {
161
+ parseState
162
+ } from "./chunk-AYOVY75O.js";
163
+ import {
164
+ parseClassDiagram
165
+ } from "./chunk-MFW6P7WH.js";
166
+ import {
167
+ parseERDiagram
168
+ } from "./chunk-WPL5PFXE.js";
169
+ import {
170
+ parseOrg
171
+ } from "./chunk-FJNXXGTR.js";
172
+ import {
173
+ parseSitemap
174
+ } from "./chunk-UG2XG57E.js";
175
+ import {
176
+ parseWireframe
177
+ } from "./chunk-HSRQDWV7.js";
53
178
  import {
54
179
  resolveActiveTagGroup,
55
180
  tagAttrKey
56
181
  } from "./chunk-L5AFONQU.js";
57
182
  import {
58
- getPalette
59
- } from "./chunk-IDJGV6VM.js";
183
+ measureText,
184
+ wrapTextToWidth
185
+ } from "./chunk-KAO7JL4I.js";
60
186
  import {
61
187
  getSeriesColors,
62
188
  mix,
63
189
  themeBaseBg
64
- } from "./chunk-7HWY4QAJ.js";
190
+ } from "./chunk-L24LESXF.js";
65
191
  import {
66
192
  emit,
67
193
  makeDgmoError
@@ -128,8 +254,8 @@ function renderSlopeChart(container, parsed, palette, isDark, onClickItem, expor
128
254
  );
129
255
  const innerWidth = width - sMarginLeft - rightMargin;
130
256
  const innerHeight = height - sMarginTop - sMarginBottom;
131
- const allValues = data.flatMap((d) => d.values);
132
- const [minVal, maxVal] = d3Array.extent(allValues);
257
+ const allValues2 = data.flatMap((d) => d.values);
258
+ const [minVal, maxVal] = d3Array.extent(allValues2);
133
259
  const valuePadding = (maxVal - minVal) * 0.1 || 1;
134
260
  const yScale = d3Scale.scaleLinear().domain([minVal - valuePadding, maxVal + valuePadding]).range([innerHeight, 0]);
135
261
  const xScale = d3Scale.scalePoint().domain(periods).range([0, innerWidth]).padding(0);
@@ -1951,13 +2077,13 @@ function resolveArcChordOverride(content, detectedType, palette) {
1951
2077
  }
1952
2078
  async function renderForExport(content, theme, palette, viewState, options) {
1953
2079
  const exportMode = options?.exportMode ?? false;
1954
- const { parseDgmoChartType } = await import("./dgmo-router-F2DSURTR.js");
2080
+ const { parseDgmoChartType } = await import("./dgmo-router-7WANZOBD.js");
1955
2081
  const detectedTypeRaw = parseDgmoChartType(content);
1956
2082
  const override = resolveArcChordOverride(content, detectedTypeRaw, palette);
1957
2083
  const renderContent = override?.content ?? content;
1958
2084
  const detectedType = override?.type ?? detectedTypeRaw;
1959
2085
  if (detectedType !== null) {
1960
- const { supportsD3DataChart, renderDataChartD3: renderDataChartD32 } = await import("./charts-d3-3BZRSZV6.js");
2086
+ const { supportsD3DataChart, renderDataChartD3: renderDataChartD32 } = await import("./charts-d3-KEQSUWKP.js");
1961
2087
  if (supportsD3DataChart(detectedType)) {
1962
2088
  return renderDataChartD32(renderContent, theme, palette, {
1963
2089
  ...options?.width !== void 0 && { width: options.width },
@@ -1990,10 +2116,10 @@ function ctxTagOverride(ctx) {
1990
2116
  }
1991
2117
  async function exportEventLine(ctx) {
1992
2118
  const { content, theme, palette } = ctx;
1993
- const { parseEventLine } = await import("./parser-KFYRTGTC.js");
1994
- const { renderEventLineForExport } = await import("./renderer-3CTUWCO7.js");
2119
+ const { parseEventLine: parseEventLine2 } = await import("./parser-KFYRTGTC.js");
2120
+ const { renderEventLineForExport } = await import("./renderer-VGQMJC5K.js");
1995
2121
  const effectivePalette = await resolveExportPalette(theme, palette);
1996
- const parsed = parseEventLine(content, effectivePalette);
2122
+ const parsed = parseEventLine2(content, effectivePalette);
1997
2123
  if (parsed.error || parsed.events.length === 0) return "";
1998
2124
  const container = createExportContainer(ctx.width, ctx.height);
1999
2125
  renderEventLineForExport(
@@ -2009,10 +2135,10 @@ async function exportEventLine(ctx) {
2009
2135
  }
2010
2136
  async function exportBody(ctx) {
2011
2137
  const { content, theme, palette } = ctx;
2012
- const { parseBody } = await import("./parser-AKBVJHMK.js");
2013
- const { renderBodyForExport } = await import("./renderer-JKV2DBYP.js");
2138
+ const { parseBody: parseBody2 } = await import("./parser-AKBVJHMK.js");
2139
+ const { renderBodyForExport } = await import("./renderer-JRVY7HAD.js");
2014
2140
  const effectivePalette = await resolveExportPalette(theme, palette);
2015
- const parsed = parseBody(content, effectivePalette);
2141
+ const parsed = parseBody2(content, effectivePalette);
2016
2142
  if (parsed.error) return "";
2017
2143
  const container = createExportContainer(ctx.width, ctx.height);
2018
2144
  renderBodyForExport(
@@ -2027,10 +2153,10 @@ async function exportBody(ctx) {
2027
2153
  }
2028
2154
  async function exportVersionControl(ctx) {
2029
2155
  const { content, theme, palette } = ctx;
2030
- const { parseVersionControl } = await import("./parser-KZMJNKDW.js");
2031
- const { renderVersionControlForExport } = await import("./renderer-BICLPGAH.js");
2156
+ const { parseVersionControl: parseVersionControl2 } = await import("./parser-KZMJNKDW.js");
2157
+ const { renderVersionControlForExport } = await import("./renderer-WQ654YT5.js");
2032
2158
  const effectivePalette = await resolveExportPalette(theme, palette);
2033
- const parsed = parseVersionControl(content, effectivePalette);
2159
+ const parsed = parseVersionControl2(content, effectivePalette);
2034
2160
  if (parsed.error || parsed.nodes.length === 0) return "";
2035
2161
  const container = createExportContainer(ctx.width, ctx.height);
2036
2162
  renderVersionControlForExport(
@@ -2052,13 +2178,13 @@ function unionHiddenAttributes(hideOption, ha) {
2052
2178
  }
2053
2179
  async function exportOrg(ctx) {
2054
2180
  const { content, theme, palette, viewState, exportMode } = ctx;
2055
- const { parseOrg, findOrgNodeIdByName } = await import("./parser-JOOAVBJI.js");
2056
- const { layoutOrg } = await import("./layout-QX5T6ZNE.js");
2181
+ const { parseOrg: parseOrg2, findOrgNodeIdByName } = await import("./parser-JOOAVBJI.js");
2182
+ const { layoutOrg } = await import("./layout-6L3BIFEZ.js");
2057
2183
  const { collapseOrgTree, focusOrgTree, unionCollapsedOrgNodes } = await import("./collapse-JRGPUE67.js");
2058
- const { renderOrg, ancestorTrailReserve } = await import("./renderer-36JH4OMC.js");
2184
+ const { renderOrg, ancestorTrailReserve } = await import("./renderer-DBNDLKPE.js");
2059
2185
  const isDark = ctx.isDark;
2060
2186
  const effectivePalette = await resolveExportPalette(theme, palette);
2061
- const orgParsed = parseOrg(content, effectivePalette);
2187
+ const orgParsed = parseOrg2(content, effectivePalette);
2062
2188
  if (orgParsed.error) return "";
2063
2189
  const collapsedNodes = unionCollapsedOrgNodes(orgParsed, viewState?.cg);
2064
2190
  const activeTagGroup = resolveActiveTagGroup(
@@ -2116,13 +2242,13 @@ async function exportOrg(ctx) {
2116
2242
  }
2117
2243
  async function exportSitemap(ctx) {
2118
2244
  const { content, theme, palette, viewState, exportMode } = ctx;
2119
- const { parseSitemap } = await import("./parser-OKB64MMN.js");
2120
- const { layoutSitemap } = await import("./layout-LUQKAGGT.js");
2245
+ const { parseSitemap: parseSitemap2 } = await import("./parser-OKB64MMN.js");
2246
+ const { layoutSitemap } = await import("./layout-EFEZ533S.js");
2121
2247
  const { collapseSitemapTree } = await import("./collapse-ZWUFFCK2.js");
2122
- const { renderSitemap } = await import("./renderer-WH2HWE5Z.js");
2248
+ const { renderSitemap } = await import("./renderer-WB75JME5.js");
2123
2249
  const isDark = ctx.isDark;
2124
2250
  const effectivePalette = await resolveExportPalette(theme, palette);
2125
- const sitemapParsed = parseSitemap(content, effectivePalette);
2251
+ const sitemapParsed = parseSitemap2(content, effectivePalette);
2126
2252
  if (sitemapParsed.error || sitemapParsed.roots.length === 0) return "";
2127
2253
  const collapsedNodes = viewState?.cg ? new Set(viewState.cg) : void 0;
2128
2254
  const activeTagGroup = resolveActiveTagGroup(
@@ -2147,7 +2273,7 @@ async function exportSitemap(ctx) {
2147
2273
  const {
2148
2274
  LEGEND_HEIGHT: SITEMAP_LEGEND_HEIGHT,
2149
2275
  LEGEND_GROUP_GAP: SITEMAP_LEGEND_GROUP_GAP
2150
- } = await import("./legend-constants-ZVO4FLAK.js");
2276
+ } = await import("./legend-constants-HE7FVDJP.js");
2151
2277
  const suppressedLegendBand = sitemapLayout.legend.length > 0 && effectiveParsed.options["no-legend"] === "on" ? SITEMAP_LEGEND_HEIGHT + SITEMAP_LEGEND_GROUP_GAP : 0;
2152
2278
  const exportWidth = sitemapLayout.width + PADDING * 2;
2153
2279
  const exportHeight = sitemapLayout.height + PADDING * 2 + titleOffset - suppressedLegendBand;
@@ -2168,10 +2294,10 @@ async function exportSitemap(ctx) {
2168
2294
  }
2169
2295
  async function exportKanban(ctx) {
2170
2296
  const { content, theme, palette, viewState, exportMode } = ctx;
2171
- const { parseKanban } = await import("./parser-ACW6C6OY.js");
2172
- const { renderKanban } = await import("./renderer-3FF4QVGW.js");
2297
+ const { parseKanban: parseKanban2 } = await import("./parser-337TACHB.js");
2298
+ const { renderKanban } = await import("./renderer-7VQOKAII.js");
2173
2299
  const effectivePalette = await resolveExportPalette(theme, palette);
2174
- const kanbanParsed = parseKanban(content, effectivePalette);
2300
+ const kanbanParsed = parseKanban2(content, effectivePalette);
2175
2301
  if (kanbanParsed.error || kanbanParsed.columns.length === 0) return "";
2176
2302
  const container = document.createElement("div");
2177
2303
  container.style.position = "absolute";
@@ -2200,11 +2326,11 @@ async function exportKanban(ctx) {
2200
2326
  }
2201
2327
  async function exportClass(ctx) {
2202
2328
  const { content, theme, palette, exportMode } = ctx;
2203
- const { parseClassDiagram } = await import("./parser-GPW4ZHPQ.js");
2204
- const { layoutClassDiagram } = await import("./layout-P6DTD4RT.js");
2205
- const { renderClassDiagram } = await import("./renderer-A4LMOBZL.js");
2329
+ const { parseClassDiagram: parseClassDiagram2 } = await import("./parser-IMM2JJX3.js");
2330
+ const { layoutClassDiagram } = await import("./layout-4RRC7XU7.js");
2331
+ const { renderClassDiagram } = await import("./renderer-4JE5ORRO.js");
2206
2332
  const effectivePalette = await resolveExportPalette(theme, palette);
2207
- const classParsed = parseClassDiagram(content, effectivePalette);
2333
+ const classParsed = parseClassDiagram2(content, effectivePalette);
2208
2334
  if (classParsed.error || classParsed.classes.length === 0) return "";
2209
2335
  const classLayout = layoutClassDiagram(classParsed);
2210
2336
  const PADDING = 20;
@@ -2227,11 +2353,11 @@ async function exportClass(ctx) {
2227
2353
  }
2228
2354
  async function exportEr(ctx) {
2229
2355
  const { content, theme, palette, viewState, exportMode } = ctx;
2230
- const { parseERDiagram } = await import("./parser-J4DVNL4W.js");
2231
- const { layoutERDiagram } = await import("./layout-EHTYSMV4.js");
2232
- const { renderERDiagram } = await import("./renderer-R34GJL7U.js");
2356
+ const { parseERDiagram: parseERDiagram2 } = await import("./parser-J4DVNL4W.js");
2357
+ const { layoutERDiagram } = await import("./layout-H4K54IW3.js");
2358
+ const { renderERDiagram } = await import("./renderer-NAA7D33G.js");
2233
2359
  const effectivePalette = await resolveExportPalette(theme, palette);
2234
- const erParsed = parseERDiagram(content, effectivePalette);
2360
+ const erParsed = parseERDiagram2(content, effectivePalette);
2235
2361
  if (erParsed.error || erParsed.tables.length === 0) return "";
2236
2362
  const erLayout = layoutERDiagram(erParsed);
2237
2363
  const PADDING = 20;
@@ -2261,14 +2387,14 @@ async function exportEr(ctx) {
2261
2387
  }
2262
2388
  async function exportSketch(ctx) {
2263
2389
  const { content, theme, viewState, exportMode } = ctx;
2264
- const { parseSketch } = await import("./parser-KZMALSB2.js");
2390
+ const { parseSketch: parseSketch2 } = await import("./parser-KZMALSB2.js");
2265
2391
  const effectivePalette = await resolveExportPalette(theme, ctx.palette);
2266
- const parsed = parseSketch(content, effectivePalette);
2392
+ const parsed = parseSketch2(content, effectivePalette);
2267
2393
  if (parsed.error || parsed.nodes.length === 0 && parsed.boxes.length === 0) {
2268
2394
  return "";
2269
2395
  }
2270
2396
  const { layoutSketch } = await import("./layout-MSSHF45T.js");
2271
- const { renderSketchForExport } = await import("./renderer-RAATRF6W.js");
2397
+ const { renderSketchForExport } = await import("./renderer-5GZNGZU5.js");
2272
2398
  const collapsedBoxes = viewState?.cg ? new Set(viewState.cg) : void 0;
2273
2399
  const skLayout = layoutSketch(parsed, {
2274
2400
  ...collapsedBoxes !== void 0 && { collapsedBoxes }
@@ -2295,9 +2421,9 @@ async function exportSketch(ctx) {
2295
2421
  }
2296
2422
  async function exportBoxesAndLines(ctx) {
2297
2423
  const { content, theme, palette, viewState, exportMode } = ctx;
2298
- const { parseBoxesAndLines } = await import("./parser-KYPP2DX6.js");
2424
+ const { parseBoxesAndLines: parseBoxesAndLines2 } = await import("./parser-KYPP2DX6.js");
2299
2425
  const effectivePalette = await resolveExportPalette(theme, palette);
2300
- const blParsed = parseBoxesAndLines(content, effectivePalette);
2426
+ const blParsed = parseBoxesAndLines2(content, effectivePalette);
2301
2427
  if (blParsed.error || blParsed.nodes.length === 0) return "";
2302
2428
  let blHiddenTagValues;
2303
2429
  if (viewState?.htv) {
@@ -2306,8 +2432,8 @@ async function exportBoxesAndLines(ctx) {
2306
2432
  blHiddenTagValues.set(k, new Set(v));
2307
2433
  }
2308
2434
  }
2309
- const { renderBoxesAndLinesForExport } = await import("./renderer-X5A5VIRD.js");
2310
- const { layoutBoxesAndLines } = await import("./layout-BOVTLAOT.js");
2435
+ const { renderBoxesAndLinesForExport } = await import("./renderer-ZXQXRNDR.js");
2436
+ const { layoutBoxesAndLines } = await import("./layout-ZP7XYVXF.js");
2311
2437
  const blLayout = await layoutBoxesAndLines(blParsed);
2312
2438
  const PADDING = 20;
2313
2439
  const titleOffset = blParsed.title ? 40 : 0;
@@ -2336,11 +2462,11 @@ async function exportBoxesAndLines(ctx) {
2336
2462
  }
2337
2463
  async function exportSwimlane(ctx) {
2338
2464
  const { content, theme, palette } = ctx;
2339
- const { parseSwimlane } = await import("./parser-ZLKYDFI5.js");
2465
+ const { parseSwimlane: parseSwimlane2 } = await import("./parser-ZLKYDFI5.js");
2340
2466
  const { layoutSwimlane } = await import("./layout-RANVNAKI.js");
2341
- const { renderSwimlaneForExport } = await import("./renderer-QM23SWAM.js");
2467
+ const { renderSwimlaneForExport } = await import("./renderer-J4OS77PK.js");
2342
2468
  const effectivePalette = await resolveExportPalette(theme, palette);
2343
- const swimParsed = parseSwimlane(content, effectivePalette);
2469
+ const swimParsed = parseSwimlane2(content, effectivePalette);
2344
2470
  if (swimParsed.error || swimParsed.nodes.length === 0) return "";
2345
2471
  const swimLayout = layoutSwimlane(swimParsed);
2346
2472
  const PADDING = 20;
@@ -2368,11 +2494,11 @@ async function exportSwimlane(ctx) {
2368
2494
  }
2369
2495
  async function exportFamily(ctx) {
2370
2496
  const { content, theme, palette } = ctx;
2371
- const { parseFamily } = await import("./parser-NPXPJHWN.js");
2497
+ const { parseFamily: parseFamily2 } = await import("./parser-NPXPJHWN.js");
2372
2498
  const { layoutFamily } = await import("./layout-5VSMZPMG.js");
2373
- const { renderFamilyForExport } = await import("./renderer-4NZZ5J2F.js");
2499
+ const { renderFamilyForExport } = await import("./renderer-XHEMXBQM.js");
2374
2500
  const effectivePalette = await resolveExportPalette(theme, palette);
2375
- const parsed = parseFamily(content, effectivePalette);
2501
+ const parsed = parseFamily2(content, effectivePalette);
2376
2502
  if (parsed.error || parsed.persons.size === 0) return "";
2377
2503
  const layout = layoutFamily(parsed);
2378
2504
  const PADDING = 20;
@@ -2400,13 +2526,13 @@ async function exportFamily(ctx) {
2400
2526
  }
2401
2527
  async function exportMindmap(ctx) {
2402
2528
  const { content, theme, palette, viewState, exportMode } = ctx;
2403
- const { parseMindmap } = await import("./parser-NGHQQGD2.js");
2404
- const { layoutMindmap } = await import("./layout-5NPBHV5F.js");
2529
+ const { parseMindmap: parseMindmap2 } = await import("./parser-NGHQQGD2.js");
2530
+ const { layoutMindmap } = await import("./layout-PP36LUTA.js");
2405
2531
  const { collapseMindmapTree } = await import("./collapse-SLINJQW6.js");
2406
- const { renderMindmap } = await import("./renderer-LODEVN3V.js");
2532
+ const { renderMindmap } = await import("./renderer-EAORWLVK.js");
2407
2533
  const isDark = ctx.isDark;
2408
2534
  const effectivePalette = await resolveExportPalette(theme, palette);
2409
- const mmParsed = parseMindmap(content, effectivePalette);
2535
+ const mmParsed = parseMindmap2(content, effectivePalette);
2410
2536
  if (mmParsed.error) return "";
2411
2537
  const collapsedNodes = new Set(viewState?.cg ?? []);
2412
2538
  const collectCollapsed = (nodes) => {
@@ -2453,11 +2579,11 @@ async function exportMindmap(ctx) {
2453
2579
  }
2454
2580
  async function exportWireframe(ctx) {
2455
2581
  const { content, theme, palette } = ctx;
2456
- const { parseWireframe } = await import("./parser-HCGXNHHL.js");
2582
+ const { parseWireframe: parseWireframe2 } = await import("./parser-HCGXNHHL.js");
2457
2583
  const { layoutWireframe } = await import("./layout-UIV56NUA.js");
2458
- const { renderWireframe } = await import("./renderer-RWJ45DWH.js");
2584
+ const { renderWireframe } = await import("./renderer-2ZQ6DPVD.js");
2459
2585
  const effectivePalette = await resolveExportPalette(theme, palette);
2460
- const wireframeParsed = parseWireframe(content);
2586
+ const wireframeParsed = parseWireframe2(content);
2461
2587
  if (wireframeParsed.error || wireframeParsed.roots.length === 0 && wireframeParsed.modals.length === 0)
2462
2588
  return "";
2463
2589
  const wireframeLayout = layoutWireframe(wireframeParsed);
@@ -2478,16 +2604,16 @@ async function exportWireframe(ctx) {
2478
2604
  }
2479
2605
  async function exportC4(ctx) {
2480
2606
  const { content, theme, palette, viewState, exportMode } = ctx;
2481
- const { parseC4 } = await import("./parser-WEVTMBJ5.js");
2607
+ const { parseC4: parseC42 } = await import("./parser-WEVTMBJ5.js");
2482
2608
  const {
2483
2609
  layoutC4Context,
2484
2610
  layoutC4Containers,
2485
2611
  layoutC4Components,
2486
2612
  layoutC4Deployment
2487
- } = await import("./layout-CUFA7XJD.js");
2488
- const { renderC4Context, renderC4Containers } = await import("./renderer-YDAVCRTP.js");
2613
+ } = await import("./layout-Q3RYSODA.js");
2614
+ const { renderC4Context, renderC4Containers } = await import("./renderer-IR5GGAPB.js");
2489
2615
  const effectivePalette = await resolveExportPalette(theme, palette);
2490
- const c4Parsed = parseC4(content, effectivePalette);
2616
+ const c4Parsed = parseC42(content, effectivePalette);
2491
2617
  if (c4Parsed.error || c4Parsed.elements.length === 0) return "";
2492
2618
  const c4Level = ctx.options?.c4Level ?? viewState?.c4l ?? "context";
2493
2619
  const c4System = ctx.options?.c4System ?? viewState?.c4s;
@@ -2519,11 +2645,11 @@ async function exportC4(ctx) {
2519
2645
  }
2520
2646
  async function exportFlowchart(ctx) {
2521
2647
  const { content, theme, palette } = ctx;
2522
- const { parseFlowchart } = await import("./flowchart-parser-GG7XBLQH.js");
2648
+ const { parseFlowchart: parseFlowchart2 } = await import("./flowchart-parser-GG7XBLQH.js");
2523
2649
  const { layoutGraph } = await import("./layout-XUW444O5.js");
2524
- const { renderFlowchart } = await import("./flowchart-renderer-THC6Y7EH.js");
2650
+ const { renderFlowchart } = await import("./flowchart-renderer-DZQZRL2F.js");
2525
2651
  const effectivePalette = await resolveExportPalette(theme, palette);
2526
- const fcParsed = parseFlowchart(content, effectivePalette);
2652
+ const fcParsed = parseFlowchart2(content, effectivePalette);
2527
2653
  if (fcParsed.error || fcParsed.nodes.length === 0) return "";
2528
2654
  const layout = layoutGraph(fcParsed);
2529
2655
  const container = createExportContainer(ctx.width, ctx.height);
@@ -2540,12 +2666,12 @@ async function exportFlowchart(ctx) {
2540
2666
  }
2541
2667
  async function exportInfra(ctx) {
2542
2668
  const { content, theme, palette, viewState } = ctx;
2543
- const { parseInfra } = await import("./parser-DGF3ZEO6.js");
2669
+ const { parseInfra: parseInfra2 } = await import("./parser-DGF3ZEO6.js");
2544
2670
  const { computeInfra } = await import("./compute-JAP5E2E4.js");
2545
2671
  const { layoutInfra } = await import("./layout-SW3XWYKC.js");
2546
- const { renderInfra, computeInfraLegendGroups } = await import("./renderer-SDUSBCJI.js");
2672
+ const { renderInfra, computeInfraLegendGroups } = await import("./renderer-P4XCRNCY.js");
2547
2673
  const effectivePalette = await resolveExportPalette(theme, palette);
2548
- const infraParsed = parseInfra(content);
2674
+ const infraParsed = parseInfra2(content);
2549
2675
  if (infraParsed.error || infraParsed.nodes.length === 0) return "";
2550
2676
  const infraComputed = computeInfra(infraParsed);
2551
2677
  const infraLayout = layoutInfra(infraComputed);
@@ -2590,12 +2716,12 @@ async function exportInfra(ctx) {
2590
2716
  }
2591
2717
  async function exportPert(ctx) {
2592
2718
  const { content, theme, palette, viewState } = ctx;
2593
- const { parsePert } = await import("./parser-JXS4426S.js");
2594
- const { analyzePert } = await import("./analyzer-R5UBTRO2.js");
2595
- const { layoutPert } = await import("./layout-AM57TGN5.js");
2596
- const { renderPert, measurePertAnalysisBlock } = await import("./renderer-RENDISO5.js");
2719
+ const { parsePert: parsePert2 } = await import("./parser-P4TOQYNN.js");
2720
+ const { analyzePert } = await import("./analyzer-7ZGAZIE6.js");
2721
+ const { layoutPert } = await import("./layout-IGAVGDME.js");
2722
+ const { renderPert, measurePertAnalysisBlock } = await import("./renderer-YTEZK3GC.js");
2597
2723
  const effectivePalette = await resolveExportPalette(theme, palette);
2598
- const pertParsed = parsePert(content, { palette: effectivePalette });
2724
+ const pertParsed = parsePert2(content, { palette: effectivePalette });
2599
2725
  if (pertParsed.error || pertParsed.activities.length === 0) return "";
2600
2726
  const pertResolved = analyzePert(pertParsed);
2601
2727
  const pertLayout = layoutPert(pertResolved);
@@ -2636,11 +2762,11 @@ async function exportPert(ctx) {
2636
2762
  }
2637
2763
  async function exportGantt(ctx) {
2638
2764
  const { content, theme, palette, viewState, exportMode } = ctx;
2639
- const { parseGantt } = await import("./parser-WUK6CP5X.js");
2765
+ const { parseGantt: parseGantt2 } = await import("./parser-GCCWMBTU.js");
2640
2766
  const { calculateSchedule } = await import("./calculator-35YVW4QO.js");
2641
- const { renderGantt } = await import("./renderer-NX4YKWCJ.js");
2767
+ const { renderGantt } = await import("./renderer-7L7J4DHO.js");
2642
2768
  const effectivePalette = await resolveExportPalette(theme, palette);
2643
- const ganttParsed = parseGantt(content, effectivePalette);
2769
+ const ganttParsed = parseGantt2(content, effectivePalette);
2644
2770
  const resolved = calculateSchedule(ganttParsed);
2645
2771
  if (resolved.tasks.length === 0) return "";
2646
2772
  const EXPORT_W = ctx.width;
@@ -2679,12 +2805,12 @@ async function exportGantt(ctx) {
2679
2805
  }
2680
2806
  async function exportState(ctx) {
2681
2807
  const { content, theme, palette, viewState } = ctx;
2682
- const { parseState } = await import("./state-parser-FE3RF6XY.js");
2808
+ const { parseState: parseState2 } = await import("./state-parser-FE3RF6XY.js");
2683
2809
  const { layoutGraph } = await import("./layout-XUW444O5.js");
2684
- const { renderState } = await import("./state-renderer-5IQ4OJUI.js");
2810
+ const { renderState } = await import("./state-renderer-4S2C2CHB.js");
2685
2811
  const { collapseStateGroups } = await import("./state-collapse-HCGD6IVJ.js");
2686
2812
  const effectivePalette = await resolveExportPalette(theme, palette);
2687
- const stateParsed = parseState(content, effectivePalette);
2813
+ const stateParsed = parseState2(content, effectivePalette);
2688
2814
  if (stateParsed.error || stateParsed.nodes.length === 0) return "";
2689
2815
  const sourceCollapsed = (stateParsed.groups ?? []).filter((g) => g.collapsed).map((g) => g.id);
2690
2816
  const collapsedGroups = /* @__PURE__ */ new Set([
@@ -2718,10 +2844,10 @@ async function exportState(ctx) {
2718
2844
  }
2719
2845
  async function exportTechRadar(ctx) {
2720
2846
  const { content, theme, palette, viewState, exportMode } = ctx;
2721
- const { parseTechRadar } = await import("./parser-NOANDFJ4.js");
2722
- const { renderTechRadarForExport } = await import("./renderer-A6ACVK4X.js");
2847
+ const { parseTechRadar: parseTechRadar2 } = await import("./parser-NOANDFJ4.js");
2848
+ const { renderTechRadarForExport } = await import("./renderer-QQHQY3GT.js");
2723
2849
  const effectivePalette = await resolveExportPalette(theme, palette);
2724
- const radarParsed = parseTechRadar(content);
2850
+ const radarParsed = parseTechRadar2(content);
2725
2851
  if (radarParsed.error || radarParsed.quadrants.length === 0) return "";
2726
2852
  const RADAR_EXPORT_W = ctx.requestedWidth ?? 1300;
2727
2853
  const RADAR_EXPORT_H = ctx.requestedHeight ?? 1500;
@@ -2739,11 +2865,11 @@ async function exportTechRadar(ctx) {
2739
2865
  }
2740
2866
  async function exportJourneyMap(ctx) {
2741
2867
  const { content, theme, palette, exportMode } = ctx;
2742
- const { parseJourneyMap } = await import("./parser-C327BBE3.js");
2743
- const { renderJourneyMap } = await import("./renderer-NHPKNNBD.js");
2744
- const { layoutJourneyMap } = await import("./layout-SOPAVXIH.js");
2868
+ const { parseJourneyMap: parseJourneyMap2 } = await import("./parser-UTXFJG4X.js");
2869
+ const { renderJourneyMap } = await import("./renderer-3AD4NDF5.js");
2870
+ const { layoutJourneyMap } = await import("./layout-DXVAYF6W.js");
2745
2871
  const effectivePalette = await resolveExportPalette(theme, palette);
2746
- const jmParsed = parseJourneyMap(content, effectivePalette);
2872
+ const jmParsed = parseJourneyMap2(content, effectivePalette);
2747
2873
  if (jmParsed.error || jmParsed.phases.length === 0 && jmParsed.steps.length === 0)
2748
2874
  return "";
2749
2875
  const jmLayout = layoutJourneyMap(jmParsed, effectivePalette, {
@@ -2761,10 +2887,10 @@ async function exportJourneyMap(ctx) {
2761
2887
  }
2762
2888
  async function exportCycle(ctx) {
2763
2889
  const { content, theme, palette, viewState, exportMode } = ctx;
2764
- const { parseCycle } = await import("./parser-7OEE7QT6.js");
2765
- const { renderCycleForExport } = await import("./renderer-4BIMRO4X.js");
2890
+ const { parseCycle: parseCycle2 } = await import("./parser-7OEE7QT6.js");
2891
+ const { renderCycleForExport } = await import("./renderer-JR2XNZAH.js");
2766
2892
  const effectivePalette = await resolveExportPalette(theme, palette);
2767
- const cycleParsed = parseCycle(content);
2893
+ const cycleParsed = parseCycle2(content);
2768
2894
  if (cycleParsed.error || cycleParsed.nodes.length === 0) return "";
2769
2895
  const container = createExportContainer(ctx.width, ctx.height);
2770
2896
  renderCycleForExport(
@@ -2780,12 +2906,12 @@ async function exportCycle(ctx) {
2780
2906
  }
2781
2907
  async function exportMap(ctx) {
2782
2908
  const { content, theme, palette, options } = ctx;
2783
- const { parseMap } = await import("./parser-GEKPWSSK.js");
2909
+ const { parseMap: parseMap2 } = await import("./parser-GEKPWSSK.js");
2784
2910
  const { resolveMap } = await import("./resolver-XSXE2TRX.js");
2785
- const { renderMapForExport } = await import("./renderer-XRALFCIN.js");
2786
- const { mapExportDimensions } = await import("./dimensions-6QAWEGIR.js");
2911
+ const { renderMapForExport } = await import("./renderer-FCXRDYSJ.js");
2912
+ const { mapExportDimensions } = await import("./dimensions-7MF7VSGS.js");
2787
2913
  const effectivePalette = await resolveExportPalette(theme, palette);
2788
- const mapParsed = parseMap(content, effectivePalette);
2914
+ const mapParsed = parseMap2(content, effectivePalette);
2789
2915
  const { data: mapData, reason } = await resolveMapDataSource(
2790
2916
  options?.mapData
2791
2917
  );
@@ -2816,10 +2942,10 @@ async function exportMap(ctx) {
2816
2942
  }
2817
2943
  async function exportPyramid(ctx) {
2818
2944
  const { content, theme, palette } = ctx;
2819
- const { parsePyramid } = await import("./parser-OVQTTTUJ.js");
2820
- const { renderPyramidForExport } = await import("./renderer-4BHOELCE.js");
2945
+ const { parsePyramid: parsePyramid2 } = await import("./parser-OVQTTTUJ.js");
2946
+ const { renderPyramidForExport } = await import("./renderer-BLHN3RCY.js");
2821
2947
  const effectivePalette = await resolveExportPalette(theme, palette);
2822
- const pyramidParsed = parsePyramid(content);
2948
+ const pyramidParsed = parsePyramid2(content);
2823
2949
  if (pyramidParsed.error || pyramidParsed.layers.length === 0) return "";
2824
2950
  const container = createExportContainer(ctx.width, ctx.height);
2825
2951
  renderPyramidForExport(
@@ -2833,10 +2959,10 @@ async function exportPyramid(ctx) {
2833
2959
  }
2834
2960
  async function exportRing(ctx) {
2835
2961
  const { content, theme, palette } = ctx;
2836
- const { parseRing } = await import("./parser-GZ3LVF72.js");
2837
- const { renderRingForExport } = await import("./renderer-2OOPQ4CH.js");
2962
+ const { parseRing: parseRing2 } = await import("./parser-GZ3LVF72.js");
2963
+ const { renderRingForExport } = await import("./renderer-CHQZES6G.js");
2838
2964
  const effectivePalette = await resolveExportPalette(theme, palette);
2839
- const ringParsed = parseRing(content);
2965
+ const ringParsed = parseRing2(content);
2840
2966
  if (ringParsed.error || ringParsed.layers.length === 0) return "";
2841
2967
  const container = createExportContainer(ctx.width, ctx.height);
2842
2968
  renderRingForExport(container, ringParsed, effectivePalette, ctx.isDark, {
@@ -2847,14 +2973,14 @@ async function exportRing(ctx) {
2847
2973
  }
2848
2974
  async function exportTreemap(ctx) {
2849
2975
  const { content, theme, palette } = ctx;
2850
- const { parseTreemap } = await import("./parser-AN3MGHRL.js");
2976
+ const { parseTreemap: parseTreemap2 } = await import("./parser-AN3MGHRL.js");
2851
2977
  const effectivePalette = await resolveExportPalette(theme, palette);
2852
- const treemapParsed = parseTreemap(content, effectivePalette);
2978
+ const treemapParsed = parseTreemap2(content, effectivePalette);
2853
2979
  if (treemapParsed.error || treemapParsed.roots.length === 0) return "";
2854
2980
  const container = createExportContainer(ctx.width, ctx.height);
2855
2981
  const dims = { width: ctx.width, height: ctx.height };
2856
2982
  if (treemapParsed.options.radial) {
2857
- const { renderTreemapRadialForExport } = await import("./renderer-radial-XZ5TKUT4.js");
2983
+ const { renderTreemapRadialForExport } = await import("./renderer-radial-NA5DVBG4.js");
2858
2984
  renderTreemapRadialForExport(
2859
2985
  container,
2860
2986
  treemapParsed,
@@ -2863,7 +2989,7 @@ async function exportTreemap(ctx) {
2863
2989
  dims
2864
2990
  );
2865
2991
  } else {
2866
- const { renderTreemapForExport } = await import("./renderer-6BUUTWVS.js");
2992
+ const { renderTreemapForExport } = await import("./renderer-XFEZ5UBE.js");
2867
2993
  renderTreemapForExport(
2868
2994
  container,
2869
2995
  treemapParsed,
@@ -2876,17 +3002,17 @@ async function exportTreemap(ctx) {
2876
3002
  }
2877
3003
  async function exportLiveLink(ctx) {
2878
3004
  const { content, theme, palette } = ctx;
2879
- const { parseLiveLink } = await import("./parser-XYY5NHP4.js");
2880
- const { renderLiveLinkCard } = await import("./renderer-YIZ7G4HU.js");
3005
+ const { parseLiveLink: parseLiveLink2 } = await import("./parser-XYY5NHP4.js");
3006
+ const { renderLiveLinkCard } = await import("./renderer-TJJGFQGT.js");
2881
3007
  const effectivePalette = await resolveExportPalette(theme, palette);
2882
- return renderLiveLinkCard(parseLiveLink(content), effectivePalette, theme);
3008
+ return renderLiveLinkCard(parseLiveLink2(content), effectivePalette, theme);
2883
3009
  }
2884
3010
  async function exportBlock(ctx) {
2885
3011
  const { content, theme, palette } = ctx;
2886
- const { parseBlock } = await import("./parser-5655XSOR.js");
2887
- const { renderBlockForExport } = await import("./renderer-KVAQE7PQ.js");
3012
+ const { parseBlock: parseBlock2 } = await import("./parser-5655XSOR.js");
3013
+ const { renderBlockForExport } = await import("./renderer-DCJ4AQ3N.js");
2888
3014
  const effectivePalette = await resolveExportPalette(theme, palette);
2889
- const blockParsed = parseBlock(content, effectivePalette);
3015
+ const blockParsed = parseBlock2(content, effectivePalette);
2890
3016
  if (blockParsed.error || blockParsed.top.rows.length === 0) return "";
2891
3017
  const container = createExportContainer(ctx.width, ctx.height);
2892
3018
  renderBlockForExport(container, blockParsed, effectivePalette, ctx.isDark, {
@@ -2897,10 +3023,10 @@ async function exportBlock(ctx) {
2897
3023
  }
2898
3024
  async function exportGoal(ctx) {
2899
3025
  const { content, theme, palette } = ctx;
2900
- const { parseGoal } = await import("./parser-SA3RAJFS.js");
2901
- const { renderGoalForExport } = await import("./renderer-222OTVQV.js");
3026
+ const { parseGoal: parseGoal2 } = await import("./parser-SA3RAJFS.js");
3027
+ const { renderGoalForExport } = await import("./renderer-7HOSI6JJ.js");
2902
3028
  const effectivePalette = await resolveExportPalette(theme, palette);
2903
- const parsed = parseGoal(content, effectivePalette);
3029
+ const parsed = parseGoal2(content, effectivePalette);
2904
3030
  if (parsed.error) return "";
2905
3031
  const container = createExportContainer(ctx.width, ctx.height);
2906
3032
  renderGoalForExport(container, parsed, effectivePalette, ctx.isDark, {
@@ -2911,10 +3037,10 @@ async function exportGoal(ctx) {
2911
3037
  }
2912
3038
  async function exportCountdown(ctx) {
2913
3039
  const { content, theme, palette } = ctx;
2914
- const { parseCountdown } = await import("./parser-LGS65QPN.js");
2915
- const { renderCountdownForExport } = await import("./renderer-DCFQDBGJ.js");
3040
+ const { parseCountdown: parseCountdown2 } = await import("./parser-LGS65QPN.js");
3041
+ const { renderCountdownForExport } = await import("./renderer-7MCC6GKH.js");
2916
3042
  const effectivePalette = await resolveExportPalette(theme, palette);
2917
- const parsed = parseCountdown(content, effectivePalette);
3043
+ const parsed = parseCountdown2(content, effectivePalette);
2918
3044
  if (parsed.error) return "";
2919
3045
  const container = createExportContainer(ctx.width, ctx.height);
2920
3046
  renderCountdownForExport(container, parsed, effectivePalette, ctx.isDark, {
@@ -2925,10 +3051,10 @@ async function exportCountdown(ctx) {
2925
3051
  }
2926
3052
  async function exportClock(ctx) {
2927
3053
  const { content, theme, palette } = ctx;
2928
- const { parseClock } = await import("./parser-256EIWB2.js");
2929
- const { renderClockForExport } = await import("./renderer-PQYO2HCE.js");
3054
+ const { parseClock: parseClock2 } = await import("./parser-256EIWB2.js");
3055
+ const { renderClockForExport } = await import("./renderer-CEIX5JPA.js");
2930
3056
  const effectivePalette = await resolveExportPalette(theme, palette);
2931
- const parsed = parseClock(content, effectivePalette);
3057
+ const parsed = parseClock2(content, effectivePalette);
2932
3058
  if (parsed.error) return "";
2933
3059
  const container = createExportContainer(ctx.width, ctx.height);
2934
3060
  renderClockForExport(container, parsed, effectivePalette, ctx.isDark, {
@@ -2939,10 +3065,10 @@ async function exportClock(ctx) {
2939
3065
  }
2940
3066
  async function exportBracket(ctx) {
2941
3067
  const { content, theme, palette } = ctx;
2942
- const { parseBracket } = await import("./parser-DHSFIUPU.js");
2943
- const { renderBracketForExport, bracketExportDimensions } = await import("./renderer-ELYPDPNF.js");
3068
+ const { parseBracket: parseBracket2 } = await import("./parser-DHSFIUPU.js");
3069
+ const { renderBracketForExport, bracketExportDimensions } = await import("./renderer-VYWCMRWA.js");
2944
3070
  const effectivePalette = await resolveExportPalette(theme, palette);
2945
- const parsed = parseBracket(content, effectivePalette);
3071
+ const parsed = parseBracket2(content, effectivePalette);
2946
3072
  if (parsed.error) return "";
2947
3073
  const { width, height } = bracketExportDimensions(parsed, effectivePalette);
2948
3074
  const container = createExportContainer(width, height);
@@ -2954,10 +3080,10 @@ async function exportBracket(ctx) {
2954
3080
  }
2955
3081
  async function exportRaci(ctx) {
2956
3082
  const { content, theme, palette } = ctx;
2957
- const { parseRaci } = await import("./parser-LANGKWRG.js");
2958
- const { renderRaciForExport } = await import("./renderer-RMGN3Q7D.js");
3083
+ const { parseRaci: parseRaci2 } = await import("./parser-LANGKWRG.js");
3084
+ const { renderRaciForExport } = await import("./renderer-6OQM32X3.js");
2959
3085
  const effectivePalette = await resolveExportPalette(theme, palette);
2960
- const raciParsed = parseRaci(content, effectivePalette);
3086
+ const raciParsed = parseRaci2(content, effectivePalette);
2961
3087
  if (raciParsed.error) return "";
2962
3088
  const container = createExportContainer(ctx.width, ctx.height);
2963
3089
  renderRaciForExport(container, raciParsed, effectivePalette, ctx.isDark, {
@@ -3087,9 +3213,9 @@ async function exportVisualization(ctx) {
3087
3213
  const effectivePalette = await resolveExportPalette(theme, palette);
3088
3214
  const isDark = ctx.isDark;
3089
3215
  const container = createExportContainer(ctx.width, ctx.height);
3090
- const { parseSequenceDgmo } = await import("./parser-PVIWHVGY.js");
3091
- const { renderSequenceDiagram } = await import("./renderer-2KVQGGTT.js");
3092
- const seqParsed = parseSequenceDgmo(content, effectivePalette);
3216
+ const { parseSequenceDgmo: parseSequenceDgmo2 } = await import("./parser-TL3JA4RI.js");
3217
+ const { renderSequenceDiagram } = await import("./renderer-43ESBXVY.js");
3218
+ const seqParsed = parseSequenceDgmo2(content, effectivePalette);
3093
3219
  if (seqParsed.error || seqParsed.participants.length === 0) return "";
3094
3220
  const collapsedSections = viewState?.cs ? new Set(viewState.cs) : void 0;
3095
3221
  const collapsedGroups = viewState?.cg ? new Set(viewState.cg.map(Number).filter((n) => Number.isFinite(n))) : void 0;
@@ -3684,24 +3810,751 @@ function injectHoverStyles(svg, chartType, opts) {
3684
3810
  }
3685
3811
 
3686
3812
  // src/utils/root-a11y.ts
3687
- function applyRootA11y(svg, chartType) {
3813
+ function applyRootA11y(svg, chartType, title) {
3688
3814
  if (!chartType) return svg;
3689
3815
  const m = svg.match(/<svg\b[^>]*>/);
3690
3816
  if (!m) return svg;
3691
3817
  const rootTag = m[0];
3692
3818
  if (/\brole=/.test(rootTag) || /\baria-label=/.test(rootTag)) return svg;
3693
- const label = `${chartType.charAt(0).toUpperCase()}${chartType.slice(1)} diagram`;
3819
+ const typeLabel = `${chartType.charAt(0).toUpperCase()}${chartType.slice(1)} diagram`;
3820
+ const label = title ? `${title} \u2014 ${typeLabel}` : typeLabel;
3694
3821
  const withA11y = rootTag.replace(
3695
3822
  /^<svg\b/,
3696
3823
  `<svg role="img" aria-label="${escapeAttr(label)}"`
3697
3824
  );
3698
3825
  return svg.replace(rootTag, withA11y);
3699
3826
  }
3827
+ function applyRootDesc(svg, summary) {
3828
+ if (!summary) return svg;
3829
+ const m = svg.match(/<svg\b[^>]*>/);
3830
+ if (!m) return svg;
3831
+ const rootTag = m[0];
3832
+ if (/\baria-describedby=/.test(rootTag)) return svg;
3833
+ const id = `dgmo-desc-${fnv1a(summary)}`;
3834
+ const withDesc = rootTag.replace(/^<svg\b/, `<svg aria-describedby="${id}"`) + `<desc id="${id}">${escapeAttr(summary)}</desc>`;
3835
+ return svg.replace(rootTag, () => withDesc);
3836
+ }
3837
+ function fnv1a(s) {
3838
+ let h = 2166136261;
3839
+ for (let i = 0; i < s.length; i++) {
3840
+ h ^= s.charCodeAt(i);
3841
+ h = Math.imul(h, 16777619);
3842
+ }
3843
+ return (h >>> 0).toString(16).padStart(8, "0");
3844
+ }
3700
3845
  function escapeAttr(s) {
3701
3846
  return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
3702
3847
  }
3703
3848
 
3849
+ // src/utils/diagram-summary.ts
3850
+ var MAX_NAMES = 5;
3851
+ function listNames(names) {
3852
+ const shown = names.length > MAX_NAMES + 1 ? names.slice(0, MAX_NAMES) : names.slice();
3853
+ const rest = names.length - shown.length;
3854
+ if (rest > 0) return `${shown.join(", ")} and ${rest} more`;
3855
+ if (shown.length <= 1) return shown.join("");
3856
+ return `${shown.slice(0, -1).join(", ")} and ${shown[shown.length - 1]}`;
3857
+ }
3858
+ function plural(n, one, many) {
3859
+ return `${n} ${n === 1 ? one : many}`;
3860
+ }
3861
+ function chartNoun(type) {
3862
+ const words = type.replace(/-/g, " ");
3863
+ return `${words.charAt(0).toUpperCase()}${words.slice(1)} chart`;
3864
+ }
3865
+ function allValues(parsed) {
3866
+ return parsed.data.flatMap((d) => [d.value, ...d.extraValues ?? []]);
3867
+ }
3868
+ function seriesNames(parsed) {
3869
+ if (parsed.seriesNames && parsed.seriesNames.length > 0) {
3870
+ return parsed.seriesNames;
3871
+ }
3872
+ return parsed.series ? [parsed.series] : [];
3873
+ }
3874
+ function seriesPhrase(parsed) {
3875
+ const names = seriesNames(parsed);
3876
+ if (names.length > 1) {
3877
+ return ` of ${plural(names.length, "series", "series")}, ${listNames(names)},`;
3878
+ }
3879
+ const one = names[0] ?? parsed.ylabel;
3880
+ return one ? ` of ${one}` : "";
3881
+ }
3882
+ function rangePhrase(values) {
3883
+ const lo = Math.min(...values);
3884
+ const hi = Math.max(...values);
3885
+ return lo === hi ? `every value is ${compactNumber(lo)}` : `values range from ${compactNumber(lo)} to ${compactNumber(hi)}`;
3886
+ }
3887
+ function summarizeChart(content) {
3888
+ const parsed = parseChart(content);
3889
+ if (parsed.error) return null;
3890
+ const noun = chartNoun(parsed.type);
3891
+ const points = parsed.data;
3892
+ if (points.length === 0) return `${noun} with no data.`;
3893
+ switch (parsed.type) {
3894
+ case "pie":
3895
+ case "polar-area": {
3896
+ const total = points.reduce((sum, d) => sum + d.value, 0);
3897
+ const parts = plural(
3898
+ points.length,
3899
+ parsed.type === "pie" ? "slice" : "wedge",
3900
+ parsed.type === "pie" ? "slices" : "wedges"
3901
+ );
3902
+ const largest = points.reduce((a, b) => b.value > a.value ? b : a);
3903
+ if (total <= 0) return `${noun} with ${parts}, all zero.`;
3904
+ const pct = Math.round(largest.value / total * 100);
3905
+ return `${noun} with ${parts} totalling ${compactNumber(total)}; the largest is ${largest.label} at ${pct}%.`;
3906
+ }
3907
+ case "radar":
3908
+ return `${noun}${seriesPhrase(parsed)} across ${plural(points.length, "axis", "axes")}; ${rangePhrase(allValues(parsed))}.`;
3909
+ case "line": {
3910
+ const first = points[0].label;
3911
+ const last = points[points.length - 1].label;
3912
+ const span = points.length === 1 ? `at ${first}` : `from ${first} to ${last}`;
3913
+ return `${noun}${seriesPhrase(parsed)} over ${plural(points.length, "point", "points")}, ${span}; ${rangePhrase(allValues(parsed))}.`;
3914
+ }
3915
+ case "bar": {
3916
+ const head = `${noun}${seriesPhrase(parsed)} for ${plural(points.length, "category", "categories")}`;
3917
+ if (seriesNames(parsed).length > 1 || points.length === 1) {
3918
+ return `${head}; ${rangePhrase(allValues(parsed))}.`;
3919
+ }
3920
+ const lo = points.reduce((a, b) => b.value < a.value ? b : a);
3921
+ const hi = points.reduce((a, b) => b.value > a.value ? b : a);
3922
+ return `${head}, from ${lo.label} at ${compactNumber(lo.value)} to ${hi.label} at ${compactNumber(hi.value)}.`;
3923
+ }
3924
+ }
3925
+ }
3926
+ function summarizeSequence(content) {
3927
+ const parsed = parseSequenceDgmo(content);
3928
+ if (parsed.error) return null;
3929
+ const names = parsed.participants.map((p) => p.label);
3930
+ if (names.length === 0) return "Sequence diagram with no participants.";
3931
+ const messages = parsed.messages.length;
3932
+ const exchange = messages === 0 ? "with no messages" : `exchanging ${plural(messages, "message", "messages")}`;
3933
+ return `Sequence diagram of ${plural(names.length, "participant", "participants")}, ${listNames(names)}, ${exchange}.`;
3934
+ }
3935
+ function countPeople(nodes) {
3936
+ return nodes.reduce(
3937
+ (n, node) => n + (node.isContainer ? 0 : 1) + countPeople(node.children),
3938
+ 0
3939
+ );
3940
+ }
3941
+ function summarizeOrg(content) {
3942
+ const parsed = parseOrg(content);
3943
+ if (parsed.error) return null;
3944
+ const people = countPeople(parsed.roots);
3945
+ if (parsed.roots.length === 0) return "Org chart with no one in it.";
3946
+ const head = `Org chart of ${plural(people, "person", "people")}`;
3947
+ if (parsed.roots.length === 1) {
3948
+ const root = parsed.roots[0];
3949
+ const role = root.metadata["role"];
3950
+ return `${head}, headed by ${root.label}${role ? ` (${role})` : ""}.`;
3951
+ }
3952
+ const tops = parsed.roots.map((r) => r.label);
3953
+ return `${head} under ${plural(tops.length, "top-level entry", "top-level entries")}, ${listNames(tops)}.`;
3954
+ }
3955
+ function countTree(nodes) {
3956
+ return nodes.reduce(
3957
+ (n, node) => n + 1 + countTree(node.children),
3958
+ 0
3959
+ );
3960
+ }
3961
+ function namedCount(names, one, many) {
3962
+ return names.length === 0 ? `no ${many}` : `${plural(names.length, one, many)}, ${listNames(names)}`;
3963
+ }
3964
+ function summarizeFlowchart(content) {
3965
+ const parsed = parseFlowchart(content);
3966
+ if (parsed.error) return null;
3967
+ if (parsed.nodes.length === 0) return "Flowchart with no steps.";
3968
+ const decisions = parsed.nodes.filter((n) => n.shape === "decision").length;
3969
+ const steps = `${plural(parsed.nodes.length, "step", "steps")}${decisions > 0 ? ` (${plural(decisions, "decision", "decisions")})` : ""}`;
3970
+ const entered = new Set(parsed.edges.map((e) => e.target));
3971
+ const starts = parsed.nodes.filter((n) => !entered.has(n.id)).map((n) => n.label);
3972
+ const start = starts.length > 0 ? `, starting at ${listNames(starts)}` : "";
3973
+ return `Flowchart of ${steps} and ${plural(parsed.edges.length, "connection", "connections")}${start}.`;
3974
+ }
3975
+ function summarizeState(content) {
3976
+ const parsed = parseState(content);
3977
+ if (parsed.error) return null;
3978
+ const states = parsed.nodes.filter((n) => n.shape !== "pseudostate").map((n) => n.label);
3979
+ return `State diagram of ${namedCount(states, "state", "states")}, with ${plural(parsed.edges.length, "transition", "transitions")}.`;
3980
+ }
3981
+ function summarizeClass(content) {
3982
+ const parsed = parseClassDiagram(content);
3983
+ if (parsed.error) return null;
3984
+ const names = parsed.classes.map((c) => c.name);
3985
+ return `Class diagram of ${namedCount(names, "class", "classes")}, with ${plural(parsed.relationships.length, "relationship", "relationships")}.`;
3986
+ }
3987
+ function summarizeEr(content) {
3988
+ const parsed = parseERDiagram(content);
3989
+ if (parsed.error) return null;
3990
+ const names = parsed.tables.map((t) => t.name);
3991
+ return `Entity-relationship diagram of ${namedCount(names, "table", "tables")}, with ${plural(parsed.relationships.length, "relationship", "relationships")}.`;
3992
+ }
3993
+ function summarizeKanban(content) {
3994
+ const parsed = parseKanban(content);
3995
+ if (parsed.error) return null;
3996
+ const cards = parsed.columns.reduce((n, c) => n + c.cards.length, 0);
3997
+ const columns = parsed.columns.map((c) => c.name);
3998
+ return `Kanban board with ${plural(cards, "card", "cards")} across ${namedCount(columns, "column", "columns")}.`;
3999
+ }
4000
+ function c4Counts(elements) {
4001
+ return elements.reduce(
4002
+ (acc, el) => {
4003
+ const below = c4Counts(el.children);
4004
+ return {
4005
+ elements: acc.elements + 1 + below.elements,
4006
+ relationships: acc.relationships + el.relationships.length + below.relationships
4007
+ };
4008
+ },
4009
+ { elements: 0, relationships: 0 }
4010
+ );
4011
+ }
4012
+ function summarizeC4(content) {
4013
+ const parsed = parseC4(content);
4014
+ if (parsed.error) return null;
4015
+ const counts = c4Counts(parsed.elements);
4016
+ const relationships = counts.relationships + parsed.relationships.length;
4017
+ const top = parsed.elements.map((e) => e.name);
4018
+ const nested = counts.elements - top.length;
4019
+ return `C4 diagram of ${namedCount(top, "top-level element", "top-level elements")}${nested > 0 ? `, holding ${nested} more` : ""}, with ${plural(relationships, "relationship", "relationships")}.`;
4020
+ }
4021
+ function countPages(nodes) {
4022
+ return nodes.reduce(
4023
+ (n, node) => n + (node.isContainer ? 0 : 1) + countPages(node.children),
4024
+ 0
4025
+ );
4026
+ }
4027
+ function summarizeSitemap(content) {
4028
+ const parsed = parseSitemap(content);
4029
+ if (parsed.error) return null;
4030
+ const tops = parsed.roots.map((r) => r.label);
4031
+ return `Sitemap of ${plural(countPages(parsed.roots), "page", "pages")} under ${namedCount(tops, "top-level entry", "top-level entries")}.`;
4032
+ }
4033
+ function summarizeInfra(content) {
4034
+ const parsed = parseInfra(content);
4035
+ if (parsed.error) return null;
4036
+ const names = parsed.nodes.map((n) => n.label);
4037
+ return `Infrastructure diagram of ${namedCount(names, "component", "components")}, with ${plural(parsed.edges.length, "connection", "connections")}.`;
4038
+ }
4039
+ function ganttTasks(nodes, acc) {
4040
+ for (const node of nodes) {
4041
+ if (node.kind === "task") acc.tasks.push(node.label);
4042
+ else {
4043
+ if (node.kind === "group") acc.groups += 1;
4044
+ ganttTasks(node.children, acc);
4045
+ }
4046
+ }
4047
+ return acc;
4048
+ }
4049
+ function summarizeGantt(content) {
4050
+ const parsed = parseGantt(content);
4051
+ if (parsed.error) return null;
4052
+ const { tasks, groups } = ganttTasks(parsed.nodes, { tasks: [], groups: 0 });
4053
+ return `Gantt chart of ${namedCount(tasks, "task", "tasks")}${groups > 0 ? `, in ${plural(groups, "group", "groups")}` : ""}.`;
4054
+ }
4055
+ function summarizePert(content) {
4056
+ const parsed = parsePert(content);
4057
+ if (parsed.error) return null;
4058
+ const names = parsed.activities.map((a) => a.name);
4059
+ return `PERT chart of ${namedCount(names, "activity", "activities")}, with ${plural(parsed.edges.length, "dependency", "dependencies")}.`;
4060
+ }
4061
+ function summarizeBoxesAndLines(content) {
4062
+ const parsed = parseBoxesAndLines(content);
4063
+ if (parsed.error) return null;
4064
+ const names = parsed.nodes.map((n) => n.label);
4065
+ return `Boxes and lines diagram of ${namedCount(names, "box", "boxes")}, with ${plural(parsed.edges.length, "line", "lines")}.`;
4066
+ }
4067
+ function summarizeSketch(content) {
4068
+ const parsed = parseSketch(content);
4069
+ if (parsed.error) return null;
4070
+ const names = parsed.nodes.map((n) => n.label);
4071
+ return `Sketch of ${namedCount(names, "shape", "shapes")}, with ${plural(parsed.edges.length, "connection", "connections")}.`;
4072
+ }
4073
+ function summarizeSwimlane(content) {
4074
+ const parsed = parseSwimlane(content);
4075
+ if (parsed.error) return null;
4076
+ const lanes = parsed.lanes.map((l) => l.label);
4077
+ return `Swimlane diagram of ${plural(parsed.nodes.length, "step", "steps")} across ${namedCount(lanes, "lane", "lanes")}, with ${plural(parsed.edges.length, "connection", "connections")}.`;
4078
+ }
4079
+ function summarizeFamily(content) {
4080
+ const parsed = parseFamily(content);
4081
+ if (parsed.error) return null;
4082
+ return `Family tree of ${plural(parsed.persons.size, "person", "people")} in ${plural(parsed.unions.length, "union", "unions")}.`;
4083
+ }
4084
+ function summarizeVersionControl(content) {
4085
+ const parsed = parseVersionControl(content);
4086
+ if (parsed.error) return null;
4087
+ const branches = parsed.branches.map((b) => b.name);
4088
+ return `Version control graph of ${plural(parsed.nodes.length, "commit", "commits")} on ${namedCount(branches, "branch", "branches")}.`;
4089
+ }
4090
+ function mindmapCounts(nodes) {
4091
+ return nodes.reduce(
4092
+ (acc, node) => {
4093
+ if (node.collapsed) {
4094
+ return {
4095
+ shown: acc.shown + 1,
4096
+ folded: acc.folded + countTree(node.children)
4097
+ };
4098
+ }
4099
+ const below = mindmapCounts(node.children);
4100
+ return {
4101
+ shown: acc.shown + 1 + below.shown,
4102
+ folded: acc.folded + below.folded
4103
+ };
4104
+ },
4105
+ { shown: 0, folded: 0 }
4106
+ );
4107
+ }
4108
+ function summarizeMindmap(content) {
4109
+ const parsed = parseMindmap(content);
4110
+ if (parsed.error) return null;
4111
+ if (parsed.roots.length === 0) return "Mind map with no ideas.";
4112
+ const { shown, folded } = mindmapCounts(parsed.roots);
4113
+ const ideas = shown - parsed.roots.length;
4114
+ const centres = parsed.roots.map((r) => r.label);
4115
+ const hidden = folded > 0 ? `, with ${folded} more folded away` : "";
4116
+ return `Mind map of ${plural(ideas, "idea", "ideas")} around ${listNames(centres)}${hidden}.`;
4117
+ }
4118
+ function summarizeWireframe(content) {
4119
+ const parsed = parseWireframe(content);
4120
+ if (parsed.error) return null;
4121
+ const elements = countTree(parsed.roots);
4122
+ const tops = parsed.roots.map((r) => r.label).filter((l) => l.length > 0);
4123
+ const modals = parsed.modals.length > 0 ? `, plus ${plural(parsed.modals.length, "modal", "modals")}` : "";
4124
+ const noun = `${parsed.formFactor.charAt(0).toUpperCase()}${parsed.formFactor.slice(1)} wireframe`;
4125
+ return `${noun} of ${plural(elements, "element", "elements")}${tops.length > 0 ? `, in ${listNames(tops)}` : ""}${modals}.`;
4126
+ }
4127
+ function summarizeJourneyMap(content) {
4128
+ const parsed = parseJourneyMap(content);
4129
+ if (parsed.error) return null;
4130
+ const steps = parsed.steps.length + parsed.phases.reduce((n, p) => n + p.steps.length, 0);
4131
+ const phases = parsed.phases.map((p) => p.name);
4132
+ const who = parsed.persona ? ` for ${parsed.persona.name}` : "";
4133
+ return `Journey map${who} of ${plural(steps, "step", "steps")}${phases.length > 0 ? ` across ${namedCount(phases, "phase", "phases")}` : ""}.`;
4134
+ }
4135
+ function summarizeRaci(content) {
4136
+ const parsed = parseRaci(content);
4137
+ if (parsed.error) return null;
4138
+ const tasks = parsed.tasksWithoutPhase.length + parsed.phases.reduce((n, p) => n + p.tasks.length, 0);
4139
+ return `${parsed.variant.toUpperCase()} matrix of ${plural(tasks, "task", "tasks")} across ${namedCount(parsed.roleDisplayNames, "role", "roles")}.`;
4140
+ }
4141
+ function summarizeBody(content) {
4142
+ const parsed = parseBody(content);
4143
+ if (parsed.error) return null;
4144
+ const parts = parsed.parts.map((p) => p.name);
4145
+ return `Body diagram marking ${namedCount(parts, "part", "parts")}.`;
4146
+ }
4147
+ function summarizeBracket(content) {
4148
+ const parsed = parseBracket(content);
4149
+ if (parsed.error) return null;
4150
+ const layout = layoutBracket(parsed);
4151
+ const competitors = parsed.seeds.length > 0 ? parsed.seeds.length : new Set(
4152
+ layout.matches.flatMap(
4153
+ (m) => [m.top, m.bot].filter((n) => n !== null)
4154
+ )
4155
+ ).size;
4156
+ const decided = layout.matches.filter((m) => m.winner !== null).length;
4157
+ const champion = layout.champion ? `; ${layout.champion} won` : "";
4158
+ return `Tournament bracket of ${plural(competitors, "competitor", "competitors")} in ${plural(layout.matches.length, "match", "matches")}, ${decided} decided${champion}.`;
4159
+ }
4160
+ function summarizeLiveLink(content) {
4161
+ const parsed = parseLiveLink(content);
4162
+ if (parsed.error || !parsed.id) return null;
4163
+ return `Card linking to the shared diagram ${parsed.title ?? parsed.id}.`;
4164
+ }
4165
+ function axisRange(name, values) {
4166
+ const lo = Math.min(...values);
4167
+ const hi = Math.max(...values);
4168
+ return lo === hi ? `${name} is ${compactNumber(lo)} throughout` : `${name} ranges from ${compactNumber(lo)} to ${compactNumber(hi)}`;
4169
+ }
4170
+ function summarizeScatter(content) {
4171
+ const parsed = parseScatter(content);
4172
+ if (parsed.error) return null;
4173
+ const points = parsed.scatterPoints ?? [];
4174
+ if (points.length === 0) return "Scatter chart with no points.";
4175
+ const categories = [
4176
+ ...new Set(points.map((p) => p.category).filter((c) => !!c))
4177
+ ];
4178
+ const groups = categories.length > 0 ? ` in ${namedCount(categories, "category", "categories")}` : "";
4179
+ const x = axisRange(
4180
+ parsed.xlabel ?? "x",
4181
+ points.map((p) => p.x)
4182
+ );
4183
+ const y = axisRange(
4184
+ parsed.ylabel ?? "y",
4185
+ points.map((p) => p.y)
4186
+ );
4187
+ return `Scatter chart of ${plural(points.length, "point", "points")}${groups}; ${x} and ${y}.`;
4188
+ }
4189
+ function summarizeSankey(content) {
4190
+ const parsed = parseSankey(content);
4191
+ if (parsed.error) return null;
4192
+ const links = parsed.links ?? [];
4193
+ if (links.length === 0) return "Sankey diagram with no flows.";
4194
+ const nodes = new Set(links.flatMap((l) => [l.source, l.target]));
4195
+ const entered = new Set(links.map((l) => l.target));
4196
+ const sources = [...nodes].filter((n) => !entered.has(n));
4197
+ const from = sources.length > 0 ? `, flowing from ${listNames(sources)}` : "";
4198
+ return `Sankey diagram of ${plural(links.length, "flow", "flows")} between ${plural(nodes.size, "node", "nodes")}${from}.`;
4199
+ }
4200
+ function summarizeHeatmap(content) {
4201
+ const parsed = parseHeatmap(content);
4202
+ if (parsed.error) return null;
4203
+ const rows = parsed.heatmapRows ?? [];
4204
+ const columns = parsed.columns ?? [];
4205
+ if (rows.length === 0) return "Heatmap with no rows.";
4206
+ let hot = { row: rows[0].label, col: 0, value: -Infinity };
4207
+ for (const row of rows) {
4208
+ row.values.forEach((value, col) => {
4209
+ if (value > hot.value) hot = { row: row.label, col, value };
4210
+ });
4211
+ }
4212
+ const head = `Heatmap of ${plural(rows.length, "row", "rows")} by ${plural(columns.length, "column", "columns")}`;
4213
+ if (hot.value === -Infinity) return `${head}, with no values.`;
4214
+ const where = columns[hot.col] ? `${hot.row}, ${columns[hot.col]}` : hot.row;
4215
+ return `${head}; ${rangePhrase(rows.flatMap((r) => r.values))}, highest at ${where}.`;
4216
+ }
4217
+ function summarizeFunnel(content) {
4218
+ const parsed = parseFunnel(content);
4219
+ if (parsed.error) return null;
4220
+ const stages = parsed.data;
4221
+ if (stages.length === 0) return "Funnel chart with no stages.";
4222
+ const first = stages[0];
4223
+ const last = stages[stages.length - 1];
4224
+ if (stages.length === 1) {
4225
+ return `Funnel chart of 1 stage, ${first.label} at ${compactNumber(first.value)}.`;
4226
+ }
4227
+ const kept = first.value > 0 ? ` (${Math.round(last.value / first.value * 100)}% of the first)` : "";
4228
+ return `Funnel chart of ${plural(stages.length, "stage", "stages")}, from ${first.label} at ${compactNumber(first.value)} to ${last.label} at ${compactNumber(last.value)}${kept}.`;
4229
+ }
4230
+ function summarizeFunction(content) {
4231
+ const parsed = parseFunctionChart(content);
4232
+ if (parsed.error) return null;
4233
+ const names = (parsed.functions ?? []).map((f) => f.name);
4234
+ const range = parsed.xRange ? ` for x from ${compactNumber(parsed.xRange.min)} to ${compactNumber(parsed.xRange.max)}` : "";
4235
+ return `Function plot of ${namedCount(names, "function", "functions")}${range && names.length > 0 ? `,${range}` : range}.`;
4236
+ }
4237
+ function dateSpan(dates, toValue) {
4238
+ const ranked = dates.map((d) => ({ d, t: toValue(d) })).filter(({ t }) => Number.isFinite(t)).sort((a, b) => a.t - b.t);
4239
+ if (ranked.length === 0) return "";
4240
+ const first = ranked[0];
4241
+ const last = ranked[ranked.length - 1];
4242
+ return first.t === last.t ? ` on ${first.d}` : ` from ${first.d} to ${last.d}`;
4243
+ }
4244
+ function summarizeTimeline(content) {
4245
+ const parsed = parseTimeline(content);
4246
+ if (parsed.error) return null;
4247
+ const events = parsed.timelineEvents;
4248
+ if (events.length === 0) return "Timeline with no events.";
4249
+ const dates = events.flatMap(
4250
+ (e) => e.endDate ? [e.date, e.endDate] : [e.date]
4251
+ );
4252
+ const groups = parsed.timelineGroups.map((g) => g.name);
4253
+ const span = dateSpan(dates, parseTimelineDate);
4254
+ const head = groups.length > 0 ? `Timeline of ${plural(events.length, "event", "events")} in ${namedCount(groups, "group", "groups")}${span ? `,${span}` : ""}` : `Timeline of ${plural(events.length, "event", "events")}${span}`;
4255
+ const marks = [
4256
+ parsed.timelineEras.length > 0 ? plural(parsed.timelineEras.length, "era", "eras") : null,
4257
+ parsed.timelineMarkers.length > 0 ? plural(parsed.timelineMarkers.length, "marker", "markers") : null
4258
+ ].filter((x) => x !== null);
4259
+ return `${head}${marks.length > 0 ? `, marking ${marks.join(" and ")}` : ""}.`;
4260
+ }
4261
+ function summarizeEventLine(content) {
4262
+ const parsed = parseEventLine(content);
4263
+ if (parsed.error) return null;
4264
+ const events = parsed.events;
4265
+ if (events.length === 0) return "Event line with no events.";
4266
+ const folded = new Set(
4267
+ parsed.eras.filter((e) => e.collapsed).map((e) => e.name)
4268
+ );
4269
+ const hidden = events.filter((e) => e.era !== null && folded.has(e.era));
4270
+ const shown = events.length - hidden.length;
4271
+ const byValue = new Map(
4272
+ events.filter((e) => e.date !== null && !e.future && e.dateValue !== null).map((e) => [e.date, e.dateValue])
4273
+ );
4274
+ const span = dateSpan([...byValue.keys()], (d) => byValue.get(d));
4275
+ const eras = parsed.eras.length > 0 ? `, in ${plural(parsed.eras.length, "era", "eras")}` : "";
4276
+ const away = hidden.length > 0 ? `, with ${hidden.length} more folded away` : "";
4277
+ return `Event line of ${plural(shown, "event", "events")}${span}${eras}${away}.`;
4278
+ }
4279
+ function summarizeTechRadar(content) {
4280
+ const parsed = parseTechRadar(content);
4281
+ if (parsed.error) return null;
4282
+ const blips = parsed.quadrants.reduce((n, q) => n + q.blips.length, 0);
4283
+ const quadrants = parsed.quadrants.map((q) => q.name);
4284
+ const rings = parsed.rings.map((r) => r.name);
4285
+ return `Tech radar of ${plural(blips, "entry", "entries")} across ${namedCount(quadrants, "quadrant", "quadrants")}, in ${namedCount(rings, "ring", "rings")}.`;
4286
+ }
4287
+ function summarizeCycle(content) {
4288
+ const parsed = parseCycle(content);
4289
+ if (parsed.error) return null;
4290
+ const stages = parsed.nodes.map((n) => n.label);
4291
+ return `Cycle of ${namedCount(stages, "stage", "stages")}.`;
4292
+ }
4293
+ function summarizePyramid(content) {
4294
+ const parsed = parsePyramid(content);
4295
+ if (parsed.error) return null;
4296
+ const layers = parsed.layers.map((l) => l.label);
4297
+ const noun = parsed.inverted ? "Inverted pyramid" : "Pyramid";
4298
+ if (layers.length === 0) return `${noun} with no layers.`;
4299
+ return `${noun} of ${plural(layers.length, "layer", "layers")}, top to bottom: ${listNames(layers)}.`;
4300
+ }
4301
+ function summarizeRing(content) {
4302
+ const parsed = parseRing(content);
4303
+ if (parsed.error) return null;
4304
+ const layers = parsed.layers.map((l) => l.label);
4305
+ if (layers.length === 0) return "Ring diagram with no layers.";
4306
+ return `Ring diagram of ${plural(layers.length, "layer", "layers")}, centre outward: ${listNames(layers)}.`;
4307
+ }
4308
+ function treemapLeaves(nodes) {
4309
+ return nodes.flatMap(
4310
+ (n) => n.children.length > 0 ? treemapLeaves(n.children) : [n]
4311
+ );
4312
+ }
4313
+ function summarizeTreemap(content) {
4314
+ const parsed = parseTreemap(content);
4315
+ if (parsed.error) return null;
4316
+ const leaves = treemapLeaves(parsed.roots);
4317
+ if (leaves.length === 0) return "Treemap with no items.";
4318
+ const total = leaves.reduce((sum, n) => sum + (n.value ?? 0), 0);
4319
+ const largest = leaves.reduce(
4320
+ (a, b) => (b.value ?? 0) > (a.value ?? 0) ? b : a
4321
+ );
4322
+ const groups = parsed.roots.every((r) => r.children.length > 0) ? parsed.roots : [];
4323
+ const head = groups.length > 0 ? `Treemap of ${plural(leaves.length, "item", "items")} in ${namedCount(
4324
+ groups.map((g) => g.label),
4325
+ "group",
4326
+ "groups"
4327
+ )}, totalling ${compactNumber(total)}` : `Treemap of ${plural(leaves.length, "item", "items")} totalling ${compactNumber(total)}`;
4328
+ return `${head}; the largest is ${largest.label} at ${compactNumber(largest.value ?? 0)}.`;
4329
+ }
4330
+ function blockCounts(grid) {
4331
+ let shown = 0;
4332
+ let folded = 0;
4333
+ for (const cell of grid.rows.flat()) {
4334
+ if (!isBlockNode(cell)) continue;
4335
+ shown += 1;
4336
+ if (!cell.grid) continue;
4337
+ const inner = blockCounts(cell.grid);
4338
+ if (cell.collapsed) folded += inner.shown + inner.folded;
4339
+ else {
4340
+ shown += inner.shown;
4341
+ folded += inner.folded;
4342
+ }
4343
+ }
4344
+ return { shown, folded };
4345
+ }
4346
+ function summarizeBlock(content) {
4347
+ const parsed = parseBlock(content);
4348
+ if (parsed.error) return null;
4349
+ const { shown, folded } = blockCounts(parsed.top);
4350
+ if (shown === 0) return "Block diagram with no blocks.";
4351
+ const tops = parsed.top.rows.flat().filter(isBlockNode).map((b) => b.label);
4352
+ const away = folded > 0 ? `, with ${folded} more folded away` : "";
4353
+ return `Block diagram of ${plural(shown, "block", "blocks")}, in ${listNames(tops)}${away}.`;
4354
+ }
4355
+ function summarizeGoal(content) {
4356
+ const parsed = parseGoal(content);
4357
+ if (parsed.error) return null;
4358
+ const now = compactNumber(parsed.now);
4359
+ if (!parsed.hasTarget) return `Progress of ${now}, with no target set.`;
4360
+ const pct = Math.round(parsed.now / parsed.target * 100);
4361
+ return `Progress toward a target of ${compactNumber(parsed.target)}: ${now} so far, ${pct}%.`;
4362
+ }
4363
+ var MONTHS = [
4364
+ "January",
4365
+ "February",
4366
+ "March",
4367
+ "April",
4368
+ "May",
4369
+ "June",
4370
+ "July",
4371
+ "August",
4372
+ "September",
4373
+ "October",
4374
+ "November",
4375
+ "December"
4376
+ ];
4377
+ var WEEKDAYS = [
4378
+ "Sunday",
4379
+ "Monday",
4380
+ "Tuesday",
4381
+ "Wednesday",
4382
+ "Thursday",
4383
+ "Friday",
4384
+ "Saturday"
4385
+ ];
4386
+ var ORDINALS = ["first", "second", "third", "fourth", "fifth"];
4387
+ function cadencePhrase(rule) {
4388
+ const weekday = WEEKDAYS[rule.weekday ?? -1] ?? "the same day";
4389
+ switch (rule.kind) {
4390
+ case "month-day":
4391
+ return `every year on ${MONTHS[rule.month ?? -1] ?? "the same date"} ${rule.day ?? ""}`.trimEnd();
4392
+ case "nth-weekday":
4393
+ return `every month on the ${ORDINALS[(rule.nth ?? 0) - 1] ?? "same"} ${weekday}`;
4394
+ case "last-weekday":
4395
+ return `every month on the last ${weekday}`;
4396
+ case "weekly":
4397
+ return `every week on ${weekday}`;
4398
+ case "interval": {
4399
+ const n = rule.intervalN ?? 1;
4400
+ const unit = rule.intervalUnit ?? "day";
4401
+ return n === 1 ? `every ${unit}` : `every ${n} ${unit}s`;
4402
+ }
4403
+ }
4404
+ }
4405
+ function summarizeCountdown(content) {
4406
+ const parsed = parseCountdown(content);
4407
+ if (parsed.error) return null;
4408
+ if (parsed.rule)
4409
+ return `Countdown to an event that recurs ${cadencePhrase(parsed.rule)}.`;
4410
+ return parsed.target ? `Countdown to ${parsed.target}.` : "Countdown with no date set.";
4411
+ }
4412
+ function summarizeClock(content) {
4413
+ const parsed = parseClock(content);
4414
+ if (parsed.error) return null;
4415
+ const places = parsed.entries.map((e) => e.label);
4416
+ return `World clock of ${namedCount(places, "place", "places")}.`;
4417
+ }
4418
+ function poiName(pos) {
4419
+ return pos.kind === "name" ? pos.name : `${pos.lat}, ${pos.lon}`;
4420
+ }
4421
+ function summarizeMap(content) {
4422
+ const parsed = parseMap(content);
4423
+ if (parsed.error) return null;
4424
+ const parts = [];
4425
+ if (parsed.regions.length > 0) {
4426
+ parts.push(
4427
+ namedCount(
4428
+ parsed.regions.map((r) => r.name),
4429
+ "region",
4430
+ "regions"
4431
+ )
4432
+ );
4433
+ }
4434
+ if (parsed.pois.length > 0) {
4435
+ const names = parsed.pois.map((p) => p.label ?? poiName(p.pos));
4436
+ parts.push(namedCount(names, "marked place", "marked places"));
4437
+ }
4438
+ for (const route of parsed.routes) {
4439
+ const from = route.originLabel ?? poiName(route.origin);
4440
+ parts.push(
4441
+ `a route of ${plural(route.legs.length, "leg", "legs")} from ${from}`
4442
+ );
4443
+ }
4444
+ if (parsed.edges.length > 0) {
4445
+ parts.push(plural(parsed.edges.length, "connection", "connections"));
4446
+ }
4447
+ if (parts.length === 0) return "Map with nothing marked on it.";
4448
+ return `Map showing ${parts.length === 1 ? parts[0] : `${parts.slice(0, -1).join("; ")}; and ${parts[parts.length - 1]}`}.`;
4449
+ }
4450
+ function summarizeQuadrant(content) {
4451
+ const parsed = parseQuadrant(content);
4452
+ if (parsed.error) return null;
4453
+ const items = plural(parsed.quadrantPoints.length, "item", "items");
4454
+ const { topLeft, topRight, bottomLeft, bottomRight } = parsed.quadrantLabels;
4455
+ const names = [topLeft, topRight, bottomLeft, bottomRight].filter((q) => q !== null).map((q) => q.text);
4456
+ return names.length > 0 ? `Quadrant chart of ${items} across ${listNames(names)}.` : `Quadrant chart of ${items}.`;
4457
+ }
4458
+ function summarizeVenn(content) {
4459
+ const parsed = parseVenn(content);
4460
+ if (parsed.error) return null;
4461
+ const sets = parsed.vennSets.map((s) => s.name);
4462
+ const named = parsed.vennOverlaps.filter((o) => o.label).length;
4463
+ const overlaps = named > 0 ? `, with ${plural(named, "named overlap", "named overlaps")}` : "";
4464
+ return `Venn diagram of ${namedCount(sets, "set", "sets")}${overlaps}.`;
4465
+ }
4466
+ function summarizeSlope(content) {
4467
+ const parsed = parseSlope(content);
4468
+ if (parsed.error) return null;
4469
+ const periods = parsed.periods;
4470
+ const span = periods.length > 1 ? `, from ${periods[0]} to ${periods[periods.length - 1]}` : "";
4471
+ return `Slope chart of ${plural(parsed.data.length, "item", "items")} across ${plural(periods.length, "period", "periods")}${span}.`;
4472
+ }
4473
+ function summarizeArc(content) {
4474
+ const parsed = parseArc(content);
4475
+ if (parsed.error) return null;
4476
+ const nodes = new Set(parsed.links.flatMap((l) => [l.source, l.target]));
4477
+ const noun = parsed.layout === "chord" ? "Chord diagram" : "Arc diagram";
4478
+ const groups = parsed.arcNodeGroups.map((g) => g.name);
4479
+ const inGroups = groups.length > 0 ? ` in ${namedCount(groups, "group", "groups")}` : "";
4480
+ return `${noun} of ${plural(parsed.links.length, "link", "links")} between ${plural(nodes.size, "node", "nodes")}${inGroups}.`;
4481
+ }
4482
+ var TOP_WORDS = 3;
4483
+ function summarizeWordcloud(content) {
4484
+ const parsed = parseWordcloud(content);
4485
+ if (parsed.error) return null;
4486
+ const words = parsed.words;
4487
+ if (words.length === 0) return "Word cloud with no words.";
4488
+ const top = [...words].sort((a, b) => b.weight - a.weight).slice(0, TOP_WORDS).map((w) => w.text);
4489
+ return `Word cloud of ${plural(words.length, "word", "words")}; the largest ${top.length === 1 ? "is" : "are"} ${listNames(top)}.`;
4490
+ }
4491
+ var SUMMARIZERS = {
4492
+ sequence: summarizeSequence,
4493
+ org: summarizeOrg,
4494
+ flowchart: summarizeFlowchart,
4495
+ state: summarizeState,
4496
+ class: summarizeClass,
4497
+ er: summarizeEr,
4498
+ kanban: summarizeKanban,
4499
+ c4: summarizeC4,
4500
+ sitemap: summarizeSitemap,
4501
+ infra: summarizeInfra,
4502
+ gantt: summarizeGantt,
4503
+ pert: summarizePert,
4504
+ "boxes-and-lines": summarizeBoxesAndLines,
4505
+ sketch: summarizeSketch,
4506
+ swimlane: summarizeSwimlane,
4507
+ family: summarizeFamily,
4508
+ "version-control": summarizeVersionControl,
4509
+ mindmap: summarizeMindmap,
4510
+ wireframe: summarizeWireframe,
4511
+ "journey-map": summarizeJourneyMap,
4512
+ raci: summarizeRaci,
4513
+ body: summarizeBody,
4514
+ bracket: summarizeBracket,
4515
+ "live-link": summarizeLiveLink,
4516
+ bar: summarizeChart,
4517
+ line: summarizeChart,
4518
+ pie: summarizeChart,
4519
+ radar: summarizeChart,
4520
+ "polar-area": summarizeChart,
4521
+ scatter: summarizeScatter,
4522
+ sankey: summarizeSankey,
4523
+ heatmap: summarizeHeatmap,
4524
+ funnel: summarizeFunnel,
4525
+ function: summarizeFunction,
4526
+ timeline: summarizeTimeline,
4527
+ "event-line": summarizeEventLine,
4528
+ "tech-radar": summarizeTechRadar,
4529
+ cycle: summarizeCycle,
4530
+ pyramid: summarizePyramid,
4531
+ ring: summarizeRing,
4532
+ treemap: summarizeTreemap,
4533
+ block: summarizeBlock,
4534
+ goal: summarizeGoal,
4535
+ countdown: summarizeCountdown,
4536
+ clock: summarizeClock,
4537
+ map: summarizeMap,
4538
+ quadrant: summarizeQuadrant,
4539
+ venn: summarizeVenn,
4540
+ slope: summarizeSlope,
4541
+ arc: summarizeArc,
4542
+ wordcloud: summarizeWordcloud
4543
+ };
4544
+ function summarizeDiagram(content, chartType) {
4545
+ if (!chartType) return null;
4546
+ const summarize = SUMMARIZERS[chartType];
4547
+ return summarize ? summarize(content) : null;
4548
+ }
4549
+
3704
4550
  // src/render.ts
4551
+ function diagramTitle(content, chartType) {
4552
+ const parse = chartType ? REGISTRY_BY_ID.get(chartType)?.parse : void 0;
4553
+ if (!parse) return null;
4554
+ const model = parse(content);
4555
+ const title = chartType === "gantt" ? model.options?.title : model.title;
4556
+ return typeof title === "string" && title.trim() ? title.trim() : null;
4557
+ }
3705
4558
  var DOM_GLOBALS = [
3706
4559
  "document",
3707
4560
  "window",
@@ -3719,11 +4572,17 @@ function domState() {
3719
4572
  };
3720
4573
  }
3721
4574
  async function installDom(state) {
3722
- const { JSDOM } = await loadJsdom();
3723
- const dom = new JSDOM("<!DOCTYPE html><html><body></body></html>", {
3724
- url: "http://localhost/"
3725
- });
3726
- const win = dom.window;
4575
+ let win = state.window;
4576
+ if (win) {
4577
+ win.document.head.replaceChildren();
4578
+ win.document.body.replaceChildren();
4579
+ } else {
4580
+ const { JSDOM } = await loadJsdom();
4581
+ win = new JSDOM("<!DOCTYPE html><html><body></body></html>", {
4582
+ url: "http://localhost/"
4583
+ }).window;
4584
+ state.window = win;
4585
+ }
3727
4586
  const values = {
3728
4587
  document: win.document,
3729
4588
  window: win,
@@ -3823,9 +4682,15 @@ async function render(content, options) {
3823
4682
  ...options?.width !== void 0 && { width: options.width },
3824
4683
  ...options?.height !== void 0 && { height: options.height }
3825
4684
  });
3826
- const svg2 = applyRootA11y(
3827
- injectHoverStyles(raw, chartType, { bakeHover }),
3828
- chartType
4685
+ const svg2 = applyRootDesc(
4686
+ applyRootA11y(
4687
+ injectHoverStyles(raw, chartType, { bakeHover }),
4688
+ chartType,
4689
+ diagramTitle(content, parsed.chartType)
4690
+ ),
4691
+ // The AUTHORED source and type: an arc `layout chord` is re-emitted
4692
+ // above as internal `chord` content, which no summarizer reads.
4693
+ summarizeDiagram(content, parsed.chartType)
3829
4694
  );
3830
4695
  return {
3831
4696
  svg: svg2,
@@ -3863,9 +4728,13 @@ async function render(content, options) {
3863
4728
  }
3864
4729
  }
3865
4730
  );
3866
- svg = applyRootA11y(
3867
- injectHoverStyles(svg, chartType, { bakeHover }),
3868
- chartType
4731
+ svg = applyRootDesc(
4732
+ applyRootA11y(
4733
+ injectHoverStyles(svg, chartType, { bakeHover }),
4734
+ chartType,
4735
+ diagramTitle(content, parsed.chartType)
4736
+ ),
4737
+ summarizeDiagram(content, parsed.chartType)
3869
4738
  );
3870
4739
  } finally {
3871
4740
  releaseDom();