@diagrammo/dgmo 0.48.2 → 0.50.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 (244) hide show
  1. package/.cursorrules +12 -3
  2. package/.github/copilot-instructions.md +12 -3
  3. package/.windsurfrules +12 -3
  4. package/SKILL.md +12 -3
  5. package/dist/advanced.d.ts +851 -1
  6. package/dist/advanced.js +601 -177
  7. package/dist/auto.css +63 -0
  8. package/dist/auto.js +220 -110
  9. package/dist/auto.mjs +45920 -33167
  10. package/dist/block.css +63 -0
  11. package/dist/block.d.ts +13 -5
  12. package/dist/block.js +239 -62
  13. package/dist/{charts-d3-QOZHKTCT.js → charts-d3-DKUD7MQE.js} +9 -8
  14. package/dist/{chunk-3MQQNXPD.js → chunk-2C56LEML.js} +3 -3
  15. package/dist/{chunk-L66GEFB6.js → chunk-2JJ2KNPI.js} +4 -4
  16. package/dist/{chunk-6SM5NJQH.js → chunk-2QYTMIRR.js} +4 -4
  17. package/dist/{chunk-RJE5JTVK.js → chunk-3G6TMNVF.js} +7 -7
  18. package/dist/{chunk-MO5YHHMQ.js → chunk-3LKM6FMW.js} +2 -2
  19. package/dist/{chunk-76OWZ3BA.js → chunk-3P2DKJCG.js} +2 -2
  20. package/dist/chunk-3TDRHT4J.js +1043 -0
  21. package/dist/chunk-3XPUDB7B.js +420 -0
  22. package/dist/{chunk-2LACINWN.js → chunk-3ZPC476N.js} +7 -7
  23. package/dist/{chunk-G2H74XJZ.js → chunk-4BMJQFNK.js} +8 -8
  24. package/dist/{chunk-THXCFRTU.js → chunk-4S723I74.js} +9 -9
  25. package/dist/{chunk-6NYWYNBI.js → chunk-4XK3FLFB.js} +3 -3
  26. package/dist/chunk-5JSWBPZZ.js +607 -0
  27. package/dist/{chunk-WCT3NYCV.js → chunk-5LWQH6QV.js} +1 -1
  28. package/dist/{chunk-7DTWEFUE.js → chunk-5Z736BSU.js} +8 -8
  29. package/dist/{chunk-ERLBPDGU.js → chunk-6BFZKBGD.js} +2 -2
  30. package/dist/{chunk-6HO5ZTXK.js → chunk-6IAA2QQ2.js} +2 -2
  31. package/dist/{chunk-H6PI3KJT.js → chunk-6IUAK7RZ.js} +2 -2
  32. package/dist/{chunk-RTLBSQ3G.js → chunk-6M5PJFQG.js} +3 -3
  33. package/dist/{chunk-Z5CGSFJB.js → chunk-6X4AKWLF.js} +4 -4
  34. package/dist/{chunk-OJR3MQYV.js → chunk-6ZT4U37Q.js} +291 -52
  35. package/dist/{chunk-5QXL4NYS.js → chunk-7G2ER4CY.js} +10 -5
  36. package/dist/chunk-7PQYTZMA.js +681 -0
  37. package/dist/{chunk-OURHMODR.js → chunk-7RB5Q6MB.js} +11 -11
  38. package/dist/{chunk-YAA6IID3.js → chunk-7UEMZREK.js} +2 -2
  39. package/dist/{chunk-AN2MOO5T.js → chunk-A3WQVFBS.js} +3 -3
  40. package/dist/{chunk-VOKGH627.js → chunk-AHGF2YYA.js} +13 -3
  41. package/dist/{chunk-CI2G3OEB.js → chunk-ASS5YYIZ.js} +12 -12
  42. package/dist/{chunk-TYS6CSS5.js → chunk-BCYVE3N5.js} +2 -2
  43. package/dist/chunk-BDXC7MDK.js +2395 -0
  44. package/dist/chunk-BTUTZMPT.js +482 -0
  45. package/dist/{chunk-YGJTDXVR.js → chunk-C4GQDB5L.js} +2 -2
  46. package/dist/{chunk-Y2ZE3MSG.js → chunk-C63UWAKM.js} +2 -2
  47. package/dist/{chunk-725LDASD.js → chunk-CLD2OKV7.js} +2 -2
  48. package/dist/{chunk-WBRZJOEC.js → chunk-CMCR5WBW.js} +3 -3
  49. package/dist/{chunk-IZMRON6C.js → chunk-CVV36CWI.js} +2 -2
  50. package/dist/chunk-DMJJ3CEQ.js +254 -0
  51. package/dist/{chunk-MZSBFAPJ.js → chunk-EJTKV7CY.js} +9 -9
  52. package/dist/{chunk-FITOLXSX.js → chunk-EOFPYPAU.js} +26 -2
  53. package/dist/{chunk-X5LCYCL5.js → chunk-ER5SCQWQ.js} +5 -5
  54. package/dist/{chunk-4OHACBGX.js → chunk-F2L5GCQ4.js} +2 -2
  55. package/dist/{chunk-FCIIHT24.js → chunk-F5UDBSJY.js} +7 -7
  56. package/dist/{chunk-3JLKYGBQ.js → chunk-F7BFXWNQ.js} +2 -2
  57. package/dist/{chunk-FANX6UJR.js → chunk-FAL7NOK3.js} +11 -11
  58. package/dist/{chunk-BUPDIHML.js → chunk-FB2WHOEQ.js} +4 -4
  59. package/dist/chunk-FL4IOQ37.js +379 -0
  60. package/dist/{chunk-LIOHW36Z.js → chunk-GBE54KY6.js} +6 -5
  61. package/dist/{chunk-RUNNI6VE.js → chunk-GL5UZ6NY.js} +3 -3
  62. package/dist/{chunk-4GRI7MEB.js → chunk-GPWHQ5FJ.js} +6 -6
  63. package/dist/chunk-GROQGHCT.js +960 -0
  64. package/dist/{chunk-SGZYXELT.js → chunk-H73FP42Q.js} +9 -6
  65. package/dist/{chunk-PBAHEPLQ.js → chunk-HGN652MU.js} +7 -6
  66. package/dist/{chunk-3SMGIJDD.js → chunk-HHXOONLX.js} +13 -1
  67. package/dist/{chunk-QOOUC2J5.js → chunk-HQCHYB5F.js} +2 -2
  68. package/dist/{chunk-AELOBFW5.js → chunk-I4IFRCUB.js} +3 -3
  69. package/dist/{chunk-GMR5MFHJ.js → chunk-I7F2A35O.js} +2 -2
  70. package/dist/{chunk-T2OE3YQB.js → chunk-IA3FJYWR.js} +3 -3
  71. package/dist/chunk-IAEC4KLA.js +492 -0
  72. package/dist/chunk-IVKC4GID.js +32 -0
  73. package/dist/{chunk-HSH73DP6.js → chunk-JFYIP7XU.js} +139 -39
  74. package/dist/{chunk-CKNVO24D.js → chunk-JZNMXEIV.js} +2 -2
  75. package/dist/chunk-KJXIHOVL.js +940 -0
  76. package/dist/chunk-L2ZTFHAY.js +331 -0
  77. package/dist/{chunk-B7JUCQUA.js → chunk-M5RXSRO2.js} +4 -4
  78. package/dist/{chunk-ULOEATBZ.js → chunk-NFFIKVNO.js} +106 -29
  79. package/dist/{chunk-PZMETGLY.js → chunk-NISQC5KW.js} +358 -122
  80. package/dist/chunk-O4VUFXIH.js +574 -0
  81. package/dist/{chunk-RVMRZAPB.js → chunk-O76UD6VJ.js} +3 -3
  82. package/dist/{chunk-JM4LEPY3.js → chunk-O7NUCTFU.js} +2 -2
  83. package/dist/{chunk-JED6ZDEE.js → chunk-O7WP4ZD4.js} +2 -2
  84. package/dist/{chunk-EVCVDTXE.js → chunk-OHQEMBLI.js} +3 -3
  85. package/dist/{chunk-ZBWMSD5N.js → chunk-ONA5KPV3.js} +4 -4
  86. package/dist/{chunk-Y3J7VR52.js → chunk-OTAL43EH.js} +34 -2
  87. package/dist/{chunk-WCSOJFU3.js → chunk-OTP5KVLO.js} +3 -3
  88. package/dist/{chunk-RYEGFMUO.js → chunk-PGEGPSCZ.js} +2 -2
  89. package/dist/{chunk-ZO27FGJS.js → chunk-PH5X4GIP.js} +2 -2
  90. package/dist/{chunk-ZJEL4H2R.js → chunk-PJUGRJHJ.js} +9 -9
  91. package/dist/{chunk-ZGR7ULFJ.js → chunk-PLZI6KPM.js} +26 -14
  92. package/dist/{chunk-3R5POCTZ.js → chunk-PMN3Q7RJ.js} +6 -6
  93. package/dist/{chunk-YGJZWZTY.js → chunk-PZFVK3IH.js} +2 -2
  94. package/dist/chunk-Q4V4XQWV.js +158 -0
  95. package/dist/chunk-QDFNCATJ.js +325 -0
  96. package/dist/{chunk-QEBUY5NY.js → chunk-QFQ35BTO.js} +4 -4
  97. package/dist/chunk-QQJUTGQH.js +135 -0
  98. package/dist/{chunk-PWIHZ6NJ.js → chunk-QUJGFNFN.js} +4 -4
  99. package/dist/{chunk-J5FIXQRT.js → chunk-R56LASIN.js} +4 -4
  100. package/dist/{chunk-SRTU6HMQ.js → chunk-RV26LTUU.js} +8 -8
  101. package/dist/chunk-RV6A2B5S.js +354 -0
  102. package/dist/{chunk-EB6FPQUP.js → chunk-S5GRONXL.js} +3 -3
  103. package/dist/{chunk-5MLYVTYM.js → chunk-SCHXJTZL.js} +2 -2
  104. package/dist/{chunk-T3UBLACL.js → chunk-SCQ5VPUF.js} +19 -5
  105. package/dist/{chunk-PBHE5UG6.js → chunk-SGFZZAUO.js} +46 -12
  106. package/dist/{chunk-BUVJFRPY.js → chunk-SU2VBK4L.js} +4 -4
  107. package/dist/{chunk-SML67VPV.js → chunk-T4BRO3Z6.js} +3 -3
  108. package/dist/{chunk-NURGB5Z4.js → chunk-TSA237IM.js} +2 -2
  109. package/dist/chunk-TWCLK2GA.js +273 -0
  110. package/dist/{chunk-IJZFN3HM.js → chunk-TWQUYVP3.js} +4 -4
  111. package/dist/{chunk-DKEPS5LH.js → chunk-U2HGPLZS.js} +36 -2
  112. package/dist/{chunk-B65G5DNL.js → chunk-URSQLCTR.js} +3 -3
  113. package/dist/{chunk-ILKORZ3H.js → chunk-UUS2GIJZ.js} +7 -7
  114. package/dist/{chunk-XAKEUMEJ.js → chunk-UXOSVCLJ.js} +4 -4
  115. package/dist/{chunk-QLCCJEJI.js → chunk-WCUHAQKB.js} +2 -2
  116. package/dist/{chunk-WVAJFAIA.js → chunk-WWN566I7.js} +257 -101
  117. package/dist/{chunk-IPWPWM6R.js → chunk-X2NMFTG3.js} +111 -10
  118. package/dist/{chunk-UWN33VNX.js → chunk-XCLHOZAM.js} +10 -10
  119. package/dist/{chunk-P235SVAH.js → chunk-XDXNDSKO.js} +2 -2
  120. package/dist/chunk-XHVV4NVW.js +51 -0
  121. package/dist/{chunk-33LCUH4H.js → chunk-XMVQ5F4M.js} +4 -4
  122. package/dist/{chunk-MITI6NOL.js → chunk-YA7D2N2O.js} +11 -11
  123. package/dist/{chunk-7JEGTRLD.js → chunk-YB3FW24O.js} +3 -3
  124. package/dist/chunk-YNRDWYZP.js +295 -0
  125. package/dist/{chunk-44CM72SQ.js → chunk-YZLMKW4T.js} +3 -3
  126. package/dist/chunk-Z6XJQ6KO.js +452 -0
  127. package/dist/cli.cjs +179 -133
  128. package/dist/clock.d.ts +10 -0
  129. package/dist/clock.js +235 -0
  130. package/dist/countdown.d.ts +12 -0
  131. package/dist/countdown.js +450 -0
  132. package/dist/dgmo-router-QOMFCOOV.js +84 -0
  133. package/dist/dimensions-P5FSX2QN.js +22 -0
  134. package/dist/editor.js +43 -2
  135. package/dist/element.js +220 -110
  136. package/dist/element.mjs +45920 -33167
  137. package/dist/{flowchart-parser-ZNSKIBVR.js → flowchart-parser-OE4WHLTF.js} +4 -4
  138. package/dist/{flowchart-renderer-SNDSII4D.js → flowchart-renderer-GPCSMTOR.js} +8 -8
  139. package/dist/highlight.d.ts +17 -1
  140. package/dist/highlight.js +163 -6
  141. package/dist/index.d.ts +5 -1
  142. package/dist/index.js +199 -233
  143. package/dist/{layout-HRBZPFCN.js → layout-34CLNICW.js} +5 -5
  144. package/dist/layout-46366KBT.js +10 -0
  145. package/dist/{layout-HWDSRX5E.js → layout-5BG6DFCU.js} +6 -6
  146. package/dist/layout-6RDJHS6E.js +9 -0
  147. package/dist/{layout-7QXCNOVS.js → layout-7H4H46CS.js} +3 -3
  148. package/dist/{layout-46N4JJYK.js → layout-7SKMFYHL.js} +5 -5
  149. package/dist/{layout-EE6GE46Y.js → layout-DC4TVXER.js} +5 -5
  150. package/dist/layout-FGQWRYYW.js +14 -0
  151. package/dist/{layout-S2QBYSK2.js → layout-NXG63LWH.js} +3 -3
  152. package/dist/{layout-N76NR4ZO.js → layout-PUQCB6AN.js} +7 -7
  153. package/dist/{layout-HYZPWAK5.js → layout-QNUQLEHU.js} +3 -3
  154. package/dist/{layout-UM5F4DJB.js → layout-T3OZU5QW.js} +5 -5
  155. package/dist/layout-TJIWF7EM.js +14 -0
  156. package/dist/layout-VYELEAW7.js +14 -0
  157. package/dist/{layout-5RA6QWR6.js → layout-WZHNDT2O.js} +6 -6
  158. package/dist/{layout-search-OYV77HHS.js → layout-search-QS44PI5R.js} +6 -6
  159. package/dist/{parser-6BTRLKRZ.js → parser-45DENHFZ.js} +4 -4
  160. package/dist/{parser-TFZFBVWN.js → parser-4AI5ZN5F.js} +3 -3
  161. package/dist/{parser-XDVELHRK.js → parser-4P36TUVD.js} +4 -4
  162. package/dist/{parser-ZSDPZYQP.js → parser-5AURY4A6.js} +4 -4
  163. package/dist/{parser-N5O4IHUN.js → parser-A2BEFMGK.js} +4 -4
  164. package/dist/parser-B5FVS7O6.js +11 -0
  165. package/dist/{parser-NGU3ETO6.js → parser-C2HF2C2E.js} +4 -4
  166. package/dist/parser-CSFUN3CT.js +14 -0
  167. package/dist/{parser-TRTHDFPP.js → parser-D3QT6GWN.js} +5 -5
  168. package/dist/parser-D5637H5H.js +15 -0
  169. package/dist/{parser-VQP2UJ6W.js → parser-DFFEDKHH.js} +3 -3
  170. package/dist/parser-DOKMZXVZ.js +13 -0
  171. package/dist/parser-FMPCVFRK.js +15 -0
  172. package/dist/{parser-Y6WTBU76.js → parser-HYRTF3DO.js} +3 -3
  173. package/dist/{parser-I6KXEYFK.js → parser-I2UIJKVQ.js} +4 -4
  174. package/dist/{parser-O5J4VBII.js → parser-IBWNAPY4.js} +3 -3
  175. package/dist/{parser-PQ3POX45.js → parser-KUQWRPIT.js} +4 -4
  176. package/dist/{parser-2MFP2H2E.js → parser-LWKKBNSA.js} +3 -3
  177. package/dist/{parser-OV7NOBW6.js → parser-O4QFCUW7.js} +5 -5
  178. package/dist/{parser-IXSZZQHY.js → parser-PGMQDD4G.js} +4 -4
  179. package/dist/{parser-3STE62GB.js → parser-Q4QKCIWQ.js} +4 -4
  180. package/dist/parser-QTOB4KFL.js +14 -0
  181. package/dist/{parser-2EWECDSA.js → parser-QYYM4QVW.js} +4 -4
  182. package/dist/{parser-4OGOBJJ4.js → parser-RZMQP7MM.js} +4 -4
  183. package/dist/parser-RZPVAQVX.js +11 -0
  184. package/dist/parser-SOUJOEYI.js +13 -0
  185. package/dist/{parser-4FL2CMDG.js → parser-UQE5OWZI.js} +5 -5
  186. package/dist/{parser-NRAI6O25.js → parser-WAV5JRPT.js} +4 -4
  187. package/dist/{parser-KNSQSKQO.js → parser-YLKYBRIT.js} +5 -5
  188. package/dist/{parser-XKRP7QKP.js → parser-YS7TOS2K.js} +3 -3
  189. package/dist/{parser-AQETEVRW.js → parser-ZSOWUBML.js} +5 -5
  190. package/dist/{parser-CFZD5IBL.js → parser-ZTBATMLX.js} +4 -4
  191. package/dist/{renderer-VACVQYML.js → renderer-35HSIDMZ.js} +8 -8
  192. package/dist/{renderer-5MYBMBYO.js → renderer-4ITCHBT7.js} +5 -5
  193. package/dist/{renderer-CLJHQPBJ.js → renderer-67NPCBIS.js} +11 -11
  194. package/dist/{renderer-5NDVNDAZ.js → renderer-6GHYK7DX.js} +9 -9
  195. package/dist/{renderer-Z7I3W2PP.js → renderer-6RNGHC5Z.js} +8 -8
  196. package/dist/renderer-72LGR2YF.js +14 -0
  197. package/dist/{renderer-KQB7UGDS.js → renderer-7RH2SI3B.js} +3 -3
  198. package/dist/renderer-7SWMIFMM.js +21 -0
  199. package/dist/renderer-BBCEFILK.js +24 -0
  200. package/dist/{renderer-JGBKUCZD.js → renderer-BSW7SRIZ.js} +4 -4
  201. package/dist/{renderer-BYCNMBF7.js → renderer-BY533UWU.js} +11 -11
  202. package/dist/{renderer-6W5462RB.js → renderer-BZSBPTZJ.js} +9 -9
  203. package/dist/{renderer-7MVLWWQD.js → renderer-CXUC4KAD.js} +9 -9
  204. package/dist/{renderer-QIWVHWZO.js → renderer-DAXMXIKD.js} +3 -3
  205. package/dist/renderer-FZUKFUNZ.js +23 -0
  206. package/dist/renderer-G2NLGNKF.js +17 -0
  207. package/dist/renderer-GO3FE3RA.js +24 -0
  208. package/dist/{renderer-ZGNTUWC4.js → renderer-HPGR6USK.js} +8 -8
  209. package/dist/{renderer-UV6MI64M.js → renderer-HVCU2C3Z.js} +3 -3
  210. package/dist/renderer-ICJN2SA2.js +24 -0
  211. package/dist/{renderer-AWWAF6XD.js → renderer-INEXO7B6.js} +10 -10
  212. package/dist/{renderer-YY2OSF6E.js → renderer-KDYCFRBX.js} +8 -8
  213. package/dist/renderer-KY4KQBTF.js +19 -0
  214. package/dist/{renderer-B2OMQIQG.js → renderer-LBN65V45.js} +13 -13
  215. package/dist/{renderer-N43WR5GV.js → renderer-MGBWOCXG.js} +10 -10
  216. package/dist/{renderer-PGX2TKVS.js → renderer-O4JKUGKO.js} +8 -8
  217. package/dist/{renderer-4JHRUBE6.js → renderer-OOGFODWP.js} +10 -10
  218. package/dist/{renderer-6EEZHMH4.js → renderer-Q6ZKPLS6.js} +9 -9
  219. package/dist/{renderer-RPOA5YPZ.js → renderer-SZQ326M5.js} +12 -12
  220. package/dist/{renderer-ZRNG54CW.js → renderer-TKG6LS4U.js} +11 -11
  221. package/dist/{renderer-W4M6QLIJ.js → renderer-TQMZGDAX.js} +13 -13
  222. package/dist/renderer-radial-JELMHQ24.js +21 -0
  223. package/dist/{resolver-NOAA7ID7.js → resolver-FHBCO3PL.js} +3 -3
  224. package/dist/{state-parser-Z2V23ATR.js → state-parser-3REXRK3R.js} +4 -4
  225. package/dist/{state-renderer-B4DQBM6M.js → state-renderer-XYLNRWXR.js} +8 -8
  226. package/docs/ai-integration.md +12 -3
  227. package/docs/language-reference.md +429 -24
  228. package/gallery/fixtures/body.dgmo +17 -0
  229. package/gallery/fixtures/bracket.dgmo +30 -0
  230. package/gallery/fixtures/clock.dgmo +8 -0
  231. package/gallery/fixtures/countdown.dgmo +3 -0
  232. package/gallery/fixtures/family.dgmo +23 -0
  233. package/gallery/fixtures/goal.dgmo +4 -0
  234. package/gallery/fixtures/sketch.dgmo +22 -0
  235. package/package.json +12 -4
  236. package/dist/chunk-ODZVHU3R.js +0 -153
  237. package/dist/dgmo-router-X35VLZLM.js +0 -73
  238. package/dist/dimensions-J3FHIMJ6.js +0 -22
  239. package/dist/layout-5T6RH5M6.js +0 -14
  240. package/dist/layout-G23F7LDH.js +0 -9
  241. package/dist/layout-OB3RI63S.js +0 -14
  242. package/dist/parser-JAL2HD4I.js +0 -13
  243. package/dist/renderer-SMIBCRVB.js +0 -24
  244. package/dist/renderer-radial-C32GPJQ7.js +0 -21
@@ -61,7 +61,7 @@ To teach Claude about DGMO in a specific project without the global skill, paste
61
61
  <!-- DGMO-AI-CORE:START -->
62
62
  ## DGMO AI Core
63
63
 
64
- _Generated from `language-reference.md` — the anti-patterns and 43-type index below are identical across every DGMO AI surface._
64
+ _Generated from `language-reference.md` — the anti-patterns and 50-type index below are identical across every DGMO AI surface._
65
65
 
66
66
  ### Disambiguation — where DGMO diverges from LLM priors
67
67
 
@@ -115,7 +115,7 @@ Valid markup is the floor, not the goal. A good diagram reads at a glance. Apply
115
115
  - **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.
116
116
  - **Pick a fitting direction.** Top-to-bottom for hierarchies and processes; left-to-right for pipelines and flows (where the type supports a direction).
117
117
 
118
- ### Chart-type index (43) — pick the type, then fetch its section
118
+ ### Chart-type index (45) — pick the type, then fetch its section
119
119
 
120
120
  | id | when to use |
121
121
  | -- | ----------- |
@@ -130,6 +130,8 @@ Valid markup is the floor, not the goal. A good diagram reads at a glance. Apply
130
130
  | `sitemap` | site / app navigation structure |
131
131
  | `mindmap` | radial hierarchy of ideas from a central topic |
132
132
  | `org` | reporting hierarchy |
133
+ | `family` | family tree / genealogy: unions (couples), children, remarriage, adoption, GEDCOM-style metadata |
134
+ | `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 |
133
135
  | `kanban` | task-board columns |
134
136
  | `gantt` | project scheduling with task dependencies and milestones |
135
137
  | `pert` | project network with three-point estimates and critical path |
@@ -137,6 +139,7 @@ Valid markup is the floor, not the goal. A good diagram reads at a glance. Apply
137
139
  | `version-control` | git / version-control branch-and-merge graph: commits, branches, merges, rebase, HEAD and remote-tracking (gitGraph-style) |
138
140
  | `timeline` | events, eras, and date ranges |
139
141
  | `event-line` | annotated narrative timeline — events on a line with descriptions, optionally not to scale (NOT the date-scaled `timeline`) |
142
+ | `body` | human anatomy figure annotated by muscle name — for medical, exercise, and educational diagrams |
140
143
  | `journey-map` | UX flow with emotion scores, phases, annotations |
141
144
  | `cycle` | cyclical process (PDCA, OODA, DevOps loops) |
142
145
  | `raci` | tasks × roles responsibility matrix; variant (RACI / RASCI / DACI) is inferred from the markers used |
@@ -146,6 +149,10 @@ Valid markup is the floor, not the goal. A good diagram reads at a glance. Apply
146
149
  | `ring` | concentric rings of nested categories |
147
150
  | `treemap` | nested rectangles sized by value (budgets, disk usage, portfolios) |
148
151
  | `block` | author-controlled grid of nested, collapsible blocks (system / architecture layouts) |
152
+ | `sketch` | GUI-first free-placement canvas: uniform shapes on a snap grid, arrows, tags (markup is app-generated) |
153
+ | `goal` | single progress-toward-a-target value (`now` vs `target`) as a progress bar, thermometer, or gauge — KPIs, fundraising, quotas |
154
+ | `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 |
155
+ | `clock` | live world-clock board: current time for people/places across time zones, ticking every second, with optional working-hours status and sundown line |
149
156
  | `map` | geographic concept map: regions, points, routes |
150
157
  | `wireframe` | low-fidelity UI layout with panels and controls |
151
158
  | `bar` | categorical comparisons (multi-series via `stack` / `group`) |
@@ -169,7 +176,7 @@ Valid markup is the floor, not the goal. A good diagram reads at a glance. Apply
169
176
 
170
177
  ### Common examples (curated, parse-clean)
171
178
 
172
- _The most common types, inline so you can generate them without a fetch. For the other 35, get the per-type section (see below)._
179
+ _The most common types, inline so you can generate them without a fetch. For the other 42, get the per-type section (see below)._
173
180
 
174
181
  #### journey-map
175
182
 
@@ -281,6 +288,8 @@ ports
281
288
  ```dgmo
282
289
  class Ship Class Hierarchy
283
290
 
291
+ solid-fill
292
+
284
293
  interface Vessel
285
294
  + sail(): void
286
295
  + anchor(): void
@@ -42,7 +42,7 @@
42
42
 
43
43
  ## 0. AI Core
44
44
 
45
- The universal core: the cross-cutting anti-patterns (highest value per token) and the one-line index of all 45 chart types. The blocks below are machine-extracted (HTML-comment anchors) and embedded verbatim into every AI surface — IDE rule files, the Claude skill, the CLAUDE.md snippet — by `scripts/gen-ai-core.mjs`. Edit them here; never hand-edit a generated surface.
45
+ The universal core: the cross-cutting anti-patterns (highest value per token) and the one-line index of all 46 chart types. The blocks below are machine-extracted (HTML-comment anchors) and embedded verbatim into every AI surface — IDE rule files, the Claude skill, the CLAUDE.md snippet — by `scripts/gen-ai-core.mjs`. Edit them here; never hand-edit a generated surface.
46
46
 
47
47
  <!-- AI-CORE:ANTIPATTERNS start -->
48
48
  ### Disambiguation — where DGMO diverges from LLM priors
@@ -101,7 +101,7 @@ Valid markup is the floor, not the goal. A good diagram reads at a glance. Apply
101
101
  <!-- AI-CORE:STYLING end -->
102
102
 
103
103
  <!-- AI-CORE:TYPE-INDEX start -->
104
- ### Chart-type index (43) — pick the type, then fetch its section
104
+ ### Chart-type index (45) — pick the type, then fetch its section
105
105
 
106
106
  | id | when to use |
107
107
  | -- | ----------- |
@@ -116,6 +116,8 @@ Valid markup is the floor, not the goal. A good diagram reads at a glance. Apply
116
116
  | `sitemap` | site / app navigation structure |
117
117
  | `mindmap` | radial hierarchy of ideas from a central topic |
118
118
  | `org` | reporting hierarchy |
119
+ | `family` | family tree / genealogy: unions (couples), children, remarriage, adoption, GEDCOM-style metadata |
120
+ | `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 |
119
121
  | `kanban` | task-board columns |
120
122
  | `gantt` | project scheduling with task dependencies and milestones |
121
123
  | `pert` | project network with three-point estimates and critical path |
@@ -123,6 +125,7 @@ Valid markup is the floor, not the goal. A good diagram reads at a glance. Apply
123
125
  | `version-control` | git / version-control branch-and-merge graph: commits, branches, merges, rebase, HEAD and remote-tracking (gitGraph-style) |
124
126
  | `timeline` | events, eras, and date ranges |
125
127
  | `event-line` | annotated narrative timeline — events on a line with descriptions, optionally not to scale (NOT the date-scaled `timeline`) |
128
+ | `body` | human anatomy figure annotated by muscle name — for medical, exercise, and educational diagrams |
126
129
  | `journey-map` | UX flow with emotion scores, phases, annotations |
127
130
  | `cycle` | cyclical process (PDCA, OODA, DevOps loops) |
128
131
  | `raci` | tasks × roles responsibility matrix; variant (RACI / RASCI / DACI) is inferred from the markers used |
@@ -132,6 +135,10 @@ Valid markup is the floor, not the goal. A good diagram reads at a glance. Apply
132
135
  | `ring` | concentric rings of nested categories |
133
136
  | `treemap` | nested rectangles sized by value (budgets, disk usage, portfolios) |
134
137
  | `block` | author-controlled grid of nested, collapsible blocks (system / architecture layouts) |
138
+ | `sketch` | GUI-first free-placement canvas: uniform shapes on a snap grid, arrows, tags (markup is app-generated) |
139
+ | `goal` | single progress-toward-a-target value (`now` vs `target`) as a progress bar, thermometer, or gauge — KPIs, fundraising, quotas |
140
+ | `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 |
141
+ | `clock` | live world-clock board: current time for people/places across time zones, ticking every second, with optional working-hours status and sundown line |
135
142
  | `map` | geographic concept map: regions, points, routes |
136
143
  | `wireframe` | low-fidelity UI layout with panels and controls |
137
144
  | `bar` | categorical comparisons (multi-series via `stack` / `group`) |
@@ -1710,6 +1717,51 @@ See spec §13A for full date-anchoring semantics, S-curve axes, and diagnostic c
1710
1717
 
1711
1718
  ---
1712
1719
 
1720
+ ## 13AA. Family Diagrams (genealogy)
1721
+
1722
+ <!-- TYPE:family -->
1723
+
1724
+ <!-- TIPS start -->
1725
+ **Styling tips:** Two line shapes carry the whole tree: a **person line** (`Anne b: 1665, sex: f`) and a **union line** (`Anne + Jack m: 1701`), with children indented under the union. Declare each person **standalone** with their full metadata — per-side metadata on a union line is unsupported and re-stating a name just re-references the same person. Set `sex:` so cards color (m→blue, f→purple), but **treat the legend as the real sex channel**: blue and purple separate weakly under the 25% tint, so where color-vision matters distinguish with a `tag` group (labeled legend entries) instead. Reuse a name in a second union for remarriage (one card, two bars); a lone person with indented children is a single parent; a bare trailing `adopted` token marks an adopted child.
1726
+ <!-- TIPS end -->
1727
+
1728
+ ### Declaration
1729
+
1730
+ ```
1731
+ family [Title]
1732
+ ```
1733
+
1734
+ ### Unions, children, remarriage
1735
+
1736
+ A **union line** joins a couple with `+`; children are indented beneath it. Union-level metadata is only `m` (marriage year). Reuse a name to remarry; a lone person with indented children is a single parent.
1737
+
1738
+ ```dgmo
1739
+ family The Rackham Line
1740
+
1741
+ Elizabeth Swann b: 1687, sex: f, occupation: Pirate King
1742
+ "Will Turner" b: 1685, sex: m
1743
+
1744
+ Elizabeth Swann + "Will Turner" m: 1729
1745
+ Henry Turner sex: m
1746
+
1747
+ Henry Turner + Carina Smyth m: 1751
1748
+ Joshamee sex: m
1749
+ Anna adopted, sex: f
1750
+ ```
1751
+
1752
+ - **Person metadata** (fixed GEDCOM-flavored keys): `sex` (`m`/`f` → node color), `b`/`d` (birth/death year → a year-range row), `bp`/`dp` (birth/death place), `occupation`, `military`, `education`, `religion`, `burial`. Union-level: `m`. Unknown keys warn.
1753
+ - **Adoption:** a bare `adopted` token on a child line draws a dashed drop edge. A person literally named "Adopted" must be quoted.
1754
+ - **Divorce:** a bare `divorced` token on a union line (`A + B m: 1980 divorced`) draws a dashed marriage bar; children still attach.
1755
+ - **Deceased:** a person with a death year (`d:`) is auto-marked with a muted dagger (†) — derived, no syntax; add `no-daggers` to hide it.
1756
+ - **Children** are auto-ordered eldest→left by birth year (`b:`); undated children keep declaration order.
1757
+ - **Unknown/private person:** a bare `?` renders a faint, solid-bordered, name-only placeholder card; each `?` is a distinct person.
1758
+ - **`generations`** (option): draws a left gutter of Roman-numeral generation labels (`Gen I`, `Gen II`, …) plus subtle zebra shading behind alternating generations.
1759
+ - **`highlight <name>`** (directive): dims everyone outside that person's bloodline (ancestors + descendants + spouses stay lit).
1760
+ - **Sex → color:** `sex: m` → blue, `sex: f` → purple, unset → gray (25% tint). An explicit `tag`/inline color overrides the sex color.
1761
+ - 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.
1762
+
1763
+ ---
1764
+
1713
1765
  ## 13B. Swimlane Diagrams
1714
1766
 
1715
1767
  <!-- TYPE:swimlane -->
@@ -1718,38 +1770,31 @@ See spec §13A for full date-anchoring semantics, S-curve axes, and diagnostic c
1718
1770
  **Styling tips:** Give each lane a color and let nodes inherit it — reach for a `tag` group only when you need a *second* dimension (e.g. risk) that deliberately breaks lane color. Echo the gateway/terminal delimiters (`<Review>`, `(Paid) success`) even though bare names also resolve — it keeps the source self-documenting. Put every edge label *inside* the arrow (`-invalid->`), never as a trailing word.
1719
1771
  <!-- TIPS end -->
1720
1772
 
1721
- Swimlane diagrams model a cross-functional process: actors/systems are **lanes**, the process flows along the flow axis (`direction LR` default, `TB` transposes), and optional `[Phase]` columns group steps into stages. Nodes are tasks (bare), exclusive gateways (`<X>`), parallel gateways (`<+ X>`), terminals (`(X)`), and subprocesses (`[[X]]`). Edges go last as a flow block; a back-edge to an earlier node draws a routed loop.
1773
+ Swimlane diagrams model a cross-functional process: actors/systems are **lanes**, the process flows along the flow axis (`direction LR` default, `TB` transposes), and optional `[Phase]` columns group steps into stages. Nodes are tasks (bare), exclusive gateways (`<X>`), parallel gateways (`<+ X>`), terminals (`(X)`), and subprocesses (`[[X]]`). A `lane` block **owns its edges** — nodes and their outgoing `->` edges are written inline, no separate flow block. A back-edge to an earlier node draws a routed loop.
1722
1774
 
1723
1775
  ```
1724
1776
  swimlane Weekly Publishing
1725
1777
  direction LR
1726
1778
 
1727
1779
  lane Writer gray
1780
+ Draft Post -> Review
1781
+ Revise -> Review
1728
1782
  lane Editor blue
1729
- lane Social green
1730
-
1731
- Writer
1732
- Draft Post
1733
- Revise
1734
- Editor
1735
1783
  <Review>
1736
- Schedule
1737
- Publish
1738
- Social
1784
+ -changes-> Revise
1785
+ -ok-> Schedule
1786
+ Schedule -> Publish
1787
+ Publish -> Promote
1788
+ lane Social green
1739
1789
  Promote
1740
-
1741
- Draft Post -> <Review>
1742
- <Review>
1743
- -changes-> Revise -> <Review>
1744
- -ok-> Schedule -> Publish -> Promote
1745
1790
  ```
1746
1791
 
1747
1792
  ### Structure
1748
1793
 
1749
- - `lane <Name> [color]` declares a row (occupant-neutral; person, system, or org) in order. The trailing color (§1.5) tints the band and is the default node fill.
1750
- - A bare line matching a declared lane opens that lane's context; indented lines beneath it are nodes.
1751
- - `[Phase]` opens a phase column (3-deep: phase ▸ lane ▸ node). With no `[Phase]`, the diagram is 2-deep (lane ▸ node). A node's phase membership can only push it right, never left of its column.
1752
- - Node names are globally unique; the flow block references a node by name.
1794
+ - `lane <Name> [color]` declares a row (occupant-neutral; person, system, or org) **and opens its block** — the indented lines beneath are its nodes and their inline edges. The trailing color (§1.5) tints the band and is the default node fill. Lane order is first-appearance; re-opening a lane resumes it.
1795
+ - A node is owned by the lane where it is a **line-head** (bare node or arrow source); elsewhere the name is a reference. References may point forward. Names are **lane-scoped** — resolve own-lane-first → global-unique → ambiguous; qualify a shared name `Lane.Node`.
1796
+ - An unresolved target auto-creates only if **delimited** (`(…)`/`<…>`/`[[…]]`, taking the edge's lane/phase); an unresolved **bare task** is `E_SWIMLANE_UNKNOWN_NODE` (typo protection).
1797
+ - `[Phase]` opens a phase column (3-deep: phase ▸ `lane` block ▸ nodes). With no `[Phase]`, the diagram is 2-deep (lane ▸ nodes). A node's phase membership can only push it right, never left of its column.
1753
1798
 
1754
1799
  ### Node tokens
1755
1800
 
@@ -2170,18 +2215,18 @@ no-center-total // pie: hide the center total (shown by default when `h
2170
2215
 
2171
2216
  - `no-name` — hide name (segment / point / cell / node / set)
2172
2217
  - `no-value` — hide numeric value
2173
- - `no-percent` — hide share-of-total percentage (pie-family only)
2218
+ - `no-percent` — hide the percentage (share-of-total on pie-family; stage-over-stage conversion on funnel)
2174
2219
 
2175
2220
  Each chart honors the subset of flags that has a renderable atom on it:
2176
2221
 
2177
2222
  - pie / polar-area: all three
2178
- - funnel: `no-name`, `no-value`
2223
+ - funnel: all three (`no-percent` hides the conversion %)
2179
2224
  - bar / line / radar: `no-value`
2180
2225
  - scatter: `no-name`
2181
2226
  - heatmap: `no-value`
2182
2227
  - sankey, arc, slope, quadrant, venn: name-suppression deferred — names render by default and cannot yet be hidden
2183
2228
 
2184
- `no-percent` on a non-pie-family chart is silently ignored (the chart has no percent atom). Cartesian charts (bar, line) render values on each bar / point by default.
2229
+ `no-percent` on a chart with no percent atom is silently ignored. Cartesian charts (bar, line) render values on each bar / point by default.
2185
2230
 
2186
2231
  **Eras (line only):**
2187
2232
 
@@ -2331,6 +2376,8 @@ Signups 800
2331
2376
  Purchases 200
2332
2377
  ```
2333
2378
 
2379
+ Each stage renders its name to the left of the band (in the band's color), its value centered inside the band (falling back beside it when the band is too narrow), and a muted stage-over-stage conversion % to the right — no leader lines. The first stage has no % (nothing to convert from). `no-percent` hides the conversion %; `no-name` / `no-value` hide the other parts.
2380
+
2334
2381
  ---
2335
2382
 
2336
2383
  ## 17. Visualizations
@@ -2471,6 +2518,53 @@ Group a run of events into a labeled section with a `[Name]` bracket, then **ind
2471
2518
  - `no-box` — card-less style for slides: a tag-colored label, a rule, and the description below (no box / fill / border).
2472
2519
  - `no-legend` — hide the tag legend.
2473
2520
 
2521
+ ### 16.4C Body Diagrams
2522
+
2523
+ <!-- TYPE:body -->
2524
+
2525
+ <!-- TIPS start -->
2526
+ **Styling tips:** Reach for `body` when the drawing IS the human figure — colour muscle groups over a skin layer to show which parts a workout targets, where an injury sits, or how the musculature is organised. Choose the figure with `male`/`female` and `front`/`back`; each named muscle group takes a tag so the legend carries the meaning. Best for fitness, medical, exercise, and educational diagrams — not for generic part-to-whole (that's `pie`/`treemap`).
2527
+ <!-- TIPS end -->
2528
+
2529
+ **Figures:** male and female, front and back — four figures. `skin` form renders any figure as a plain silhouette (with head + hair) instead of the segmented muscle map. `skeletal` is reserved.
2530
+
2531
+ #### Declaration
2532
+
2533
+ ```
2534
+ body [Title]
2535
+ ```
2536
+
2537
+ #### Form / sex / view (bare directives)
2538
+
2539
+ Set the figure with bare directives before the parts: `muscle` (default) or `skin`; `male` (default) or `female`; `front` (default) or `back`. Each is optional. **Name both `front` and `back`** to render the two views side by side in one diagram — a part is drawn on whichever view(s) contain it (`chest` on front, `lats` on back, `deltoids`/`calves` on both).
2540
+
2541
+ #### Parts
2542
+
2543
+ A bare line is a **catalog muscle name**, in any order, with optional trailing tag metadata and an indented body note. Names accept gym shorthand or formal anatomy (`pecs` / `pectoralis-major` → `chest`; `quads` → `quadriceps`).
2544
+
2545
+ ```
2546
+ body Push Day
2547
+ muscle
2548
+
2549
+ tag Effort as e
2550
+ Primary red
2551
+ Secondary orange
2552
+
2553
+ chest e: Primary
2554
+ Barbell bench press — 4×8
2555
+ deltoids e: Primary
2556
+ triceps e: Secondary
2557
+ abs e: Secondary
2558
+ ```
2559
+
2560
+ - **Part** — a catalog name for the active figure. Front: `chest`, `deltoids`, `biceps`, `triceps`, `abs`, `obliques`, `trapezius`, `forearm`, `quadriceps`, `adductors`, `calves`, `tibialis`. Back: `lats`, `trapezius`, `rear-delts`, `triceps`, `lower-back`, `glutes`, `hamstring`, `calves`, `forearm`. Fine heads (`vastus-lateralis`, `serratus-anterior`, `biceps-femoris`, …) and gym/anatomical aliases (`pecs`/`pectoralis-major`→chest, `quads`→quadriceps, `glutes`→gluteal) both resolve. Unknown names warn.
2561
+ - **Tag** — trailing same-line metadata (`e: Primary`); colors the highlighted muscle, its leader, and its label.
2562
+ - **Note** — bare indented body line (like `pyramid`/`ring`); the first note prints beneath the muscle's gutter label.
2563
+
2564
+ #### Options
2565
+
2566
+ - `no-legend` — hide the tag legend.
2567
+
2474
2568
  ### 16.4B Version-Control Diagrams
2475
2569
 
2476
2570
  <!-- TYPE:version-control -->
@@ -3528,6 +3622,317 @@ In the desktop app a block diagram is interactive: click a container header to c
3528
3622
 
3529
3623
  ---
3530
3624
 
3625
+ ## 24E. Sketch Diagrams
3626
+
3627
+ <!-- TYPE:sketch -->
3628
+
3629
+ <!-- TIPS start -->
3630
+ **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 2 half-slots apart on one axis. Alias any shape an edge references (`as con`). Never write `size:`, colors, fonts, or a `shape:` outside the closed set (database, queue, cloud, person, document, note). In sketch, `~` dashed means secondary emphasis, NOT async. Categorize with a tag group instead of reaching for more shape kinds — 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.
3631
+ <!-- TIPS end -->
3632
+
3633
+ 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.
3634
+
3635
+ ### Declaration
3636
+
3637
+ ```
3638
+ sketch [Title]
3639
+ ```
3640
+
3641
+ ### Example
3642
+
3643
+ ```
3644
+ sketch Plunder Pipeline
3645
+
3646
+ tag Crew
3647
+ Deck
3648
+ Hold
3649
+
3650
+ Spyglass Feed shape: cloud, at: 0 0, crew: Deck
3651
+ -sightings-> con
3652
+ Captain's Console as con at: 2 0, crew: Deck
3653
+ -orders-> bq
3654
+ Divvy Service as dvy at: 4 0, crew: Hold
3655
+
3656
+ [Below Decks] at: 2 2, crew: Hold
3657
+ Booty Queue as bq shape: queue, at: 0 0
3658
+ ~haul~> dvy
3659
+ Ship Ledger as ledger shape: database, at: 2 0
3660
+
3661
+ [Armory] as armory at: 0 2, collapsed
3662
+ Powder Store at: 0 0
3663
+ ```
3664
+
3665
+ ### Shapes
3666
+
3667
+ One top-level line = one shape — a **bare name** plus same-line `key: value` metadata. `shape:` morphs from the default rectangle: `database`, `queue`, `cloud`, `person`, `document`, `note` (rectangle is never written; unknown values warn and fall back). `note` renders as a sticky-style card with smaller left-aligned multiline text. Duplicate labels are legal **when aliased** (`Cache as c1` / `Cache as c2`); unaliased duplicates merge (standard dgmo semantics).
3668
+
3669
+ ### Coordinates — `at: C R`
3670
+
3671
+ 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.
3672
+
3673
+ ### Lines
3674
+
3675
+ 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.
3676
+
3677
+ ### Boxes
3678
+
3679
+ `[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.
3680
+
3681
+ ### Node Metadata
3682
+
3683
+ | Key | Type | Default | Description |
3684
+ | --------- | -------------- | --------- | ----------------------------------------------- |
3685
+ | `shape` | closed set | rectangle | `database` / `queue` / `cloud` / `person` / `document` / `note` |
3686
+ | `at` | `C R` integers | flow-placed | Half-slot position (origin-normalized) |
3687
+ | `collapsed` | flag | — | Box only — start folded (collapse-bar) |
3688
+ | `<tag>` | declared value | untagged (neutral gray) | Tag value (cascades from box; edge tails color the line) |
3689
+
3690
+ ### Directives
3691
+
3692
+ | Directive | Effect |
3693
+ | ------------ | ----------------------- |
3694
+ | `no-legend` | Hide the tag legend. |
3695
+
3696
+ ### Interactivity vs export
3697
+
3698
+ 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.
3699
+
3700
+ ---
3701
+
3702
+ ## 24E. Goal
3703
+
3704
+ <!-- TYPE:goal -->
3705
+
3706
+ <!-- TIPS start -->
3707
+ **Styling tips:** A single progress-toward-a-target reading — one `now` against one `target`, answering "how close am I?". Reach for it for a KPI tile, a fundraising thermometer, a quarterly quota, or a completion percentage; there is no time axis, series, or milestones (use `line` for a trend, `countdown` for a live deadline). Put the **unit in the title** (`Marathon Fund ($)`, `Grog Barrel Fill (L)`) — there is no format/currency directive. `now` and `target` are **space-separated `key value`** directives, no colon (`now 6400` / `target 10000`); the percent is `now / target` and values auto-compact (`6.4k`, `1.2M`). Pick the face for the story with a bare flag on its own line: the default progress **bar** for a plain KPI, `thermometer` for fundraising/fill-the-tank framings, `gauge` for a speedometer/quota dial — all three read the same value pair. The fill is **auto traffic-light** by completion (`< 50%` red, `50–80%` orange, `≥ 80%` green; over-target stays green) so the color already reads the number's health — leave it unless you have reason to override with a trailing color on the title line (`goal Marathon Fund ($) green`) or `no-auto-color` (flat palette color). Over-target clamps the fill at 100% while the `%` label stays truthful (`120%`). Add a `note` — inline (`note Still waiting on three crews`) or a block header on its own line with an indented body — to caption the number with context (who's still owed, what's left); it takes simple markdown (`**bold**`, `*italic*`, `` `code` ``) and `- ` bullets. `solid-fill` for a bolder fill; `no-percent` / `no-value` / `no-title` / `no-note` to drop labels.
3708
+ <!-- TIPS end -->
3709
+
3710
+ A single progress-toward-a-target value: one `now` measured against one `target`, drawn in one of three static faces. No time axis, no series, no milestones — just "how close am I?". The face is a bare-flag mode directive under the title (like treemap's `radial`); all three faces consume the same value pair.
3711
+
3712
+ ### Declaration
3713
+
3714
+ ```
3715
+ goal [Title with unit]
3716
+
3717
+ [thermometer | gauge] // omit for the default progress bar
3718
+ now <number>
3719
+ target <number>
3720
+ ```
3721
+
3722
+ ### Example
3723
+
3724
+ ```
3725
+ goal Doubloons Recovered ($)
3726
+
3727
+ thermometer
3728
+
3729
+ now 6400
3730
+ target 10000
3731
+ ```
3732
+
3733
+ ### Directives
3734
+
3735
+ | Directive | Effect |
3736
+ | ---------------------- | ------------------------------------------------------------- |
3737
+ | `thermometer` / `gauge`| Select the render face (bare flag; omit for the progress bar). |
3738
+ | `now <number>` | Current value (required; may exceed the target). |
3739
+ | `target <number>` | Goal value (required; must be > 0). |
3740
+ | `no-percent` | Hide the `%` label. |
3741
+ | `no-value` | Hide the raw `now / target` label. |
3742
+ | `solid-fill` | Full-saturation fill instead of the default 25% tint. |
3743
+ | `no-title` | Hide the banner title. |
3744
+ | `no-note` | Suppress the `note` block even if one is authored. |
3745
+ | `no-auto-color` | Disable the traffic-light bands; use the flat palette color. |
3746
+ | `note <text>` / `note` + indented body | Free-text caption beside/below the face (§ note block). |
3747
+
3748
+ ### Note block
3749
+
3750
+ An optional caption. Inline (`note Still waiting on three crews`) or a block header on its own line followed by an **indented body**:
3751
+
3752
+ ```
3753
+ goal Grog Barrel Fill (L)
3754
+ thermometer
3755
+ now 34
3756
+ target 50
3757
+ note
3758
+ **Great job, crew!** Still waiting on tallies from:
3759
+ - Seattle — first mate says "soon"
3760
+ - Columbus — *almost there!*
3761
+ ```
3762
+
3763
+ The body supports inline `**bold**` / `*italic*` / `` `code` ``, `- `/`* ` bullets, and blank-line gaps. It renders in the left column for `thermometer`/`gauge` and under the bar for the default face. `no-note` hides it even when authored.
3764
+
3765
+ ### Values & color
3766
+
3767
+ Values accept `_` separators (`10_000`) but not thousands commas; the unit lives in the title. Color precedence: (1) an explicit trailing color token on the title line (`goal Marathon Fund ($) green`, §1.5) always wins; (2) otherwise the **auto traffic-light** band by completion — `< 50%` red, `50–80%` orange, `≥ 80%` green (over-target stays green), which needs a `target`; (3) `no-auto-color` disables the bands and falls back to the palette series color. The fill is a 25% tint of the resolved color; `solid-fill` opts into full saturation.
3768
+
3769
+ ### Semantics
3770
+
3771
+ Percent is `now / target`. Over-target clamps the fill at 100% while the `%` label shows the true value (e.g. `120%`); the gauge needle pins at max. A negative `now` clamps the fill to 0% but keeps the label truthful. A missing or ≤ 0 `target` emits an error-severity diagnostic and the chart falls back to a 0% shell; a missing `now` is treated as 0 with a warning.
3772
+
3773
+ ---
3774
+
3775
+ ## 24E. Countdown
3776
+
3777
+ <!-- TYPE:countdown -->
3778
+
3779
+ <!-- TIPS start -->
3780
+ **Styling tips:** The only dynamic chart — it ticks every second and is accurate on every load, so use it for a live "N days until X" widget, not a static report. Keep the title to the event (`Trip to Japan`); the target date renders as a caption automatically. `target` is a space-separated `key value` directive (no colon): a bare date (`2026-08-21`) counts to the viewer's local midnight, a datetime or offset is honored. Default `units days` reads best for weeks/months out; use `units full` for a launch-day `Nd HH:MM:SS` clock. Set `expired` to the celebration text (`🚀 Shipped!`); after the target passes every live surface shows it and the tick stops. On images (PNG export, `.svg` via `<img>`, GitHub camo) it can't tick and shows the whole-day count baked at export time — the correct fallback.
3781
+ <!-- TIPS end -->
3782
+
3783
+ The only *dynamic* dgmo chart: a single "N days until X" recomputed against the viewer's clock on every load and ticking every second on any live surface. Distinct from `goal` (static) — a countdown has no `now`/`target` pair, just one future instant. The renderer bakes a whole-day fallback number (the no-JS floor); a tiny page-level ticker overwrites it live and, in `units full`, upgrades it to `Nd HH:MM:SS`.
3784
+
3785
+ ### Declaration
3786
+
3787
+ ```
3788
+ countdown [Title]
3789
+
3790
+ target <ISO date | datetime | now>
3791
+ units <days | full> // default days
3792
+ expired <text> // default "Now!"
3793
+ ```
3794
+
3795
+ ### Example
3796
+
3797
+ ```
3798
+ countdown Trip to Japan
3799
+
3800
+ target 2026-08-21
3801
+ ```
3802
+
3803
+ ### Directives
3804
+
3805
+ | Directive | Effect |
3806
+ | ----------------------- | ---------------------------------------------------------------------- |
3807
+ | `target <iso>` | The future instant (required). `2026-08-21`, `2026-08-21T18:00`, or with a tz offset. The literal `now` resolves at render (→ immediately expired; for testing). |
3808
+ | `units <days\|full>` | `days` (default) shows whole days (ceil); `full` ticks `Nd HH:MM:SS` on live surfaces. |
3809
+ | `expired <text>` | Shown once the target passes; the tick stops. Default `"Now!"`. |
3810
+
3811
+ ### Values & color
3812
+
3813
+ A bare `YYYY-MM-DD` counts to the viewer's **local midnight**; a datetime with no offset is viewer-local; an explicit offset is honored. The trailing-token color rule (§1.5) applies to the title line (`countdown Trip to Japan blue`) and tints the figure.
3814
+
3815
+ ### Semantics
3816
+
3817
+ Days mode uses `ceil` — a target later *today* reads "1 day", not "0". Full mode floors the days and shows `HH:MM:SS` for the remainder. Once the target passes, the `expired` text replaces the number and that node stops ticking (no negative counts). Live surfaces recompute from the absolute target on every load/route-change/note-open, so there is **no persisted state** and no drift; image surfaces (PNG, `.svg`-as-image, GitHub camo) show the whole-day count baked at export time.
3818
+
3819
+ ---
3820
+
3821
+ ## 24Eb. Clock
3822
+
3823
+ <!-- TYPE:clock -->
3824
+
3825
+ <!-- TIPS start -->
3826
+ **Styling tips:** A live world clock — one panel per person or place, each showing the CURRENT time in its zone and ticking every second, accurate the instant the page loads. Reach for it to answer "what time is it for the crew right now": a distributed team's local times, a single collaborator's clock, or the overlap window for scheduling a call. The first line declares the type and a title (`Crew standups`). Each entry is one line, `<place> <IANA/Zone> [as <label>]`: a human-readable place, then a real IANA zone (`Europe/London`, `America/New_York`, `America/Los_Angeles`, `Asia/Tokyo`) — never a bare offset like `GMT+1`, which doesn't track daylight saving. Use `as <label>` to name the person or role behind a zone (`New York America/New_York as Dani (NY)`); the label becomes the caption. The single-clock case is common and encouraged — one title, one entry (`clock Dani` / `New York America/New_York`). Global directives are flat, no colon: `analog` for analog dials (digital is the default face), `time-24` for a 24-hour readout (12h am/pm is the default), and optional context bands `hours 9-17` + `days mon-fri` (the window accepts `HH:MM` and am/pm, e.g. `hours 8:30-17:15`) to shade each zone's working window so out-of-hours people read at a glance. `no-sun` hides the sunrise/sundown indicator (on by default). Add `hours`/`days` only when the point is scheduling overlap; drop them for a plain "current time" widget. Zones are **colorized by default** (`color-by`, default `place` — a distinct palette accent per place); reach for a semantic mode when color should *mean* something: `color-by time` or `color-by daylight` make an at-a-glance world board read as day-vs-night (order the zones west→east so the daylight sweeps across), and `color-by work` turns a standup/team board green/amber/grey by availability — it needs `hours` set. A hand-set per-zone color (`London Europe/London as UK team purple`) is a **defined** shade that always wins over the dimension, so you can pin one zone and let the rest follow. `color-by none` goes neutral. On image surfaces (PNG, `.svg` via `<img>`, GitHub camo) it can't tick and bakes the time at export — the correct graceful fallback.
3827
+ <!-- TIPS end -->
3828
+
3829
+ The second *dynamic* dgmo chart (with `countdown`): a live board of world clocks recomputed against the viewer's clock every second. Flat syntax — the first line is `clock <Title>`; every other non-blank line is either a board-level directive (its first token is an option keyword) or a place row. Order-independent; no colons anywhere.
3830
+
3831
+ ### Declaration
3832
+
3833
+ ```
3834
+ clock [Title]
3835
+
3836
+ analog // analog dials; digital is the default face
3837
+ hours <start>-<end> // optional working window (24h, HH:MM or am/pm)
3838
+ days <mon-fri | mon,wed,fri> // optional working days (default mon-fri)
3839
+ no-sun // hide the sundown/sunrise line (on by default)
3840
+ time-24 // 24-hour readout (12h am/pm is the default)
3841
+ no-title // suppress the board title
3842
+ direction lr // lay the panels out in a row
3843
+ color-by <place|work|daylight|time|none> // zone coloring; default place
3844
+
3845
+ <place tokens…> <IANA/Zone> [as <label…>]
3846
+ ```
3847
+
3848
+ ### Example
3849
+
3850
+ ```
3851
+ clock Crew standups
3852
+ hours 9-17
3853
+ days mon-fri
3854
+
3855
+ London Europe/London as UK team
3856
+ New York America/New_York as Dani (NY)
3857
+ Los Angeles America/Los_Angeles as West coast
3858
+ ```
3859
+
3860
+ ### Directives
3861
+
3862
+ | Directive | Effect |
3863
+ | ---------------------- | ---------------------------------------------------------------------- |
3864
+ | `analog` | Analog dials for the WHOLE board. Digital is the default face. |
3865
+ | `hours <start>-<end>` | Working window (e.g. `9-17`, `8:30-17:15`, or am/pm); drives the status chip, evaluated in each row's own zone. |
3866
+ | `days <range\|list>` | Working days: `mon-fri` or `mon,wed,fri`. Default Mon–Fri. No effect without `hours`. |
3867
+ | `no-sun` | Hide the sundown/sunrise line (on by default when the zone's city coordinates are known). |
3868
+ | `time-24` | 24-hour readout (12-hour am/pm is the default). |
3869
+ | `no-title` | Suppress the board title. |
3870
+ | `direction lr` | Lay the panels out in a row (columns) instead of stacked. |
3871
+ | `color-by <place\|work\|daylight\|time\|none>` | Which dimension colors the zones. Default `place`; `color-by none` goes neutral. `place` = identity accent per place; `work` = green/amber/grey by the `hours` window; `daylight` = warm sun-up / cool sun-down; `time` = local-hour dawn→night ramp (order zones west→east). A hand-set (**defined**) per-zone trailing color always wins over the dimension. |
3872
+
3873
+ ### Entry grammar
3874
+
3875
+ Each place row is `<place tokens…> <IANA/Zone> [as <label…>]`. The zone is the token containing `/` (a full IANA name like `America/New_York`); text before it is the place, and `as <label>` sets the display alias (default = place). A row that is just a zone (`Asia/Tokyo`) uses the zone's city as the place.
3876
+
3877
+ ### Semantics
3878
+
3879
+ Each row's time comes from `Intl.DateTimeFormat` with that row's zone, so DST is always correct. The renderer bakes the time, hands, offset, status, and sundown line at render (the no-JS floor); a tiny page-level ticker recomputes them from the baked zone/coords every second — no persisted state, no drift. Image surfaces (PNG, `.svg`-as-image, GitHub camo) show the time baked at export.
3880
+
3881
+ ---
3882
+
3883
+ ## 24F. Bracket
3884
+
3885
+ <!-- TYPE:bracket -->
3886
+
3887
+ <!-- TIPS start -->
3888
+ **Styling tips:** A single-elimination tournament bracket: winners auto-advance rightward toward a championship. Reach for it for playoff trees, knockout draws, and seeded fields. Two ways to author: seed the field for a **day-0 skeleton** (`seed 1 Team A`, `seed 2 Team B` …) and let matches fill in, or list results casually as `A beats B` / `A vs B` lines and let winners flow forward. Name the columns with `rounds` (comma-separated, e.g. `rounds Quarterfinals, Semifinals, Final`) or an indented `rounds` block with per-round colors. The two sides mirror inward to the final. Color a competitor's box outline with a `tag` group; `accent` overrides the winner highlight (default blue). `single-elim` is the default; opt-outs are `no-round` (hide column labels) and `no-legend`.
3889
+ <!-- TIPS end -->
3890
+
3891
+ A single-elimination tournament bracket. Winners auto-advance up a tree that builds itself from the results — a one-sided ladder for a simple pool, or two `[Side]` columns that mirror inward and meet at a championship (MLB / NBA / NCAA-style). Any `seed` line switches on **seeded mode** (day-0 skeleton); otherwise the bracket is **casual** (structure inferred from `beats` / `vs` lines).
3892
+
3893
+ ### Declaration
3894
+
3895
+ ```
3896
+ bracket [Title]
3897
+ rounds [Col1, Col2, ...] // optional column names, entry round → inner
3898
+
3899
+ [Side] [color] // optional — two sides mirror to a center final
3900
+ seed N [Competitor] // seeded mode: declare the field (day-0 skeleton)
3901
+ [Winner] beats [Loser] [score] // decided match — WINNER on the left, score cosmetic
3902
+ [A] vs [B] // pending match — no winner yet
3903
+ ```
3904
+
3905
+ ### Example
3906
+
3907
+ ```
3908
+ bracket Grog Cup
3909
+
3910
+ Black Pearl beats Sea Serpent 5-3
3911
+ Salty Dog beats Kraken 4-2
3912
+ Black Pearl beats Salty Dog 6-5
3913
+ ```
3914
+
3915
+ ### Directives
3916
+
3917
+ | Directive | Effect |
3918
+ | ------------------------------ | ---------------------------------------------------------------------------- |
3919
+ | `rounds A, B, C` | Name the columns entry-round → inner (or an indented block with per-round `Name color`); absent → generic `Round N` / `Final`. |
3920
+ | `seed N [Name] [k: v]` | Declare a seeded entrant → seeded mode + day-0 skeleton (top seeds get byes); trailing `k: v` tags the team. |
3921
+ | `tag Group [as g]` | Tag group (block/kanban idiom) — a competitor's tag value colors its box outline; a legend renders. |
3922
+ | `[Side] [color]` | A bracket column (kanban idiom); two sides mirror to a center championship. |
3923
+ | `[Winner] beats [Loser] [score] [@ Home]` | A decided match — the left name advances; score is cosmetic; `@ Home` marks the host. Indent prose under it for commentary. |
3924
+ | `[A] vs [B]` | A pending, undecided match (both boxes drawn, no winner emphasis). |
3925
+ | `accent <color>` | Winner accent color override (default blue). Tags/sides still win per-box. |
3926
+ | `no-round` | Suppress the round/column labels. |
3927
+ | `no-legend` | Hide the tag legend (outlines still colored). |
3928
+ | `single-elim` / `double-elim` / `seeded` | Format flags. `double-elim` reserved — not yet supported; `seeded` forces seeded mode. |
3929
+
3930
+ ### Semantics
3931
+
3932
+ The winner is always the left operand of `beats`, regardless of the score; a score that shows the winner lower emits a warning but keeps the declared winner. Reusing a name advances that competitor (same string = same entrant); a competitor whose first appearance is a later round simply never played round 1 (a bye). In seeded mode the field builds the standard single-elim skeleton (recursive 1-vs-N seeding: `3v6` / `4v5` for a six-team side, top seeds bye), every slot renders on day 0, and `beats` lines overwrite the `TBD` slots as games are played. Duplicate competitor names error (names are identifiers); `double-elim` parses but emits a "not yet supported" diagnostic.
3933
+
3934
+ ---
3935
+
3531
3936
  ## 24A. RACI Matrices (RACI / RASCI / DACI)
3532
3937
 
3533
3938
  <!-- TYPE:raci -->
@@ -0,0 +1,17 @@
1
+ body Powder Monkey Push Day
2
+ muscle
3
+ front
4
+
5
+ tag Effort as e
6
+ Primary red
7
+ Secondary orange
8
+ Warm-up yellow
9
+
10
+ chest e: Primary
11
+ Barbell bench press — 4×8
12
+ deltoids e: Primary
13
+ Overhead press — 3×10
14
+ triceps e: Secondary
15
+ Rope pushdowns — 3×12
16
+ abs e: Warm-up
17
+ Plank — 3×45s