@diagrammo/dgmo 0.49.0 → 0.50.1

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 (198) hide show
  1. package/.cursorrules +6 -2
  2. package/.github/copilot-instructions.md +6 -2
  3. package/.windsurfrules +6 -2
  4. package/SKILL.md +6 -2
  5. package/dist/advanced.js +557 -195
  6. package/dist/auto.js +129 -119
  7. package/dist/auto.mjs +19496 -12761
  8. package/dist/block.js +145 -48
  9. package/dist/{charts-d3-EW3YQTEA.js → charts-d3-LR6D3D7A.js} +5 -5
  10. package/dist/{chunk-5FGDJIJX.js → chunk-2C56LEML.js} +3 -3
  11. package/dist/{chunk-XJ7J6WOO.js → chunk-2KGXHFYK.js} +4 -4
  12. package/dist/{chunk-T7IKPCMI.js → chunk-3LH5CLP4.js} +3 -3
  13. package/dist/{chunk-ZDUQGL3N.js → chunk-3LKM6FMW.js} +2 -2
  14. package/dist/{chunk-4FIV4K4Z.js → chunk-3NODSS6A.js} +7 -7
  15. package/dist/{chunk-4BD7EVPK.js → chunk-3P2DKJCG.js} +2 -2
  16. package/dist/{chunk-TC3YWBFO.js → chunk-3UIKSPFB.js} +35 -9
  17. package/dist/{chunk-SJEGO2QL.js → chunk-3XGZF2QJ.js} +4 -4
  18. package/dist/chunk-3XPUDB7B.js +420 -0
  19. package/dist/{chunk-O5MQPK7E.js → chunk-3Y2DRD7S.js} +3 -3
  20. package/dist/chunk-3YPY3OXD.js +354 -0
  21. package/dist/{chunk-N4J5KGWG.js → chunk-4MJ7M6YL.js} +8 -8
  22. package/dist/{chunk-JFPY3UJ7.js → chunk-4S52SK6G.js} +8 -8
  23. package/dist/{chunk-ALRHIR6I.js → chunk-5GJYGP5Z.js} +4 -4
  24. package/dist/{chunk-SQDFK5ZQ.js → chunk-5OWVC2A6.js} +3 -3
  25. package/dist/{chunk-7VLUGEMJ.js → chunk-66NVRO4K.js} +4 -4
  26. package/dist/{chunk-ZREZOIGS.js → chunk-66RUL3XF.js} +6 -6
  27. package/dist/{chunk-MJCG5K2O.js → chunk-6BFZKBGD.js} +2 -2
  28. package/dist/{chunk-2WMBWZY2.js → chunk-6HJBFVLO.js} +3 -3
  29. package/dist/{chunk-XCC2RENT.js → chunk-6IAA2QQ2.js} +2 -2
  30. package/dist/{chunk-B57V3DWN.js → chunk-7L3R6I3U.js} +3 -3
  31. package/dist/chunk-7PQYTZMA.js +681 -0
  32. package/dist/{chunk-6SA7FJE4.js → chunk-7QKLIMRZ.js} +10 -10
  33. package/dist/{chunk-YTN572Q2.js → chunk-7TV5Y53Y.js} +2 -2
  34. package/dist/{chunk-6CLKNXVP.js → chunk-BBGDM4NQ.js} +457 -78
  35. package/dist/{chunk-3NFJWFNP.js → chunk-BDXC7MDK.js} +1045 -124
  36. package/dist/{chunk-D5AVQCDN.js → chunk-BH3UYK36.js} +3 -3
  37. package/dist/chunk-BTUTZMPT.js +482 -0
  38. package/dist/{chunk-LVHPTBO3.js → chunk-C2CVAM3U.js} +4 -4
  39. package/dist/{chunk-BCT5G2VN.js → chunk-DFTFPYUD.js} +5 -5
  40. package/dist/{chunk-KV6Y2HE6.js → chunk-DSWVNQVS.js} +4 -4
  41. package/dist/{chunk-4YNP6O47.js → chunk-DZXYF2F5.js} +13 -3
  42. package/dist/{chunk-FUCAB3KQ.js → chunk-EAMEADTV.js} +3 -3
  43. package/dist/chunk-FA6K3FWM.js +940 -0
  44. package/dist/{chunk-HBVD67XG.js → chunk-FJUNPCYI.js} +2 -2
  45. package/dist/{chunk-6VE3VLWM.js → chunk-GBE54KY6.js} +6 -5
  46. package/dist/{chunk-YRVLP7UU.js → chunk-GKC3HILQ.js} +4 -4
  47. package/dist/{chunk-ZXL6MB4R.js → chunk-GL5UZ6NY.js} +3 -3
  48. package/dist/{chunk-GB3YZTAM.js → chunk-H73FP42Q.js} +5 -5
  49. package/dist/{chunk-4UDKKGHH.js → chunk-HEVYAHLW.js} +2 -2
  50. package/dist/{chunk-DDTJ5N7Q.js → chunk-HLJVEAOF.js} +6 -6
  51. package/dist/{chunk-CLR4A2N2.js → chunk-HTMN2Z6U.js} +4 -4
  52. package/dist/{chunk-TLKMTQYL.js → chunk-I2WKW7C7.js} +3 -3
  53. package/dist/{chunk-IUK7AGD4.js → chunk-I7F2A35O.js} +2 -2
  54. package/dist/{chunk-IBC35BTK.js → chunk-IUMPEA64.js} +2 -2
  55. package/dist/{chunk-5XCM7UUW.js → chunk-J6K7RP6P.js} +100 -36
  56. package/dist/{chunk-AJ2PEY7J.js → chunk-JJUOHGX2.js} +2 -2
  57. package/dist/{chunk-CEHZOPGM.js → chunk-KFZYNWWO.js} +2 -2
  58. package/dist/{chunk-4NQ3IKUM.js → chunk-KHEYDLMT.js} +5 -5
  59. package/dist/{chunk-YM2BSPYW.js → chunk-LE4MYMLI.js} +2 -2
  60. package/dist/{chunk-PU3AUQPA.js → chunk-M5RXSRO2.js} +2 -2
  61. package/dist/{chunk-XKTN7CZF.js → chunk-MCZ5LBZD.js} +4 -4
  62. package/dist/{chunk-35BBZDFE.js → chunk-NU3XLTGP.js} +4 -4
  63. package/dist/{chunk-BPIJLRYE.js → chunk-NWED7CYO.js} +3 -3
  64. package/dist/{chunk-YYX3SU6H.js → chunk-OMNGQPEZ.js} +257 -101
  65. package/dist/{chunk-BGJV5ATD.js → chunk-ONA5KPV3.js} +2 -2
  66. package/dist/{chunk-ZNQX6QWH.js → chunk-OTAL43EH.js} +6 -2
  67. package/dist/{chunk-F743CM2N.js → chunk-OTQKUHRS.js} +3 -3
  68. package/dist/{chunk-KUBBJ2CD.js → chunk-P7CE7LXL.js} +6 -6
  69. package/dist/{chunk-UVCXZEGU.js → chunk-PFHVU7UA.js} +2 -2
  70. package/dist/{chunk-5ZZLLBFK.js → chunk-PGEGPSCZ.js} +2 -2
  71. package/dist/chunk-Q4V4XQWV.js +158 -0
  72. package/dist/{chunk-IHLSHCPZ.js → chunk-QJP6PG7F.js} +5 -5
  73. package/dist/{chunk-EYN7VFKL.js → chunk-QROYX7TT.js} +3 -3
  74. package/dist/chunk-QXKWYZNR.js +379 -0
  75. package/dist/{chunk-VC3TR4NL.js → chunk-RZ6YKEUJ.js} +3 -3
  76. package/dist/{chunk-K6HNAY5V.js → chunk-SCHXJTZL.js} +2 -2
  77. package/dist/{chunk-7OVSJI2V.js → chunk-SQLNBA64.js} +3 -3
  78. package/dist/{chunk-65RTDUZH.js → chunk-SXRTRMEE.js} +3 -3
  79. package/dist/{chunk-3BIAFYD2.js → chunk-T4VOVZT5.js} +2 -2
  80. package/dist/{chunk-UWDO3O52.js → chunk-TN35C5KM.js} +2 -2
  81. package/dist/{chunk-IFK3GIUW.js → chunk-TSA237IM.js} +2 -2
  82. package/dist/{chunk-DKEPS5LH.js → chunk-U2HGPLZS.js} +36 -2
  83. package/dist/{chunk-4HVNZ7WF.js → chunk-VBYSIOOY.js} +3 -3
  84. package/dist/{chunk-ZTLWVRNS.js → chunk-VDOOQZUD.js} +2 -2
  85. package/dist/{chunk-RTERS6S5.js → chunk-VUJGMJE6.js} +4 -4
  86. package/dist/{chunk-X2CH42BN.js → chunk-VVW3F3MD.js} +7 -7
  87. package/dist/{chunk-RI4NIMFP.js → chunk-VVZRV54S.js} +75 -35
  88. package/dist/{chunk-LG4TWW4U.js → chunk-WW32K72E.js} +8 -8
  89. package/dist/{chunk-NVT6C2VE.js → chunk-X6EZPSW6.js} +4 -4
  90. package/dist/{chunk-KQAEKMIX.js → chunk-XDXNDSKO.js} +2 -2
  91. package/dist/{chunk-FMKTYMP4.js → chunk-XJLKLU4D.js} +3 -3
  92. package/dist/chunk-Y4RNXEAO.js +952 -0
  93. package/dist/{chunk-26RVGM44.js → chunk-YIA4LEX4.js} +15 -7
  94. package/dist/chunk-YNRDWYZP.js +295 -0
  95. package/dist/{chunk-SGHSY3LU.js → chunk-Z6XJQ6KO.js} +81 -6
  96. package/dist/{chunk-SVDWQGX2.js → chunk-ZAD4HV2G.js} +139 -78
  97. package/dist/cli.cjs +153 -144
  98. package/dist/clock.d.ts +10 -0
  99. package/dist/clock.js +235 -0
  100. package/dist/countdown.d.ts +12 -0
  101. package/dist/countdown.js +450 -0
  102. package/dist/dgmo-router-YTU3ENAX.js +84 -0
  103. package/dist/{dimensions-WSIJXT5Q.js → dimensions-OTBKC5M6.js} +5 -5
  104. package/dist/editor.js +39 -1
  105. package/dist/element.js +131 -121
  106. package/dist/element.mjs +19496 -12761
  107. package/dist/{flowchart-parser-IVZN7CQN.js → flowchart-parser-OE4WHLTF.js} +4 -4
  108. package/dist/{flowchart-renderer-GMI2U3DD.js → flowchart-renderer-GPCSMTOR.js} +6 -6
  109. package/dist/highlight.d.ts +17 -1
  110. package/dist/highlight.js +156 -5
  111. package/dist/index.js +50 -45
  112. package/dist/{layout-HQMBPJVS.js → layout-46366KBT.js} +2 -2
  113. package/dist/{layout-D42XE4RE.js → layout-5BG6DFCU.js} +3 -3
  114. package/dist/{layout-K2ZN3Q42.js → layout-7MZ5NF2N.js} +4 -4
  115. package/dist/{layout-4Z5JM7PT.js → layout-FWODLIMP.js} +4 -4
  116. package/dist/{layout-GZ2CWONU.js → layout-J36454XU.js} +4 -4
  117. package/dist/{layout-S3EK4IYO.js → layout-LD6XTLD6.js} +4 -4
  118. package/dist/{parser-CLMFZWCC.js → parser-36HVKU5U.js} +5 -5
  119. package/dist/{parser-MCJWF5G3.js → parser-4AI5ZN5F.js} +3 -3
  120. package/dist/{parser-DERPY5KC.js → parser-4NO6VZ6S.js} +4 -4
  121. package/dist/parser-4WQQQXCG.js +13 -0
  122. package/dist/{parser-4ROBKVUR.js → parser-5OXGPNBF.js} +5 -5
  123. package/dist/{parser-XWUDFJ7P.js → parser-AGVYTQXV.js} +4 -4
  124. package/dist/{parser-TITK4YW6.js → parser-AXKBDGNO.js} +5 -5
  125. package/dist/parser-B5FVS7O6.js +11 -0
  126. package/dist/parser-CSFUN3CT.js +14 -0
  127. package/dist/parser-CVMEDULU.js +15 -0
  128. package/dist/{parser-KPMN5KKE.js → parser-D5VILGN2.js} +4 -4
  129. package/dist/{parser-IKZFTLOJ.js → parser-DFFEDKHH.js} +3 -3
  130. package/dist/{parser-JD7OQ2E6.js → parser-H3XEPFPV.js} +4 -4
  131. package/dist/{parser-UBGPTIZD.js → parser-HYRTF3DO.js} +3 -3
  132. package/dist/{parser-K647FRI4.js → parser-IBWNAPY4.js} +3 -3
  133. package/dist/{parser-4BKIFG2C.js → parser-IJBMRXMC.js} +5 -5
  134. package/dist/{parser-MBJSBTL5.js → parser-JJR52VAT.js} +5 -5
  135. package/dist/{parser-SMBJO3XN.js → parser-K3XXLMUW.js} +4 -4
  136. package/dist/{parser-OBQG655V.js → parser-KCR2WS3V.js} +4 -4
  137. package/dist/{parser-HVJFTOXL.js → parser-LWKKBNSA.js} +3 -3
  138. package/dist/{parser-ZYC3XGNS.js → parser-MPCE5JBG.js} +4 -4
  139. package/dist/{parser-QJYS7KQQ.js → parser-MTOMTWTD.js} +4 -4
  140. package/dist/{parser-GFSOPDB7.js → parser-O4HIUN6G.js} +4 -4
  141. package/dist/{parser-BL7Z72EY.js → parser-PSA4UBSP.js} +4 -4
  142. package/dist/{parser-TNYX5S7E.js → parser-RV4M6AS2.js} +4 -4
  143. package/dist/parser-RZPVAQVX.js +11 -0
  144. package/dist/{parser-UGA23PYK.js → parser-TGQZJ5OT.js} +4 -4
  145. package/dist/parser-TXND652E.js +13 -0
  146. package/dist/{parser-WISPH7LW.js → parser-VKOJM7KS.js} +4 -4
  147. package/dist/{parser-ZKF5K2H2.js → parser-W4PQUGX3.js} +4 -4
  148. package/dist/{parser-MRBPXXIV.js → parser-WAV5JRPT.js} +4 -4
  149. package/dist/{parser-D6ONJQFR.js → parser-YS7TOS2K.js} +3 -3
  150. package/dist/pert.d.ts +8 -0
  151. package/dist/{renderer-VFUVRNLK.js → renderer-2AZ5HJFK.js} +4 -4
  152. package/dist/{renderer-V3JEMWMM.js → renderer-2QPMJ2DA.js} +6 -6
  153. package/dist/renderer-45PSOL3E.js +19 -0
  154. package/dist/{renderer-BB5PREMY.js → renderer-4ITCHBT7.js} +4 -4
  155. package/dist/{renderer-XEKIRPI6.js → renderer-5DSEWF74.js} +5 -5
  156. package/dist/{renderer-QNHUXCRL.js → renderer-6OKF44KS.js} +9 -9
  157. package/dist/renderer-72LGR2YF.js +14 -0
  158. package/dist/{renderer-YHXPN3GF.js → renderer-7SD6MSBS.js} +7 -7
  159. package/dist/renderer-A5VE5BCI.js +24 -0
  160. package/dist/{renderer-A5VFZQQK.js → renderer-AUW2BE6G.js} +6 -6
  161. package/dist/{renderer-LWGJFT3D.js → renderer-B5TBNZJE.js} +5 -5
  162. package/dist/{renderer-4IUPINAE.js → renderer-BSR2O2H6.js} +7 -7
  163. package/dist/{renderer-DKESNMU5.js → renderer-CYB4LK3G.js} +6 -6
  164. package/dist/{renderer-MFJ7HY2H.js → renderer-FF24KZCI.js} +5 -5
  165. package/dist/{renderer-CGW7QPNA.js → renderer-FPE3J5VZ.js} +7 -7
  166. package/dist/{renderer-6T3KK4S3.js → renderer-FYSVXL7M.js} +7 -7
  167. package/dist/{renderer-THD6V5TL.js → renderer-HDCCZURL.js} +9 -7
  168. package/dist/{renderer-TPIBXNOS.js → renderer-JCCHNECZ.js} +6 -6
  169. package/dist/{renderer-QL5KO6SK.js → renderer-KS7YZJE2.js} +7 -7
  170. package/dist/{renderer-SQ3JUAI7.js → renderer-NGXZTRK6.js} +6 -6
  171. package/dist/{renderer-MJDDU27W.js → renderer-ODUUOPVT.js} +10 -10
  172. package/dist/renderer-PJM35LJN.js +17 -0
  173. package/dist/{renderer-TYXRHMRI.js → renderer-PPIHO5FI.js} +9 -9
  174. package/dist/{renderer-W5RMOURB.js → renderer-PSMMZCKH.js} +6 -6
  175. package/dist/{renderer-UZF3JROD.js → renderer-QAOBLRXV.js} +8 -8
  176. package/dist/{renderer-ROV756WT.js → renderer-R2WNIC2C.js} +5 -5
  177. package/dist/{renderer-VICQ4WNY.js → renderer-SBS3YWU5.js} +5 -5
  178. package/dist/{renderer-6L3NBEY5.js → renderer-UYMQQCJK.js} +6 -6
  179. package/dist/{renderer-radial-MHO2VDXN.js → renderer-radial-F7X5F2VU.js} +6 -6
  180. package/dist/{state-parser-RX3GXOIB.js → state-parser-3REXRK3R.js} +4 -4
  181. package/dist/{state-renderer-AJUKGNWU.js → state-renderer-XYLNRWXR.js} +6 -6
  182. package/docs/ai-integration.md +6 -2
  183. package/docs/language-reference.md +253 -22
  184. package/gallery/fixtures/body.dgmo +17 -0
  185. package/gallery/fixtures/bracket.dgmo +30 -0
  186. package/gallery/fixtures/clock.dgmo +8 -0
  187. package/gallery/fixtures/countdown.dgmo +3 -0
  188. package/gallery/fixtures/goal.dgmo +4 -0
  189. package/package.json +12 -4
  190. package/dist/advanced.d.ts +0 -6162
  191. package/dist/auto.d.ts +0 -54
  192. package/dist/block.d.ts +0 -123
  193. package/dist/dgmo-router-ODKPEJ3P.js +0 -79
  194. package/dist/element.d.ts +0 -62
  195. package/dist/index.d.ts +0 -166
  196. package/dist/parser-667RGSUW.js +0 -13
  197. package/dist/parser-J3P2D6IP.js +0 -13
  198. package/dist/themes-1-CuKpeH.d.ts +0 -908
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  renderBody,
3
3
  renderBodyForExport
4
- } from "./chunk-5XCM7UUW.js";
5
- import "./chunk-3NFJWFNP.js";
6
- import "./chunk-4UDKKGHH.js";
4
+ } from "./chunk-J6K7RP6P.js";
5
+ import "./chunk-HEVYAHLW.js";
6
+ import "./chunk-BDXC7MDK.js";
7
7
  import "./chunk-7UEMZREK.js";
8
8
  import "./chunk-6KFWC4CO.js";
9
9
  import "./chunk-HQCHYB5F.js";
10
10
  import "./chunk-5LWQH6QV.js";
11
11
  import "./chunk-P6T66CCZ.js";
12
- import "./chunk-HBVD67XG.js";
13
- import "./chunk-ZNQX6QWH.js";
12
+ import "./chunk-FJUNPCYI.js";
13
+ import "./chunk-OTAL43EH.js";
14
14
  import "./chunk-TLVIHFRO.js";
15
15
  import "./chunk-CXK4DZH3.js";
16
16
  import "./chunk-5WRI5ZAA.js";
@@ -18,4 +18,4 @@ export {
18
18
  renderBody,
19
19
  renderBodyForExport
20
20
  };
21
- //# sourceMappingURL=renderer-W5RMOURB.js.map
21
+ //# sourceMappingURL=renderer-PSMMZCKH.js.map
@@ -1,23 +1,23 @@
1
1
  import {
2
2
  renderMindmap,
3
3
  renderMindmapForExport
4
- } from "./chunk-N4J5KGWG.js";
5
- import "./chunk-YTN572Q2.js";
6
- import "./chunk-JTSMEYIZ.js";
4
+ } from "./chunk-4MJ7M6YL.js";
5
+ import "./chunk-7TV5Y53Y.js";
7
6
  import "./chunk-3HDBAXF5.js";
7
+ import "./chunk-JTSMEYIZ.js";
8
8
  import "./chunk-3CIOJ5YJ.js";
9
9
  import "./chunk-YYVTBZZC.js";
10
- import "./chunk-4UDKKGHH.js";
10
+ import "./chunk-HEVYAHLW.js";
11
11
  import "./chunk-7UEMZREK.js";
12
12
  import "./chunk-A4GOY3PE.js";
13
13
  import "./chunk-6KFWC4CO.js";
14
14
  import "./chunk-HQCHYB5F.js";
15
15
  import "./chunk-5LWQH6QV.js";
16
- import "./chunk-65RTDUZH.js";
16
+ import "./chunk-SXRTRMEE.js";
17
17
  import "./chunk-IYULMRBE.js";
18
18
  import "./chunk-P6T66CCZ.js";
19
- import "./chunk-HBVD67XG.js";
20
- import "./chunk-ZNQX6QWH.js";
19
+ import "./chunk-FJUNPCYI.js";
20
+ import "./chunk-OTAL43EH.js";
21
21
  import "./chunk-TLVIHFRO.js";
22
22
  import "./chunk-CXK4DZH3.js";
23
23
  import "./chunk-5WRI5ZAA.js";
@@ -25,4 +25,4 @@ export {
25
25
  renderMindmap,
26
26
  renderMindmapForExport
27
27
  };
28
- //# sourceMappingURL=renderer-UZF3JROD.js.map
28
+ //# sourceMappingURL=renderer-QAOBLRXV.js.map
@@ -1,17 +1,17 @@
1
1
  import {
2
2
  renderTechRadar,
3
3
  renderTechRadarForExport
4
- } from "./chunk-3BIAFYD2.js";
4
+ } from "./chunk-T4VOVZT5.js";
5
5
  import "./chunk-3HDBAXF5.js";
6
6
  import "./chunk-YYVTBZZC.js";
7
- import "./chunk-4UDKKGHH.js";
7
+ import "./chunk-HEVYAHLW.js";
8
8
  import "./chunk-7UEMZREK.js";
9
9
  import "./chunk-6KFWC4CO.js";
10
10
  import "./chunk-HQCHYB5F.js";
11
11
  import "./chunk-5LWQH6QV.js";
12
12
  import "./chunk-P6T66CCZ.js";
13
- import "./chunk-HBVD67XG.js";
14
- import "./chunk-ZNQX6QWH.js";
13
+ import "./chunk-FJUNPCYI.js";
14
+ import "./chunk-OTAL43EH.js";
15
15
  import "./chunk-TLVIHFRO.js";
16
16
  import "./chunk-CXK4DZH3.js";
17
17
  import "./chunk-5WRI5ZAA.js";
@@ -19,4 +19,4 @@ export {
19
19
  renderTechRadar,
20
20
  renderTechRadarForExport
21
21
  };
22
- //# sourceMappingURL=renderer-ROV756WT.js.map
22
+ //# sourceMappingURL=renderer-R2WNIC2C.js.map
@@ -1,19 +1,19 @@
1
1
  import {
2
2
  renderCycle,
3
3
  renderCycleForExport
4
- } from "./chunk-AJ2PEY7J.js";
4
+ } from "./chunk-JJUOHGX2.js";
5
5
  import "./chunk-3HDBAXF5.js";
6
6
  import "./chunk-BMR4CIEO.js";
7
7
  import "./chunk-YYVTBZZC.js";
8
- import "./chunk-4UDKKGHH.js";
8
+ import "./chunk-HEVYAHLW.js";
9
9
  import "./chunk-7UEMZREK.js";
10
10
  import "./chunk-A4GOY3PE.js";
11
11
  import "./chunk-6KFWC4CO.js";
12
12
  import "./chunk-HQCHYB5F.js";
13
13
  import "./chunk-5LWQH6QV.js";
14
14
  import "./chunk-P6T66CCZ.js";
15
- import "./chunk-HBVD67XG.js";
16
- import "./chunk-ZNQX6QWH.js";
15
+ import "./chunk-FJUNPCYI.js";
16
+ import "./chunk-OTAL43EH.js";
17
17
  import "./chunk-TLVIHFRO.js";
18
18
  import "./chunk-CXK4DZH3.js";
19
19
  import "./chunk-5WRI5ZAA.js";
@@ -21,4 +21,4 @@ export {
21
21
  renderCycle,
22
22
  renderCycleForExport
23
23
  };
24
- //# sourceMappingURL=renderer-VICQ4WNY.js.map
24
+ //# sourceMappingURL=renderer-SBS3YWU5.js.map
@@ -1,19 +1,19 @@
1
1
  import {
2
2
  renderMap,
3
3
  renderMapForExport
4
- } from "./chunk-T7IKPCMI.js";
5
- import "./chunk-YM2BSPYW.js";
4
+ } from "./chunk-3LH5CLP4.js";
5
+ import "./chunk-LE4MYMLI.js";
6
6
  import "./chunk-I5IGB56C.js";
7
+ import "./chunk-HEVYAHLW.js";
7
8
  import "./chunk-HGN652MU.js";
8
- import "./chunk-4UDKKGHH.js";
9
9
  import "./chunk-7UEMZREK.js";
10
10
  import "./chunk-A4GOY3PE.js";
11
11
  import "./chunk-6KFWC4CO.js";
12
12
  import "./chunk-HQCHYB5F.js";
13
13
  import "./chunk-5LWQH6QV.js";
14
14
  import "./chunk-P6T66CCZ.js";
15
- import "./chunk-HBVD67XG.js";
16
- import "./chunk-ZNQX6QWH.js";
15
+ import "./chunk-FJUNPCYI.js";
16
+ import "./chunk-OTAL43EH.js";
17
17
  import "./chunk-TLVIHFRO.js";
18
18
  import "./chunk-CXK4DZH3.js";
19
19
  import "./chunk-5WRI5ZAA.js";
@@ -21,4 +21,4 @@ export {
21
21
  renderMap,
22
22
  renderMapForExport
23
23
  };
24
- //# sourceMappingURL=renderer-6L3NBEY5.js.map
24
+ //# sourceMappingURL=renderer-UYMQQCJK.js.map
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  renderTreemapRadial,
3
3
  renderTreemapRadialForExport
4
- } from "./chunk-XKTN7CZF.js";
5
- import "./chunk-UVCXZEGU.js";
6
- import "./chunk-4UDKKGHH.js";
4
+ } from "./chunk-MCZ5LBZD.js";
5
+ import "./chunk-PFHVU7UA.js";
6
+ import "./chunk-HEVYAHLW.js";
7
7
  import "./chunk-7UEMZREK.js";
8
8
  import "./chunk-6KFWC4CO.js";
9
9
  import "./chunk-HQCHYB5F.js";
10
10
  import "./chunk-5LWQH6QV.js";
11
11
  import "./chunk-P6T66CCZ.js";
12
- import "./chunk-HBVD67XG.js";
13
- import "./chunk-ZNQX6QWH.js";
12
+ import "./chunk-FJUNPCYI.js";
13
+ import "./chunk-OTAL43EH.js";
14
14
  import "./chunk-TLVIHFRO.js";
15
15
  import "./chunk-CXK4DZH3.js";
16
16
  import "./chunk-5WRI5ZAA.js";
@@ -18,4 +18,4 @@ export {
18
18
  renderTreemapRadial,
19
19
  renderTreemapRadialForExport
20
20
  };
21
- //# sourceMappingURL=renderer-radial-MHO2VDXN.js.map
21
+ //# sourceMappingURL=renderer-radial-F7X5F2VU.js.map
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  looksLikeState,
3
3
  parseState
4
- } from "./chunk-5FGDJIJX.js";
4
+ } from "./chunk-2C56LEML.js";
5
5
  import "./chunk-NXMESY4J.js";
6
- import "./chunk-K6HNAY5V.js";
6
+ import "./chunk-SCHXJTZL.js";
7
7
  import "./chunk-FMDSF3OV.js";
8
8
  import "./chunk-FFUN5D66.js";
9
9
  import "./chunk-NOTA6TEI.js";
10
- import "./chunk-ZNQX6QWH.js";
10
+ import "./chunk-OTAL43EH.js";
11
11
  import "./chunk-TLVIHFRO.js";
12
12
  import "./chunk-CXK4DZH3.js";
13
13
  import "./chunk-5WRI5ZAA.js";
@@ -15,4 +15,4 @@ export {
15
15
  looksLikeState,
16
16
  parseState
17
17
  };
18
- //# sourceMappingURL=state-parser-RX3GXOIB.js.map
18
+ //# sourceMappingURL=state-parser-3REXRK3R.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  renderState,
3
3
  renderStateForExport
4
- } from "./chunk-BGJV5ATD.js";
4
+ } from "./chunk-ONA5KPV3.js";
5
5
  import "./chunk-PDKUANDZ.js";
6
6
  import "./chunk-SCQ5VPUF.js";
7
7
  import "./chunk-LP7EC4MI.js";
@@ -10,20 +10,20 @@ import "./chunk-6EK55ART.js";
10
10
  import "./chunk-BCYVE3N5.js";
11
11
  import "./chunk-5DH3KYFH.js";
12
12
  import "./chunk-3HDBAXF5.js";
13
- import "./chunk-3CIOJ5YJ.js";
14
13
  import "./chunk-BMR4CIEO.js";
14
+ import "./chunk-3CIOJ5YJ.js";
15
15
  import "./chunk-YYVTBZZC.js";
16
16
  import "./chunk-A4GOY3PE.js";
17
17
  import "./chunk-6KFWC4CO.js";
18
18
  import "./chunk-5LWQH6QV.js";
19
19
  import "./chunk-P6T66CCZ.js";
20
- import "./chunk-5FGDJIJX.js";
20
+ import "./chunk-2C56LEML.js";
21
21
  import "./chunk-NXMESY4J.js";
22
- import "./chunk-K6HNAY5V.js";
22
+ import "./chunk-SCHXJTZL.js";
23
23
  import "./chunk-FMDSF3OV.js";
24
24
  import "./chunk-FFUN5D66.js";
25
25
  import "./chunk-NOTA6TEI.js";
26
- import "./chunk-ZNQX6QWH.js";
26
+ import "./chunk-OTAL43EH.js";
27
27
  import "./chunk-TLVIHFRO.js";
28
28
  import "./chunk-CXK4DZH3.js";
29
29
  import "./chunk-5WRI5ZAA.js";
@@ -31,4 +31,4 @@ export {
31
31
  renderState,
32
32
  renderStateForExport
33
33
  };
34
- //# sourceMappingURL=state-renderer-AJUKGNWU.js.map
34
+ //# sourceMappingURL=state-renderer-XYLNRWXR.js.map
@@ -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 46-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
 
@@ -131,6 +131,7 @@ Valid markup is the floor, not the goal. A good diagram reads at a glance. Apply
131
131
  | `mindmap` | radial hierarchy of ideas from a central topic |
132
132
  | `org` | reporting hierarchy |
133
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 |
134
135
  | `kanban` | task-board columns |
135
136
  | `gantt` | project scheduling with task dependencies and milestones |
136
137
  | `pert` | project network with three-point estimates and critical path |
@@ -149,6 +150,9 @@ Valid markup is the floor, not the goal. A good diagram reads at a glance. Apply
149
150
  | `treemap` | nested rectangles sized by value (budgets, disk usage, portfolios) |
150
151
  | `block` | author-controlled grid of nested, collapsible blocks (system / architecture layouts) |
151
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 |
152
156
  | `map` | geographic concept map: regions, points, routes |
153
157
  | `wireframe` | low-fidelity UI layout with panels and controls |
154
158
  | `bar` | categorical comparisons (multi-series via `stack` / `group`) |
@@ -172,7 +176,7 @@ Valid markup is the floor, not the goal. A good diagram reads at a glance. Apply
172
176
 
173
177
  ### Common examples (curated, parse-clean)
174
178
 
175
- _The most common types, inline so you can generate them without a fetch. For the other 38, 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)._
176
180
 
177
181
  #### journey-map
178
182
 
@@ -117,6 +117,7 @@ Valid markup is the floor, not the goal. A good diagram reads at a glance. Apply
117
117
  | `mindmap` | radial hierarchy of ideas from a central topic |
118
118
  | `org` | reporting hierarchy |
119
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 |
120
121
  | `kanban` | task-board columns |
121
122
  | `gantt` | project scheduling with task dependencies and milestones |
122
123
  | `pert` | project network with three-point estimates and critical path |
@@ -135,6 +136,9 @@ Valid markup is the floor, not the goal. A good diagram reads at a glance. Apply
135
136
  | `treemap` | nested rectangles sized by value (budgets, disk usage, portfolios) |
136
137
  | `block` | author-controlled grid of nested, collapsible blocks (system / architecture layouts) |
137
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 |
138
142
  | `map` | geographic concept map: regions, points, routes |
139
143
  | `wireframe` | low-fidelity UI layout with panels and controls |
140
144
  | `bar` | categorical comparisons (multi-series via `stack` / `group`) |
@@ -1718,7 +1722,7 @@ See spec §13A for full date-anchoring semantics, S-curve axes, and diagnostic c
1718
1722
  <!-- TYPE:family -->
1719
1723
 
1720
1724
  <!-- TIPS start -->
1721
- **Styling tips:** Declare a person once with full metadata (`Anne b: 1665, sex: f`), then reference the bare name in union lines — don't repeat metadata. Model couples with the union line `A + B m: <year>` and indent children beneath it; reuse a name in a new union line for remarriage. The **legend** is the guaranteed sex channel (blue/purple sit close in hue and desaturate under the 25% tint) — where color-vision matters, add a `tag` group for the distinction you care about.
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.
1722
1726
  <!-- TIPS end -->
1723
1727
 
1724
1728
  ### Declaration
@@ -1766,38 +1770,31 @@ Henry Turner + Carina Smyth m: 1751
1766
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.
1767
1771
  <!-- TIPS end -->
1768
1772
 
1769
- 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.
1770
1774
 
1771
1775
  ```
1772
1776
  swimlane Weekly Publishing
1773
1777
  direction LR
1774
1778
 
1775
1779
  lane Writer gray
1780
+ Draft Post -> Review
1781
+ Revise -> Review
1776
1782
  lane Editor blue
1777
- lane Social green
1778
-
1779
- Writer
1780
- Draft Post
1781
- Revise
1782
- Editor
1783
1783
  <Review>
1784
- Schedule
1785
- Publish
1786
- Social
1784
+ -changes-> Revise
1785
+ -ok-> Schedule
1786
+ Schedule -> Publish
1787
+ Publish -> Promote
1788
+ lane Social green
1787
1789
  Promote
1788
-
1789
- Draft Post -> <Review>
1790
- <Review>
1791
- -changes-> Revise -> <Review>
1792
- -ok-> Schedule -> Publish -> Promote
1793
1790
  ```
1794
1791
 
1795
1792
  ### Structure
1796
1793
 
1797
- - `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.
1798
- - A bare line matching a declared lane opens that lane's context; indented lines beneath it are nodes.
1799
- - `[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.
1800
- - 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.
1801
1798
 
1802
1799
  ### Node tokens
1803
1800
 
@@ -2526,7 +2523,7 @@ Group a run of events into a labeled section with a `[Name]` bracket, then **ind
2526
2523
  <!-- TYPE:body -->
2527
2524
 
2528
2525
  <!-- TIPS start -->
2529
- **Styling tips:** a body diagram is a human figure you annotate by muscle name — for workout splits, PT/rehab, and anatomy teaching. Name the muscles you care about, color them by intensity/severity with a tag group, and add a short note beneath each for the exercise or finding. Keep to the muscles that matter; the rest stay a neutral gray so the highlighted ones read at a glance.
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`).
2530
2527
  <!-- TIPS end -->
2531
2528
 
2532
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.
@@ -3630,7 +3627,7 @@ In the desktop app a block diagram is interactive: click a container header to c
3630
3627
  <!-- TYPE:sketch -->
3631
3628
 
3632
3629
  <!-- TIPS start -->
3633
- **Styling tips:** Sketch is a **GUI-authored format** — the desktop/web canvas editor generates this markup, and hand-writing it is the exception. If you generate it anyway: keep it SMALL (sketches read best under ~15 shapes), use integer `at:` coordinates on the half-slot lattice with shapes at least 2 half-slots apart on one axis — or simply **omit `at:` everywhere** and let flow placement arrange rows (the safest generator path). Alias any shape an edge references (`as con`). Never write `size:`, colors, fonts, or a `shape:` outside the closed 7-kind set. In sketch, `~` dashed means **secondary emphasis, NOT async** — don't carry infra's async reading over. Categorize with a tag group (named palette colors only) instead of reaching for more shape kinds — kind-of-thing is meaning, and meaning lives in tags. Malformed coordinates never break a render (overlaps auto-resolve with a warning), but tidy input diffs better.
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.
3634
3631
  <!-- TIPS end -->
3635
3632
 
3636
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.
@@ -3702,6 +3699,240 @@ In the desktop and web app a sketch opens in the **canvas editor** (the code pan
3702
3699
 
3703
3700
  ---
3704
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
+
3705
3936
  ## 24A. RACI Matrices (RACI / RASCI / DACI)
3706
3937
 
3707
3938
  <!-- TYPE:raci -->