@diagrammo/dgmo 0.53.0 → 0.55.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 (212) hide show
  1. package/dist/advanced.d.ts +112 -9
  2. package/dist/advanced.js +188 -160
  3. package/dist/auto.js +147 -132
  4. package/dist/auto.mjs +2352 -746
  5. package/dist/block.js +65 -62
  6. package/dist/chart-meta.js +52 -49
  7. package/dist/{charts-d3-DH2XA45I.js → charts-d3-KZ6V4OP2.js} +10 -8
  8. package/dist/chunk-2CW5ZTNH.js +58 -0
  9. package/dist/{chunk-MA3HJZHB.js → chunk-2HX6ZGY7.js} +7 -7
  10. package/dist/{chunk-YG2BEIQU.js → chunk-2R6HG6D5.js} +11 -11
  11. package/dist/{chunk-65V6IRFN.js → chunk-2ZJXKJSI.js} +106 -60
  12. package/dist/{chunk-PYO4TJJ3.js → chunk-32HUNA33.js} +60 -18
  13. package/dist/{chunk-UK6DKJLD.js → chunk-3BFXELBL.js} +51 -4
  14. package/dist/{chunk-RW5PEJ7D.js → chunk-3BZJ5KD5.js} +7 -3
  15. package/dist/{chunk-FT7TPPZ5.js → chunk-3FUTFYSP.js} +65 -26
  16. package/dist/{chunk-QAALSCKI.js → chunk-4MZCJV4M.js} +12 -12
  17. package/dist/{chunk-ZXUAPTCK.js → chunk-4R5KIPNX.js} +2 -2
  18. package/dist/{chunk-QWIBT6DS.js → chunk-5D5VHDJM.js} +49 -14
  19. package/dist/{chunk-U7NKYLX2.js → chunk-5H5GWWA4.js} +55 -19
  20. package/dist/{chunk-P3H7QVDH.js → chunk-5K5XBEXT.js} +11 -6
  21. package/dist/{chunk-PT4SW76W.js → chunk-6NJWBMJV.js} +49 -14
  22. package/dist/{chunk-I46X5VUA.js → chunk-7TF3QOOD.js} +25 -1
  23. package/dist/{chunk-6DCOIN4W.js → chunk-A2ARDILY.js} +783 -3
  24. package/dist/{chunk-CK2GMDXD.js → chunk-A2PTRSAO.js} +2 -2
  25. package/dist/{chunk-APKUAJ2L.js → chunk-A2RUBBVT.js} +14 -1
  26. package/dist/{chunk-GMIJ35PW.js → chunk-A4UJP4IS.js} +68 -20
  27. package/dist/{chunk-LQHVDZYC.js → chunk-AKE6C2D7.js} +4 -4
  28. package/dist/{chunk-W5KMNC5U.js → chunk-ASPS5O6F.js} +9 -10
  29. package/dist/{chunk-FLDC7ZAK.js → chunk-AU75JHSR.js} +6 -3
  30. package/dist/chunk-BEOAKGNA.js +484 -0
  31. package/dist/{chunk-XY3UDKKH.js → chunk-COVYNAKJ.js} +4 -4
  32. package/dist/{chunk-4ASVFYB2.js → chunk-DS4MDEQ7.js} +5 -5
  33. package/dist/{chunk-7JDTNFAK.js → chunk-EFUQENO5.js} +76 -32
  34. package/dist/{chunk-BULHGPHK.js → chunk-EMSOFHEN.js} +2 -2
  35. package/dist/{chunk-3BEKKRH5.js → chunk-ETTDF3S2.js} +49 -11
  36. package/dist/{chunk-JHOAH4TI.js → chunk-ETYF5QZR.js} +2 -2
  37. package/dist/{chunk-AHXIMHDQ.js → chunk-F5ZNUMSY.js} +53 -14
  38. package/dist/{chunk-I64ECJX3.js → chunk-FBP33UM6.js} +3 -3
  39. package/dist/{chunk-VIRANCNY.js → chunk-FGAMFJNJ.js} +58 -20
  40. package/dist/{chunk-774C2FF3.js → chunk-GRXPFBYC.js} +24 -3
  41. package/dist/{chunk-NNYFQOTK.js → chunk-GTO5VCYG.js} +10 -8
  42. package/dist/{chunk-RJ5LBZ5U.js → chunk-HES4K6DV.js} +13 -13
  43. package/dist/{chunk-AZNXGWDC.js → chunk-HGKOVKAX.js} +7 -7
  44. package/dist/{chunk-DWUMPMV2.js → chunk-HLGOG44K.js} +2 -2
  45. package/dist/{chunk-VJHBSPGF.js → chunk-HUTP35XT.js} +5 -4
  46. package/dist/{chunk-3CZLWOCI.js → chunk-HX7QNHC6.js} +3 -3
  47. package/dist/{chunk-R5NH5BZG.js → chunk-IALX52TR.js} +6 -6
  48. package/dist/{chunk-A44USUV7.js → chunk-ICZ7M6IZ.js} +23 -17
  49. package/dist/{chunk-27STWBOK.js → chunk-IF4KYSJZ.js} +10 -8
  50. package/dist/{chunk-HORZ5H2L.js → chunk-IG6J7JWH.js} +61 -22
  51. package/dist/{chunk-VRRDUYOK.js → chunk-IIUYKQ5J.js} +3 -3
  52. package/dist/{chunk-GMAH572Z.js → chunk-INTAQV2Y.js} +2 -2
  53. package/dist/{chunk-6AUZPPAV.js → chunk-ITXL2KU5.js} +2 -2
  54. package/dist/{chunk-KKHCNSKK.js → chunk-IWG2ECAO.js} +5 -5
  55. package/dist/{chunk-GQ644SPD.js → chunk-JGCEFKZP.js} +14 -14
  56. package/dist/{chunk-HNBY6CNV.js → chunk-JQLSFZZP.js} +2 -2
  57. package/dist/{chunk-CMVZWP32.js → chunk-JR7Q6GHE.js} +2 -2
  58. package/dist/{chunk-LHILKFDP.js → chunk-KC3WBBI7.js} +9 -9
  59. package/dist/{chunk-GABSL6TH.js → chunk-KK3L5NVK.js} +3 -3
  60. package/dist/{chunk-LC3FFD43.js → chunk-L2DIXZUT.js} +98 -48
  61. package/dist/{chunk-4WGMGKCZ.js → chunk-LCRPGGGS.js} +11 -11
  62. package/dist/{chunk-6KY7OCZC.js → chunk-LKGQ46P4.js} +3 -3
  63. package/dist/{chunk-HE5J53SZ.js → chunk-LW7STMYZ.js} +3 -3
  64. package/dist/{chunk-BD3WGY4T.js → chunk-M53MDBIW.js} +2 -2
  65. package/dist/{chunk-AN2DQB3G.js → chunk-MEH4TJEX.js} +12 -12
  66. package/dist/{chunk-SGPFVDUL.js → chunk-MNS2ENXF.js} +6 -6
  67. package/dist/{chunk-FXCB7H5O.js → chunk-MSWIBF6J.js} +2 -2
  68. package/dist/{chunk-BR7AYN76.js → chunk-NL7FUIVD.js} +12 -12
  69. package/dist/{chunk-AIMLCDAO.js → chunk-NN5TF4OV.js} +2 -2
  70. package/dist/{chunk-7GUF6SDR.js → chunk-NPPUZ4SK.js} +9 -9
  71. package/dist/{chunk-4K42RUGC.js → chunk-NYOOPQFD.js} +47 -12
  72. package/dist/{chunk-FFXCKZOU.js → chunk-O4CZDTQA.js} +3 -3
  73. package/dist/{chunk-6HTRCTAS.js → chunk-P5XXIVEU.js} +6 -4
  74. package/dist/{chunk-XEAQDIMF.js → chunk-PC4YLEKA.js} +6 -6
  75. package/dist/{chunk-Q7AH665U.js → chunk-PCVXXPYU.js} +121 -38
  76. package/dist/{chunk-W2DINCHL.js → chunk-PKUWYPI5.js} +207 -24
  77. package/dist/{chunk-PV2QO7QL.js → chunk-PSIDVCBA.js} +2 -2
  78. package/dist/{chunk-YR43LJT5.js → chunk-PV7ND5WL.js} +58 -15
  79. package/dist/{chunk-QI3BOLQB.js → chunk-Q5CMQVWF.js} +4 -4
  80. package/dist/{chunk-4RGZFA7H.js → chunk-Q5IHQ4NW.js} +11 -1
  81. package/dist/{chunk-SG4PRYO3.js → chunk-QQXFYTLC.js} +391 -60
  82. package/dist/{chunk-GWQJKTFS.js → chunk-QZYGRDMM.js} +118 -99
  83. package/dist/{chunk-CQFNIIQN.js → chunk-RKBCKCSF.js} +2 -2
  84. package/dist/{chunk-FUKNRLIJ.js → chunk-RSBH2C7O.js} +6 -6
  85. package/dist/{chunk-2QC4HXCY.js → chunk-RYNCWA5X.js} +11 -10
  86. package/dist/{chunk-NNUMX6WX.js → chunk-RZWIPDZ2.js} +40 -15
  87. package/dist/{chunk-VKNCC2GX.js → chunk-S52F62GW.js} +13 -13
  88. package/dist/{chunk-UQRIKAMH.js → chunk-SCOHNGPG.js} +59 -18
  89. package/dist/{chunk-VGNIDAPQ.js → chunk-SSHS42QG.js} +4 -4
  90. package/dist/chunk-TGOMHUOV.js +218 -0
  91. package/dist/{chunk-UKP5HWB5.js → chunk-UBQU2BY6.js} +4 -4
  92. package/dist/{chunk-IQJCVREL.js → chunk-UES4P7FN.js} +6 -6
  93. package/dist/chunk-US3P2DQO.js +87 -0
  94. package/dist/{chunk-GAWKIIPO.js → chunk-UXXLE6AH.js} +8 -8
  95. package/dist/{chunk-22OQWBWD.js → chunk-VMWSZCAK.js} +12 -11
  96. package/dist/{chunk-XG4NWFPY.js → chunk-VVIRAGID.js} +13 -13
  97. package/dist/{chunk-X3RXGSCZ.js → chunk-VXTUWXFB.js} +54 -15
  98. package/dist/{chunk-J7HI6G3G.js → chunk-W4TSD3IP.js} +6 -6
  99. package/dist/{chunk-FGDSTT3F.js → chunk-WB3NA3JJ.js} +2 -2
  100. package/dist/{chunk-KUSAVOWZ.js → chunk-WITOJZGL.js} +8 -4
  101. package/dist/{chunk-UVDCHR4E.js → chunk-WVGNXDEE.js} +2 -2
  102. package/dist/{chunk-HOXKNRON.js → chunk-X3X4LZDC.js} +2 -2
  103. package/dist/{chunk-SQCBSFT5.js → chunk-XKKH2DPG.js} +51 -263
  104. package/dist/{chunk-NR5HCAUD.js → chunk-XSVWUOUZ.js} +1 -1
  105. package/dist/{chunk-BFDVEO5R.js → chunk-Y4BBGFKY.js} +2 -2
  106. package/dist/{chunk-VAO6ANGC.js → chunk-YP2T5YUP.js} +14 -9
  107. package/dist/{chunk-PKNNHU7H.js → chunk-YXKNXIWA.js} +19 -11
  108. package/dist/{chunk-UFQJMOVZ.js → chunk-ZGIBV36U.js} +6 -6
  109. package/dist/{chunk-XQ4KN6JQ.js → chunk-ZP265ICS.js} +16 -15
  110. package/dist/{chunk-JTMSWEIW.js → chunk-ZWVKTWK6.js} +4 -4
  111. package/dist/{chunk-ALYZ3MAA.js → chunk-ZXNHHO6D.js} +8 -476
  112. package/dist/cli.cjs +166 -149
  113. package/dist/clock.js +34 -1
  114. package/dist/completion-registry.d.ts +129 -0
  115. package/dist/completion-registry.js +1278 -0
  116. package/dist/{compute-G55RG53N.js → compute-JAP5E2E4.js} +2 -2
  117. package/dist/dgmo-router-T4HGLIGA.js +88 -0
  118. package/dist/{dimensions-K6PGYYGT.js → dimensions-3JINHSYK.js} +8 -8
  119. package/dist/editor.js +28 -1
  120. package/dist/element.js +148 -133
  121. package/dist/element.mjs +2352 -746
  122. package/dist/{flowchart-parser-LALR6J6F.js → flowchart-parser-M7KKTLX7.js} +5 -5
  123. package/dist/{flowchart-renderer-DXYB5YRF.js → flowchart-renderer-FFEQFQEU.js} +9 -9
  124. package/dist/highlight.js +28 -1
  125. package/dist/index.js +77 -64
  126. package/dist/{layout-ZE5DRJWX.js → layout-3ZZBKUQC.js} +4 -4
  127. package/dist/{layout-3BVDMKXI.js → layout-AUKTWGYL.js} +4 -4
  128. package/dist/{layout-4IHCMWZN.js → layout-CRLTSFYQ.js} +4 -4
  129. package/dist/{layout-WCAIKGZG.js → layout-FNZDJGKF.js} +5 -5
  130. package/dist/layout-GHWRJKZQ.js +15 -0
  131. package/dist/{layout-3V2A4MUE.js → layout-LGXOKUCD.js} +6 -5
  132. package/dist/{layout-WSMPBQ4Q.js → layout-NF4EWFLT.js} +3 -3
  133. package/dist/{layout-OL2XFJXA.js → layout-SP7HJWKA.js} +3 -3
  134. package/dist/{layout-E6HR6PXH.js → layout-UR7CYAHL.js} +3 -3
  135. package/dist/layout-UTMEVFHN.js +15 -0
  136. package/dist/{layout-search-34DPZD43.js → layout-search-U2H4ORFJ.js} +14 -7
  137. package/dist/{legend-constants-P5EQWRQQ.js → legend-constants-B77VKB3R.js} +7 -2
  138. package/dist/{parser-6PPHAXXH.js → parser-2AXPSKWB.js} +5 -5
  139. package/dist/{parser-5HQXCNOS.js → parser-2AZ2KQTO.js} +4 -4
  140. package/dist/{parser-3KIGEEJM.js → parser-2LF33IS2.js} +4 -4
  141. package/dist/{parser-NNIL3HXU.js → parser-3QJ2Z4H4.js} +3 -3
  142. package/dist/parser-5GCQFSTQ.js +13 -0
  143. package/dist/{parser-6B6SSZT7.js → parser-62OHBRU5.js} +3 -3
  144. package/dist/{parser-VOERD6XR.js → parser-7LYJFZCP.js} +4 -4
  145. package/dist/{parser-ZGNXYFPS.js → parser-BMOTF72G.js} +3 -3
  146. package/dist/{parser-IVGHXLZP.js → parser-CIFLYZYP.js} +4 -3
  147. package/dist/{parser-GN2MM5CC.js → parser-D2UL2G5U.js} +3 -3
  148. package/dist/{parser-GKP2MHHL.js → parser-DM2APTKB.js} +3 -3
  149. package/dist/{parser-27Z76SN3.js → parser-DYYTPLBL.js} +4 -4
  150. package/dist/{parser-5FGJSQNS.js → parser-GOUGUTPU.js} +4 -4
  151. package/dist/{parser-G26MTBFS.js → parser-HGVUVD6J.js} +3 -3
  152. package/dist/{parser-EXNBDNGY.js → parser-IEJD3CZB.js} +3 -3
  153. package/dist/{parser-ZQDQTB4X.js → parser-JBEWNLAV.js} +5 -5
  154. package/dist/{parser-5QPFOB5F.js → parser-JMXPHNZD.js} +4 -4
  155. package/dist/{parser-4E4I3GNT.js → parser-JMXSQY3K.js} +4 -4
  156. package/dist/{parser-FF4BMRSB.js → parser-LUXS7J32.js} +4 -4
  157. package/dist/{parser-3VSWEKBF.js → parser-M5BUHULF.js} +4 -4
  158. package/dist/{parser-IKWK2ZU3.js → parser-MESRHUS4.js} +4 -5
  159. package/dist/{parser-3CODK6RG.js → parser-OOYNI2UT.js} +4 -4
  160. package/dist/{parser-YSLNDFLV.js → parser-PVBUAVRR.js} +4 -5
  161. package/dist/{parser-CKA3QMAG.js → parser-QKRBSQLJ.js} +5 -5
  162. package/dist/{parser-UWRX52PC.js → parser-S6NWSIJO.js} +4 -4
  163. package/dist/{parser-RNLTBIJ6.js → parser-SFEK6Q7Z.js} +4 -4
  164. package/dist/{parser-7JVIDLLR.js → parser-SUV52NQW.js} +4 -4
  165. package/dist/{parser-CRKLXGW7.js → parser-SZHGLOOZ.js} +4 -4
  166. package/dist/{parser-275KP7JO.js → parser-TO7IENWL.js} +5 -6
  167. package/dist/{parser-XNKJCMMA.js → parser-TVAMC7CQ.js} +4 -4
  168. package/dist/{parser-FOOFEJQU.js → parser-VAW46R57.js} +4 -4
  169. package/dist/{parser-XVPTRWZ4.js → parser-XDSPOXSE.js} +4 -4
  170. package/dist/pert.d.ts +2 -0
  171. package/dist/{renderer-D3BRNOMV.js → renderer-3PWLOJPD.js} +11 -11
  172. package/dist/{renderer-7NQSTQMQ.js → renderer-5EMHIQL5.js} +4 -4
  173. package/dist/{renderer-ZBTEX2JK.js → renderer-5PODNLYP.js} +4 -4
  174. package/dist/{renderer-6WRYVM5R.js → renderer-AQJIQ2XU.js} +9 -8
  175. package/dist/{renderer-JCZG6AYU.js → renderer-BEW3AYFT.js} +10 -10
  176. package/dist/{renderer-YUKPS27O.js → renderer-C3UYAXA6.js} +10 -8
  177. package/dist/{renderer-AK2WO4EI.js → renderer-CENXCMWG.js} +4 -4
  178. package/dist/{renderer-HIFQVEJA.js → renderer-CXM3ARYN.js} +10 -9
  179. package/dist/{renderer-JTCX6PCG.js → renderer-DW6TEBLA.js} +10 -9
  180. package/dist/{renderer-VMH6L6CP.js → renderer-FE5M6SEZ.js} +10 -9
  181. package/dist/{renderer-TYHGXAVT.js → renderer-FXK6ZL3P.js} +4 -4
  182. package/dist/{renderer-UPF7NRTI.js → renderer-G5ESLCJB.js} +12 -11
  183. package/dist/{renderer-CWEFGEIC.js → renderer-HTDS4FED.js} +14 -13
  184. package/dist/{renderer-XTXSOK3L.js → renderer-IO4KCFVL.js} +10 -10
  185. package/dist/{renderer-SQ54MDSA.js → renderer-IRAFJNTK.js} +10 -9
  186. package/dist/{renderer-JWGQSTMR.js → renderer-MFTTFW32.js} +15 -14
  187. package/dist/{renderer-2C6DJRYN.js → renderer-MPXI4FVL.js} +8 -8
  188. package/dist/{renderer-5MPN7CXZ.js → renderer-NVBEMQ6L.js} +5 -5
  189. package/dist/{renderer-7ZNVOVFG.js → renderer-OOGDCR6K.js} +3 -3
  190. package/dist/{renderer-COLQFSFV.js → renderer-Q5P72O4A.js} +9 -9
  191. package/dist/{renderer-WCWI4I6A.js → renderer-QZESC66H.js} +2 -2
  192. package/dist/{renderer-NE5W7CQP.js → renderer-RDBUXW7P.js} +6 -5
  193. package/dist/{renderer-6EN5XXJZ.js → renderer-S4XB3JR2.js} +11 -11
  194. package/dist/{renderer-WFSUBKUL.js → renderer-SIWEEWJ5.js} +9 -8
  195. package/dist/{renderer-LVZAHRP6.js → renderer-TKTM2SL4.js} +12 -12
  196. package/dist/{renderer-QD2SJF2I.js → renderer-TXTTV4HA.js} +10 -9
  197. package/dist/{renderer-YUXGXGSW.js → renderer-UZIU4AHK.js} +10 -9
  198. package/dist/{renderer-RLMOTXZ6.js → renderer-V72VJIGG.js} +14 -13
  199. package/dist/{renderer-UKXW2QPE.js → renderer-VEGOEZOI.js} +10 -8
  200. package/dist/{renderer-WNFXYYGL.js → renderer-W6I6T2TA.js} +8 -8
  201. package/dist/{renderer-KARQF3F3.js → renderer-WSHJRR2T.js} +8 -8
  202. package/dist/{renderer-radial-WF6VOUOD.js → renderer-radial-AG75PBYD.js} +9 -9
  203. package/dist/{resolver-WFKZYBJ2.js → resolver-ZSFQQRTH.js} +3 -3
  204. package/dist/{state-parser-L7DHZIQO.js → state-parser-KIPZGIB4.js} +5 -5
  205. package/dist/{state-renderer-TFEUOP4H.js → state-renderer-U6OSJG52.js} +13 -12
  206. package/docs/language-reference.md +2 -1
  207. package/package.json +5 -1
  208. package/dist/chunk-YJVA3QUU.js +0 -734
  209. package/dist/dgmo-router-B4S23EBH.js +0 -86
  210. package/dist/layout-3M5UYJHY.js +0 -14
  211. package/dist/layout-KPQWJNAG.js +0 -14
  212. package/dist/parser-7JHWEWXM.js +0 -13
@@ -216,6 +216,13 @@ interface ParsedChart {
216
216
  /** Cross-chart-type: when true, the renderer suppresses the legend and the
217
217
  * vertical band it would occupy (#48). */
218
218
  noLegend?: boolean;
219
+ /** §1.9 `legend-inline`: render the title and the series legend on one line
220
+ * (title left, legend right) instead of stacking the legend below a centered
221
+ * title — reclaims a header row. Honoured by the top-center-legend data
222
+ * charts (bar/line/radar/scatter/function); a no-op elsewhere. Auto-falls
223
+ * back to the stacked header when the legend can't fit beside the title on a
224
+ * single row (decision #50). */
225
+ legendInline?: boolean;
219
226
  /** Line only: opt out of the data-driven y-axis auto-fit and anchor the
220
227
  * baseline at 0 (magnitude honesty / old ECharts-parity behavior). By
221
228
  * default a line chart fits a padded data-min→max window (§15.1). */
@@ -249,6 +256,16 @@ declare function parseChart(content: string, palette?: PaletteColors): ParsedCha
249
256
  * "North America 250" → { label: "North America", values: [250] }
250
257
  * "Q1 10 20 30" → { label: "Q1", values: [10, 20, 30] }
251
258
  * "Revenue 1_000" → { label: "Revenue", values: [1000] }
259
+ * '"Wi-Fi 6" 70 80' → { label: "Wi-Fi 6", values: [70, 80], quotedLabel: true }
260
+ *
261
+ * A fully-quoted leading label is taken verbatim (quotes stripped) and is never
262
+ * eligible for value peeling — the escape hatch for labels that end in a digit
263
+ * (`"Wi-Fi 6"`, `"Layer 3"`), mirroring the treemap leaf rule.
264
+ *
265
+ * `trailingNumericCount` reports how many consecutive numeric tokens the row
266
+ * actually ends with, which may exceed `values.length` when `expectedValues`
267
+ * caps the walk. Callers use it to flag an over-long row instead of silently
268
+ * absorbing the surplus numbers into the label.
252
269
  *
253
270
  * Returns null if the line has no numeric value at the end.
254
271
  */
@@ -258,6 +275,11 @@ declare function parseDataRowValues(line: string, options?: {
258
275
  }): {
259
276
  label: string;
260
277
  values: number[];
278
+ /** Label prefix with every trailing numeric token removed (diagnostics use
279
+ * this so the message names "Armor", not the corrupted "Armor 50 60"). */
280
+ bareLabel: string;
281
+ trailingNumericCount: number;
282
+ quotedLabel: boolean;
261
283
  } | null;
262
284
 
263
285
  interface LegendState {
@@ -490,6 +512,23 @@ interface LegendHandle {
490
512
  }
491
513
  type D3Sel = Selection<any, unknown, any, unknown>;
492
514
 
515
+ /** A parsed emphasis directive: which dual, and the names it lists. */
516
+ interface EmphasisDirective {
517
+ readonly kind: 'highlight' | 'dim';
518
+ readonly names: readonly string[];
519
+ /**
520
+ * True when the author used no comma, so `names` is a *guess* — `dim Ship
521
+ * Provisions` is one two-word element far more often than two one-word ones.
522
+ * Resolution tries the whole phrase first and only falls back to these
523
+ * tokens, which means a comma is never required for the common single-name
524
+ * case but always disambiguates when an author wants several.
525
+ */
526
+ readonly ambiguous: boolean;
527
+ /** The directive's argument text, verbatim — the whole-phrase candidate. */
528
+ readonly raw: string;
529
+ readonly lineNumber: number;
530
+ }
531
+
493
532
  type ExtendedChartType = 'sankey' | 'chord' | 'function' | 'scatter' | 'heatmap' | 'funnel';
494
533
  interface ExtendedChartDataPoint {
495
534
  label: string;
@@ -548,7 +587,9 @@ interface ParsedExtendedBase {
548
587
  noName?: boolean;
549
588
  noValue?: boolean;
550
589
  noPercent?: boolean;
551
- shade?: boolean;
590
+ /** `fill` directive — shade the area below each curve (function charts),
591
+ * parity with the `line` chart's bare `fill`. Opacity follows `fillMode`. */
592
+ fill?: boolean;
552
593
  /** §1.9 fill family: `'solid'` = full intent saturation, `'outline'` =
553
594
  * theme-background fill with color on the stroke. Absent ⇒ 25% tint. */
554
595
  fillMode?: 'solid' | 'outline';
@@ -557,6 +598,13 @@ interface ParsedExtendedBase {
557
598
  /** Cross-chart-type: when true, the renderer suppresses the legend and the
558
599
  * vertical band it would occupy (#48). */
559
600
  noLegend?: boolean;
601
+ /** §1.9 `legend-inline`: title + series legend on one line (see ParsedChart).
602
+ * Honoured by scatter/function among the extended charts (decision #50). */
603
+ legendInline?: boolean;
604
+ /** §1.11 emphasis family: `highlight <Name>…` / `dim <Name>…`. Chart-level,
605
+ * mutually exclusive, last-one-wins. Resolved against real element names at
606
+ * render time via `resolveEmphasis`. */
607
+ emphasis?: EmphasisDirective;
560
608
  categoryColors?: Record<string, string>;
561
609
  categoryLineNumbers?: Record<string, number>;
562
610
  nodeColors?: Record<string, string>;
@@ -2139,6 +2187,8 @@ interface SketchBox {
2139
2187
  }
2140
2188
  interface SketchOptions {
2141
2189
  readonly noLegend: boolean;
2190
+ /** §1.9 `legend-inline` — title left, legend flushed right on one row. */
2191
+ readonly legendInline?: boolean;
2142
2192
  /** §1.9 fill family; undefined ⇒ canonical 25% tint. */
2143
2193
  readonly fillMode: 'solid' | 'outline' | undefined;
2144
2194
  /** `no-descriptions` directive (mindmap `hd` standard): hide the card
@@ -3198,6 +3248,8 @@ interface GanttOptions {
3198
3248
  noTitle: boolean;
3199
3249
  /** §1.9 `no-legend` — suppress the tag legend and collapse its reserved band. */
3200
3250
  noLegend: boolean;
3251
+ /** §1.9 `legend-inline` — title left, legend flushed right on one row. */
3252
+ legendInline?: boolean;
3201
3253
  }
3202
3254
  interface ParsedGantt {
3203
3255
  readonly nodes: readonly GanttNode[];
@@ -3414,6 +3466,8 @@ interface PertOptions {
3414
3466
  noTitle?: boolean;
3415
3467
  /** §1.9 `no-legend` — suppress the tag legend and collapse its reserved band. */
3416
3468
  noLegend?: boolean;
3469
+ /** §1.9 `legend-inline` — title left, legend flushed right on one row. */
3470
+ legendInline?: boolean;
3417
3471
  /**
3418
3472
  * §1.9 fill family — `fill-solid` renders node/group card fills at full intent
3419
3473
  * saturation instead of the canonical 25% tint (via `shapeFill`).
@@ -4622,6 +4676,26 @@ interface EventLineEra {
4622
4676
  readonly collapsed: boolean;
4623
4677
  readonly lineNumber: number;
4624
4678
  }
4679
+ /**
4680
+ * A **now marker** (§28.6b) — a "grounded pin" at "today": a palette-red
4681
+ * (`palette.destructive`) diamond planted on the spine with a short stem to a
4682
+ * labeled tab, slotted into a card-free lane, plus a dotted "today line" that
4683
+ * fades out within the leader gap (full-height only on hover, preview).
4684
+ * `now` alone is *computed* (resolved to the render-time date);
4685
+ * `now <date>` *pins* it to an explicit ISO date (deterministic, snapshot-safe).
4686
+ * Only drawn on a to-scale axis (every event dated); ignored under `no-scale`.
4687
+ */
4688
+ interface EventLineNow {
4689
+ /** True for bare `now` (date resolved at render time); false when pinned. */
4690
+ readonly computed: boolean;
4691
+ /** Pinned ISO date as written, or null when computed. */
4692
+ readonly date: string | null;
4693
+ /** Numeric value for the pinned date (timeline scale), or null when computed. */
4694
+ readonly dateValue: number | null;
4695
+ /** Rule caption (default `now`; a trailing token on the pinned form overrides). */
4696
+ readonly label: string;
4697
+ readonly lineNumber: number;
4698
+ }
4625
4699
  interface EventLineOptions {
4626
4700
  /** False when `no-scale` — events are spaced evenly instead of by date. */
4627
4701
  readonly scale: boolean;
@@ -4634,6 +4708,8 @@ interface EventLineOptions {
4634
4708
  readonly noBox: boolean;
4635
4709
  /** True when `no-legend` — hide the tag legend. */
4636
4710
  readonly noLegend: boolean;
4711
+ /** §1.9 `legend-inline` — title left, legend flushed right on one row. */
4712
+ readonly legendInline?: boolean;
4637
4713
  /** §1.9 fill family: 'solid' | 'outline'; undefined ⇒ canonical soft tint. */
4638
4714
  readonly fillMode: 'solid' | 'outline' | undefined;
4639
4715
  }
@@ -4643,6 +4719,8 @@ interface ParsedEventLine {
4643
4719
  readonly titleLineNumber: number | null;
4644
4720
  readonly events: readonly EventLineEvent[];
4645
4721
  readonly eras: readonly EventLineEra[];
4722
+ /** The `now` marker (§28.6b), or null when the directive is absent. */
4723
+ readonly now: EventLineNow | null;
4646
4724
  readonly tagGroups: readonly TagGroup[];
4647
4725
  readonly options: EventLineOptions;
4648
4726
  readonly diagnostics: readonly DgmoError[];
@@ -4651,7 +4729,10 @@ interface ParsedEventLine {
4651
4729
 
4652
4730
  declare function parseEventLine(content: string, palette?: PaletteColors): ParsedEventLine;
4653
4731
 
4654
- declare function renderEventLine(container: HTMLDivElement, parsed: ParsedEventLine, palette: PaletteColors, isDark: boolean, onClickItem?: (lineNumber: number) => void, exportDims?: D3ExportDimensions, tagOverride?: string): void;
4732
+ declare function renderEventLine(container: HTMLDivElement, parsed: ParsedEventLine, palette: PaletteColors, isDark: boolean, onClickItem?: (lineNumber: number) => void, exportDims?: D3ExportDimensions, tagOverride?: string,
4733
+ /** Injectable clock for the computed `now` marker (§28.6b). Defaults to the
4734
+ * live wall-clock; tests/snapshots pass a fixed date for determinism. */
4735
+ nowDate?: Date): void;
4655
4736
  /** A focus target: a single event (by its `data-evt` id, = source line), an era
4656
4737
  * (by name), or a tag value (a legend category). `null` clears the focus. */
4657
4738
  type EventLineFocus = {
@@ -4679,7 +4760,7 @@ declare function clearEventLineMuted(container: HTMLElement): void;
4679
4760
  * to clear. No-op when the container holds no event-line SVG.
4680
4761
  */
4681
4762
  declare function focusEventLine(container: HTMLElement, spec: EventLineFocus | null): void;
4682
- declare function renderEventLineForExport(container: HTMLDivElement, parsed: ParsedEventLine, palette: PaletteColors, isDark: boolean, exportDims?: D3ExportDimensions, tagOverride?: string): void;
4763
+ declare function renderEventLineForExport(container: HTMLDivElement, parsed: ParsedEventLine, palette: PaletteColors, isDark: boolean, exportDims?: D3ExportDimensions, tagOverride?: string, nowDate?: Date): void;
4683
4764
 
4684
4765
  /** A resolved recurrence rule. Built by the parser, re-read by the ticker. */
4685
4766
  interface RecurRule {
@@ -5145,6 +5226,8 @@ interface ParsedBracket {
5145
5226
  readonly activeTag: string | null;
5146
5227
  /** Hide the tag legend. */
5147
5228
  readonly noLegend: boolean;
5229
+ /** §1.9 `legend-inline` — title left, legend flushed right on one row. */
5230
+ readonly legendInline?: boolean;
5148
5231
  /** Suppress round/column labels (`no-round`). */
5149
5232
  readonly noRounds: boolean;
5150
5233
  /**
@@ -5376,6 +5459,8 @@ interface TreemapOptions {
5376
5459
  noPercent: boolean;
5377
5460
  noHeaders: boolean;
5378
5461
  noLegend: boolean;
5462
+ /** §1.9 `legend-inline` — title left, legend flushed right on one row. */
5463
+ legendInline?: boolean;
5379
5464
  /** §1.9 fill family; undefined ⇒ canonical 25% tint. */
5380
5465
  fillMode: 'solid' | 'outline' | undefined;
5381
5466
  /** `radial` — render as a sunburst (concentric rings) instead of rectangles. */
@@ -5560,6 +5645,8 @@ interface BlockGrid {
5560
5645
  interface BlockOptions {
5561
5646
  /** `no-legend` — hide the tag legend. */
5562
5647
  noLegend: boolean;
5648
+ /** §1.9 `legend-inline` — title left, legend flushed right on one row. */
5649
+ legendInline?: boolean;
5563
5650
  /** §1.9 fill family: 'solid' | 'outline'; absent ⇒ canonical 25% tint. */
5564
5651
  fillMode?: 'solid' | 'outline';
5565
5652
  }
@@ -6296,6 +6383,12 @@ interface LegendRenderOptions {
6296
6383
  containerWidth: number;
6297
6384
  activeGroup?: string | null;
6298
6385
  className?: string;
6386
+ /**
6387
+ * Row alignment within `containerWidth`. `'center'` (default) matches the
6388
+ * historic top-center legend; `'left'` left-origins the row at x=0 so the
6389
+ * caller can translate it beside a left-aligned title (§1.9 `legend-inline`).
6390
+ */
6391
+ align?: 'center' | 'left';
6299
6392
  }
6300
6393
  interface LegendRenderResult {
6301
6394
  svg: string;
@@ -6367,13 +6460,23 @@ declare function computeActivations(steps: RenderStep[]): Activation[];
6367
6460
  */
6368
6461
  declare function applyPositionOverrides(participants: readonly SequenceParticipant[]): SequenceParticipant[];
6369
6462
  /**
6370
- * Reorder participants so that members of the same group are adjacent.
6371
- * Groups are positioned at the point where their first member would naturally
6372
- * appear based on message order (first-occurrence positioning). This prevents
6373
- * groups declared at the top of the file from being placed before participants
6374
- * that appear in messages earlier.
6463
+ * Order participants by first appearance in messages, then pull grouped
6464
+ * members adjacent.
6465
+ *
6466
+ * The baseline is first-occurrence order (spec §2.2 priority 3): the first
6467
+ * participant referenced by a message gets the leftmost column, regardless of
6468
+ * declaration order. A bare declaration line assigns a tag/type only — it does
6469
+ * NOT pin a column. Participants that never appear in any message fall back to
6470
+ * declaration order (priority 4) and are appended after the message-referenced
6471
+ * ones.
6472
+ *
6473
+ * When spatial `[Group]` boxes exist (priority 2), each group's members are
6474
+ * pulled adjacent at the group's first-appearance anchor, overriding their
6475
+ * individual appearance slots. With no groups this reduces to pure
6476
+ * appearance order.
6375
6477
  *
6376
- * Explicit `position` overrides are handled separately by `applyPositionOverrides`.
6478
+ * Explicit `position` overrides (priority 1) are handled separately by
6479
+ * `applyPositionOverrides`, which runs after this pass.
6377
6480
  */
6378
6481
  declare function applyGroupOrdering(participants: readonly SequenceParticipant[], groups: readonly SequenceGroup[], messages?: readonly SequenceMessage[]): SequenceParticipant[];
6379
6482
  /**