@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
@@ -1,30 +1,37 @@
1
1
  import {
2
2
  monthIndex,
3
3
  resolveNext,
4
+ targetToMs,
4
5
  weekdayIndex
5
- } from "./chunk-YNRDWYZP.js";
6
+ } from "./chunk-OQKP2X3D.js";
7
+ import {
8
+ normalizeDate
9
+ } from "./chunk-DAOFNU6J.js";
6
10
  import {
7
11
  extractColor,
12
+ fillModeFromToken,
8
13
  measureIndent,
9
14
  parseFirstLine
10
- } from "./chunk-OTAL43EH.js";
15
+ } from "./chunk-BRENJ2BQ.js";
11
16
  import {
12
17
  makeDgmoError,
13
18
  makeFail
14
19
  } from "./chunk-CXK4DZH3.js";
15
20
 
16
21
  // src/countdown/parser.ts
17
- var DATE_ONLY_RE = /^\d{4}-\d{2}-\d{2}$/;
18
22
  var TIME_24H_RE = /^(\d{1,2}):(\d{2})$/;
19
23
  var AMPM_RE = /^(\d{1,2})(?::(\d{2}))?\s*([ap]m)$/i;
20
- function targetToMs(target) {
21
- const s = target.trim();
22
- if (DATE_ONLY_RE.test(s)) {
23
- const [y, m, d] = s.split("-").map(Number);
24
- return new Date(y, m - 1, d).getTime();
24
+ function targetToMs2(target, tz = null) {
25
+ const ms = targetToMs(target, tz);
26
+ return Number.isFinite(ms) ? ms : null;
27
+ }
28
+ function isValidZone(zone) {
29
+ try {
30
+ new Intl.DateTimeFormat("en-US", { timeZone: zone });
31
+ return true;
32
+ } catch {
33
+ return false;
25
34
  }
26
- const t = new Date(s).getTime();
27
- return Number.isFinite(t) ? t : null;
28
35
  }
29
36
  function ordinalToken(tok) {
30
37
  const t = tok.toLowerCase();
@@ -71,6 +78,7 @@ function parseCountdown(content, palette) {
71
78
  rule: null,
72
79
  resolvedMs: null,
73
80
  hasTime: false,
81
+ tz: null,
74
82
  since: null,
75
83
  sinceLabel: null,
76
84
  units: "human",
@@ -99,12 +107,19 @@ function parseCountdown(content, palette) {
99
107
  let intervalUnit = "day";
100
108
  let onSpec = null;
101
109
  let atTime = null;
110
+ let targetRaw = null;
111
+ let targetIsNow = false;
112
+ let targetLine = 1;
113
+ let fromRaw = null;
114
+ let fromLine = 1;
102
115
  let anchorMs = null;
103
116
  let targetMs = null;
104
117
  let hasTargetLine = false;
105
118
  let hasEvery = false;
106
119
  const noteBody = [];
107
120
  let inNote = false;
121
+ let dateOrder = "mdy";
122
+ let baseYear = null;
108
123
  for (let i = 0; i < lines.length; i++) {
109
124
  const lineNum = i + 1;
110
125
  const raw = lines[i];
@@ -146,22 +161,14 @@ function parseCountdown(content, palette) {
146
161
  // ── One-shot target ──
147
162
  case "target": {
148
163
  hasTargetLine = true;
164
+ targetLine = lineNum;
149
165
  if (/^now$/i.test(rest)) {
150
- targetMs = Date.now();
151
- result.target = new Date(targetMs).toISOString();
166
+ targetIsNow = true;
152
167
  result.hasTime = true;
153
168
  } else {
154
- const ms = targetToMs(rest);
155
- if (ms === null) {
156
- softError(
157
- lineNum,
158
- `"target" needs an ISO date/datetime or "now" (got "${rest}").`
159
- );
160
- } else {
161
- result.target = rest;
162
- targetMs = ms;
163
- if (rest.includes("T")) result.hasTime = true;
164
- }
169
+ targetRaw = rest;
170
+ result.target = rest;
171
+ if (rest.includes("T")) result.hasTime = true;
165
172
  }
166
173
  break;
167
174
  }
@@ -217,15 +224,8 @@ function parseCountdown(content, palette) {
217
224
  if (seg.at.length)
218
225
  atTime = parseAt(seg.at.join(" "), lineNum, softError);
219
226
  if (seg.from.length) {
220
- const ms = targetToMs(seg.from.join(" "));
221
- if (ms === null) {
222
- softError(
223
- lineNum,
224
- `"from" needs an anchor date (got "${seg.from.join(" ")}").`
225
- );
226
- } else {
227
- anchorMs = ms;
228
- }
227
+ fromRaw = seg.from.join(" ");
228
+ fromLine = lineNum;
229
229
  }
230
230
  break;
231
231
  }
@@ -240,12 +240,22 @@ function parseCountdown(content, palette) {
240
240
  break;
241
241
  }
242
242
  case "from": {
243
- const ms = targetToMs(rest);
244
- if (ms === null) {
245
- softError(lineNum, `"from" needs an anchor date (got "${rest}").`);
246
- } else {
247
- anchorMs = ms;
248
- }
243
+ fromRaw = rest;
244
+ fromLine = lineNum;
245
+ break;
246
+ }
247
+ // ── Universal date directives (§ BL-121) ──
248
+ case "date-order": {
249
+ const v = rest.toLowerCase();
250
+ if (v === "mdy" || v === "dmy") dateOrder = v;
251
+ else
252
+ softError(lineNum, `"date-order" is "mdy" or "dmy" (got "${rest}").`);
253
+ break;
254
+ }
255
+ case "year": {
256
+ const y = parseInt(rest, 10);
257
+ if (Number.isInteger(y) && y > 0) baseYear = y;
258
+ else softError(lineNum, `"year" needs a 4-digit year (got "${rest}").`);
249
259
  break;
250
260
  }
251
261
  // ── Ordinal / since — numbers a yearly occurrence (resolvedYear − since) ──
@@ -291,6 +301,22 @@ function parseCountdown(content, palette) {
291
301
  case "lang":
292
302
  result.lang = rest.toLowerCase() || "en";
293
303
  break;
304
+ // ── `tz <IANA>` — pin authored wall-clock times to a zone (§36 tz slot).
305
+ // Space-separated (no colon), an IANA id like `America/New_York`. ──
306
+ case "tz": {
307
+ const zone = rest.trim();
308
+ if (!zone) {
309
+ warn(lineNum, '"tz" needs an IANA zone like America/New_York.');
310
+ } else if (!isValidZone(zone)) {
311
+ warn(
312
+ lineNum,
313
+ `Unknown time zone "${zone}" \u2014 use an IANA id like America/New_York. Counting viewer-local.`
314
+ );
315
+ } else {
316
+ result.tz = zone;
317
+ }
318
+ break;
319
+ }
294
320
  case "on-day":
295
321
  result.onDay = rest || null;
296
322
  break;
@@ -301,6 +327,16 @@ function parseCountdown(content, palette) {
301
327
  case "no-visual":
302
328
  result.noVisual = true;
303
329
  break;
330
+ // ── §1.9 fill family — mutually exclusive bare flags, last one wins;
331
+ // `fill-tint` is the explicit spelling of the default (clears it). ──
332
+ case "fill-tint":
333
+ case "fill-solid":
334
+ case "fill-outline": {
335
+ const fm = fillModeFromToken(key);
336
+ if (fm === "solid" || fm === "outline") result.fillMode = fm;
337
+ else delete result.fillMode;
338
+ break;
339
+ }
304
340
  // ── `note` — markdown caption; inline value or indented body block. ──
305
341
  case "note":
306
342
  inNote = true;
@@ -311,6 +347,35 @@ function parseCountdown(content, palette) {
311
347
  }
312
348
  }
313
349
  if (noteBody.length) result.note = noteBody.join("\n");
350
+ if (targetIsNow) {
351
+ targetMs = Date.now();
352
+ result.target = new Date(targetMs).toISOString();
353
+ } else if (targetRaw !== null) {
354
+ const iso = normalizeDate(targetRaw, { order: dateOrder, year: baseYear });
355
+ const effective = iso ?? targetRaw;
356
+ const ms = targetToMs2(effective, result.tz);
357
+ if (ms === null) {
358
+ softError(
359
+ targetLine,
360
+ `"target" needs a date/datetime or "now" (got "${targetRaw}").`
361
+ );
362
+ } else {
363
+ targetMs = ms;
364
+ if (iso) {
365
+ result.target = iso;
366
+ if (iso.includes(":")) result.hasTime = true;
367
+ }
368
+ }
369
+ }
370
+ if (fromRaw !== null) {
371
+ const iso = normalizeDate(fromRaw, { order: dateOrder, year: baseYear });
372
+ const ms = targetToMs2(iso ?? fromRaw, result.tz);
373
+ if (ms === null) {
374
+ softError(fromLine, `"from" needs an anchor date (got "${fromRaw}").`);
375
+ } else {
376
+ anchorMs = ms;
377
+ }
378
+ }
314
379
  if (hasEvery && hasTargetLine) {
315
380
  softError(
316
381
  result.titleLineNumber ?? 1,
@@ -333,8 +398,9 @@ function parseCountdown(content, palette) {
333
398
  softError
334
399
  );
335
400
  if (rule) {
336
- result.rule = rule;
337
- result.resolvedMs = resolveNext(rule, Date.now());
401
+ const tzRule = result.tz ? { ...rule, tz: result.tz } : rule;
402
+ result.rule = tzRule;
403
+ result.resolvedMs = resolveNext(tzRule, Date.now());
338
404
  if (atTime) result.hasTime = true;
339
405
  }
340
406
  } else if (targetMs !== null) {
@@ -476,7 +542,7 @@ function emitFreeProseError(lineNum, rest, softError) {
476
542
  }
477
543
 
478
544
  export {
479
- targetToMs,
545
+ targetToMs2 as targetToMs,
480
546
  parseCountdown
481
547
  };
482
- //# sourceMappingURL=chunk-BTUTZMPT.js.map
548
+ //# sourceMappingURL=chunk-FT3ZYWET.js.map
@@ -8,22 +8,26 @@ import {
8
8
  import {
9
9
  DAY_MS,
10
10
  applyOrdinalTemplate,
11
+ dayStart,
11
12
  formatCompound,
12
13
  formatCount,
13
14
  formatDateShort,
14
15
  formatFooter,
15
16
  formatHuman,
16
17
  formatWordsDetail,
17
- ordinalFor
18
- } from "./chunk-YNRDWYZP.js";
18
+ ordinalFor,
19
+ sameDay,
20
+ splitClockSeconds
21
+ } from "./chunk-OQKP2X3D.js";
19
22
  import {
20
23
  FONT_FAMILY
21
24
  } from "./chunk-6KFWC4CO.js";
22
25
  import {
26
+ contrastText,
23
27
  getSeriesColors,
24
28
  mix,
25
29
  themeBaseBg
26
- } from "./chunk-P6T66CCZ.js";
30
+ } from "./chunk-WBM7ZNDI.js";
27
31
  import {
28
32
  resolveColor
29
33
  } from "./chunk-TLVIHFRO.js";
@@ -33,23 +37,24 @@ import * as d3Selection from "d3-selection";
33
37
  function bakedHero(parsed, now) {
34
38
  const resolved = parsed.resolvedMs;
35
39
  if (resolved === null) return "\u2014";
40
+ const tz = parsed.tz;
36
41
  const remaining = resolved - now;
37
42
  if (!parsed.rule && remaining <= 0) {
38
43
  if (parsed.expired !== null) return parsed.expired;
39
44
  const elapsed = -remaining;
40
45
  if (elapsed <= 0) return "Now!";
41
46
  if (parsed.units === "compound" || parsed.units === "human")
42
- return `${formatCompound(resolved, now)} ago`;
47
+ return `${formatCompound(resolved, now, 2, tz)} ago`;
43
48
  const bu = parsed.units === "full" || parsed.units === "clock" ? "days" : parsed.units;
44
49
  return `${formatCount(elapsed, { units: bu, round: parsed.round, fields: parsed.fields })} ago`;
45
50
  }
46
- if (parsed.rule && sameLocalDay(resolved, now))
51
+ if (parsed.rule && sameDay(resolved, now, tz))
47
52
  return parsed.onDay ?? "Today!";
48
53
  if (parsed.units === "human") {
49
- const [hn, ht] = parsed.hasTime ? [now, resolved] : [DAY_START(now), DAY_START(resolved)];
50
- return formatHuman(hn, ht).big;
54
+ const [hn, ht] = parsed.hasTime ? [now, resolved] : [dayStart(now, tz), dayStart(resolved, tz)];
55
+ return formatHuman(hn, ht, tz).big;
51
56
  }
52
- if (parsed.units === "compound") return formatCompound(now, resolved);
57
+ if (parsed.units === "compound") return formatCompound(now, resolved, 2, tz);
53
58
  const bakeUnits = parsed.units === "full" || parsed.units === "clock" ? "days" : parsed.units;
54
59
  return formatCount(Math.max(0, remaining), {
55
60
  units: bakeUnits,
@@ -57,11 +62,6 @@ function bakedHero(parsed, now) {
57
62
  fields: parsed.fields
58
63
  });
59
64
  }
60
- function sameLocalDay(a, b) {
61
- const x = new Date(a);
62
- const y = new Date(b);
63
- return x.getFullYear() === y.getFullYear() && x.getMonth() === y.getMonth() && x.getDate() === y.getDate();
64
- }
65
65
  function stampRecur(sel, parsed) {
66
66
  const r = parsed.rule;
67
67
  if (!r) return;
@@ -78,6 +78,7 @@ function stampRecur(sel, parsed) {
78
78
  if (r.intervalUnit !== void 0)
79
79
  sel.attr("data-dgmo-recur-interval-unit", r.intervalUnit);
80
80
  if (r.anchorMs !== void 0) sel.attr("data-dgmo-recur-anchor", r.anchorMs);
81
+ if (r.tz !== void 0) sel.attr("data-dgmo-recur-tz", r.tz);
81
82
  }
82
83
  var MON_ABBR = [
83
84
  "Jan",
@@ -103,7 +104,7 @@ var keyOf = (ms) => {
103
104
  const d = new Date(ms);
104
105
  return d.getFullYear() * 1e4 + d.getMonth() * 100 + d.getDate();
105
106
  };
106
- function bandColors(palette, accent, muted, faint) {
107
+ function bandColors(palette, accent, muted, faint, isDark, fillMode) {
107
108
  const blue = resolveColor("blue", palette) ?? mix(palette.text, palette.bg, 45);
108
109
  const collides = accent.toLowerCase() === blue.toLowerCase();
109
110
  const now = collides ? resolveColor("teal", palette) ?? resolveColor("cyan", palette) ?? mix(palette.text, palette.bg, 55) : blue;
@@ -118,7 +119,11 @@ function bandColors(palette, accent, muted, faint) {
118
119
  event: accent,
119
120
  midSoft: mix(mid, palette.bg, 24),
120
121
  inert: mix(palette.text, palette.bg, 7),
121
- inertBorder: mix(palette.text, palette.bg, 22)
122
+ inertBorder: mix(palette.text, palette.bg, 22),
123
+ fillMode,
124
+ baseBg: themeBaseBg(palette, isDark),
125
+ onLight: palette.textOnFillLight,
126
+ onDark: palette.textOnFillDark
122
127
  };
123
128
  }
124
129
  function roleStyle(C, role) {
@@ -128,15 +133,26 @@ function roleStyle(C, role) {
128
133
  case "future":
129
134
  return { fill: C.inert, stroke: C.inertBorder, text: C.muted };
130
135
  case "today":
131
- return { fill: C.now, stroke: C.now, text: C.bg };
136
+ return chipStyle(C, C.now);
132
137
  case "event":
133
- return { fill: C.event, stroke: C.event, text: C.bg };
138
+ return chipStyle(C, C.event);
134
139
  }
135
140
  }
141
+ function chipStyle(C, color) {
142
+ if (C.fillMode === "outline")
143
+ return { fill: C.baseBg, stroke: color, text: color };
144
+ if (C.fillMode === "solid")
145
+ return {
146
+ fill: color,
147
+ stroke: color,
148
+ text: contrastText(color, C.onLight, C.onDark)
149
+ };
150
+ return { fill: color, stroke: color, text: C.bg };
151
+ }
136
152
  function gradStyle(C, frac) {
137
153
  const t = Math.max(0, Math.min(1, frac));
138
154
  const f = mix(C.event, C.now, Math.round(t * 100));
139
- return { fill: f, stroke: f, text: C.bg };
155
+ return chipStyle(C, f);
140
156
  }
141
157
  function aText(svg, x, y, size, fill, weight, anchor, txt, extra) {
142
158
  const t = svg.append("text").attr("x", x).attr("y", y).attr("text-anchor", anchor).attr("font-size", size).attr("font-weight", weight).attr("fill", fill).attr("font-family", FONT_FAMILY).attr("font-variant-numeric", "tabular-nums").text(txt);
@@ -150,7 +166,7 @@ function aLine(svg, x1, y1, x2, y2, stroke, sw, opacity) {
150
166
  const l = svg.append("line").attr("x1", x1).attr("y1", y1).attr("x2", x2).attr("y2", y2).attr("stroke", stroke).attr("stroke-width", sw);
151
167
  if (opacity != null) l.attr("opacity", opacity);
152
168
  }
153
- var REPEAT_ICON_PATH = "m17 2 4 4-4 4 M3 11v-1a4 4 0 0 1 4-4h14 m7 22-4-4 4-4 M21 13v1a4 4 0 0 1-4 4H3";
169
+ var REPEAT_ICON_PATH = "m17 2 4 4-4 4 M3 11v-1a4 4 0 0 1 4-4h14 M7 22l-4-4 4-4 M21 13v1a4 4 0 0 1-4 4H3";
154
170
  function recurGlyph(svg, cx, cy, r, color) {
155
171
  const side = r * 2.4;
156
172
  const scale = side / 24;
@@ -162,7 +178,7 @@ function recurGlyph(svg, cx, cy, r, color) {
162
178
  }
163
179
  function haloRect(svg, x, y, w, h, rx, C) {
164
180
  aRect(svg, x - 1, y - 1, w + 2, h + 2, rx + 1, "none", C.bg, 2);
165
- aRect(svg, x - 3, y - 3, w + 6, h + 6, rx + 3, "none", C.event, 2);
181
+ svg.append("rect").attr("class", "dgmo-countdown-target-ring").attr("x", x - 3).attr("y", y - 3).attr("width", w + 6).attr("height", h + 6).attr("rx", rx + 3).attr("fill", "none").attr("stroke", C.event).attr("stroke-width", 2);
166
182
  }
167
183
  function pickBand(nowMs, resolvedMs, hasTime) {
168
184
  const days = dayDelta(nowMs, resolvedMs);
@@ -658,13 +674,14 @@ function vizToday(svg, g, resolvedMs, C) {
658
674
  }
659
675
  const w = Math.min(120, g.contentW * 0.16);
660
676
  const h = g.height * 0.52;
661
- aRect(svg, cx - w / 2, cy - h / 2, w, h, 18, C.event, C.event, 2);
677
+ const st = roleStyle(C, "event");
678
+ aRect(svg, cx - w / 2, cy - h / 2, w, h, 18, st.fill, st.stroke, 2);
662
679
  aText(
663
680
  svg,
664
681
  cx,
665
682
  cy - h * 0.14,
666
683
  14,
667
- C.bg,
684
+ st.text,
668
685
  700,
669
686
  "middle",
670
687
  MON_ABBR[ev.getMonth()].toUpperCase(),
@@ -675,7 +692,7 @@ function vizToday(svg, g, resolvedMs, C) {
675
692
  cx,
676
693
  cy + h * 0.22,
677
694
  Math.min(48, h * 0.4),
678
- C.bg,
695
+ st.text,
679
696
  800,
680
697
  "middle",
681
698
  String(ev.getDate())
@@ -826,6 +843,13 @@ function vizClock(svg, g, nowMs, targetMs, C) {
826
843
  function pad2(n) {
827
844
  return n < 10 ? "0" + n : String(n);
828
845
  }
846
+ function paintClock(sel, str, secSize, secFill) {
847
+ const { lead, sec } = splitClockSeconds(str);
848
+ sel.attr("font-variant-numeric", "tabular-nums").attr("data-dgmo-cd-clock", "").attr("data-dgmo-cd-sec-size", secSize).attr("data-dgmo-cd-sec-fill", secFill).text(null);
849
+ sel.append("tspan").attr("data-cd-lead", "").text(lead);
850
+ if (sec !== null)
851
+ sel.append("tspan").attr("data-cd-sec", "").attr("font-size", secSize).attr("fill", secFill).attr("font-weight", 700).text(sec);
852
+ }
829
853
  function drawBand(svg, kind, g, nowMs, resolvedMs, C) {
830
854
  switch (kind) {
831
855
  case "years":
@@ -874,6 +898,18 @@ function renderCountdown(container, parsed, palette, isDark, exportDims) {
874
898
  const banked = resolveColor("green", palette) ?? muted;
875
899
  const faint = mix(palette.text, themeBaseBg(palette, isDark), 72);
876
900
  const svg = d3Selection.select(container).append("svg").attr("width", width).attr("preserveAspectRatio", "xMidYMid meet").attr("xmlns", "http://www.w3.org/2000/svg").attr("role", "img").attr("aria-label", `${parsed.title ?? "Countdown"}: ${hero}`).style("font-family", FONT_FAMILY);
901
+ svg.append("style").text(`
902
+ @keyframes dgmo-countdown-flash {
903
+ 0%, 100% { opacity: 1; stroke-width: 2; }
904
+ 50% { opacity: 0.45; stroke-width: 3; }
905
+ }
906
+ .dgmo-countdown-target-ring {
907
+ animation: dgmo-countdown-flash 1.8s ease-in-out infinite;
908
+ }
909
+ @media (prefers-reduced-motion: reduce) {
910
+ .dgmo-countdown-target-ring { animation: none; }
911
+ }
912
+ `);
877
913
  const bgRect = svg.append("rect").attr("width", width).attr("fill", palette.bg);
878
914
  const estWidth = (t, fs) => t.length * fs * 0.58;
879
915
  const fitFont = (t, base, maxW, min) => {
@@ -893,10 +929,12 @@ function renderCountdown(container, parsed, palette, isDark, exportDims) {
893
929
  fields: parsed.fields
894
930
  }) : hero;
895
931
  const heroMaxW = contentW * 0.44;
896
- const heroFont = fitFont(heroSizeStr, 96, heroMaxW, 26);
897
- const heroW = Math.min(heroMaxW, estWidth(heroSizeStr, heroFont));
932
+ const sizeStr = estWidth(hero, 1) > estWidth(heroSizeStr, 1) ? hero : heroSizeStr;
898
933
  const gapMid = Math.max(28, Math.round(width * 0.03));
899
- const leftW = Math.max(contentW * 0.42, contentW - heroW - gapMid);
934
+ const stacked = estWidth(sizeStr, 26) > heroMaxW;
935
+ const heroFont = fitFont(sizeStr, 96, stacked ? contentW : heroMaxW, 26);
936
+ const heroW = stacked ? contentW : Math.min(heroMaxW, estWidth(sizeStr, heroFont));
937
+ const leftW = stacked ? contentW : Math.max(contentW * 0.42, contentW - heroW - gapMid);
900
938
  const titleBase = 40;
901
939
  let titleFont = 0;
902
940
  let titleLines = [];
@@ -908,7 +946,7 @@ function renderCountdown(container, parsed, palette, isDark, exportDims) {
908
946
  }
909
947
  const eyebrowText = ordinal !== null ? applyOrdinalTemplate(parsed.sinceLabel ?? `Nth ${label}`, ordinal) : null;
910
948
  const eyebrowFont = 16;
911
- const footerText = resolved !== null ? formatFooter(resolved, parsed.hasTime) : null;
949
+ const footerText = resolved !== null ? formatFooter(resolved, parsed.hasTime, parsed.tz) : null;
912
950
  const footerFont = 17;
913
951
  const noteFont = 19;
914
952
  const asofFont = 13;
@@ -926,7 +964,7 @@ function renderCountdown(container, parsed, palette, isDark, exportDims) {
926
964
  });
927
965
  y += Math.round(titleFont * 0.45);
928
966
  const heroLeft = width - padX - heroW;
929
- const ruleRight = Math.max(leftX + 40, heroLeft - 20);
967
+ const ruleRight = stacked ? width - padX : Math.max(leftX + 40, heroLeft - 20);
930
968
  svg.append("line").attr("x1", leftX).attr("x2", ruleRight).attr("y1", y).attr("y2", y).attr("stroke", mix(palette.text, palette.bg, 14)).attr("stroke-width", 1.25);
931
969
  y += Math.round(titleFont * 0.5);
932
970
  }
@@ -974,8 +1012,12 @@ function renderCountdown(container, parsed, palette, isDark, exportDims) {
974
1012
  units: "clock",
975
1013
  round: parsed.round,
976
1014
  fields: parsed.fields
977
- }) : formatHuman(DAY_START(now), DAY_START(resolved)).sub || null : null;
978
- const heroCapTop = padY + 0.28 * titleFont;
1015
+ }) : formatHuman(
1016
+ dayStart(now, parsed.tz),
1017
+ dayStart(resolved, parsed.tz),
1018
+ parsed.tz
1019
+ ).sub || null : null;
1020
+ const heroCapTop = stacked ? leftBottom + Math.round(heroFont * 0.2) : padY + 0.28 * titleFont;
979
1021
  const heroBaseline = heroCapTop + 0.72 * heroFont;
980
1022
  const heroBlockBottom = heroBaseline + (subText ? heroFont * 0.28 + detailFont : 0);
981
1023
  const contentBottom = Math.max(leftBottom, heroBlockBottom);
@@ -990,6 +1032,14 @@ function renderCountdown(container, parsed, palette, isDark, exportDims) {
990
1032
  );
991
1033
  svg.attr("height", bannerH).attr("viewBox", `0 0 ${width} ${bannerH}`);
992
1034
  bgRect.attr("height", bannerH);
1035
+ const bandC = bandColors(
1036
+ palette,
1037
+ accent,
1038
+ muted,
1039
+ faint,
1040
+ isDark,
1041
+ parsed.fillMode
1042
+ );
993
1043
  if (hasBand && resolved !== null) {
994
1044
  drawBand(
995
1045
  svg,
@@ -997,10 +1047,11 @@ function renderCountdown(container, parsed, palette, isDark, exportDims) {
997
1047
  { left: leftX, top: bandTop, contentW: width - 2 * padX, height: BAND_H },
998
1048
  now,
999
1049
  resolved,
1000
- bandColors(palette, accent, muted, faint)
1050
+ bandC
1001
1051
  );
1002
1052
  }
1003
- const value = svg.append("text").attr("class", "countdown-value").attr("x", width - padX).attr("y", heroBaseline).attr("text-anchor", "end").attr("dominant-baseline", "alphabetic").attr("fill", accent).attr("font-family", FONT_FAMILY).attr("font-size", heroFont).attr("font-weight", 800).attr("data-dgmo-countdown-units", parsed.units).attr("data-dgmo-countdown-round", parsed.round).attr("data-dgmo-countdown-fields", parsed.fields.join(",")).attr("data-dgmo-countdown-expired", parsed.expired).attr("aria-label", `${parsed.title ?? "Countdown"}: ${hero}`).text(hero);
1053
+ const value = svg.append("text").attr("class", "countdown-value").attr("x", stacked ? leftX : width - padX).attr("y", heroBaseline).attr("text-anchor", stacked ? "start" : "end").attr("dominant-baseline", "alphabetic").attr("fill", accent).attr("font-family", FONT_FAMILY).attr("font-size", heroFont).attr("font-weight", 800).attr("data-dgmo-countdown-units", parsed.units).attr("data-dgmo-countdown-round", parsed.round).attr("data-dgmo-countdown-fields", parsed.fields.join(",")).attr("data-dgmo-countdown-expired", parsed.expired).attr("aria-label", `${parsed.title ?? "Countdown"}: ${hero}`);
1054
+ paintClock(value, hero, Math.round(heroFont * 0.55), bandC.now);
1004
1055
  if (parsed.rule && resolved !== null) {
1005
1056
  value.attr("data-dgmo-countdown", new Date(resolved).toISOString());
1006
1057
  } else if (parsed.target) {
@@ -1009,6 +1060,7 @@ function renderCountdown(container, parsed, palette, isDark, exportDims) {
1009
1060
  if (parsed.title) value.attr("data-dgmo-countdown-title", parsed.title);
1010
1061
  if (parsed.onDay) value.attr("data-dgmo-countdown-onday", parsed.onDay);
1011
1062
  if (parsed.hasTime) value.attr("data-dgmo-countdown-hastime", "1");
1063
+ if (parsed.tz) value.attr("data-dgmo-countdown-tz", parsed.tz);
1012
1064
  if (parsed.since !== null) {
1013
1065
  value.attr("data-dgmo-countdown-since", parsed.since);
1014
1066
  value.attr(
@@ -1018,7 +1070,13 @@ function renderCountdown(container, parsed, palette, isDark, exportDims) {
1018
1070
  }
1019
1071
  stampRecur(value, parsed);
1020
1072
  if (subText) {
1021
- svg.append("text").attr("x", width - padX).attr("y", heroBaseline + heroFont * 0.28 + detailFont).attr("text-anchor", "end").attr("dominant-baseline", "alphabetic").attr("fill", muted).attr("font-family", FONT_FAMILY).attr("font-size", detailFont).attr("font-weight", 500).attr("data-dgmo-countdown-detail", "").text(subText);
1073
+ const detailSel = svg.append("text").attr("x", stacked ? leftX : width - padX).attr("y", heroBaseline + heroFont * 0.28 + detailFont).attr("text-anchor", stacked ? "start" : "end").attr("dominant-baseline", "alphabetic").attr("fill", muted).attr("font-family", FONT_FAMILY).attr("font-size", detailFont).attr("font-weight", 500).attr("data-dgmo-countdown-detail", "");
1074
+ paintClock(
1075
+ detailSel,
1076
+ subText,
1077
+ Math.round(detailFont * 0.66),
1078
+ bandC.now
1079
+ );
1022
1080
  }
1023
1081
  }
1024
1082
  function renderCountdownForExport(container, parsed, palette, isDark, exportDims) {
@@ -1029,4 +1087,4 @@ export {
1029
1087
  renderCountdown,
1030
1088
  renderCountdownForExport
1031
1089
  };
1032
- //# sourceMappingURL=chunk-T5SHNNGP.js.map
1090
+ //# sourceMappingURL=chunk-FUPF2UYQ.js.map