@diagrammo/dgmo 0.70.0 → 0.72.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 (188) hide show
  1. package/README.md +2 -0
  2. package/dist/advanced.d.ts +37 -30
  3. package/dist/advanced.js +91 -91
  4. package/dist/block.js +47 -47
  5. package/dist/{calculator-GU4NVYE2.js → calculator-4CNL2GKU.js} +3 -3
  6. package/dist/{chart-meta-DNsYpNbh.d.ts → chart-meta-6JaOudSs.d.ts} +8 -1
  7. package/dist/chart-meta.d.ts +2 -2
  8. package/dist/chart-meta.js +42 -42
  9. package/dist/{charts-d3-HWKV46CS.js → charts-d3-6IHGTXBR.js} +5 -5
  10. package/dist/{chunk-YYVTBZZC.js → chunk-24YPR5EH.js} +1 -1
  11. package/dist/{chunk-USOLDMYO.js → chunk-2OTYNNHS.js} +6 -6
  12. package/dist/{chunk-SHS3O7ZZ.js → chunk-2VBJCTSG.js} +4 -4
  13. package/dist/{chunk-6WI76LHG.js → chunk-376ATV2Q.js} +19 -5
  14. package/dist/{chunk-PMDE3I53.js → chunk-3HN32MEK.js} +2 -2
  15. package/dist/{chunk-EHRME74D.js → chunk-3SNE4CLI.js} +3 -3
  16. package/dist/{chunk-V5VCGTS4.js → chunk-4VUFJ7UA.js} +3 -3
  17. package/dist/{chunk-7YCHRBD3.js → chunk-5DYDPP7K.js} +2 -2
  18. package/dist/{chunk-LK35AH5V.js → chunk-66VHK7PP.js} +5 -5
  19. package/dist/{chunk-R2VVBC52.js → chunk-6DGMS2WJ.js} +4 -4
  20. package/dist/{chunk-Z6G367CM.js → chunk-6OAKQTXQ.js} +3 -3
  21. package/dist/{chunk-IODPKTRZ.js → chunk-6PA32CUB.js} +2 -2
  22. package/dist/{chunk-VSZRPDIZ.js → chunk-6S53NO3M.js} +5 -2
  23. package/dist/{chunk-PP75ABA4.js → chunk-7BHM774H.js} +6 -6
  24. package/dist/{chunk-QRLNO6C7.js → chunk-7RAWNJI5.js} +192 -122
  25. package/dist/{chunk-YXW2ZYS3.js → chunk-7SEQPFBX.js} +38 -7
  26. package/dist/{chunk-VALNMR2Y.js → chunk-7TSBM4BV.js} +3 -3
  27. package/dist/{chunk-EDFUVEO6.js → chunk-7U3NDE7T.js} +7 -7
  28. package/dist/{chunk-3QLXP6QZ.js → chunk-AEYRSPVV.js} +2 -2
  29. package/dist/{chunk-BNJC5KVG.js → chunk-BYSRXYRW.js} +4 -4
  30. package/dist/{chunk-EC5USK74.js → chunk-DEVZWCD5.js} +17 -5
  31. package/dist/{chunk-FH3S7FDS.js → chunk-DHKVHP3Y.js} +5 -5
  32. package/dist/{chunk-PBXMUXBW.js → chunk-DPGI742S.js} +20 -2
  33. package/dist/{chunk-UFKFABSP.js → chunk-DZ34UUXC.js} +7 -7
  34. package/dist/{chunk-ASUFSCVV.js → chunk-E36Q5ABQ.js} +4 -4
  35. package/dist/{chunk-TJ5PDNGU.js → chunk-EETUTZ5C.js} +2 -2
  36. package/dist/{chunk-KVM4POFR.js → chunk-ELIGVSLE.js} +10 -3
  37. package/dist/{chunk-KSK6B35D.js → chunk-FFD6A3B2.js} +22 -5
  38. package/dist/{chunk-K3MUWASA.js → chunk-FLXDMH7B.js} +3 -3
  39. package/dist/{chunk-J3XFVPEU.js → chunk-FTPNAYL2.js} +18 -6
  40. package/dist/{chunk-UJ4FJLBF.js → chunk-FX2USYOU.js} +13 -1
  41. package/dist/{chunk-IOVJT4PE.js → chunk-GCTKJDLY.js} +5 -5
  42. package/dist/{chunk-WBPWR2CX.js → chunk-GK4AU57A.js} +4 -4
  43. package/dist/{chunk-5ECGBM5S.js → chunk-HKL66CKW.js} +25 -21
  44. package/dist/{chunk-Z4KRDDZC.js → chunk-HWNF22ZZ.js} +20 -15
  45. package/dist/{chunk-2QLYLYLN.js → chunk-HZQCKXPB.js} +70 -385
  46. package/dist/{chunk-ZCWEJ3VB.js → chunk-IXVK7XCN.js} +3 -3
  47. package/dist/{chunk-BQVCENFX.js → chunk-JIWDWOYA.js} +3 -3
  48. package/dist/{chunk-HAGHVHR7.js → chunk-K6MQJ5IV.js} +2 -2
  49. package/dist/{chunk-MOMPLSQI.js → chunk-KJWIU5AM.js} +2 -2
  50. package/dist/{chunk-65KNPZCC.js → chunk-KOVRFBGR.js} +25 -4
  51. package/dist/{chunk-B6MHT3A7.js → chunk-L3XB446I.js} +2 -2
  52. package/dist/{chunk-NZ2Z4ZEN.js → chunk-LSHROB27.js} +3 -3
  53. package/dist/{chunk-Q7UM3R3Y.js → chunk-LTGOPJUV.js} +2 -2
  54. package/dist/{chunk-MMYRNZRQ.js → chunk-MC2H32SM.js} +3 -3
  55. package/dist/{chunk-CE2Z3OXR.js → chunk-MFSTE3YG.js} +18 -4
  56. package/dist/{chunk-4FEPSBUH.js → chunk-MKNWMFZU.js} +15 -5
  57. package/dist/{chunk-FQ7OYKOS.js → chunk-MUVASOBD.js} +7 -7
  58. package/dist/{chunk-6NWCQCJV.js → chunk-MWWRIOEN.js} +2 -2
  59. package/dist/{chunk-HK3JTWG3.js → chunk-MX3BYU7V.js} +2 -2
  60. package/dist/{chunk-4CTCOHDS.js → chunk-N34OTOGH.js} +12 -3
  61. package/dist/{chunk-H4VRTBMS.js → chunk-N5247W2W.js} +59 -16
  62. package/dist/{chunk-76XAJN7L.js → chunk-NEC7R2CB.js} +2 -2
  63. package/dist/{chunk-56TCBKXP.js → chunk-NJKUTY4M.js} +3 -3
  64. package/dist/{chunk-D62K46CW.js → chunk-NNMNHE3J.js} +2 -2
  65. package/dist/{chunk-XDEVAAY4.js → chunk-NTBHGUXY.js} +13 -3
  66. package/dist/{chunk-YYFIZ3AO.js → chunk-NUF7YTHA.js} +2 -2
  67. package/dist/{chunk-TSY25V7W.js → chunk-O4OVVK6J.js} +4 -4
  68. package/dist/{chunk-R2UUKZ6R.js → chunk-P6RPHRX7.js} +4 -4
  69. package/dist/{chunk-AA6LBVBN.js → chunk-PBV2C3BW.js} +27 -6
  70. package/dist/{chunk-Y37EDBPR.js → chunk-PKTRDOBI.js} +3 -3
  71. package/dist/{chunk-CVMD5UWI.js → chunk-QAJFIXJE.js} +19 -5
  72. package/dist/{chunk-7LIDBQDO.js → chunk-QITH5XOX.js} +6 -6
  73. package/dist/{chunk-YA464EGR.js → chunk-QPG55HGH.js} +3 -3
  74. package/dist/{chunk-MUXI4Y6U.js → chunk-REBTZP3W.js} +2 -2
  75. package/dist/{chunk-H7LQGRM3.js → chunk-RJI6MHHK.js} +3 -3
  76. package/dist/{chunk-G5UTJZFR.js → chunk-T7W5LM4N.js} +11 -3
  77. package/dist/{chunk-GAK5UOKL.js → chunk-TF7CFAZ5.js} +3 -3
  78. package/dist/{chunk-XAPHRRQ4.js → chunk-U4NFAWQW.js} +5 -5
  79. package/dist/{chunk-HQBY3N3S.js → chunk-UCGEBFUC.js} +3 -3
  80. package/dist/{chunk-6KJMPC6H.js → chunk-UF3EALKC.js} +9 -9
  81. package/dist/{chunk-JCAINYVG.js → chunk-UKOOGXRF.js} +288 -26
  82. package/dist/{chunk-ZLPNK7U2.js → chunk-UNM2PX5D.js} +3 -3
  83. package/dist/{chunk-JR6H5MEF.js → chunk-UNTFANSM.js} +3 -3
  84. package/dist/{chunk-UG3MRJL6.js → chunk-UTVKOGFF.js} +2 -2
  85. package/dist/{chunk-MGAWLZQE.js → chunk-UY77QQWU.js} +2 -2
  86. package/dist/{chunk-7LMDJ3U7.js → chunk-VE7PPEU3.js} +105 -18
  87. package/dist/{chunk-MZBEPHFY.js → chunk-VGLSKDDI.js} +2 -2
  88. package/dist/{chunk-WN6V4ILM.js → chunk-VLXYWPPE.js} +5 -5
  89. package/dist/{chunk-5FBSYKPQ.js → chunk-VMXV2CL5.js} +4 -4
  90. package/dist/{chunk-FFI25S5O.js → chunk-W27BULCB.js} +4 -4
  91. package/dist/{chunk-NTXNVS47.js → chunk-W7SZKJR6.js} +3 -3
  92. package/dist/{chunk-MACY4WJ4.js → chunk-WEC3JPTN.js} +4 -4
  93. package/dist/{chunk-LQB3NKEA.js → chunk-WPXHTYET.js} +16 -11
  94. package/dist/{chunk-QQI4JTJB.js → chunk-WRWUZ2C4.js} +3 -3
  95. package/dist/{chunk-QQFO63AA.js → chunk-XIZCHGP7.js} +3 -3
  96. package/dist/{chunk-PYL2K5CE.js → chunk-YG35ZCNW.js} +20 -5
  97. package/dist/{chunk-6NEFSIL3.js → chunk-YH5KJIO5.js} +4 -4
  98. package/dist/{chunk-N5XT3OWL.js → chunk-YTFA4VTW.js} +2 -2
  99. package/dist/{chunk-SW36YNNE.js → chunk-YYBQ55V2.js} +35 -74
  100. package/dist/{chunk-M2QQQWM3.js → chunk-ZJJWON5O.js} +15 -5
  101. package/dist/collapse-JRGPUE67.js +13 -0
  102. package/dist/completion-registry.js +14 -9
  103. package/dist/{dgmo-router-EAW7XiBE.d.ts → dgmo-router-Lya7cs3R.d.ts} +28 -0
  104. package/dist/dgmo-router-O55I5UXN.js +89 -0
  105. package/dist/{dimensions-RIZPH26J.js → dimensions-EFEBIRS6.js} +5 -5
  106. package/dist/editor.js +6 -3
  107. package/dist/{flowchart-parser-A64T3OEL.js → flowchart-parser-LZF2GW2P.js} +4 -4
  108. package/dist/{flowchart-renderer-F6PDPKK7.js → flowchart-renderer-JMGOCLTQ.js} +6 -6
  109. package/dist/highlight.js +6 -3
  110. package/dist/index.d.ts +1 -1
  111. package/dist/index.js +60 -47
  112. package/dist/{layout-2D6VKW6G.js → layout-2DVT24YY.js} +3 -3
  113. package/dist/{layout-COGPMCW5.js → layout-4D5JRUHX.js} +4 -4
  114. package/dist/{layout-FFCYSTW7.js → layout-AWPST2S3.js} +3 -3
  115. package/dist/{layout-CYNBG5EP.js → layout-BGXLVSXL.js} +4 -4
  116. package/dist/{layout-36Z4NU4W.js → layout-VMDNULKS.js} +5 -5
  117. package/dist/{layout-2DUQIJOI.js → layout-VVTXA3W2.js} +4 -4
  118. package/dist/{parser-LGDW543A.js → parser-2CXA7K5C.js} +4 -4
  119. package/dist/{parser-6OWUGHKY.js → parser-4E2TVMOK.js} +4 -4
  120. package/dist/{parser-2PN2WRYX.js → parser-52AZJ3BA.js} +4 -4
  121. package/dist/{parser-A3B5KVPK.js → parser-52BOCAVQ.js} +4 -4
  122. package/dist/{parser-FNOWLKC4.js → parser-5IPCYVXY.js} +4 -4
  123. package/dist/{parser-U3T76HY2.js → parser-6BF5TJQH.js} +4 -4
  124. package/dist/{parser-SEFSLUXW.js → parser-6VZISXFY.js} +3 -3
  125. package/dist/{parser-VDD3N5SC.js → parser-6Y5BMNNJ.js} +5 -5
  126. package/dist/{parser-LJZIQJRA.js → parser-7HUZBXKW.js} +3 -3
  127. package/dist/{parser-PXI5UCVR.js → parser-AEJ73QJS.js} +3 -3
  128. package/dist/{parser-M7HBD7V2.js → parser-AWNEAGMJ.js} +4 -4
  129. package/dist/{parser-53ALMRAE.js → parser-C2QRTZPJ.js} +4 -4
  130. package/dist/{parser-DLIBNGNQ.js → parser-CBSYFN6U.js} +3 -3
  131. package/dist/{parser-IL4T3HCM.js → parser-CDMP3UVH.js} +4 -4
  132. package/dist/{parser-CDA5DGXA.js → parser-CNKHKQKZ.js} +4 -4
  133. package/dist/{parser-VQKLDBS7.js → parser-EX3AGFT5.js} +4 -4
  134. package/dist/{parser-SOOR27MC.js → parser-GK3JWVHY.js} +5 -5
  135. package/dist/{parser-4VIMOING.js → parser-GZKR6BFA.js} +4 -4
  136. package/dist/{parser-YCRATNR6.js → parser-K26KDCZN.js} +3 -3
  137. package/dist/{parser-SZXKUTVE.js → parser-LTJ5AKY4.js} +4 -4
  138. package/dist/{parser-Q2K7TDEA.js → parser-NIGB4EYX.js} +3 -3
  139. package/dist/{parser-DAMYSBVY.js → parser-O7GTECFP.js} +3 -3
  140. package/dist/{parser-3QXKYLDG.js → parser-OHWDJGCP.js} +3 -3
  141. package/dist/{parser-RZIIZ3EW.js → parser-QCVEWLCO.js} +3 -3
  142. package/dist/{parser-E33LTBYE.js → parser-SUAOF72Y.js} +4 -4
  143. package/dist/{parser-CLDLYMDI.js → parser-TJ3SP2MJ.js} +4 -4
  144. package/dist/{parser-GEELVJ4X.js → parser-W2HXBHNC.js} +3 -3
  145. package/dist/{parser-2QQJFTMD.js → parser-WF4R7225.js} +4 -4
  146. package/dist/{parser-5ETIIQIM.js → parser-XM6JC3UK.js} +4 -4
  147. package/dist/{parser-D5EZ6Y5I.js → parser-XRZQ7SC7.js} +4 -4
  148. package/dist/{parser-ZXI4IQ5Y.js → parser-YRJAGBV7.js} +4 -4
  149. package/dist/{parser-4CEHZFZG.js → parser-Z3LN7P6G.js} +5 -5
  150. package/dist/{parser-52SRJNP4.js → parser-ZIEEBJMU.js} +4 -4
  151. package/dist/{renderer-PR3AGJ37.js → renderer-2MEPYGAP.js} +7 -7
  152. package/dist/{renderer-P2MICJH5.js → renderer-2T2RAFWX.js} +8 -8
  153. package/dist/{renderer-SDCMF5AF.js → renderer-4DFEFP4X.js} +6 -6
  154. package/dist/{renderer-WPGW6FTW.js → renderer-ACGZ5KJG.js} +8 -8
  155. package/dist/{renderer-F75AZ6HF.js → renderer-B4Q6LUW2.js} +6 -6
  156. package/dist/{renderer-WA5K5VWA.js → renderer-CB44E262.js} +8 -8
  157. package/dist/{renderer-3VPTEQBU.js → renderer-CL4X5S3T.js} +6 -6
  158. package/dist/{renderer-PUYQ5CDE.js → renderer-E3UQ24DE.js} +5 -5
  159. package/dist/{renderer-3EN7ZSXI.js → renderer-E42I44WZ.js} +7 -7
  160. package/dist/{renderer-VK6KVXFB.js → renderer-H5QR3LC3.js} +4 -4
  161. package/dist/{renderer-RY7RQQ37.js → renderer-IH5C7NQT.js} +4 -4
  162. package/dist/{renderer-AF6DVUZH.js → renderer-IZFO3G22.js} +8 -8
  163. package/dist/{renderer-EVHFS3PP.js → renderer-JHWGW4Q7.js} +5 -5
  164. package/dist/{renderer-U7INHN4J.js → renderer-K73COK5L.js} +5 -5
  165. package/dist/{renderer-MGYWZFFR.js → renderer-KQIJV5WD.js} +5 -5
  166. package/dist/{renderer-52YQ3EYR.js → renderer-MZ4N2SVV.js} +5 -5
  167. package/dist/{renderer-KLRBL45Z.js → renderer-QMSFXMAL.js} +5 -5
  168. package/dist/{renderer-YZMFPZGC.js → renderer-UPTO25OX.js} +8 -8
  169. package/dist/{renderer-REULT7UI.js → renderer-VEN6AIWW.js} +8 -8
  170. package/dist/{renderer-QOI2SEEA.js → renderer-VOXE7V6L.js} +7 -7
  171. package/dist/{renderer-BT6TOWBE.js → renderer-VP4DPLDY.js} +4 -4
  172. package/dist/{renderer-KVRTLE2D.js → renderer-W7JC2CTQ.js} +4 -4
  173. package/dist/{renderer-XOPHJWNZ.js → renderer-WBG576LB.js} +5 -5
  174. package/dist/{renderer-4LLJHGIQ.js → renderer-WLA3NQCC.js} +7 -7
  175. package/dist/{renderer-UC2ZZISO.js → renderer-XR4SVKNE.js} +6 -6
  176. package/dist/{renderer-Q24E7LBF.js → renderer-Y3D36RIT.js} +6 -6
  177. package/dist/{renderer-SFYFVKVN.js → renderer-Y4VC3VH4.js} +9 -7
  178. package/dist/renderer-YROML2KW.js +76 -0
  179. package/dist/{renderer-RJLAM6G5.js → renderer-YXYEP46H.js} +6 -6
  180. package/dist/{renderer-VTP3QCCP.js → renderer-ZRHTC24Q.js} +7 -7
  181. package/dist/{renderer-radial-AVHNPO2N.js → renderer-radial-KZ3W4WXI.js} +6 -6
  182. package/dist/{state-parser-GSU2ZDVR.js → state-parser-HJNCGIFT.js} +5 -5
  183. package/dist/{state-renderer-Q6XQDK3W.js → state-renderer-FJ2GT4MU.js} +8 -8
  184. package/docs/language-reference.md +22 -1
  185. package/package.json +2 -1
  186. package/dist/collapse-CLPJD2RL.js +0 -11
  187. package/dist/dgmo-router-YFNEFJST.js +0 -89
  188. package/dist/renderer-BQORZPWF.js +0 -76
@@ -6,7 +6,7 @@ import {
6
6
  } from "./chunk-FJ57274M.js";
7
7
  import {
8
8
  ScaleContext
9
- } from "./chunk-YYVTBZZC.js";
9
+ } from "./chunk-24YPR5EH.js";
10
10
  import {
11
11
  serializeSvg
12
12
  } from "./chunk-RU2HHHYA.js";
@@ -16,7 +16,7 @@ import {
16
16
  } from "./chunk-A4GOY3PE.js";
17
17
  import {
18
18
  renderIntegratedLegend
19
- } from "./chunk-VSZRPDIZ.js";
19
+ } from "./chunk-6S53NO3M.js";
20
20
  import {
21
21
  getMaxLegendReservedHeight
22
22
  } from "./chunk-MTPKBSTR.js";
@@ -32,14 +32,14 @@ import {
32
32
  } from "./chunk-MTGGOCND.js";
33
33
  import {
34
34
  parseKanban
35
- } from "./chunk-4FEPSBUH.js";
35
+ } from "./chunk-MKNWMFZU.js";
36
36
  import {
37
37
  tagAttrKey
38
- } from "./chunk-PBXMUXBW.js";
38
+ } from "./chunk-DPGI742S.js";
39
39
  import {
40
40
  fillModeFromOptions,
41
41
  legendSuppressed
42
- } from "./chunk-M2QQQWM3.js";
42
+ } from "./chunk-ZJJWON5O.js";
43
43
  import {
44
44
  contrastText,
45
45
  mix,
@@ -168,6 +168,14 @@ var COLUMN_RADIUS = 8;
168
168
  var COLUMN_HEADER_RADIUS = 8;
169
169
  var COLLAPSED_COLUMN_WIDTH = 40;
170
170
  var COLLAPSED_LANE_HEIGHT = 26;
171
+ var COLLAPSED_CHIP_HEIGHT = 16;
172
+ var COLLAPSED_CHIP_GAP = 4;
173
+ var COLLAPSED_CHIP_INSET = 6;
174
+ var COLLAPSED_CHIP_RADIUS = 5;
175
+ var COLLAPSED_NAME_GAP = 10;
176
+ var COLLAPSED_CHIP_MAX_SLOTS = 4;
177
+ var COLLAPSED_CHIP_MIN_WIDTH = 22;
178
+ var COLLAPSED_CHIP_LABEL_PADDING = 10;
171
179
  function resolveCardTagMeta(card, tagGroups, hiddenMetaGroups) {
172
180
  const meta = [];
173
181
  for (const group of tagGroups) {
@@ -200,7 +208,38 @@ function resolveCardTagColor(card, tagGroups, activeTagGroup) {
200
208
  );
201
209
  return entry?.color;
202
210
  }
203
- function computeLayout(parsed, _palette, collapsedColumns, hiddenMetaGroups, sDiagramPadding = DIAGRAM_PADDING, sTitleHeight = TITLE_HEIGHT, sCardTitleFontSize = CARD_TITLE_FONT_SIZE, sColumnHeaderFontSize = COLUMN_HEADER_FONT_SIZE, sColumnHeaderHeight = COLUMN_HEADER_HEIGHT, sColumnPadding = COLUMN_PADDING, sCardPaddingX = CARD_PADDING_X, sCardPaddingY = CARD_PADDING_Y, sCardSeparatorGap = CARD_SEPARATOR_GAP, sCardMetaLineHeight = CARD_META_LINE_HEIGHT, sCardHeaderHeight = CARD_HEADER_HEIGHT, sCardMetaFontSize = CARD_META_FONT_SIZE, sCardGap = CARD_GAP, sColumnMinWidth = COLUMN_MIN_WIDTH, sColumnGap = COLUMN_GAP, sCollapsedColumnWidth = COLLAPSED_COLUMN_WIDTH) {
211
+ function collapsedChips(cards, group) {
212
+ if (!group) return [];
213
+ const legendOrder = new Map(
214
+ group.entries.map((entry, index) => [entry.value.toLowerCase(), index])
215
+ );
216
+ const tagKey = tagAttrKey(group.name);
217
+ const byValue = /* @__PURE__ */ new Map();
218
+ for (const card of cards) {
219
+ const raw = card.tags[tagKey] ?? group.defaultValue;
220
+ if (!raw) continue;
221
+ const key = raw.toLowerCase();
222
+ const seen = byValue.get(key);
223
+ if (seen) {
224
+ seen.count++;
225
+ continue;
226
+ }
227
+ const entry = group.entries.find((e) => e.value.toLowerCase() === key);
228
+ byValue.set(key, {
229
+ value: entry?.value ?? raw,
230
+ count: 1,
231
+ ...entry?.color !== void 0 && { color: entry.color }
232
+ });
233
+ }
234
+ const rank = (key) => legendOrder.get(key) ?? Number.MAX_SAFE_INTEGER;
235
+ return [...byValue.entries()].sort(
236
+ ([aKey, a], [bKey, b]) => b.count - a.count || rank(aKey) - rank(bKey) || aKey.localeCompare(bKey)
237
+ ).map(([, entry]) => entry);
238
+ }
239
+ function collapsedLaneLabel(laneName, total) {
240
+ return `${laneName} (${total})`;
241
+ }
242
+ function computeLayout(parsed, _palette, collapsedColumns, hiddenMetaGroups, sDiagramPadding = DIAGRAM_PADDING, sTitleHeight = TITLE_HEIGHT, sCardTitleFontSize = CARD_TITLE_FONT_SIZE, sColumnHeaderFontSize = COLUMN_HEADER_FONT_SIZE, sColumnHeaderHeight = COLUMN_HEADER_HEIGHT, sColumnPadding = COLUMN_PADDING, sCardPaddingX = CARD_PADDING_X, sCardPaddingY = CARD_PADDING_Y, sCardSeparatorGap = CARD_SEPARATOR_GAP, sCardMetaLineHeight = CARD_META_LINE_HEIGHT, sCardHeaderHeight = CARD_HEADER_HEIGHT, sCardMetaFontSize = CARD_META_FONT_SIZE, sCardGap = CARD_GAP, sColumnMinWidth = COLUMN_MIN_WIDTH, sColumnGap = COLUMN_GAP, sCollapsedColumnWidth = COLLAPSED_COLUMN_WIDTH, activeTagGroup = null, sCollapsedChipHeight = COLLAPSED_CHIP_HEIGHT, sCollapsedChipGap = COLLAPSED_CHIP_GAP, sCollapsedNameGap = COLLAPSED_NAME_GAP) {
204
243
  const showTitle = !!parsed.title && parsed.options["no-title"] !== "on";
205
244
  const headerHeight = showTitle ? sTitleHeight + 8 : 0;
206
245
  const startY = sDiagramPadding + headerHeight;
@@ -270,6 +309,31 @@ function computeLayout(parsed, _palette, collapsedColumns, hiddenMetaGroups, sDi
270
309
  cardLayouts
271
310
  });
272
311
  }
312
+ const layoutActiveGroup = activeTagGroup ? parsed.tagGroups.find(
313
+ (g) => g.name.toLowerCase() === activeTagGroup.toLowerCase()
314
+ ) : void 0;
315
+ if (layoutActiveGroup) {
316
+ let nameExtent = 0;
317
+ let mostChips = 0;
318
+ for (const col of visibleColumns) {
319
+ if (!(collapsedColumns?.has(col.id) ?? false)) continue;
320
+ nameExtent = Math.max(
321
+ nameExtent,
322
+ measureText(col.name, sCardTitleFontSize, { bold: true })
323
+ );
324
+ mostChips = Math.max(
325
+ mostChips,
326
+ collapsedChips(col.cards, layoutActiveGroup).length
327
+ );
328
+ }
329
+ const slots = Math.min(mostChips, COLLAPSED_CHIP_MAX_SLOTS);
330
+ if (slots > 0) {
331
+ maxColumnHeight = Math.max(
332
+ maxColumnHeight,
333
+ sColumnHeaderHeight + sColumnPadding + nameExtent + sCollapsedNameGap + slots * sCollapsedChipHeight + (slots - 1) * sCollapsedChipGap + sColumnPadding
334
+ );
335
+ }
336
+ }
273
337
  let currentX = sDiagramPadding;
274
338
  for (const cl of columnLayouts) {
275
339
  cl.x = currentX;
@@ -327,6 +391,11 @@ function renderKanban(container, parsed, palette, isDark, options) {
327
391
  const sColumnHeaderRadius = ctx.structural(COLUMN_HEADER_RADIUS);
328
392
  const sCollapsedColumnWidth = ctx.structural(COLLAPSED_COLUMN_WIDTH);
329
393
  const sCollapsedLaneHeight = ctx.structural(COLLAPSED_LANE_HEIGHT);
394
+ const sCollapsedChipHeight = ctx.structural(COLLAPSED_CHIP_HEIGHT);
395
+ const sCollapsedChipGap = ctx.aesthetic(COLLAPSED_CHIP_GAP);
396
+ const sCollapsedChipInset = ctx.aesthetic(COLLAPSED_CHIP_INSET);
397
+ const sCollapsedChipRadius = ctx.structural(COLLAPSED_CHIP_RADIUS);
398
+ const sCollapsedNameGap = ctx.aesthetic(COLLAPSED_NAME_GAP);
330
399
  const sTitleFontSize = ctx.text(TITLE_FONT_SIZE);
331
400
  const sLaneHeaderWidth = ctx.structural(LANE_HEADER_WIDTH);
332
401
  const sLaneGap = ctx.aesthetic(LANE_GAP);
@@ -350,7 +419,11 @@ function renderKanban(container, parsed, palette, isDark, options) {
350
419
  sCardGap,
351
420
  sColumnMinWidth,
352
421
  sColumnGap,
353
- sCollapsedColumnWidth
422
+ sCollapsedColumnWidth,
423
+ activeTagGroup,
424
+ sCollapsedChipHeight,
425
+ sCollapsedChipGap,
426
+ sCollapsedNameGap
354
427
  );
355
428
  const width = exportDims?.width ?? layout.totalWidth;
356
429
  const height = exportDims?.height ?? layout.totalHeight;
@@ -441,12 +514,31 @@ function renderKanban(container, parsed, palette, isDark, options) {
441
514
  sCardPaddingX,
442
515
  sCardStrokeWidth,
443
516
  sCardTitleFontSize,
444
- sCardMetaFontSize
517
+ sCardMetaFontSize,
518
+ {
519
+ height: sCollapsedChipHeight,
520
+ gap: sCollapsedChipGap,
521
+ inset: sCollapsedChipInset,
522
+ radius: sCollapsedChipRadius,
523
+ nameGap: sCollapsedNameGap,
524
+ fontSize: sCardMetaFontSize
525
+ }
445
526
  );
446
527
  return;
447
528
  }
448
529
  const defaultColBg = isDark ? mix(palette.surface, palette.bg, 50) : mix(palette.surface, palette.bg, 30);
449
530
  const defaultColHeaderBg = isDark ? mix(palette.surface, palette.bg, 70) : mix(palette.surface, palette.bg, 50);
531
+ const activeGroup = activeTagGroup ? parsed.tagGroups.find(
532
+ (g) => g.name.toLowerCase() === activeTagGroup.toLowerCase()
533
+ ) : void 0;
534
+ const collapsedNameExtent = layout.columns.reduce(
535
+ (max, cl) => collapsedColumns?.has(cl.column.id) ?? false ? Math.max(
536
+ max,
537
+ measureText(cl.column.name, sCardTitleFontSize, { bold: true })
538
+ ) : max,
539
+ 0
540
+ );
541
+ const collapsedChipTop = sColumnHeaderHeight + sColumnPadding + collapsedNameExtent + sCollapsedNameGap;
450
542
  for (const colLayout of layout.columns) {
451
543
  const col = colLayout.column;
452
544
  const isColCollapsed = collapsedColumns?.has(col.id) ?? false;
@@ -466,6 +558,53 @@ function renderKanban(container, parsed, palette, isDark, options) {
466
558
  g.append("rect").attr("x", colLayout.x).attr("y", colLayout.y).attr("width", sCollapsedColumnWidth).attr("height", sColumnHeaderHeight).attr("rx", sColumnHeaderRadius).attr("fill", thisColHeaderBg);
467
559
  g.append("text").attr("x", colLayout.x + sCollapsedColumnWidth / 2).attr("y", colLayout.y + sColumnHeaderHeight / 2).attr("dominant-baseline", "central").attr("font-size", sWipFontSize).attr("font-weight", "bold").attr("fill", col.color ? onHeaderText : palette.textMuted).attr("text-anchor", "middle").text(String(col.cards.length));
468
560
  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);
561
+ const chips = collapsedChips(col.cards, activeGroup);
562
+ if (chips.length > 0) {
563
+ const chipX = colLayout.x + sCollapsedChipInset;
564
+ const chipW = sCollapsedColumnWidth - sCollapsedChipInset * 2;
565
+ const step = sCollapsedChipHeight + sCollapsedChipGap;
566
+ const room = colLayout.height - collapsedChipTop - sColumnPadding;
567
+ const slots = Math.max(
568
+ 0,
569
+ Math.floor((room + sCollapsedChipGap) / step)
570
+ );
571
+ const shown = chips.length > slots ? Math.max(0, slots - 1) : chips.length;
572
+ const hidden = chips.length - shown;
573
+ const cg = g.append("g").attr("class", "kanban-collapsed-chips");
574
+ const drawChip = (index, fill, stroke, label, title) => {
575
+ const y = colLayout.y + collapsedChipTop + index * step;
576
+ const chip = cg.append("g").attr("class", "kanban-collapsed-chip").attr("data-tag-value", title);
577
+ chip.append("rect").attr("x", chipX).attr("y", y).attr("width", chipW).attr("height", sCollapsedChipHeight).attr("rx", sCollapsedChipRadius).attr("fill", fill).attr("stroke", stroke).attr("stroke-width", 1);
578
+ chip.append("text").attr("x", chipX + chipW / 2).attr("y", y + sCollapsedChipHeight / 2).attr("dominant-baseline", "central").attr("text-anchor", "middle").attr("font-size", sCardMetaFontSize).attr("font-weight", "bold").attr(
579
+ "fill",
580
+ contrastText(
581
+ fill,
582
+ palette.textOnFillLight,
583
+ palette.textOnFillDark
584
+ )
585
+ ).text(label);
586
+ };
587
+ for (let i = 0; i < shown; i++) {
588
+ const chip = chips[i];
589
+ const intent = chip.color ?? palette.textMuted;
590
+ drawChip(
591
+ i,
592
+ shapeFill(palette, intent, isDark, { mode: fillMode }),
593
+ intent,
594
+ String(chip.count),
595
+ chip.value
596
+ );
597
+ }
598
+ if (hidden > 0 && shown < slots) {
599
+ drawChip(
600
+ shown,
601
+ fillMode === "outline" ? baseBg : defaultColHeaderBg,
602
+ palette.textMuted,
603
+ `+${hidden}`,
604
+ `${hidden} more`
605
+ );
606
+ }
607
+ }
469
608
  continue;
470
609
  }
471
610
  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) => {
@@ -558,6 +697,12 @@ function renderKanbanForExport(content, theme, palette) {
558
697
  }
559
698
  var LANE_HEADER_WIDTH = 140;
560
699
  var LANE_GAP = 14;
700
+ var LANE_HEADER_TRIM = 8;
701
+ var LANE_LABEL_X = 10;
702
+ var LANE_DOT_ADVANCE = 14;
703
+ var LANE_LABEL_BASELINE = 20;
704
+ var COLLAPSED_LANE_FONT_SIZE = 10;
705
+ var LANE_FONT_SIZE = 12;
561
706
  function drawSwimlaneIcon(parent, x, y, isActive, palette) {
562
707
  const iconG = parent.append("g").attr("class", "kanban-swimlane-icon").attr("transform", `translate(${x}, ${y})`);
563
708
  iconG.append("rect").attr("x", -5).attr("y", -5).attr("width", 22).attr("height", 18).attr("fill", "transparent");
@@ -611,11 +756,66 @@ function computeCardHeight(card, tagGroups, hiddenMetaGroups, sCardSeparatorGap
611
756
  const metaHeight = metaCount > 0 ? sCardSeparatorGap + 1 + sCardPaddingY + metaCount * sCardMetaLineHeight : 0;
612
757
  return sCardHeaderHeight + sCardPaddingY + metaHeight;
613
758
  }
614
- function computeSwimlaneLayout(parsed, buckets, baseLayout, collapsedLanes, collapsedColumns, hiddenMetaGroups, sDiagramPadding = DIAGRAM_PADDING, sTitleHeight = TITLE_HEIGHT, sLaneHeaderWidth = LANE_HEADER_WIDTH, sColumnGap = COLUMN_GAP, sCollapsedColumnWidth = COLLAPSED_COLUMN_WIDTH, sColumnHeaderHeight = COLUMN_HEADER_HEIGHT, sColumnPadding = COLUMN_PADDING, sCardHeaderHeight = CARD_HEADER_HEIGHT, sCardPaddingY = CARD_PADDING_Y, sCardGap = CARD_GAP, sCollapsedLaneHeight = COLLAPSED_LANE_HEIGHT, sLaneGap = LANE_GAP, sCardSeparatorGap = CARD_SEPARATOR_GAP, sCardMetaLineHeight = CARD_META_LINE_HEIGHT) {
759
+ function computeSwimlaneLayout(parsed, buckets, baseLayout, collapsedLanes, collapsedColumns, hiddenMetaGroups, sDiagramPadding = DIAGRAM_PADDING, sTitleHeight = TITLE_HEIGHT, sLaneHeaderWidth = LANE_HEADER_WIDTH, sColumnGap = COLUMN_GAP, sCollapsedColumnWidth = COLLAPSED_COLUMN_WIDTH, sColumnHeaderHeight = COLUMN_HEADER_HEIGHT, sColumnPadding = COLUMN_PADDING, sCardHeaderHeight = CARD_HEADER_HEIGHT, sCardPaddingY = CARD_PADDING_Y, sCardGap = CARD_GAP, sCollapsedLaneHeight = COLLAPSED_LANE_HEIGHT, sLaneGap = LANE_GAP, sCardSeparatorGap = CARD_SEPARATOR_GAP, sCardMetaLineHeight = CARD_META_LINE_HEIGHT, activeGroup, chipStyle) {
615
760
  const headerHeight = parsed.title && parsed.options["no-title"] !== "on" ? sTitleHeight + 8 : 0;
616
761
  const startY = sDiagramPadding + headerHeight;
762
+ const laneChipsByLane = /* @__PURE__ */ new Map();
763
+ let chipStartX = 0;
764
+ let chipWidth = 0;
765
+ let chipSlots = 0;
766
+ if (activeGroup && chipStyle) {
767
+ let widestLabel = 0;
768
+ for (const bucket of buckets) {
769
+ if (!(collapsedLanes?.has(bucket.laneName) ?? false)) continue;
770
+ const cards = Object.values(bucket.cellsByColumn).flat();
771
+ const chips = collapsedChips(cards, activeGroup);
772
+ if (chips.length === 0) continue;
773
+ laneChipsByLane.set(bucket.laneName, chips);
774
+ chipSlots = Math.max(chipSlots, chips.length);
775
+ widestLabel = Math.max(
776
+ widestLabel,
777
+ LANE_LABEL_X + (bucket.laneColor ? LANE_DOT_ADVANCE : 0) + measureText(
778
+ collapsedLaneLabel(bucket.laneName, cards.length),
779
+ COLLAPSED_LANE_FONT_SIZE
780
+ )
781
+ );
782
+ }
783
+ chipSlots = Math.min(chipSlots, COLLAPSED_CHIP_MAX_SLOTS);
784
+ if (chipSlots > 0) {
785
+ let widestChipLabel = 0;
786
+ for (const chips of laneChipsByLane.values()) {
787
+ const shown = chips.length > chipSlots ? chipSlots - 1 : chips.length;
788
+ for (let i = 0; i < shown; i++) {
789
+ widestChipLabel = Math.max(
790
+ widestChipLabel,
791
+ measureText(String(chips[i].count), chipStyle.fontSize, {
792
+ bold: true
793
+ })
794
+ );
795
+ }
796
+ if (chips.length > shown) {
797
+ widestChipLabel = Math.max(
798
+ widestChipLabel,
799
+ measureText(`+${chips.length - shown}`, chipStyle.fontSize, {
800
+ bold: true
801
+ })
802
+ );
803
+ }
804
+ }
805
+ chipWidth = Math.max(
806
+ COLLAPSED_CHIP_MIN_WIDTH,
807
+ widestChipLabel + COLLAPSED_CHIP_LABEL_PADDING
808
+ );
809
+ chipStartX = widestLabel + chipStyle.nameGap;
810
+ }
811
+ }
812
+ const ribbonWidth = chipSlots > 0 ? chipSlots * chipWidth + (chipSlots - 1) * (chipStyle?.gap ?? 0) : 0;
813
+ const laneHeaderWidth = ribbonWidth > 0 ? Math.max(
814
+ sLaneHeaderWidth,
815
+ chipStartX + ribbonWidth + (chipStyle?.inset ?? 0) + LANE_HEADER_TRIM
816
+ ) : sLaneHeaderWidth;
617
817
  const columnXs = [];
618
- let currentX = sDiagramPadding + sLaneHeaderWidth;
818
+ let currentX = sDiagramPadding + laneHeaderWidth;
619
819
  for (const col of baseLayout.columns) {
620
820
  const isColCollapsed = collapsedColumns?.has(col.column.id) ?? false;
621
821
  const w = isColCollapsed ? sCollapsedColumnWidth : col.width;
@@ -634,7 +834,13 @@ function computeSwimlaneLayout(parsed, buckets, baseLayout, collapsedLanes, coll
634
834
  cards: bucket.cellsByColumn[colInfo.column.id] ?? [],
635
835
  cardLayouts: []
636
836
  }));
637
- lanes.push({ bucket, y: laneY, height: sCollapsedLaneHeight, cells: cells2 });
837
+ lanes.push({
838
+ bucket,
839
+ y: laneY,
840
+ height: sCollapsedLaneHeight,
841
+ cells: cells2,
842
+ chips: laneChipsByLane.get(bucket.laneName) ?? []
843
+ });
638
844
  laneY += sCollapsedLaneHeight + sLaneGap;
639
845
  continue;
640
846
  }
@@ -693,15 +899,35 @@ function computeSwimlaneLayout(parsed, buckets, baseLayout, collapsedLanes, coll
693
899
  }
694
900
  return { column: tmp.column, cards: tmp.cards, cardLayouts };
695
901
  });
696
- lanes.push({ bucket, y: laneY, height: laneHeight, cells });
902
+ lanes.push({ bucket, y: laneY, height: laneHeight, cells, chips: [] });
697
903
  laneY += laneHeight + sLaneGap;
698
904
  }
699
905
  const totalHeight = laneY - sLaneGap + sColumnPadding + sDiagramPadding;
700
- return { columnXs, lanes, totalWidth, totalHeight, startY };
906
+ return {
907
+ columnXs,
908
+ lanes,
909
+ totalWidth,
910
+ totalHeight,
911
+ startY,
912
+ laneHeaderWidth,
913
+ laneChips: { startX: chipStartX, chipWidth, slots: chipSlots }
914
+ };
701
915
  }
702
- function renderSwimlaneBoard(svg, parsed, baseLayout, swimlaneGroup, palette, isDark, activeTagGroup, collapsedLanes, collapsedColumns, hiddenMetaGroups, sDiagramPadding = DIAGRAM_PADDING, sTitleHeight = TITLE_HEIGHT, sLaneHeaderWidth = LANE_HEADER_WIDTH, sColumnGap = COLUMN_GAP, sCollapsedColumnWidth = COLLAPSED_COLUMN_WIDTH, sColumnHeaderHeight = COLUMN_HEADER_HEIGHT, sColumnPadding = COLUMN_PADDING, sCardHeaderHeight = CARD_HEADER_HEIGHT, sCardPaddingY = CARD_PADDING_Y, sCardGap = CARD_GAP, sCollapsedLaneHeight = COLLAPSED_LANE_HEIGHT, sLaneGap = LANE_GAP, sCardSeparatorGap = CARD_SEPARATOR_GAP, sCardMetaLineHeight = CARD_META_LINE_HEIGHT, sColumnHeaderFontSize = COLUMN_HEADER_FONT_SIZE, sColumnRadius = COLUMN_RADIUS, sColumnHeaderRadius = COLUMN_HEADER_RADIUS, sWipFontSize = WIP_FONT_SIZE, sCardRadius = CARD_RADIUS, sCardPaddingX = CARD_PADDING_X, sCardStrokeWidth = CARD_STROKE_WIDTH, sCardTitleFontSize = CARD_TITLE_FONT_SIZE, sCardMetaFontSize = CARD_META_FONT_SIZE) {
916
+ function renderSwimlaneBoard(svg, parsed, baseLayout, swimlaneGroup, palette, isDark, activeTagGroup, collapsedLanes, collapsedColumns, hiddenMetaGroups, sDiagramPadding = DIAGRAM_PADDING, sTitleHeight = TITLE_HEIGHT, sLaneHeaderWidth = LANE_HEADER_WIDTH, sColumnGap = COLUMN_GAP, sCollapsedColumnWidth = COLLAPSED_COLUMN_WIDTH, sColumnHeaderHeight = COLUMN_HEADER_HEIGHT, sColumnPadding = COLUMN_PADDING, sCardHeaderHeight = CARD_HEADER_HEIGHT, sCardPaddingY = CARD_PADDING_Y, sCardGap = CARD_GAP, sCollapsedLaneHeight = COLLAPSED_LANE_HEIGHT, sLaneGap = LANE_GAP, sCardSeparatorGap = CARD_SEPARATOR_GAP, sCardMetaLineHeight = CARD_META_LINE_HEIGHT, sColumnHeaderFontSize = COLUMN_HEADER_FONT_SIZE, sColumnRadius = COLUMN_RADIUS, sColumnHeaderRadius = COLUMN_HEADER_RADIUS, sWipFontSize = WIP_FONT_SIZE, sCardRadius = CARD_RADIUS, sCardPaddingX = CARD_PADDING_X, sCardStrokeWidth = CARD_STROKE_WIDTH, sCardTitleFontSize = CARD_TITLE_FONT_SIZE, sCardMetaFontSize = CARD_META_FONT_SIZE, chipStyle = {
917
+ height: COLLAPSED_CHIP_HEIGHT,
918
+ gap: COLLAPSED_CHIP_GAP,
919
+ inset: COLLAPSED_CHIP_INSET,
920
+ radius: COLLAPSED_CHIP_RADIUS,
921
+ nameGap: COLLAPSED_NAME_GAP,
922
+ fontSize: CARD_META_FONT_SIZE
923
+ }) {
703
924
  const visibleColumns = parsed.columns.filter((c) => !isArchiveColumn(c.name));
704
925
  const buckets = bucketCardsBySwimlane(visibleColumns, swimlaneGroup);
926
+ const fillMode = fillModeFromOptions(parsed.options);
927
+ const baseBg = themeBaseBg(palette, isDark);
928
+ const activeGroup = activeTagGroup && activeTagGroup.toLowerCase() !== swimlaneGroup.name.toLowerCase() ? parsed.tagGroups.find(
929
+ (g) => g.name.toLowerCase() === activeTagGroup.toLowerCase()
930
+ ) : void 0;
705
931
  const grid = computeSwimlaneLayout(
706
932
  parsed,
707
933
  buckets,
@@ -722,7 +948,9 @@ function renderSwimlaneBoard(svg, parsed, baseLayout, swimlaneGroup, palette, is
722
948
  sCollapsedLaneHeight,
723
949
  sLaneGap,
724
950
  sCardSeparatorGap,
725
- sCardMetaLineHeight
951
+ sCardMetaLineHeight,
952
+ activeGroup,
953
+ chipStyle
726
954
  );
727
955
  const currentW = parseFloat(svg.attr("width") || "0");
728
956
  const currentH = parseFloat(svg.attr("height") || "0");
@@ -746,9 +974,7 @@ function renderSwimlaneBoard(svg, parsed, baseLayout, swimlaneGroup, palette, is
746
974
  const col = colInfo.column;
747
975
  const isColCollapsed = collapsedColumns?.has(col.id) ?? false;
748
976
  const headerG = svg.append("g").attr("class", "kanban-column kanban-column-header").attr("data-column-id", col.id).attr("data-line-number", col.lineNumber);
749
- const colHeaderBg = col.color ? shapeFill(palette, col.color, isDark, {
750
- mode: fillModeFromOptions(parsed.options)
751
- }) : defaultColHeaderBg;
977
+ const colHeaderBg = col.color ? shapeFill(palette, col.color, isDark, { mode: fillMode }) : defaultColHeaderBg;
752
978
  headerG.append("rect").attr("x", colInfo.x).attr("y", grid.startY).attr("width", colInfo.width).attr("height", sColumnHeaderHeight).attr("rx", sColumnHeaderRadius).attr("fill", colHeaderBg);
753
979
  if (isColCollapsed) {
754
980
  headerG.append("text").attr("x", colInfo.x + colInfo.width / 2).attr("y", grid.startY + sColumnHeaderHeight / 2).attr("dominant-baseline", "central").attr("font-size", sWipFontSize).attr("font-weight", "bold").attr("fill", palette.textMuted).attr("text-anchor", "middle").text(String(col.cards.length));
@@ -766,17 +992,53 @@ function renderSwimlaneBoard(svg, parsed, baseLayout, swimlaneGroup, palette, is
766
992
  "transform",
767
993
  `translate(${sDiagramPadding}, ${lane.y - sColumnPadding})`
768
994
  );
769
- headerG.append("rect").attr("x", 0).attr("y", 0).attr("width", sLaneHeaderWidth - 8).attr("height", lane.height + sColumnPadding * 2).attr("rx", sColumnRadius).attr("fill", defaultColBg);
770
- let labelX = 10;
995
+ headerG.append("rect").attr("x", 0).attr("y", 0).attr("width", grid.laneHeaderWidth - LANE_HEADER_TRIM).attr("height", lane.height + sColumnPadding * 2).attr("rx", sColumnRadius).attr("fill", defaultColBg);
996
+ let labelX = LANE_LABEL_X;
771
997
  const totalCards = lane.cells.reduce((s, c) => s + c.cards.length, 0);
772
998
  if (lane.bucket.laneColor) {
773
999
  headerG.append("circle").attr("cx", labelX + 4).attr("cy", 16).attr("r", 4).attr("fill", lane.bucket.laneColor);
774
- labelX += 14;
1000
+ labelX += LANE_DOT_ADVANCE;
775
1001
  }
776
1002
  if (isLaneCollapsed) {
777
- headerG.append("text").attr("x", labelX).attr("y", 20).attr("font-size", 10).attr("fill", palette.textMuted).text(`${lane.bucket.laneName} (${totalCards})`);
1003
+ headerG.append("text").attr("x", labelX).attr("y", LANE_LABEL_BASELINE).attr("font-size", COLLAPSED_LANE_FONT_SIZE).attr("fill", palette.textMuted).text(collapsedLaneLabel(lane.bucket.laneName, totalCards));
778
1004
  } else {
779
- headerG.append("text").attr("x", labelX).attr("y", 20).attr("font-size", 12).attr("font-weight", "bold").attr("fill", lane.bucket.isFallback ? palette.textMuted : palette.text).text(lane.bucket.laneName);
1005
+ headerG.append("text").attr("x", labelX).attr("y", LANE_LABEL_BASELINE).attr("font-size", LANE_FONT_SIZE).attr("font-weight", "bold").attr("fill", lane.bucket.isFallback ? palette.textMuted : palette.text).text(lane.bucket.laneName);
1006
+ }
1007
+ if (isLaneCollapsed && lane.chips.length > 0 && grid.laneChips.slots > 0) {
1008
+ const { startX, chipWidth, slots } = grid.laneChips;
1009
+ const shown = lane.chips.length > slots ? Math.max(0, slots - 1) : lane.chips.length;
1010
+ const hidden = lane.chips.length - shown;
1011
+ const step = chipWidth + chipStyle.gap;
1012
+ const chipY = LANE_LABEL_BASELINE - chipStyle.height / 2 - 4;
1013
+ const cg = headerG.append("g").attr("class", "kanban-collapsed-chips");
1014
+ const drawChip = (index, fill, stroke, label, title) => {
1015
+ const chip = cg.append("g").attr("class", "kanban-collapsed-chip").attr("data-tag-value", title);
1016
+ chip.append("rect").attr("x", startX + index * step).attr("y", chipY).attr("width", chipWidth).attr("height", chipStyle.height).attr("rx", chipStyle.radius).attr("fill", fill).attr("stroke", stroke).attr("stroke-width", 1);
1017
+ chip.append("text").attr("x", startX + index * step + chipWidth / 2).attr("y", chipY + chipStyle.height / 2).attr("dominant-baseline", "central").attr("text-anchor", "middle").attr("font-size", chipStyle.fontSize).attr("font-weight", "bold").attr(
1018
+ "fill",
1019
+ contrastText(fill, palette.textOnFillLight, palette.textOnFillDark)
1020
+ ).text(label);
1021
+ };
1022
+ for (let i = 0; i < shown; i++) {
1023
+ const chip = lane.chips[i];
1024
+ const intent = chip.color ?? palette.textMuted;
1025
+ drawChip(
1026
+ i,
1027
+ shapeFill(palette, intent, isDark, { mode: fillMode }),
1028
+ intent,
1029
+ String(chip.count),
1030
+ chip.value
1031
+ );
1032
+ }
1033
+ if (hidden > 0 && shown < slots) {
1034
+ drawChip(
1035
+ shown,
1036
+ fillMode === "outline" ? baseBg : defaultColHeaderBg,
1037
+ palette.textMuted,
1038
+ `+${hidden}`,
1039
+ `${hidden} more`
1040
+ );
1041
+ }
780
1042
  }
781
1043
  if (isLaneCollapsed) {
782
1044
  for (const cell of lane.cells) {
@@ -796,7 +1058,7 @@ function renderSwimlaneBoard(svg, parsed, baseLayout, swimlaneGroup, palette, is
796
1058
  }
797
1059
  }
798
1060
  }
799
- laneG.append("line").attr("x1", sDiagramPadding + sLaneHeaderWidth).attr("x2", grid.totalWidth - sDiagramPadding).attr("y1", lane.y + lane.height + sColumnPadding).attr("y2", lane.y + lane.height + sColumnPadding).attr("stroke", palette.border ?? palette.textMuted).attr("stroke-opacity", 0.4).attr("stroke-width", 1);
1061
+ laneG.append("line").attr("x1", sDiagramPadding + grid.laneHeaderWidth).attr("x2", grid.totalWidth - sDiagramPadding).attr("y1", lane.y + lane.height + sColumnPadding).attr("y2", lane.y + lane.height + sColumnPadding).attr("stroke", palette.border ?? palette.textMuted).attr("stroke-opacity", 0.4).attr("stroke-width", 1);
800
1062
  if (!isLaneCollapsed) {
801
1063
  for (const cell of lane.cells) {
802
1064
  const isColCollapsed = collapsedColumns?.has(cell.column.id) ?? false;
@@ -820,7 +1082,7 @@ function renderSwimlaneBoard(svg, parsed, baseLayout, swimlaneGroup, palette, is
820
1082
  palette,
821
1083
  isDark,
822
1084
  hiddenMetaGroups,
823
- fillModeFromOptions(parsed.options),
1085
+ fillMode,
824
1086
  sCardRadius,
825
1087
  sCardPaddingX,
826
1088
  sCardPaddingY,
@@ -892,4 +1154,4 @@ export {
892
1154
  renderKanban,
893
1155
  renderKanbanForExport
894
1156
  };
895
- //# sourceMappingURL=chunk-JCAINYVG.js.map
1157
+ //# sourceMappingURL=chunk-UKOOGXRF.js.map
@@ -9,13 +9,13 @@ import {
9
9
  matchTagBlockHeading,
10
10
  stripDefaultModifier,
11
11
  tagAttrKey
12
- } from "./chunk-PBXMUXBW.js";
12
+ } from "./chunk-DPGI742S.js";
13
13
  import {
14
14
  extractColor,
15
15
  fillModeFromToken,
16
16
  measureIndent,
17
17
  parseFirstLine
18
- } from "./chunk-M2QQQWM3.js";
18
+ } from "./chunk-ZJJWON5O.js";
19
19
  import {
20
20
  emit
21
21
  } from "./chunk-OLMWTJVU.js";
@@ -264,4 +264,4 @@ export {
264
264
  parseBody,
265
265
  extractSymbols
266
266
  };
267
- //# sourceMappingURL=chunk-ZLPNK7U2.js.map
267
+ //# sourceMappingURL=chunk-UNM2PX5D.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  tryCollectNote
3
- } from "./chunk-HK3JTWG3.js";
3
+ } from "./chunk-MX3BYU7V.js";
4
4
  import {
5
5
  resolveNotes
6
6
  } from "./chunk-7NK42OIB.js";
@@ -16,7 +16,7 @@ import {
16
16
  measureIndent,
17
17
  parseFirstLine,
18
18
  tryParseSharedOption
19
- } from "./chunk-M2QQQWM3.js";
19
+ } from "./chunk-ZJJWON5O.js";
20
20
  import {
21
21
  resolveColorWithDiagnostic
22
22
  } from "./chunk-EXNKNJ65.js";
@@ -445,4 +445,4 @@ export {
445
445
  looksLikeClassDiagram,
446
446
  extractSymbols
447
447
  };
448
- //# sourceMappingURL=chunk-JR6H5MEF.js.map
448
+ //# sourceMappingURL=chunk-UNTFANSM.js.map
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  isTagBlockHeading,
6
6
  matchTagBlockHeading
7
- } from "./chunk-PBXMUXBW.js";
7
+ } from "./chunk-DPGI742S.js";
8
8
  import {
9
9
  makeDgmoError
10
10
  } from "./chunk-OLMWTJVU.js";
@@ -402,4 +402,4 @@ export {
402
402
  normalizePertSourceForShare,
403
403
  resolveOrgImports
404
404
  };
405
- //# sourceMappingURL=chunk-UG3MRJL6.js.map
405
+ //# sourceMappingURL=chunk-UTVKOGFF.js.map
@@ -12,7 +12,7 @@ import {
12
12
  normalizeNumericToken,
13
13
  parseFirstLine,
14
14
  parseSeriesNames
15
- } from "./chunk-M2QQQWM3.js";
15
+ } from "./chunk-ZJJWON5O.js";
16
16
  import {
17
17
  RECOGNIZED_COLOR_NAMES,
18
18
  resolveColorWithDiagnostic
@@ -1204,4 +1204,4 @@ export {
1204
1204
  getSimpleChartLegendGroups,
1205
1205
  getExtendedChartLegendGroups
1206
1206
  };
1207
- //# sourceMappingURL=chunk-MGAWLZQE.js.map
1207
+ //# sourceMappingURL=chunk-UY77QQWU.js.map