@diagrammo/dgmo 0.51.0 → 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 (201) 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 +70 -42
  6. package/dist/advanced.js +115 -119
  7. package/dist/auto.js +125 -123
  8. package/dist/auto.mjs +952 -492
  9. package/dist/block.js +89 -52
  10. package/dist/{charts-d3-7E4B4IMW.js → charts-d3-MXEP6BNP.js} +7 -7
  11. package/dist/{chunk-CC4YRBWV.js → chunk-3HF5YEFJ.js} +17 -7
  12. package/dist/{chunk-5X6YQA2J.js → chunk-3HGU63UY.js} +12 -11
  13. package/dist/{chunk-4XFBQT5O.js → chunk-3LK5DNED.js} +2 -2
  14. package/dist/{chunk-IEDMFNU7.js → chunk-3QD7VP3U.js} +9 -4
  15. package/dist/{chunk-JJXGQIRV.js → chunk-3YRPZ7ZZ.js} +2 -2
  16. package/dist/{chunk-OJTXTQA2.js → chunk-44VCIPHF.js} +21 -17
  17. package/dist/{chunk-RAHVMKBG.js → chunk-4AQRFDXL.js} +2 -2
  18. package/dist/{chunk-6MNGECP2.js → chunk-4IHAV6O7.js} +2 -2
  19. package/dist/{chunk-ENRS56GC.js → chunk-4UNQ6X24.js} +10 -7
  20. package/dist/{chunk-JM4LEPY3.js → chunk-4YFKQ5WT.js} +6 -3
  21. package/dist/{chunk-U5SI5NIM.js → chunk-5223KXFD.js} +39 -22
  22. package/dist/{chunk-NI3XQBPB.js → chunk-5BHJZH62.js} +3 -3
  23. package/dist/{chunk-QYTPPDAO.js → chunk-5HILBT7X.js} +2 -2
  24. package/dist/{chunk-I2QZFCS2.js → chunk-5NGAO4QK.js} +4 -4
  25. package/dist/{chunk-BGP54HVR.js → chunk-5RP7JRVP.js} +4 -4
  26. package/dist/{chunk-IE477RQZ.js → chunk-5SEVICBT.js} +5 -5
  27. package/dist/{chunk-OZPBJM5Q.js → chunk-6EJITS44.js} +8 -5
  28. package/dist/{chunk-F3FYUFUH.js → chunk-6HQH6JZE.js} +12 -11
  29. package/dist/{chunk-X7EC3L2H.js → chunk-6LBQ7ELG.js} +14 -15
  30. package/dist/{chunk-5WPNFSXP.js → chunk-75G3Q4DK.js} +3 -3
  31. package/dist/{chunk-BYJBIALT.js → chunk-77FGAVZC.js} +10 -7
  32. package/dist/{chunk-2EQMXBBQ.js → chunk-7BIZCTAX.js} +2 -2
  33. package/dist/{chunk-B63YB7X3.js → chunk-7KINELPI.js} +110 -48
  34. package/dist/{chunk-AB7INMR5.js → chunk-7QE3XMRK.js} +15 -14
  35. package/dist/{chunk-IUJODQKX.js → chunk-AAXZDUOV.js} +15 -14
  36. package/dist/{chunk-2UJSV2VT.js → chunk-AL672HNE.js} +3 -3
  37. package/dist/{chunk-WQLMU7VG.js → chunk-ARGMQ3H4.js} +2 -2
  38. package/dist/{chunk-OU7HLO7I.js → chunk-AUIM2NVH.js} +3 -3
  39. package/dist/{chunk-RXKTSFDL.js → chunk-BKVOYV6I.js} +24 -32
  40. package/dist/{chunk-TK2VQQX2.js → chunk-BPIZNB5O.js} +14 -12
  41. package/dist/{chunk-3LV2NCB6.js → chunk-BPY242XU.js} +6 -4
  42. package/dist/{chunk-LV4BETUU.js → chunk-BRENJ2BQ.js} +32 -2
  43. package/dist/{chunk-Y6GBQTBK.js → chunk-CCNDLW7Z.js} +41 -19
  44. package/dist/{chunk-EXOQP75F.js → chunk-CIRFIL4M.js} +47 -27
  45. package/dist/{chunk-RBDIYLA5.js → chunk-DAOFNU6J.js} +17 -1
  46. package/dist/{chunk-4VWJ4LW2.js → chunk-DYWQFQJP.js} +44 -34
  47. package/dist/{chunk-QZPEGJOM.js → chunk-EMLPOL77.js} +15 -8
  48. package/dist/{chunk-IUO34HKW.js → chunk-FHGVORFO.js} +26 -22
  49. package/dist/{chunk-6H7O2OPM.js → chunk-FQ7HTV52.js} +4 -2
  50. package/dist/{chunk-7DYOELRK.js → chunk-FQMUHRVC.js} +69 -30
  51. package/dist/{chunk-AFIEPDLX.js → chunk-FT3ZYWET.js} +14 -3
  52. package/dist/{chunk-ND76YJCN.js → chunk-FUPF2UYQ.js} +35 -11
  53. package/dist/{chunk-6NFYEQDX.js → chunk-FY5MSZAP.js} +15 -3
  54. package/dist/{chunk-IEWG6J7C.js → chunk-GCYTI3DE.js} +40 -31
  55. package/dist/{chunk-GNSFLJAA.js → chunk-GJFAMOGK.js} +3 -3
  56. package/dist/{chunk-VNSXLA6G.js → chunk-H7KENAZO.js} +16 -12
  57. package/dist/{chunk-KFNWFNAA.js → chunk-HBPDFCQY.js} +3 -3
  58. package/dist/{chunk-467TVMQL.js → chunk-HHKO6SKY.js} +2 -2
  59. package/dist/{chunk-6K2M4VSR.js → chunk-HQQNCY7W.js} +21 -8
  60. package/dist/{chunk-ZJ3LS7DW.js → chunk-HWX6ZHF3.js} +2 -2
  61. package/dist/{chunk-Q62FEYK3.js → chunk-ICPJPQ5C.js} +2 -2
  62. package/dist/{chunk-MVN25IF6.js → chunk-IM6PDDCE.js} +4 -4
  63. package/dist/{chunk-65WJYYKJ.js → chunk-INE5YJBZ.js} +11 -6
  64. package/dist/{chunk-EDA6C7MV.js → chunk-J6QROYDA.js} +13 -9
  65. package/dist/{chunk-3ODS2VGL.js → chunk-J7KJR3R6.js} +116 -96
  66. package/dist/{chunk-JEUJOX5X.js → chunk-J7TLCB2Q.js} +2 -2
  67. package/dist/{chunk-GD6L76WD.js → chunk-JRCOYRRH.js} +19 -7
  68. package/dist/{chunk-G3PF3S7P.js → chunk-K2I2XOZD.js} +9 -9
  69. package/dist/{chunk-5PDTIBLV.js → chunk-K4EOKJA6.js} +17 -7
  70. package/dist/{chunk-5SVOCD5W.js → chunk-KGVZ5VGH.js} +10 -7
  71. package/dist/{chunk-QHI5XVUJ.js → chunk-LBMS4AW6.js} +20 -19
  72. package/dist/{chunk-FTBZV6NE.js → chunk-LGT3PZCJ.js} +22 -14
  73. package/dist/{chunk-E7Y3SYKW.js → chunk-LTXOLDUZ.js} +9 -6
  74. package/dist/{chunk-GTWKD3QT.js → chunk-MUE65OTD.js} +5 -4
  75. package/dist/{chunk-TRM2J7ZN.js → chunk-MUVJ57EP.js} +10 -14
  76. package/dist/{chunk-RBHWPDBB.js → chunk-NNS4E7CW.js} +6 -4
  77. package/dist/{chunk-NNAAJVBU.js → chunk-NR5HCAUD.js} +1 -1
  78. package/dist/{chunk-NEQ6GJXB.js → chunk-ONU3U4GL.js} +2 -2
  79. package/dist/{chunk-XEQXCIBC.js → chunk-PRI2OD4E.js} +10 -3
  80. package/dist/{chunk-U6EQI3U6.js → chunk-QBZYACOG.js} +3 -3
  81. package/dist/{chunk-5PZT4DQG.js → chunk-QGATPIPX.js} +15 -9
  82. package/dist/{chunk-YGJZWZTY.js → chunk-QHXCAEMX.js} +7 -4
  83. package/dist/{chunk-RLFVAKEO.js → chunk-QJMKPUYK.js} +15 -5
  84. package/dist/{chunk-Z6XJQ6KO.js → chunk-QVENJMNX.js} +2 -2
  85. package/dist/{chunk-GROLTAWZ.js → chunk-QZX5S6R3.js} +2 -2
  86. package/dist/{chunk-TMACGPW5.js → chunk-R3YSD62R.js} +3 -3
  87. package/dist/{chunk-332ZR4QU.js → chunk-REJAIQ5S.js} +4 -4
  88. package/dist/{chunk-5F5ELR3V.js → chunk-ROOE4R4Y.js} +8 -5
  89. package/dist/{chunk-XHVV4NVW.js → chunk-RT7ACF77.js} +12 -2
  90. package/dist/{chunk-GGHRAITI.js → chunk-SMRFPVLQ.js} +3 -3
  91. package/dist/{chunk-JSSX2SX4.js → chunk-SWSIKFEB.js} +2 -2
  92. package/dist/{chunk-DY7XLRHK.js → chunk-T4A4TSTJ.js} +14 -15
  93. package/dist/{chunk-VB4UJ3H2.js → chunk-TJVLKNGR.js} +20 -10
  94. package/dist/{chunk-FC5I2KXV.js → chunk-TPFKKXCB.js} +3 -3
  95. package/dist/{chunk-AXW3M6OQ.js → chunk-TTIM6YTT.js} +28 -18
  96. package/dist/{chunk-WJ7RW65H.js → chunk-UBLHQTLV.js} +13 -12
  97. package/dist/{chunk-AE7II3E3.js → chunk-UNURMIQO.js} +2 -2
  98. package/dist/{chunk-PZDBOK2Q.js → chunk-VILVLS7P.js} +5 -3
  99. package/dist/{chunk-3YSQZ75W.js → chunk-VQOCMUWI.js} +37 -26
  100. package/dist/{chunk-P6T66CCZ.js → chunk-WBM7ZNDI.js} +3 -2
  101. package/dist/{chunk-4QZ43D7I.js → chunk-XD6ZYURY.js} +9 -4
  102. package/dist/{chunk-3JLKYGBQ.js → chunk-YIBAWQGJ.js} +6 -3
  103. package/dist/{chunk-ZO27FGJS.js → chunk-YTMTPUH4.js} +7 -4
  104. package/dist/{chunk-6BQFET7X.js → chunk-Z5QVYKR7.js} +11 -3
  105. package/dist/{chunk-KJGG2JKQ.js → chunk-ZEF5M5MB.js} +52 -45
  106. package/dist/{chunk-32XPAAET.js → chunk-ZJV7GYR4.js} +3 -3
  107. package/dist/{chunk-2ILHQOL3.js → chunk-ZNWAYU6N.js} +11 -7
  108. package/dist/cli.cjs +146 -145
  109. package/dist/clock.js +16 -22
  110. package/dist/dgmo-router-X7ZGAPIE.js +86 -0
  111. package/dist/{dimensions-F7B5C4BJ.js → dimensions-45H6JQEY.js} +6 -6
  112. package/dist/editor.js +4 -2
  113. package/dist/element.js +126 -124
  114. package/dist/element.mjs +952 -492
  115. package/dist/{flowchart-parser-MY53QWTZ.js → flowchart-parser-UKELHBSB.js} +4 -4
  116. package/dist/{flowchart-renderer-AQSMEMYF.js → flowchart-renderer-MNCDS7MV.js} +7 -7
  117. package/dist/highlight.d.ts +21 -1
  118. package/dist/highlight.js +93 -3
  119. package/dist/index.js +51 -51
  120. package/dist/{layout-JDJAEQ3P.js → layout-2L3WMRYU.js} +4 -4
  121. package/dist/{layout-MUPRALE5.js → layout-A4XWNVID.js} +4 -4
  122. package/dist/{layout-46366KBT.js → layout-A5UHRWVH.js} +3 -3
  123. package/dist/{layout-HYZPWAK5.js → layout-GM4UGR7B.js} +4 -3
  124. package/dist/{layout-CBCLPMSG.js → layout-GQQJXNYH.js} +4 -4
  125. package/dist/{layout-YVTNOTN4.js → layout-IIE2S5FK.js} +3 -3
  126. package/dist/{layout-4DIUOX2T.js → layout-VMCRX66I.js} +4 -4
  127. package/dist/{palettes-PRJ2RI6D.js → palettes-UDLZ2SA4.js} +2 -2
  128. package/dist/{parser-BKI42XBQ.js → parser-2ECN6JA2.js} +4 -4
  129. package/dist/{parser-C3D7MVXY.js → parser-4WTIHM5J.js} +3 -3
  130. package/dist/{parser-5A2UWU6B.js → parser-5H2BTSJQ.js} +3 -3
  131. package/dist/{parser-OK2ILHRT.js → parser-75KVXUNS.js} +4 -4
  132. package/dist/{parser-SRVFR7PM.js → parser-774AC53T.js} +4 -4
  133. package/dist/{parser-BEPSWJAD.js → parser-BE4YCSRU.js} +3 -3
  134. package/dist/{parser-B77S5SZM.js → parser-CNGUQUQI.js} +3 -3
  135. package/dist/{parser-2Q2T4C3B.js → parser-DEUUSQIN.js} +7 -7
  136. package/dist/{parser-5PDYJGWA.js → parser-DQAFLUJB.js} +4 -4
  137. package/dist/{parser-KKTJ6M3Y.js → parser-EYCKNKQA.js} +5 -5
  138. package/dist/{parser-UKFFZCFJ.js → parser-FXISIU6A.js} +4 -4
  139. package/dist/{parser-UMWPLORP.js → parser-GTB4XC7P.js} +5 -5
  140. package/dist/{parser-Z4TZV2CB.js → parser-GVEPAUSD.js} +4 -4
  141. package/dist/{parser-AIMHGJRR.js → parser-HSQGTY4G.js} +4 -4
  142. package/dist/{parser-OUTPNJWC.js → parser-HVKRINUS.js} +3 -3
  143. package/dist/{parser-JA7JQ7NF.js → parser-J5MIEYO4.js} +5 -5
  144. package/dist/parser-KMZIXLDZ.js +13 -0
  145. package/dist/{parser-CDG7CHV5.js → parser-LJHXWSXU.js} +3 -3
  146. package/dist/{parser-PORDUX5E.js → parser-PT3W72G5.js} +4 -4
  147. package/dist/{parser-CZOJ7XQ6.js → parser-SBJQDPHL.js} +4 -4
  148. package/dist/{parser-I6GGFKOQ.js → parser-SUWWWCMX.js} +3 -3
  149. package/dist/{parser-AZJ25OKK.js → parser-SXDRNZOA.js} +4 -4
  150. package/dist/parser-UMILOW3M.js +14 -0
  151. package/dist/{parser-GKLZKEIK.js → parser-UP3AZ367.js} +4 -4
  152. package/dist/{parser-57ILIFZ2.js → parser-WHPRV3X5.js} +5 -5
  153. package/dist/{parser-H6ABKHZZ.js → parser-WX3UODSJ.js} +4 -4
  154. package/dist/{parser-FQ6GZFMR.js → parser-XCIEN3KN.js} +4 -4
  155. package/dist/{parser-E2RL6JYF.js → parser-XIRTUMVN.js} +5 -5
  156. package/dist/{parser-3A42DZ72.js → parser-YKCGIG45.js} +3 -3
  157. package/dist/{parser-EH5VE7ZN.js → parser-YKYMQG3B.js} +4 -4
  158. package/dist/{parser-6ZKABF5S.js → parser-ZGM2OJ6Y.js} +5 -5
  159. package/dist/{parser-4RFTKAQX.js → parser-ZL5QUFVH.js} +4 -4
  160. package/dist/pert.d.ts +2 -2
  161. package/dist/{renderer-RYR3TJ46.js → renderer-3F7OS2AX.js} +10 -10
  162. package/dist/{renderer-TGTUABCI.js → renderer-4QB4K7Q3.js} +6 -6
  163. package/dist/{renderer-GHPZMFU2.js → renderer-5DAKMIU2.js} +3 -3
  164. package/dist/{renderer-3K3IB7D5.js → renderer-5H4SY7YY.js} +6 -6
  165. package/dist/{renderer-QIWVHWZO.js → renderer-5PIQPFOX.js} +4 -3
  166. package/dist/{renderer-NKJ24TEA.js → renderer-6MU37QF5.js} +6 -6
  167. package/dist/{renderer-QXPP4TA2.js → renderer-AQVMWJ4M.js} +9 -9
  168. package/dist/{renderer-2AUFT3E2.js → renderer-BDDW6K7N.js} +6 -6
  169. package/dist/{renderer-OYO67VZK.js → renderer-BNB3VIDY.js} +7 -7
  170. package/dist/{renderer-QXGN5H3A.js → renderer-CQY6ATOS.js} +5 -5
  171. package/dist/{renderer-CO2DW7S7.js → renderer-CVW75CXL.js} +9 -9
  172. package/dist/{renderer-KQB7UGDS.js → renderer-DT4XRFEP.js} +4 -3
  173. package/dist/{renderer-GQIESYEM.js → renderer-ERHBSTQT.js} +6 -6
  174. package/dist/{renderer-UV6MI64M.js → renderer-HSHHVYWF.js} +4 -3
  175. package/dist/{renderer-ARMJBP6C.js → renderer-IDPVUFNB.js} +8 -8
  176. package/dist/{renderer-QRWACQRI.js → renderer-ILX6BGKR.js} +6 -6
  177. package/dist/{renderer-F7U3MFCV.js → renderer-JP663HKG.js} +7 -7
  178. package/dist/{renderer-RGIYOTKJ.js → renderer-KNFTTOBL.js} +8 -8
  179. package/dist/{renderer-3YNIWF5I.js → renderer-MVUZBESR.js} +5 -5
  180. package/dist/{renderer-HYGHO4SJ.js → renderer-N4EBR2FV.js} +8 -8
  181. package/dist/{renderer-3YPZHMOU.js → renderer-NHO46CT2.js} +3 -3
  182. package/dist/{renderer-SRKDNDFB.js → renderer-NO2QJ5LZ.js} +7 -7
  183. package/dist/{renderer-2HTNBIF2.js → renderer-OGFV5RXX.js} +8 -8
  184. package/dist/{renderer-HCKJDFXD.js → renderer-PDLESJMS.js} +9 -9
  185. package/dist/{renderer-66MERVQ2.js → renderer-T4MTNINC.js} +6 -6
  186. package/dist/{renderer-RHT4MHFU.js → renderer-TOUGFGTM.js} +7 -7
  187. package/dist/{renderer-EDJ2O4S5.js → renderer-U3KPD43Y.js} +8 -8
  188. package/dist/{renderer-4WR6WMVF.js → renderer-X334IJU2.js} +6 -6
  189. package/dist/{renderer-JC3RDUT7.js → renderer-Y5OAMOCR.js} +6 -6
  190. package/dist/{renderer-GD2COXVL.js → renderer-YONAKAJU.js} +4 -4
  191. package/dist/{renderer-TXJFKPOG.js → renderer-YWMI6Y2U.js} +8 -8
  192. package/dist/{renderer-6RKQPNJI.js → renderer-ZWIH4WDW.js} +7 -7
  193. package/dist/{renderer-radial-FWABAZHB.js → renderer-radial-7CGZMVMS.js} +7 -7
  194. package/dist/{state-parser-6T6CNMPX.js → state-parser-BATWAID2.js} +4 -4
  195. package/dist/{state-renderer-AWZ3ECAX.js → state-renderer-3FKZJ3LP.js} +7 -7
  196. package/docs/ai-integration.md +15 -19
  197. package/docs/language-reference.md +13 -11
  198. package/package.json +1 -1
  199. package/dist/dgmo-router-Y2VEX46B.js +0 -86
  200. package/dist/parser-6BJEXUFX.js +0 -13
  201. package/dist/parser-OK22AC6Y.js +0 -14
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-YYVTBZZC.js";
8
8
  import {
9
9
  renderIntegratedLegend
10
- } from "./chunk-OU7HLO7I.js";
10
+ } from "./chunk-AUIM2NVH.js";
11
11
  import {
12
12
  controlsGroupCapsuleWidth,
13
13
  getMaxLegendReservedHeight
@@ -45,12 +45,12 @@ import {
45
45
  getSeriesColors,
46
46
  mix,
47
47
  shapeFill
48
- } from "./chunk-P6T66CCZ.js";
48
+ } from "./chunk-WBM7ZNDI.js";
49
49
  import {
50
50
  resolveActiveTagGroup,
51
51
  resolveTagColor,
52
52
  tagAttrKey
53
- } from "./chunk-467TVMQL.js";
53
+ } from "./chunk-HHKO6SKY.js";
54
54
  import {
55
55
  normalizeName
56
56
  } from "./chunk-NOTA6TEI.js";
@@ -100,18 +100,13 @@ function computeBarLabel(label, x1, barWidth, innerWidth, textColor, onFillColor
100
100
  var BAND_ACCENT_W = 4;
101
101
  var BAND_RADIUS = 4;
102
102
  var bandClipCounter = 0;
103
- function renderLabelBand(svg, y, leftMargin, color, palette, isDark, cssPrefix, dataAttr, solid, barH = BAR_H, bandRadius = BAND_RADIUS, bandAccentW = BAND_ACCENT_W) {
103
+ function renderLabelBand(svg, y, leftMargin, color, palette, isDark, cssPrefix, dataAttr, fillMode, barH = BAR_H, bandRadius = BAND_RADIUS, bandAccentW = BAND_ACCENT_W) {
104
104
  const bandX = 5;
105
105
  const bandW = leftMargin - 7;
106
106
  const bandY = y - barH / 2;
107
107
  const clipId = `gantt-band-clip-${bandClipCounter++}`;
108
108
  svg.append("clipPath").attr("id", clipId).append("rect").attr("x", bandX).attr("y", bandY).attr("width", bandW).attr("height", barH).attr("rx", bandRadius);
109
- const tint = svg.append("rect").attr("class", `gantt-${cssPrefix}-band-bg`).attr("x", bandX).attr("y", bandY).attr("width", bandW).attr("height", barH).attr("rx", bandRadius).attr(
110
- "fill",
111
- shapeFill(palette, color, isDark, {
112
- ...solid !== void 0 && { solid }
113
- })
114
- ).style("pointer-events", "none");
109
+ const tint = svg.append("rect").attr("class", `gantt-${cssPrefix}-band-bg`).attr("x", bandX).attr("y", bandY).attr("width", bandW).attr("height", barH).attr("rx", bandRadius).attr("fill", shapeFill(palette, color, isDark, { mode: fillMode })).style("pointer-events", "none");
115
110
  const accent = svg.append("rect").attr("class", `gantt-${cssPrefix}-band-accent`).attr("x", bandX).attr("y", bandY).attr("width", bandAccentW).attr("height", barH).attr("fill", color).attr("clip-path", `url(#${clipId})`).style("pointer-events", "none");
116
111
  if (dataAttr) {
117
112
  tint.attr(dataAttr.key, dataAttr.value);
@@ -127,7 +122,7 @@ function renderGantt(container, resolved, palette, isDark, options, exportDims)
127
122
  container.innerHTML = "";
128
123
  bandClipCounter = 0;
129
124
  if (resolved.tasks.length === 0) return;
130
- const solid = false;
125
+ const fillMode = void 0;
131
126
  const onClickItem = options?.onClickItem;
132
127
  const collapsedGroups = options?.collapsedGroups ?? new Set(resolved.groups.filter((g2) => g2.collapsed).map((g2) => g2.name));
133
128
  const onToggleGroup = options?.onToggleGroup;
@@ -318,7 +313,7 @@ function renderGantt(container, resolved, palette, isDark, options, exportDims)
318
313
  seriesColors,
319
314
  palette
320
315
  );
321
- const fillColor = shapeFill(palette, color, isDark, { solid });
316
+ const fillColor = shapeFill(palette, color, isDark, { mode: fillMode });
322
317
  el.select("rect").attr("fill", fillColor).attr("stroke", color);
323
318
  });
324
319
  }
@@ -419,7 +414,7 @@ function renderGantt(container, resolved, palette, isDark, options, exportDims)
419
414
  isDark,
420
415
  "lane",
421
416
  { key: "data-lane", value: row.laneName },
422
- solid,
417
+ fillMode,
423
418
  sBarH,
424
419
  sBandRadius,
425
420
  sBandAccentW
@@ -446,7 +441,9 @@ function renderGantt(container, resolved, palette, isDark, options, exportDims)
446
441
  toggleIcon + " " + row.laneName + (row.aggregateProgress !== null ? ` ${Math.round(row.aggregateProgress)}%` : "")
447
442
  );
448
443
  if (laneBarWidth > 0) {
449
- const barFill = shapeFill(palette, laneColor, isDark, { solid });
444
+ const barFill = shapeFill(palette, laneColor, isDark, {
445
+ mode: fillMode
446
+ });
450
447
  const laneBandG = g.append("g").attr("class", "gantt-lane-band-group").attr("data-lane", row.laneName).on("mouseenter", () => {
451
448
  highlightLane(g, svg, row.tagKey, row.laneName);
452
449
  if (row.laneStartDate && row.laneEndDate) {
@@ -492,7 +489,7 @@ function renderGantt(container, resolved, palette, isDark, options, exportDims)
492
489
  isDark,
493
490
  "group",
494
491
  { key: "data-group", value: group.name },
495
- solid,
492
+ fillMode,
496
493
  sBarH,
497
494
  sBandRadius,
498
495
  sBandAccentW
@@ -539,7 +536,10 @@ function renderGantt(container, resolved, palette, isDark, options, exportDims)
539
536
  resetHighlight(g, svg);
540
537
  hideGanttDateIndicators(g);
541
538
  });
542
- summaryG.append("rect").attr("x", gx1).attr("y", yOffset).attr("width", barWidth).attr("height", sBarH).attr("rx", 4).attr("fill", shapeFill(palette, groupColor, isDark, { solid })).attr("stroke", groupColor).attr("stroke-width", 2);
539
+ summaryG.append("rect").attr("x", gx1).attr("y", yOffset).attr("width", barWidth).attr("height", sBarH).attr("rx", 4).attr(
540
+ "fill",
541
+ shapeFill(palette, groupColor, isDark, { mode: fillMode })
542
+ ).attr("stroke", groupColor).attr("stroke-width", 2);
543
543
  if (group.progress !== null && group.progress > 0) {
544
544
  summaryG.append("rect").attr("x", gx1).attr("y", yOffset).attr("width", barWidth * Math.min(group.progress / 100, 1)).attr("height", sBarH).attr("fill", groupColor).attr("opacity", 0.5);
545
545
  }
@@ -551,7 +551,7 @@ function renderGantt(container, resolved, palette, isDark, options, exportDims)
551
551
  innerWidth,
552
552
  palette.text,
553
553
  contrastText(
554
- shapeFill(palette, groupColor, isDark, { solid }),
554
+ shapeFill(palette, groupColor, isDark, { mode: fillMode }),
555
555
  palette.textOnFillLight,
556
556
  palette.textOnFillDark
557
557
  ),
@@ -569,7 +569,9 @@ function renderGantt(container, resolved, palette, isDark, options, exportDims)
569
569
  });
570
570
  } else {
571
571
  const groupBarWidth = Math.max(gx2 - gx1, 2);
572
- const bandFill = shapeFill(palette, groupColor, isDark, { solid });
572
+ const bandFill = shapeFill(palette, groupColor, isDark, {
573
+ mode: fillMode
574
+ });
573
575
  const groupBarG = g.append("g").attr("class", "gantt-group-bar").attr("data-group", group.name).attr("data-line-number", String(group.lineNumber)).on("mouseenter", () => {
574
576
  highlightGroup(g, svg, group.name);
575
577
  showGanttDateIndicators(
@@ -596,7 +598,7 @@ function renderGantt(container, resolved, palette, isDark, options, exportDims)
596
598
  innerWidth,
597
599
  palette.text,
598
600
  contrastText(
599
- shapeFill(palette, groupColor, isDark, { solid }),
601
+ shapeFill(palette, groupColor, isDark, { mode: fillMode }),
600
602
  palette.textOnFillLight,
601
603
  palette.textOnFillDark
602
604
  ),
@@ -676,7 +678,9 @@ function renderGantt(container, resolved, palette, isDark, options, exportDims)
676
678
  const x1 = xScale(tStart);
677
679
  const x2 = xScale(tEnd);
678
680
  const barWidth = Math.max(x2 - x1, 2);
679
- const fillColor = shapeFill(palette, barColor, isDark, { solid });
681
+ const fillColor = shapeFill(palette, barColor, isDark, {
682
+ mode: fillMode
683
+ });
680
684
  const taskG = g.append("g").attr("class", "gantt-task").attr("data-line-number", String(task.lineNumber)).attr("data-task-name", task.label).attr("data-task-id", task.id).attr("data-group", topGroup).style("cursor", onClickItem ? "pointer" : "default").on("click", () => {
681
685
  if (onClickItem) onClickItem(task.lineNumber);
682
686
  }).on("mouseenter", () => {
@@ -747,7 +751,7 @@ function renderGantt(container, resolved, palette, isDark, options, exportDims)
747
751
  innerWidth,
748
752
  palette.text,
749
753
  contrastText(
750
- shapeFill(palette, barColor, isDark, { solid }),
754
+ shapeFill(palette, barColor, isDark, { mode: fillMode }),
751
755
  palette.textOnFillLight,
752
756
  palette.textOnFillDark
753
757
  ),
@@ -2101,4 +2105,4 @@ export {
2101
2105
  renderGantt,
2102
2106
  buildTagLaneRowList
2103
2107
  };
2104
- //# sourceMappingURL=chunk-IUO34HKW.js.map
2108
+ //# sourceMappingURL=chunk-FHGVORFO.js.map
@@ -65,7 +65,9 @@ var DIRECTIVES_REGISTRY = [
65
65
  { token: "sprint-length", category: "directive", gantt: ["option"] },
66
66
  { token: "sprint-number", category: "directive", gantt: ["option"] },
67
67
  { token: "sprint-start", category: "directive", gantt: ["option"] },
68
- { token: "solid-fill", category: "directive", gantt: ["boolean"] },
68
+ { token: "fill-tint", category: "directive", gantt: ["boolean"] },
69
+ { token: "fill-solid", category: "directive", gantt: ["boolean"] },
70
+ { token: "fill-outline", category: "directive", gantt: ["boolean"] },
69
71
  // `chart` is a wireframe element keyword (CONTROL); gantt also accepts it as
70
72
  // an option. Highlight family is control.
71
73
  { token: "chart", category: "control", gantt: ["option"] },
@@ -359,4 +361,4 @@ export {
359
361
  REGISTRY_MODIFIER_TOKENS,
360
362
  REGISTRY_COLON_KEY_TOKENS
361
363
  };
362
- //# sourceMappingURL=chunk-6H7O2OPM.js.map
364
+ //# sourceMappingURL=chunk-FQ7HTV52.js.map
@@ -7,7 +7,7 @@ import {
7
7
  import {
8
8
  VARIANTS,
9
9
  allTasks
10
- } from "./chunk-6MNGECP2.js";
10
+ } from "./chunk-4IHAV6O7.js";
11
11
  import {
12
12
  TITLE_FONT_SIZE,
13
13
  TITLE_FONT_WEIGHT,
@@ -25,7 +25,10 @@ import {
25
25
  contrastText,
26
26
  mix,
27
27
  themeBaseBg
28
- } from "./chunk-P6T66CCZ.js";
28
+ } from "./chunk-WBM7ZNDI.js";
29
+ import {
30
+ fillModeFromOptions
31
+ } from "./chunk-BRENJ2BQ.js";
29
32
 
30
33
  // src/raci/renderer.ts
31
34
  import * as d3Selection from "d3-selection";
@@ -158,7 +161,7 @@ function renderRaci(container, parsed, palette, isDark, handlers, exportDims) {
158
161
  if (width <= 0 || height <= 0) return;
159
162
  const tasksAll = [...allTasks(parsed)];
160
163
  if (tasksAll.length === 0 && parsed.phases.length === 0) return;
161
- const solid = parsed.options["solid-fill"] === "on";
164
+ const fillMode = fillModeFromOptions(parsed.options);
162
165
  const surfaceBg = themeBaseBg(palette, isDark);
163
166
  const roleCount = Math.max(1, parsed.roles.length);
164
167
  const idealWidth = roleCount * ROLE_COL_MAX + TASK_LABEL_MAX + 2 * H_MARGIN;
@@ -312,7 +315,7 @@ function renderRaci(container, parsed, palette, isDark, handlers, exportDims) {
312
315
  legendChipW,
313
316
  palette,
314
317
  surfaceBg,
315
- solid,
318
+ fillMode,
316
319
  onMarkerDragStart,
317
320
  sLegendChipGap,
318
321
  sLegendHeight,
@@ -332,7 +335,14 @@ function renderRaci(container, parsed, palette, isDark, handlers, exportDims) {
332
335
  if (taskIdx < 0) return;
333
336
  const yTop = rowYs[i];
334
337
  const rh = taskRowContent.get(row.task.id)?.rowHeight ?? sRowHeight;
335
- bandsG.append("rect").attr("class", "raci-row-band").attr("data-task-id", row.task.id).attr("x", sHMargin).attr("y", yTop + 2).attr("width", innerWidth).attr("height", rh - 4).attr("rx", 6).attr("fill", mix(autoAccent(taskIdx, palette), surfaceBg, 12));
338
+ const bandAccent = autoAccent(taskIdx, palette);
339
+ const band = bandsG.append("rect").attr("class", "raci-row-band").attr("data-task-id", row.task.id).attr("x", sHMargin).attr("y", yTop + 2).attr("width", innerWidth).attr("height", rh - 4).attr("rx", 6).attr(
340
+ "fill",
341
+ fillMode === "outline" ? surfaceBg : mix(bandAccent, surfaceBg, 12)
342
+ );
343
+ if (fillMode === "outline") {
344
+ band.attr("stroke", bandAccent).attr("stroke-width", 1);
345
+ }
336
346
  });
337
347
  }
338
348
  const columnsG = svg.append("g").attr("class", "raci-columns");
@@ -340,14 +350,21 @@ function renderRaci(container, parsed, palette, isDark, handlers, exportDims) {
340
350
  const cx = roleX(i) + sColumnInset;
341
351
  const cw = roleColW - 2 * sColumnInset;
342
352
  const roleColor = parsed.roleColors[i] ?? autoAccent(i, palette);
343
- const bodyFill = mix(roleColor, themeBaseBg(palette, isDark), 16);
344
- const headerFill = mix(roleColor, themeBaseBg(palette, isDark), 30);
353
+ const outline = fillMode === "outline";
354
+ const bodyFill = outline ? surfaceBg : mix(roleColor, themeBaseBg(palette, isDark), 16);
355
+ const headerFill = outline ? surfaceBg : mix(roleColor, themeBaseBg(palette, isDark), 30);
345
356
  const colG = columnsG.append("g").attr("class", "raci-column").attr("data-role-id", roleId);
346
- colG.append("rect").attr("class", "raci-column-body").attr("x", cx).attr("y", headerY).attr("width", cw).attr("height", colTotalHeight).attr("rx", sColumnRadius).attr("fill", bodyFill);
347
- colG.append("path").attr("class", "raci-column-header").attr(
357
+ const bodyRect = colG.append("rect").attr("class", "raci-column-body").attr("x", cx).attr("y", headerY).attr("width", cw).attr("height", colTotalHeight).attr("rx", sColumnRadius).attr("fill", bodyFill);
358
+ if (outline) {
359
+ bodyRect.attr("stroke", roleColor).attr("stroke-width", 1);
360
+ }
361
+ const headerPath = colG.append("path").attr("class", "raci-column-header").attr(
348
362
  "d",
349
363
  topRoundedRectPath(cx, headerY, cw, sHeaderHeight, sColumnRadius)
350
364
  ).attr("fill", headerFill);
365
+ if (outline) {
366
+ headerPath.attr("stroke", roleColor).attr("stroke-width", 1);
367
+ }
351
368
  const cxText = roleX(i) + roleColW / 2;
352
369
  colG.append("text").attr("class", "raci-column-label").attr("x", cxText).attr("y", headerY + sHeaderHeight / 2).attr("text-anchor", "middle").attr("dominant-baseline", "central").attr("font-size", sRoleHeaderFont).attr("font-weight", 600).attr("fill", palette.text).text(
353
370
  truncateText(
@@ -400,7 +417,7 @@ function renderRaci(container, parsed, palette, isDark, handlers, exportDims) {
400
417
  roleColW,
401
418
  parsed.variant,
402
419
  surfaceBg,
403
- solid,
420
+ fillMode,
404
421
  chartCanShowSummaries,
405
422
  sPhaseHeight,
406
423
  sPhaseFont,
@@ -419,7 +436,7 @@ function renderRaci(container, parsed, palette, isDark, handlers, exportDims) {
419
436
  roleColW,
420
437
  palette,
421
438
  surfaceBg,
422
- solid,
439
+ fillMode,
423
440
  taskDiagnostics,
424
441
  hasAnyDiagnostic,
425
442
  taskRowContent.get(row.task.id),
@@ -482,7 +499,7 @@ function setupColumnHover(svg) {
482
499
  svg.on("mouseover", (event) => set(findRole(event.target)));
483
500
  svg.on("mouseleave", () => set(null));
484
501
  }
485
- function renderLegend(svg, markers, variant, x, y, mode, chipW, palette, surfaceBg, solid, _onMarkerDragStart, sLegendChipGap, sLegendHeight, sNodeRadius, sNodeStrokeWidth, sLegendLetterFont, sLegendLabelFont) {
502
+ function renderLegend(svg, markers, variant, x, y, mode, chipW, palette, surfaceBg, fillMode, _onMarkerDragStart, sLegendChipGap, sLegendHeight, sNodeRadius, sNodeStrokeWidth, sLegendLetterFont, sLegendLabelFont) {
486
503
  if (markers.length === 0) return;
487
504
  const labels = MARKER_LABELS[variant];
488
505
  const legendG = svg.append("g").attr("class", "raci-legend").attr("aria-label", `${variant.toUpperCase()} marker legend`);
@@ -492,12 +509,12 @@ function renderLegend(svg, markers, variant, x, y, mode, chipW, palette, surface
492
509
  const labelText = labels[marker];
493
510
  const chipG = legendG.append("g").attr("class", "raci-legend-chip").attr("data-marker", marker).style("cursor", "grab");
494
511
  if (mode === "letters") {
495
- const fill2 = solid ? rawColor : mix(rawColor, surfaceBg, TINT_PCT);
496
- const stroke2 = solid ? mix(rawColor, surfaceBg, 70) : rawColor;
512
+ const fill2 = fillMode === "solid" ? rawColor : fillMode === "outline" ? surfaceBg : mix(rawColor, surfaceBg, TINT_PCT);
513
+ const stroke2 = fillMode === "solid" ? mix(rawColor, surfaceBg, 70) : rawColor;
497
514
  chipG.append("rect").attr("x", cx).attr("y", y).attr("width", chipW).attr("height", sLegendHeight).attr("rx", sNodeRadius).attr("fill", fill2).attr("stroke", stroke2).attr("stroke-width", sNodeStrokeWidth);
498
515
  chipG.append("text").attr("x", cx + chipW / 2).attr("y", y + sLegendHeight / 2).attr("text-anchor", "middle").attr("dominant-baseline", "central").attr("font-size", sLegendLetterFont).attr("font-weight", 700).attr(
499
516
  "fill",
500
- solid ? contrastText(
517
+ fillMode === "solid" ? contrastText(
501
518
  fill2,
502
519
  palette.textOnFillLight,
503
520
  palette.textOnFillDark
@@ -505,16 +522,32 @@ function renderLegend(svg, markers, variant, x, y, mode, chipW, palette, surface
505
522
  ).text(marker);
506
523
  return;
507
524
  }
508
- const fill = solid ? rawColor : mix(rawColor, surfaceBg, TINT_PCT);
509
- const stroke = mix(rawColor, surfaceBg, 70);
525
+ let fill;
526
+ if (fillMode === "outline") {
527
+ const gradId = `raci-legend-grad-${marker}`;
528
+ let defs = svg.select("defs");
529
+ if (defs.empty()) defs = svg.append("defs");
530
+ if (defs.select(`#${gradId}`).empty()) {
531
+ const grad = defs.append("linearGradient").attr("id", gradId).attr("x1", "0%").attr("y1", "0%").attr("x2", "0%").attr("y2", "100%");
532
+ grad.append("stop").attr("offset", "0%").attr("stop-color", mix(rawColor, surfaceBg, 38));
533
+ grad.append("stop").attr("offset", "100%").attr("stop-color", mix(rawColor, surfaceBg, 8));
534
+ }
535
+ fill = `url(#${gradId})`;
536
+ } else {
537
+ fill = fillMode === "solid" ? rawColor : mix(rawColor, surfaceBg, TINT_PCT);
538
+ }
539
+ const stroke = fillMode === "outline" ? rawColor : mix(rawColor, surfaceBg, 70);
510
540
  chipG.append("rect").attr("x", cx).attr("y", y).attr("width", chipW).attr("height", sLegendHeight).attr("rx", sNodeRadius).attr("fill", fill).attr("stroke", stroke).attr("stroke-width", sNodeStrokeWidth);
511
541
  const slabPad = 4;
512
542
  const slabW = 24;
513
- const slabFill = solid ? mix(rawColor, surfaceBg, 70) : mix(rawColor, surfaceBg, 55);
514
- chipG.append("rect").attr("x", cx + slabPad).attr("y", y + slabPad).attr("width", slabW).attr("height", sLegendHeight - 2 * slabPad).attr("rx", 4).attr("fill", slabFill);
543
+ const slabFill = fillMode === "solid" ? mix(rawColor, surfaceBg, 70) : fillMode === "outline" ? surfaceBg : mix(rawColor, surfaceBg, 55);
544
+ const slabRect = chipG.append("rect").attr("x", cx + slabPad).attr("y", y + slabPad).attr("width", slabW).attr("height", sLegendHeight - 2 * slabPad).attr("rx", 4).attr("fill", slabFill);
545
+ if (fillMode === "outline") {
546
+ slabRect.attr("stroke", rawColor).attr("stroke-width", 1);
547
+ }
515
548
  chipG.append("text").attr("x", cx + slabPad + slabW / 2).attr("y", y + sLegendHeight / 2).attr("text-anchor", "middle").attr("dominant-baseline", "central").attr("font-size", sLegendLetterFont).attr("font-weight", 700).attr(
516
549
  "fill",
517
- solid ? contrastText(
550
+ fillMode === "solid" ? contrastText(
518
551
  slabFill,
519
552
  palette.textOnFillLight,
520
553
  palette.textOnFillDark
@@ -532,10 +565,16 @@ function renderLegend(svg, markers, variant, x, y, mode, chipW, palette, surface
532
565
  function renderRaciForExport(container, parsed, palette, isDark, exportDims) {
533
566
  renderRaci(container, parsed, palette, isDark, {}, exportDims);
534
567
  }
535
- function renderPhaseBar(svg, phase, x, y, width, palette, collapsed, autoColor, roles, roleX, roleColW, variant, surfaceBg, solid, showSummary, sPhaseHeight, sPhaseFont, sColumnInset, sNodeRadius) {
568
+ function renderPhaseBar(svg, phase, x, y, width, palette, collapsed, autoColor, roles, roleX, roleColW, variant, surfaceBg, fillMode, showSummary, sPhaseHeight, sPhaseFont, sColumnInset, sNodeRadius) {
536
569
  const phaseG = svg.append("g").attr("class", "raci-phase").attr("data-section", `phase-${phase.id}`).attr("data-section-toggle", "").attr("data-line-number", String(phase.lineNumber)).attr("data-phase-id", phase.id).attr("data-collapsed", collapsed ? "1" : "0").style("cursor", "pointer");
537
- const phaseFill = mix(phase.color ?? autoColor, palette.bg, 30);
538
- phaseG.append("rect").attr("x", x).attr("y", y + 4).attr("width", width).attr("height", sPhaseHeight - 8).attr("fill", phaseFill).attr("rx", 4);
570
+ const phaseColor = phase.color ?? autoColor;
571
+ const phaseRect = phaseG.append("rect").attr("x", x).attr("y", y + 4).attr("width", width).attr("height", sPhaseHeight - 8).attr(
572
+ "fill",
573
+ fillMode === "outline" ? surfaceBg : mix(phaseColor, palette.bg, 30)
574
+ ).attr("rx", 4);
575
+ if (fillMode === "outline") {
576
+ phaseRect.attr("stroke", phaseColor).attr("stroke-width", 1.25);
577
+ }
539
578
  const chevX = x + 12;
540
579
  const chevY = y + sPhaseHeight / 2;
541
580
  phaseG.append("text").attr("x", chevX).attr("y", chevY).attr("text-anchor", "middle").attr("dominant-baseline", "central").attr("font-family", FONT_FAMILY).attr("font-size", 9).attr("fill", palette.text).attr("opacity", 0.6).text(collapsed ? "\u25B6" : "\u25BC");
@@ -568,13 +607,13 @@ function renderPhaseBar(svg, phase, x, y, width, palette, collapsed, autoColor,
568
607
  ordered.forEach((marker, i) => {
569
608
  const cx = startX + i * (sliceW + SLICE_GAP);
570
609
  const rawColor = markerColor(marker, palette);
571
- const fill = solid ? rawColor : mix(rawColor, surfaceBg, TINT_PCT);
572
- const stroke = solid ? mix(rawColor, surfaceBg, 70) : rawColor;
610
+ const fill = fillMode === "solid" ? rawColor : fillMode === "outline" ? surfaceBg : mix(rawColor, surfaceBg, TINT_PCT);
611
+ const stroke = fillMode === "solid" ? mix(rawColor, surfaceBg, 70) : rawColor;
573
612
  const chipG = phaseG.append("g").attr("class", "raci-phase-summary");
574
613
  chipG.append("rect").attr("x", cx).attr("y", summaryY).attr("width", sliceW).attr("height", SUMMARY_CHIP_H).attr("rx", sNodeRadius).attr("fill", fill).attr("stroke", stroke).attr("stroke-width", 1.25);
575
614
  chipG.append("text").attr("x", cx + sliceW / 2).attr("y", summaryY + SUMMARY_CHIP_H / 2).attr("text-anchor", "middle").attr("dominant-baseline", "central").attr("font-size", SUMMARY_LETTER_FONT).attr("font-weight", 700).attr(
576
615
  "fill",
577
- solid ? contrastText(
616
+ fillMode === "solid" ? contrastText(
578
617
  fill,
579
618
  palette.textOnFillLight,
580
619
  palette.textOnFillDark
@@ -585,7 +624,7 @@ function renderPhaseBar(svg, phase, x, y, width, palette, collapsed, autoColor,
585
624
  }
586
625
  }
587
626
  var SLICE_GAP = 4;
588
- function renderTaskRow(svg, task, parsed, x, y, labelW, roleX, roleColW, palette, surfaceBg, solid, taskDiagnostics, _hasAnyDiagnostic, rowContent, onClickLine, _onMarkerDragStart, sLabelFont, sDescFont, sCellPad, sRowHeight, sColumnInset, sNodeRadius, sNodeStrokeWidth, sMarkerFont, sLegendLabelFont, sStackTopGap, sViolationLineHeight) {
627
+ function renderTaskRow(svg, task, parsed, x, y, labelW, roleX, roleColW, palette, surfaceBg, fillMode, taskDiagnostics, _hasAnyDiagnostic, rowContent, onClickLine, _onMarkerDragStart, sLabelFont, sDescFont, sCellPad, sRowHeight, sColumnInset, sNodeRadius, sNodeStrokeWidth, sMarkerFont, sLegendLabelFont, sStackTopGap, sViolationLineHeight) {
589
628
  const rowG = svg.append("g").attr("class", "raci-task-row").attr("data-task-id", task.id).attr("data-line-number", String(task.lineNumber));
590
629
  const labelX = x + 8;
591
630
  const labelMaxW = labelW - 16;
@@ -664,7 +703,7 @@ function renderTaskRow(svg, task, parsed, x, y, labelW, roleX, roleColW, palette
664
703
  const variantLabels = MARKER_LABELS[parsed.variant];
665
704
  markers.forEach((m, i) => {
666
705
  const rawColor = markerColor(m, palette);
667
- const fill = solid ? rawColor : mix(rawColor, surfaceBg, TINT_PCT);
706
+ const fill = fillMode === "solid" ? rawColor : fillMode === "outline" ? surfaceBg : mix(rawColor, surfaceBg, TINT_PCT);
668
707
  const stroke = rawColor;
669
708
  const sliceX = cx + i * (sliceW + SLICE_GAP);
670
709
  const sliceG = cellG.append("g").attr("class", "raci-marker-slice").attr("data-marker", m).style("cursor", "grab");
@@ -676,7 +715,7 @@ function renderTaskRow(svg, task, parsed, x, y, labelW, roleX, roleColW, palette
676
715
  const textFont = showFullLabel ? sLegendLabelFont : sMarkerFont;
677
716
  sliceG.append("text").attr("x", sliceX + sliceW / 2).attr("y", cy + ch / 2).attr("text-anchor", "middle").attr("dominant-baseline", "central").attr("font-size", textFont).attr("font-weight", MARKER_FONT_WEIGHT).attr(
678
717
  "fill",
679
- solid ? contrastText(
718
+ fillMode === "solid" ? contrastText(
680
719
  fill,
681
720
  palette.textOnFillLight,
682
721
  palette.textOnFillDark
@@ -747,4 +786,4 @@ export {
747
786
  renderRaci,
748
787
  renderRaciForExport
749
788
  };
750
- //# sourceMappingURL=chunk-7DYOELRK.js.map
789
+ //# sourceMappingURL=chunk-FQMUHRVC.js.map
@@ -6,12 +6,13 @@ import {
6
6
  } from "./chunk-OQKP2X3D.js";
7
7
  import {
8
8
  normalizeDate
9
- } from "./chunk-RBDIYLA5.js";
9
+ } from "./chunk-DAOFNU6J.js";
10
10
  import {
11
11
  extractColor,
12
+ fillModeFromToken,
12
13
  measureIndent,
13
14
  parseFirstLine
14
- } from "./chunk-LV4BETUU.js";
15
+ } from "./chunk-BRENJ2BQ.js";
15
16
  import {
16
17
  makeDgmoError,
17
18
  makeFail
@@ -326,6 +327,16 @@ function parseCountdown(content, palette) {
326
327
  case "no-visual":
327
328
  result.noVisual = true;
328
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
+ }
329
340
  // ── `note` — markdown caption; inline value or indented body block. ──
330
341
  case "note":
331
342
  inNote = true;
@@ -534,4 +545,4 @@ export {
534
545
  targetToMs2 as targetToMs,
535
546
  parseCountdown
536
547
  };
537
- //# sourceMappingURL=chunk-AFIEPDLX.js.map
548
+ //# sourceMappingURL=chunk-FT3ZYWET.js.map
@@ -23,10 +23,11 @@ import {
23
23
  FONT_FAMILY
24
24
  } from "./chunk-6KFWC4CO.js";
25
25
  import {
26
+ contrastText,
26
27
  getSeriesColors,
27
28
  mix,
28
29
  themeBaseBg
29
- } from "./chunk-P6T66CCZ.js";
30
+ } from "./chunk-WBM7ZNDI.js";
30
31
  import {
31
32
  resolveColor
32
33
  } from "./chunk-TLVIHFRO.js";
@@ -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);
@@ -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())
@@ -1015,7 +1032,14 @@ function renderCountdown(container, parsed, palette, isDark, exportDims) {
1015
1032
  );
1016
1033
  svg.attr("height", bannerH).attr("viewBox", `0 0 ${width} ${bannerH}`);
1017
1034
  bgRect.attr("height", bannerH);
1018
- const bandC = bandColors(palette, accent, muted, faint);
1035
+ const bandC = bandColors(
1036
+ palette,
1037
+ accent,
1038
+ muted,
1039
+ faint,
1040
+ isDark,
1041
+ parsed.fillMode
1042
+ );
1019
1043
  if (hasBand && resolved !== null) {
1020
1044
  drawBand(
1021
1045
  svg,
@@ -1063,4 +1087,4 @@ export {
1063
1087
  renderCountdown,
1064
1088
  renderCountdownForExport
1065
1089
  };
1066
- //# sourceMappingURL=chunk-ND76YJCN.js.map
1090
+ //# sourceMappingURL=chunk-FUPF2UYQ.js.map
@@ -5,8 +5,9 @@ import {
5
5
  } from "./chunk-APKUAJ2L.js";
6
6
  import {
7
7
  extractColor,
8
+ fillModeFromToken,
8
9
  parseFirstLine
9
- } from "./chunk-LV4BETUU.js";
10
+ } from "./chunk-BRENJ2BQ.js";
10
11
  import {
11
12
  makeDgmoError,
12
13
  makeFail
@@ -330,7 +331,10 @@ var DIRECTIVES = /* @__PURE__ */ new Set([
330
331
  "time-24",
331
332
  "no-title",
332
333
  "direction",
333
- "color-by"
334
+ "color-by",
335
+ "fill-tint",
336
+ "fill-solid",
337
+ "fill-outline"
334
338
  ]);
335
339
  var WEEKDAY_ABBR = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
336
340
  function weekdayIndex(token) {
@@ -495,6 +499,14 @@ function parseClock(content, palette) {
495
499
  case "no-title":
496
500
  result.noTitle = true;
497
501
  break;
502
+ case "fill-tint":
503
+ case "fill-solid":
504
+ case "fill-outline": {
505
+ const fm = fillModeFromToken(key);
506
+ if (fm === "solid" || fm === "outline") result.fillMode = fm;
507
+ else delete result.fillMode;
508
+ break;
509
+ }
498
510
  case "color-by": {
499
511
  const v = rest.trim().toLowerCase();
500
512
  const modes = ["place", "work", "daylight", "time", "none"];
@@ -645,4 +657,4 @@ export {
645
657
  searchZones,
646
658
  parseClock
647
659
  };
648
- //# sourceMappingURL=chunk-6NFYEQDX.js.map
660
+ //# sourceMappingURL=chunk-FY5MSZAP.js.map