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