@diagrammo/dgmo 0.95.0 → 0.97.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 (279) hide show
  1. package/README.md +1 -1
  2. package/dist/advanced.d.ts +190 -568
  3. package/dist/advanced.js +259 -470
  4. package/dist/block.d.ts +8 -0
  5. package/dist/block.js +144 -73
  6. package/dist/{calculator-BNH3GSJE.js → calculator-CIGGTURF.js} +2 -2
  7. package/dist/{chart-meta-BbjsRY7o.d.ts → chart-meta-B7niEd52.d.ts} +3 -1
  8. package/dist/chart-meta.d.ts +2 -2
  9. package/dist/chart-meta.js +19 -19
  10. package/dist/{chart-types-Cppnp31G.d.ts → chart-types-Dxtv4XSz.d.ts} +4 -5
  11. package/dist/{charts-d3-SZV2SFTM.js → charts-d3-INWEGMSD.js} +14 -14
  12. package/dist/{chunk-P5XA627W.js → chunk-2FMOLWX4.js} +73 -65
  13. package/dist/{chunk-MLY5ALOV.js → chunk-2SZILMQT.js} +57 -15
  14. package/dist/chunk-35A3J4Z5.js +14 -0
  15. package/dist/{chunk-UXNA2H2V.js → chunk-3C4OXVZJ.js} +2 -2
  16. package/dist/{chunk-IZHGT5HD.js → chunk-3HL6NSSQ.js} +63 -18
  17. package/dist/{chunk-2WQ3YZMN.js → chunk-3IUMSK72.js} +2 -2
  18. package/dist/{chunk-LAXMUSGW.js → chunk-44RLIAYC.js} +17 -10
  19. package/dist/{chunk-H7AXCRO7.js → chunk-453IWXZ3.js} +0 -11
  20. package/dist/{chunk-2I4UQG7W.js → chunk-47INRTZ6.js} +2 -2
  21. package/dist/{chunk-IN7XI6NO.js → chunk-4NMRS6HW.js} +1 -1
  22. package/dist/{chunk-KLBTJEIK.js → chunk-4TK26YHH.js} +2 -2
  23. package/dist/{chunk-CN4RDJDV.js → chunk-5TGZBHEJ.js} +1 -1
  24. package/dist/{chunk-IXHWS2HI.js → chunk-5WZYJC2P.js} +2 -2
  25. package/dist/{chunk-KBDMEOLI.js → chunk-65JFUANT.js} +1 -1
  26. package/dist/{chunk-D3K4U3ZM.js → chunk-6K2W3FH7.js} +8 -5
  27. package/dist/{chunk-NXU4N5WT.js → chunk-6OUMYNAJ.js} +1 -1
  28. package/dist/{chunk-KRPLP5LP.js → chunk-6PUBFB6D.js} +24 -3
  29. package/dist/{chunk-EXHXTMVR.js → chunk-6S2H6EKN.js} +3 -3
  30. package/dist/{chunk-KSZB7TIY.js → chunk-6SDEXSJY.js} +42 -22
  31. package/dist/{chunk-IQN2NGEU.js → chunk-6YBZFOTA.js} +13 -13
  32. package/dist/{chunk-IHN6WDEY.js → chunk-74XR7Z3I.js} +13 -13
  33. package/dist/{chunk-2J2CWWWK.js → chunk-7ASVGFW3.js} +1 -1
  34. package/dist/{chunk-BH2SF4TT.js → chunk-7QKWU7FX.js} +3 -3
  35. package/dist/{chunk-A6YINTY6.js → chunk-7RACGVUY.js} +1 -1
  36. package/dist/{chunk-VB4VMB2I.js → chunk-7TEAFIEJ.js} +9 -5
  37. package/dist/{chunk-UNCCZ3NU.js → chunk-A3V72YIL.js} +14 -1
  38. package/dist/{chunk-BCV2VJTM.js → chunk-A5LFM62B.js} +3 -3
  39. package/dist/{chunk-U6VS3T2M.js → chunk-AULFF7L2.js} +4 -4
  40. package/dist/{chunk-LKZCUFOW.js → chunk-B7ZH5EQ2.js} +2 -2
  41. package/dist/{chunk-VGAMBOOC.js → chunk-C6ME2L4T.js} +2 -2
  42. package/dist/{chunk-3PP746YM.js → chunk-CGP7RGLJ.js} +1 -1
  43. package/dist/{chunk-67N26CER.js → chunk-CLW45YKE.js} +2 -1
  44. package/dist/{chunk-VTESGA5F.js → chunk-CUOMNKYW.js} +4 -4
  45. package/dist/{chunk-CDM6XMOT.js → chunk-CUTEHGXO.js} +2 -2
  46. package/dist/{chunk-NERQSSYD.js → chunk-D67YE4LR.js} +1 -1
  47. package/dist/{chunk-XOMIYMQ3.js → chunk-D7KZE2XJ.js} +39 -17
  48. package/dist/{chunk-NMS5XSLX.js → chunk-DFEVFLEG.js} +3 -3
  49. package/dist/{chunk-EBVVMUAA.js → chunk-DKMZ4VMV.js} +1 -1
  50. package/dist/{chunk-V5D6GDNK.js → chunk-DRY4W4W6.js} +36 -15
  51. package/dist/{chunk-XJQ6Z3FO.js → chunk-E6GHXMH2.js} +8 -8
  52. package/dist/{chunk-KBEWVCK3.js → chunk-EBJLT7PH.js} +1 -1
  53. package/dist/{chunk-TASRGDYP.js → chunk-EEIGHOJR.js} +92 -23
  54. package/dist/{chunk-AQQUJEDN.js → chunk-EUPUVYWO.js} +1 -1
  55. package/dist/{chunk-7IALGIOI.js → chunk-F2OAZHOX.js} +10 -5
  56. package/dist/{chunk-JXGSTBW6.js → chunk-FK6HZYGK.js} +4 -14
  57. package/dist/{chunk-OSSTOSXU.js → chunk-FTW2E2YH.js} +7 -10
  58. package/dist/{chunk-5P2L5QXE.js → chunk-FZVCS2XY.js} +4 -2
  59. package/dist/chunk-G24NSISJ.js +69 -0
  60. package/dist/{chunk-EBIDNRSR.js → chunk-GFQFLLP3.js} +2 -2
  61. package/dist/{chunk-RQTDUZUH.js → chunk-GLLYHYGT.js} +27 -17
  62. package/dist/{chunk-VLC6WNRD.js → chunk-GULGSH2Z.js} +4 -0
  63. package/dist/{chunk-H5NVCOEJ.js → chunk-GXBH7WNN.js} +2 -2
  64. package/dist/{chunk-C6G36F5S.js → chunk-H242TVAE.js} +9 -9
  65. package/dist/{chunk-5XBYLYYI.js → chunk-H7DZYHQF.js} +3 -3
  66. package/dist/{chunk-GLCMUTO5.js → chunk-HQNZJMNS.js} +1 -1
  67. package/dist/{chunk-IY62DXT2.js → chunk-IAM3IDL4.js} +2 -2
  68. package/dist/{chunk-IGJEKO2P.js → chunk-II6D6NWX.js} +8 -8
  69. package/dist/{chunk-AULZD45V.js → chunk-IUFTAFGN.js} +2 -2
  70. package/dist/{chunk-FWVE373X.js → chunk-IZEKHIV6.js} +3 -3
  71. package/dist/{chunk-BQMHJ6OW.js → chunk-J3YM6RA5.js} +22 -14
  72. package/dist/{chunk-R6EGUTIV.js → chunk-J467QBZF.js} +23 -3
  73. package/dist/{chunk-JJ7RGTAU.js → chunk-J7JF4QKA.js} +40 -30
  74. package/dist/{chunk-E7F76M3U.js → chunk-JULBDTNU.js} +61 -9
  75. package/dist/{chunk-EPDBWATV.js → chunk-K7RRXZHS.js} +4 -2
  76. package/dist/{chunk-ZECJ7Q6C.js → chunk-KMB754DO.js} +33 -6
  77. package/dist/chunk-KNKZGRRB.js +439 -0
  78. package/dist/{chunk-XIUGSUE4.js → chunk-KTGJQJB3.js} +6 -2
  79. package/dist/{chunk-4SACN2C5.js → chunk-KW3CC7SB.js} +1 -1
  80. package/dist/{chunk-3GUEYQGL.js → chunk-L3K5O3Z5.js} +3 -3
  81. package/dist/chunk-LRTSTDJ6.js +126 -0
  82. package/dist/{chunk-NBAAIRFP.js → chunk-LZATSXAA.js} +5 -2
  83. package/dist/{chunk-USE6HIOZ.js → chunk-MJ725XHD.js} +1156 -330
  84. package/dist/{chunk-3KVUFHUJ.js → chunk-NBISN6FH.js} +2 -2
  85. package/dist/{chunk-RITTLIDJ.js → chunk-NN5RUHXV.js} +84 -16
  86. package/dist/{chunk-62GLKE6Q.js → chunk-NOZMRPXI.js} +112 -157
  87. package/dist/{chunk-4XYZJTFO.js → chunk-NQFZ7LXC.js} +14 -6
  88. package/dist/chunk-NTDWVTEY.js +12 -0
  89. package/dist/{chunk-BQO24BDM.js → chunk-O3HRF25Z.js} +1 -1
  90. package/dist/{chunk-ZD3QCNB7.js → chunk-OSSA5UWA.js} +3 -3
  91. package/dist/{chunk-UOCWYLYT.js → chunk-OZXKW5NA.js} +1 -1
  92. package/dist/{chunk-NPDVWFAQ.js → chunk-PLQZJZ2K.js} +1 -1
  93. package/dist/chunk-PRG7NIUU.js +272 -0
  94. package/dist/{chunk-S4SJ4LLY.js → chunk-PSNRB75I.js} +3 -3
  95. package/dist/{chunk-QPQWY5RU.js → chunk-PT5VFY3B.js} +38 -14
  96. package/dist/{chunk-KAO7JL4I.js → chunk-PU5X3P3T.js} +6 -5
  97. package/dist/{chunk-J7Q4AB23.js → chunk-PZ5LAAO3.js} +2 -2
  98. package/dist/{chunk-TOHTKLKE.js → chunk-Q5Q5JLRT.js} +1 -1
  99. package/dist/{chunk-Y3SIQN4J.js → chunk-Q6V342WS.js} +17 -5
  100. package/dist/{chunk-RBVFNUAL.js → chunk-QDPTOIG7.js} +5 -5
  101. package/dist/{chunk-ERT7XDQW.js → chunk-QIITSGI5.js} +1 -1
  102. package/dist/{chunk-NM5V5EKY.js → chunk-QLIZ7SB7.js} +1 -1
  103. package/dist/chunk-QLNLRZ37.js +181 -0
  104. package/dist/{chunk-HHVIE45A.js → chunk-QOLRTPGH.js} +6 -6
  105. package/dist/{chunk-2ZW4NBYX.js → chunk-R4SXMBGF.js} +1 -1
  106. package/dist/chunk-R4U7IIRX.js +178 -0
  107. package/dist/{chunk-BRGRIZQB.js → chunk-RC6PISCK.js} +4 -2
  108. package/dist/{chunk-UIEKW4SG.js → chunk-REKLKGR6.js} +3 -4
  109. package/dist/{chunk-TIIZIAGS.js → chunk-RFGQDIOI.js} +843 -233
  110. package/dist/{chunk-FVTYJUXR.js → chunk-ROFSIFSY.js} +4 -4
  111. package/dist/{chunk-VSAKEMDD.js → chunk-ROH4LYBL.js} +71 -21
  112. package/dist/{chunk-4UVCTLRH.js → chunk-SNDCXT5R.js} +9 -7
  113. package/dist/{chunk-R46N5KR4.js → chunk-SQBCNEJB.js} +2 -1
  114. package/dist/{chunk-66JTY4AN.js → chunk-TDUBTDXS.js} +1 -1
  115. package/dist/{chunk-PGSGJLUR.js → chunk-TMB4YY3J.js} +34 -4
  116. package/dist/{chunk-UZ7EZW3B.js → chunk-TO53KK2P.js} +6 -1
  117. package/dist/{chunk-5KKZXA44.js → chunk-V3ICBS2O.js} +7 -5
  118. package/dist/{chunk-GWQRTA5W.js → chunk-V65EDV6S.js} +3 -3
  119. package/dist/{chunk-VF7IKIRS.js → chunk-VKT3BVRO.js} +35 -11
  120. package/dist/{chunk-L5S32VZJ.js → chunk-VOO65FKC.js} +12 -12
  121. package/dist/{chunk-PVWIBKV2.js → chunk-VQWLASDC.js} +2 -2
  122. package/dist/{chunk-JILEYZ2V.js → chunk-VVL2KKG4.js} +1 -1
  123. package/dist/{chunk-GI5R5B3S.js → chunk-VVZDBUHA.js} +2 -2
  124. package/dist/{chunk-PGBTUGDB.js → chunk-W46OMHOK.js} +23 -27
  125. package/dist/{chunk-XCKNFFKM.js → chunk-WH6E6SHC.js} +2 -4
  126. package/dist/{chunk-H6BT45SN.js → chunk-WPYJAHRP.js} +1 -1
  127. package/dist/{chunk-LJGE43SG.js → chunk-WXGFB2O2.js} +3 -3
  128. package/dist/{chunk-YQMIKX54.js → chunk-XCYGOCMS.js} +102 -52
  129. package/dist/{chunk-BTP2BMWN.js → chunk-XEMCNQQW.js} +15 -15
  130. package/dist/{chunk-NVZ7R4EK.js → chunk-XMUFXJI2.js} +6 -6
  131. package/dist/{chunk-AM42TLSZ.js → chunk-XZGXVN4T.js} +5 -5
  132. package/dist/{chunk-5OTA2PUH.js → chunk-YCIBBVI2.js} +2 -2
  133. package/dist/{chunk-V2NQV7VL.js → chunk-YFIDR7JH.js} +2 -2
  134. package/dist/{chunk-USZLHYEQ.js → chunk-YFWIFKRQ.js} +3 -3
  135. package/dist/{chunk-6XLMTAEX.js → chunk-YIHRLY55.js} +33 -6
  136. package/dist/{chunk-CYRB2JTN.js → chunk-YLKPRT6U.js} +1 -1
  137. package/dist/{chunk-KMU65FYM.js → chunk-YSDSFXQD.js} +1 -1
  138. package/dist/{chunk-ZI6WC24V.js → chunk-ZBJV4KNU.js} +1 -1
  139. package/dist/{chunk-4EX4OKGZ.js → chunk-ZCKVTZHD.js} +41 -19
  140. package/dist/{chunk-7PJBJ2DU.js → chunk-ZMVMGZAJ.js} +1 -1
  141. package/dist/{chunk-6EFCOES2.js → chunk-ZRW4B4KF.js} +48 -14
  142. package/dist/{chunk-A2A2I4Z4.js → chunk-ZTKO2RD4.js} +5 -5
  143. package/dist/collapse-6IGH2B24.js +31 -0
  144. package/dist/{collapse-BSPH3BFM.js → collapse-6X5S2S3G.js} +2 -1
  145. package/dist/collapse-GOWNCVHZ.js +7 -0
  146. package/dist/collapse-HNTPLB2Q.js +11 -0
  147. package/dist/collapse-NUM7DPJA.js +10 -0
  148. package/dist/completion-registry.js +28 -39
  149. package/dist/countdown.js +1 -1
  150. package/dist/dgmo-router-RSYWR5IS.js +101 -0
  151. package/dist/dimensions-KXAI7U2B.js +21 -0
  152. package/dist/editor.js +884 -222
  153. package/dist/{flowchart-parser-J3VWIFWB.js → flowchart-parser-UI5VZNGJ.js} +5 -5
  154. package/dist/{flowchart-renderer-FECH5KK5.js → flowchart-renderer-IYWPKPCF.js} +18 -18
  155. package/dist/fold-at-line-DmSAa1eU.d.ts +11 -0
  156. package/dist/highlight.js +886 -224
  157. package/dist/index.d.ts +89 -6
  158. package/dist/index.js +91 -70
  159. package/dist/{layout-TIBRMWHL.js → layout-6VY3DHYD.js} +6 -6
  160. package/dist/{layout-5SZ5A64I.js → layout-7C2QZCEZ.js} +10 -10
  161. package/dist/{layout-2WESJYRE.js → layout-7E7BNOGO.js} +3 -2
  162. package/dist/layout-BSK374N6.js +11 -0
  163. package/dist/{layout-RH3N46HP.js → layout-FJDBY3WG.js} +6 -5
  164. package/dist/{layout-YBMT74MG.js → layout-G3RVKEC4.js} +10 -10
  165. package/dist/{layout-KV27UW25.js → layout-GC5XX2RH.js} +2 -2
  166. package/dist/{layout-JTIRCKAW.js → layout-R6ULGQJK.js} +6 -6
  167. package/dist/{layout-HFBK5UEG.js → layout-ROI5KVSO.js} +3 -3
  168. package/dist/{layout-3TSVAGWH.js → layout-SPPS225I.js} +3 -3
  169. package/dist/{layout-HF3PMI4H.js → layout-VTGOYGRC.js} +2 -2
  170. package/dist/{layout-EWXHEXNS.js → layout-WBH5IHYK.js} +10 -10
  171. package/dist/layout-WTHBGTH2.js +15 -0
  172. package/dist/layout-ZCCABSV7.js +15 -0
  173. package/dist/{layout-search-AWPJWBKT.js → layout-search-DSIDKKQO.js} +8 -8
  174. package/dist/{legend-constants-55MFBXYF.js → legend-constants-KF3MKWL2.js} +2 -2
  175. package/dist/{parser-NUU3DVW4.js → parser-3PMYAVFL.js} +2 -2
  176. package/dist/{parser-KJPPUN4D.js → parser-5KVFS4RN.js} +2 -2
  177. package/dist/{parser-6TDWUKM5.js → parser-BA43YPIQ.js} +3 -3
  178. package/dist/{parser-EFF22GYO.js → parser-CFAYEWLF.js} +3 -3
  179. package/dist/{parser-A3AN76RQ.js → parser-DRFEX6OX.js} +3 -3
  180. package/dist/{parser-H5OODY5N.js → parser-DWVBRBB2.js} +3 -3
  181. package/dist/{parser-BJ7RJNUM.js → parser-E4B7HJT2.js} +3 -3
  182. package/dist/{parser-5UZV32ZI.js → parser-FWQY3HJX.js} +2 -2
  183. package/dist/{parser-RTWPFKXG.js → parser-GMCXCJSP.js} +3 -3
  184. package/dist/{parser-NL73FSFI.js → parser-IHFHPFL7.js} +3 -3
  185. package/dist/{parser-BTSTKY5G.js → parser-IU6425JW.js} +6 -6
  186. package/dist/{parser-ZRIZFDZY.js → parser-IZYIXDJX.js} +6 -6
  187. package/dist/{parser-4TBSWULQ.js → parser-JQGUTDSX.js} +3 -3
  188. package/dist/{parser-TUAEX6ML.js → parser-JRKPOO2Z.js} +3 -3
  189. package/dist/{parser-KMKVFET2.js → parser-KI2XYB2R.js} +2 -2
  190. package/dist/parser-LDVVBP7S.js +12 -0
  191. package/dist/{parser-YG625J5H.js → parser-MAGFK6OK.js} +4 -4
  192. package/dist/{parser-AR2GON37.js → parser-MH5BDN7X.js} +4 -4
  193. package/dist/{parser-EAQPZX2B.js → parser-MUHFEM4G.js} +3 -3
  194. package/dist/{parser-RCIEKN7Y.js → parser-P375HO7Q.js} +2 -2
  195. package/dist/{parser-GMQJISZ6.js → parser-PYY5BRLQ.js} +2 -2
  196. package/dist/parser-QEMFMVF5.js +12 -0
  197. package/dist/{parser-GDLKUBTO.js → parser-QIPDBT5M.js} +2 -2
  198. package/dist/{parser-BT4NI6JY.js → parser-RNBDDEGL.js} +3 -3
  199. package/dist/{parser-MA7L3XND.js → parser-RSWZGQA7.js} +6 -6
  200. package/dist/{parser-K2DI26SC.js → parser-SGX2PVR5.js} +2 -2
  201. package/dist/{parser-KKF6Y5MM.js → parser-SJUEFKNM.js} +4 -3
  202. package/dist/{parser-3QIFY5IN.js → parser-UMNBPXG2.js} +2 -2
  203. package/dist/{parser-F7NDRPMA.js → parser-WE4VSBBY.js} +3 -3
  204. package/dist/{parser-4Y6PODW6.js → parser-WKEYS7N3.js} +3 -3
  205. package/dist/{parser-KLCSFQ3J.js → parser-WPXUUNA2.js} +3 -3
  206. package/dist/{parser-LTRQASGB.js → parser-XP3RCOTN.js} +3 -3
  207. package/dist/{parser-2IKPQVKX.js → parser-YV4RBHG7.js} +3 -3
  208. package/dist/{parser-3LT3ZUUC.js → parser-YZ3J542U.js} +2 -2
  209. package/dist/{redraw-AHW7EUUF.js → redraw-BZ4GI6IC.js} +6 -4
  210. package/dist/{redraw-STZ4WJAI.js → redraw-LEOXS7C6.js} +3 -3
  211. package/dist/{renderer-IGSHD3OT.js → renderer-2V5NVI3V.js} +16 -16
  212. package/dist/renderer-4PKYVOYL.js +39 -0
  213. package/dist/{renderer-IVHD7ENY.js → renderer-66SCERH7.js} +14 -12
  214. package/dist/renderer-6IAXRZLK.js +85 -0
  215. package/dist/{renderer-XCLARXCK.js → renderer-6O5SV5YE.js} +10 -10
  216. package/dist/{renderer-IXBOT6DU.js → renderer-7OXMSF4R.js} +4 -4
  217. package/dist/{renderer-AM7P4LN7.js → renderer-A36NL2SS.js} +8 -8
  218. package/dist/{renderer-ACQQ2JXA.js → renderer-ASPBBACI.js} +13 -11
  219. package/dist/{renderer-W4MUMXJE.js → renderer-BXVTYE27.js} +7 -6
  220. package/dist/renderer-CC6O6GQK.js +18 -0
  221. package/dist/{renderer-Y47EM337.js → renderer-CNDB4JTZ.js} +17 -17
  222. package/dist/renderer-COV2DXTM.js +41 -0
  223. package/dist/renderer-DXCATVLO.js +30 -0
  224. package/dist/{renderer-JYHA6R2D.js → renderer-E5E3OJ42.js} +12 -11
  225. package/dist/{renderer-DAZWHNLI.js → renderer-E7LC7HCU.js} +5 -5
  226. package/dist/{renderer-RUSQJFFC.js → renderer-F3JYZERE.js} +4 -4
  227. package/dist/{renderer-7OGGV327.js → renderer-FAFSRFGR.js} +9 -9
  228. package/dist/renderer-HIB6LZWZ.js +26 -0
  229. package/dist/renderer-HLDRRFZB.js +28 -0
  230. package/dist/renderer-INQMQPNN.js +22 -0
  231. package/dist/renderer-ITJ67HXO.js +27 -0
  232. package/dist/{renderer-UTEEJDGB.js → renderer-JLOKFKOZ.js} +14 -13
  233. package/dist/{renderer-2LYX6NHN.js → renderer-KOPJ76GS.js} +10 -10
  234. package/dist/{renderer-MWZC7TMD.js → renderer-M2467III.js} +14 -13
  235. package/dist/{renderer-HX6ICPDX.js → renderer-MYKL6VG6.js} +6 -6
  236. package/dist/{renderer-BXD5KVSR.js → renderer-S6L3JR6C.js} +11 -11
  237. package/dist/{renderer-NOYLNVTI.js → renderer-SYWVZ4CY.js} +3 -3
  238. package/dist/renderer-TCTZZ5Y6.js +32 -0
  239. package/dist/{renderer-QTPWRRJ7.js → renderer-UIHCYXBY.js} +12 -12
  240. package/dist/{renderer-36446HSH.js → renderer-WIBVOPRC.js} +6 -4
  241. package/dist/{renderer-2QPHDBZY.js → renderer-XMJ6XZGL.js} +12 -11
  242. package/dist/{renderer-TINHO2IO.js → renderer-ZTHXOBXW.js} +8 -8
  243. package/dist/{renderer-radial-WFUX3Z3C.js → renderer-radial-FC25BDCZ.js} +8 -8
  244. package/dist/{state-parser-PMNHLHLE.js → state-parser-2PQRH5JE.js} +6 -6
  245. package/dist/state-renderer-YP6HWLJR.js +43 -0
  246. package/dist/{themes-DzIH3Hjv.d.ts → themes-DoLdhUXV.d.ts} +1 -1
  247. package/docs/ai-integration.md +4 -4
  248. package/docs/language-reference.md +154 -104
  249. package/gallery/fixtures/swot-relabel.dgmo +19 -0
  250. package/gallery/fixtures/swot-tags.dgmo +16 -0
  251. package/gallery/fixtures/swot.dgmo +13 -0
  252. package/gallery/fixtures/whiteboard.dgmo +1 -0
  253. package/package.json +1 -1
  254. package/dist/chunk-6BQSDF77.js +0 -734
  255. package/dist/chunk-NWSPPGIE.js +0 -60
  256. package/dist/chunk-R2K5L4UA.js +0 -49
  257. package/dist/chunk-VBMRZCMQ.js +0 -1465
  258. package/dist/chunk-WZBZXZ6T.js +0 -636
  259. package/dist/collapse-TCVK3RPO.js +0 -8
  260. package/dist/dgmo-router-6YLKM6WU.js +0 -101
  261. package/dist/dimensions-DS6FWLRY.js +0 -21
  262. package/dist/layout-D4L44NRG.js +0 -11
  263. package/dist/layout-MXHR3P35.js +0 -15
  264. package/dist/layout-ND26WVX2.js +0 -15
  265. package/dist/layout-VDCJOZSH.js +0 -11
  266. package/dist/parser-PEZ7RN43.js +0 -14
  267. package/dist/parser-YHDGKPZI.js +0 -14
  268. package/dist/renderer-4VGO27EE.js +0 -41
  269. package/dist/renderer-6BDK47V6.js +0 -30
  270. package/dist/renderer-ISQJ2ELA.js +0 -25
  271. package/dist/renderer-KJ3V5BYP.js +0 -26
  272. package/dist/renderer-O6RP52CQ.js +0 -22
  273. package/dist/renderer-P3WR7TKD.js +0 -39
  274. package/dist/renderer-UGW4N2W5.js +0 -28
  275. package/dist/renderer-WPN2SXGT.js +0 -29
  276. package/dist/renderer-XDX6S7OV.js +0 -30
  277. package/dist/renderer-ZV6KCLCL.js +0 -85
  278. package/dist/state-renderer-JQ5DS66J.js +0 -42
  279. package/gallery/fixtures/sketch.dgmo +0 -22
@@ -98,7 +98,7 @@ Valid markup is the floor, not the goal. A good diagram reads at a glance. Apply
98
98
  - **Always title it.** Every diagram gets a short title on the type-declaration line (`flowchart Checkout Flow`, `sequence Checkout`, `boxes-and-lines Service Map`) so it is self-describing — never leave the bare type keyword alone. Infer a fitting title from the request when the user gives none.
99
99
  <!-- TITLE end -->
100
100
  <!-- CATEGORIZE start -->
101
- - **Categorize and color — by default, not only when obvious.** Before drawing, find the axis that sorts the items into kinds and color by it: layer (frontend / backend / data), role (client / service / datastore), trust zone (internal / external / third-party), status (done / active / blocked), owner/team, or read-path vs write-path. Almost every diagram has such an axis — actively look for one rather than leaving everything monochrome. Express it with a **tag group**, never ad-hoc per-node colors: declare `tag <Axis> as t` (the name is a single word — `tag TrustZone as tz` — or quote a multi-word name: `tag "Trust Zone" as tz`), indent the category values (a trailing color is optional — bare values auto-pick a palette color), set `active-tag <Axis>` in the header — after the tag group and before the first element, because a type such as c4 refuses it after content — then assign each item `Node t: <Category>` (see the tag-group syntax in the per-type section below). **Bracket, block, body, event-line, family, sketch and whiteboard** take the tag group but no `active-tag` line — declare the group and stop there; on event-line, family and sketch the line would be drawn as an element. **Class, flowchart, wireframe, raci, cycle, pyramid, ring, sankey, tech-radar, venn, version-control, wordcloud, arc, bar, clock, countdown, funnel, function, goal, heatmap, line, pie, polar-area, quadrant, radar, scatter and slope** take no tag group at all — skip this rule for them. Most report the lines; cycle, pyramid, ring, sankey, venn, version-control and wordcloud read them as content, and flowchart and tech-radar drop them without a word. Only the 11 named palette colors exist, and they re-resolve per palette/theme. Color the grouping so the categories — and the boundaries between them — read at a glance. **Buckets, not name tags — never 1:1.** A tag group must have _fewer_ values than it has members: each color should bucket two or more items so the palette compresses the diagram into a few meaningful kinds (aim for ~2–4 categories, and keep distinct colors well under half the item count). If you find yourself giving nearly every item its own value, you've enumerated, not categorized — merge the singletons up a level until each color groups at least two (a `cache` and a `database` are both `datastore`; a caller and a gateway are both `client`; two microservices are both `service`). One color per item is the same visual noise as random colors — the grouping only earns its place when a color means "these belong together." Leave items uncolored only when they genuinely form a single undifferentiated kind, or the user asked for no color.
101
+ - **Categorize and color — by default, not only when obvious.** Before drawing, find the axis that sorts the items into kinds and color by it: layer (frontend / backend / data), role (client / service / datastore), trust zone (internal / external / third-party), status (done / active / blocked), owner/team, or read-path vs write-path. Almost every diagram has such an axis — actively look for one rather than leaving everything monochrome. Express it with a **tag group**, never ad-hoc per-node colors: declare `tag <Axis> as t` (the name is a single word — `tag TrustZone as tz` — or quote a multi-word name: `tag "Trust Zone" as tz`), indent the category values (a trailing color is optional — bare values auto-pick a palette color), set `active-tag <Axis>` in the header — after the tag group and before the first element, because a type such as c4 refuses it after content — then assign each item `Node t: <Category>` (see the tag-group syntax in the per-type section below). **Bracket, block, body, event-line and whiteboard** take the tag group but no `active-tag` line — declare the group and stop there; on event-line the line would be drawn as an element. **Class, flowchart, wireframe, raci, cycle, pyramid, ring, sankey, tech-radar, venn, version-control, wordcloud, arc, bar, clock, countdown, funnel, function, goal, heatmap, line, pie, polar-area, quadrant, radar, scatter and slope** take no tag group at all — skip this rule for them. Most report the lines; cycle, pyramid, ring, sankey, venn, version-control and wordcloud read them as content, and flowchart and tech-radar drop them without a word. Only the 11 named palette colors exist, and they re-resolve per palette/theme. Color the grouping so the categories — and the boundaries between them — read at a glance. **Buckets, not name tags — never 1:1.** A tag group must have _fewer_ values than it has members: each color should bucket two or more items so the palette compresses the diagram into a few meaningful kinds (aim for ~2–4 categories, and keep distinct colors well under half the item count). If you find yourself giving nearly every item its own value, you've enumerated, not categorized — merge the singletons up a level until each color groups at least two (a `cache` and a `database` are both `datastore`; a caller and a gateway are both `client`; two microservices are both `service`). One color per item is the same visual noise as random colors — the grouping only earns its place when a color means "these belong together." Leave items uncolored only when they genuinely form a single undifferentiated kind, or the user asked for no color.
102
102
  <!-- CATEGORIZE end -->
103
103
  - **Keep labels short.** A few words per node. Move detail into notes or metadata, never a full sentence inside a label.
104
104
  - **Let the defaults show.** Don't add `no-*` opt-outs unless the user asked to hide or disable something — they strip helpful labels, values, and color.
@@ -125,6 +125,7 @@ Valid markup is the floor, not the goal. A good diagram reads at a glance. Apply
125
125
  | `family` | family tree / genealogy: unions (couples), children, remarriage, adoption, GEDCOM-style metadata |
126
126
  | `bracket` | single-elimination tournament bracket: winners auto-advance; seed the field for a day-0 skeleton or list results casually; two sides mirror to a championship |
127
127
  | `kanban` | task-board columns |
128
+ | `swot` | SWOT analysis: strengths, weaknesses, opportunities, threats in four fixed panels on helpful/harmful and internal/external axes |
128
129
  | `gantt` | project scheduling with task dependencies and milestones |
129
130
  | `pert` | project network with three-point estimates and critical path |
130
131
  | `swimlane` | cross-functional process flow with lanes, phases and gateways (BPMN-style) |
@@ -141,7 +142,6 @@ Valid markup is the floor, not the goal. A good diagram reads at a glance. Apply
141
142
  | `ring` | concentric rings of nested categories |
142
143
  | `treemap` | nested rectangles sized by value (budgets, disk usage, portfolios) |
143
144
  | `block` | author-controlled grid of nested, collapsible blocks (system / architecture layouts) |
144
- | `sketch` | GUI-first free-placement canvas: uniform shapes on a snap grid, arrows, tags (markup is app-generated) |
145
145
  | `whiteboard` | free-form infinite canvas: shapes, sticky notes, free arrows, text, images and freehand ink at pixel positions (canvas-drawn; AI writes all but ink) |
146
146
  | `goal` | single progress-toward-a-target value (`now` vs `target`) as a progress bar, thermometer, or gauge — KPIs, fundraising, quotas |
147
147
  | `countdown` | live "N days until X" that ticks every second and is accurate on every load — trip dates, launches, deadlines; the only dynamic chart type |
@@ -215,7 +215,7 @@ tag GroupName as <alias>
215
215
  - Must appear before diagram content
216
216
  - Bare shorthand is not an alias (TD-18): `tag Priority p` declares a group _named_ "Priority p" — no alias registers, so `p:` assignments silently miss. The parser warns on this shape (spaced name, no alias, alias-shaped trailing word), suggesting `tag Priority as p` or a quoted name
217
217
 
218
- **Diagram types that support tags**: the tag model is near-universal across the structural types — sequence, infra, org, c4, er, kanban, gantt, sitemap, timeline, boxes-and-lines, state (§5.7), pert, swimlane, mindmap, journey-map, event-line, treemap, map, block, sketch, bracket, family and whiteboard all accept `tag <Group> as <alias>` blocks (a whiteboard's names its colours — §24Ea). Check the per-type Options section for the exact directive set; if a type draws a tag legend, it takes tags. **Flowchart, wireframe, raci and class take no tags** — a `tag` block or `active-tag` on any of them is ignored with a warning, because what an element looks like is fixed by what it is (a flowchart's shape, a wireframe's state keywords, a class's trailing colour word) or by the roles (raci).
218
+ **Diagram types that support tags**: the tag model is near-universal across the structural types — sequence, infra, org, c4, er, kanban, gantt, sitemap, timeline, boxes-and-lines, state (§5.7), pert, swimlane, mindmap, journey-map, event-line, treemap, map, block, bracket, family, swot and whiteboard all accept `tag <Group> as <alias>` blocks (a whiteboard's names its colours — §24Ea). Check the per-type Options section for the exact directive set; if a type draws a tag legend, it takes tags. **Flowchart, wireframe, raci and class take no tags** — a `tag` block or `active-tag` on any of them is ignored with a warning, because what an element looks like is fixed by what it is (a flowchart's shape, a wireframe's state keywords, a class's trailing colour word) or by the roles (raci).
219
219
 
220
220
  ### 1.4 Same-Line Metadata
221
221
 
@@ -285,7 +285,7 @@ Two narrow exceptions accept same-line-metadata-only color: **cycle edges** (no
285
285
  - Indented content below belongs to the group
286
286
  - **A tag value on the group line colors the group's own frame**, and cascades
287
287
  to its children: `[Backend] s: Red`. Supported on boxes-and-lines, infra, c4,
288
- state, pert, kanban, gantt, sequence, org, block and sketch. Two rules: a
288
+ state, pert, kanban, gantt, sequence, org and block. Two rules: a
289
289
  group never picks up the tag group's first-value default (an untagged group
290
290
  stays neutral grey), and a value the tag group does not recognize leaves it
291
291
  neutral rather than painting a fallback shade.
@@ -431,6 +431,25 @@ A block must have every key, hex only, text readable on its fills, and a name th
431
431
 
432
432
  **Who wins**, highest first: an explicit choice where the diagram is shown (a fence `palette=` attribute, `--palette` on the command line), then the file's palette, then the site's or app's own setting, then Slate. `theme` is retired — the mode word on the palette line does its job.
433
433
 
434
+ ### 1.11 Line Breaks in Description and Note Bodies
435
+
436
+ A line break in the source is **not** a line break in the drawing. Consecutive body lines join into one paragraph and re-wrap to fit the card, so you can break prose wherever is comfortable in the editor. Two things keep a break:
437
+
438
+ - **A blank line** starts a new paragraph, with a gap above it.
439
+ - **A trailing `\`** breaks the line without starting a new paragraph (markdown's hard break).
440
+
441
+ A `- ` line always starts its own bullet. A plain line straight after a bullet continues that bullet; a blank line returns to prose.
442
+
443
+ ```
444
+ 2026-09-28 67.10.0 deployed
445
+ *9:00 AM* \
446
+ Existing refresh code already deletes opted-out cards.
447
+ ```
448
+
449
+ Without the `\`, the time and the sentence join into one line: `9:00 AM Existing refresh code…`.
450
+
451
+ This applies to event-line descriptions, pyramid, ring and cycle descriptions, boxes-and-lines descriptions, and multi-line note bodies (sequence, flowchart, state, class, ER, journey-map, countdown).
452
+
434
453
  ---
435
454
 
436
455
  ## 2. Universal Name Handling
@@ -727,6 +746,8 @@ tag Security as sec
727
746
 
728
747
  Trailing `==` is optional.
729
748
 
749
+ - **Fold a section** with a bare `collapsed` flag (or `collapsed: true`) after the divider: `== Checkout == collapsed`. The messages under it fold away until the next divider. `== collapsed ==` is a section named "collapsed".
750
+
730
751
  ### 2.5 Notes
731
752
 
732
753
  ```
@@ -753,6 +774,8 @@ Content formatting:
753
774
  - Inline markdown: `**bold**`, `*italic*`, `` `code` ``
754
775
  - Links: `[text](url)` and bare URLs (auto-truncated in display)
755
776
  - The note ends where the indentation does — there is **no `end` terminator** (a bare `end` line is rejected).
777
+ - Body lines join into one paragraph — a blank line or a trailing `\` keeps a break (§1.11).
778
+ - **Fold a multi-line note** with a bare `collapsed` flag (or `collapsed: true`) at the end of its opening line: `note right of API collapsed`. It draws only the first body line, with the collapse bar. The flag counts only on a line followed by an indented body, so `note right of DB collapsed` with no body is a note that reads "collapsed".
756
779
 
757
780
  ### 2.6 Structural Blocks
758
781
 
@@ -772,6 +795,7 @@ parallel label
772
795
  ```
773
796
 
774
797
  - `parallel` requires a label
798
+ - `else` is bare. A second condition is `else if <condition>`; `else <label>` means the same and draws as `else if <label>`
775
799
  - Blocks nest via indentation
776
800
  - **No `end`/terminator keyword** — a block closes by dedenting (like multi-line notes). `end` and `activate`/`deactivate` are not dgmo syntax (a bare `end` line is rejected); activation is controlled by the `activations` option (§2.7), not per-message keywords.
777
801
  - **Tags apply to participants, not messages** — there is no per-message tag/color. Color a participant by category with `<Participant> <tagAlias>: <Value>` after declaring a `tag <Name> as <alias>` group (§1.3). Message text is just the arrow label.
@@ -783,6 +807,27 @@ parallel label
783
807
  - `collapse-notes` / `no-collapse-notes`
784
808
  - `active-tag GroupName`
785
809
 
810
+ Options go in the header. Put every option line — `active-tag` included — after the `tag` groups and before the first participant declaration, `[Group]`, divider or message. An option after any of those is an error (`Options like 'active-tag Zone' must appear before the first message or declaration`).
811
+
812
+ ```dgmo
813
+ sequence Checkout
814
+ tag Zone as z
815
+ Internal blue
816
+ External orange
817
+ active-tag Zone
818
+
819
+ Shop is a service z: Internal
820
+ Bank is a service z: External
821
+
822
+ Shop -charge-> Bank
823
+ if approved
824
+ Bank -receipt-> Shop
825
+ else if declined
826
+ Bank -decline code-> Shop
827
+ else
828
+ Bank -timeout-> Shop
829
+ ```
830
+
786
831
  ---
787
832
 
788
833
  ## 4. Infrastructure Diagrams
@@ -955,7 +1000,7 @@ API Gateway
955
1000
 
956
1001
  <!-- TIPS start -->
957
1002
 
958
- **Styling tips:** write every connection as `Source -> Target` (or a single-line chain like `(Start) -> [Collect info] -> <Eligible?>`); write each connection on its own line. Every decision `<Question?>` MUST have at least two outgoing branches — usually `-yes->`/`-no->`, but use specific labels when the choices are not binary (e.g. `-retirement->`, `-disability->`, `-survivor->`); a decision with only one branch is invalid. Begin at exactly one start terminal `(Start)` and make every path terminate at a terminal node (`(Approved)`, `(Denied)`, `(End)`). Every node MUST connect to the rest of the graph: if a node cannot be traced from the start forward to a terminal, it is invalid — remove it, never leave it floating. Flowcharts have NO tag groups, node metadata, or manual node colors — do NOT write `tag … as …`, a `s: value` suffix, or a trailing color word; node colors are assigned automatically by shape (start terminal green, end terminals red, processes blue, decisions yellow). Just pick the right shape and let color follow. Label every decision edge so branches read unambiguously; keep each node to a short action phrase and phrase every decision as a question.
1003
+ **Styling tips:** write every connection as `Source -> Target` (or a single-line chain like `(Start) -> [Collect info] -> <Eligible?>`); write each connection on its own line. Every decision `<Question?>` MUST have at least two outgoing branches — usually `-yes->`/`-no->`, but use specific labels when the choices are not binary (e.g. `-retirement->`, `-disability->`, `-survivor->`); a decision with only one branch is invalid. Begin at exactly one start terminal `(Start)` and make every path terminate at a terminal node (`(Approved)`, `(Denied)`, `(End)`). Nothing points back at the start node: no arrow may end at `(Start)`, so a loop returns to a step after it (`-retry-> [Collect info]`), never to the start. Every node MUST connect to the rest of the graph: if a node cannot be traced from the start forward to a terminal, it is invalid — remove it, never leave it floating. Flowcharts have NO tag groups, node metadata, or manual node colors — do NOT write `tag … as …`, a `s: value` suffix, or a trailing color word; node colors are assigned automatically by shape (start terminal green, end terminals red, processes blue, decisions yellow). Just pick the right shape and let color follow. Label every decision edge so branches read unambiguously; keep each node to a short action phrase and phrase every decision as a question.
959
1004
 
960
1005
  <!-- TIPS end -->
961
1006
 
@@ -1020,13 +1065,16 @@ Bracket syntax only.
1020
1065
 
1021
1066
  ### 4.7 Notes (Nodes)
1022
1067
 
1023
- Attach an annotation to a node with `note <NodeId> text` (quote the id
1024
- for multi-word labels). The note renders as a folded-corner box beside
1025
- the node, expanded at rest.
1068
+ Attach an annotation to a node with `note NodeLabel text` (quote the
1069
+ label when it has more than one word). A note names the node by its
1070
+ label, without the shape's brackets: the decision `<Email exists?>` takes
1071
+ `note "Email exists?" …`, never `note <Email exists?> …`. The note renders
1072
+ as a folded-corner box beside the node, expanded at rest.
1026
1073
 
1027
1074
  ```
1028
1075
  note Validate checks the payload schema
1029
1076
  note "Read Map" the map is half-burned
1077
+ note "Email exists?" checks the users table
1030
1078
  ```
1031
1079
 
1032
1080
  Indent lines below the heading for a multi-line body (bullets + inline
@@ -1591,6 +1639,8 @@ All permutations supported: node→group, group→node, group→group. Brackets
1591
1639
  Pricing Auth: Public
1592
1640
  ```
1593
1641
 
1642
+ **Collapse:** a bare `collapsed` flag at the end of a page line or a `[Container]` line (`Products collapsed`, `[Shop] collapsed`; legacy `collapsed: true`) starts it folded. Every render path draws the fold with the collapse bar and a hidden-page count. Only a page with children or a container with pages folds.
1643
+
1594
1644
  ### 11.5 Node Descriptions
1595
1645
 
1596
1646
  ```
@@ -1964,6 +2014,7 @@ Henry Turner + Carina Smyth m: 1751
1964
2014
  - **Unknown/private person:** a bare `?` renders a faint, solid-bordered, name-only placeholder card; each `?` is a distinct person.
1965
2015
  - **`generations`** (option): draws a left gutter of Roman-numeral generation labels (`Gen I`, `Gen II`, …) plus subtle zebra shading behind alternating generations.
1966
2016
  - **`highlight <name>`** (directive): dims everyone outside that person's bloodline (ancestors + descendants + spouses stay lit).
2017
+ - **`active-tag <Group>`** (option): picks which tag group colours the cards when there are two or more (the built-in Sex group counts); `active-tag none` turns colouring off.
1967
2018
  - **Sex → color:** `sex: m` → blue, `sex: f` → purple, unset → gray (25% tint). An explicit `tag`/inline color overrides the sex color.
1968
2019
  - The union split cuts `m:` metadata first, THEN splits `+` within the name region — so a `+` inside a quoted name (`"Anne + Jack"`) or a metadata value never mis-splits. Per-side `key: value` metadata on a union line is not supported — declare the person standalone.
1969
2020
 
@@ -2103,6 +2154,8 @@ Nested groups (max depth 2):
2103
2154
 
2104
2155
  Group metadata cascades to children (node metadata overrides). Nodes already declared above can be referenced inside groups to assign membership.
2105
2156
 
2157
+ A bare `collapsed` flag on the group line (`[AWS] collapsed`, or `[AWS] color: blue, collapsed`; legacy `collapsed: true`) starts the group folded: it draws as one pill with a member count and the collapse bar, and its edges end on the pill.
2158
+
2106
2159
  ### 13.5 Group-Targeted Edges
2107
2160
 
2108
2161
  Node-to-group and group-to-group edges use bracket syntax `[Group Name]`:
@@ -2312,6 +2365,8 @@ marker
2312
2365
  1718-07 Woodes Rogers arrives
2313
2366
  ```
2314
2367
 
2368
+ A bare `collapsed` flag on the lane line (`[Royal Navy] collapsed`, `[Royal Navy] blue collapsed`; legacy `collapsed: true`) starts the lane folded to one summary row with the collapse bar. Lanes fold only in the grouped swimlane layout.
2369
+
2315
2370
  ### 14.6 Options (Space-Separated, NO Colon)
2316
2371
 
2317
2372
  ```
@@ -2740,7 +2795,7 @@ tag Genre as g
2740
2795
  - **Date** — optional, ISO only (`YYYY`, `YYYY-MM`, `YYYY-MM-DD`, `+HH:MM` / `+HH:MM:SS`, plus `YYYY BCE`/`BC`/`CE`/`AD`), formatted for reading as the card subtitle (`2008-09-02` → `Sep 2, 2008`). No `date:` key; no `M/D/YYYY`.
2741
2796
  - **`TBD` (future events)** — write the literal `TBD` (case-insensitive) in the date slot for a **not-yet-scheduled** event: `TBD Console Port t: Engine`. Its caption reads `TBD` and it draws a **hollow dot + faded leader** (a faded shelf edge in `no-box`) so it reads as pending. To scale, its position is **inferred from its source-order dated neighbors**: a `TBD` followed by a dated event is interpolated into that gap; a **trailing** `TBD` (nothing dated after it) parks past the last real date and the spine **trails off dashed** — the open horizon. `TBD`s never trip the bad-date / out-of-order warnings.
2742
2797
  - **Tag** — trailing same-line metadata (`g: Pop`), like timeline; colors the dot, leader, and card.
2743
- - **Description** — bare indented body lines (like `pyramid`/`ring`); `- ` makes a bullet; inline markdown (`**bold**`, `*italic*`, `` `code` ``) supported.
2798
+ - **Description** — bare indented body lines (like `pyramid`/`ring`); `- ` makes a bullet; inline markdown (`**bold**`, `*italic*`, `` `code` ``) supported. Lines join into one paragraph — a blank line or a trailing `\` keeps a break (§1.11).
2744
2799
 
2745
2800
  #### Eras
2746
2801
 
@@ -3327,7 +3382,7 @@ Act red
3327
3382
 
3328
3383
  ### Descriptions
3329
3384
 
3330
- Indented lines under a node become the description. Inline markdown is supported (`**bold**`, `*italic*`, `` `code` ``, `[links](url)`), and `- item` renders as `• item`.
3385
+ Indented lines under a node become the description. Inline markdown is supported (`**bold**`, `*italic*`, `` `code` ``, `[links](url)`), and `- item` renders as `• item`. Lines join into one paragraph — a blank line or a trailing `\` keeps a break (§1.11).
3331
3386
 
3332
3387
  ```
3333
3388
  Observe
@@ -3463,6 +3518,8 @@ persona Captain Mara
3463
3518
 
3464
3519
  Phases are `[Bracket]` headers at indent 0. Steps live indented under them. Phases are optional — omit them for a continuous flat flow.
3465
3520
 
3521
+ A bare `collapsed` flag on the phase line (`[Research] collapsed`; legacy `collapsed: true`) starts the phase folded to a narrow column with the collapse bar. Nothing else may follow a phase header.
3522
+
3466
3523
  ```
3467
3524
  [Research]
3468
3525
  Compare specs score: 4
@@ -3610,7 +3667,7 @@ Physiological orange
3610
3667
 
3611
3668
  ### Descriptions
3612
3669
 
3613
- Indented lines under a layer are description text. Markdown inline formatting (`**bold**`, `*italic*`, `` `code` ``, `[links](url)`) is supported. Bullets written as `- item` render as `• item`.
3670
+ Indented lines under a layer are description text. Markdown inline formatting (`**bold**`, `*italic*`, `` `code` ``, `[links](url)`) is supported. Bullets written as `- item` render as `• item`. Lines join into one paragraph — a blank line or a trailing `\` keeps a break (§1.11).
3614
3671
 
3615
3672
  ### Directives
3616
3673
 
@@ -3679,7 +3736,7 @@ The Open Sea cyan
3679
3736
 
3680
3737
  ### Descriptions
3681
3738
 
3682
- Indented lines under a layer are description text. Markdown inline formatting is supported. Bullets written as `- item` render as `• item`. Descriptions appear in a stacked side list with colored accent bars.
3739
+ Indented lines under a layer are description text. Markdown inline formatting is supported. Bullets written as `- item` render as `• item`. Lines join into one paragraph — a blank line or a trailing `\` keeps a break (§1.11). Descriptions appear in a stacked side list with colored accent bars.
3683
3740
 
3684
3741
  ### Directives
3685
3742
 
@@ -3903,86 +3960,6 @@ In the desktop app a block diagram is interactive: click a container header to c
3903
3960
 
3904
3961
  ---
3905
3962
 
3906
- ## 24E. Sketch Diagrams
3907
-
3908
- <!-- TYPE:sketch -->
3909
-
3910
- **Beta — expect rough edges and syntax changes.**
3911
-
3912
- <!-- TIPS start -->
3913
-
3914
- **Styling tips:** Sketch is a GUI-authored format — the desktop and web canvas editors generate this markup, so hand-writing it is the exception. If you generate it anyway: keep it SMALL (sketches read best under ~15 shapes), and either omit `at:` everywhere (shapes flow into rows) or use integer half-slot coordinates with shapes **at least 3 half-slots apart** on one axis (a footprint spans 2 half-units and the mandatory gap adds 1 more, so each shape claims a 3×3 block; 2 apart overlaps). A `[Box]` may hold another `[Box]`, to **depth 2** — a third level is refused and its shapes join the box above it. Alias any shape an edge references (`as con`). Never write `size:`, `shape:`, colors, or fonts — every shape is the same plain card. In sketch, `~` dashed means secondary emphasis, NOT async. Categorize with a tag group — kind-of-thing is meaning, and meaning lives in tags. Reach for `sketch` when the drawing itself is the content; reach for `boxes-and-lines` when topology should auto-lay-out.
3915
-
3916
- <!-- TIPS end -->
3917
-
3918
- A **GUI-first constrained canvas**: uniformly-sized shapes placed freely on a snap grid, arrows between them, meaning through tags. The renderer owns all styling — authors own placement, connection, naming, and tags. Every shape has ONE universal footprint (no resizing); text always fits (shrink → smart-wrap → `…`). Pick `sketch` when the spatial arrangement is yours to decide; pick `boxes-and-lines` when topology should auto-lay-out.
3919
-
3920
- ### Declaration
3921
-
3922
- ```
3923
- sketch [Title]
3924
- ```
3925
-
3926
- ### Example
3927
-
3928
- ```
3929
- sketch Plunder Pipeline
3930
-
3931
- tag Crew
3932
- Deck
3933
- Hold
3934
-
3935
- Spyglass Feed at: 0 0, crew: Deck
3936
- -sightings-> con
3937
- Captain's Console as con at: 2 0, crew: Deck
3938
- -orders-> bq
3939
- Divvy Service as dvy at: 4 0, crew: Hold
3940
-
3941
- [Below Decks] at: 2 2, crew: Hold
3942
- Booty Queue as bq at: 0 0
3943
- ~haul~> dvy
3944
- Ship Ledger as ledger at: 2 0
3945
-
3946
- [Armory] as armory at: 0 2, collapsed
3947
- Powder Store at: 0 0
3948
- ```
3949
-
3950
- ### Shapes
3951
-
3952
- One top-level line = one shape — a **bare name** plus same-line `key: value` metadata. Every shape is the same plain card — there are no shape kinds, and a `shape:` clause is an error (`E_SKETCH_SHAPE_UNSUPPORTED`); the shape still draws, without it. Duplicate labels are legal **when aliased** (`Cache as c1` / `Cache as c2`); unaliased duplicates merge (standard dgmo semantics).
3953
-
3954
- ### Coordinates — `at: C R`
3955
-
3956
- Integer **half-slot steps** (a slot = one footprint + the mandatory gap), origin-normalized; box children are relative to the box origin. `at:` is **optional** — un-positioned shapes flow-place in rows below existing content. Hand-authored overlap auto-resolves with a warning; nothing renders broken.
3957
-
3958
- ### Lines
3959
-
3960
- Indented under the source shape, targeting an alias (or an unambiguous bare label). Six forms: `-label->` one head · `<-label->` both heads · `-label-` no heads, plus `~` dashed twins. Unlabeled headless lines are `--` / `~~`. No left-pointing arrows — write `B -> A`, never `A <- B`. A tag on the edge tail (`crew: Hold`) colors the line. Both ends must attach.
3961
-
3962
- ### Boxes
3963
-
3964
- `[Brackets]` = a **box** (labeled group frame) — the only bracket meaning in sketch. Label mandatory; one level only (no nested boxes); taggable (frame tints, cascades to children, individual overrides); bare `collapsed` folds it to a card with the collapse-bar and edges re-target the card. Interactive fold/unfold in the app; static export renders the authored state.
3965
-
3966
- ### Node Metadata
3967
-
3968
- | Key | Type | Default | Description |
3969
- | ----------- | -------------- | ----------------------- | -------------------------------------------------------- |
3970
- | `at` | `C R` integers | flow-placed | Half-slot position (origin-normalized) |
3971
- | `collapsed` | flag | — | Box only — start folded (collapse-bar) |
3972
- | `<tag>` | declared value | untagged (neutral gray) | Tag value (cascades from box; edge tails color the line) |
3973
-
3974
- ### Directives
3975
-
3976
- | Directive | Effect |
3977
- | ----------- | -------------------- |
3978
- | `no-legend` | Hide the tag legend. |
3979
-
3980
- ### Interactivity vs export
3981
-
3982
- In the desktop and web app a sketch opens in the **canvas editor** (the code pane hides behind a toggle); boxes fold/unfold interactively. Static SVG / PNG export renders the authored state — the same interactive-vs-export split the map, treemap, and block charts use.
3983
-
3984
- ---
3985
-
3986
3963
  ## 24Ea. Whiteboard Diagrams
3987
3964
 
3988
3965
  <!-- TYPE:whiteboard -->
@@ -3991,11 +3968,11 @@ In the desktop and web app a sketch opens in the **canvas editor** (the code pan
3991
3968
 
3992
3969
  <!-- TIPS start -->
3993
3970
 
3994
- **Styling tips:** Whiteboard is a canvas-first format: people draw on it, and pen strokes (`ink` lines) only ever come from drawing — never write an `ink` line. Generate the readable parts only: `rectangle`, `ellipse`, `database`, `queue` with a label, `at: X Y` (top-left, integer pixels) and `size: W H`; `arrow` with `from: X Y, to: X Y` and an optional label, or `line` the same way for a connection with no head; add `style: dashed` to an arrow or line for a tentative or optional link; `heads: both` for a two-way arrow; `bend: 40` (px, sign picks the side) to curve a link around something in its way; `text` at a point; `note` with `at: X Y` for a sticky-note comment or open question (a 160 × 99 yellow card by default; `size:` and `color:` are optional). A shape label or a note wraps to its width on its own, so never break a sentence by hand to fit; for separate lines (a heading, a list), drop the inline label and indent each line two spaces under the element line. Leave ~40px between shapes and keep boards small (under ~15 elements). Colours are palette names (red, green, blue, teal, purple, orange, yellow, cyan, gray); leave colour off for the default ink. An arrow or line end placed inside a shape or note attaches to it and is drawn to its border, so point ends at shape centres. `no-notes` hides every note when the board is shown. Reach for `whiteboard` for a loose drawing someone will scribble over; reach for `sketch` for tagged shapes on a grid, and `boxes-and-lines` when topology should auto-lay-out.
3971
+ **Styling tips:** Whiteboard is a canvas-first format: people draw on it, and pen strokes (`ink` lines) only ever come from drawing — never write an `ink` line. Generate the readable parts only: `rectangle`, `ellipse`, `database`, `queue`, `file` (a page with a wavy bottom, for a document or file) with a label, `at: X Y` (top-left, integer pixels) and `size: W H`; `arrow` with `from: X Y, to: X Y` and an optional label, or `line` the same way for a connection with no head; add `style: dashed` to an arrow or line for a tentative or optional link; `heads: both` for a two-way arrow; `bend: 40` (px, sign picks the side) to curve a link around something in its way; `text` at a point; `note` with `at: X Y` for a sticky-note comment or open question (a 160 × 99 yellow card by default; `size:` and `color:` are optional). A shape label or a note wraps to its width on its own, so never break a sentence by hand to fit; for separate lines (a heading, a list), drop the inline label and indent each line two spaces under the element line. Leave ~40px between shapes and keep boards small (under ~15 elements). Colours are palette names (red, green, blue, teal, purple, orange, yellow, cyan, gray); leave colour off for the default ink. An arrow or line end placed inside a shape or note attaches to it and is drawn to its border, so point ends at shape centres. `no-notes` hides every note when the board is shown. Reach for `whiteboard` for a loose drawing someone will scribble over; reach for `boxes-and-lines` when topology should auto-lay-out.
3995
3972
 
3996
3973
  <!-- TIPS end -->
3997
3974
 
3998
- A **free-form whiteboard** on an infinite canvas: rectangles, ellipses, databases, queues, sticky notes, free arrows and lines, text, pasted images and freehand ink, each at absolute pixel positions. Shapes are clean vector outlines; only ink looks hand-made. The export is cropped to the drawing plus a margin. Elements draw in kind bands, bottom to top: images; shapes, sticky notes, arrows and lines (`rectangle`, `ellipse`, `database`, `queue`, `note`, `arrow`, `line`); text; ink. A band always draws above the one before it. Inside a band, file order decides: a later line draws on top, so shapes, notes and arrows stack either way — except that an arrow or line always draws just above the latest shape or note it is attached to. No syntax sets the band.
3975
+ A **free-form whiteboard** on an infinite canvas: rectangles, ellipses, databases, queues, files, sticky notes, free arrows and lines, text, pasted images and freehand ink, each at absolute pixel positions. Shapes are clean vector outlines; only ink looks hand-made. The export is cropped to the drawing plus a margin. Elements draw in kind bands, bottom to top: images; shapes, sticky notes, arrows and lines (`rectangle`, `ellipse`, `database`, `queue`, `file`, `note`, `arrow`, `line`); text; ink. A band always draws above the one before it. Inside a band, file order decides: a later line draws on top, so shapes, notes and arrows stack either way — except that an arrow or line always draws just above the latest shape or note it is attached to. No syntax sets the band.
3999
3976
 
4000
3977
  ### Declaration
4001
3978
 
@@ -4474,6 +4451,8 @@ Phase headers accept a trailing-token color for per-phase styling:
4474
4451
 
4475
4452
  The phase bar tints to a soft mix of the color over the background. Phases without a color fall back to the neutral gray bar.
4476
4453
 
4454
+ A bare `collapsed` flag on the phase line (`[Departure] collapsed`, `[Departure] teal collapsed`; legacy `collapsed: true`) starts the phase folded: its task rows hide and the band keeps its summary chips and the collapse bar.
4455
+
4477
4456
  ### Display vs source ordering
4478
4457
 
4479
4458
  Markers in cells are always **rendered in canonical alphabet order** (`R A C I`, `R A S C I`, `D A C I`) regardless of source order. Source casing and order are preserved in the file; mutations operate on source order to keep round-trips byte-stable except for the cell that changed.
@@ -4704,6 +4683,77 @@ The one directive is `url`. There are no elements, no indentation and no colons.
4704
4683
 
4705
4684
  ---
4706
4685
 
4686
+ ## 25B. SWOT Analysis
4687
+
4688
+ <!-- TYPE:swot -->
4689
+
4690
+ <!-- TIPS start -->
4691
+
4692
+ **Styling tips:** Keep items to a few words, and let the section colours stand: a tag group earns its place only when the items sort into kinds, such as priority or owner. Declare the sections in any order; they always draw S W / O T.
4693
+
4694
+ <!-- TIPS end -->
4695
+
4696
+ ### 25B.1 Declaration
4697
+
4698
+ ```
4699
+ swot [Title]
4700
+ ```
4701
+
4702
+ A SWOT analysis names four fixed panels: **strengths** and **weaknesses** are internal, **opportunities** and **threats** are external; strengths and opportunities help, weaknesses and threats harm. The panels always draw as a 2×2 in the order S W / O T, whatever order the source uses. At phone width the chart stays 2×2 and scales as a whole.
4703
+
4704
+ ### 25B.2 Sections and items
4705
+
4706
+ ```
4707
+ swot Tortuga Rum Co.
4708
+ tag Priority as p
4709
+ High red
4710
+ Low gray
4711
+ active-tag Priority
4712
+ x-label Helpful, Harmful
4713
+ y-label Internal, External
4714
+
4715
+ strengths
4716
+ Oldest still on the island p: Low
4717
+ Crew of 40 sworn tasters
4718
+ Trained in three ports
4719
+ weaknesses Soft spots yellow
4720
+ One barrel supplier p: High
4721
+ opportunities
4722
+ Navy rum ration contract
4723
+ threats
4724
+ Royal Navy blockade
4725
+ ```
4726
+
4727
+ - **Section line**, indent 0: `strengths|weaknesses|opportunities|threats [Label] [color]`. The keyword is case-insensitive. The label defaults to Strengths, Weaknesses, Opportunities, Threats; the colour defaults to green, yellow, blue, red. Sections are keywords, never `[brackets]`.
4728
+ - **Item line**: indented under a section. Text is literal, so colons and commas stay (`Cost: 20% below rivals, margins thin`) unless the key is a declared tag alias (`p: High`). A colour word ending an item stays in the text (`Margins are in the red`). A leading `- ` is removed.
4729
+ - **Detail line**: indented one level under an item; drawn smaller and muted. There is one detail level.
4730
+ - A missing or empty section still draws its panel, with a muted "None listed".
4731
+ - Long text wraps and the panel grows; nothing is truncated. A row takes its tallest panel's height, and the two columns stay equal.
4732
+
4733
+ ### 25B.3 Options
4734
+
4735
+ | Option | Effect |
4736
+ | ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
4737
+ | `tag`, `active-tag` | A tag recolours an item's dot, tints its row faintly in the tag colour, and adds the legend. An untagged item keeps its section's colour and no tint, and the header bands always keep the section colour |
4738
+ | `x-label A, B` | Column headers: a filled band over each column, in small caps. Default `Helpful, Harmful` |
4739
+ | `y-label A, B` | Row headers: a filled rail beside each row, rotated, in small caps. Default `Internal, External` |
4740
+ | `no-axes` | Hide the axis labels. Wins over `x-label` and `y-label` |
4741
+ | `no-tint-items` | Don't tint tagged rows; the dot alone carries the tag |
4742
+ | `no-legend` | Hide the tag legend |
4743
+ | `palette` | Draw in a built-in palette |
4744
+
4745
+ The TOWS strategy cross-matrix, scores or weights are not part of this chart.
4746
+
4747
+ ### 25B.4 Diagnostics
4748
+
4749
+ | Code | Fires on |
4750
+ | -------------------------- | ---------------------------------------------------------------------------------------------------------- |
4751
+ | `E_SWOT_UNKNOWN_SECTION` | an unknown word at indent 0, including `[Strengths]` and `strength`; the message names the nearest keyword |
4752
+ | `E_SWOT_DUPLICATE_SECTION` | the same section twice |
4753
+ | `E_SWOT_ORPHAN_ITEM` | an item before any section |
4754
+ | `E_SWOT_TOO_DEEP` | nesting below the detail level |
4755
+ | `W_SWOT_EMPTY_SECTION` | a missing or empty section; its panel still draws |
4756
+
4707
4757
  ## 26. Colon Usage Summary
4708
4758
 
4709
4759
  ### Constructs Where Colons Are REQUIRED
@@ -4805,16 +4855,16 @@ API description: Main gateway
4805
4855
 
4806
4856
  Some constructs _look_ universal but are scoped to specific chart types. Don't transplant them across charts.
4807
4857
 
4808
- | Construct | Scope |
4809
- | --------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
4810
- | Bare `collapsed` trailing flag (§1.8) | sequence, infra, gantt, kanban, mindmap, pert, state, c4, event-line (eras), block, sketch, wireframe. Legacy: `collapsed: true` metadata |
4811
- | Same-line / indented metadata on declarations | all chart types except flowchart, state, data charts (§1.4) |
4812
- | Trailing-keyword flag list | wireframe only (§19) |
4813
- | `progress: <N>` key | gantt only (§13) |
4814
- | `score: <N>` + `emotion: <Word>` keys | journey-map only (§22) |
4815
- | `description: <text>` shorthand for layers | pyramid, ring (§23, §24) |
4816
- | `milestone` keyword | **removed** — use `<name> 0` (§13A) |
4817
- | `\|` operator as metadata delimiter | **removed** (§1.4). Surviving uses: wireframe `{A \| B}` braces, in-arrow `A -file\|name-> B`, quoted `"Order \| Items"` |
4858
+ | Construct | Scope |
4859
+ | --------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
4860
+ | Bare `collapsed` trailing flag (§1.8) | sequence (groups, sections, multi-line notes), infra, gantt, kanban, mindmap, pert, state, event-line (eras), block, wireframe, sitemap, boxes-and-lines, timeline (lanes), journey-map, raci. c4 parses it but draws nothing (c4 folds by drill level). Legacy: `collapsed: true` metadata |
4861
+ | Same-line / indented metadata on declarations | all chart types except flowchart, state, data charts (§1.4) |
4862
+ | Trailing-keyword flag list | wireframe only (§19) |
4863
+ | `progress: <N>` key | gantt only (§13) |
4864
+ | `score: <N>` + `emotion: <Word>` keys | journey-map only (§22) |
4865
+ | `description: <text>` shorthand for layers | pyramid, ring (§23, §24) |
4866
+ | `milestone` keyword | **removed** — use `<name> 0` (§13A) |
4867
+ | `\|` operator as metadata delimiter | **removed** (§1.4). Surviving uses: wireframe `{A \| B}` braces, in-arrow `A -file\|name-> B`, quoted `"Order \| Items"` |
4818
4868
 
4819
4869
  ### 26.4 Quoted Names + Aliases — Pick One
4820
4870
 
@@ -0,0 +1,19 @@
1
+ swot Coopérative du Rhum
2
+ no-axes
3
+ x-label Atouts, Risques
4
+ y-label Interne, Externe
5
+
6
+ // The source order is deliberately T O W S; the panels stay S W / O T.
7
+ threats Menaces
8
+ Blocus de la marine royale, qui ferme le port principal pendant toute la saison des alizés
9
+ opportunities Opportunités teal
10
+ Contrat de ration de rhum pour la marine
11
+ Ouverture d'une route commerciale vers les îles du sud
12
+ Demande croissante en Europe
13
+ weaknesses Faiblesses
14
+ Un seul fournisseur de tonneaux
15
+ strengths Forces
16
+ La plus ancienne distillerie de l'île
17
+ Quarante goûteurs assermentés, formés dans trois ports différents et capables de reconnaître un millésime à l'odeur
18
+ Formation reprise chaque hiver
19
+ Recette gardée depuis 1680
@@ -0,0 +1,16 @@
1
+ swot Tortuga Rum Co.
2
+ tag Priority as p
3
+ High red
4
+ Low gray
5
+ active-tag Priority
6
+ x-label Helpful, Harmful
7
+ y-label Internal, External
8
+
9
+ strengths
10
+ Oldest still on the island p: Low
11
+ Crew of 40 sworn tasters
12
+ Trained in three ports
13
+ weaknesses Soft spots yellow
14
+ One barrel supplier p: High
15
+ opportunities
16
+ Navy rum ration contract
@@ -0,0 +1,13 @@
1
+ swot Tortuga Rum Co.
2
+
3
+ strengths
4
+ Oldest still on the island
5
+ Crew of 40 sworn tasters
6
+ weaknesses
7
+ One barrel supplier
8
+ Cost: 20% above rivals, margins thin
9
+ opportunities
10
+ Navy rum ration contract
11
+ threats
12
+ Royal Navy blockade
13
+ Margins are in the red
@@ -9,6 +9,7 @@ rectangle Magic link at: 60 250, size: 180 70, color: green
9
9
  arrow emails a code from: 150 95, to: 150 285, color: green
10
10
  database Users at: 420 160, size: 140 100, color: purple, fill: solid
11
11
  queue Email jobs at: 300 380, size: 200 64, color: orange
12
+ file Audit log at: 60 400, size: 140 80, color: gray
12
13
  arrow from: 150 285, to: 400 412, color: orange, bend: 50
13
14
  text keep it to ONE screen at: 62 184
14
15
  text 2FA here?? at: 560 -4, color: red
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@diagrammo/dgmo",
3
- "version": "0.95.0",
3
+ "version": "0.97.0",
4
4
  "description": "DGMO diagram markup language — parser, renderer, and color system",
5
5
  "license": "MIT",
6
6
  "author": "Diagrammo LLC",