@diagrammo/dgmo 0.50.2 → 0.52.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 (257) hide show
  1. package/.cursorrules +15 -19
  2. package/.github/copilot-instructions.md +15 -19
  3. package/.windsurfrules +15 -19
  4. package/SKILL.md +15 -19
  5. package/dist/advanced.d.ts +155 -65
  6. package/dist/advanced.js +231 -189
  7. package/dist/{analyzer-UYKBXAKR.js → analyzer-BJ54GIFB.js} +3 -3
  8. package/dist/auto.css +31 -8
  9. package/dist/auto.d.ts +6 -0
  10. package/dist/auto.js +171 -133
  11. package/dist/auto.mjs +3062 -1478
  12. package/dist/block.css +28 -8
  13. package/dist/block.js +138 -72
  14. package/dist/charts-d3-MXEP6BNP.js +26 -0
  15. package/dist/{chunk-3YPY3OXD.js → chunk-3HF5YEFJ.js} +17 -7
  16. package/dist/{chunk-4MJ7M6YL.js → chunk-3HGU63UY.js} +14 -13
  17. package/dist/chunk-3LK5DNED.js +35 -0
  18. package/dist/{chunk-3Y2DRD7S.js → chunk-3QD7VP3U.js} +9 -4
  19. package/dist/{chunk-6BFZKBGD.js → chunk-3YRPZ7ZZ.js} +2 -2
  20. package/dist/{chunk-WW32K72E.js → chunk-44VCIPHF.js} +25 -21
  21. package/dist/{chunk-TN35C5KM.js → chunk-4AQRFDXL.js} +2 -2
  22. package/dist/{chunk-HHXOONLX.js → chunk-4B5YISOR.js} +38 -1
  23. package/dist/{chunk-PGEGPSCZ.js → chunk-4IHAV6O7.js} +2 -2
  24. package/dist/{chunk-7L3R6I3U.js → chunk-4UNQ6X24.js} +10 -7
  25. package/dist/{chunk-O7NUCTFU.js → chunk-4YFKQ5WT.js} +7 -4
  26. package/dist/{chunk-5WFIYXQ6.js → chunk-5223KXFD.js} +122 -242
  27. package/dist/{chunk-PFHVU7UA.js → chunk-5BHJZH62.js} +3 -3
  28. package/dist/{chunk-QYTPPDAO.js → chunk-5HILBT7X.js} +2 -2
  29. package/dist/{chunk-GKC3HILQ.js → chunk-5NGAO4QK.js} +27 -4
  30. package/dist/{chunk-IAEC4KLA.js → chunk-5QKQSSPO.js} +2 -2
  31. package/dist/{chunk-DSWVNQVS.js → chunk-5RP7JRVP.js} +4 -59
  32. package/dist/{chunk-MCZ5LBZD.js → chunk-5SEVICBT.js} +8 -8
  33. package/dist/{chunk-GBE54KY6.js → chunk-6EJITS44.js} +8 -5
  34. package/dist/{chunk-BBGDM4NQ.js → chunk-6HQH6JZE.js} +35 -16
  35. package/dist/{chunk-66NVRO4K.js → chunk-6LBQ7ELG.js} +17 -18
  36. package/dist/{chunk-4XK3FLFB.js → chunk-6NYWYNBI.js} +3 -3
  37. package/dist/{chunk-VBYSIOOY.js → chunk-75G3Q4DK.js} +3 -3
  38. package/dist/{chunk-3NODSS6A.js → chunk-77FGAVZC.js} +13 -10
  39. package/dist/{chunk-6IAA2QQ2.js → chunk-7BIZCTAX.js} +2 -2
  40. package/dist/{chunk-TWQUYVP3.js → chunk-7DF4J4RL.js} +4 -4
  41. package/dist/{chunk-66RUL3XF.js → chunk-7KINELPI.js} +111 -49
  42. package/dist/{chunk-L3UHP6TD.js → chunk-7L4UJOY6.js} +1 -2
  43. package/dist/{chunk-QJP6PG7F.js → chunk-7QE3XMRK.js} +19 -18
  44. package/dist/{chunk-P7CE7LXL.js → chunk-AAXZDUOV.js} +18 -17
  45. package/dist/{chunk-SXRTRMEE.js → chunk-AL672HNE.js} +3 -3
  46. package/dist/chunk-APKUAJ2L.js +220 -0
  47. package/dist/{chunk-SCHXJTZL.js → chunk-ARGMQ3H4.js} +2 -2
  48. package/dist/{chunk-HEVYAHLW.js → chunk-AUIM2NVH.js} +5 -5
  49. package/dist/{chunk-3LH5CLP4.js → chunk-BKVOYV6I.js} +143 -6
  50. package/dist/{chunk-RZ6YKEUJ.js → chunk-BPIZNB5O.js} +17 -15
  51. package/dist/{chunk-QROYX7TT.js → chunk-BPY242XU.js} +6 -4
  52. package/dist/{chunk-OTAL43EH.js → chunk-BRENJ2BQ.js} +39 -3
  53. package/dist/{chunk-FA6K3FWM.js → chunk-CCNDLW7Z.js} +44 -22
  54. package/dist/{chunk-2KGXHFYK.js → chunk-CIRFIL4M.js} +49 -29
  55. package/dist/chunk-DAOFNU6J.js +283 -0
  56. package/dist/{chunk-QJJZSROI.js → chunk-DYWQFQJP.js} +48 -38
  57. package/dist/{chunk-XEGTMVYY.js → chunk-EMLPOL77.js} +15 -8
  58. package/dist/{chunk-NWED7CYO.js → chunk-FHGVORFO.js} +29 -25
  59. package/dist/{chunk-U2HGPLZS.js → chunk-FQ7HTV52.js} +17 -2
  60. package/dist/{chunk-H73FP42Q.js → chunk-FQMUHRVC.js} +70 -31
  61. package/dist/{chunk-BTUTZMPT.js → chunk-FT3ZYWET.js} +108 -42
  62. package/dist/{chunk-T5SHNNGP.js → chunk-FUPF2UYQ.js} +92 -34
  63. package/dist/{chunk-3XPUDB7B.js → chunk-FY5MSZAP.js} +279 -39
  64. package/dist/{chunk-M5RXSRO2.js → chunk-GCYTI3DE.js} +42 -33
  65. package/dist/{chunk-DN66GPY5.js → chunk-GJFAMOGK.js} +24 -3
  66. package/dist/{chunk-F2L5GCQ4.js → chunk-GU46PPT3.js} +3 -3
  67. package/dist/{chunk-6IUAK7RZ.js → chunk-H6PI3KJT.js} +2 -2
  68. package/dist/{chunk-ONA5KPV3.js → chunk-H7KENAZO.js} +18 -14
  69. package/dist/{chunk-SQLNBA64.js → chunk-HBPDFCQY.js} +3 -3
  70. package/dist/{chunk-SCQ5VPUF.js → chunk-HFMYN6N2.js} +2 -2
  71. package/dist/{chunk-FJUNPCYI.js → chunk-HHKO6SKY.js} +2 -2
  72. package/dist/{chunk-DZXYF2F5.js → chunk-HQQNCY7W.js} +21 -8
  73. package/dist/{chunk-7TV5Y53Y.js → chunk-HWX6ZHF3.js} +3 -3
  74. package/dist/{chunk-3P2DKJCG.js → chunk-ICPJPQ5C.js} +2 -2
  75. package/dist/{chunk-VUJGMJE6.js → chunk-IM6PDDCE.js} +4 -4
  76. package/dist/{chunk-JJUOHGX2.js → chunk-INE5YJBZ.js} +13 -8
  77. package/dist/{chunk-HTMN2Z6U.js → chunk-J6QROYDA.js} +58 -11
  78. package/dist/{chunk-NX4EQS3U.js → chunk-J76PIKAT.js} +2 -2
  79. package/dist/{chunk-SVTI362O.js → chunk-J7KJR3R6.js} +129 -109
  80. package/dist/{chunk-JEUJOX5X.js → chunk-J7TLCB2Q.js} +2 -2
  81. package/dist/{chunk-O7WP4ZD4.js → chunk-JED6ZDEE.js} +2 -2
  82. package/dist/{chunk-J6K7RP6P.js → chunk-JRCOYRRH.js} +19 -7
  83. package/dist/{chunk-7QKLIMRZ.js → chunk-K2I2XOZD.js} +46 -51
  84. package/dist/{chunk-EAMEADTV.js → chunk-K4EOKJA6.js} +96 -24
  85. package/dist/{chunk-5OWVC2A6.js → chunk-KGVZ5VGH.js} +13 -10
  86. package/dist/{chunk-DFTFPYUD.js → chunk-LBMS4AW6.js} +22 -21
  87. package/dist/{chunk-VVW3F3MD.js → chunk-LGT3PZCJ.js} +27 -19
  88. package/dist/{chunk-OMNGQPEZ.js → chunk-LTXOLDUZ.js} +9 -6
  89. package/dist/{chunk-Q4V4XQWV.js → chunk-MUE65OTD.js} +5 -4
  90. package/dist/{chunk-5GJYGP5Z.js → chunk-MUVJ57EP.js} +14 -18
  91. package/dist/{chunk-CLD2OKV7.js → chunk-MX2EY5Y7.js} +2 -2
  92. package/dist/{chunk-OTQKUHRS.js → chunk-NNS4E7CW.js} +6 -4
  93. package/dist/{chunk-NNAAJVBU.js → chunk-NR5HCAUD.js} +1 -1
  94. package/dist/{chunk-KFZYNWWO.js → chunk-ONU3U4GL.js} +4 -4
  95. package/dist/{chunk-YNRDWYZP.js → chunk-OQKP2X3D.js} +170 -51
  96. package/dist/{chunk-AHGF2YYA.js → chunk-OTOHI4JO.js} +2 -2
  97. package/dist/{chunk-EOFPYPAU.js → chunk-P3NRSSUU.js} +51 -11
  98. package/dist/{chunk-QXKWYZNR.js → chunk-PRI2OD4E.js} +10 -3
  99. package/dist/{chunk-U6EQI3U6.js → chunk-QBZYACOG.js} +3 -3
  100. package/dist/{chunk-C2CVAM3U.js → chunk-QGATPIPX.js} +170 -91
  101. package/dist/{chunk-PZFVK3IH.js → chunk-QHXCAEMX.js} +8 -5
  102. package/dist/{chunk-BH3UYK36.js → chunk-QJMKPUYK.js} +15 -5
  103. package/dist/{chunk-HQCHYB5F.js → chunk-QOOUC2J5.js} +2 -2
  104. package/dist/{chunk-Z6XJQ6KO.js → chunk-QVENJMNX.js} +2 -2
  105. package/dist/{chunk-IUMPEA64.js → chunk-QZX5S6R3.js} +4 -4
  106. package/dist/{chunk-I7F2A35O.js → chunk-R3YSD62R.js} +25 -47
  107. package/dist/{chunk-NU3XLTGP.js → chunk-REJAIQ5S.js} +4 -4
  108. package/dist/{chunk-2C56LEML.js → chunk-ROOE4R4Y.js} +8 -5
  109. package/dist/{chunk-XHVV4NVW.js → chunk-RT7ACF77.js} +12 -2
  110. package/dist/{chunk-I2WKW7C7.js → chunk-SMRFPVLQ.js} +3 -3
  111. package/dist/{chunk-VDOOQZUD.js → chunk-SWSIKFEB.js} +4 -4
  112. package/dist/{chunk-HLJVEAOF.js → chunk-T4A4TSTJ.js} +19 -45
  113. package/dist/{chunk-KHEYDLMT.js → chunk-TJVLKNGR.js} +20 -10
  114. package/dist/{chunk-GL5UZ6NY.js → chunk-TPFKKXCB.js} +3 -3
  115. package/dist/{chunk-X6EZPSW6.js → chunk-TTIM6YTT.js} +31 -21
  116. package/dist/{chunk-BCYVE3N5.js → chunk-TYS6CSS5.js} +2 -2
  117. package/dist/{chunk-T4VOVZT5.js → chunk-UBLHQTLV.js} +15 -14
  118. package/dist/{chunk-3LKM6FMW.js → chunk-UNURMIQO.js} +2 -2
  119. package/dist/{chunk-TSA237IM.js → chunk-VILVLS7P.js} +5 -3
  120. package/dist/{chunk-HGN652MU.js → chunk-VL2O2F3W.js} +2 -2
  121. package/dist/{chunk-3XGZF2QJ.js → chunk-VQOCMUWI.js} +39 -28
  122. package/dist/{chunk-P6T66CCZ.js → chunk-WBM7ZNDI.js} +3 -2
  123. package/dist/{chunk-CMCR5WBW.js → chunk-WBRZJOEC.js} +3 -3
  124. package/dist/{chunk-5LWQH6QV.js → chunk-WCT3NYCV.js} +1 -1
  125. package/dist/{chunk-C4GQDB5L.js → chunk-WRNFDFPU.js} +2 -2
  126. package/dist/{chunk-6HJBFVLO.js → chunk-XD6ZYURY.js} +9 -4
  127. package/dist/{chunk-C63UWAKM.js → chunk-Y2ZE3MSG.js} +2 -2
  128. package/dist/{chunk-7UEMZREK.js → chunk-YAA6IID3.js} +2 -2
  129. package/dist/{chunk-F7BFXWNQ.js → chunk-YIBAWQGJ.js} +7 -4
  130. package/dist/{chunk-PH5X4GIP.js → chunk-YTMTPUH4.js} +8 -5
  131. package/dist/{chunk-3UIKSPFB.js → chunk-Z5QVYKR7.js} +11 -3
  132. package/dist/{chunk-KQ57MHRO.js → chunk-ZEF5M5MB.js} +155 -87
  133. package/dist/{chunk-LE4MYMLI.js → chunk-ZJV7GYR4.js} +6 -6
  134. package/dist/{chunk-XJLKLU4D.js → chunk-ZNWAYU6N.js} +11 -7
  135. package/dist/cli.cjs +165 -148
  136. package/dist/clock.js +105 -25
  137. package/dist/countdown.js +208 -82
  138. package/dist/dgmo-router-X7ZGAPIE.js +86 -0
  139. package/dist/dimensions-45H6JQEY.js +22 -0
  140. package/dist/editor.js +17 -2
  141. package/dist/element.d.ts +6 -0
  142. package/dist/element.js +172 -134
  143. package/dist/element.mjs +3026 -1463
  144. package/dist/{flowchart-parser-OE4WHLTF.js → flowchart-parser-UKELHBSB.js} +4 -4
  145. package/dist/{flowchart-renderer-GPCSMTOR.js → flowchart-renderer-MNCDS7MV.js} +10 -10
  146. package/dist/highlight.d.ts +21 -1
  147. package/dist/highlight.js +106 -3
  148. package/dist/index.d.ts +2 -2
  149. package/dist/index.js +59 -57
  150. package/dist/{layout-FWODLIMP.js → layout-2L3WMRYU.js} +6 -6
  151. package/dist/{layout-7SKMFYHL.js → layout-46N4JJYK.js} +5 -5
  152. package/dist/{layout-7H4H46CS.js → layout-7QXCNOVS.js} +3 -3
  153. package/dist/layout-A4XWNVID.js +14 -0
  154. package/dist/{layout-46366KBT.js → layout-A5UHRWVH.js} +3 -3
  155. package/dist/{layout-NXG63LWH.js → layout-AM2JWW3X.js} +4 -4
  156. package/dist/{layout-DC4TVXER.js → layout-EE6GE46Y.js} +5 -5
  157. package/dist/{layout-FGQWRYYW.js → layout-F4WO357A.js} +3 -3
  158. package/dist/layout-G23F7LDH.js +9 -0
  159. package/dist/{layout-QNUQLEHU.js → layout-GM4UGR7B.js} +5 -4
  160. package/dist/{layout-7MZ5NF2N.js → layout-GQQJXNYH.js} +5 -5
  161. package/dist/{layout-5BG6DFCU.js → layout-IIE2S5FK.js} +6 -6
  162. package/dist/{layout-34CLNICW.js → layout-OAC4PEAC.js} +5 -5
  163. package/dist/layout-VMCRX66I.js +14 -0
  164. package/dist/{layout-PUQCB6AN.js → layout-ZDOSXL5G.js} +7 -7
  165. package/dist/{layout-search-QS44PI5R.js → layout-search-55FU6HD3.js} +6 -157
  166. package/dist/map-data/gazetteer.json +1 -1
  167. package/dist/{palettes-PRJ2RI6D.js → palettes-UDLZ2SA4.js} +2 -2
  168. package/dist/{parser-D5VILGN2.js → parser-2ECN6JA2.js} +4 -4
  169. package/dist/{parser-LWKKBNSA.js → parser-4WTIHM5J.js} +3 -3
  170. package/dist/{parser-DFFEDKHH.js → parser-5H2BTSJQ.js} +3 -3
  171. package/dist/{parser-4NO6VZ6S.js → parser-75KVXUNS.js} +4 -4
  172. package/dist/{parser-VKOJM7KS.js → parser-774AC53T.js} +4 -4
  173. package/dist/{parser-IBWNAPY4.js → parser-BE4YCSRU.js} +3 -3
  174. package/dist/{parser-4AI5ZN5F.js → parser-CNGUQUQI.js} +3 -3
  175. package/dist/{parser-36HVKU5U.js → parser-DEUUSQIN.js} +7 -6
  176. package/dist/{parser-H3XEPFPV.js → parser-DQAFLUJB.js} +4 -4
  177. package/dist/{parser-5OXGPNBF.js → parser-EYCKNKQA.js} +5 -5
  178. package/dist/{parser-TGQZJ5OT.js → parser-FXISIU6A.js} +4 -4
  179. package/dist/{parser-JJR52VAT.js → parser-GTB4XC7P.js} +5 -5
  180. package/dist/{parser-AGVYTQXV.js → parser-GVEPAUSD.js} +4 -4
  181. package/dist/{parser-WAV5JRPT.js → parser-HSQGTY4G.js} +4 -4
  182. package/dist/{parser-YS7TOS2K.js → parser-HVKRINUS.js} +3 -3
  183. package/dist/{parser-W4PQUGX3.js → parser-J5MIEYO4.js} +5 -5
  184. package/dist/parser-KMZIXLDZ.js +13 -0
  185. package/dist/{parser-HYRTF3DO.js → parser-LJHXWSXU.js} +3 -3
  186. package/dist/{parser-KCR2WS3V.js → parser-PT3W72G5.js} +4 -4
  187. package/dist/{parser-CVMEDULU.js → parser-SBJQDPHL.js} +4 -4
  188. package/dist/{parser-RZPVAQVX.js → parser-SUWWWCMX.js} +4 -3
  189. package/dist/{parser-TXND652E.js → parser-SXDRNZOA.js} +4 -4
  190. package/dist/parser-UMILOW3M.js +14 -0
  191. package/dist/{parser-RV4M6AS2.js → parser-UP3AZ367.js} +4 -4
  192. package/dist/{parser-IJBMRXMC.js → parser-WHPRV3X5.js} +5 -5
  193. package/dist/{parser-MPCE5JBG.js → parser-WX3UODSJ.js} +4 -4
  194. package/dist/{parser-K3XXLMUW.js → parser-XCIEN3KN.js} +4 -4
  195. package/dist/{parser-AXKBDGNO.js → parser-XIRTUMVN.js} +5 -5
  196. package/dist/{parser-B5FVS7O6.js → parser-YKCGIG45.js} +3 -3
  197. package/dist/{parser-PSA4UBSP.js → parser-YKYMQG3B.js} +4 -4
  198. package/dist/{parser-MTOMTWTD.js → parser-ZGM2OJ6Y.js} +6 -5
  199. package/dist/{parser-CSFUN3CT.js → parser-ZL5QUFVH.js} +5 -4
  200. package/dist/pert.d.ts +2 -2
  201. package/dist/{renderer-PPIHO5FI.js → renderer-3F7OS2AX.js} +14 -13
  202. package/dist/{renderer-SBS3YWU5.js → renderer-4QB4K7Q3.js} +9 -9
  203. package/dist/{renderer-GHPZMFU2.js → renderer-5DAKMIU2.js} +3 -3
  204. package/dist/{renderer-R2WNIC2C.js → renderer-5H4SY7YY.js} +9 -9
  205. package/dist/{renderer-DAXMXIKD.js → renderer-5PIQPFOX.js} +5 -4
  206. package/dist/{renderer-45PSOL3E.js → renderer-6MU37QF5.js} +6 -6
  207. package/dist/renderer-AQVMWJ4M.js +27 -0
  208. package/dist/{renderer-A5VE5BCI.js → renderer-BDDW6K7N.js} +9 -9
  209. package/dist/{renderer-AUW2BE6G.js → renderer-BNB3VIDY.js} +10 -10
  210. package/dist/{renderer-4ITCHBT7.js → renderer-CQY6ATOS.js} +6 -6
  211. package/dist/{renderer-6OKF44KS.js → renderer-CVW75CXL.js} +15 -15
  212. package/dist/{renderer-7RH2SI3B.js → renderer-DT4XRFEP.js} +5 -4
  213. package/dist/{renderer-B5TBNZJE.js → renderer-ERHBSTQT.js} +9 -9
  214. package/dist/{renderer-HVCU2C3Z.js → renderer-HSHHVYWF.js} +5 -4
  215. package/dist/renderer-IDPVUFNB.js +28 -0
  216. package/dist/renderer-ILX6BGKR.js +21 -0
  217. package/dist/renderer-JP663HKG.js +22 -0
  218. package/dist/{renderer-KS7YZJE2.js → renderer-KNFTTOBL.js} +11 -11
  219. package/dist/{renderer-2AZ5HJFK.js → renderer-MVUZBESR.js} +5 -5
  220. package/dist/{renderer-QAOBLRXV.js → renderer-N4EBR2FV.js} +11 -11
  221. package/dist/{renderer-P5ROYQGU.js → renderer-NHO46CT2.js} +4 -4
  222. package/dist/{renderer-NGXZTRK6.js → renderer-NO2QJ5LZ.js} +10 -10
  223. package/dist/{renderer-FPE3J5VZ.js → renderer-OGFV5RXX.js} +12 -12
  224. package/dist/{renderer-ODUUOPVT.js → renderer-PDLESJMS.js} +15 -15
  225. package/dist/renderer-T4MTNINC.js +24 -0
  226. package/dist/renderer-TOUGFGTM.js +24 -0
  227. package/dist/{renderer-BSR2O2H6.js → renderer-U3KPD43Y.js} +14 -13
  228. package/dist/{renderer-JCCHNECZ.js → renderer-X334IJU2.js} +10 -10
  229. package/dist/{renderer-5DSEWF74.js → renderer-Y5OAMOCR.js} +9 -9
  230. package/dist/{renderer-5KVCNMOJ.js → renderer-YONAKAJU.js} +5 -3
  231. package/dist/{renderer-7SD6MSBS.js → renderer-YWMI6Y2U.js} +12 -12
  232. package/dist/{renderer-2QPMJ2DA.js → renderer-ZWIH4WDW.js} +10 -10
  233. package/dist/renderer-radial-7CGZMVMS.js +21 -0
  234. package/dist/{resolver-FHBCO3PL.js → resolver-EMTGNR3D.js} +4 -3
  235. package/dist/{state-parser-3REXRK3R.js → state-parser-BATWAID2.js} +4 -4
  236. package/dist/{state-renderer-XYLNRWXR.js → state-renderer-3FKZJ3LP.js} +10 -10
  237. package/dist/{themes-PdPR1-hC.d.ts → themes-32xj5ZTW.d.ts} +27 -0
  238. package/docs/ai-integration.md +15 -19
  239. package/docs/language-reference.md +106 -21
  240. package/gallery/fixtures/clock.dgmo +3 -3
  241. package/gallery/fixtures/countdown-tz.dgmo +5 -0
  242. package/package.json +1 -1
  243. package/dist/charts-d3-MUW3LTML.js +0 -26
  244. package/dist/dgmo-router-CE2G67FV.js +0 -84
  245. package/dist/dimensions-OTBKC5M6.js +0 -22
  246. package/dist/layout-6RDJHS6E.js +0 -9
  247. package/dist/layout-J36454XU.js +0 -14
  248. package/dist/layout-LD6XTLD6.js +0 -14
  249. package/dist/parser-4WQQQXCG.js +0 -13
  250. package/dist/parser-O4HIUN6G.js +0 -13
  251. package/dist/renderer-CYB4LK3G.js +0 -22
  252. package/dist/renderer-FF24KZCI.js +0 -24
  253. package/dist/renderer-FYSVXL7M.js +0 -28
  254. package/dist/renderer-HDCCZURL.js +0 -24
  255. package/dist/renderer-PSMMZCKH.js +0 -21
  256. package/dist/renderer-UYMQQCJK.js +0 -24
  257. package/dist/renderer-radial-F7X5F2VU.js +0 -21
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-6EK55ART.js";
4
4
  import {
5
5
  noteBoxSize
6
- } from "./chunk-BCYVE3N5.js";
6
+ } from "./chunk-TYS6CSS5.js";
7
7
 
8
8
  // src/utils/notes/build.ts
9
9
  function buildPlacedNotes(anchors, noteByNode, direction, collapsedNotes) {
@@ -70,4 +70,4 @@ function buildPlacedNotes(anchors, noteByNode, direction, collapsedNotes) {
70
70
  export {
71
71
  buildPlacedNotes
72
72
  };
73
- //# sourceMappingURL=chunk-O7WP4ZD4.js.map
73
+ //# sourceMappingURL=chunk-JED6ZDEE.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  renderIntegratedLegend
3
- } from "./chunk-HEVYAHLW.js";
3
+ } from "./chunk-AUIM2NVH.js";
4
4
  import {
5
5
  getFigure,
6
6
  getPartGeom,
@@ -11,13 +11,14 @@ import {
11
11
  } from "./chunk-6KFWC4CO.js";
12
12
  import {
13
13
  getSeriesColors,
14
- mix
15
- } from "./chunk-P6T66CCZ.js";
14
+ mix,
15
+ themeBaseBg
16
+ } from "./chunk-WBM7ZNDI.js";
16
17
  import {
17
18
  resolveActiveTagGroup,
18
19
  resolveTagColor,
19
20
  tagAttrKey
20
- } from "./chunk-FJUNPCYI.js";
21
+ } from "./chunk-HHKO6SKY.js";
21
22
  import {
22
23
  resolveColor
23
24
  } from "./chunk-TLVIHFRO.js";
@@ -51,7 +52,7 @@ function sideCenter(centers, side, view) {
51
52
  (best, c) => wantScreenRight ? c.x > best.x ? c : best : c.x < best.x ? c : best
52
53
  );
53
54
  }
54
- function renderFigureBody(fig, view, parts, partColor, emphKey, form, palette, defs) {
55
+ function renderFigureBody(fig, view, parts, partColor, emphKey, form, palette, isDark, fillMode, defs) {
55
56
  const [vx, vy, vw, vh] = fig.viewBox.split(" ").map(Number);
56
57
  const muscleFill = mix(palette.bg, palette.border, 0.7);
57
58
  const seam = palette.bg;
@@ -99,7 +100,16 @@ function renderFigureBody(fig, view, parts, partColor, emphKey, form, palette, d
99
100
  );
100
101
  if (sidePaths.length) paths = sidePaths;
101
102
  }
102
- if (form === "skin") {
103
+ if (fillMode === "solid") {
104
+ for (const d of paths) {
105
+ out += `<path${dataLine} d="${d}" fill="${color}" stroke="${color}" stroke-width="1.5"/>`;
106
+ }
107
+ } else if (fillMode === "outline") {
108
+ const baseBg = themeBaseBg(palette, isDark);
109
+ for (const d of paths) {
110
+ out += `<path${dataLine} d="${d}" fill="${baseBg}" stroke="${color}" stroke-width="2.5"/>`;
111
+ }
112
+ } else if (form === "skin") {
103
113
  for (const d of paths) {
104
114
  out += `<path${dataLine} d="${d}" fill="${color}" fill-opacity="0.5" stroke="${color}" stroke-width="1.5"/>`;
105
115
  }
@@ -186,6 +196,8 @@ function renderBody(container, parsed, palette, _isDark, _onClickItem, exportDim
186
196
  emphKey,
187
197
  parsed.options.form,
188
198
  palette,
199
+ _isDark,
200
+ parsed.options.fillMode,
189
201
  defs
190
202
  )
191
203
  );
@@ -322,4 +334,4 @@ export {
322
334
  renderBody,
323
335
  renderBodyForExport
324
336
  };
325
- //# sourceMappingURL=chunk-J6K7RP6P.js.map
337
+ //# sourceMappingURL=chunk-JRCOYRRH.js.map
@@ -6,7 +6,7 @@ import {
6
6
  } from "./chunk-BMR4CIEO.js";
7
7
  import {
8
8
  renderNodeCard
9
- } from "./chunk-AHGF2YYA.js";
9
+ } from "./chunk-OTOHI4JO.js";
10
10
  import {
11
11
  CARD_RADIUS,
12
12
  HEADER_HEIGHT,
@@ -16,10 +16,10 @@ import {
16
16
  } from "./chunk-3CIOJ5YJ.js";
17
17
  import {
18
18
  formatDateLabel
19
- } from "./chunk-66RUL3XF.js";
19
+ } from "./chunk-7KINELPI.js";
20
20
  import {
21
21
  renderIntegratedLegend
22
- } from "./chunk-HEVYAHLW.js";
22
+ } from "./chunk-AUIM2NVH.js";
23
23
  import {
24
24
  TITLE_FONT_SIZE,
25
25
  TITLE_FONT_WEIGHT,
@@ -29,19 +29,20 @@ import {
29
29
  FONT_FAMILY
30
30
  } from "./chunk-6KFWC4CO.js";
31
31
  import {
32
- CHAR_WIDTH_RATIO
33
- } from "./chunk-5LWQH6QV.js";
32
+ CHAR_WIDTH_RATIO,
33
+ wrapTextToWidth
34
+ } from "./chunk-WCT3NYCV.js";
34
35
  import {
35
36
  contrastText,
36
37
  getSeriesColors,
37
38
  mix,
38
39
  shapeFill,
39
40
  themeBaseBg
40
- } from "./chunk-P6T66CCZ.js";
41
+ } from "./chunk-WBM7ZNDI.js";
41
42
  import {
42
43
  resolveActiveTagGroup,
43
44
  resolveTagColor
44
- } from "./chunk-FJUNPCYI.js";
45
+ } from "./chunk-HHKO6SKY.js";
45
46
  import {
46
47
  resolveColor
47
48
  } from "./chunk-TLVIHFRO.js";
@@ -58,6 +59,8 @@ var DESC_FONT = 11.5;
58
59
  var DESC_LINE_H = 16;
59
60
  var CARD_PAD = 9;
60
61
  var CARD_BODY_TOP = HEADER_HEIGHT + SEPARATOR_GAP;
62
+ var TITLE_LINE_H = 16;
63
+ var TITLE_MAX_W = (CARD_W - CARD_PAD * 2) * 0.93;
61
64
  var DOT_R = 5.5;
62
65
  var MIN_SPACING = 96;
63
66
  var LANE_GAP = 16;
@@ -136,7 +139,14 @@ function renderEventLine(container, parsed, palette, isDark, onClickItem, export
136
139
  8,
137
140
  Math.floor((CARD_W - CARD_PAD * 2) / (DESC_FONT * CHAR_WIDTH_RATIO))
138
141
  );
139
- const cardHeight = (lines, hasDate) => HEADER_HEIGHT + (hasDate ? DATE_SUBTITLE_H : 0) + (lines.length > 0 ? SEPARATOR_GAP + lines.length * DESC_LINE_H : 0) + (lines.length > 0 ? CARD_PAD : 6);
142
+ const titleLayout = (label) => {
143
+ const lines = wrapTextToWidth(label, LABEL_FONT_SIZE, TITLE_MAX_W, {
144
+ hardBreak: true
145
+ });
146
+ const headerH = Math.max(HEADER_HEIGHT, lines.length * TITLE_LINE_H + 12);
147
+ return { lines, headerH };
148
+ };
149
+ const cardHeight = (headerH, lines, hasDate) => headerH + (hasDate ? DATE_SUBTITLE_H : 0) + (lines.length > 0 ? SEPARATOR_GAP + lines.length * DESC_LINE_H : 0) + (lines.length > 0 ? CARD_PAD : 6);
140
150
  const eventColor = (ev) => {
141
151
  if (!activeGroup) return accent;
142
152
  const tc = resolveTagColor(
@@ -153,7 +163,7 @@ function renderEventLine(container, parsed, palette, isDark, onClickItem, export
153
163
  const event = slot.event;
154
164
  const solid2 = eventColor(event);
155
165
  const cardFill2 = shapeFill(palette, solid2, isDark, {
156
- solid: parsed.options.solidFill
166
+ mode: parsed.options.fillMode
157
167
  });
158
168
  const titleColor2 = contrastText(
159
169
  cardFill2,
@@ -161,6 +171,7 @@ function renderEventLine(container, parsed, palette, isDark, onClickItem, export
161
171
  palette.textOnFillDark
162
172
  );
163
173
  const lines2 = wrapDescription(event.description, charsPerLine);
174
+ const title2 = titleLayout(event.label);
164
175
  return {
165
176
  kind: "event",
166
177
  event,
@@ -176,10 +187,12 @@ function renderEventLine(container, parsed, palette, isDark, onClickItem, export
176
187
  color: solid2,
177
188
  cardFill: cardFill2,
178
189
  titleColor: titleColor2,
190
+ titleLines: title2.lines,
191
+ headerH: title2.headerH,
179
192
  lines: lines2,
180
193
  bulletColors: [],
181
194
  bulletMeta: [],
182
- cardH: cardHeight(lines2, !!event.date),
195
+ cardH: cardHeight(title2.headerH, lines2, !!event.date),
183
196
  x: 0,
184
197
  side,
185
198
  lane: 0,
@@ -214,6 +227,7 @@ function renderEventLine(container, parsed, palette, isDark, onClickItem, export
214
227
  const bulletColors = visibleMembers.map(eventColor);
215
228
  const bulletMeta = visibleMembers.map((m) => m.metadata);
216
229
  const lines = wrapDescription(memberStrs, charsPerLine);
230
+ const title = titleLayout(era.name);
217
231
  return {
218
232
  kind: "era",
219
233
  event: null,
@@ -229,10 +243,12 @@ function renderEventLine(container, parsed, palette, isDark, onClickItem, export
229
243
  color: solid,
230
244
  cardFill,
231
245
  titleColor,
246
+ titleLines: title.lines,
247
+ headerH: title.headerH,
232
248
  lines,
233
249
  bulletColors,
234
250
  bulletMeta,
235
- cardH: cardHeight(lines, false),
251
+ cardH: cardHeight(title.headerH, lines, false),
236
252
  x: 0,
237
253
  side,
238
254
  lane: 0,
@@ -331,32 +347,6 @@ function renderEventLine(container, parsed, palette, isDark, onClickItem, export
331
347
  p.x = H_MARGIN + i * spacing;
332
348
  });
333
349
  }
334
- if (scaled) {
335
- const SPREAD = CARD_W + FAN_GAP;
336
- for (let iter = 0; iter < 8; iter++) {
337
- let moved = false;
338
- for (const side of ["above", "below"]) {
339
- const obs = placed.filter((p) => p.side === side).sort((a, b) => a.x - b.x);
340
- for (let i = 1; i < obs.length; i++) {
341
- const p = obs[i];
342
- if (p.kind !== "event") continue;
343
- const prev = obs[i - 1];
344
- if (prev.kind === "event" && p.dateValue === prev.dateValue)
345
- continue;
346
- const need = prev.x + SPREAD;
347
- if (need <= p.x) continue;
348
- const nxt = obs[i + 1];
349
- const cap = nxt?.kind === "era" ? nxt.x - SPREAD : Infinity;
350
- const target = Math.min(need, cap);
351
- if (target > p.x + 0.5) {
352
- p.x = target;
353
- moved = true;
354
- }
355
- }
356
- }
357
- if (!moved) break;
358
- }
359
- }
360
350
  for (const side of ["above", "below"]) {
361
351
  const arr = placed.filter((p) => p.side === side).sort((a, b) => a.x - b.x);
362
352
  const laneRight = [];
@@ -536,30 +526,34 @@ function renderEventLine(container, parsed, palette, isDark, onClickItem, export
536
526
  const dateH = dateStr ? DATE_SUBTITLE_H : 0;
537
527
  if (parsed.options.noBox) {
538
528
  const titleNearTop = p.side === "below";
539
- const headBandTop = titleNearTop ? 0 : p.cardH - HEADER_HEIGHT;
540
- const shelfTop = titleNearTop ? 0 : p.cardH - HEADER_HEIGHT - dateH;
541
- const shelfH = HEADER_HEIGHT + dateH;
529
+ const headBandTop = titleNearTop ? 0 : p.cardH - p.headerH;
530
+ const shelfTop = titleNearTop ? 0 : p.cardH - p.headerH - dateH;
531
+ const shelfH = p.headerH + dateH;
542
532
  const clipId = `dgmo-evt-shelf-${shelfClipSeq++}`;
543
533
  cardG.append("clipPath").attr("id", clipId).append("rect").attr("x", 0).attr("y", shelfTop).attr("width", CARD_W).attr("height", shelfH).attr("rx", SHELF_EDGE);
544
534
  cardG.append("rect").attr("x", 0).attr("y", shelfTop).attr("width", CARD_W).attr("height", shelfH).attr("clip-path", `url(#${clipId})`).attr(
545
535
  "fill",
546
- parsed.options.solidFill ? p.color : mix(p.color, themeBaseBg(palette, isDark), SHELF_TINT)
536
+ parsed.options.fillMode ? p.color : mix(p.color, themeBaseBg(palette, isDark), SHELF_TINT)
547
537
  );
548
538
  const edgeY = titleNearTop ? shelfTop : shelfTop + shelfH - SHELF_EDGE;
549
539
  cardG.append("rect").attr("x", 0).attr("y", edgeY).attr("width", CARD_W).attr("height", SHELF_EDGE).attr("clip-path", `url(#${clipId})`).attr("fill", p.color).attr("fill-opacity", p.future ? 0.4 : 1);
550
- const shelfText = parsed.options.solidFill ? contrastText(p.color, palette.textOnFillLight, palette.textOnFillDark) : p.color;
551
- cardG.append("text").attr("x", CARD_PAD).attr("y", headBandTop + HEADER_HEIGHT / 2 + LABEL_FONT_SIZE / 2 - 2).attr("fill", shelfText).attr("font-family", FONT_FAMILY).attr("font-size", LABEL_FONT_SIZE).attr("font-weight", 700).text(p.label);
540
+ const shelfText = parsed.options.fillMode ? contrastText(p.color, palette.textOnFillLight, palette.textOnFillDark) : p.color;
541
+ const titleMid = headBandTop + p.headerH / 2;
542
+ const titleTop = titleMid - (p.titleLines.length - 1) * TITLE_LINE_H / 2;
543
+ for (let ti = 0; ti < p.titleLines.length; ti++) {
544
+ cardG.append("text").attr("x", CARD_PAD).attr("y", titleTop + ti * TITLE_LINE_H + LABEL_FONT_SIZE / 2 - 2).attr("fill", shelfText).attr("font-family", FONT_FAMILY).attr("font-size", LABEL_FONT_SIZE).attr("font-weight", 700).text(p.titleLines[ti]);
545
+ }
552
546
  if (dateStr) {
553
547
  cardG.append("text").attr("x", CARD_PAD).attr(
554
548
  "y",
555
- (titleNearTop ? HEADER_HEIGHT : headBandTop - dateH) + DATE_SUBTITLE_FONT + 2
549
+ (titleNearTop ? p.headerH : headBandTop - dateH) + DATE_SUBTITLE_FONT + 2
556
550
  ).attr(
557
551
  "fill",
558
- parsed.options.solidFill ? mix(shelfText, p.color, 25) : mix(palette.text, palette.bg, 55)
552
+ parsed.options.fillMode ? mix(shelfText, p.color, 25) : mix(palette.text, palette.bg, 55)
559
553
  ).attr("font-family", FONT_FAMILY).attr("font-size", DATE_SUBTITLE_FONT).attr("font-weight", 600).text(dateStr);
560
554
  }
561
555
  if (p.lines.length > 0) {
562
- const startBaseline = titleNearTop ? CARD_BODY_TOP + dateH + DESC_FONT : CARD_PAD + DESC_FONT;
556
+ const startBaseline = titleNearTop ? p.headerH + SEPARATOR_GAP + dateH + DESC_FONT : CARD_PAD + DESC_FONT;
563
557
  renderBody(
564
558
  cardG,
565
559
  p.lines,
@@ -579,21 +573,22 @@ function renderEventLine(container, parsed, palette, isDark, onClickItem, export
579
573
  stroke: p.color,
580
574
  strokeWidth: NODE_STROKE_WIDTH,
581
575
  label: p.label,
576
+ labelLines: p.titleLines,
582
577
  labelColor: p.titleColor,
583
578
  labelFontSize: LABEL_FONT_SIZE,
584
- headerHeight: HEADER_HEIGHT
579
+ headerHeight: p.headerH
585
580
  });
586
581
  if (dateStr) {
587
- cardG.append("text").attr("x", CARD_W / 2).attr("y", HEADER_HEIGHT + DATE_SUBTITLE_FONT + 1).attr("text-anchor", "middle").attr("fill", mix(p.titleColor, p.cardFill, 60)).attr("font-family", FONT_FAMILY).attr("font-size", DATE_SUBTITLE_FONT).attr("font-weight", 600).text(dateStr);
582
+ cardG.append("text").attr("x", CARD_W / 2).attr("y", p.headerH + DATE_SUBTITLE_FONT + 1).attr("text-anchor", "middle").attr("fill", mix(p.titleColor, p.cardFill, 60)).attr("font-family", FONT_FAMILY).attr("font-size", DATE_SUBTITLE_FONT).attr("font-weight", 600).text(dateStr);
588
583
  }
589
584
  if (p.lines.length > 0) {
590
- cardG.append("line").attr("x1", 0).attr("y1", HEADER_HEIGHT + dateH).attr("x2", CARD_W).attr("y2", HEADER_HEIGHT + dateH).attr("stroke", p.titleColor).attr("stroke-opacity", 0.3).attr("stroke-width", 1);
585
+ cardG.append("line").attr("x1", 0).attr("y1", p.headerH + dateH).attr("x2", CARD_W).attr("y2", p.headerH + dateH).attr("stroke", p.titleColor).attr("stroke-opacity", 0.3).attr("stroke-width", 1);
591
586
  renderBody(
592
587
  cardG,
593
588
  p.lines,
594
589
  p.titleColor,
595
590
  palette,
596
- CARD_BODY_TOP + dateH + DESC_FONT,
591
+ p.headerH + SEPARATOR_GAP + dateH + DESC_FONT,
597
592
  p.bulletColors,
598
593
  p.bulletMeta
599
594
  );
@@ -987,4 +982,4 @@ export {
987
982
  focusEventLine,
988
983
  renderEventLineForExport
989
984
  };
990
- //# sourceMappingURL=chunk-7QKLIMRZ.js.map
985
+ //# sourceMappingURL=chunk-K2I2XOZD.js.map
@@ -1,10 +1,13 @@
1
1
  import {
2
- formatLocalISODate,
3
- parseLocalISODate
4
- } from "./chunk-L3UHP6TD.js";
2
+ formatLocalISODate
3
+ } from "./chunk-7L4UJOY6.js";
5
4
  import {
6
5
  parseDuration
7
6
  } from "./chunk-USZW2HHU.js";
7
+ import {
8
+ parseDateToken,
9
+ toInternal
10
+ } from "./chunk-DAOFNU6J.js";
8
11
  import {
9
12
  AUTO_TAG_COLOR_SENTINEL,
10
13
  finalizeAutoTagColors,
@@ -14,7 +17,7 @@ import {
14
17
  tagAttrKey,
15
18
  validateTagGroupNames,
16
19
  validateTagValues
17
- } from "./chunk-FJUNPCYI.js";
20
+ } from "./chunk-HHKO6SKY.js";
18
21
  import {
19
22
  normalizeName
20
23
  } from "./chunk-NOTA6TEI.js";
@@ -25,7 +28,7 @@ import {
25
28
  splitNameAndMeta,
26
29
  warnUnknownMetaKeys,
27
30
  withTagAliases
28
- } from "./chunk-OTAL43EH.js";
31
+ } from "./chunk-BRENJ2BQ.js";
29
32
  import {
30
33
  emit,
31
34
  makeDgmoError,
@@ -81,7 +84,7 @@ var PERT_DX = {
81
84
  const date = p.trimmed ?? p.value;
82
85
  return date ? `Invalid date '${String(date)}' for ${String(key)}. Expected YYYY-MM-DD.` : `Invalid date for ${String(key)}. Expected YYYY-MM-DD.`;
83
86
  },
84
- hint: "Use a calendar-valid ISO date, e.g. `2026-06-01` (dashes, not slashes).",
87
+ hint: "Use a calendar-valid date \u2014 ISO (`2026-06-01`), slash (`6/1/2026`), or month-name (`Jun 1, 2026`).",
85
88
  example: "pert\nstart-date 2026-13-99\nA 1 2 3\n"
86
89
  },
87
90
  NEAR_DIRECTIVE: {
@@ -135,11 +138,17 @@ var DIRECTIVE_KEYS = /* @__PURE__ */ new Set([
135
138
  "start-date",
136
139
  "end-date",
137
140
  "no-title",
138
- "solid-fill",
141
+ "fill-tint",
142
+ "fill-solid",
143
+ "fill-outline",
139
144
  "sprint-length",
140
145
  "sprint-number",
141
146
  "sprint-start",
142
- "active-tag"
147
+ "active-tag",
148
+ // Universal date directives (§ BL-121); effect captured in the prescan.
149
+ "year",
150
+ "date-order",
151
+ "no-current-year"
143
152
  ]);
144
153
  var RESERVED_PIPE_KEYS = /* @__PURE__ */ new Set([
145
154
  "confidence",
@@ -152,14 +161,16 @@ var NEAR_DIRECTIVE_HINTS = [
152
161
  matches: /^(low|medium|high)$/i
153
162
  },
154
163
  {
164
+ // ISO, numeric slash (§ BL-121), or `now`. Month-name forms are omitted
165
+ // to avoid flagging activities like `start the engines`.
155
166
  stem: "start",
156
167
  canonical: "start-date",
157
- matches: /^(\d{4}-\d{2}-\d{2}|now)$/i
168
+ matches: /^(\d{4}-\d{2}-\d{2}|\d{1,2}\/\d{1,2}(?:\/\d{2,4})?|now)$/i
158
169
  },
159
170
  {
160
171
  stem: "end",
161
172
  canonical: "end-date",
162
- matches: /^\d{4}-\d{2}-\d{2}$/
173
+ matches: /^(\d{4}-\d{2}-\d{2}|\d{1,2}\/\d{1,2}(?:\/\d{2,4})?)$/
163
174
  },
164
175
  {
165
176
  stem: "time",
@@ -374,6 +385,15 @@ function parsePipeMetadata(raw, aliasMap = /* @__PURE__ */ new Map()) {
374
385
  }
375
386
  return out;
376
387
  }
388
+ function prescanPertYear(lines, order) {
389
+ for (const raw of lines) {
390
+ const m = raw.trim().match(/^(?:start-date|end-date|sprint-start)\s+(.+)$/i);
391
+ if (!m) continue;
392
+ const res = parseDateToken(m[1].trim(), { dateOrder: order });
393
+ if (res?.token.year != null) return res.token.sign * res.token.year;
394
+ }
395
+ return null;
396
+ }
377
397
  function parsePert(content, parseOpts = {}) {
378
398
  const lines = content.split("\n");
379
399
  const diagnostics = [];
@@ -384,6 +404,19 @@ function parsePert(content, parseOpts = {}) {
384
404
  diagnostics.push(makeDgmoError(line, msg, "warning", code));
385
405
  };
386
406
  const today = formatLocalISODate(parseOpts.now ?? /* @__PURE__ */ new Date());
407
+ let dateOrder = "mdy";
408
+ let directiveYear = null;
409
+ let noCurrentYear = false;
410
+ for (const raw of lines) {
411
+ const t = raw.trim();
412
+ const dm = t.match(/^date-order\s+(mdy|dmy)$/i);
413
+ if (dm) dateOrder = dm[1].toLowerCase();
414
+ const ym = t.match(/^year\s+(\d{1,4})$/i);
415
+ if (ym) directiveYear = parseInt(ym[1], 10);
416
+ if (t.toLowerCase() === "no-current-year") noCurrentYear = true;
417
+ }
418
+ const currentYear = parseInt(today.slice(0, 4), 10);
419
+ const baseYear = directiveYear ?? prescanPertYear(lines, dateOrder);
387
420
  const options = { ...DEFAULT_OPTIONS, today };
388
421
  let title = null;
389
422
  let firstAnchorLine = null;
@@ -629,7 +662,8 @@ function parsePert(content, parseOpts = {}) {
629
662
  options,
630
663
  diagnostics,
631
664
  firstAnchorLine,
632
- firstAnchorKey
665
+ firstAnchorKey,
666
+ { order: dateOrder, baseYear, currentYear, noCurrentYear }
633
667
  );
634
668
  if (!hadAnchor && options.anchor !== null) {
635
669
  firstAnchorLine = lineNumber;
@@ -640,7 +674,12 @@ function parsePert(content, parseOpts = {}) {
640
674
  }
641
675
  continue;
642
676
  }
643
- applyDirective(head, value, lineNumber, options, error, warn);
677
+ applyDirective(head, value, lineNumber, options, error, warn, {
678
+ order: dateOrder,
679
+ baseYear,
680
+ currentYear,
681
+ noCurrentYear
682
+ });
644
683
  continue;
645
684
  }
646
685
  }
@@ -907,8 +946,14 @@ function parsePert(content, parseOpts = {}) {
907
946
  error: firstFatal ? firstFatal.message : null
908
947
  };
909
948
  }
910
- function applyDirective(key, value, lineNumber, options, error, warn) {
949
+ function applyDirective(key, value, lineNumber, options, error, warn, dateCfg) {
911
950
  switch (key) {
951
+ // Universal date directives (§ BL-121) — captured in the parsePert prescan;
952
+ // consumed here so they don't warn as unknown.
953
+ case "year":
954
+ case "date-order":
955
+ case "no-current-year":
956
+ return;
912
957
  case "time-unit": {
913
958
  const valid = [
914
959
  "min",
@@ -939,8 +984,16 @@ function applyDirective(key, value, lineNumber, options, error, warn) {
939
984
  options.noTitle = true;
940
985
  return;
941
986
  }
942
- case "solid-fill": {
943
- options.solidFill = true;
987
+ case "fill-solid": {
988
+ options.fillMode = "solid";
989
+ return;
990
+ }
991
+ case "fill-outline": {
992
+ options.fillMode = "outline";
993
+ return;
994
+ }
995
+ case "fill-tint": {
996
+ delete options.fillMode;
944
997
  return;
945
998
  }
946
999
  case "active-tag": {
@@ -984,15 +1037,18 @@ function applyDirective(key, value, lineNumber, options, error, warn) {
984
1037
  return;
985
1038
  }
986
1039
  case "sprint-start": {
987
- if (!/^\d{4}-\d{2}-\d{2}$/.test(value)) {
1040
+ const res = parseDateToken(value.trim(), { dateOrder: dateCfg.order });
1041
+ const yr = res?.token.year ?? dateCfg.baseYear ?? dateCfg.currentYear;
1042
+ const iso = res?.consumed === value.trim().length && !res.token.invalidTime && res.token.grain >= 3 && !res.token.hasTime ? toInternal(res.token, yr) : null;
1043
+ if (!iso) {
988
1044
  warn(
989
1045
  lineNumber,
990
- `sprint-start requires a full date (YYYY-MM-DD), got "${value}".`
1046
+ `sprint-start requires a full date (e.g. YYYY-MM-DD, 7/4, or Jul 4), got "${value}".`
991
1047
  );
992
- } else if (Number.isNaN((/* @__PURE__ */ new Date(value + "T00:00:00")).getTime())) {
1048
+ } else if (Number.isNaN((/* @__PURE__ */ new Date(iso + "T00:00:00")).getTime())) {
993
1049
  warn(lineNumber, `sprint-start is not a valid date: "${value}".`);
994
1050
  } else {
995
- options.sprintStart = value;
1051
+ options.sprintStart = iso;
996
1052
  }
997
1053
  return;
998
1054
  }
@@ -1069,7 +1125,7 @@ function applyDirective(key, value, lineNumber, options, error, warn) {
1069
1125
  }
1070
1126
  }
1071
1127
  }
1072
- function applyAnchorDirective(key, value, lineNumber, options, diagnostics, firstAnchorLine, firstAnchorKey) {
1128
+ function applyAnchorDirective(key, value, lineNumber, options, diagnostics, firstAnchorLine, firstAnchorKey, dateCfg) {
1073
1129
  if (options.anchor !== null) {
1074
1130
  diagnostics.push(
1075
1131
  emit(PERT_DX.BOTH_ANCHORS, lineNumber, {
@@ -1095,12 +1151,28 @@ function applyAnchorDirective(key, value, lineNumber, options, diagnostics, firs
1095
1151
  options.anchor = { kind: "forward", date: options.today };
1096
1152
  return;
1097
1153
  }
1098
- const parsed = parseLocalISODate(trimmed);
1099
- if (!parsed) {
1154
+ const res = parseDateToken(trimmed, { dateOrder: dateCfg.order });
1155
+ if (res?.consumed !== trimmed.length || res.token.invalidTime || res.token.grain < 3) {
1156
+ diagnostics.push(emit(PERT_DX.INVALID_DATE, lineNumber, { trimmed, key }));
1157
+ return;
1158
+ }
1159
+ let year = res.token.year;
1160
+ if (year == null) {
1161
+ if (dateCfg.baseYear == null && dateCfg.noCurrentYear) {
1162
+ diagnostics.push(
1163
+ emit(PERT_DX.INVALID_DATE, lineNumber, { trimmed, key })
1164
+ );
1165
+ return;
1166
+ }
1167
+ year = dateCfg.baseYear ?? dateCfg.currentYear;
1168
+ }
1169
+ const probe = new Date(year, res.token.month - 1, res.token.day);
1170
+ if (probe.getFullYear() !== year || probe.getMonth() !== res.token.month - 1 || probe.getDate() !== res.token.day) {
1100
1171
  diagnostics.push(emit(PERT_DX.INVALID_DATE, lineNumber, { trimmed, key }));
1101
1172
  return;
1102
1173
  }
1103
- options.anchor = key === "start-date" ? { kind: "forward", date: trimmed } : { kind: "backward", date: trimmed };
1174
+ const iso = toInternal(res.token, year);
1175
+ options.anchor = key === "start-date" ? { kind: "forward", date: iso } : { kind: "backward", date: iso };
1104
1176
  }
1105
1177
  function classifyGroup(group, edges) {
1106
1178
  const members = new Set(group.activityIds);
@@ -1152,4 +1224,4 @@ export {
1152
1224
  extractPertSymbols,
1153
1225
  looksLikePert
1154
1226
  };
1155
- //# sourceMappingURL=chunk-EAMEADTV.js.map
1227
+ //# sourceMappingURL=chunk-K4EOKJA6.js.map
@@ -14,10 +14,10 @@ import {
14
14
  } from "./chunk-3CIOJ5YJ.js";
15
15
  import {
16
16
  renderIntegratedLegend
17
- } from "./chunk-HEVYAHLW.js";
17
+ } from "./chunk-AUIM2NVH.js";
18
18
  import {
19
19
  getMaxLegendReservedHeight
20
- } from "./chunk-7UEMZREK.js";
20
+ } from "./chunk-YAA6IID3.js";
21
21
  import {
22
22
  TITLE_FONT_SIZE,
23
23
  TITLE_FONT_WEIGHT,
@@ -28,20 +28,23 @@ import {
28
28
  } from "./chunk-6KFWC4CO.js";
29
29
  import {
30
30
  LEGEND_GROUP_GAP
31
- } from "./chunk-HQCHYB5F.js";
31
+ } from "./chunk-QOOUC2J5.js";
32
32
  import {
33
33
  measureText
34
- } from "./chunk-5LWQH6QV.js";
34
+ } from "./chunk-WCT3NYCV.js";
35
35
  import {
36
36
  contrastText,
37
37
  mix,
38
38
  shapeFill,
39
39
  themeBaseBg
40
- } from "./chunk-P6T66CCZ.js";
40
+ } from "./chunk-WBM7ZNDI.js";
41
41
  import {
42
42
  resolveTagColor,
43
43
  tagAttrKey
44
- } from "./chunk-FJUNPCYI.js";
44
+ } from "./chunk-HHKO6SKY.js";
45
+ import {
46
+ fillModeFromOptions
47
+ } from "./chunk-BRENJ2BQ.js";
45
48
  import {
46
49
  resolveColor
47
50
  } from "./chunk-TLVIHFRO.js";
@@ -88,7 +91,7 @@ function baseColor(node, parsed, palette, activeTagGroup) {
88
91
  function renderFamilyForExport(container, parsed, layout, palette, isDark, opts = {}) {
89
92
  d3Selection.select(container).selectAll(":not([data-d3-tooltip])").remove();
90
93
  const activeTagGroup = opts.activeTagGroup ?? null;
91
- const solid = parsed.options["solid-fill"] === "on";
94
+ const fillMode = fillModeFromOptions(parsed.options);
92
95
  const noDaggers = parsed.options["no-daggers"] === "true";
93
96
  const baseBg = themeBaseBg(palette, isDark);
94
97
  const PAD = 20;
@@ -202,7 +205,7 @@ function renderFamilyForExport(container, parsed, layout, palette, isDark, opts
202
205
  for (const node of layout.nodes) {
203
206
  const isPh = !!node.placeholder;
204
207
  const base = baseColor(node, parsed, palette, activeTagGroup);
205
- const fill = isPh ? mix(palette.textMuted, baseBg, 6) : shapeFill(palette, base, isDark, { solid });
208
+ const fill = isPh ? mix(palette.textMuted, baseBg, 6) : shapeFill(palette, base, isDark, { mode: fillMode });
206
209
  const stroke = isPh ? palette.textMuted : base;
207
210
  const labelColor = isPh ? palette.textMuted : contrastText(fill, palette.textOnFillLight, palette.textOnFillDark);
208
211
  const g = cardsG.append("g").attr("class", "family-card").attr("transform", `translate(${node.x}, ${node.y})`).attr("data-line-number", String(node.lineNumber)).attr("data-person-id", node.id);
@@ -223,7 +226,7 @@ function renderFamilyForExport(container, parsed, layout, palette, isDark, opts
223
226
  focusG.append("circle").attr("cx", fx).attr("cy", fy).attr("r", 1.6).attr("fill", labelColor);
224
227
  const rows = familyCardRows(node);
225
228
  if (rows.length === 0) continue;
226
- g.append("line").attr("x1", 0).attr("y1", HEADER_HEIGHT).attr("x2", node.width).attr("y2", HEADER_HEIGHT).attr("stroke", solid ? labelColor : stroke).attr("stroke-opacity", 0.3).attr("stroke-width", 1);
229
+ g.append("line").attr("x1", 0).attr("y1", HEADER_HEIGHT).attr("x2", node.width).attr("y2", HEADER_HEIGHT).attr("stroke", fillMode === "solid" ? labelColor : stroke).attr("stroke-opacity", 0.3).attr("stroke-width", 1);
227
230
  const maxKeyWidth = Math.max(
228
231
  0,
229
232
  ...rows.filter((r) => !r.year).map((r) => measureText(`${r.key}: `, META_FONT_SIZE))
@@ -270,4 +273,4 @@ export {
270
273
  renderFamilyForExport,
271
274
  renderFamily
272
275
  };
273
- //# sourceMappingURL=chunk-5OWVC2A6.js.map
276
+ //# sourceMappingURL=chunk-KGVZ5VGH.js.map