@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
@@ -9,7 +9,7 @@ import {
9
9
  } from "./chunk-YYVTBZZC.js";
10
10
  import {
11
11
  renderIntegratedLegend
12
- } from "./chunk-OU7HLO7I.js";
12
+ } from "./chunk-AUIM2NVH.js";
13
13
  import {
14
14
  getMaxLegendReservedHeight
15
15
  } from "./chunk-YAA6IID3.js";
@@ -29,15 +29,19 @@ import {
29
29
  } from "./chunk-WCT3NYCV.js";
30
30
  import {
31
31
  parseKanban
32
- } from "./chunk-IEDMFNU7.js";
32
+ } from "./chunk-3QD7VP3U.js";
33
33
  import {
34
34
  contrastText,
35
35
  mix,
36
- shapeFill
37
- } from "./chunk-P6T66CCZ.js";
36
+ shapeFill,
37
+ themeBaseBg
38
+ } from "./chunk-WBM7ZNDI.js";
38
39
  import {
39
40
  tagAttrKey
40
- } from "./chunk-467TVMQL.js";
41
+ } from "./chunk-HHKO6SKY.js";
42
+ import {
43
+ fillModeFromOptions
44
+ } from "./chunk-BRENJ2BQ.js";
41
45
 
42
46
  // src/kanban/renderer.ts
43
47
  import * as d3Selection from "d3-selection";
@@ -277,7 +281,9 @@ function renderKanban(container, parsed, palette, isDark, options) {
277
281
  const collapsedLanes = options?.collapsedLanes;
278
282
  const collapsedColumns = options?.collapsedColumns ?? new Set(parsed.columns.filter((c) => c.collapsed).map((c) => c.id));
279
283
  const compactMeta = options?.compactMeta ?? false;
280
- const solid = parsed.options["solid-fill"] === "on";
284
+ const fillMode = fillModeFromOptions(parsed.options);
285
+ const baseBg = themeBaseBg(palette, isDark);
286
+ const wellStroke = mix(palette.border, baseBg, 20);
281
287
  const requestedSwimlane = options?.currentSwimlaneGroup ?? null;
282
288
  const swimlaneGroup = requestedSwimlane ? parsed.tagGroups.find(
283
289
  (g) => g.name.toLowerCase() === requestedSwimlane.toLowerCase()
@@ -440,20 +446,26 @@ function renderKanban(container, parsed, palette, isDark, options) {
440
446
  const isColCollapsed = collapsedColumns?.has(col.id) ?? false;
441
447
  const g = svg.append("g").attr("class", "kanban-column").attr("data-column-id", col.id).attr("data-line-number", col.lineNumber);
442
448
  const thisColBg = defaultColBg;
443
- const thisColHeaderBg = col.color ? shapeFill(palette, col.color, isDark, { solid }) : defaultColHeaderBg;
449
+ const thisColHeaderBg = col.color ? shapeFill(palette, col.color, isDark, { mode: fillMode }) : defaultColHeaderBg;
444
450
  const onHeaderText = col.color ? contrastText(
445
451
  thisColHeaderBg,
446
452
  palette.textOnFillLight,
447
453
  palette.textOnFillDark
448
454
  ) : palette.text;
449
455
  if (isColCollapsed) {
450
- g.append("rect").attr("x", colLayout.x).attr("y", colLayout.y).attr("width", sCollapsedColumnWidth).attr("height", colLayout.height).attr("rx", sColumnRadius).attr("fill", thisColBg);
456
+ g.append("rect").attr("x", colLayout.x).attr("y", colLayout.y).attr("width", sCollapsedColumnWidth).attr("height", colLayout.height).attr("rx", sColumnRadius).attr("fill", fillMode === "outline" ? baseBg : thisColBg).call((sel) => {
457
+ if (fillMode === "outline")
458
+ sel.attr("stroke", wellStroke).attr("stroke-width", 1);
459
+ });
451
460
  g.append("rect").attr("x", colLayout.x).attr("y", colLayout.y).attr("width", sCollapsedColumnWidth).attr("height", sColumnHeaderHeight).attr("rx", sColumnHeaderRadius).attr("fill", thisColHeaderBg);
452
461
  g.append("text").attr("x", colLayout.x + sCollapsedColumnWidth / 2).attr("y", colLayout.y + sColumnHeaderHeight / 2 + sWipFontSize / 2 - 1).attr("font-size", sWipFontSize).attr("font-weight", "bold").attr("fill", col.color ? onHeaderText : palette.textMuted).attr("text-anchor", "middle").text(String(col.cards.length));
453
462
  g.append("text").attr("x", colLayout.x + sCollapsedColumnWidth / 2).attr("y", colLayout.y + sColumnHeaderHeight + sColumnPadding).attr("font-size", sCardTitleFontSize).attr("font-weight", "bold").attr("fill", palette.text).attr("text-anchor", "middle").attr("writing-mode", "tb").text(col.name);
454
463
  continue;
455
464
  }
456
- g.append("rect").attr("x", colLayout.x).attr("y", colLayout.y).attr("width", colLayout.width).attr("height", colLayout.height).attr("rx", sColumnRadius).attr("fill", thisColBg);
465
+ g.append("rect").attr("x", colLayout.x).attr("y", colLayout.y).attr("width", colLayout.width).attr("height", colLayout.height).attr("rx", sColumnRadius).attr("fill", fillMode === "outline" ? baseBg : thisColBg).call((sel) => {
466
+ if (fillMode === "outline")
467
+ sel.attr("stroke", wellStroke).attr("stroke-width", 1);
468
+ });
457
469
  g.append("rect").attr("x", colLayout.x).attr("y", colLayout.y).attr("width", colLayout.width).attr("height", sColumnHeaderHeight).attr("rx", sColumnHeaderRadius).attr("fill", thisColHeaderBg);
458
470
  g.append("text").attr("x", colLayout.x + sColumnPadding).attr(
459
471
  "y",
@@ -484,7 +496,7 @@ function renderKanban(container, parsed, palette, isDark, options) {
484
496
  palette,
485
497
  resolvedColor ?? palette.primary,
486
498
  isDark,
487
- { solid }
499
+ { mode: fillMode }
488
500
  );
489
501
  const cardStroke = resolvedColor ?? palette.textMuted;
490
502
  const onCardText = contrastText(
@@ -511,7 +523,7 @@ function renderKanban(container, parsed, palette, isDark, options) {
511
523
  renderInlineText(titleEl, card.title, palette, sCardTitleFontSize);
512
524
  if (hasMeta) {
513
525
  const separatorY = cy + sCardHeaderHeight;
514
- cg.append("line").attr("x1", cx).attr("y1", separatorY).attr("x2", cx + cardLayout.width).attr("y2", separatorY).attr("stroke", solid ? onCardText : cardStroke).attr("stroke-opacity", 0.3).attr("stroke-width", 1);
526
+ cg.append("line").attr("x1", cx).attr("y1", separatorY).attr("x2", cx + cardLayout.width).attr("y2", separatorY).attr("stroke", fillMode === "solid" ? onCardText : cardStroke).attr("stroke-opacity", 0.3).attr("stroke-width", 1);
515
527
  let metaY = separatorY + sCardSeparatorGap + sCardMetaFontSize;
516
528
  for (const meta of tagMeta) {
517
529
  cg.append("text").attr("x", cx + sCardPaddingX).attr("y", metaY).attr("font-size", sCardMetaFontSize).attr("fill", onCardText).text(`${meta.label}: `);
@@ -732,7 +744,7 @@ function renderSwimlaneBoard(svg, parsed, baseLayout, swimlaneGroup, palette, is
732
744
  const isColCollapsed = collapsedColumns?.has(col.id) ?? false;
733
745
  const headerG = svg.append("g").attr("class", "kanban-column kanban-column-header").attr("data-column-id", col.id).attr("data-line-number", col.lineNumber);
734
746
  const colHeaderBg = col.color ? shapeFill(palette, col.color, isDark, {
735
- solid: parsed.options["solid-fill"] === "on"
747
+ mode: fillModeFromOptions(parsed.options)
736
748
  }) : defaultColHeaderBg;
737
749
  headerG.append("rect").attr("x", colInfo.x).attr("y", grid.startY).attr("width", colInfo.width).attr("height", sColumnHeaderHeight).attr("rx", sColumnHeaderRadius).attr("fill", colHeaderBg);
738
750
  if (isColCollapsed) {
@@ -808,7 +820,7 @@ function renderSwimlaneBoard(svg, parsed, baseLayout, swimlaneGroup, palette, is
808
820
  palette,
809
821
  isDark,
810
822
  hiddenMetaGroups,
811
- parsed.options["solid-fill"] === "on",
823
+ fillModeFromOptions(parsed.options),
812
824
  sCardRadius,
813
825
  sCardPaddingX,
814
826
  sCardPaddingY,
@@ -824,7 +836,7 @@ function renderSwimlaneBoard(svg, parsed, baseLayout, swimlaneGroup, palette, is
824
836
  }
825
837
  }
826
838
  }
827
- function renderSwimlaneCard(parent, cardLayout, tagGroups, activeTagGroup, palette, isDark, hiddenMetaGroups, solid, sCardRadius = CARD_RADIUS, sCardPaddingX = CARD_PADDING_X, sCardPaddingY = CARD_PADDING_Y, sCardStrokeWidth = CARD_STROKE_WIDTH, sCardTitleFontSize = CARD_TITLE_FONT_SIZE, sCardMetaFontSize = CARD_META_FONT_SIZE, sCardHeaderHeight = CARD_HEADER_HEIGHT, sCardSeparatorGap = CARD_SEPARATOR_GAP, sCardMetaLineHeight = CARD_META_LINE_HEIGHT) {
839
+ function renderSwimlaneCard(parent, cardLayout, tagGroups, activeTagGroup, palette, isDark, hiddenMetaGroups, fillMode, sCardRadius = CARD_RADIUS, sCardPaddingX = CARD_PADDING_X, sCardPaddingY = CARD_PADDING_Y, sCardStrokeWidth = CARD_STROKE_WIDTH, sCardTitleFontSize = CARD_TITLE_FONT_SIZE, sCardMetaFontSize = CARD_META_FONT_SIZE, sCardHeaderHeight = CARD_HEADER_HEIGHT, sCardSeparatorGap = CARD_SEPARATOR_GAP, sCardMetaLineHeight = CARD_META_LINE_HEIGHT) {
828
840
  const card = cardLayout.card;
829
841
  const resolvedColor = resolveCardTagColor(card, tagGroups, activeTagGroup);
830
842
  const tagMeta = resolveCardTagMeta(card, tagGroups, hiddenMetaGroups);
@@ -833,9 +845,7 @@ function renderSwimlaneCard(parent, cardLayout, tagGroups, activeTagGroup, palet
833
845
  palette,
834
846
  resolvedColor ?? palette.primary,
835
847
  isDark,
836
- {
837
- ...solid !== void 0 && { solid }
838
- }
848
+ { mode: fillMode }
839
849
  );
840
850
  const cardStroke = resolvedColor ?? palette.textMuted;
841
851
  const onCardText = contrastText(
@@ -882,4 +892,4 @@ export {
882
892
  renderKanban,
883
893
  renderKanbanForExport
884
894
  };
885
- //# sourceMappingURL=chunk-AXW3M6OQ.js.map
895
+ //# sourceMappingURL=chunk-TTIM6YTT.js.map
@@ -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
  getMaxLegendReservedHeight
13
13
  } from "./chunk-YAA6IID3.js";
@@ -23,7 +23,10 @@ import {
23
23
  contrastText,
24
24
  mix,
25
25
  shapeFill
26
- } from "./chunk-P6T66CCZ.js";
26
+ } from "./chunk-WBM7ZNDI.js";
27
+ import {
28
+ fillModeFromOptions
29
+ } from "./chunk-BRENJ2BQ.js";
27
30
 
28
31
  // src/tech-radar/renderer.ts
29
32
  import * as d3Selection2 from "d3-selection";
@@ -440,7 +443,7 @@ function clearDim(root) {
440
443
  function renderHtmlPanel(panel, parsed, quadrant, qColor, palette, isDark, rootContainer, onClickItem) {
441
444
  const ringOrder = parsed.rings.map((r) => r.name);
442
445
  const fillColor = shapeFill(palette, qColor, isDark, {
443
- solid: parsed.options["solid-fill"] === "on"
446
+ mode: fillModeFromOptions(parsed.options)
444
447
  });
445
448
  let expandedLineNum = null;
446
449
  function render() {
@@ -819,7 +822,7 @@ function renderQuarterCircleStatic(svg, parsed, quadrant, qColor, palette, isDar
819
822
  function renderStaticHtmlPanel(panel, parsed, quadrant, qColor, palette, isDark) {
820
823
  const ringOrder = parsed.rings.map((r) => r.name);
821
824
  const fillColor = shapeFill(palette, qColor, isDark, {
822
- solid: parsed.options["solid-fill"] === "on"
825
+ mode: fillModeFromOptions(parsed.options)
823
826
  });
824
827
  for (const ringName of ringOrder) {
825
828
  const blips = quadrant.blips.filter((b) => b.ring === ringName);
@@ -1173,7 +1176,7 @@ function renderTechRadar(container, parsed, palette, isDark, onClickItem, export
1173
1176
  // Tech-radar opts out of solid-fill: blip popover stays in tinted
1174
1177
  // form so it reads consistently against the radar bg regardless of
1175
1178
  // the diagram's option setting.
1176
- false
1179
+ void 0
1177
1180
  );
1178
1181
  showBlipHighlight(lineNum, bx, by, blipGroup);
1179
1182
  }).on("mousemove", (event) => {
@@ -1202,7 +1205,7 @@ function renderTechRadar(container, parsed, palette, isDark, onClickItem, export
1202
1205
  // Tech-radar opts out of solid-fill: blip popover stays in tinted
1203
1206
  // form so it reads consistently against the radar bg regardless of
1204
1207
  // the diagram's option setting.
1205
- false
1208
+ void 0
1206
1209
  );
1207
1210
  popover.style.pointerEvents = "auto";
1208
1211
  showBlipHighlight(lineNum, bx, by, blipGroup);
@@ -1246,7 +1249,7 @@ function renderTechRadar(container, parsed, palette, isDark, onClickItem, export
1246
1249
  // Tech-radar opts out of solid-fill: blip popover stays in tinted
1247
1250
  // form so it reads consistently against the radar bg regardless of
1248
1251
  // the diagram's option setting.
1249
- false
1252
+ void 0
1250
1253
  );
1251
1254
  }
1252
1255
  const lineNum = String(blip.lineNumber);
@@ -1440,10 +1443,8 @@ function createBlipPopover(container, _palette, isDark) {
1440
1443
  container.appendChild(el);
1441
1444
  return el;
1442
1445
  }
1443
- function showBlipPopover(popover, blip, qColor, palette, isDark, event, solid) {
1444
- const fillColor = shapeFill(palette, qColor, isDark, {
1445
- ...solid !== void 0 && { solid }
1446
- });
1446
+ function showBlipPopover(popover, blip, qColor, palette, isDark, event, fillMode) {
1447
+ const fillColor = shapeFill(palette, qColor, isDark, { mode: fillMode });
1447
1448
  const hasDesc = blip.description.length > 0;
1448
1449
  const onFillText = contrastText(
1449
1450
  fillColor,
@@ -1601,4 +1602,4 @@ export {
1601
1602
  renderTechRadar,
1602
1603
  renderTechRadarForExport
1603
1604
  };
1604
- //# sourceMappingURL=chunk-WJ7RW65H.js.map
1605
+ //# sourceMappingURL=chunk-UBLHQTLV.js.map
@@ -5,7 +5,7 @@ import {
5
5
  splitNameAndMeta,
6
6
  tryParseSharedOption,
7
7
  warnUnknownMetaKeys
8
- } from "./chunk-LV4BETUU.js";
8
+ } from "./chunk-BRENJ2BQ.js";
9
9
  import {
10
10
  RECOGNIZED_COLOR_NAMES,
11
11
  resolveColor
@@ -165,4 +165,4 @@ function parseRing(content) {
165
165
  export {
166
166
  parseRing
167
167
  };
168
- //# sourceMappingURL=chunk-AE7II3E3.js.map
168
+ //# sourceMappingURL=chunk-UNURMIQO.js.map
@@ -5,7 +5,7 @@ import {
5
5
  parseFirstLine,
6
6
  splitNameAndMeta,
7
7
  warnUnknownMetaKeys
8
- } from "./chunk-LV4BETUU.js";
8
+ } from "./chunk-BRENJ2BQ.js";
9
9
  import {
10
10
  makeDgmoError,
11
11
  makeFail,
@@ -29,7 +29,9 @@ var POSITION_ORDER = [
29
29
  var KNOWN_OPTIONS = /* @__PURE__ */ new Set([]);
30
30
  var KNOWN_BOOLEANS = /* @__PURE__ */ new Set([
31
31
  "show-blip-legend",
32
- "solid-fill",
32
+ "fill-tint",
33
+ "fill-solid",
34
+ "fill-outline",
33
35
  "no-title"
34
36
  ]);
35
37
  function parseTechRadar(content) {
@@ -332,4 +334,4 @@ function assignGlobalNumbers(result) {
332
334
  export {
333
335
  parseTechRadar
334
336
  };
335
- //# sourceMappingURL=chunk-PZDBOK2Q.js.map
337
+ //# sourceMappingURL=chunk-VILVLS7P.js.map
@@ -9,7 +9,7 @@ import {
9
9
  } from "./chunk-YYVTBZZC.js";
10
10
  import {
11
11
  renderIntegratedLegend
12
- } from "./chunk-OU7HLO7I.js";
12
+ } from "./chunk-AUIM2NVH.js";
13
13
  import {
14
14
  getMaxLegendReservedHeight
15
15
  } from "./chunk-YAA6IID3.js";
@@ -30,16 +30,19 @@ import {
30
30
  mix,
31
31
  shapeFill,
32
32
  themeBaseBg
33
- } from "./chunk-P6T66CCZ.js";
33
+ } from "./chunk-WBM7ZNDI.js";
34
34
  import {
35
35
  isSequenceBlock,
36
36
  isSequenceNote,
37
37
  isSequenceSection
38
- } from "./chunk-RLFVAKEO.js";
38
+ } from "./chunk-QJMKPUYK.js";
39
39
  import {
40
40
  resolveActiveTagGroup,
41
41
  tagAttrKey
42
- } from "./chunk-467TVMQL.js";
42
+ } from "./chunk-HHKO6SKY.js";
43
+ import {
44
+ fillModeFromOptions
45
+ } from "./chunk-BRENJ2BQ.js";
43
46
 
44
47
  // src/sequence/renderer.ts
45
48
  import * as d3Selection from "d3-selection";
@@ -286,15 +289,13 @@ function wrapLabelWords(words, maxWidth, fontSize) {
286
289
  if (current) lines.push(current);
287
290
  return lines;
288
291
  }
289
- var fill = (palette, isDark, color, solid) => color ? shapeFill(palette, color, isDark, {
290
- ...solid !== void 0 && { solid }
291
- }) : isDark ? mix(palette.overlay, palette.surface, 50) : mix(palette.bg, palette.surface, 50);
292
+ var fill = (palette, isDark, color, fillMode) => color ? shapeFill(palette, color, isDark, { mode: fillMode }) : isDark ? mix(palette.overlay, palette.surface, 50) : mix(palette.bg, palette.surface, 50);
292
293
  var stroke = (palette, color) => color || palette.border;
293
294
  var SW = 1.5;
294
295
  var W = PARTICIPANT_BOX_WIDTH;
295
296
  var H = PARTICIPANT_BOX_HEIGHT;
296
- function renderRectParticipant(g, palette, isDark, color, solid, w = W, h = H) {
297
- g.append("rect").attr("x", -w / 2).attr("y", 0).attr("width", w).attr("height", h).attr("rx", 2).attr("ry", 2).attr("fill", fill(palette, isDark, color, solid)).attr("stroke", stroke(palette, color)).attr("stroke-width", SW);
297
+ function renderRectParticipant(g, palette, isDark, color, fillMode, w = W, h = H) {
298
+ g.append("rect").attr("x", -w / 2).attr("y", 0).attr("width", w).attr("height", h).attr("rx", 2).attr("ry", 2).attr("fill", fill(palette, isDark, color, fillMode)).attr("stroke", stroke(palette, color)).attr("stroke-width", SW);
298
299
  }
299
300
  function renderActorParticipant(g, palette, color, h = H) {
300
301
  const sc = h / H;
@@ -315,11 +316,11 @@ function renderActorParticipant(g, palette, color, h = H) {
315
316
  g.append("line").attr("x1", cx).attr("y1", bodyBottomY).attr("x2", cx - legSpan).attr("y2", legY).attr("stroke", s).attr("stroke-width", actorSW);
316
317
  g.append("line").attr("x1", cx).attr("y1", bodyBottomY).attr("x2", cx + legSpan).attr("y2", legY).attr("stroke", s).attr("stroke-width", actorSW);
317
318
  }
318
- function renderDatabaseParticipant(g, palette, isDark, color, solid, w = W, h = H) {
319
+ function renderDatabaseParticipant(g, palette, isDark, color, fillMode, w = W, h = H) {
319
320
  const ry = 7;
320
321
  const topY = ry;
321
322
  const bodyH = h - ry * 2;
322
- const f = fill(palette, isDark, color, solid);
323
+ const f = fill(palette, isDark, color, fillMode);
323
324
  const s = stroke(palette, color);
324
325
  g.append("ellipse").attr("cx", 0).attr("cy", topY + bodyH).attr("rx", w / 2).attr("ry", ry).attr("fill", f).attr("stroke", s).attr("stroke-width", SW);
325
326
  g.append("rect").attr("class", "participant-body").attr("x", -w / 2).attr("y", topY).attr("width", w).attr("height", bodyH).attr("fill", f).attr("stroke", "none");
@@ -327,11 +328,11 @@ function renderDatabaseParticipant(g, palette, isDark, color, solid, w = W, h =
327
328
  g.append("line").attr("x1", w / 2).attr("y1", topY).attr("x2", w / 2).attr("y2", topY + bodyH).attr("stroke", s).attr("stroke-width", SW);
328
329
  g.append("ellipse").attr("cx", 0).attr("cy", topY).attr("rx", w / 2).attr("ry", ry).attr("fill", f).attr("stroke", s).attr("stroke-width", SW);
329
330
  }
330
- function renderQueueParticipant(g, palette, isDark, color, solid, w = W, h = H) {
331
+ function renderQueueParticipant(g, palette, isDark, color, fillMode, w = W, h = H) {
331
332
  const rx = 10;
332
333
  const leftX = -w / 2 + rx;
333
334
  const bodyW = w - rx * 2;
334
- const f = fill(palette, isDark, color, solid);
335
+ const f = fill(palette, isDark, color, fillMode);
335
336
  const s = stroke(palette, color);
336
337
  g.append("ellipse").attr("cx", leftX + bodyW).attr("cy", h / 2).attr("rx", rx).attr("ry", h / 2).attr("fill", f).attr("stroke", s).attr("stroke-width", SW);
337
338
  g.append("rect").attr("class", "participant-body").attr("x", leftX).attr("y", 0).attr("width", bodyW).attr("height", h).attr("fill", f).attr("stroke", "none");
@@ -339,11 +340,11 @@ function renderQueueParticipant(g, palette, isDark, color, solid, w = W, h = H)
339
340
  g.append("line").attr("x1", leftX).attr("y1", h).attr("x2", leftX + bodyW).attr("y2", h).attr("stroke", s).attr("stroke-width", SW);
340
341
  g.append("ellipse").attr("cx", leftX).attr("cy", h / 2).attr("rx", rx).attr("ry", h / 2).attr("fill", f).attr("stroke", s).attr("stroke-width", SW);
341
342
  }
342
- function renderCacheParticipant(g, palette, isDark, color, solid, w = W, h = H) {
343
+ function renderCacheParticipant(g, palette, isDark, color, fillMode, w = W, h = H) {
343
344
  const ry = 7;
344
345
  const topY = ry;
345
346
  const bodyH = h - ry * 2;
346
- const f = fill(palette, isDark, color, solid);
347
+ const f = fill(palette, isDark, color, fillMode);
347
348
  const s = stroke(palette, color);
348
349
  const dash = "4 3";
349
350
  g.append("ellipse").attr("cx", 0).attr("cy", topY + bodyH).attr("rx", w / 2).attr("ry", ry).attr("fill", f).attr("stroke", s).attr("stroke-width", SW).attr("stroke-dasharray", dash);
@@ -586,7 +587,7 @@ function applyGroupOrdering(participants, groups, messages = []) {
586
587
  function renderSequenceDiagram(container, parsed, palette, isDark, _onNavigateToLine, options) {
587
588
  d3Selection.select(container).selectAll("*").remove();
588
589
  const { title, options: parsedOptions } = parsed;
589
- const solid = parsedOptions["solid-fill"] === "on";
590
+ const fillMode = fillModeFromOptions(parsedOptions);
590
591
  const effectiveCollapsedGroups = options?.collapsedGroups ? new Set(options.collapsedGroups) : new Set(
591
592
  parsed.groups.filter((g) => g.collapsed).map((g) => g.lineNumber)
592
593
  );
@@ -1146,7 +1147,7 @@ function renderSequenceDiagram(container, parsed, palette, isDark, _onNavigateTo
1146
1147
  }
1147
1148
  let rightMargin = Math.max(rightProjection + 10, sGap / 2);
1148
1149
  let leftMargin = sGap / 2;
1149
- const diagramWidth = participants.length * sGap;
1150
+ const diagramWidth = Math.max(0, participants.length - 1) * sGap;
1150
1151
  let totalWidth = Math.max(
1151
1152
  leftMargin + diagramWidth + rightMargin,
1152
1153
  sBoxW + 40
@@ -1327,7 +1328,7 @@ function renderSequenceDiagram(container, parsed, palette, isDark, _onNavigateTo
1327
1328
  isDark,
1328
1329
  effectiveTagColor,
1329
1330
  pTagAttr,
1330
- solid,
1331
+ fillMode,
1331
1332
  sBoxW,
1332
1333
  sBoxH,
1333
1334
  sLabelTextWidth,
@@ -1551,7 +1552,9 @@ function renderSequenceDiagram(container, parsed, palette, isDark, _onNavigateTo
1551
1552
  const actTagColor = getTagColor(actTagValue);
1552
1553
  const actBaseColor = actTagColor || palette.primary;
1553
1554
  svg.append("rect").attr("x", x).attr("y", y1).attr("width", sActivationWidth).attr("height", y2 - y1).attr("fill", themeBaseBg(palette, isDark));
1554
- const actFill = shapeFill(palette, actBaseColor, isDark, { solid });
1555
+ const actFill = shapeFill(palette, actBaseColor, isDark, {
1556
+ mode: fillMode
1557
+ });
1555
1558
  const actRect = svg.append("rect").attr("x", x).attr("y", y1).attr("width", sActivationWidth).attr("height", y2 - y1).attr("fill", actFill).attr("stroke", actBaseColor).attr("stroke-width", 1).attr("stroke-opacity", 0.5).attr("data-participant-id", act.participantId).attr("data-msg-lines", coveredLines.join(",")).attr("data-line-number", coveredLines[0] ?? "").attr("class", "activation");
1556
1559
  if (tagKey && actTagValue) {
1557
1560
  actRect.attr(`data-tag-${tagKey}`, actTagValue.toLowerCase());
@@ -1789,7 +1792,7 @@ function buildNoteMessageMap(elements) {
1789
1792
  walk(elements);
1790
1793
  return map;
1791
1794
  }
1792
- function renderParticipant(svg, participant, cx, cy, palette, isDark, color, tagAttr, solid, boxW = W, boxH = H, labelTextW = labelTextWidth(W), labelFontSize = LABEL_FONT_SIZE) {
1795
+ function renderParticipant(svg, participant, cx, cy, palette, isDark, color, tagAttr, fillMode, boxW = W, boxH = H, labelTextW = labelTextWidth(W), labelFontSize = LABEL_FONT_SIZE) {
1793
1796
  const g = svg.append("g").attr("transform", `translate(${cx}, ${cy})`).attr("class", "participant").attr("data-participant-id", participant.id);
1794
1797
  if (tagAttr) {
1795
1798
  g.attr(`data-tag-${tagAttr.key}`, tagAttr.value);
@@ -1799,16 +1802,24 @@ function renderParticipant(svg, participant, cx, cy, palette, isDark, color, tag
1799
1802
  renderActorParticipant(g, palette, color, boxH);
1800
1803
  break;
1801
1804
  case "database":
1802
- renderDatabaseParticipant(g, palette, isDark, color, solid, boxW, boxH);
1805
+ renderDatabaseParticipant(
1806
+ g,
1807
+ palette,
1808
+ isDark,
1809
+ color,
1810
+ fillMode,
1811
+ boxW,
1812
+ boxH
1813
+ );
1803
1814
  break;
1804
1815
  case "queue":
1805
- renderQueueParticipant(g, palette, isDark, color, solid, boxW, boxH);
1816
+ renderQueueParticipant(g, palette, isDark, color, fillMode, boxW, boxH);
1806
1817
  break;
1807
1818
  case "cache":
1808
- renderCacheParticipant(g, palette, isDark, color, solid, boxW, boxH);
1819
+ renderCacheParticipant(g, palette, isDark, color, fillMode, boxW, boxH);
1809
1820
  break;
1810
1821
  default:
1811
- renderRectParticipant(g, palette, isDark, color, solid, boxW, boxH);
1822
+ renderRectParticipant(g, palette, isDark, color, fillMode, boxW, boxH);
1812
1823
  break;
1813
1824
  }
1814
1825
  const isActor = participant.type === "actor";
@@ -1820,7 +1831,7 @@ function renderParticipant(svg, participant, cx, cy, palette, isDark, color, tag
1820
1831
  const fontSize = labelFontSize;
1821
1832
  const lineHeight = fontSize + 2;
1822
1833
  const labelFill = isActor ? palette.text : contrastText(
1823
- fill(palette, isDark, color, solid),
1834
+ fill(palette, isDark, color, fillMode),
1824
1835
  palette.textOnFillLight,
1825
1836
  palette.textOnFillDark
1826
1837
  );
@@ -1848,4 +1859,4 @@ export {
1848
1859
  renderSequenceDiagram,
1849
1860
  buildNoteMessageMap
1850
1861
  };
1851
- //# sourceMappingURL=chunk-3YSQZ75W.js.map
1862
+ //# sourceMappingURL=chunk-VQOCMUWI.js.map
@@ -146,7 +146,8 @@ function themeBaseBg(palette, isDark) {
146
146
  return isDark ? palette.surface : palette.bg;
147
147
  }
148
148
  function shapeFill(palette, intent, isDark, opts) {
149
- if (opts?.solid) return intent;
149
+ if (opts?.mode === "solid") return intent;
150
+ if (opts?.mode === "outline") return themeBaseBg(palette, isDark);
150
151
  return mix(intent, themeBaseBg(palette, isDark), 25);
151
152
  }
152
153
  function getSeriesColors(palette) {
@@ -223,4 +224,4 @@ export {
223
224
  getSegmentColors,
224
225
  politicalTints
225
226
  };
226
- //# sourceMappingURL=chunk-P6T66CCZ.js.map
227
+ //# sourceMappingURL=chunk-WBM7ZNDI.js.map
@@ -8,7 +8,7 @@ import {
8
8
  stripDefaultModifier,
9
9
  tagAttrKey,
10
10
  validateTagGroupNames
11
- } from "./chunk-467TVMQL.js";
11
+ } from "./chunk-HHKO6SKY.js";
12
12
  import {
13
13
  JOURNEY_MAP_REGISTRY,
14
14
  OPTION_NOCOLON_RE,
@@ -19,7 +19,7 @@ import {
19
19
  splitNameAndMeta,
20
20
  warnUnknownMetaKeys,
21
21
  withTagAliases
22
- } from "./chunk-LV4BETUU.js";
22
+ } from "./chunk-BRENJ2BQ.js";
23
23
  import {
24
24
  resolveColorWithDiagnostic
25
25
  } from "./chunk-TLVIHFRO.js";
@@ -34,7 +34,12 @@ import {
34
34
  var PHASE_RE = /^\[(.+?)\]$/;
35
35
  var ANNOTATION_RE = /^(pain|opportunity|thought)\s*:\s*(.+)$/i;
36
36
  var KNOWN_OPTIONS = /* @__PURE__ */ new Set(["active-tag"]);
37
- var KNOWN_BOOLEANS = /* @__PURE__ */ new Set(["solid-fill", "no-title"]);
37
+ var KNOWN_BOOLEANS = /* @__PURE__ */ new Set([
38
+ "fill-tint",
39
+ "fill-solid",
40
+ "fill-outline",
41
+ "no-title"
42
+ ]);
38
43
  var REMOVED_BOOLEANS = {
39
44
  "no-legend": '"no-legend" has been removed \u2014 remove tag groups to hide the legend.'
40
45
  };
@@ -406,4 +411,4 @@ function parseStepLine(trimmed, lineNumber, counter, aliasMap, warn, diagnostics
406
411
  export {
407
412
  parseJourneyMap
408
413
  };
409
- //# sourceMappingURL=chunk-4QZ43D7I.js.map
414
+ //# sourceMappingURL=chunk-XD6ZYURY.js.map
@@ -5,7 +5,10 @@ import {
5
5
  import {
6
6
  mix,
7
7
  shapeFill
8
- } from "./chunk-P6T66CCZ.js";
8
+ } from "./chunk-WBM7ZNDI.js";
9
+ import {
10
+ fillModeFromOptions
11
+ } from "./chunk-BRENJ2BQ.js";
9
12
 
10
13
  // src/journey-map/layout.ts
11
14
  var PADDING = 24;
@@ -210,7 +213,7 @@ function layoutJourneyMap(parsed, palette, options) {
210
213
  palette,
211
214
  scoreToColor(avgScore, palette),
212
215
  isDark,
213
- { solid: parsed.options["solid-fill"] === "on" }
216
+ { mode: fillModeFromOptions(parsed.options) }
214
217
  );
215
218
  const COLLAPSED_CARD_H = 26;
216
219
  const COLLAPSED_GAP = 6;
@@ -287,4 +290,4 @@ export {
287
290
  scoreToCurveY,
288
291
  layoutJourneyMap
289
292
  };
290
- //# sourceMappingURL=chunk-3JLKYGBQ.js.map
293
+ //# sourceMappingURL=chunk-YIBAWQGJ.js.map
@@ -15,7 +15,10 @@ import {
15
15
  contrastText,
16
16
  mix,
17
17
  shapeFill
18
- } from "./chunk-P6T66CCZ.js";
18
+ } from "./chunk-WBM7ZNDI.js";
19
+ import {
20
+ fillModeFromOptions
21
+ } from "./chunk-BRENJ2BQ.js";
19
22
 
20
23
  // src/wireframe/renderer.ts
21
24
  import * as d3Selection from "d3-selection";
@@ -59,7 +62,7 @@ function renderWireframe(container, parsed, layout, palette, isDark, _onClickIte
59
62
  isTransparent: effectiveTheme === "transparent",
60
63
  isDark,
61
64
  showGroupLabels: opts.showGroupLabels ?? true,
62
- solid: parsed.options["solid-fill"] === "on"
65
+ fillMode: fillModeFromOptions(parsed.options)
63
66
  };
64
67
  if (!ctx.isTransparent) {
65
68
  svg.append("rect").attr("width", layout.width).attr("height", layout.height).attr("fill", palette.bg).attr("rx", 8);
@@ -443,7 +446,7 @@ function renderAlert(g, node, ctx) {
443
446
  const { palette, isDark, isTransparent } = ctx;
444
447
  const el = node.element;
445
448
  const color = getElementSemanticColor(el, palette) || palette.accent;
446
- const fill = isTransparent ? null : shapeFill(palette, color, isDark, { solid: ctx.solid });
449
+ const fill = isTransparent ? null : shapeFill(palette, color, isDark, { mode: ctx.fillMode });
447
450
  if (fill) {
448
451
  g.append("rect").attr("width", node.width).attr("height", node.height).attr("fill", fill).attr("rx", 4);
449
452
  }
@@ -551,4 +554,4 @@ function renderModal(parent, node, ctx) {
551
554
  export {
552
555
  renderWireframe
553
556
  };
554
- //# sourceMappingURL=chunk-ZO27FGJS.js.map
557
+ //# sourceMappingURL=chunk-YTMTPUH4.js.map
@@ -9,12 +9,13 @@ import {
9
9
  matchTagBlockHeading,
10
10
  stripDefaultModifier,
11
11
  tagAttrKey
12
- } from "./chunk-467TVMQL.js";
12
+ } from "./chunk-HHKO6SKY.js";
13
13
  import {
14
14
  extractColor,
15
+ fillModeFromToken,
15
16
  measureIndent,
16
17
  parseFirstLine
17
- } from "./chunk-LV4BETUU.js";
18
+ } from "./chunk-BRENJ2BQ.js";
18
19
  import {
19
20
  emit
20
21
  } from "./chunk-CXK4DZH3.js";
@@ -140,6 +141,13 @@ function parseBody(content, palette) {
140
141
  options.noTitle = true;
141
142
  continue;
142
143
  }
144
+ const fm = fillModeFromToken(trimmed);
145
+ if (fm !== null) {
146
+ if (fm === "tint") delete options.fillMode;
147
+ else options.fillMode = fm;
148
+ currentTagGroup = null;
149
+ continue;
150
+ }
143
151
  }
144
152
  const tagBlockMatch = matchTagBlockHeading(trimmed);
145
153
  if (tagBlockMatch && !contentStarted) {
@@ -256,4 +264,4 @@ export {
256
264
  parseBody,
257
265
  extractSymbols
258
266
  };
259
- //# sourceMappingURL=chunk-6BQFET7X.js.map
267
+ //# sourceMappingURL=chunk-Z5QVYKR7.js.map