@diagrammo/dgmo 0.76.0 → 0.78.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 (229) hide show
  1. package/README.md +17 -13
  2. package/dist/advanced.d.ts +150 -13
  3. package/dist/advanced.js +180 -131
  4. package/dist/block.css +1 -1
  5. package/dist/block.d.ts +2 -2
  6. package/dist/block.js +45 -41
  7. package/dist/{chart-meta-lP8Rl19E.d.ts → chart-meta-BKN2ORkc.d.ts} +2 -2
  8. package/dist/chart-meta.d.ts +3 -3
  9. package/dist/chart-meta.js +30 -29
  10. package/dist/charts-d3-KEQ7XVSM.js +31 -0
  11. package/dist/{chunk-7IATMZSA.js → chunk-26EVL454.js} +1 -25
  12. package/dist/{chunk-3H4PDNP4.js → chunk-2NLBIZEW.js} +2 -2
  13. package/dist/{chunk-GFXFRKUG.js → chunk-32VR65TL.js} +63 -36
  14. package/dist/{chunk-IHUOYDLN.js → chunk-36UQ77JV.js} +24 -24
  15. package/dist/chunk-3DPOIW3W.js +10 -0
  16. package/dist/{chunk-3SP6G4LN.js → chunk-3GLTQZKE.js} +2 -2
  17. package/dist/{chunk-DY7KDZUF.js → chunk-3OWIYK52.js} +2 -2
  18. package/dist/{chunk-UBW53CNS.js → chunk-3XFOE3DQ.js} +12 -7
  19. package/dist/{chunk-W7UBPARG.js → chunk-3ZLQM6XN.js} +2 -2
  20. package/dist/{chunk-5GM6BZO7.js → chunk-4AWLEWSD.js} +5 -2
  21. package/dist/{chunk-AYM472K3.js → chunk-4IGUEGD6.js} +80 -61
  22. package/dist/{chunk-QOVM5VRC.js → chunk-57GSSHBR.js} +2 -2
  23. package/dist/{chunk-5VMUVJO4.js → chunk-5G55TS3H.js} +2 -2
  24. package/dist/{chunk-QT5UMFPE.js → chunk-67I3HFSF.js} +9 -9
  25. package/dist/{chunk-WQXD3IIN.js → chunk-6B3M6LW6.js} +10 -8
  26. package/dist/{chunk-3EGIU5WY.js → chunk-6PHOZBW5.js} +4 -6
  27. package/dist/{chunk-5PFNUDXR.js → chunk-6VTLVU7D.js} +2 -2
  28. package/dist/{chunk-M5JT2AU7.js → chunk-6Z2NUJSX.js} +2 -2
  29. package/dist/{chunk-BWJLLNUX.js → chunk-7BNRHSSF.js} +2 -2
  30. package/dist/{chunk-JLODGGN2.js → chunk-7NNJXYXU.js} +2 -2
  31. package/dist/{chunk-FTTB64OJ.js → chunk-7SMVTA7I.js} +26 -26
  32. package/dist/{chunk-Z7KVOVE4.js → chunk-7WTFX6OA.js} +6 -3
  33. package/dist/{chunk-ZM27UI5O.js → chunk-A7Y32YD6.js} +2 -2
  34. package/dist/{chunk-FPRMP6YA.js → chunk-AHN2CVCH.js} +10 -7
  35. package/dist/{chunk-N6MZSBOL.js → chunk-AN7T6VP7.js} +2 -2
  36. package/dist/{chunk-F4X5NVKY.js → chunk-B6PVPAS5.js} +2 -2
  37. package/dist/{chunk-QI4Q5ZZH.js → chunk-BB2ORSTF.js} +19 -18
  38. package/dist/{chunk-HGFKDSKZ.js → chunk-BJB4YDJP.js} +21 -21
  39. package/dist/{chunk-BZQCAZZZ.js → chunk-BPM52K3Z.js} +41 -34
  40. package/dist/{chunk-HFCKU73Y.js → chunk-BSREARWG.js} +29 -28
  41. package/dist/{chunk-F4V67JXG.js → chunk-CTERZC4K.js} +2 -2
  42. package/dist/{chunk-FMZEU7MF.js → chunk-CYLSQO4L.js} +6 -6
  43. package/dist/{chunk-JLJ7SP4X.js → chunk-DCPD5SHV.js} +3 -3
  44. package/dist/{chunk-U7AO6FRL.js → chunk-ENDB5YSV.js} +363 -129
  45. package/dist/{chunk-RTTZIX34.js → chunk-EOB7XVYR.js} +2 -2
  46. package/dist/chunk-EPDBWATV.js +38 -0
  47. package/dist/{chunk-TPN7RJOM.js → chunk-FJADQOFQ.js} +3 -3
  48. package/dist/{chunk-MG3DE3VO.js → chunk-FLMXJMMY.js} +3 -3
  49. package/dist/{chunk-WGC42WJU.js → chunk-FWNJDD4U.js} +6 -2
  50. package/dist/{chunk-S5P5Z5Y5.js → chunk-GINNZHVN.js} +2 -2
  51. package/dist/{chunk-7EZ5AKBK.js → chunk-GJH7ZEPH.js} +45 -38
  52. package/dist/{chunk-E3BJVEMZ.js → chunk-GQEXY7XL.js} +68 -65
  53. package/dist/{chunk-COCMMQXW.js → chunk-HHHYVTVS.js} +16 -16
  54. package/dist/chunk-ICLB27PZ.js +11 -0
  55. package/dist/{chunk-QMFIZQTB.js → chunk-IDGQB6XD.js} +6 -4
  56. package/dist/{chunk-R3XI2VC7.js → chunk-IDJGV6VM.js} +2 -1
  57. package/dist/{chunk-4CRLM3IT.js → chunk-IE47TYZT.js} +177 -118
  58. package/dist/{chunk-FJ57274M.js → chunk-IIEI7VK5.js} +15 -1
  59. package/dist/{chunk-YDA46XHI.js → chunk-IMO46ROR.js} +38 -32
  60. package/dist/{chunk-4SXHMFFP.js → chunk-IZTU6WVR.js} +24 -13
  61. package/dist/{chunk-U74EGVOA.js → chunk-JOD2CK2M.js} +16 -14
  62. package/dist/{chunk-U5B3TUEW.js → chunk-JUNTVLOU.js} +16 -15
  63. package/dist/{chunk-RWFMOVHG.js → chunk-KAZQX2EY.js} +2 -2
  64. package/dist/{chunk-NHQ7HUAS.js → chunk-KGX5LIUG.js} +10 -8
  65. package/dist/{chunk-Q74GP3GK.js → chunk-KO6DGOOB.js} +3 -3
  66. package/dist/{chunk-UTTRJ6KN.js → chunk-L26M3X7K.js} +16 -13
  67. package/dist/{chunk-RU2HHHYA.js → chunk-LD2JSKU3.js} +12 -2
  68. package/dist/{chunk-32MOGTKT.js → chunk-LEBPWFVF.js} +50 -46
  69. package/dist/{chunk-MU3CJPJF.js → chunk-LGI735AJ.js} +2 -2
  70. package/dist/{chunk-OWVDD5EC.js → chunk-LMWXBFLA.js} +2 -2
  71. package/dist/{chunk-CLQJAGWL.js → chunk-M3LZCDB6.js} +40 -42
  72. package/dist/{chunk-YT5ICQ4R.js → chunk-MFK7LF66.js} +2 -2
  73. package/dist/{chunk-JL7BDLC6.js → chunk-MJYFPFZT.js} +110 -20
  74. package/dist/{chunk-2QRIMMIH.js → chunk-N56W4R66.js} +2 -2
  75. package/dist/{chunk-LXXVHLTH.js → chunk-NN5IDH2I.js} +2 -2
  76. package/dist/{chunk-46KVXDUJ.js → chunk-NS3KIRSW.js} +2 -2
  77. package/dist/{chunk-LM3HY3VG.js → chunk-P2DM7Q5U.js} +2 -2
  78. package/dist/{chunk-DJL5PO27.js → chunk-P4SQV3XD.js} +2 -2
  79. package/dist/{chunk-HOIAQ3P2.js → chunk-P54AX5XN.js} +9 -9
  80. package/dist/{chunk-JQ575OAK.js → chunk-P64NBPSK.js} +14 -14
  81. package/dist/{chunk-7G4XMHDB.js → chunk-PIWUZFG7.js} +33 -25
  82. package/dist/{chunk-SWEKCK34.js → chunk-QAPFXLAC.js} +2 -2
  83. package/dist/chunk-QFIXL3OK.js +68 -0
  84. package/dist/{chunk-KRTLS3G6.js → chunk-QVMV4KCA.js} +2 -2
  85. package/dist/{chunk-76LHNLGX.js → chunk-R4YGH7DJ.js} +5 -3
  86. package/dist/{chunk-PAW4RMH3.js → chunk-RC3FM3FE.js} +12 -13
  87. package/dist/{chunk-UJBP57UJ.js → chunk-RC6GGF6X.js} +2 -2
  88. package/dist/{chunk-S6OXNZBM.js → chunk-RHZZVIGA.js} +3 -3
  89. package/dist/{chunk-MS5574I7.js → chunk-RIXWLFB4.js} +2 -2
  90. package/dist/{chunk-BCB24FG7.js → chunk-RUNI4OXP.js} +18 -14
  91. package/dist/{chunk-ICVIJLBA.js → chunk-SFSJ6XWV.js} +2 -2
  92. package/dist/{chunk-EGXJWRO6.js → chunk-SNBEAO4Q.js} +8 -8
  93. package/dist/{chunk-XHROEQ23.js → chunk-SXD6VY7D.js} +16 -14
  94. package/dist/{chunk-GEURKGZS.js → chunk-TLM3I4XF.js} +16 -16
  95. package/dist/{chunk-IFC3JXCT.js → chunk-TO6TWNMF.js} +19 -15
  96. package/dist/{chunk-OUJG73YJ.js → chunk-U2JIFCJN.js} +18 -18
  97. package/dist/{chunk-CAPR5DET.js → chunk-U4ND3J6C.js} +18 -14
  98. package/dist/{chunk-YVDBBWEP.js → chunk-UCF6TKWV.js} +51 -48
  99. package/dist/{chunk-UWYZIGCB.js → chunk-UDYJVX6Y.js} +9 -9
  100. package/dist/{chunk-OBYZU23V.js → chunk-UQY2VLUK.js} +25 -23
  101. package/dist/{chunk-CQKD6GOC.js → chunk-VAA7QSZ7.js} +53 -32
  102. package/dist/{chunk-Q6BAFS7I.js → chunk-VQGQF7O7.js} +12 -10
  103. package/dist/{chunk-DEW62ON3.js → chunk-VSPNH7LC.js} +2 -2
  104. package/dist/{chunk-4YER7UCV.js → chunk-VUJQ6RU6.js} +2 -2
  105. package/dist/{chunk-C576CU77.js → chunk-VZD3ZV4Y.js} +26 -22
  106. package/dist/{chunk-NCT22MOD.js → chunk-WMIKC5XO.js} +2 -2
  107. package/dist/{chunk-C2WH3BMS.js → chunk-X326N4GN.js} +10 -7
  108. package/dist/chunk-XBJJP2HN.js +37 -0
  109. package/dist/{chunk-7NSNE52V.js → chunk-XCR3PDFF.js} +2 -2
  110. package/dist/{chunk-TF76LCZS.js → chunk-XDPJMLOH.js} +30 -27
  111. package/dist/{chunk-3LJNQ6LR.js → chunk-YKDZ3ZRI.js} +27 -25
  112. package/dist/{chunk-GLREDNBA.js → chunk-YVLTNNME.js} +12 -2
  113. package/dist/{chunk-76IBFEYW.js → chunk-ZGOBAMQ2.js} +15 -13
  114. package/dist/{chunk-AFR6GWXD.js → chunk-ZMCFUGKO.js} +49 -42
  115. package/dist/clock.js +11 -5
  116. package/dist/completion-registry.js +2 -2
  117. package/dist/countdown.js +26 -20
  118. package/dist/{d3--y67plmW.d.ts → d3-CQT5bwpb.d.ts} +1 -1
  119. package/dist/{dgmo-router-CY5j16Pl.d.ts → dgmo-router-C9CsswPZ.d.ts} +1 -1
  120. package/dist/{dgmo-router-A3LIHT6H.js → dgmo-router-XZNCLYTV.js} +30 -29
  121. package/dist/{dimensions-7NYBSZRJ.js → dimensions-SIZMZ4DC.js} +8 -8
  122. package/dist/{flowchart-renderer-QYGQ64BM.js → flowchart-renderer-FDJ4QQXE.js} +15 -14
  123. package/dist/index.d.ts +7 -7
  124. package/dist/index.js +58 -43
  125. package/dist/{layout-LAS67TK3.js → layout-5DZ2LI2R.js} +2 -2
  126. package/dist/{layout-ZAGUFT2G.js → layout-6I6LSBUR.js} +6 -5
  127. package/dist/{layout-2OJ25STS.js → layout-C2SCZV5M.js} +6 -5
  128. package/dist/{layout-6SKHNQYO.js → layout-CHWKNE3O.js} +3 -3
  129. package/dist/{layout-EM4DLMAX.js → layout-K4KML2DL.js} +3 -3
  130. package/dist/{layout-KQUSB45X.js → layout-S53FSD6R.js} +7 -6
  131. package/dist/{layout-ROORJQ4X.js → layout-TCFXB5XH.js} +7 -6
  132. package/dist/{layout-5ILNODTP.js → layout-XK6ZD7BU.js} +6 -5
  133. package/dist/{layout-B5GQVXXY.js → layout-YVY72CIG.js} +7 -6
  134. package/dist/{layout-VUZ3MLOI.js → layout-YY6VH5XH.js} +6 -5
  135. package/dist/{layout-RV2T2YTT.js → layout-ZDN252GR.js} +4 -3
  136. package/dist/{layout-search-UOKEMER5.js → layout-search-TSV4FURP.js} +7 -6
  137. package/dist/{legend-constants-PLN2YHGM.js → legend-constants-SB4PLHV5.js} +3 -3
  138. package/dist/{palettes-54YSI3IX.js → palettes-YIPSRYXP.js} +5 -3
  139. package/dist/{parser-GCVSRQPY.js → parser-2BX2EJUB.js} +3 -3
  140. package/dist/{parser-WVE6SKB7.js → parser-3UNIPVNY.js} +3 -3
  141. package/dist/{parser-5XFGK5C5.js → parser-4IHIVDJD.js} +5 -5
  142. package/dist/{parser-ZT3PU2HT.js → parser-62VNEQRT.js} +3 -3
  143. package/dist/{parser-PR3OR3LO.js → parser-6JNJHQAG.js} +3 -3
  144. package/dist/{parser-ZXQZZK6W.js → parser-6ZFQLLVE.js} +3 -2
  145. package/dist/{parser-WMJEPZDC.js → parser-BOPXE6RP.js} +3 -3
  146. package/dist/{parser-WWRRG2DV.js → parser-DFBQ2RID.js} +3 -3
  147. package/dist/{parser-2GMHFSTS.js → parser-EPKXJ2RL.js} +3 -3
  148. package/dist/{parser-ML3LVNDV.js → parser-G7E2BURB.js} +3 -3
  149. package/dist/{parser-QOIZGW7I.js → parser-GFGU5ZLQ.js} +3 -3
  150. package/dist/{parser-L7T7FY3H.js → parser-GKZWI5SZ.js} +3 -3
  151. package/dist/{parser-QYAIFXLP.js → parser-HSPODF4H.js} +3 -3
  152. package/dist/{parser-EQ4I3TSH.js → parser-IK3FXZ7D.js} +3 -3
  153. package/dist/{parser-LV7PQBUG.js → parser-LJWPKRDM.js} +3 -3
  154. package/dist/{parser-RDBXEVI4.js → parser-OYWUBQV4.js} +3 -3
  155. package/dist/{parser-6FUESG4N.js → parser-PD4TP6NM.js} +3 -3
  156. package/dist/{parser-E3OHNNTH.js → parser-R2JHC7LQ.js} +3 -3
  157. package/dist/{parser-CJNP7RKR.js → parser-RMZ6YI7H.js} +3 -3
  158. package/dist/{parser-TA5TYZNL.js → parser-RUJNN5PK.js} +3 -3
  159. package/dist/{parser-UTR5WE4O.js → parser-YWE7GHW6.js} +3 -3
  160. package/dist/{parser-3AOMUX5D.js → parser-Z5UK6ADF.js} +3 -3
  161. package/dist/{parser-YWQCC33R.js → parser-ZO5YT5SV.js} +3 -3
  162. package/dist/renderer-5TPUPMZ7.js +26 -0
  163. package/dist/{renderer-4EWGZLJ6.js → renderer-AIVALEQR.js} +7 -7
  164. package/dist/renderer-AMELXBNW.js +23 -0
  165. package/dist/renderer-BF7FYXG3.js +25 -0
  166. package/dist/renderer-CRRW7LTW.js +17 -0
  167. package/dist/renderer-CXU2MGSC.js +27 -0
  168. package/dist/renderer-DI66RLAG.js +30 -0
  169. package/dist/renderer-E2JTYQY5.js +39 -0
  170. package/dist/{renderer-ZAJ5353N.js → renderer-FA4BTAOL.js} +7 -7
  171. package/dist/{renderer-GF6S5ZX6.js → renderer-FFGFTIT4.js} +15 -14
  172. package/dist/renderer-IVAM7Z3Y.js +27 -0
  173. package/dist/renderer-J6HK2KOW.js +23 -0
  174. package/dist/renderer-J7J3OVLQ.js +39 -0
  175. package/dist/{renderer-QAMOXOZ2.js → renderer-JC7MK7SD.js} +6 -5
  176. package/dist/{renderer-CGOPX4HW.js → renderer-JHQC5RGJ.js} +14 -14
  177. package/dist/renderer-JRITSZY3.js +28 -0
  178. package/dist/{renderer-E6NHTVN6.js → renderer-KD5X4RIS.js} +14 -13
  179. package/dist/{renderer-OTHBTGBN.js → renderer-KWNNWCGD.js} +6 -5
  180. package/dist/{renderer-EP4GRCDX.js → renderer-LGMIAG6N.js} +7 -6
  181. package/dist/{renderer-IH45QV6Z.js → renderer-LQN3FXAP.js} +33 -32
  182. package/dist/renderer-LRL4SU43.js +29 -0
  183. package/dist/{renderer-D7N7PPB7.js → renderer-MBL64AJI.js} +6 -6
  184. package/dist/renderer-NA3DTAWF.js +39 -0
  185. package/dist/renderer-OR5QHR7X.js +31 -0
  186. package/dist/renderer-SBVWHQVW.js +30 -0
  187. package/dist/{renderer-KMOGGMM7.js → renderer-TLOSBJKW.js} +13 -13
  188. package/dist/{renderer-LE3ZKHNS.js → renderer-UDWJRRIC.js} +11 -11
  189. package/dist/renderer-VHK6UAW2.js +20 -0
  190. package/dist/{renderer-FUJNSC5X.js → renderer-W5UG2HWT.js} +5 -5
  191. package/dist/renderer-WOOKJOBQ.js +25 -0
  192. package/dist/renderer-WYNLGZRF.js +25 -0
  193. package/dist/{renderer-BUEFD2IF.js → renderer-Y74Y54C3.js} +8 -8
  194. package/dist/renderer-ZUAXGHFC.js +28 -0
  195. package/dist/renderer-radial-YVUDGR7C.js +21 -0
  196. package/dist/{state-parser-TPA67IXM.js → state-parser-CT5HQQ7E.js} +3 -3
  197. package/dist/state-renderer-7O3QGNJ5.js +41 -0
  198. package/dist/{tag-groups-DrHT2tEc.d.ts → tag-groups-BoJg3lFV.d.ts} +23 -1
  199. package/dist/{themes-GWhsabnx.d.ts → themes-CXYnNA4e.d.ts} +2 -2
  200. package/docs/architecture-report.md +3 -3
  201. package/docs/language-reference.md +122 -30
  202. package/docs/migration-sequence-color-to-tags.md +16 -8
  203. package/gallery/fixtures/sketch.dgmo +1 -1
  204. package/package.json +7 -6
  205. package/dist/charts-d3-SQEVMIAM.js +0 -29
  206. package/dist/chunk-LP7EC4MI.js +0 -16
  207. package/dist/chunk-UTCPNJND.js +0 -7
  208. package/dist/chunk-VV6HZQ5K.js +0 -40
  209. package/dist/renderer-3FB56573.js +0 -22
  210. package/dist/renderer-4PNVGHVA.js +0 -16
  211. package/dist/renderer-5W3HWIUL.js +0 -24
  212. package/dist/renderer-CO5O5VR5.js +0 -20
  213. package/dist/renderer-DKW273R7.js +0 -26
  214. package/dist/renderer-F24V3RD3.js +0 -26
  215. package/dist/renderer-F6WSR7UM.js +0 -39
  216. package/dist/renderer-FGGDZZFQ.js +0 -31
  217. package/dist/renderer-GJDVPXI3.js +0 -30
  218. package/dist/renderer-JMJ7Q5OC.js +0 -28
  219. package/dist/renderer-LBNVKVO3.js +0 -39
  220. package/dist/renderer-MUW4G2N6.js +0 -38
  221. package/dist/renderer-PIEPRK6M.js +0 -23
  222. package/dist/renderer-PKRKLOYR.js +0 -25
  223. package/dist/renderer-PR3KLNST.js +0 -28
  224. package/dist/renderer-RUHC6D3B.js +0 -25
  225. package/dist/renderer-UUP6OX6F.js +0 -27
  226. package/dist/renderer-UYZSP7MF.js +0 -25
  227. package/dist/renderer-XBL6CLN2.js +0 -30
  228. package/dist/renderer-radial-MZP3SVTZ.js +0 -21
  229. package/dist/state-renderer-UIE3AQM6.js +0 -40
@@ -5,26 +5,31 @@ import {
5
5
  import {
6
6
  ScaleContext
7
7
  } from "./chunk-24YPR5EH.js";
8
+ import {
9
+ EDGE_DASH,
10
+ GRID_DASH,
11
+ HAIRLINE_DASH
12
+ } from "./chunk-IIEI7VK5.js";
8
13
  import {
9
14
  INLINE_HEADER_PAD,
10
15
  layoutInlineHeader
11
- } from "./chunk-MG3DE3VO.js";
16
+ } from "./chunk-FLMXJMMY.js";
12
17
  import {
13
18
  TITLE_FONT_SIZE,
14
19
  TITLE_FONT_WEIGHT,
15
20
  TITLE_Y
16
- } from "./chunk-DEW62ON3.js";
21
+ } from "./chunk-VSPNH7LC.js";
17
22
  import {
18
23
  renderIntegratedLegend
19
- } from "./chunk-QT5UMFPE.js";
24
+ } from "./chunk-67I3HFSF.js";
20
25
  import {
21
26
  controlsGroupCapsuleWidth,
22
27
  getLegendExtent,
23
28
  getMaxLegendReservedHeight
24
- } from "./chunk-4SXHMFFP.js";
29
+ } from "./chunk-IZTU6WVR.js";
25
30
  import {
26
31
  FONT_FAMILY
27
- } from "./chunk-UTCPNJND.js";
32
+ } from "./chunk-ICLB27PZ.js";
28
33
  import {
29
34
  LEGEND_CAPSULE_PAD,
30
35
  LEGEND_DOT_R,
@@ -39,7 +44,7 @@ import {
39
44
  LEGEND_PILL_PAD,
40
45
  measureLegendText,
41
46
  truncateLegendText
42
- } from "./chunk-YT5ICQ4R.js";
47
+ } from "./chunk-MFK7LF66.js";
43
48
  import {
44
49
  CHAR_WIDTH_RATIO,
45
50
  measureText,
@@ -49,16 +54,18 @@ import {
49
54
  normalizeName
50
55
  } from "./chunk-NOTA6TEI.js";
51
56
  import {
57
+ UNTAGGED_TAG_COLOR,
52
58
  resolveActiveTagGroup,
53
59
  resolveTagColor,
54
60
  tagAttrKey
55
- } from "./chunk-76LHNLGX.js";
61
+ } from "./chunk-R4YGH7DJ.js";
56
62
  import {
57
63
  contrastText,
64
+ getEraColors,
58
65
  getSeriesColors,
59
66
  mix,
60
67
  shapeFill
61
- } from "./chunk-GLREDNBA.js";
68
+ } from "./chunk-YVLTNNME.js";
62
69
 
63
70
  // src/gantt/renderer.ts
64
71
  import * as d3Scale from "d3-scale";
@@ -391,10 +398,10 @@ function renderGantt(container, resolved, palette, isDark, options, exportDims)
391
398
  if (todayDate) {
392
399
  todayX = xScale(dateToFractionalYear(todayDate));
393
400
  if (todayX >= 0 && todayX <= innerWidth) {
394
- const todayLine = g.append("line").attr("class", "gantt-today").attr("x1", todayX).attr("y1", 0).attr("x2", todayX).attr("y2", sInnerHeight + 10).attr("stroke", todayColor).attr("stroke-width", 2).attr("stroke-dasharray", "6 4").attr("opacity", 0.7).attr("pointer-events", "none");
401
+ const todayLine = g.append("line").attr("class", "gantt-today").attr("x1", todayX).attr("y1", 0).attr("x2", todayX).attr("y2", sInnerHeight + 10).attr("stroke", todayColor).attr("stroke-width", 2).attr("stroke-dasharray", EDGE_DASH).attr("opacity", 0.7).attr("pointer-events", "none");
395
402
  if (todayMarkerLineNum)
396
403
  todayLine.attr("data-line-number", String(todayMarkerLineNum));
397
- const todayLabel = g.append("text").attr("class", "gantt-today").attr("x", todayX).attr("y", sTodayLabelY).attr("text-anchor", "middle").attr("font-size", `${sFont10}px`).attr("fill", todayColor).attr("opacity", 0.7).attr("pointer-events", "none").text("Today");
404
+ const todayLabel = g.append("text").attr("class", "gantt-today").attr("x", todayX).attr("y", sTodayLabelY).attr("text-anchor", "middle").attr("font-size", sFont10).attr("fill", todayColor).attr("opacity", 0.7).attr("pointer-events", "none").text("Today");
398
405
  if (todayMarkerLineNum)
399
406
  todayLabel.attr("data-line-number", String(todayMarkerLineNum));
400
407
  }
@@ -424,7 +431,7 @@ function renderGantt(container, resolved, palette, isDark, options, exportDims)
424
431
  let yOffset = sContentTopPad;
425
432
  for (const row of rows) {
426
433
  if (row.type === "lane-header") {
427
- const laneColor = row.laneColor === "#999999" ? palette.textMuted : row.laneColor;
434
+ const laneColor = row.laneColor === UNTAGGED_TAG_COLOR ? palette.textMuted : row.laneColor;
428
435
  const toggleIcon = row.isCollapsed ? "\u25B6" : "\u25BC";
429
436
  const labelX = 10;
430
437
  let lx1 = 0;
@@ -472,7 +479,7 @@ function renderGantt(container, resolved, palette, isDark, options, exportDims)
472
479
  restoreHighlight();
473
480
  hideGanttDateIndicators(g);
474
481
  });
475
- labelG.append("text").attr("x", labelX).attr("y", sMarginTop + yOffset + sBarH / 2).attr("dy", "0.35em").attr("text-anchor", "start").attr("font-size", `${sFont11}px`).attr("font-weight", "bold").attr("fill", laneColor).text(
482
+ labelG.append("text").attr("x", labelX).attr("y", sMarginTop + yOffset + sBarH / 2).attr("dy", "0.35em").attr("text-anchor", "start").attr("font-size", sFont11).attr("font-weight", "bold").attr("fill", laneColor).text(
476
483
  toggleIcon + " " + row.laneName + (row.aggregateProgress !== null ? ` ${Math.round(row.aggregateProgress)}%` : "")
477
484
  );
478
485
  if (laneBarWidth > 0) {
@@ -514,7 +521,7 @@ function renderGantt(container, resolved, palette, isDark, options, exportDims)
514
521
  currentActiveGroup,
515
522
  true
516
523
  );
517
- const groupColor = tagColor && tagColor !== "#999999" ? tagColor : group.color || palette.textMuted;
524
+ const groupColor = tagColor && tagColor !== UNTAGGED_TAG_COLOR ? tagColor : group.color || palette.textMuted;
518
525
  renderLabelBand(
519
526
  svg,
520
527
  sMarginTop + yOffset + sBarH / 2,
@@ -547,7 +554,7 @@ function renderGantt(container, resolved, palette, isDark, options, exportDims)
547
554
  });
548
555
  const groupIndent = group.depth <= 2 ? group.depth * 14 : 2 * 14 + (group.depth - 2) * 8;
549
556
  const labelX = 10 + groupIndent;
550
- labelG.append("text").attr("x", labelX).attr("y", sMarginTop + yOffset + sBarH / 2).attr("dy", "0.35em").attr("text-anchor", "start").attr("font-size", `${sFont11}px`).attr("font-weight", "bold").attr("fill", palette.text).text(
557
+ labelG.append("text").attr("x", labelX).attr("y", sMarginTop + yOffset + sBarH / 2).attr("dy", "0.35em").attr("text-anchor", "start").attr("font-size", sFont11).attr("font-weight", "bold").attr("fill", palette.text).text(
551
558
  toggleIcon + " " + group.name + (group.progress !== null ? ` ${Math.round(group.progress)}%` : "")
552
559
  );
553
560
  const gStart = dateToFractionalYear(group.startDate);
@@ -597,7 +604,7 @@ function renderGantt(container, resolved, palette, isDark, options, exportDims)
597
604
  true
598
605
  );
599
606
  if (summaryPlacement) {
600
- summaryG.append("text").attr("x", summaryPlacement.x).attr("y", yOffset + sBarH / 2).attr("dy", "0.35em").attr("font-size", `${sFont10}px`).attr("font-weight", "bold").attr("text-anchor", summaryPlacement.anchor).attr("fill", summaryPlacement.fill).attr("pointer-events", "none").text(summaryPlacement.text);
607
+ summaryG.append("text").attr("x", summaryPlacement.x).attr("y", yOffset + sBarH / 2).attr("dy", "0.35em").attr("font-size", sFont10).attr("font-weight", "bold").attr("text-anchor", summaryPlacement.anchor).attr("fill", summaryPlacement.fill).attr("pointer-events", "none").text(summaryPlacement.text);
601
608
  }
602
609
  groupPositions.set(group.name, {
603
610
  x1: gx1,
@@ -646,7 +653,7 @@ function renderGantt(container, resolved, palette, isDark, options, exportDims)
646
653
  true
647
654
  );
648
655
  if (expandedPlacement) {
649
- groupBarG.append("text").attr("x", expandedPlacement.x).attr("y", yOffset + sBarH / 2).attr("dy", "0.35em").attr("font-size", `${sFont10}px`).attr("font-weight", "bold").attr("text-anchor", expandedPlacement.anchor).attr("fill", expandedPlacement.fill).attr("pointer-events", "none").text(expandedPlacement.text);
656
+ groupBarG.append("text").attr("x", expandedPlacement.x).attr("y", yOffset + sBarH / 2).attr("dy", "0.35em").attr("font-size", sFont10).attr("font-weight", "bold").attr("text-anchor", expandedPlacement.anchor).attr("fill", expandedPlacement.fill).attr("pointer-events", "none").text(expandedPlacement.text);
650
657
  }
651
658
  }
652
659
  }
@@ -665,7 +672,7 @@ function renderGantt(container, resolved, palette, isDark, options, exportDims)
665
672
  const indent = depth <= 2 ? depth * 14 : 2 * 14 + (depth - 2) * 8;
666
673
  const taskLabelX = isTagMode ? 20 : 6 + indent;
667
674
  const topGroup = rt.groupPath.length > 0 ? rt.groupPath[0] : null;
668
- const taskLabel = svg.append("text").attr("class", "gantt-task-label").attr("x", taskLabelX).attr("y", sMarginTop + yOffset + sBarH / 2).attr("dy", "0.35em").attr("text-anchor", "start").attr("font-size", `${sFont11}px`).attr("fill", palette.text).attr("data-line-number", String(task.lineNumber)).attr("data-task-id", task.id).attr("data-group", topGroup).style("cursor", onClickItem ? "pointer" : "default").on("click", () => {
675
+ const taskLabel = svg.append("text").attr("class", "gantt-task-label").attr("x", taskLabelX).attr("y", sMarginTop + yOffset + sBarH / 2).attr("dy", "0.35em").attr("text-anchor", "start").attr("font-size", sFont11).attr("fill", palette.text).attr("data-line-number", String(task.lineNumber)).attr("data-task-id", task.id).attr("data-group", topGroup).style("cursor", onClickItem ? "pointer" : "default").on("click", () => {
669
676
  if (onClickItem) onClickItem(task.lineNumber);
670
677
  }).on("mouseenter", () => {
671
678
  if (rt.isMilestone) {
@@ -704,7 +711,7 @@ function renderGantt(container, resolved, palette, isDark, options, exportDims)
704
711
  sInnerHeight,
705
712
  barColor
706
713
  );
707
- g.append("text").attr("class", "gantt-milestone-hover-label").attr("x", mx - sMilestoneSize - 4).attr("y", my).attr("dy", "0.35em").attr("text-anchor", "end").attr("font-size", `${sFont10}px`).attr("fill", barColor).attr("font-weight", "600").text(task.label);
714
+ g.append("text").attr("class", "gantt-milestone-hover-label").attr("x", mx - sMilestoneSize - 4).attr("y", my).attr("dy", "0.35em").attr("text-anchor", "end").attr("font-size", sFont10).attr("fill", barColor).attr("font-weight", "bold").text(task.label);
708
715
  }).on("mouseleave", () => {
709
716
  restoreHighlight();
710
717
  hideGanttDateIndicators(g);
@@ -799,7 +806,7 @@ function renderGantt(container, resolved, palette, isDark, options, exportDims)
799
806
  sLabelGap
800
807
  );
801
808
  if (labelPlacement) {
802
- taskG.append("text").attr("x", labelPlacement.x).attr("y", yOffset + sBarH / 2).attr("dy", "0.35em").attr("font-size", `${sFont10}px`).attr("text-anchor", labelPlacement.anchor).attr("fill", labelPlacement.fill).attr("pointer-events", "none").text(labelPlacement.text);
809
+ taskG.append("text").attr("x", labelPlacement.x).attr("y", yOffset + sBarH / 2).attr("dy", "0.35em").attr("font-size", sFont10).attr("text-anchor", labelPlacement.anchor).attr("fill", labelPlacement.fill).attr("pointer-events", "none").text(labelPlacement.text);
803
810
  }
804
811
  taskPositions.set(task.id, {
805
812
  x1,
@@ -989,7 +996,7 @@ function drawHolidayBand(g, svg, xScale, start, end, height, palette, _isDark, l
989
996
  const labelX = chartLeftMargin + x1 + bandW / 2;
990
997
  const textLen = measureText(label, 10) + 8;
991
998
  const labelBg = svg.append("rect").attr("class", "gantt-holiday-hover-bg").attr("data-line-number", String(lineNumber)).attr("x", labelX - textLen / 2).attr("y", headerY - 11).attr("width", textLen).attr("height", 14).attr("rx", 3).attr("fill", palette.bg).attr("opacity", 0).attr("pointer-events", "none");
992
- const labelText = svg.append("text").attr("class", "gantt-holiday-hover-label").attr("data-line-number", String(lineNumber)).attr("x", labelX).attr("y", headerY).attr("text-anchor", "middle").attr("font-size", "10px").attr("font-weight", "500").attr("fill", palette.text).attr("opacity", 0).attr("pointer-events", "none").text(label);
999
+ const labelText = svg.append("text").attr("class", "gantt-holiday-hover-label").attr("data-line-number", String(lineNumber)).attr("x", labelX).attr("y", headerY).attr("text-anchor", "middle").attr("font-size", 10).attr("font-weight", "normal").attr("fill", palette.text).attr("opacity", 0).attr("pointer-events", "none").text(label);
993
1000
  bandG.on("mouseenter", () => {
994
1001
  bandRect.attr("opacity", hoverOpacity);
995
1002
  labelBg.attr("opacity", 1);
@@ -1379,12 +1386,12 @@ function renderTagLegend(svg, chartG, tagGroups, activeGroupName, chartLeftMargi
1379
1386
  applyCriticalPathHighlight(svg, chartG);
1380
1387
  }
1381
1388
  }
1382
- var ERA_COLORS = ["#3b6ea5", "#5b9357", "#c9a227", "#cc7a33", "#7d5ba6"];
1383
1389
  function renderErasAndMarkers(g, svg, resolved, xScale, innerHeight, palette, eraLabelY, markerLabelY) {
1384
1390
  for (let i = 0; i < resolved.eras.length; i++) {
1385
1391
  const era = resolved.eras[i];
1386
1392
  if (!era) continue;
1387
- const color = era.color || ERA_COLORS[i % ERA_COLORS.length];
1393
+ const eraColors = getEraColors(palette);
1394
+ const color = era.color || eraColors[i % eraColors.length];
1388
1395
  const sx = xScale(parseDateToFractionalYear(era.startDate));
1389
1396
  const ex = xScale(parseDateToFractionalYear(era.endDate));
1390
1397
  if (ex <= sx) continue;
@@ -1397,7 +1404,7 @@ function renderErasAndMarkers(g, svg, resolved, xScale, innerHeight, palette, er
1397
1404
  const eraLabelMaxW = Math.max(0, ex - sx - 8);
1398
1405
  const eraDisplayLabel = truncateLegendText(era.label, 10, eraLabelMaxW);
1399
1406
  const eraTruncated = eraDisplayLabel !== era.label;
1400
- const eraLabel = eraG.append("text").attr("class", "gantt-era-label").attr("x", (sx + ex) / 2).attr("y", eraLabelY).attr("text-anchor", "middle").attr("font-size", "10px").attr("fill", color).attr("opacity", 0.7).style("cursor", "pointer").text(eraDisplayLabel);
1407
+ const eraLabel = eraG.append("text").attr("class", "gantt-era-label").attr("x", (sx + ex) / 2).attr("y", eraLabelY).attr("text-anchor", "middle").attr("font-size", 10).attr("fill", color).attr("opacity", 0.7).style("cursor", "pointer").text(eraDisplayLabel);
1401
1408
  eraG.on("mouseenter", () => {
1402
1409
  g.selectAll(".gantt-task").attr(
1403
1410
  "opacity",
@@ -1470,12 +1477,12 @@ function renderErasAndMarkers(g, svg, resolved, xScale, innerHeight, palette, er
1470
1477
  const markerTruncated = markerDisplayLabel !== marker.label;
1471
1478
  const markerG = g.append("g").attr("class", "gantt-marker-group").attr("data-line-number", String(marker.lineNumber)).style("cursor", "pointer");
1472
1479
  markerG.append("rect").attr("x", mx - 40).attr("y", labelY - 12).attr("width", 80).attr("height", innerHeight - labelY + 12).attr("fill", "transparent").attr("pointer-events", "all");
1473
- const markerLabelEl = markerG.append("text").attr("class", "gantt-marker-label").attr("x", mx).attr("y", labelY).attr("text-anchor", "middle").attr("font-size", "11px").attr("font-weight", "600").attr("fill", color).text(markerDisplayLabel);
1480
+ const markerLabelEl = markerG.append("text").attr("class", "gantt-marker-label").attr("x", mx).attr("y", labelY).attr("text-anchor", "middle").attr("font-size", 11).attr("font-weight", "bold").attr("fill", color).text(markerDisplayLabel);
1474
1481
  markerG.append("path").attr(
1475
1482
  "d",
1476
1483
  `M${mx},${diamondY - diamondSize} l${diamondSize},${diamondSize} l-${diamondSize},${diamondSize} l-${diamondSize},-${diamondSize} Z`
1477
1484
  ).attr("fill", color).attr("opacity", 0.9);
1478
- markerG.append("line").attr("class", "gantt-marker").attr("x1", mx).attr("y1", diamondY + diamondSize).attr("x2", mx).attr("y2", innerHeight).attr("stroke", color).attr("stroke-width", 1.5).attr("stroke-dasharray", "6 4").attr("opacity", 0.5);
1485
+ markerG.append("line").attr("class", "gantt-marker").attr("x1", mx).attr("y1", diamondY + diamondSize).attr("x2", mx).attr("y2", innerHeight).attr("stroke", color).attr("stroke-width", 1.5).attr("stroke-dasharray", EDGE_DASH).attr("opacity", 0.5);
1479
1486
  const markerLine = markerG.select(".gantt-marker");
1480
1487
  const markerDiamond = markerG.select("path");
1481
1488
  markerG.on("mouseenter", () => {
@@ -1552,9 +1559,9 @@ function renderSprintBands(g, svg, resolved, xScale, innerHeight, palette) {
1552
1559
  if (sprint.number % 2 !== 0) {
1553
1560
  sprintG.append("rect").attr("x", sx).attr("y", 0).attr("width", bandWidth).attr("height", innerHeight).attr("fill", "transparent");
1554
1561
  }
1555
- const sprintLabel = sprintG.append("text").attr("class", "gantt-sprint-label").attr("x", (sx + ex) / 2).attr("y", -22).attr("text-anchor", "middle").attr("font-size", "10px").attr("font-weight", "600").attr("fill", bandColor).attr("opacity", 0.4).text(String(sprint.number));
1562
+ const sprintLabel = sprintG.append("text").attr("class", "gantt-sprint-label").attr("x", (sx + ex) / 2).attr("y", -22).attr("text-anchor", "middle").attr("font-size", 10).attr("font-weight", "bold").attr("fill", bandColor).attr("opacity", 0.4).text(String(sprint.number));
1556
1563
  if (i > 0 && rawSx >= chartMinX) {
1557
- sprintG.append("line").attr("class", "gantt-sprint-boundary").attr("x1", sx).attr("y1", -6).attr("x2", sx).attr("y2", innerHeight).attr("stroke", bandColor).attr("stroke-width", 1).attr("stroke-dasharray", "3 3").attr("opacity", SPRINT_BOUNDARY_OPACITY);
1564
+ sprintG.append("line").attr("class", "gantt-sprint-boundary").attr("x1", sx).attr("y1", -6).attr("x2", sx).attr("y2", innerHeight).attr("stroke", bandColor).attr("stroke-width", 1).attr("stroke-dasharray", HAIRLINE_DASH).attr("opacity", SPRINT_BOUNDARY_OPACITY);
1558
1565
  }
1559
1566
  const sprintStartMs = sprint.startDate.getTime();
1560
1567
  const sprintEndMs = sprint.endDate.getTime();
@@ -1654,17 +1661,17 @@ function renderSprintBands(g, svg, resolved, xScale, innerHeight, palette) {
1654
1661
  );
1655
1662
  }
1656
1663
  const accentColor = palette.accent || palette.text || bandColor;
1657
- sprintLabel.text(`Sprint ${sprint.number}`).attr("font-size", "13px").attr("font-weight", "700").attr("fill", accentColor).attr("opacity", 1);
1664
+ sprintLabel.text(`Sprint ${sprint.number}`).attr("font-size", 13).attr("font-weight", "bold").attr("fill", accentColor).attr("opacity", 1);
1658
1665
  }).on("mouseleave", () => {
1659
1666
  resetHighlight(g, svg);
1660
1667
  sprintRect.attr("opacity", baseOpacity);
1661
- sprintLabel.text(String(sprint.number)).attr("font-size", "10px").attr("font-weight", "600").attr("fill", bandColor).attr("opacity", 0.4);
1668
+ sprintLabel.text(String(sprint.number)).attr("font-size", 10).attr("font-weight", "bold").attr("fill", bandColor).attr("opacity", 0.4);
1662
1669
  hideGanttDateIndicators(g);
1663
1670
  });
1664
1671
  }
1665
1672
  const lastSprint = resolved.sprints[resolved.sprints.length - 1];
1666
1673
  const lastEx = xScale(dateToFractionalYear(lastSprint.endDate));
1667
- g.append("line").attr("class", "gantt-sprint-boundary").attr("x1", lastEx).attr("y1", -6).attr("x2", lastEx).attr("y2", innerHeight).attr("stroke", bandColor).attr("stroke-width", 1).attr("stroke-dasharray", "3 3").attr("opacity", SPRINT_BOUNDARY_OPACITY);
1674
+ g.append("line").attr("class", "gantt-sprint-boundary").attr("x1", lastEx).attr("y1", -6).attr("x2", lastEx).attr("y2", innerHeight).attr("stroke", bandColor).attr("stroke-width", 1).attr("stroke-dasharray", HAIRLINE_DASH).attr("opacity", SPRINT_BOUNDARY_OPACITY);
1668
1675
  }
1669
1676
  function parseDateStringToDate(s) {
1670
1677
  const parts = s.split("-").map((p) => parseInt(p, 10));
@@ -2015,7 +2022,7 @@ function buildTagLaneRowList(resolved, swimlaneGroup, collapsedLanes) {
2015
2022
  rows.push({
2016
2023
  type: "lane-header",
2017
2024
  laneName: noLaneName,
2018
- laneColor: "#999999",
2025
+ laneColor: UNTAGGED_TAG_COLOR,
2019
2026
  aggregateProgress,
2020
2027
  tagKey,
2021
2028
  isCollapsed,
@@ -2070,10 +2077,10 @@ function showGanttDateIndicators(g, xScale, startDate, endDate, innerHeight, col
2070
2077
  const startPos = xScale(dateToFractionalYear(startDate));
2071
2078
  const startLabel = formatGanttDate(startDate);
2072
2079
  if (!options?.skipStartLine) {
2073
- hg.append("line").attr("class", "gantt-hover-date").attr("x1", startPos).attr("y1", -tickLen).attr("x2", startPos).attr("y2", innerHeight).attr("stroke", color).attr("stroke-width", 1.5).attr("stroke-dasharray", "4 4").attr("opacity", 0.6);
2080
+ hg.append("line").attr("class", "gantt-hover-date").attr("x1", startPos).attr("y1", -tickLen).attr("x2", startPos).attr("y2", innerHeight).attr("stroke", color).attr("stroke-width", 1.5).attr("stroke-dasharray", GRID_DASH).attr("opacity", 0.6);
2074
2081
  }
2075
- hg.append("text").attr("class", "gantt-hover-date").attr("x", startPos).attr("y", -tickLen - 4).attr("text-anchor", "middle").attr("fill", color).attr("font-size", "10px").attr("font-weight", "600").text(startLabel);
2076
- hg.append("text").attr("class", "gantt-hover-date").attr("x", startPos).attr("y", innerHeight + tickLen + 12).attr("text-anchor", "middle").attr("fill", color).attr("font-size", "10px").attr("font-weight", "600").text(startLabel);
2082
+ hg.append("text").attr("class", "gantt-hover-date").attr("x", startPos).attr("y", -tickLen - 4).attr("text-anchor", "middle").attr("fill", color).attr("font-size", 10).attr("font-weight", "bold").text(startLabel);
2083
+ hg.append("text").attr("class", "gantt-hover-date").attr("x", startPos).attr("y", innerHeight + tickLen + 12).attr("text-anchor", "middle").attr("fill", color).attr("font-size", 10).attr("font-weight", "bold").text(startLabel);
2077
2084
  if (endDate && endDate.getTime() !== startDate.getTime()) {
2078
2085
  const endPos = xScale(dateToFractionalYear(endDate));
2079
2086
  const endLabel = formatGanttDate(endDate);
@@ -2090,7 +2097,7 @@ function showGanttDateIndicators(g, xScale, startDate, endDate, innerHeight, col
2090
2097
  startAnchor = "middle";
2091
2098
  endAnchor = "middle";
2092
2099
  }
2093
- hg.append("line").attr("class", "gantt-hover-date").attr("x1", endPos).attr("y1", -tickLen).attr("x2", endPos).attr("y2", innerHeight).attr("stroke", color).attr("stroke-width", 1.5).attr("stroke-dasharray", "4 4").attr("opacity", 0.6);
2100
+ hg.append("line").attr("class", "gantt-hover-date").attr("x1", endPos).attr("y1", -tickLen).attr("x2", endPos).attr("y2", innerHeight).attr("stroke", color).attr("stroke-width", 1.5).attr("stroke-dasharray", GRID_DASH).attr("opacity", 0.6);
2094
2101
  hg.selectAll("text.gantt-hover-date").each(
2095
2102
  function() {
2096
2103
  const el = d3Selection.select(this);
@@ -2099,8 +2106,8 @@ function showGanttDateIndicators(g, xScale, startDate, endDate, innerHeight, col
2099
2106
  }
2100
2107
  }
2101
2108
  );
2102
- hg.append("text").attr("class", "gantt-hover-date").attr("x", endLabelX).attr("y", -tickLen - 4).attr("text-anchor", endAnchor).attr("fill", color).attr("font-size", "10px").attr("font-weight", "600").text(endLabel);
2103
- hg.append("text").attr("class", "gantt-hover-date").attr("x", endLabelX).attr("y", innerHeight + tickLen + 12).attr("text-anchor", endAnchor).attr("fill", color).attr("font-size", "10px").attr("font-weight", "600").text(endLabel);
2109
+ hg.append("text").attr("class", "gantt-hover-date").attr("x", endLabelX).attr("y", -tickLen - 4).attr("text-anchor", endAnchor).attr("fill", color).attr("font-size", 10).attr("font-weight", "bold").text(endLabel);
2110
+ hg.append("text").attr("class", "gantt-hover-date").attr("x", endLabelX).attr("y", innerHeight + tickLen + 12).attr("text-anchor", endAnchor).attr("fill", color).attr("font-size", 10).attr("font-weight", "bold").text(endLabel);
2104
2111
  }
2105
2112
  }
2106
2113
  function hideGanttDateIndicators(g) {
@@ -2118,7 +2125,7 @@ function resolveTaskColor(rt, activeTagGroup, resolved, seriesColors, palette) {
2118
2125
  resolved.tagGroups,
2119
2126
  activeTagGroup
2120
2127
  );
2121
- if (tagColor && tagColor !== "#999999") return tagColor;
2128
+ if (tagColor && tagColor !== UNTAGGED_TAG_COLOR) return tagColor;
2122
2129
  if (rt.groupPath.length > 0) {
2123
2130
  const topGroup = rt.groupPath[0];
2124
2131
  const groupIdx = resolved.groups.findIndex((g) => g.name === topGroup);
@@ -2140,11 +2147,11 @@ function renderTimeScaleHorizontal(g, scale, _innerWidth, innerHeight, textColor
2140
2147
  const opacity = 0.4;
2141
2148
  const guideOpacity = 0.15;
2142
2149
  for (const tick of ticks) {
2143
- g.append("line").attr("class", "gantt-scale-tick").attr("x1", tick.pos).attr("y1", 0).attr("x2", tick.pos).attr("y2", innerHeight).attr("stroke", textColor).attr("stroke-width", 1).attr("stroke-dasharray", "4 4").attr("opacity", guideOpacity);
2150
+ g.append("line").attr("class", "gantt-scale-tick").attr("x1", tick.pos).attr("y1", 0).attr("x2", tick.pos).attr("y2", innerHeight).attr("stroke", textColor).attr("stroke-width", 1).attr("stroke-dasharray", GRID_DASH).attr("opacity", guideOpacity);
2144
2151
  g.append("line").attr("class", "gantt-scale-tick").attr("x1", tick.pos).attr("y1", 0).attr("x2", tick.pos).attr("y2", -tickLen).attr("stroke", textColor).attr("stroke-width", 1).attr("opacity", opacity);
2145
- g.append("text").attr("class", "gantt-scale-tick").attr("x", tick.pos).attr("y", -tickLen - 4).attr("text-anchor", "middle").attr("dominant-baseline", "auto").attr("font-size", "10px").attr("fill", textColor).attr("opacity", opacity).text(tick.label);
2152
+ g.append("text").attr("class", "gantt-scale-tick").attr("x", tick.pos).attr("y", -tickLen - 4).attr("text-anchor", "middle").attr("dominant-baseline", "auto").attr("font-size", 10).attr("fill", textColor).attr("opacity", opacity).text(tick.label);
2146
2153
  g.append("line").attr("class", "gantt-scale-tick").attr("x1", tick.pos).attr("y1", innerHeight).attr("x2", tick.pos).attr("y2", innerHeight + tickLen).attr("stroke", textColor).attr("stroke-width", 1).attr("opacity", opacity);
2147
- g.append("text").attr("class", "gantt-scale-tick").attr("x", tick.pos).attr("y", innerHeight + tickLen + 12).attr("text-anchor", "middle").attr("font-size", "10px").attr("fill", textColor).attr("opacity", opacity).text(tick.label);
2154
+ g.append("text").attr("class", "gantt-scale-tick").attr("x", tick.pos).attr("y", innerHeight + tickLen + 12).attr("text-anchor", "middle").attr("font-size", 10).attr("fill", textColor).attr("opacity", opacity).text(tick.label);
2148
2155
  }
2149
2156
  }
2150
2157
 
@@ -2152,4 +2159,4 @@ export {
2152
2159
  renderGantt,
2153
2160
  buildTagLaneRowList
2154
2161
  };
2155
- //# sourceMappingURL=chunk-AFR6GWXD.js.map
2162
+ //# sourceMappingURL=chunk-ZMCFUGKO.js.map
package/dist/clock.js CHANGED
@@ -220,6 +220,12 @@ function mix(a, b, pct) {
220
220
  return out;
221
221
  }
222
222
 
223
+ // src/utils/now.ts
224
+ var pinnedMs = null;
225
+ function now() {
226
+ return pinnedMs ?? Date.now();
227
+ }
228
+
223
229
  // src/clock/ticker.ts
224
230
  function readWork(node) {
225
231
  const start = node.getAttribute("data-dgmo-clock-work-start");
@@ -260,16 +266,16 @@ function setDigits(group, main) {
260
266
  if (s) s.setAttribute("x", stackX);
261
267
  }
262
268
  }
263
- function updateRow(group, now) {
269
+ function updateRow(group, now2) {
264
270
  const zone = group.getAttribute("data-dgmo-clock-zone");
265
271
  if (!zone) return;
266
272
  const fixedAttr = group.getAttribute("data-dgmo-clock-fixed-offset");
267
- const parts = fixedAttr !== null ? fixedParts(Number(fixedAttr), now) : zoneParts(zone, now);
273
+ const parts = fixedAttr !== null ? fixedParts(Number(fixedAttr), now2) : zoneParts(zone, now2);
268
274
  const latAttr = group.getAttribute("data-dgmo-clock-lat");
269
275
  const lonAttr = group.getAttribute("data-dgmo-clock-lon");
270
276
  const sunOn = group.getAttribute("data-dgmo-clock-sun") === "1";
271
277
  const hasCoords = latAttr !== null && lonAttr !== null;
272
- const sun = sunOn && hasCoords ? sunLine(now, Number(latAttr), Number(lonAttr)) : null;
278
+ const sun = sunOn && hasCoords ? sunLine(now2, Number(latAttr), Number(lonAttr)) : null;
273
279
  const up = sun ? sun.up : parts.h >= 6 && parts.h < 18;
274
280
  const c = (name) => group.getAttribute(`data-dgmo-clock-c-${name}`) ?? "";
275
281
  const stColor = up ? c("day") : c("night");
@@ -338,8 +344,8 @@ function updateRow(group, now) {
338
344
  }
339
345
  function tickClocks(root = document) {
340
346
  if (typeof document === "undefined") return;
341
- const now = Date.now();
342
- root.querySelectorAll("[data-dgmo-clock]").forEach((group) => updateRow(group, now));
347
+ const now2 = now();
348
+ root.querySelectorAll("[data-dgmo-clock]").forEach((group) => updateRow(group, now2));
343
349
  }
344
350
  var intervalStarted = false;
345
351
  function startClocks(root = document) {
@@ -4,8 +4,8 @@ import {
4
4
  import {
5
5
  GROUP_ONLY_METADATA,
6
6
  STATE_KEYWORDS
7
- } from "./chunk-DY7KDZUF.js";
8
- import "./chunk-76LHNLGX.js";
7
+ } from "./chunk-3OWIYK52.js";
8
+ import "./chunk-R4YGH7DJ.js";
9
9
  import {
10
10
  ALL_CHART_TYPES,
11
11
  chartTypes
package/dist/countdown.js CHANGED
@@ -138,11 +138,11 @@ function nthWeekdayOfMonth(year, month, weekday, nth, hour, minute, tz) {
138
138
  if (day > new Date(year, month + 1, 0).getDate()) return null;
139
139
  return wallToMs(year, month, day, hour, minute, tz);
140
140
  }
141
- function resolveNext(rule, now) {
141
+ function resolveNext(rule, now2) {
142
142
  const tz = rule.tz ?? null;
143
- const nowF = zoneFields(now, tz);
143
+ const nowF = zoneFields(now2, tz);
144
144
  const { hour, minute } = rule;
145
- const passes = rule.allDay ? (t) => dayStart(t, tz) >= dayStart(now, tz) : (t) => t > now;
145
+ const passes = rule.allDay ? (t) => dayStart(t, tz) >= dayStart(now2, tz) : (t) => t > now2;
146
146
  const dayExists = (y, m, d) => new Date(y, m, d).getMonth() === m;
147
147
  switch (rule.kind) {
148
148
  case "month-day": {
@@ -169,7 +169,7 @@ function resolveNext(rule, now) {
169
169
  y++;
170
170
  }
171
171
  }
172
- return now + WEEK_MS;
172
+ return now2 + WEEK_MS;
173
173
  }
174
174
  case "weekly": {
175
175
  const weekday = rule.weekday;
@@ -186,11 +186,11 @@ function resolveNext(rule, now) {
186
186
  );
187
187
  if (passes(t)) return t;
188
188
  }
189
- return now + WEEK_MS;
189
+ return now2 + WEEK_MS;
190
190
  }
191
191
  case "interval": {
192
192
  const n = rule.intervalN ?? 1;
193
- const anchor = rule.anchorMs ?? now;
193
+ const anchor = rule.anchorMs ?? now2;
194
194
  if (rule.intervalUnit === "month") {
195
195
  const a = zoneFields(anchor, tz);
196
196
  const day = a.day;
@@ -207,7 +207,7 @@ function resolveNext(rule, now) {
207
207
  const step = (rule.intervalUnit === "week" ? WEEK_MS : DAY_MS) * n;
208
208
  let t = anchor;
209
209
  if (!passes(t)) {
210
- const k = Math.max(0, Math.floor((now - anchor) / step));
210
+ const k = Math.max(0, Math.floor((now2 - anchor) / step));
211
211
  t = anchor + k * step;
212
212
  while (!passes(t)) t += step;
213
213
  }
@@ -386,6 +386,12 @@ function formatFooter(resolvedMs, hasTime, tz = null) {
386
386
  return parts.join(" \xB7 ");
387
387
  }
388
388
 
389
+ // src/utils/now.ts
390
+ var pinnedMs = null;
391
+ function now() {
392
+ return pinnedMs ?? Date.now();
393
+ }
394
+
389
395
  // src/countdown/ticker.ts
390
396
  function pad22(n) {
391
397
  return n < 10 ? "0" + n : String(n);
@@ -408,7 +414,7 @@ function setClockText(el, str) {
408
414
  const fill = el.getAttribute("data-dgmo-cd-sec-fill");
409
415
  if (size) secT.setAttribute("font-size", size);
410
416
  if (fill) secT.setAttribute("fill", fill);
411
- secT.setAttribute("font-weight", "700");
417
+ secT.setAttribute("font-weight", "bold");
412
418
  el.appendChild(leadT);
413
419
  el.appendChild(secT);
414
420
  }
@@ -491,7 +497,7 @@ function readFields(node) {
491
497
  if (!raw) return ["d", "h", "m", "s"];
492
498
  return raw.split(",").filter((f) => ["d", "h", "m", "s"].includes(f));
493
499
  }
494
- function updateNode(node, now) {
500
+ function updateNode(node, now2) {
495
501
  const rule = readRule(node);
496
502
  const units = node.getAttribute("data-dgmo-countdown-units") || "days";
497
503
  const round = node.getAttribute("data-dgmo-countdown-round") || "up";
@@ -502,18 +508,18 @@ function updateNode(node, now) {
502
508
  let resolvedMs;
503
509
  let expiredNow = false;
504
510
  if (rule) {
505
- resolvedMs = resolveNext(rule, now);
511
+ resolvedMs = resolveNext(rule, now2);
506
512
  } else {
507
513
  const target = node.getAttribute("data-dgmo-countdown");
508
514
  resolvedMs = target ? targetToMs2(target, tz) : null;
509
- if (resolvedMs !== null && resolvedMs - now <= 0) expiredNow = true;
515
+ if (resolvedMs !== null && resolvedMs - now2 <= 0) expiredNow = true;
510
516
  }
511
517
  if (resolvedMs === null) return;
512
- const remaining = resolvedMs - now;
518
+ const remaining = resolvedMs - now2;
513
519
  const custom = node.getAttribute("data-dgmo-countdown-expired");
514
520
  const hasTime = node.getAttribute("data-dgmo-countdown-hastime") === "1";
515
521
  const frozen = expiredNow && custom !== null;
516
- const clockFinale = hasTime && !frozen && dayDelta(now, resolvedMs, tz) <= 0;
522
+ const clockFinale = hasTime && !frozen && dayDelta(now2, resolvedMs, tz) <= 0;
517
523
  let text;
518
524
  if (frozen) {
519
525
  text = custom;
@@ -526,18 +532,18 @@ function updateNode(node, now) {
526
532
  text = remaining < 0 ? `${clock} ago` : clock;
527
533
  } else if (expiredNow) {
528
534
  if (units === "compound" || units === "human") {
529
- const [a, b] = hasTime ? [resolvedMs, now] : [dayStart(resolvedMs, tz), dayStart(now, tz)];
535
+ const [a, b] = hasTime ? [resolvedMs, now2] : [dayStart(resolvedMs, tz), dayStart(now2, tz)];
530
536
  text = `${formatCompound(a, b, 2, tz)} ago`;
531
537
  } else {
532
538
  const elapsed = -remaining;
533
539
  text = elapsed <= 0 ? "Now!" : `${formatCount(elapsed, { units, round, fields })} ago`;
534
540
  }
535
- } else if (rule && sameDay(resolvedMs, now, tz)) {
541
+ } else if (rule && sameDay(resolvedMs, now2, tz)) {
536
542
  text = onDay ?? "Today!";
537
543
  } else if (units === "human") {
538
- text = hasTime ? formatHuman(now, resolvedMs, tz).big : formatHuman(dayStart(now, tz), dayStart(resolvedMs, tz), tz).big;
544
+ text = hasTime ? formatHuman(now2, resolvedMs, tz).big : formatHuman(dayStart(now2, tz), dayStart(resolvedMs, tz), tz).big;
539
545
  } else if (units === "compound") {
540
- text = formatCompound(now, resolvedMs, 2, tz);
546
+ text = formatCompound(now2, resolvedMs, 2, tz);
541
547
  } else {
542
548
  text = formatCount(Math.max(0, remaining), { units, round, fields });
543
549
  }
@@ -568,7 +574,7 @@ function updateNode(node, now) {
568
574
  } else if (units === "human" && remaining > 0) {
569
575
  setClockText(
570
576
  detail,
571
- hasTime ? formatCount(remaining, { units: "clock", round, fields }) : formatHuman(dayStart(now, tz), dayStart(resolvedMs, tz), tz).sub
577
+ hasTime ? formatCount(remaining, { units: "clock", round, fields }) : formatHuman(dayStart(now2, tz), dayStart(resolvedMs, tz), tz).sub
572
578
  );
573
579
  }
574
580
  }
@@ -578,8 +584,8 @@ function updateNode(node, now) {
578
584
  }
579
585
  function tickCountdowns(root = document) {
580
586
  if (typeof document === "undefined") return;
581
- const now = Date.now();
582
- root.querySelectorAll("[data-dgmo-countdown]").forEach((node) => updateNode(node, now));
587
+ const now2 = now();
588
+ root.querySelectorAll("[data-dgmo-countdown]").forEach((node) => updateNode(node, now2));
583
589
  }
584
590
  var intervalStarted = false;
585
591
  function startCountdowns(root = document) {
@@ -1,4 +1,4 @@
1
- import { T as TagGroup, D as DgmoError, a as PaletteColors, C as CompactViewState } from './tag-groups-DrHT2tEc.js';
1
+ import { T as TagGroup, D as DgmoError, a as PaletteColors, C as CompactViewState } from './tag-groups-BoJg3lFV.js';
2
2
 
3
3
  /** A POI / route-stop position: gazetteer name (+ optional ISO scope) or coords. */
4
4
  type PoiPos = {
@@ -1,4 +1,4 @@
1
- import { P as PaletteConfig, D as DgmoError } from './tag-groups-DrHT2tEc.js';
1
+ import { P as PaletteConfig, D as DgmoError } from './tag-groups-BoJg3lFV.js';
2
2
 
3
3
  /** Validate that a hex string is well-formed (#RGB or #RRGGBB). */
4
4
  declare function isValidHex(value: string): boolean;
@@ -9,68 +9,69 @@ import {
9
9
  looksLikeGantt,
10
10
  parseDgmo,
11
11
  parseDgmoChartType
12
- } from "./chunk-FTTB64OJ.js";
12
+ } from "./chunk-7SMVTA7I.js";
13
13
  import "./chunk-SH4PPRU7.js";
14
14
  import "./chunk-A2RUBBVT.js";
15
- import "./chunk-5PFNUDXR.js";
15
+ import "./chunk-6VTLVU7D.js";
16
16
  import "./chunk-TN754B3R.js";
17
- import "./chunk-JLODGGN2.js";
17
+ import "./chunk-7NNJXYXU.js";
18
18
  import "./chunk-M526IKKH.js";
19
19
  import "./chunk-2CW5ZTNH.js";
20
20
  import "./chunk-BDXC7MDK.js";
21
21
  import "./chunk-CRLVJZWX.js";
22
- import "./chunk-2QRIMMIH.js";
22
+ import "./chunk-N56W4R66.js";
23
23
  import "./chunk-LKS56RDT.js";
24
24
  import "./chunk-OKXWPKUC.js";
25
- import "./chunk-4YER7UCV.js";
26
- import "./chunk-3H4PDNP4.js";
25
+ import "./chunk-VUJQ6RU6.js";
26
+ import "./chunk-2NLBIZEW.js";
27
27
  import "./chunk-XSVWUOUZ.js";
28
28
  import "./chunk-KWSBNLSC.js";
29
- import "./chunk-Z7KVOVE4.js";
29
+ import "./chunk-7WTFX6OA.js";
30
30
  import "./chunk-WFA6IULY.js";
31
- import "./chunk-BWJLLNUX.js";
32
- import "./chunk-KRTLS3G6.js";
33
- import "./chunk-F4X5NVKY.js";
31
+ import "./chunk-3DPOIW3W.js";
32
+ import "./chunk-7BNRHSSF.js";
33
+ import "./chunk-QVMV4KCA.js";
34
+ import "./chunk-B6PVPAS5.js";
34
35
  import "./chunk-EGY3TS62.js";
35
- import "./chunk-W7UBPARG.js";
36
- import "./chunk-S5P5Z5Y5.js";
36
+ import "./chunk-3ZLQM6XN.js";
37
+ import "./chunk-GINNZHVN.js";
37
38
  import "./chunk-QQJUTGQH.js";
38
- import "./chunk-QOVM5VRC.js";
39
+ import "./chunk-57GSSHBR.js";
39
40
  import "./chunk-VBJCGGNF.js";
40
- import "./chunk-RWFMOVHG.js";
41
+ import "./chunk-KAZQX2EY.js";
41
42
  import "./chunk-3TYUXC7D.js";
42
43
  import "./chunk-Y2CYNRL7.js";
43
- import "./chunk-UJBP57UJ.js";
44
+ import "./chunk-RC6GGF6X.js";
44
45
  import "./chunk-UCZBRGJN.js";
45
46
  import "./chunk-7BMX2M3F.js";
46
- import "./chunk-3SP6G4LN.js";
47
- import "./chunk-ZM27UI5O.js";
48
- import "./chunk-46KVXDUJ.js";
49
- import "./chunk-TPN7RJOM.js";
47
+ import "./chunk-3GLTQZKE.js";
48
+ import "./chunk-A7Y32YD6.js";
49
+ import "./chunk-NS3KIRSW.js";
50
+ import "./chunk-FJADQOFQ.js";
50
51
  import "./chunk-EQW6HOP4.js";
51
52
  import "./chunk-DAOFNU6J.js";
52
- import "./chunk-7NSNE52V.js";
53
+ import "./chunk-XCR3PDFF.js";
53
54
  import "./chunk-C3Z4DX3V.js";
54
55
  import "./chunk-NWNSXHA5.js";
55
56
  import "./chunk-7TF3QOOD.js";
56
- import "./chunk-M5JT2AU7.js";
57
+ import "./chunk-6Z2NUJSX.js";
57
58
  import "./chunk-NXMESY4J.js";
58
59
  import "./chunk-LTTZX6RD.js";
59
- import "./chunk-ICVIJLBA.js";
60
+ import "./chunk-SFSJ6XWV.js";
60
61
  import "./chunk-76NHL5UG.js";
61
62
  import "./chunk-E6PNTYRK.js";
62
63
  import "./chunk-IHOFUR74.js";
63
- import "./chunk-SWEKCK34.js";
64
- import "./chunk-LXXVHLTH.js";
64
+ import "./chunk-QAPFXLAC.js";
65
+ import "./chunk-NN5IDH2I.js";
65
66
  import "./chunk-IYULMRBE.js";
66
67
  import "./chunk-NOTA6TEI.js";
67
68
  import "./chunk-MSVQ2YCY.js";
68
- import "./chunk-DY7KDZUF.js";
69
- import "./chunk-76LHNLGX.js";
69
+ import "./chunk-3OWIYK52.js";
70
+ import "./chunk-R4YGH7DJ.js";
70
71
  import "./chunk-M5OOAP65.js";
71
72
  import "./chunk-23RWHHI5.js";
72
- import "./chunk-R3XI2VC7.js";
73
- import "./chunk-GLREDNBA.js";
73
+ import "./chunk-IDJGV6VM.js";
74
+ import "./chunk-YVLTNNME.js";
74
75
  import "./chunk-XOGQY4EC.js";
75
76
  import "./chunk-5SI6T5A5.js";
76
77
  import "./chunk-5WRI5ZAA.js";
@@ -86,4 +87,4 @@ export {
86
87
  parseDgmo,
87
88
  parseDgmoChartType
88
89
  };
89
- //# sourceMappingURL=dgmo-router-A3LIHT6H.js.map
90
+ //# sourceMappingURL=dgmo-router-XZNCLYTV.js.map