@diagrammo/dgmo 0.21.0 → 0.22.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 (76) hide show
  1. package/README.md +16 -6
  2. package/dist/advanced.cjs +2521 -623
  3. package/dist/advanced.d.cts +917 -534
  4. package/dist/advanced.d.ts +917 -534
  5. package/dist/advanced.js +2516 -623
  6. package/dist/auto.cjs +2333 -608
  7. package/dist/auto.js +119 -119
  8. package/dist/auto.mjs +2335 -609
  9. package/dist/cli.cjs +168 -168
  10. package/dist/editor.cjs +13 -15
  11. package/dist/editor.js +13 -15
  12. package/dist/highlight.cjs +15 -12
  13. package/dist/highlight.js +15 -12
  14. package/dist/index.cjs +2317 -595
  15. package/dist/index.d.cts +4 -1
  16. package/dist/index.d.ts +4 -1
  17. package/dist/index.js +2319 -596
  18. package/dist/internal.cjs +2521 -623
  19. package/dist/internal.d.cts +917 -534
  20. package/dist/internal.d.ts +917 -534
  21. package/dist/internal.js +2516 -623
  22. package/dist/map-data/PROVENANCE.json +1 -1
  23. package/dist/map-data/mountain-ranges.json +1 -0
  24. package/dist/map-data/water-bodies.json +1 -0
  25. package/docs/language-reference.md +44 -31
  26. package/gallery/fixtures/map-categorical-world.dgmo +16 -0
  27. package/gallery/fixtures/map-categorical.dgmo +0 -1
  28. package/gallery/fixtures/map-choropleth.dgmo +0 -1
  29. package/gallery/fixtures/map-coastline.dgmo +7 -0
  30. package/gallery/fixtures/map-colorize.dgmo +11 -0
  31. package/gallery/fixtures/map-direct-color.dgmo +9 -0
  32. package/gallery/fixtures/map-reference-world.dgmo +11 -0
  33. package/gallery/fixtures/map-region-scope.dgmo +0 -3
  34. package/gallery/fixtures/map-route.dgmo +0 -1
  35. package/package.json +1 -1
  36. package/src/advanced.ts +26 -1
  37. package/src/boxes-and-lines/renderer.ts +39 -12
  38. package/src/cli.ts +1 -1
  39. package/src/completion.ts +32 -24
  40. package/src/cycle/renderer.ts +14 -1
  41. package/src/d3.ts +23 -11
  42. package/src/editor/highlight-api.ts +4 -0
  43. package/src/editor/keywords.ts +13 -15
  44. package/src/infra/renderer.ts +35 -7
  45. package/src/map/colorize.ts +54 -0
  46. package/src/map/context-labels.ts +429 -0
  47. package/src/map/data/PROVENANCE.json +1 -1
  48. package/src/map/data/mountain-ranges.json +1 -0
  49. package/src/map/data/types.ts +34 -0
  50. package/src/map/data/water-bodies.json +1 -0
  51. package/src/map/dimensions.ts +117 -0
  52. package/src/map/geo-query.ts +295 -0
  53. package/src/map/geo.ts +305 -2
  54. package/src/map/invert.ts +111 -0
  55. package/src/map/layout.ts +1504 -335
  56. package/src/map/load-data.ts +16 -2
  57. package/src/map/parser.ts +57 -111
  58. package/src/map/renderer.ts +556 -13
  59. package/src/map/resolved-types.ts +24 -2
  60. package/src/map/resolver.ts +237 -67
  61. package/src/map/types.ts +39 -23
  62. package/src/mindmap/renderer.ts +10 -1
  63. package/src/palettes/atlas.ts +77 -0
  64. package/src/palettes/blueprint.ts +73 -0
  65. package/src/palettes/color-utils.ts +58 -1
  66. package/src/palettes/index.ts +12 -3
  67. package/src/palettes/slate.ts +73 -0
  68. package/src/palettes/tidewater.ts +73 -0
  69. package/src/render.ts +8 -1
  70. package/src/tech-radar/renderer.ts +3 -0
  71. package/src/tech-radar/types.ts +3 -0
  72. package/src/utils/d3-types.ts +5 -0
  73. package/src/utils/legend-layout.ts +21 -4
  74. package/src/utils/legend-types.ts +7 -0
  75. package/src/utils/reserved-key-registry.ts +3 -0
  76. package/src/palettes/bold.ts +0 -67
@@ -2,6 +2,7 @@ import { EChartsOption } from 'echarts';
2
2
  import * as d3Selection from 'd3-selection';
3
3
  import { Selection } from 'd3-selection';
4
4
  import * as d3Scale from 'd3-scale';
5
+ import { GeoProjection } from 'd3-geo';
5
6
 
6
7
  type DgmoSeverity = 'error' | 'warning';
7
8
  interface DgmoError {
@@ -78,6 +79,380 @@ interface ParseInArrowLabelResult {
78
79
  */
79
80
  declare function parseInArrowLabel(rawLabel: string, lineNumber: number): ParseInArrowLabelResult;
80
81
 
82
+ /** A single entry inside a tag group: `Value color` */
83
+ interface TagEntry {
84
+ readonly value: string;
85
+ readonly color: string;
86
+ readonly lineNumber: number;
87
+ }
88
+ /**
89
+ * A tag group block: heading + entries.
90
+ *
91
+ * Parser internals build via `Writable<TagGroup>` from `utils/brand.ts`;
92
+ * once returned to a chart-type parser, consumers see the readonly view.
93
+ */
94
+ interface TagGroup {
95
+ readonly name: string;
96
+ readonly alias?: string;
97
+ readonly entries: readonly TagEntry[];
98
+ /** Default value for nodes without explicit metadata. First entry unless another is marked `default`. */
99
+ readonly defaultValue?: string;
100
+ readonly lineNumber: number;
101
+ }
102
+
103
+ /** A POI / route-stop position: gazetteer name (+ optional ISO scope) or coords. */
104
+ type PoiPos = {
105
+ readonly kind: 'coords';
106
+ readonly lat: number;
107
+ readonly lon: number;
108
+ } | {
109
+ readonly kind: 'name';
110
+ readonly name: string;
111
+ readonly scope?: string;
112
+ };
113
+ /** One-shot directives (§24B.2/.7). Values are raw strings unless typed.
114
+ *
115
+ * COSMETIC DEFAULTS ARE ON. Every basemap feature renders by default; the only
116
+ * control is a bare `no-*` opt-out flag that sets the matching `noXxx` boolean.
117
+ * Absent (undefined) = feature ON — so render gates test `!== true`, never
118
+ * `=== true`. There are NO positive opt-in cosmetic flags (§24B.2). */
119
+ interface MapDirectives {
120
+ /** Legend label for the region value ramp (`region-metric <label>`). */
121
+ regionMetric?: string;
122
+ /** Recognized color NAME for the choropleth ramp hue, peeled off the
123
+ * `region-metric` trailing token (§24B.3). Defaults to red when absent. */
124
+ regionMetricColor?: string;
125
+ /** Legend label for the POI value (marker size) channel (`poi-metric`). */
126
+ poiMetric?: string;
127
+ /** Legend label for the edge/leg value (thickness) channel (`flow-metric`). */
128
+ flowMetric?: string;
129
+ /** Default ISO scope for bare-name resolution (§24B.8): a 3166-1 country
130
+ * (`locale US`) or 3166-2 subdivision (`locale US-GA`). The country part
131
+ * biases ambiguous bare cities to that nation; the subdivision part further
132
+ * prefers that state. Inferred from content; explicit only to steer a guess. */
133
+ locale?: string;
134
+ activeTag?: string;
135
+ caption?: string;
136
+ /** `no-legend` — suppress the legend (default-on). */
137
+ noLegend?: boolean;
138
+ /** `no-coastline` — suppress the faint nautical-chart water-lines along
139
+ * coasts/shorelines (default-on; geometry derived from drawn region paths). */
140
+ noCoastline?: boolean;
141
+ /** `no-relief` — suppress mountain-range relief hachures. Relief is default-on
142
+ * but auto-gated to dataless reference maps at continent/world zoom (§24B.2). */
143
+ noRelief?: boolean;
144
+ /** `no-context-labels` — suppress the orientation backdrop (water-body names +
145
+ * unreferenced notable country names), distinct from `region-labels`. */
146
+ noContextLabels?: boolean;
147
+ /** `no-region-labels` — suppress region labels (default-on, full→abbrev→hide). */
148
+ noRegionLabels?: boolean;
149
+ /** `no-poi-labels` — suppress POI labels (default-on, collision-managed auto). */
150
+ noPoiLabels?: boolean;
151
+ /** `no-colorize` — force the plain green-land reference dress even when regions
152
+ * are referenced (regions are auto-coloured by default; §24B colorize). A
153
+ * no-op under data — the basemap is already gray there. */
154
+ noColorize?: boolean;
155
+ }
156
+ /** A region-fill: a subdivision name with an optional score and/or tag values
157
+ * (§24B.3/.4 — BOTH may be present; bivariate seam). */
158
+ interface MapRegion {
159
+ readonly name: string;
160
+ /** Optional trailing ISO scope qualifier (§24B.8) — a 3166-1 country code
161
+ * (`Georgia US` → US context) or 3166-2 subdivision (`Georgia US-GA`).
162
+ * Forces the country-vs-state interpretation and silences the ambiguity warning. */
163
+ readonly scope?: string;
164
+ /** Numeric value → choropleth shade (§24B.3). Lifted out of `meta`. */
165
+ readonly value?: number;
166
+ /** §1.5 trailing-token color NAME → flat categorical override fill (§24B.4);
167
+ * painted regardless of the active colouring dimension, no legend entry. */
168
+ readonly color?: string;
169
+ /** Tag values keyed by lowercased tag GROUP name (alias is resolved away). */
170
+ readonly tags: Readonly<Record<string, string>>;
171
+ /** Any remaining reserved keys captured verbatim (`label`/`style`/…). */
172
+ readonly meta: Readonly<Record<string, string>>;
173
+ readonly lineNumber: number;
174
+ }
175
+ /** A point of interest (§24B.5). `meta` holds the numeric `value` (→ marker
176
+ * size) and `style` verbatim; `label` is lifted out. */
177
+ interface MapPoi {
178
+ readonly pos: PoiPos;
179
+ readonly alias?: string;
180
+ readonly label?: string;
181
+ /** §1.5 trailing-token color NAME → flat marker fill (§24B.5); wins over a
182
+ * tag color and the default orange. */
183
+ readonly color?: string;
184
+ readonly tags: Readonly<Record<string, string>>;
185
+ readonly meta: Readonly<Record<string, string>>;
186
+ readonly lineNumber: number;
187
+ }
188
+ /** One leg of a route (§24B.6): an edge from the previous stop to `dest`. Reuses
189
+ * the edge arrow idiom — in-arrow text = leg label, `value:` = leg thickness,
190
+ * `->`/`~>` (or the header `style: arc`) = shape. Stop-targeted keys on the leg
191
+ * line (`tag`, `label:`) decorate the DESTINATION point. */
192
+ interface MapRouteLeg {
193
+ readonly label?: string;
194
+ readonly style: 'straight' | 'arc';
195
+ readonly value?: string;
196
+ readonly dest: PoiPos;
197
+ readonly destAlias?: string;
198
+ readonly destLabel?: string;
199
+ readonly destTags: Readonly<Record<string, string>>;
200
+ readonly lineNumber: number;
201
+ }
202
+ /** An ordered, auto-numbered route (§24B.6): `route <origin> [style: arc]` + a
203
+ * sequence of indented arrow legs, each continuing from the previous stop.
204
+ * Repeat the origin as a leg's destination to close a loop. */
205
+ interface MapRoute {
206
+ readonly origin: PoiPos;
207
+ readonly originAlias?: string;
208
+ readonly originLabel?: string;
209
+ readonly originValue?: string;
210
+ readonly originTags: Readonly<Record<string, string>>;
211
+ readonly style: 'straight' | 'arc';
212
+ readonly legs: readonly MapRouteLeg[];
213
+ readonly lineNumber: number;
214
+ }
215
+ /** A connector (§24B.6). Endpoints are RAW identifier strings (name or alias);
216
+ * binding to POIs/regions is the resolver's job. `~>`→arc; `--`→directed:false. */
217
+ interface MapEdge {
218
+ readonly from: string;
219
+ readonly to: string;
220
+ readonly label?: string;
221
+ readonly directed: boolean;
222
+ readonly style: 'straight' | 'arc';
223
+ readonly meta: Readonly<Record<string, string>>;
224
+ readonly lineNumber: number;
225
+ }
226
+ interface ParsedMap {
227
+ readonly title: string | null;
228
+ readonly titleLineNumber: number | null;
229
+ readonly directives: MapDirectives;
230
+ readonly tagGroups: readonly TagGroup[];
231
+ readonly regions: readonly MapRegion[];
232
+ readonly pois: readonly MapPoi[];
233
+ readonly routes: readonly MapRoute[];
234
+ readonly edges: readonly MapEdge[];
235
+ readonly options: Readonly<Record<string, string>>;
236
+ readonly diagnostics: readonly DgmoError[];
237
+ readonly error: string | null;
238
+ }
239
+
240
+ /** A TopoJSON topology (world-coarse/world-detail keyed by ISO 3166-1 alpha-2;
241
+ * us-states keyed by ISO 3166-2). Geometry feature `id` is the ISO code;
242
+ * `properties.name` is the display string. Kept loose to avoid a topojson dep. */
243
+ interface BoundaryTopology {
244
+ type: 'Topology';
245
+ objects: Record<string, {
246
+ type: string;
247
+ geometries: BoundaryGeometry[];
248
+ }>;
249
+ arcs: number[][][];
250
+ transform?: {
251
+ scale: [number, number];
252
+ translate: [number, number];
253
+ };
254
+ bbox?: number[];
255
+ }
256
+ interface BoundaryGeometry {
257
+ type: string;
258
+ /** ISO code: alpha-2 (countries) or 3166-2 `US-XX` (states). */
259
+ id: string;
260
+ properties: {
261
+ name: string;
262
+ };
263
+ arcs?: unknown;
264
+ }
265
+ /**
266
+ * A gazetteer city entry: `[lat, lon, iso, pop, name, sub?]`.
267
+ * - `lat`/`lon` — rounded to 3 decimals.
268
+ * - `iso` — ISO 3166-1 alpha-2 country code.
269
+ * - `pop` — population.
270
+ * - `name` — canonical display name (case/accents preserved).
271
+ * - `sub` — ISO 3166-2 subdivision (US cities only in v1, e.g. `US-OR`); absent otherwise.
272
+ */
273
+ type GazetteerEntry = [
274
+ lat: number,
275
+ lon: number,
276
+ iso: string,
277
+ pop: number,
278
+ name: string,
279
+ sub?: string
280
+ ];
281
+ interface Gazetteer {
282
+ /** Every city, stored once. `byName`/`alt` reference cities by array index
283
+ * (normalized — no tuple duplication; geonameid is a build-time-only linker). */
284
+ cities: GazetteerEntry[];
285
+ /** Folded (NFD, diacritic-stripped, lowercased) name → indices into `cities`.
286
+ * Always an array; length > 1 for same-named cities (Portland US-OR / US-ME). */
287
+ byName: Record<string, number[]>;
288
+ /** Folded alias → index into `cities`. Never collides with a `byName` key. */
289
+ alt: Record<string, number>;
290
+ }
291
+ /** Water-feature class (Natural Earth `featurecla`, rivers/reefs excluded). */
292
+ type WaterKind = 'ocean' | 'sea' | 'gulf' | 'bay' | 'strait' | 'channel' | 'sound';
293
+ /**
294
+ * A water-body label entry: `[lat, lon, name, tier, kind, alt?]`.
295
+ * - `lat`/`lon` — label anchor (Natural Earth inner point), rounded to 3 decimals.
296
+ * - `name` — full display name (no abbreviation exists for water bodies).
297
+ * - `tier` — Natural Earth `scalerank` (0 = most prominent → orientation priority).
298
+ * - `kind` — feature class (drives styling/priority bucketing).
299
+ * - `alt` — optional extra anchor points `[lat, lon][]`; the layout picks the
300
+ * one nearest the viewport center (Decision 5 multi-anchor seam). Absent today.
301
+ */
302
+ type WaterBodyEntry = [
303
+ lat: number,
304
+ lon: number,
305
+ name: string,
306
+ tier: number,
307
+ kind: WaterKind,
308
+ alt?: ReadonlyArray<readonly [number, number]>
309
+ ];
310
+ interface WaterBodies {
311
+ /** Deterministically ordered (tier, then name). Generated from Natural Earth
312
+ * marine polys by scripts/build-map-data.mjs into `water-bodies.json`. */
313
+ readonly entries: readonly WaterBodyEntry[];
314
+ }
315
+ /** A fill-able region (country or US state) — the display name + its ISO id +
316
+ * layer. Powers region-name autocomplete (completion-only; the renderer derives
317
+ * names from the topology directly). Extracted from the topologies by
318
+ * scripts/build-map-data.mjs into `region-names.json`. */
319
+ interface RegionName {
320
+ /** Display name (original casing), e.g. `California` / `Germany`. */
321
+ readonly name: string;
322
+ /** ISO 3166-1 alpha-2 (country) or 3166-2 `US-XX` (state). */
323
+ readonly iso: string;
324
+ readonly layer: 'country' | 'us-state';
325
+ }
326
+ interface RegionNames {
327
+ /** Deterministically ordered (layer, then name). */
328
+ readonly regions: readonly RegionName[];
329
+ }
330
+
331
+ /** The four static assets, injected into the pure resolver (DI). */
332
+ interface MapData {
333
+ worldCoarse: BoundaryTopology;
334
+ worldDetail: BoundaryTopology;
335
+ usStates: BoundaryTopology;
336
+ /** Major lakes (Natural Earth 110m) drawn as water over land — e.g. the Great
337
+ * Lakes. Optional so hand-built test fixtures need not supply it. */
338
+ lakes?: BoundaryTopology;
339
+ /** Major river centerlines (Natural Earth 110m) drawn as thin water lines over
340
+ * land — e.g. the Amazon, Nile, Mississippi. Optional, like `lakes`. */
341
+ rivers?: BoundaryTopology;
342
+ /** Notable mountain-range polygons (Natural Earth 50m geography regions) drawn
343
+ * as a subtle gradient relief cue over base land when the `relief` directive
344
+ * is on — e.g. the Rockies, Andes, Himalayas. Optional, like `lakes`. */
345
+ mountainRanges?: BoundaryTopology;
346
+ /** North-America-clipped 10m country land, used as crisp neighbour context
347
+ * under the albers-usa US view so Canada/Mexico match the 10m states instead
348
+ * of the coarser world tiers. Optional, like `lakes`. */
349
+ naLand?: BoundaryTopology;
350
+ /** North-America-clipped 10m major lakes (Great Lakes etc.), used in place of
351
+ * the coarse `lakes` under the albers-usa US view. Optional. */
352
+ naLakes?: BoundaryTopology;
353
+ /** Water-body orientation labels (Natural Earth marine polys) drawn when the
354
+ * `context-labels` directive is on — oceans/seas/gulfs/bays/etc. Optional, so
355
+ * hand-built test fixtures and older bundles need not supply it. */
356
+ waterBodies?: WaterBodies;
357
+ gazetteer: Gazetteer;
358
+ }
359
+ type ProjectionFamily = 'equal-earth' | 'natural-earth' | 'equirectangular' | 'albers-usa' | 'mercator';
360
+ /** Which geometry layers the renderer draws. */
361
+ interface Basemaps {
362
+ /** World country tier: coarse (world-scale) | detail (regional/zoom). */
363
+ world: 'coarse' | 'detail';
364
+ /** Loaded subdivision layers (v1: only 'us-states'). */
365
+ subdivisions: Array<'us-states'>;
366
+ }
367
+ interface ResolvedRegion {
368
+ /** ISO code: alpha-2 (country) or 3166-2 `US-XX` (state) — the geometry id. */
369
+ readonly iso: string;
370
+ readonly name: string;
371
+ readonly layer: 'country' | 'us-state';
372
+ readonly value?: number;
373
+ /** §1.5 trailing-token color NAME → flat override fill (§24B.4). */
374
+ readonly color?: string;
375
+ readonly tags: Readonly<Record<string, string>>;
376
+ readonly meta: Readonly<Record<string, string>>;
377
+ readonly lineNumber: number;
378
+ }
379
+ interface ResolvedPoi {
380
+ /** Folded registry id (alias|name folded, or `@lat,lon` for coord POIs). */
381
+ readonly id: string;
382
+ /** Display name (original casing): the city/place name, alias, or endpoint
383
+ * string. The on-map label falls back to this when `label` is absent (the
384
+ * folded `id` is for binding, not display). */
385
+ readonly name?: string;
386
+ readonly lat: number;
387
+ readonly lon: number;
388
+ readonly label?: string;
389
+ /** §1.5 trailing-token color NAME → flat marker fill (§24B.5). */
390
+ readonly color?: string;
391
+ readonly tags: Readonly<Record<string, string>>;
392
+ readonly meta: Readonly<Record<string, string>>;
393
+ readonly lineNumber: number;
394
+ /** True when created from an undeclared edge/route endpoint (§24B.10). */
395
+ readonly implicit?: boolean;
396
+ }
397
+ interface ResolvedEdge {
398
+ readonly fromId: string;
399
+ readonly toId: string;
400
+ readonly label?: string;
401
+ readonly directed: boolean;
402
+ readonly style: 'straight' | 'arc';
403
+ readonly meta: Readonly<Record<string, string>>;
404
+ readonly lineNumber: number;
405
+ }
406
+ interface ResolvedRouteLeg {
407
+ readonly fromId: string;
408
+ readonly toId: string;
409
+ readonly label?: string;
410
+ readonly style: 'straight' | 'arc';
411
+ readonly value?: string;
412
+ readonly lineNumber: number;
413
+ }
414
+ interface ResolvedRoute {
415
+ /** Ordered UNIQUE stop ids (for numbering + the origin marker). A loop-closing
416
+ * leg whose destination is an earlier stop adds a leg but no duplicate stop. */
417
+ readonly stopIds: readonly string[];
418
+ readonly legs: readonly ResolvedRouteLeg[];
419
+ readonly lineNumber: number;
420
+ }
421
+ /** Geographic bounding box `[[west, south], [east, north]]` in degrees.
422
+ *
423
+ * WRAP CONVENTION (#12): for an antimeridian-crossing extent the resolver keeps
424
+ * `west` in [−180, 180] and returns `east` UNWRAPPED in (180, 540] (i.e.
425
+ * `east = west + span`, span ≤ 360). So `east > 180` signals a dateline-crossing
426
+ * extent; the renderer (step 4) must mod `east` back into [−180, 180] (or shift
427
+ * the projection's center) rather than assume `east ≤ 180`. `south`/`north` are
428
+ * always plain degrees in [−90, 90]. */
429
+ type GeoExtent = [[number, number], [number, number]];
430
+ interface ResolvedMap {
431
+ readonly title: string | null;
432
+ /** DEAD — the `subtitle` directive was removed (2026-06-02 defaults-on review).
433
+ * Never populated; the renderer's subtitle branch is now unreachable. Left for
434
+ * a later cleanup pass. */
435
+ readonly subtitle?: string;
436
+ readonly caption?: string;
437
+ readonly tagGroups: readonly TagGroup[];
438
+ readonly directives: MapDirectives;
439
+ readonly basemaps: Basemaps;
440
+ readonly regions: readonly ResolvedRegion[];
441
+ readonly pois: readonly ResolvedPoi[];
442
+ readonly edges: readonly ResolvedEdge[];
443
+ readonly routes: readonly ResolvedRoute[];
444
+ readonly extent: GeoExtent;
445
+ readonly projection: ProjectionFamily;
446
+ /** POI-only region framing: the region(s) that CONTAIN the POIs — us-state ids
447
+ * (`US-CA`) or country isos (`FR`). The frame is snapped to the union of their
448
+ * bboxes, and the layout labels them prominently (vs. muted neighbours). Empty
449
+ * for non-POI-only maps or when POIs fall outside every polygon. Optional so
450
+ * older/foreign ResolvedMap literals need not supply it. */
451
+ readonly poiFrameContainers?: readonly string[];
452
+ readonly diagnostics: readonly DgmoError[];
453
+ readonly error: string | null;
454
+ }
455
+
81
456
  /**
82
457
  * Compact view state schema (ADR-6).
83
458
  * All fields optional. Only non-default values are encoded.
@@ -192,6 +567,9 @@ declare function render(content: string, options?: {
192
567
  };
193
568
  /** View state for export — controls interactive state (collapse, swimlanes, etc.) */
194
569
  viewState?: CompactViewState;
570
+ /** Bundled map data for `map` charts in the browser, where the Node fs
571
+ * `loadMapData()` seam can't run. CLI/SSR omit this and fall back to fs. */
572
+ mapData?: MapData;
195
573
  }): Promise<{
196
574
  svg: string;
197
575
  diagnostics: DgmoError[];
@@ -496,7 +874,9 @@ declare function shapeFill(palette: PaletteColors, intent: string, isDark: boole
496
874
  /** Derive the 8-color series rotation from a palette's named colors. */
497
875
  declare function getSeriesColors(palette: PaletteColors): string[];
498
876
 
499
- declare const boldPalette: PaletteConfig;
877
+ declare const atlasPalette: PaletteConfig;
878
+
879
+ declare const blueprintPalette: PaletteConfig;
500
880
 
501
881
  declare const catppuccinPalette: PaletteConfig;
502
882
 
@@ -508,8 +888,12 @@ declare const oneDarkPalette: PaletteConfig;
508
888
 
509
889
  declare const rosePinePalette: PaletteConfig;
510
890
 
891
+ declare const slatePalette: PaletteConfig;
892
+
511
893
  declare const solarizedPalette: PaletteConfig;
512
894
 
895
+ declare const tidewaterPalette: PaletteConfig;
896
+
513
897
  declare const tokyoNightPalette: PaletteConfig;
514
898
 
515
899
  declare const draculaPalette: PaletteConfig;
@@ -526,6 +910,10 @@ declare const monokaiPalette: PaletteConfig;
526
910
  * used by share URLs and the CLI `--palette` flag.
527
911
  */
528
912
  declare const palettes: {
913
+ readonly atlas: PaletteConfig;
914
+ readonly blueprint: PaletteConfig;
915
+ readonly slate: PaletteConfig;
916
+ readonly tidewater: PaletteConfig;
529
917
  readonly nord: PaletteConfig;
530
918
  readonly catppuccin: PaletteConfig;
531
919
  readonly solarized: PaletteConfig;
@@ -535,7 +923,6 @@ declare const palettes: {
535
923
  readonly rosePine: PaletteConfig;
536
924
  readonly dracula: PaletteConfig;
537
925
  readonly monokai: PaletteConfig;
538
- readonly bold: PaletteConfig;
539
926
  };
540
927
 
541
928
  type ChartType$1 = 'bar' | 'line' | 'pie' | 'doughnut' | 'area' | 'polar-area' | 'radar' | 'bar-stacked';
@@ -704,6 +1091,13 @@ interface LegendConfig {
704
1091
  * group). Lets the user click a sibling to switch the active group. Default
705
1092
  * false (legacy: when one group is active the others are hidden). */
706
1093
  showInactivePills?: boolean;
1094
+ /** Where the controlsGroup is hosted. Default (undefined / 'inline') renders
1095
+ * the in-SVG gear exactly as before — every non-app consumer (Obsidian,
1096
+ * site, remark-family, CLI) is unaffected. When 'app', the controlsGroup is
1097
+ * dropped entirely (no gear, no reserved row): the app overlay strip owns the
1098
+ * controls, pinned to the top edge of the preview. App preview only; never
1099
+ * set on the export path. */
1100
+ controlsHost?: 'app' | 'inline';
707
1101
  }
708
1102
  interface LegendPalette {
709
1103
  bg: string;
@@ -983,6 +1377,11 @@ declare function renderExtendedChartForExport(content: string, theme: 'light' |
983
1377
  interface D3ExportDimensions {
984
1378
  width?: number;
985
1379
  height?: number;
1380
+ /** Map-only: when true, the map renderer suppresses its global stretch-fill and
1381
+ * contain-fits (letterbox) instead. Set by `mapExportDimensions` when the export
1382
+ * canvas was clamped/floored away from the map's content aspect, so the
1383
+ * off-aspect canvas doesn't re-distort. Ignored by all non-map renderers. */
1384
+ preferContain?: boolean;
986
1385
  }
987
1386
 
988
1387
  type TimelineSort = 'time' | 'group' | 'tag';
@@ -1019,27 +1418,6 @@ type TimelineDurationUnit = 'd' | 'w' | 'm' | 'y' | 'h' | 'min';
1019
1418
  declare function addDurationToDate(startDate: string, amount: number, unit: TimelineDurationUnit): string;
1020
1419
  declare function parseTimelineDate(s: string): number;
1021
1420
 
1022
- /** A single entry inside a tag group: `Value color` */
1023
- interface TagEntry {
1024
- readonly value: string;
1025
- readonly color: string;
1026
- readonly lineNumber: number;
1027
- }
1028
- /**
1029
- * A tag group block: heading + entries.
1030
- *
1031
- * Parser internals build via `Writable<TagGroup>` from `utils/brand.ts`;
1032
- * once returned to a chart-type parser, consumers see the readonly view.
1033
- */
1034
- interface TagGroup {
1035
- readonly name: string;
1036
- readonly alias?: string;
1037
- readonly entries: readonly TagEntry[];
1038
- /** Default value for nodes without explicit metadata. First entry unless another is marked `default`. */
1039
- readonly defaultValue?: string;
1040
- readonly lineNumber: number;
1041
- }
1042
-
1043
1421
  type VisualizationType = 'slope' | 'wordcloud' | 'arc' | 'timeline' | 'venn' | 'quadrant' | 'sequence' | 'tech-radar' | 'cycle' | 'pyramid' | 'ring';
1044
1422
  interface D3DataItem {
1045
1423
  label: string;
@@ -1189,6 +1567,7 @@ declare function renderForExport(content: string, theme: 'light' | 'dark' | 'tra
1189
1567
  c4Container?: string;
1190
1568
  tagGroup?: string;
1191
1569
  exportMode?: boolean;
1570
+ mapData?: MapData;
1192
1571
  }): Promise<string>;
1193
1572
 
1194
1573
  /**
@@ -2217,6 +2596,9 @@ interface BLRenderOptions {
2217
2596
  onToggleDescriptions?: (active: boolean) => void;
2218
2597
  onToggleControlsExpand?: () => void;
2219
2598
  exportMode?: boolean;
2599
+ /** When 'app', the description toggle is hosted by the app overlay strip
2600
+ * (inline gear suppressed, controls row + anchor reserved). */
2601
+ controlsHost?: 'app' | 'inline';
2220
2602
  }
2221
2603
  declare function renderBoxesAndLines(container: HTMLDivElement, parsed: ParsedBoxesAndLines, layout: BLLayoutResult, palette: PaletteColors, isDark: boolean, options?: BLRenderOptions): void;
2222
2604
  declare function renderBoxesAndLinesForExport(container: HTMLDivElement, parsed: ParsedBoxesAndLines, layout: BLLayoutResult, palette: PaletteColors, isDark: boolean, options?: {
@@ -2644,7 +3026,10 @@ interface InfraPlaybackState {
2644
3026
  speed: number;
2645
3027
  speedOptions: readonly number[];
2646
3028
  }
2647
- declare function renderInfra(container: HTMLDivElement, layout: InfraLayoutResult, palette: PaletteColors, isDark: boolean, title: string | null, titleLineNumber: number | null, tagGroups?: readonly InfraTagGroup[], activeGroup?: string | null, animate?: boolean, playback?: InfraPlaybackState | null, expandedNodeIds?: Set<string> | null, exportMode?: boolean, collapsedNodes?: Set<string> | null): void;
3029
+ declare function renderInfra(container: HTMLDivElement, layout: InfraLayoutResult, palette: PaletteColors, isDark: boolean, title: string | null, titleLineNumber: number | null, tagGroups?: readonly InfraTagGroup[], activeGroup?: string | null, animate?: boolean, playback?: InfraPlaybackState | null, expandedNodeIds?: Set<string> | null, exportMode?: boolean, collapsedNodes?: Set<string> | null,
3030
+ /** When 'app', the playback pill is suppressed and a controls row + anchor are
3031
+ * reserved for the app overlay strip (play/pause + speed live there). */
3032
+ controlsHost?: 'app' | 'inline'): void;
2648
3033
  declare function parseAndLayoutInfra(content: string): {
2649
3034
  parsed: ParsedInfra;
2650
3035
  computed: null;
@@ -3697,6 +4082,9 @@ declare function renderMindmap(container: HTMLDivElement, parsed: ParsedMindmap,
3697
4082
  controlsExpanded?: boolean;
3698
4083
  onToggleControlsExpand?: () => void;
3699
4084
  exportMode?: boolean;
4085
+ /** When 'app', controls (Descriptions / Depth Colors) are hosted by the app
4086
+ * overlay strip — inline gear suppressed, controls row + anchor reserved. */
4087
+ controlsHost?: 'app' | 'inline';
3700
4088
  }): void;
3701
4089
  declare function renderMindmapForExport(content: string, theme: 'light' | 'dark' | 'transparent', palette: PaletteColors): string;
3702
4090
 
@@ -3886,6 +4274,9 @@ interface TechRadarRenderOptions {
3886
4274
  activeLine?: number | null;
3887
4275
  /** True when rendering for export (PNG/SVG/PDF) — controls whether collapsed legend pills and cog are stripped. */
3888
4276
  exportMode?: boolean;
4277
+ /** When 'app', the Blip Legend toggle is hosted by the app overlay strip
4278
+ * (inline gear suppressed, controls row + anchor reserved). */
4279
+ controlsHost?: 'app' | 'inline';
3889
4280
  }
3890
4281
 
3891
4282
  declare function parseTechRadar(content: string): ParsedTechRadar;
@@ -4002,547 +4393,260 @@ interface CycleLayoutResult {
4002
4393
 
4003
4394
  /**
4004
4395
  * Parse a `.dgmo` cycle diagram document.
4005
- *
4006
- * Syntax (§1.4 unified metadata grammar):
4007
- * ```
4008
- * cycle Title
4009
- *
4010
- * direction-counterclockwise
4011
- *
4012
- * NodeLabel color: blue, span: 3
4013
- * Description line (indented under node)
4014
- * -Label-> color: red, width: 6
4015
- * Edge description (indented under edge)
4016
- * ```
4017
- */
4018
- declare function parseCycle(content: string): ParsedCycle;
4019
-
4020
- /**
4021
- * Compute cycle diagram layout: positions nodes equidistant (or span-weighted)
4022
- * on a circle, and generates curved edge paths between consecutive nodes.
4023
- */
4024
- declare function computeCycleLayout(parsed: ParsedCycle, options?: {
4025
- width?: number;
4026
- height?: number;
4027
- hideDescriptions?: boolean;
4028
- }): CycleLayoutResult;
4029
-
4030
- interface CycleRenderOptions {
4031
- onClickItem?: (lineNumber: number) => void;
4032
- exportDims?: D3ExportDimensions;
4033
- viewState?: CompactViewState;
4034
- hideDescriptions?: boolean;
4035
- controlsExpanded?: boolean;
4036
- onToggleDescriptions?: (active: boolean) => void;
4037
- onToggleControlsExpand?: () => void;
4038
- exportMode?: boolean;
4039
- }
4040
- /**
4041
- * Render a cycle diagram into the given container.
4042
- */
4043
- declare function renderCycle(container: HTMLDivElement, parsed: ParsedCycle, palette: PaletteColors, isDark: boolean, onClickItem?: (lineNumber: number) => void, exportDims?: D3ExportDimensions, viewState?: CompactViewState, renderOptions?: CycleRenderOptions): void;
4044
- /**
4045
- * Render for CLI/export (no click handlers).
4046
- */
4047
- declare function renderCycleForExport(container: HTMLDivElement, parsed: ParsedCycle, palette: PaletteColors, isDark: boolean, exportDims?: D3ExportDimensions, viewState?: CompactViewState, exportMode?: boolean): void;
4048
-
4049
- interface JourneyMapAnnotation {
4050
- readonly type: 'pain' | 'opportunity' | 'thought';
4051
- readonly text: string;
4052
- }
4053
- interface JourneyMapStep {
4054
- readonly id: string;
4055
- readonly title: string;
4056
- readonly score?: number;
4057
- readonly emotionLabel?: string;
4058
- readonly tags: Readonly<Record<string, string>>;
4059
- readonly annotations: readonly JourneyMapAnnotation[];
4060
- readonly description?: string;
4061
- readonly lineNumber: number;
4062
- readonly endLineNumber: number;
4063
- }
4064
- interface JourneyMapPhase {
4065
- readonly id: string;
4066
- readonly name: string;
4067
- readonly steps: readonly JourneyMapStep[];
4068
- readonly lineNumber: number;
4069
- }
4070
- interface JourneyMapPersona {
4071
- readonly name: string;
4072
- readonly description?: string;
4073
- readonly color?: string;
4074
- readonly lineNumber: number;
4075
- }
4076
- interface ParsedJourneyMap {
4077
- readonly type: 'journey-map';
4078
- readonly title?: string;
4079
- readonly titleLineNumber?: number;
4080
- readonly persona?: JourneyMapPersona;
4081
- readonly phases: readonly JourneyMapPhase[];
4082
- /** Flat-mode steps (not inside any phase) */
4083
- readonly steps: readonly JourneyMapStep[];
4084
- readonly tagGroups: readonly TagGroup[];
4085
- readonly options: Readonly<Record<string, string>>;
4086
- readonly diagnostics: readonly DgmoError[];
4087
- readonly error: string | null;
4088
- }
4089
-
4090
- declare function parseJourneyMap(content: string, palette?: PaletteColors): ParsedJourneyMap;
4091
-
4092
- interface CurvePoint {
4093
- x: number;
4094
- y: number;
4095
- score: number;
4096
- emotionLabel?: string;
4097
- stepIndex: number;
4098
- }
4099
- interface StepLayout {
4100
- x: number;
4101
- y: number;
4102
- width: number;
4103
- height: number;
4104
- step: JourneyMapStep;
4105
- color: string;
4106
- }
4107
- interface PhaseLayout {
4108
- x: number;
4109
- y: number;
4110
- width: number;
4111
- height: number;
4112
- phase: JourneyMapPhase;
4113
- headerColor: string;
4114
- stepLayouts: StepLayout[];
4115
- }
4116
- interface JourneyMapLayout {
4117
- phases: PhaseLayout[];
4118
- flatStepLayouts: StepLayout[];
4119
- curvePoints: CurvePoint[];
4120
- totalWidth: number;
4121
- totalHeight: number;
4122
- curveAreaTop: number;
4123
- curveAreaBottom: number;
4124
- cardAreaTop: number;
4125
- personaHeight: number;
4126
- titleHeight: number;
4127
- /** Whether any step has thought annotations */
4128
- hasThoughts: boolean;
4129
- }
4130
- declare function layoutJourneyMap(parsed: ParsedJourneyMap, palette: PaletteColors, options?: {
4131
- exportDims?: {
4132
- width: number;
4133
- height: number;
4134
- };
4135
- collapsedPhases?: Set<string>;
4136
- isDark?: boolean;
4137
- }): JourneyMapLayout;
4138
-
4139
- interface JourneyMapInteractiveOptions {
4140
- onNavigateToLine?: (line: number) => void;
4141
- exportDims?: {
4142
- width: number;
4143
- height: number;
4144
- };
4145
- activeTagGroup?: string | null;
4146
- onActiveTagGroupChange?: (group: string | null) => void;
4147
- /** Current editor cursor line — highlights the matching face + card, dims the rest */
4148
- currentLine?: number | null;
4149
- /** Set of collapsed phase names */
4150
- collapsedPhases?: Set<string>;
4151
- /** Called when a phase is toggled */
4152
- onPhaseToggle?: (phaseName: string) => void;
4153
- exportMode?: boolean;
4154
- }
4155
- declare function renderJourneyMap(container: HTMLElement, parsed: ParsedJourneyMap, palette: PaletteColors, isDark: boolean, options?: JourneyMapInteractiveOptions): void;
4156
- declare function renderJourneyMapForExport(content: string, theme: 'light' | 'dark' | 'transparent', palette: PaletteColors): string;
4157
-
4158
- interface PyramidLayer {
4159
- readonly label: string;
4160
- readonly lineNumber: number;
4161
- /** Optional palette color name (red/green/blue/…). */
4162
- readonly color?: string;
4163
- /** Description lines — from bare pipe shorthand or indented body. */
4164
- readonly description: readonly string[];
4165
- /** Unconsumed pipe metadata (reserved for future use). */
4166
- readonly metadata: Readonly<Record<string, string>>;
4167
- }
4168
- interface ParsedPyramid {
4169
- readonly type: 'pyramid';
4170
- readonly title: string;
4171
- readonly titleLineNumber: number;
4172
- readonly layers: readonly PyramidLayer[];
4173
- /** When true, apex points down instead of up. */
4174
- readonly inverted: boolean;
4175
- readonly options: Readonly<Record<string, string>>;
4176
- readonly diagnostics: readonly DgmoError[];
4177
- readonly error: string | null;
4178
- }
4179
-
4180
- /**
4181
- * Parse a `.dgmo` pyramid diagram document.
4182
- *
4183
- * Top of file = apex of pyramid (reads top-down).
4184
- *
4185
- * Syntax:
4186
- * ```
4187
- * pyramid Maslow's Hierarchy of Needs
4188
- *
4189
- * inverted // optional — flips apex to bottom
4190
- *
4191
- * Self-Actualization // indented body = description
4192
- * Achieving one's full potential.
4193
- *
4194
- * Esteem | Respect, recognition // bare pipe shorthand = description
4195
- *
4196
- * Love & Belonging | color: blue // structured metadata
4197
- * Friendship, intimacy, family.
4198
- *
4199
- * Physiological | Food, water, rest
4200
- * ```
4201
- */
4202
- declare function parsePyramid(content: string): ParsedPyramid;
4203
-
4204
- /**
4205
- * Render a pyramid diagram into the given container.
4206
- */
4207
- declare function renderPyramid(container: HTMLDivElement, parsed: ParsedPyramid, palette: PaletteColors, isDark: boolean, onClickItem?: (lineNumber: number) => void, exportDims?: D3ExportDimensions): void;
4208
- /**
4209
- * Render for CLI/export (no click handlers).
4210
- */
4211
- declare function renderPyramidForExport(container: HTMLDivElement, parsed: ParsedPyramid, palette: PaletteColors, isDark: boolean, exportDims?: D3ExportDimensions): void;
4212
-
4213
- interface RingLayer {
4214
- readonly label: string;
4215
- readonly lineNumber: number;
4216
- /** Optional palette color name (red/green/blue/…). */
4217
- readonly color?: string;
4218
- /** Description lines — from bare pipe shorthand or indented body. */
4219
- readonly description: readonly string[];
4220
- /** Unconsumed pipe metadata (reserved for future use). */
4221
- readonly metadata: Readonly<Record<string, string>>;
4222
- }
4223
- interface ParsedRing {
4224
- readonly type: 'ring';
4225
- readonly title: string;
4226
- readonly titleLineNumber: number;
4227
- /** Source order: layers[0] = innermost (filled disc); last = outermost ring. */
4228
- readonly layers: readonly RingLayer[];
4229
- readonly options: Readonly<Record<string, string>>;
4230
- readonly diagnostics: readonly DgmoError[];
4231
- readonly error: string | null;
4232
- }
4396
+ *
4397
+ * Syntax (§1.4 unified metadata grammar):
4398
+ * ```
4399
+ * cycle Title
4400
+ *
4401
+ * direction-counterclockwise
4402
+ *
4403
+ * NodeLabel color: blue, span: 3
4404
+ * Description line (indented under node)
4405
+ * -Label-> color: red, width: 6
4406
+ * Edge description (indented under edge)
4407
+ * ```
4408
+ */
4409
+ declare function parseCycle(content: string): ParsedCycle;
4233
4410
 
4234
4411
  /**
4235
- * Parse a `.dgmo` ring diagram document.
4236
- *
4237
- * Top of file = innermost ring (rendered as a filled disc).
4238
- * Last layer in source = outermost ring.
4412
+ * Compute cycle diagram layout: positions nodes equidistant (or span-weighted)
4413
+ * on a circle, and generates curved edge paths between consecutive nodes.
4239
4414
  */
4240
- declare function parseRing(content: string): ParsedRing;
4415
+ declare function computeCycleLayout(parsed: ParsedCycle, options?: {
4416
+ width?: number;
4417
+ height?: number;
4418
+ hideDescriptions?: boolean;
4419
+ }): CycleLayoutResult;
4241
4420
 
4421
+ interface CycleRenderOptions {
4422
+ onClickItem?: (lineNumber: number) => void;
4423
+ exportDims?: D3ExportDimensions;
4424
+ viewState?: CompactViewState;
4425
+ hideDescriptions?: boolean;
4426
+ controlsExpanded?: boolean;
4427
+ onToggleDescriptions?: (active: boolean) => void;
4428
+ onToggleControlsExpand?: () => void;
4429
+ exportMode?: boolean;
4430
+ /** When 'app', the description toggle is hosted by the app overlay strip:
4431
+ * the inline gear is suppressed and a controls row + anchor are reserved.
4432
+ * Default (inline) renders the gear as before. */
4433
+ controlsHost?: 'app' | 'inline';
4434
+ }
4242
4435
  /**
4243
- * Render a ring diagram into the given container.
4436
+ * Render a cycle diagram into the given container.
4244
4437
  */
4245
- declare function renderRing(container: HTMLDivElement, parsed: ParsedRing, palette: PaletteColors, isDark: boolean, onClickItem?: (lineNumber: number) => void, exportDims?: D3ExportDimensions): void;
4438
+ declare function renderCycle(container: HTMLDivElement, parsed: ParsedCycle, palette: PaletteColors, isDark: boolean, onClickItem?: (lineNumber: number) => void, exportDims?: D3ExportDimensions, viewState?: CompactViewState, renderOptions?: CycleRenderOptions): void;
4246
4439
  /**
4247
4440
  * Render for CLI/export (no click handlers).
4248
4441
  */
4249
- declare function renderRingForExport(container: HTMLDivElement, parsed: ParsedRing, palette: PaletteColors, isDark: boolean, exportDims?: D3ExportDimensions): void;
4442
+ declare function renderCycleForExport(container: HTMLDivElement, parsed: ParsedCycle, palette: PaletteColors, isDark: boolean, exportDims?: D3ExportDimensions, viewState?: CompactViewState, exportMode?: boolean): void;
4250
4443
 
4251
- /** A POI / route-stop position: gazetteer name (+ optional ISO scope) or coords. */
4252
- type PoiPos = {
4253
- readonly kind: 'coords';
4254
- readonly lat: number;
4255
- readonly lon: number;
4256
- } | {
4257
- readonly kind: 'name';
4258
- readonly name: string;
4259
- readonly scope?: string;
4260
- };
4261
- /** `scale <min> <max> [center <n>]` (center reserved for the diverging seam, §24B.12). */
4262
- interface MapScale {
4263
- readonly min: number;
4264
- readonly max: number;
4265
- readonly center?: number;
4266
- }
4267
- /** One-shot directives (§24B.2/.7). Values are raw strings unless typed. */
4268
- interface MapDirectives {
4269
- region?: string;
4270
- projection?: string;
4271
- /** Legend label for the region value ramp (`region-metric <label>`). */
4272
- regionMetric?: string;
4273
- /** Legend label for the POI value (marker size) channel (`poi-metric`). */
4274
- poiMetric?: string;
4275
- /** Legend label for the edge/leg value (thickness) channel (`flow-metric`). */
4276
- flowMetric?: string;
4277
- scale?: MapScale;
4278
- regionLabels?: string;
4279
- poiLabels?: string;
4280
- defaultCountry?: string;
4281
- defaultState?: string;
4282
- activeTag?: string;
4283
- noLegend?: boolean;
4284
- subtitle?: string;
4285
- caption?: string;
4286
- /** Basemap dress override (bare flags `muted` / `natural`). Forces the
4287
- * land/water styling regardless of whether a colouring dimension is active —
4288
- * `muted` recedes to neutral grays, `natural` keeps the green/blue reference
4289
- * dress. Absent → auto (muted iff a score/tag dimension is active). Lets two
4290
- * maps in one deck share a look. */
4291
- basemapStyle?: 'muted' | 'natural';
4292
- }
4293
- /** A region-fill: a subdivision name with an optional score and/or tag values
4294
- * (§24B.3/.4 — BOTH may be present; bivariate seam). */
4295
- interface MapRegion {
4296
- readonly name: string;
4297
- /** Optional trailing ISO scope qualifier (§24B.8) — a 3166-1 country code
4298
- * (`Georgia US` → US context) or 3166-2 subdivision (`Georgia US-GA`).
4299
- * Forces the country-vs-state interpretation and silences the ambiguity warning. */
4300
- readonly scope?: string;
4301
- /** Numeric value → choropleth shade (§24B.3). Lifted out of `meta`. */
4302
- readonly value?: number;
4303
- /** Tag values keyed by lowercased tag GROUP name (alias is resolved away). */
4304
- readonly tags: Readonly<Record<string, string>>;
4305
- /** Any remaining reserved keys captured verbatim (`label`/`style`/…). */
4306
- readonly meta: Readonly<Record<string, string>>;
4307
- readonly lineNumber: number;
4444
+ interface JourneyMapAnnotation {
4445
+ readonly type: 'pain' | 'opportunity' | 'thought';
4446
+ readonly text: string;
4308
4447
  }
4309
- /** A point of interest (§24B.5). `meta` holds the numeric `value` (→ marker
4310
- * size) and `style` verbatim; `label` is lifted out. */
4311
- interface MapPoi {
4312
- readonly pos: PoiPos;
4313
- readonly alias?: string;
4314
- readonly label?: string;
4448
+ interface JourneyMapStep {
4449
+ readonly id: string;
4450
+ readonly title: string;
4451
+ readonly score?: number;
4452
+ readonly emotionLabel?: string;
4315
4453
  readonly tags: Readonly<Record<string, string>>;
4316
- readonly meta: Readonly<Record<string, string>>;
4317
- readonly lineNumber: number;
4318
- }
4319
- /** One leg of a route (§24B.6): an edge from the previous stop to `dest`. Reuses
4320
- * the edge arrow idiom — in-arrow text = leg label, `value:` = leg thickness,
4321
- * `->`/`~>` (or the header `style: arc`) = shape. Stop-targeted keys on the leg
4322
- * line (`tag`, `label:`) decorate the DESTINATION point. */
4323
- interface MapRouteLeg {
4324
- readonly label?: string;
4325
- readonly style: 'straight' | 'arc';
4326
- readonly value?: string;
4327
- readonly dest: PoiPos;
4328
- readonly destAlias?: string;
4329
- readonly destLabel?: string;
4330
- readonly destTags: Readonly<Record<string, string>>;
4454
+ readonly annotations: readonly JourneyMapAnnotation[];
4455
+ readonly description?: string;
4331
4456
  readonly lineNumber: number;
4457
+ readonly endLineNumber: number;
4332
4458
  }
4333
- /** An ordered, auto-numbered route (§24B.6): `route <origin> [style: arc]` + a
4334
- * sequence of indented arrow legs, each continuing from the previous stop.
4335
- * Repeat the origin as a leg's destination to close a loop. */
4336
- interface MapRoute {
4337
- readonly origin: PoiPos;
4338
- readonly originAlias?: string;
4339
- readonly originLabel?: string;
4340
- readonly originValue?: string;
4341
- readonly originTags: Readonly<Record<string, string>>;
4342
- readonly style: 'straight' | 'arc';
4343
- readonly legs: readonly MapRouteLeg[];
4459
+ interface JourneyMapPhase {
4460
+ readonly id: string;
4461
+ readonly name: string;
4462
+ readonly steps: readonly JourneyMapStep[];
4344
4463
  readonly lineNumber: number;
4345
4464
  }
4346
- /** A connector (§24B.6). Endpoints are RAW identifier strings (name or alias);
4347
- * binding to POIs/regions is the resolver's job. `~>`→arc; `--`→directed:false. */
4348
- interface MapEdge {
4349
- readonly from: string;
4350
- readonly to: string;
4351
- readonly label?: string;
4352
- readonly directed: boolean;
4353
- readonly style: 'straight' | 'arc';
4354
- readonly meta: Readonly<Record<string, string>>;
4465
+ interface JourneyMapPersona {
4466
+ readonly name: string;
4467
+ readonly description?: string;
4468
+ readonly color?: string;
4355
4469
  readonly lineNumber: number;
4356
4470
  }
4357
- interface ParsedMap {
4358
- readonly title: string | null;
4359
- readonly titleLineNumber: number | null;
4360
- readonly directives: MapDirectives;
4471
+ interface ParsedJourneyMap {
4472
+ readonly type: 'journey-map';
4473
+ readonly title?: string;
4474
+ readonly titleLineNumber?: number;
4475
+ readonly persona?: JourneyMapPersona;
4476
+ readonly phases: readonly JourneyMapPhase[];
4477
+ /** Flat-mode steps (not inside any phase) */
4478
+ readonly steps: readonly JourneyMapStep[];
4361
4479
  readonly tagGroups: readonly TagGroup[];
4362
- readonly regions: readonly MapRegion[];
4363
- readonly pois: readonly MapPoi[];
4364
- readonly routes: readonly MapRoute[];
4365
- readonly edges: readonly MapEdge[];
4366
4480
  readonly options: Readonly<Record<string, string>>;
4367
4481
  readonly diagnostics: readonly DgmoError[];
4368
4482
  readonly error: string | null;
4369
4483
  }
4370
4484
 
4371
- /** True when the first non-blank/non-comment line declares `map`. */
4372
- declare function looksLikeMap(content: string): boolean;
4373
- declare function parseMap(content: string): ParsedMap;
4485
+ declare function parseJourneyMap(content: string, palette?: PaletteColors): ParsedJourneyMap;
4374
4486
 
4375
- /** A TopoJSON topology (world-coarse/world-detail keyed by ISO 3166-1 alpha-2;
4376
- * us-states keyed by ISO 3166-2). Geometry feature `id` is the ISO code;
4377
- * `properties.name` is the display string. Kept loose to avoid a topojson dep. */
4378
- interface BoundaryTopology {
4379
- type: 'Topology';
4380
- objects: Record<string, {
4381
- type: string;
4382
- geometries: BoundaryGeometry[];
4383
- }>;
4384
- arcs: number[][][];
4385
- transform?: {
4386
- scale: [number, number];
4387
- translate: [number, number];
4388
- };
4389
- bbox?: number[];
4390
- }
4391
- interface BoundaryGeometry {
4392
- type: string;
4393
- /** ISO code: alpha-2 (countries) or 3166-2 `US-XX` (states). */
4394
- id: string;
4395
- properties: {
4396
- name: string;
4397
- };
4398
- arcs?: unknown;
4399
- }
4400
- /**
4401
- * A gazetteer city entry: `[lat, lon, iso, pop, name, sub?]`.
4402
- * - `lat`/`lon` — rounded to 3 decimals.
4403
- * - `iso` — ISO 3166-1 alpha-2 country code.
4404
- * - `pop` — population.
4405
- * - `name` — canonical display name (case/accents preserved).
4406
- * - `sub` — ISO 3166-2 subdivision (US cities only in v1, e.g. `US-OR`); absent otherwise.
4407
- */
4408
- type GazetteerEntry = [
4409
- lat: number,
4410
- lon: number,
4411
- iso: string,
4412
- pop: number,
4413
- name: string,
4414
- sub?: string
4415
- ];
4416
- interface Gazetteer {
4417
- /** Every city, stored once. `byName`/`alt` reference cities by array index
4418
- * (normalized — no tuple duplication; geonameid is a build-time-only linker). */
4419
- cities: GazetteerEntry[];
4420
- /** Folded (NFD, diacritic-stripped, lowercased) name → indices into `cities`.
4421
- * Always an array; length > 1 for same-named cities (Portland US-OR / US-ME). */
4422
- byName: Record<string, number[]>;
4423
- /** Folded alias → index into `cities`. Never collides with a `byName` key. */
4424
- alt: Record<string, number>;
4425
- }
4426
- /** A fill-able region (country or US state) — the display name + its ISO id +
4427
- * layer. Powers region-name autocomplete (completion-only; the renderer derives
4428
- * names from the topology directly). Extracted from the topologies by
4429
- * scripts/build-map-data.mjs into `region-names.json`. */
4430
- interface RegionName {
4431
- /** Display name (original casing), e.g. `California` / `Germany`. */
4432
- readonly name: string;
4433
- /** ISO 3166-1 alpha-2 (country) or 3166-2 `US-XX` (state). */
4434
- readonly iso: string;
4435
- readonly layer: 'country' | 'us-state';
4436
- }
4437
- interface RegionNames {
4438
- /** Deterministically ordered (layer, then name). */
4439
- readonly regions: readonly RegionName[];
4487
+ interface CurvePoint {
4488
+ x: number;
4489
+ y: number;
4490
+ score: number;
4491
+ emotionLabel?: string;
4492
+ stepIndex: number;
4440
4493
  }
4441
-
4442
- /** The four static assets, injected into the pure resolver (DI). */
4443
- interface MapData {
4444
- worldCoarse: BoundaryTopology;
4445
- worldDetail: BoundaryTopology;
4446
- usStates: BoundaryTopology;
4447
- /** Major lakes (Natural Earth 110m) drawn as water over land — e.g. the Great
4448
- * Lakes. Optional so hand-built test fixtures need not supply it. */
4449
- lakes?: BoundaryTopology;
4450
- /** Major river centerlines (Natural Earth 110m) drawn as thin water lines over
4451
- * land — e.g. the Amazon, Nile, Mississippi. Optional, like `lakes`. */
4452
- rivers?: BoundaryTopology;
4453
- /** North-America-clipped 10m country land, used as crisp neighbour context
4454
- * under the albers-usa US view so Canada/Mexico match the 10m states instead
4455
- * of the coarser world tiers. Optional, like `lakes`. */
4456
- naLand?: BoundaryTopology;
4457
- /** North-America-clipped 10m major lakes (Great Lakes etc.), used in place of
4458
- * the coarse `lakes` under the albers-usa US view. Optional. */
4459
- naLakes?: BoundaryTopology;
4460
- gazetteer: Gazetteer;
4494
+ interface StepLayout {
4495
+ x: number;
4496
+ y: number;
4497
+ width: number;
4498
+ height: number;
4499
+ step: JourneyMapStep;
4500
+ color: string;
4461
4501
  }
4462
- type ProjectionFamily = 'equirectangular' | 'natural-earth' | 'albers-usa' | 'mercator';
4463
- /** Which geometry layers the renderer draws. */
4464
- interface Basemaps {
4465
- /** World country tier: coarse (world-scale) | detail (regional/zoom). */
4466
- world: 'coarse' | 'detail';
4467
- /** Loaded subdivision layers (v1: only 'us-states'). */
4468
- subdivisions: Array<'us-states'>;
4502
+ interface PhaseLayout {
4503
+ x: number;
4504
+ y: number;
4505
+ width: number;
4506
+ height: number;
4507
+ phase: JourneyMapPhase;
4508
+ headerColor: string;
4509
+ stepLayouts: StepLayout[];
4469
4510
  }
4470
- interface ResolvedRegion {
4471
- /** ISO code: alpha-2 (country) or 3166-2 `US-XX` (state) — the geometry id. */
4472
- readonly iso: string;
4473
- readonly name: string;
4474
- readonly layer: 'country' | 'us-state';
4475
- readonly value?: number;
4476
- readonly tags: Readonly<Record<string, string>>;
4477
- readonly meta: Readonly<Record<string, string>>;
4478
- readonly lineNumber: number;
4511
+ interface JourneyMapLayout {
4512
+ phases: PhaseLayout[];
4513
+ flatStepLayouts: StepLayout[];
4514
+ curvePoints: CurvePoint[];
4515
+ totalWidth: number;
4516
+ totalHeight: number;
4517
+ curveAreaTop: number;
4518
+ curveAreaBottom: number;
4519
+ cardAreaTop: number;
4520
+ personaHeight: number;
4521
+ titleHeight: number;
4522
+ /** Whether any step has thought annotations */
4523
+ hasThoughts: boolean;
4479
4524
  }
4480
- interface ResolvedPoi {
4481
- /** Folded registry id (alias|name folded, or `@lat,lon` for coord POIs). */
4482
- readonly id: string;
4483
- /** Display name (original casing): the city/place name, alias, or endpoint
4484
- * string. The on-map label falls back to this when `label` is absent (the
4485
- * folded `id` is for binding, not display). */
4486
- readonly name?: string;
4487
- readonly lat: number;
4488
- readonly lon: number;
4489
- readonly label?: string;
4490
- readonly tags: Readonly<Record<string, string>>;
4491
- readonly meta: Readonly<Record<string, string>>;
4492
- readonly lineNumber: number;
4493
- /** True when created from an undeclared edge/route endpoint (§24B.10). */
4494
- readonly implicit?: boolean;
4525
+ declare function layoutJourneyMap(parsed: ParsedJourneyMap, palette: PaletteColors, options?: {
4526
+ exportDims?: {
4527
+ width: number;
4528
+ height: number;
4529
+ };
4530
+ collapsedPhases?: Set<string>;
4531
+ isDark?: boolean;
4532
+ }): JourneyMapLayout;
4533
+
4534
+ interface JourneyMapInteractiveOptions {
4535
+ onNavigateToLine?: (line: number) => void;
4536
+ exportDims?: {
4537
+ width: number;
4538
+ height: number;
4539
+ };
4540
+ activeTagGroup?: string | null;
4541
+ onActiveTagGroupChange?: (group: string | null) => void;
4542
+ /** Current editor cursor line — highlights the matching face + card, dims the rest */
4543
+ currentLine?: number | null;
4544
+ /** Set of collapsed phase names */
4545
+ collapsedPhases?: Set<string>;
4546
+ /** Called when a phase is toggled */
4547
+ onPhaseToggle?: (phaseName: string) => void;
4548
+ exportMode?: boolean;
4495
4549
  }
4496
- interface ResolvedEdge {
4497
- readonly fromId: string;
4498
- readonly toId: string;
4499
- readonly label?: string;
4500
- readonly directed: boolean;
4501
- readonly style: 'straight' | 'arc';
4502
- readonly meta: Readonly<Record<string, string>>;
4550
+ declare function renderJourneyMap(container: HTMLElement, parsed: ParsedJourneyMap, palette: PaletteColors, isDark: boolean, options?: JourneyMapInteractiveOptions): void;
4551
+ declare function renderJourneyMapForExport(content: string, theme: 'light' | 'dark' | 'transparent', palette: PaletteColors): string;
4552
+
4553
+ interface PyramidLayer {
4554
+ readonly label: string;
4503
4555
  readonly lineNumber: number;
4556
+ /** Optional palette color name (red/green/blue/…). */
4557
+ readonly color?: string;
4558
+ /** Description lines — from bare pipe shorthand or indented body. */
4559
+ readonly description: readonly string[];
4560
+ /** Unconsumed pipe metadata (reserved for future use). */
4561
+ readonly metadata: Readonly<Record<string, string>>;
4504
4562
  }
4505
- interface ResolvedRouteLeg {
4506
- readonly fromId: string;
4507
- readonly toId: string;
4508
- readonly label?: string;
4509
- readonly style: 'straight' | 'arc';
4510
- readonly value?: string;
4511
- readonly lineNumber: number;
4563
+ interface ParsedPyramid {
4564
+ readonly type: 'pyramid';
4565
+ readonly title: string;
4566
+ readonly titleLineNumber: number;
4567
+ readonly layers: readonly PyramidLayer[];
4568
+ /** When true, apex points down instead of up. */
4569
+ readonly inverted: boolean;
4570
+ readonly options: Readonly<Record<string, string>>;
4571
+ readonly diagnostics: readonly DgmoError[];
4572
+ readonly error: string | null;
4512
4573
  }
4513
- interface ResolvedRoute {
4514
- /** Ordered UNIQUE stop ids (for numbering + the origin marker). A loop-closing
4515
- * leg whose destination is an earlier stop adds a leg but no duplicate stop. */
4516
- readonly stopIds: readonly string[];
4517
- readonly legs: readonly ResolvedRouteLeg[];
4574
+
4575
+ /**
4576
+ * Parse a `.dgmo` pyramid diagram document.
4577
+ *
4578
+ * Top of file = apex of pyramid (reads top-down).
4579
+ *
4580
+ * Syntax:
4581
+ * ```
4582
+ * pyramid Maslow's Hierarchy of Needs
4583
+ *
4584
+ * inverted // optional — flips apex to bottom
4585
+ *
4586
+ * Self-Actualization // indented body = description
4587
+ * Achieving one's full potential.
4588
+ *
4589
+ * Esteem | Respect, recognition // bare pipe shorthand = description
4590
+ *
4591
+ * Love & Belonging | color: blue // structured metadata
4592
+ * Friendship, intimacy, family.
4593
+ *
4594
+ * Physiological | Food, water, rest
4595
+ * ```
4596
+ */
4597
+ declare function parsePyramid(content: string): ParsedPyramid;
4598
+
4599
+ /**
4600
+ * Render a pyramid diagram into the given container.
4601
+ */
4602
+ declare function renderPyramid(container: HTMLDivElement, parsed: ParsedPyramid, palette: PaletteColors, isDark: boolean, onClickItem?: (lineNumber: number) => void, exportDims?: D3ExportDimensions): void;
4603
+ /**
4604
+ * Render for CLI/export (no click handlers).
4605
+ */
4606
+ declare function renderPyramidForExport(container: HTMLDivElement, parsed: ParsedPyramid, palette: PaletteColors, isDark: boolean, exportDims?: D3ExportDimensions): void;
4607
+
4608
+ interface RingLayer {
4609
+ readonly label: string;
4518
4610
  readonly lineNumber: number;
4611
+ /** Optional palette color name (red/green/blue/…). */
4612
+ readonly color?: string;
4613
+ /** Description lines — from bare pipe shorthand or indented body. */
4614
+ readonly description: readonly string[];
4615
+ /** Unconsumed pipe metadata (reserved for future use). */
4616
+ readonly metadata: Readonly<Record<string, string>>;
4519
4617
  }
4520
- /** Geographic bounding box `[[west, south], [east, north]]` in degrees.
4521
- *
4522
- * WRAP CONVENTION (#12): for an antimeridian-crossing extent the resolver keeps
4523
- * `west` in [−180, 180] and returns `east` UNWRAPPED in (180, 540] (i.e.
4524
- * `east = west + span`, span ≤ 360). So `east > 180` signals a dateline-crossing
4525
- * extent; the renderer (step 4) must mod `east` back into [−180, 180] (or shift
4526
- * the projection's center) rather than assume `east ≤ 180`. `south`/`north` are
4527
- * always plain degrees in [−90, 90]. */
4528
- type GeoExtent = [[number, number], [number, number]];
4529
- interface ResolvedMap {
4530
- readonly title: string | null;
4531
- readonly subtitle?: string;
4532
- readonly caption?: string;
4533
- readonly tagGroups: readonly TagGroup[];
4534
- readonly directives: MapDirectives;
4535
- readonly basemaps: Basemaps;
4536
- readonly regions: readonly ResolvedRegion[];
4537
- readonly pois: readonly ResolvedPoi[];
4538
- readonly edges: readonly ResolvedEdge[];
4539
- readonly routes: readonly ResolvedRoute[];
4540
- readonly extent: GeoExtent;
4541
- readonly projection: ProjectionFamily;
4618
+ interface ParsedRing {
4619
+ readonly type: 'ring';
4620
+ readonly title: string;
4621
+ readonly titleLineNumber: number;
4622
+ /** Source order: layers[0] = innermost (filled disc); last = outermost ring. */
4623
+ readonly layers: readonly RingLayer[];
4624
+ readonly options: Readonly<Record<string, string>>;
4542
4625
  readonly diagnostics: readonly DgmoError[];
4543
4626
  readonly error: string | null;
4544
4627
  }
4545
4628
 
4629
+ /**
4630
+ * Parse a `.dgmo` ring diagram document.
4631
+ *
4632
+ * Top of file = innermost ring (rendered as a filled disc).
4633
+ * Last layer in source = outermost ring.
4634
+ */
4635
+ declare function parseRing(content: string): ParsedRing;
4636
+
4637
+ /**
4638
+ * Render a ring diagram into the given container.
4639
+ */
4640
+ declare function renderRing(container: HTMLDivElement, parsed: ParsedRing, palette: PaletteColors, isDark: boolean, onClickItem?: (lineNumber: number) => void, exportDims?: D3ExportDimensions): void;
4641
+ /**
4642
+ * Render for CLI/export (no click handlers).
4643
+ */
4644
+ declare function renderRingForExport(container: HTMLDivElement, parsed: ParsedRing, palette: PaletteColors, isDark: boolean, exportDims?: D3ExportDimensions): void;
4645
+
4646
+ /** True when the first non-blank/non-comment line declares `map`. */
4647
+ declare function looksLikeMap(content: string): boolean;
4648
+ declare function parseMap(content: string): ParsedMap;
4649
+
4546
4650
  declare function resolveMap(parsed: ParsedMap, data: MapData): ResolvedMap;
4547
4651
 
4548
4652
  /** Load + memoize the four map assets (Node). Throws if none of the candidate
@@ -4556,6 +4660,9 @@ interface MapLayoutRegion {
4556
4660
  readonly d: string;
4557
4661
  readonly fill: string;
4558
4662
  readonly stroke: string;
4663
+ /** Human-readable display name (e.g. "France", "California"). Set for EVERY
4664
+ * region — authored and base/context alike — and emitted as
4665
+ * `data-region-name` so the app can show it on hover. */
4559
4666
  readonly label?: string;
4560
4667
  readonly lineNumber: number;
4561
4668
  readonly layer: 'base' | 'country' | 'us-state';
@@ -4578,6 +4685,32 @@ interface MapLayoutInset {
4578
4685
  readonly w: number;
4579
4686
  readonly h: number;
4580
4687
  readonly points: ReadonlyArray<readonly [number, number]>;
4688
+ /** The FITTED inset projection (fit to this frame's screen box inside
4689
+ * `placeInset`). Load-bearing for pixel↔lonLat over the AK/HI insets: the
4690
+ * un-fitted `alaskaProjection()`/`hawaiiProjection()` factories would invert
4691
+ * to garbage, so the geo-query inverts against THIS instance. */
4692
+ readonly projection: GeoProjection;
4693
+ /** Neighbour land (e.g. Canada beside Alaska) projected with this inset's
4694
+ * fitted projection and clipped to the box — drawn BEHIND the state so a land
4695
+ * border reads as land, not coast. Without it the state's outer ring buffers
4696
+ * outward over open box-ocean and the land border sprouts coastline rings.
4697
+ * `undefined` when no neighbour land falls inside the box. */
4698
+ readonly contextLand?: {
4699
+ readonly d: string;
4700
+ readonly fill: string;
4701
+ };
4702
+ }
4703
+ /** Post-projection non-uniform stretch applied to GLOBAL fits (fill-the-canvas).
4704
+ * `null` for regional fits. The geo-query applies the forward form when
4705
+ * projecting and the inverse before `projection.invert`. Mirrors the `stretch`
4706
+ * closure used for the path stream: px = ox + (x - bx0) * sx. */
4707
+ interface MapLayoutStretch {
4708
+ readonly sx: number;
4709
+ readonly sy: number;
4710
+ readonly ox: number;
4711
+ readonly oy: number;
4712
+ readonly bx0: number;
4713
+ readonly by0: number;
4581
4714
  }
4582
4715
  interface MapLayoutPoi {
4583
4716
  readonly id: string;
@@ -4593,6 +4726,37 @@ interface MapLayoutPoi {
4593
4726
  /** Tag values keyed by lowercased group name — emitted as `data-tag-<group>`
4594
4727
  * so the app can spotlight markers on legend-entry hover (mirrors regions). */
4595
4728
  readonly tags?: Readonly<Record<string, string>>;
4729
+ /** Set when this marker is a member of a coincident stack (spiderfy). Its
4730
+ * `cx/cy` is the EXPANDED ring position (the source-of-truth used by export +
4731
+ * the no-JS default); the app collapses the stack to a single badge at rest
4732
+ * via `data-cluster-member`. */
4733
+ readonly clusterId?: string;
4734
+ }
4735
+ /** A coincident POI stack (≥2 markers whose dots overlap). Laid out EXPANDED
4736
+ * (members fanned onto a ring/spiral with legs to the centroid) — that geometry
4737
+ * is the source of truth: a static export shows every member + label with no
4738
+ * special-casing. The renderer ALSO emits a collapsed `+N`-style badge (a neutral
4739
+ * dot ringed with the bare count) at the centroid, hidden by default; the app
4740
+ * collapses each stack at rest (hide members, show badge) and expands on click. */
4741
+ interface MapLayoutCluster {
4742
+ /** Stable id (the first member's POI id). Mirrored on member dots/labels/legs as
4743
+ * `data-cluster-member` and on the badge as `data-cluster`. */
4744
+ readonly id: string;
4745
+ /** Centroid (collapsed badge position + spider-leg hub). */
4746
+ readonly cx: number;
4747
+ readonly cy: number;
4748
+ /** Member count = badge text (bare `N`, RQ1). */
4749
+ readonly count: number;
4750
+ /** Radius of the transparent pointer hit-area centred on the centroid — covers
4751
+ * the collapsed badge AND the expanded dot ring so a hover/click anywhere over
4752
+ * the stack drives the spiderfy controller. */
4753
+ readonly hitR: number;
4754
+ /** Spider legs: centroid → each expanded member dot (member's own colour). */
4755
+ readonly legs: ReadonlyArray<{
4756
+ readonly x2: number;
4757
+ readonly y2: number;
4758
+ readonly color: string;
4759
+ }>;
4596
4760
  }
4597
4761
  /** A drawn connector -- an edge or a route leg (same geometry contract). */
4598
4762
  interface MapLayoutLeg {
@@ -4603,6 +4767,17 @@ interface MapLayoutLeg {
4603
4767
  readonly label?: string;
4604
4768
  readonly labelX?: number;
4605
4769
  readonly labelY?: number;
4770
+ /** Text colour for the label — contrast-picked against the background fill the
4771
+ * label sits on (the choropleth/tag region under it, or land/water), so a
4772
+ * freight tag over a dark scored country reads light, over pale land reads
4773
+ * dark. Absent ⇒ renderer falls back to the muted default. */
4774
+ readonly labelColor?: string;
4775
+ /** Whether the label needs a halo. Only set when the chosen text colour's
4776
+ * contrast against the underlying fill is marginal (mid-tone fills); clear
4777
+ * fills get no ghost. */
4778
+ readonly labelHalo?: boolean;
4779
+ /** Halo colour (opposite lightness of `labelColor`) when {@link labelHalo}. */
4780
+ readonly labelHaloColor?: string;
4606
4781
  readonly lineNumber: number;
4607
4782
  }
4608
4783
  interface PlacedLabel {
@@ -4627,6 +4802,24 @@ interface PlacedLabel {
4627
4802
  /** The POI this label belongs to (POI labels only) — emitted as `data-poi` on
4628
4803
  * the label + leader so the app can spotlight the dot on label hover. */
4629
4804
  readonly poiId?: string;
4805
+ /** Cartographic italic (context-label water names, §24B). Default upright. */
4806
+ readonly italic?: boolean;
4807
+ /** Cartographic letter-spacing in px (context-label water names). Default 0. */
4808
+ readonly letterSpacing?: number;
4809
+ /** Pre-wrapped display lines (context-label water names — §24B). When present
4810
+ * the renderer stacks these as centred tspans instead of `text`; `text` keeps
4811
+ * the single-string form for hit-testing/measurement. Absent ⇒ single line. */
4812
+ readonly lines?: readonly string[];
4813
+ /** Hover-only label: emitted invisible (opacity 0 + `data-poi-hidden`) in the
4814
+ * preview and revealed on POI/label hover; OMITTED entirely from static
4815
+ * export. Set when a POI cluster can't place its labels cleanly (see the
4816
+ * extent/count/clean gate in the POI-label block). Default-undefined =
4817
+ * visible. Hidden labels are NOT pushed into `obstacles`. */
4818
+ readonly hidden?: boolean;
4819
+ /** Set when this label belongs to a coincident-stack member (spiderfy). Emitted
4820
+ * visible (export + expanded view) but tagged `data-cluster-member` so the app
4821
+ * hides it when the stack is collapsed to its badge. */
4822
+ readonly clusterMember?: string;
4630
4823
  readonly lineNumber: number;
4631
4824
  }
4632
4825
  interface MapLayoutLegend {
@@ -4653,6 +4846,41 @@ interface MapLayoutRiver {
4653
4846
  readonly color: string;
4654
4847
  readonly width: number;
4655
4848
  }
4849
+ /** A drawn mountain-range relief shape — a projected polygon path. The renderer
4850
+ * unions these into one clip and rules horizontal hachure lines through them. */
4851
+ interface MapLayoutRelief {
4852
+ readonly d: string;
4853
+ }
4854
+ /** The shared hachure style for the relief lines. `null` when relief is off or
4855
+ * no range survives the gates. */
4856
+ interface MapLayoutReliefHatch {
4857
+ /** Line stroke — palette.text mixed into the land colour (so it's dark-on-
4858
+ * light and light-on-dark automatically as palette.text flips with theme). */
4859
+ readonly color: string;
4860
+ /** Vertical gap between lines in SCREEN px (constant density, zoom-stable). */
4861
+ readonly spacing: number;
4862
+ readonly width: number;
4863
+ }
4864
+ /** Style object for the opt-in coastline water-lines (`coastline`, §24B.2).
4865
+ * `null` when the flag is off. Carries only STYLE — no geometry; the renderer
4866
+ * buffers the existing region paths (`layout.regions[].d`) and masks them to the
4867
+ * water side. `d`/`thickness` are absolute SCREEN px (already resolved from a
4868
+ * fraction of the fitted canvas, so they stay proportional across export sizes —
4869
+ * ADR-3). */
4870
+ interface MapLayoutCoastlineStyle {
4871
+ /** Water-toned line colour (a touch more contrast than `lakeStroke`). */
4872
+ readonly color: string;
4873
+ /** The 2 coast-parallel lines, inner→outer. `d` = offshore distance,
4874
+ * `thickness` = ring width (both screen px), `opacity` fades seaward. */
4875
+ readonly lines: ReadonlyArray<{
4876
+ readonly d: number;
4877
+ readonly thickness: number;
4878
+ readonly opacity: number;
4879
+ }>;
4880
+ /** Per-subpath bbox-extent floor (screen px): rings smaller than this are
4881
+ * dropped (de-noise tiny islands, bound the stroke cost — R5/R11). */
4882
+ readonly minExtent: number;
4883
+ }
4656
4884
  interface MapLayout {
4657
4885
  readonly width: number;
4658
4886
  readonly height: number;
@@ -4663,8 +4891,21 @@ interface MapLayout {
4663
4891
  readonly regions: readonly MapLayoutRegion[];
4664
4892
  /** Major river centerlines, drawn over land/lakes and under POIs/edges. */
4665
4893
  readonly rivers: readonly MapLayoutRiver[];
4894
+ /** Mountain-range relief shapes (empty unless `relief` is on + the asset is
4895
+ * present); the renderer clips horizontal hachure lines to their union,
4896
+ * drawn over base land, under rivers/POIs/data fills. */
4897
+ readonly relief: readonly MapLayoutRelief[];
4898
+ /** Hachure style for the relief lines (null = relief off / none survived). */
4899
+ readonly reliefHatch: MapLayoutReliefHatch | null;
4900
+ /** Style for the opt-in coastline water-lines (null = `coastline` off). The
4901
+ * renderer buffers `regions[]`/`insetRegions[]` paths against this style and
4902
+ * masks them to the water side. */
4903
+ readonly coastlineStyle: MapLayoutCoastlineStyle | null;
4666
4904
  readonly legs: readonly MapLayoutLeg[];
4667
4905
  readonly pois: readonly MapLayoutPoi[];
4906
+ /** Coincident POI stacks (spiderfy). Empty when no ≥2-member overlap exists.
4907
+ * The renderer draws a collapsed badge per stack; the app collapses/expands. */
4908
+ readonly clusters: readonly MapLayoutCluster[];
4668
4909
  readonly labels: readonly PlacedLabel[];
4669
4910
  readonly legend: MapLayoutLegend | null;
4670
4911
  /** Framed AK/HI inset cutouts (albers-usa only; empty otherwise). */
@@ -4672,6 +4913,16 @@ interface MapLayout {
4672
4913
  /** AK/HI region paths drawn inside the inset boxes (foreground, over an
4673
4914
  * opaque ocean fill). Paired positionally with `insets`. */
4674
4915
  readonly insetRegions: readonly MapLayoutRegion[];
4916
+ /** The fitted MAIN projection (the conus conic for albers-usa). Exposed for
4917
+ * the geo-query's pixel↔lonLat inversion — the app NEVER reconstructs it from
4918
+ * metadata; it binds to this exact instance. */
4919
+ readonly projection: GeoProjection;
4920
+ /** Non-uniform stretch applied for GLOBAL fits (null for regional fits). */
4921
+ readonly stretch: MapLayoutStretch | null;
4922
+ /** Generic layout-time diagnostics channel — currently has no producers, so it
4923
+ * is always empty. Kept wired up because callers merge it with the resolver's
4924
+ * diagnostics for the editor lint channel. */
4925
+ readonly diagnostics: readonly DgmoError[];
4675
4926
  }
4676
4927
  interface LayoutOptions {
4677
4928
  readonly palette: PaletteColors;
@@ -4682,6 +4933,11 @@ interface LayoutOptions {
4682
4933
  * selects the choropleth ramp, a tag-group name selects that group, `'none'`
4683
4934
  * / `null` clears it. `undefined` = not provided (use the directive/default). */
4684
4935
  readonly activeGroup?: string | null;
4936
+ /** Export-only: when true, suppress the global stretch-fill and contain-fit
4937
+ * (letterbox) instead. Set by `mapExportDimensions` when it clamps/floors the
4938
+ * canvas away from the content aspect, so the off-aspect canvas doesn't
4939
+ * re-distort. The in-app preview pane leaves this unset (keeps stretch-fill). */
4940
+ readonly preferContain?: boolean;
4685
4941
  }
4686
4942
  interface Size {
4687
4943
  readonly width: number;
@@ -4689,16 +4945,19 @@ interface Size {
4689
4945
  }
4690
4946
  /** The map's water / backdrop colour for a palette — the single source of truth
4691
4947
  * shared by the renderer's `<rect>` fill and any host wrapper that needs to
4692
- * match it (so letterbox gaps around the SVG don't show a stray band). When
4693
- * `dataActive` (a score ramp or tag group is colouring regions) the sea recedes
4694
- * to a pale neutral so blue/green data hues don't blend into it. */
4695
- declare function mapBackgroundColor(palette: PaletteColors, isDark?: boolean, dataActive?: boolean): string;
4948
+ * match it (so letterbox gaps around the SVG don't show a stray band). Always a
4949
+ * VERY faded blue uniform whether or not a colouring dimension is active — so
4950
+ * it reads as water without competing with saturated blue/green data hues.
4951
+ * `_dataActive` is retained for signature stability (the sea no longer changes
4952
+ * with data; only neighbour land recedes — see layout's `foreignFill`). */
4953
+ declare function mapBackgroundColor(palette: PaletteColors, isDark?: boolean, _dataActive?: boolean): string;
4696
4954
  /** The map's neutral (unscored/untagged) LAND colour — the base every region
4697
4955
  * blends from. Exported so a host can DIM a region to plain land (rather than
4698
4956
  * lowering opacity, which would let the water show through and make the shape
4699
- * read as ocean). Matches the layout's `neutralFill`. Green reference dress by
4700
- * default; neutral (page bg on light, lifted gray on dark) when `dataActive`. */
4701
- declare function mapNeutralLandColor(palette: PaletteColors, isDark: boolean, dataActive?: boolean): string;
4957
+ * read as ocean). Matches the layout's `neutralFill`. Always a VERY faded green
4958
+ * uniform whether or not data is active so saturated tag/score tints read
4959
+ * clearly against it. `_dataActive` is retained for signature stability. */
4960
+ declare function mapNeutralLandColor(palette: PaletteColors, isDark: boolean, _dataActive?: boolean): string;
4702
4961
  declare function layoutMap(resolved: ResolvedMap, data: MapData, size: Size, opts: LayoutOptions): MapLayout;
4703
4962
 
4704
4963
  /** Render a resolved map into `container` (d3-selection appends an `<svg>`). */
@@ -4708,6 +4967,130 @@ activeGroupOverride?: string | null): void;
4708
4967
  /** Export wrapper (no click handler) — matches the structured-renderer contract. */
4709
4968
  declare function renderMapForExport(container: HTMLDivElement, resolved: ResolvedMap, data: MapData, palette: PaletteColors, isDark: boolean, exportDims?: D3ExportDimensions): void;
4710
4969
 
4970
+ /** The map's intrinsic projected aspect (width / height) for a resolved map.
4971
+ *
4972
+ * Measured by fitting the projection + fit target (the SAME `buildMapProjection`
4973
+ * output the renderer draws with) into a square reference box and reading the
4974
+ * projected bounds of the fit target. `fitSize` scales uniformly, so the ratio is
4975
+ * independent of the box size (see the reference-box invariance test).
4976
+ *
4977
+ * Returns {@link FALLBACK_ASPECT} (3:2) if the result is non-finite or ≤ 0 — the
4978
+ * helper never emits a NaN/0/Infinity aspect. */
4979
+ declare function mapContentAspect(resolved: ResolvedMap, data: MapData,
4980
+ /** Square reference box for the measurement. Uniform `fitSize` scaling makes the
4981
+ * result invariant to this value; exposed only so tests can assert that. */
4982
+ ref?: number): number;
4983
+ /** Content-aware export dimensions for a map: `width` fixed at `baseWidth`,
4984
+ * `height` derived from the clamped intrinsic aspect, with a minimum-map-band
4985
+ * floor for very wide extents. `preferContain` is true when the clamp or floor
4986
+ * forced the canvas off the content aspect — the renderer then contain-fits
4987
+ * (letterbox) instead of stretching, so the off-aspect canvas doesn't re-distort. */
4988
+ interface MapExportDimensions {
4989
+ readonly width: number;
4990
+ readonly height: number;
4991
+ readonly preferContain: boolean;
4992
+ }
4993
+ declare function mapExportDimensions(resolved: ResolvedMap, data: MapData, baseWidth?: number): MapExportDimensions;
4994
+
4995
+ /** Nearest gazetteer city to a point: the real haversine distance, plus the
4996
+ * canonical name + ISO + (US-only) subdivision for token shaping. `lon`/`lat`
4997
+ * are the city's own gazetteer coordinates (so callers can mark it on the map,
4998
+ * distinct from the inspected point). */
4999
+ interface NearestCity {
5000
+ readonly name: string;
5001
+ readonly iso: string;
5002
+ readonly sub?: string;
5003
+ readonly distanceKm: number;
5004
+ readonly lon: number;
5005
+ readonly lat: number;
5006
+ }
5007
+ /** A region declaration with its canonical/primary form plus bare alternates
5008
+ * (behind the card's "other forms" expander). */
5009
+ interface RegionToken {
5010
+ /** Explicit scoped form, shown first (`Florida US-FL` / `France FR`). */
5011
+ readonly primary: string;
5012
+ /** Bare forms (bare ISO, bare code, bare name). */
5013
+ readonly alternates: string[];
5014
+ }
5015
+ /** Paste-ready DGMO tokens for one inspected point — each round-trips through the
5016
+ * map parser with zero diagnostics (the app inserts verbatim, never synthesizes
5017
+ * syntax). */
5018
+ interface ResultTokens {
5019
+ /** Positional POI line, e.g. `poi 40.7608 -111.891` (NEVER `@lat,lon`). */
5020
+ readonly coordPoiLine: string;
5021
+ /** US-state region tokens — null when the click isn't in a US state. */
5022
+ readonly state: RegionToken | null;
5023
+ /** Country region tokens — null over open ocean (no country). */
5024
+ readonly country: RegionToken | null;
5025
+ /** Scoped city token (`New York US-NY` / `Paris FR`), or a bare ambiguous name. */
5026
+ readonly city: {
5027
+ readonly token: string;
5028
+ readonly ambiguous: boolean;
5029
+ } | null;
5030
+ }
5031
+ /** The single unified Inspect result. */
5032
+ interface ResultCard {
5033
+ readonly lonLat: [number, number];
5034
+ readonly country: {
5035
+ iso: string;
5036
+ name: string;
5037
+ } | null;
5038
+ readonly state: {
5039
+ iso: string;
5040
+ name: string;
5041
+ } | null;
5042
+ readonly nearestCity: NearestCity | null;
5043
+ readonly tokens: ResultTokens;
5044
+ }
5045
+ /** A gazetteer city projected to screen pixels for the all-cities overlay. */
5046
+ interface ProjectedCity {
5047
+ readonly name: string;
5048
+ readonly iso: string;
5049
+ readonly sub?: string;
5050
+ readonly lon: number;
5051
+ readonly lat: number;
5052
+ readonly px: number;
5053
+ readonly py: number;
5054
+ readonly pop: number;
5055
+ }
5056
+ interface MapGeoQuery {
5057
+ /** Pixel → `[lon,lat]`, or null for an out-of-domain pixel. */
5058
+ invert(px: number, py: number): [number, number] | null;
5059
+ /** `[lon,lat]` → pixel, or null if it projects nowhere. */
5060
+ project(lonLat: readonly [number, number]): [number, number] | null;
5061
+ /** One click → the unified result card, or null if the pixel inverts to
5062
+ * nothing (graceful "no location"). */
5063
+ locate(px: number, py: number): ResultCard | null;
5064
+ /** Culled + projected cities for the all-cities layer (population-primary). */
5065
+ cities(extent?: GeoExtent): ProjectedCity[];
5066
+ /** Layout-time, dimension-dependent diagnostics. They live on the geo-query
5067
+ * (bound to the rendered layout) rather than the resolver. Callers merge them
5068
+ * with `resolved.diagnostics`. (No producers currently — always empty.) */
5069
+ readonly diagnostics: readonly DgmoError[];
5070
+ }
5071
+ interface CreateMapGeoQueryOptions {
5072
+ readonly content: string;
5073
+ readonly width: number;
5074
+ readonly height: number;
5075
+ /** Injected map assets — same `MapData` the app passes to `renderMap`. */
5076
+ readonly data: MapData;
5077
+ /** Same palette/isDark the app renders with (geometry is palette-independent,
5078
+ * but `layoutMap` mandates them). */
5079
+ readonly palette: PaletteColors;
5080
+ readonly isDark: boolean;
5081
+ }
5082
+ /** Construct a geo-query handle bound to the layout for `(content, width,
5083
+ * height, data, palette, isDark)`. Deterministic: identical inputs ⇒ the same
5084
+ * fitted projection the rendered SVG used, so inverted clicks align.
5085
+ *
5086
+ * INVARIANT: this is the PREVIEW path — it never passes `preferContain`, so its
5087
+ * layout matches the in-app preview (stretch-fill), where geo-query is used. It is
5088
+ * NOT valid against a content-aware EXPORT canvas (which may set `preferContain` →
5089
+ * contain-fit): the inverted positions would not match that export's pixels. If
5090
+ * geo-query is ever pointed at an export canvas, thread `preferContain` through
5091
+ * `CreateMapGeoQueryOptions` to keep the projection in sync. */
5092
+ declare function createMapGeoQuery(opts: CreateMapGeoQueryOptions): MapGeoQuery;
5093
+
4711
5094
  interface MapPlaceCompletion {
4712
5095
  /** Canonical display name (original casing), e.g. `Portland`. */
4713
5096
  readonly name: string;
@@ -5328,4 +5711,4 @@ declare function migrateContent(source: string): ContentMigration;
5328
5711
  */
5329
5712
  declare function formatLineDiff(path: string, original: string, migrated: string): string;
5330
5713
 
5331
- export { ALL_CHART_TYPES, AMBIGUITY_THRESHOLD, ARROW_DIAGNOSTIC_CODES, type Activation, type AncestorInfo, type ArcLink, type ArcNodeGroup, type BLCollapseResult, type BLEdge, type BLGroup, type BLLayoutEdge, type BLLayoutGroup, type BLLayoutNode, type BLLayoutResult, type BLNode, type BlipTrend, type BoundaryTopology, type C4ArrowType, type C4DeploymentNode, type C4Element, type C4ElementType, type C4Group, type C4LayoutBoundary, type C4LayoutEdge, type C4LayoutNode, type C4LayoutResult, type C4LegendEntry, type C4LegendGroup, type C4Relationship, type C4Shape, type C4TagEntry, type C4TagGroup, CHART_TYPES, CHART_TYPE_DESCRIPTIONS, COMPLETION_REGISTRY, type ChartDataPoint, type ChartEra, type ChartType$1 as ChartType, type Confidence as ChartTypeConfidence, type ChartTypeMeta, type ChartTypeScore, type SuggestionResult as ChartTypeSuggestionResult, type ClassLayoutEdge, type ClassLayoutNode, type ClassLayoutResult, type ClassMember, type ClassModifier, type ClassNode, type ClassRelationship, type CollapsedMindmapResult, type CollapsedOrgResult, type CollapsedSitemapResult, type CollapsedView, type CompactViewState, type ComputedInfraEdge, type ComputedInfraModel, type ComputedInfraNode, type ContentMigration, type ContextRelationship, type CycleEdge, type CycleLayoutEdge, type CycleLayoutNode, type CycleLayoutResult, type CycleNode, type CycleRenderOptions, type D3ExportDimensions, type DecodedDiagramUrl, type DgmoError, type DgmoSeverity, type DiagramSymbols, type DirectiveSpec, type DirectiveValueSpec, type Duration, type DurationUnit, ECHART_EXPORT_WIDTH, ENTITY_TYPES, type ERCardinality, type ERColumn, type ERConstraint, type ERLayoutEdge, type ERLayoutNode, type ERLayoutResult, type ERRelationship, type ERTable, type ElseIfBranch, type EncodeDiagramUrlOptions, type EncodeDiagramUrlResult, type ExpandedActivity, type ExtendedChartType, type ExtractFn, type FocusOrgResult, type GanttDependency, type GanttEra, type GanttGroup, type GroupRow as GanttGroupRow, type GanttHolidays, type GanttInteractiveOptions, type LaneHeaderRow as GanttLaneHeaderRow, type GanttMarker, type GanttNode, type GanttOptions, type Row as GanttRow, type GanttTask, type TaskRow as GanttTaskRow, type Gazetteer, type GazetteerEntry, type GeoExtent, type GetOrCreateNameResult, type GraphDirection, type GraphEdge, type GraphGroup, type GraphNode, type GraphShape, INFRA_BEHAVIOR_KEYS, type ImportSource, type InfraAvailabilityPercentiles, type InfraBehaviorKey, type InfraCbState, type InfraComputeParams, type InfraDiagnostic, type InfraEdge, type InfraGroup, type InfraLatencyPercentiles, type InfraLayoutEdge, type InfraLayoutGroup, type InfraLayoutNode, type InfraLayoutResult, type InfraLegendGroup, type InfraNode, type InfraPlaybackState, type InfraProperty, type InfraRole, type InfraTagGroup, type InlineSpan, type JourneyMapAnnotation, type JourneyMapInteractiveOptions, type JourneyMapLayout, type JourneyMapPersona, type JourneyMapPhase, type JourneyMapStep, type KanbanCard, type KanbanColumn, type KanbanTagEntry, type KanbanTagGroup, LEGEND_GEAR_PILL_W, LEGEND_HEIGHT, type LayoutEdge, type LayoutGroup, type LayoutNode, type LayoutOptions$1 as LayoutOptions, type LayoutResult$1 as LayoutResult, type LegendCallbacks, type LegendConfig, type LegendControl, type LegendGroupData, type LegendHandle, type LegendLayout, type LegendMode, type LegendPalette, type LegendPosition, type LegendState, METADATA_KEY_SET, MIN_PRIMARY_SCORE, type MapCompletionOptions, type MapData, type MapDirectives, type MapEdge, type MapLayout, type MapLayoutLeg, type MapLayoutLegend, type MapLayoutPoi, type MapLayoutRegion, type MapPlaceCompletion, type MapPoi, type MapRegion, type MapRegionCompletion, type MapRoute, type MemberVisibility, type MindmapLayoutEdge, type MindmapLayoutNode, type MindmapLayoutResult, type MindmapNode, type MonteCarloResult, type NameEntry, type NodeDetail, type OrgContainerBounds, type OrgLayoutEdge, type OrgLayoutNode, type OrgLayoutResult, type OrgNode, PERT_LEGEND_PILL_HEIGHT, PIPE_METADATA, type PaletteColors, type PaletteConfig, type ParseInArrowLabelResult, type ParsedBoxesAndLines, type ParsedC4, type ParsedChart, type ParsedClassDiagram, type ParsedCycle, type ParsedERDiagram, type ParsedExtendedChart, type ParsedGantt, type ParsedGraph, type ParsedInfra, type ParsedJourneyMap, type ParsedKanban, type ParsedMap, type ParsedMindmap, type ParsedOrg, type ParsedPert, type ParsedPyramid, type ParsedRaci, type ParsedRing, type ParsedSequenceDgmo, type ParsedSitemap, type ParsedTechRadar, type ParsedVisualization, type ParsedWireframe, type ParticipantType, type PertActivity, type Anchor as PertAnchor, type PertDirection, type PertEdge, type PertGroup, type PertLayoutEdge, type PertLayoutGroup, type PertLayoutNode, type LayoutOverrides as PertLayoutOverrides, type LayoutResult as PertLayoutResult, type PertMilestone, type PertOptions, type PertRenderOptions, type PipeKeySpec, type PlacedLabel, type PoiPos, type ProjectionFamily, type PyramidLayer, type QuadrantPosition, RACI_ERROR_CODES, VARIANTS as RACI_VARIANTS, RACI_WARNING_CODES, RECOGNIZED_COLOR_NAMES, RULE_COUNT, type RaciDragSource, type RaciInteractionHandlers, type RaciMarker, type RaciPhase, type RaciRoleAssignment, type RaciTask, type RaciVariant, type ReadFileFn, type RegionName, type RegionNames, type RelationshipType, type RenderCategory, type RenderStep, type ResolveImportsResult, type ResolvedActivity, type ResolvedEdge, type ResolvedGroup$1 as ResolvedGroup, type ResolvedMap, type ResolvedPert, type ResolvedGroup as ResolvedPertGroup, type ResolvedPoi, type ResolvedRegion, type ResolvedRoute, type ResolvedSchedule, type ResolvedTask, type RingLayer, ScaleContext, type ScatterLabelPoint, type SectionMessageGroup, type SequenceBlock, type SequenceElement, type SequenceGroup, type SequenceMessage, type SequenceNote, type SequenceParticipant, type SequenceRenderOptions, type SequenceSection, type SimulateOptions, type SitemapContainerBounds, type SitemapDirection, type SitemapEdge, type SitemapLayoutEdge, type SitemapLayoutNode, type SitemapLayoutResult, type SitemapLegendEntry, type SitemapLegendGroup, type SitemapNode, type StateCollapseResult, type TagEntry, type TagGroup, type TechRadarBlip, type TechRadarLayoutPoint, type TechRadarQuadrant, type TechRadarRing, type Theme, type TransformResult, type VisualizationType, type WireframeElement, type WireframeElementType, type WireframeFormFactor, type WireframeLayout, type WireframeLayoutNode, addDurationToDate, analyzePert, applyCollapseProjection, applyGroupOrdering, applyPositionOverrides, boldPalette, buildExtendedChartOption, buildNoteMessageMap, buildRenderSequence, buildSimpleChartOption, buildSimulationContext, buildTagLaneRowList, calculateSchedule, catppuccinPalette, confidence as chartTypeConfidence, chartTypeParsers, chartTypes, collapseBoxesAndLines, collapseMindmapTree, collapseOrgTree, collapseSitemapTree, collapseStateGroups, collectDiagramRoles, collectTasks, colorNames, completeMapPlaces, completeMapRegions, computeActivations, computeCardArchive, computeCardMove, computeCycleLayout, computeInfra, computeInfraLegendGroups, computeLegendLayout, computeRadarLayout, computeScatterLabelGraphics, computeTimeTicks, contrastText, controlsGroupCapsuleWidth, decodeDiagramUrl, decodeViewState, displayName, draculaPalette, encodeDiagramUrl, encodeViewState, extractDiagramSymbols, extractPertSymbols, extractTagDeclarations, findUnsafePipePositions, focusOrgTree, formatDateLabel, formatDgmoError, formatLineDiff, getAllChartTypes, getAvailablePalettes, getExtendedChartLegendGroups, getLegendReservedHeight, getOrCreateName, getPalette, getRadarGeometry, getRenderCategory, getSeriesColors, getSimpleChartLegendGroups, groupMessagesBySection, gruvboxPalette, hexToHSL, hexToHSLString, highlightPertCriticalPath, highlightPertSet, hslToHex, inferParticipantType, inferRoles, isArchiveColumn, isExtendedChartType, isLegacyMetadataLine, isRecognizedColorName, isSequenceBlock, isSequenceNote, isValidHex, knownChartTypeIds, layoutBoxesAndLines, layoutC4Components, layoutC4Containers, layoutC4Context, layoutC4Deployment, layoutClassDiagram, layoutERDiagram, layoutGraph, layoutInfra, layoutJourneyMap, layoutMap, layoutMindmap, layoutOrg, layoutPert, layoutSitemap, layoutWireframe, loadMapData, looksLikeClassDiagram, looksLikeERDiagram, looksLikeFlowchart, looksLikeMap, looksLikePert, looksLikeSequence, looksLikeSitemap, looksLikeState, makeDgmoError, mapBackgroundColor, mapNeutralLandColor, matchesContiguously, measurePertAnalysisBlock, migrateContent, mix, monokaiPalette, mulberry32, nord, nordPalette, normalize as normalizeChartTypePrompt, normalizeName, normalizePertSourceForShare, oneDarkPalette, orderArcNodes, palettes, parseAndLayoutInfra, parseBoxesAndLines, parseC4, parseChart, parseClassDiagram, parseCycle, parseDataRowValues, parseDgmo, parseDgmoChartType, parseERDiagram, parseExtendedChart, parseFirstLine, parseFlowchart, parseGantt, parseInArrowLabel, parseInfra, parseInlineMarkdown, parseJourneyMap, parseKanban, parseMap, parseMindmap, parseOrg, parsePert, parsePyramid, parseRaci, parseRing, parseSequenceDgmo, parseSequenceDgmo as parseSequenceDiagram, parseSitemap, parseState, parseTechRadar, parseTimelineDate, parseVisualization, parseWireframe, pertLegendBlockWidth, pertLegendEntries, cellAppendMarker as raciCellAppendMarker, cellCycle as raciCellCycle, cellRemove as raciCellRemove, cellReplace as raciCellReplace, registerExtractor, registerPalette, relayoutPert, render, renderArcDiagram, renderBoxesAndLines, renderBoxesAndLinesForExport, renderC4ComponentsForExport, renderC4Containers, renderC4ContainersForExport, renderC4Context, renderC4ContextForExport, renderC4Deployment, renderC4DeploymentForExport, renderClassDiagram, renderClassDiagramForExport, renderCycle, renderCycleForExport, renderERDiagram, renderERDiagramForExport, renderExtendedChartForExport, renderFlowchart, renderFlowchartForExport, renderForExport, renderGantt, renderInfra, renderJourneyMap, renderJourneyMapForExport, renderKanban, renderKanbanForExport, renderLegendD3, renderLegendSvg, renderLegendSvgFromConfig, renderMap, renderMapForExport, renderMindmap, renderMindmapForExport, renderOrg, renderOrgForExport, renderPert, renderPertAnalysisBlock, renderPertForExport, renderLegendBlock as renderPertLegendBlock, renderPyramid, renderPyramidForExport, renderQuadrant, renderQuadrantFocus, renderQuadrantFocusForExport, renderRaci, renderRaciForExport, renderRing, renderRingForExport, renderSequenceDiagram, renderSitemap, renderSitemapForExport, renderSlopeChart, renderState, renderStateForExport, renderTechRadar, renderTechRadarForExport, renderTimeline, renderVenn, renderWireframe, renderWordCloud, resetPertCriticalPath, resetPertHighlight, resolveColor, resolveColorWithDiagnostic, resolveMap, resolveOrgImports, resolveTaskName, rollUpContextRelationships, rosePinePalette, sampleBetaPert, scoreChartType, seriesColors, shade, shapeFill, simulateCanonical, simulateFast, solarizedPalette, suggestChartTypes, themes, tint, tokyoNightPalette, transformLine, truncateBareUrl, parseDgmo as validate, validateComputed, validateInfra, validateLabelCharacters };
5714
+ export { ALL_CHART_TYPES, AMBIGUITY_THRESHOLD, ARROW_DIAGNOSTIC_CODES, type Activation, type AncestorInfo, type ArcLink, type ArcNodeGroup, type BLCollapseResult, type BLEdge, type BLGroup, type BLLayoutEdge, type BLLayoutGroup, type BLLayoutNode, type BLLayoutResult, type BLNode, type BlipTrend, type BoundaryTopology, type C4ArrowType, type C4DeploymentNode, type C4Element, type C4ElementType, type C4Group, type C4LayoutBoundary, type C4LayoutEdge, type C4LayoutNode, type C4LayoutResult, type C4LegendEntry, type C4LegendGroup, type C4Relationship, type C4Shape, type C4TagEntry, type C4TagGroup, CHART_TYPES, CHART_TYPE_DESCRIPTIONS, COMPLETION_REGISTRY, type ChartDataPoint, type ChartEra, type ChartType$1 as ChartType, type Confidence as ChartTypeConfidence, type ChartTypeMeta, type ChartTypeScore, type SuggestionResult as ChartTypeSuggestionResult, type ClassLayoutEdge, type ClassLayoutNode, type ClassLayoutResult, type ClassMember, type ClassModifier, type ClassNode, type ClassRelationship, type CollapsedMindmapResult, type CollapsedOrgResult, type CollapsedSitemapResult, type CollapsedView, type CompactViewState, type ComputedInfraEdge, type ComputedInfraModel, type ComputedInfraNode, type ContentMigration, type ContextRelationship, type CreateMapGeoQueryOptions, type CycleEdge, type CycleLayoutEdge, type CycleLayoutNode, type CycleLayoutResult, type CycleNode, type CycleRenderOptions, type D3ExportDimensions, type DecodedDiagramUrl, type DgmoError, type DgmoSeverity, type DiagramSymbols, type DirectiveSpec, type DirectiveValueSpec, type Duration, type DurationUnit, ECHART_EXPORT_WIDTH, ENTITY_TYPES, type ERCardinality, type ERColumn, type ERConstraint, type ERLayoutEdge, type ERLayoutNode, type ERLayoutResult, type ERRelationship, type ERTable, type ElseIfBranch, type EncodeDiagramUrlOptions, type EncodeDiagramUrlResult, type ExpandedActivity, type ExtendedChartType, type ExtractFn, type FocusOrgResult, type GanttDependency, type GanttEra, type GanttGroup, type GroupRow as GanttGroupRow, type GanttHolidays, type GanttInteractiveOptions, type LaneHeaderRow as GanttLaneHeaderRow, type GanttMarker, type GanttNode, type GanttOptions, type Row as GanttRow, type GanttTask, type TaskRow as GanttTaskRow, type Gazetteer, type GazetteerEntry, type GeoExtent, type GetOrCreateNameResult, type GraphDirection, type GraphEdge, type GraphGroup, type GraphNode, type GraphShape, INFRA_BEHAVIOR_KEYS, type ImportSource, type InfraAvailabilityPercentiles, type InfraBehaviorKey, type InfraCbState, type InfraComputeParams, type InfraDiagnostic, type InfraEdge, type InfraGroup, type InfraLatencyPercentiles, type InfraLayoutEdge, type InfraLayoutGroup, type InfraLayoutNode, type InfraLayoutResult, type InfraLegendGroup, type InfraNode, type InfraPlaybackState, type InfraProperty, type InfraRole, type InfraTagGroup, type InlineSpan, type JourneyMapAnnotation, type JourneyMapInteractiveOptions, type JourneyMapLayout, type JourneyMapPersona, type JourneyMapPhase, type JourneyMapStep, type KanbanCard, type KanbanColumn, type KanbanTagEntry, type KanbanTagGroup, LEGEND_GEAR_PILL_W, LEGEND_HEIGHT, type LayoutEdge, type LayoutGroup, type LayoutNode, type LayoutOptions$1 as LayoutOptions, type LayoutResult$1 as LayoutResult, type LegendCallbacks, type LegendConfig, type LegendControl, type LegendGroupData, type LegendHandle, type LegendLayout, type LegendMode, type LegendPalette, type LegendPosition, type LegendState, METADATA_KEY_SET, MIN_PRIMARY_SCORE, type MapCompletionOptions, type MapData, type MapDirectives, type MapEdge, type MapExportDimensions, type MapGeoQuery, type MapLayout, type MapLayoutInset, type MapLayoutLeg, type MapLayoutLegend, type MapLayoutPoi, type MapLayoutRegion, type MapLayoutStretch, type MapPlaceCompletion, type MapPoi, type MapRegion, type MapRegionCompletion, type MapRoute, type MemberVisibility, type MindmapLayoutEdge, type MindmapLayoutNode, type MindmapLayoutResult, type MindmapNode, type MonteCarloResult, type NameEntry, type NearestCity, type NodeDetail, type OrgContainerBounds, type OrgLayoutEdge, type OrgLayoutNode, type OrgLayoutResult, type OrgNode, PERT_LEGEND_PILL_HEIGHT, PIPE_METADATA, type PaletteColors, type PaletteConfig, type ParseInArrowLabelResult, type ParsedBoxesAndLines, type ParsedC4, type ParsedChart, type ParsedClassDiagram, type ParsedCycle, type ParsedERDiagram, type ParsedExtendedChart, type ParsedGantt, type ParsedGraph, type ParsedInfra, type ParsedJourneyMap, type ParsedKanban, type ParsedMap, type ParsedMindmap, type ParsedOrg, type ParsedPert, type ParsedPyramid, type ParsedRaci, type ParsedRing, type ParsedSequenceDgmo, type ParsedSitemap, type ParsedTechRadar, type ParsedVisualization, type ParsedWireframe, type ParticipantType, type PertActivity, type Anchor as PertAnchor, type PertDirection, type PertEdge, type PertGroup, type PertLayoutEdge, type PertLayoutGroup, type PertLayoutNode, type LayoutOverrides as PertLayoutOverrides, type LayoutResult as PertLayoutResult, type PertMilestone, type PertOptions, type PertRenderOptions, type PipeKeySpec, type PlacedLabel, type PoiPos, type ProjectedCity, type ProjectionFamily, type PyramidLayer, type QuadrantPosition, RACI_ERROR_CODES, VARIANTS as RACI_VARIANTS, RACI_WARNING_CODES, RECOGNIZED_COLOR_NAMES, RULE_COUNT, type RaciDragSource, type RaciInteractionHandlers, type RaciMarker, type RaciPhase, type RaciRoleAssignment, type RaciTask, type RaciVariant, type ReadFileFn, type RegionName, type RegionNames, type RegionToken, type RelationshipType, type RenderCategory, type RenderStep, type ResolveImportsResult, type ResolvedActivity, type ResolvedEdge, type ResolvedGroup$1 as ResolvedGroup, type ResolvedMap, type ResolvedPert, type ResolvedGroup as ResolvedPertGroup, type ResolvedPoi, type ResolvedRegion, type ResolvedRoute, type ResolvedSchedule, type ResolvedTask, type ResultCard, type ResultTokens, type RingLayer, ScaleContext, type ScatterLabelPoint, type SectionMessageGroup, type SequenceBlock, type SequenceElement, type SequenceGroup, type SequenceMessage, type SequenceNote, type SequenceParticipant, type SequenceRenderOptions, type SequenceSection, type SimulateOptions, type SitemapContainerBounds, type SitemapDirection, type SitemapEdge, type SitemapLayoutEdge, type SitemapLayoutNode, type SitemapLayoutResult, type SitemapLegendEntry, type SitemapLegendGroup, type SitemapNode, type StateCollapseResult, type TagEntry, type TagGroup, type TechRadarBlip, type TechRadarLayoutPoint, type TechRadarQuadrant, type TechRadarRing, type Theme, type TransformResult, type VisualizationType, type WireframeElement, type WireframeElementType, type WireframeFormFactor, type WireframeLayout, type WireframeLayoutNode, addDurationToDate, analyzePert, applyCollapseProjection, applyGroupOrdering, applyPositionOverrides, atlasPalette, blueprintPalette, buildExtendedChartOption, buildNoteMessageMap, buildRenderSequence, buildSimpleChartOption, buildSimulationContext, buildTagLaneRowList, calculateSchedule, catppuccinPalette, confidence as chartTypeConfidence, chartTypeParsers, chartTypes, collapseBoxesAndLines, collapseMindmapTree, collapseOrgTree, collapseSitemapTree, collapseStateGroups, collectDiagramRoles, collectTasks, colorNames, completeMapPlaces, completeMapRegions, computeActivations, computeCardArchive, computeCardMove, computeCycleLayout, computeInfra, computeInfraLegendGroups, computeLegendLayout, computeRadarLayout, computeScatterLabelGraphics, computeTimeTicks, contrastText, controlsGroupCapsuleWidth, createMapGeoQuery, decodeDiagramUrl, decodeViewState, displayName, draculaPalette, encodeDiagramUrl, encodeViewState, extractDiagramSymbols, extractPertSymbols, extractTagDeclarations, findUnsafePipePositions, focusOrgTree, formatDateLabel, formatDgmoError, formatLineDiff, getAllChartTypes, getAvailablePalettes, getExtendedChartLegendGroups, getLegendReservedHeight, getOrCreateName, getPalette, getRadarGeometry, getRenderCategory, getSeriesColors, getSimpleChartLegendGroups, groupMessagesBySection, gruvboxPalette, hexToHSL, hexToHSLString, highlightPertCriticalPath, highlightPertSet, hslToHex, inferParticipantType, inferRoles, isArchiveColumn, isExtendedChartType, isLegacyMetadataLine, isRecognizedColorName, isSequenceBlock, isSequenceNote, isValidHex, knownChartTypeIds, layoutBoxesAndLines, layoutC4Components, layoutC4Containers, layoutC4Context, layoutC4Deployment, layoutClassDiagram, layoutERDiagram, layoutGraph, layoutInfra, layoutJourneyMap, layoutMap, layoutMindmap, layoutOrg, layoutPert, layoutSitemap, layoutWireframe, loadMapData, looksLikeClassDiagram, looksLikeERDiagram, looksLikeFlowchart, looksLikeMap, looksLikePert, looksLikeSequence, looksLikeSitemap, looksLikeState, makeDgmoError, mapBackgroundColor, mapContentAspect, mapExportDimensions, mapNeutralLandColor, matchesContiguously, measurePertAnalysisBlock, migrateContent, mix, monokaiPalette, mulberry32, nord, nordPalette, normalize as normalizeChartTypePrompt, normalizeName, normalizePertSourceForShare, oneDarkPalette, orderArcNodes, palettes, parseAndLayoutInfra, parseBoxesAndLines, parseC4, parseChart, parseClassDiagram, parseCycle, parseDataRowValues, parseDgmo, parseDgmoChartType, parseERDiagram, parseExtendedChart, parseFirstLine, parseFlowchart, parseGantt, parseInArrowLabel, parseInfra, parseInlineMarkdown, parseJourneyMap, parseKanban, parseMap, parseMindmap, parseOrg, parsePert, parsePyramid, parseRaci, parseRing, parseSequenceDgmo, parseSequenceDgmo as parseSequenceDiagram, parseSitemap, parseState, parseTechRadar, parseTimelineDate, parseVisualization, parseWireframe, pertLegendBlockWidth, pertLegendEntries, cellAppendMarker as raciCellAppendMarker, cellCycle as raciCellCycle, cellRemove as raciCellRemove, cellReplace as raciCellReplace, registerExtractor, registerPalette, relayoutPert, render, renderArcDiagram, renderBoxesAndLines, renderBoxesAndLinesForExport, renderC4ComponentsForExport, renderC4Containers, renderC4ContainersForExport, renderC4Context, renderC4ContextForExport, renderC4Deployment, renderC4DeploymentForExport, renderClassDiagram, renderClassDiagramForExport, renderCycle, renderCycleForExport, renderERDiagram, renderERDiagramForExport, renderExtendedChartForExport, renderFlowchart, renderFlowchartForExport, renderForExport, renderGantt, renderInfra, renderJourneyMap, renderJourneyMapForExport, renderKanban, renderKanbanForExport, renderLegendD3, renderLegendSvg, renderLegendSvgFromConfig, renderMap, renderMapForExport, renderMindmap, renderMindmapForExport, renderOrg, renderOrgForExport, renderPert, renderPertAnalysisBlock, renderPertForExport, renderLegendBlock as renderPertLegendBlock, renderPyramid, renderPyramidForExport, renderQuadrant, renderQuadrantFocus, renderQuadrantFocusForExport, renderRaci, renderRaciForExport, renderRing, renderRingForExport, renderSequenceDiagram, renderSitemap, renderSitemapForExport, renderSlopeChart, renderState, renderStateForExport, renderTechRadar, renderTechRadarForExport, renderTimeline, renderVenn, renderWireframe, renderWordCloud, resetPertCriticalPath, resetPertHighlight, resolveColor, resolveColorWithDiagnostic, resolveMap, resolveOrgImports, resolveTaskName, rollUpContextRelationships, rosePinePalette, sampleBetaPert, scoreChartType, seriesColors, shade, shapeFill, simulateCanonical, simulateFast, slatePalette, solarizedPalette, suggestChartTypes, themes, tidewaterPalette, tint, tokyoNightPalette, transformLine, truncateBareUrl, parseDgmo as validate, validateComputed, validateInfra, validateLabelCharacters };