@diagrammo/dgmo 0.49.0 → 0.50.1

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 (198) hide show
  1. package/.cursorrules +6 -2
  2. package/.github/copilot-instructions.md +6 -2
  3. package/.windsurfrules +6 -2
  4. package/SKILL.md +6 -2
  5. package/dist/advanced.js +557 -195
  6. package/dist/auto.js +129 -119
  7. package/dist/auto.mjs +19496 -12761
  8. package/dist/block.js +145 -48
  9. package/dist/{charts-d3-EW3YQTEA.js → charts-d3-LR6D3D7A.js} +5 -5
  10. package/dist/{chunk-5FGDJIJX.js → chunk-2C56LEML.js} +3 -3
  11. package/dist/{chunk-XJ7J6WOO.js → chunk-2KGXHFYK.js} +4 -4
  12. package/dist/{chunk-T7IKPCMI.js → chunk-3LH5CLP4.js} +3 -3
  13. package/dist/{chunk-ZDUQGL3N.js → chunk-3LKM6FMW.js} +2 -2
  14. package/dist/{chunk-4FIV4K4Z.js → chunk-3NODSS6A.js} +7 -7
  15. package/dist/{chunk-4BD7EVPK.js → chunk-3P2DKJCG.js} +2 -2
  16. package/dist/{chunk-TC3YWBFO.js → chunk-3UIKSPFB.js} +35 -9
  17. package/dist/{chunk-SJEGO2QL.js → chunk-3XGZF2QJ.js} +4 -4
  18. package/dist/chunk-3XPUDB7B.js +420 -0
  19. package/dist/{chunk-O5MQPK7E.js → chunk-3Y2DRD7S.js} +3 -3
  20. package/dist/chunk-3YPY3OXD.js +354 -0
  21. package/dist/{chunk-N4J5KGWG.js → chunk-4MJ7M6YL.js} +8 -8
  22. package/dist/{chunk-JFPY3UJ7.js → chunk-4S52SK6G.js} +8 -8
  23. package/dist/{chunk-ALRHIR6I.js → chunk-5GJYGP5Z.js} +4 -4
  24. package/dist/{chunk-SQDFK5ZQ.js → chunk-5OWVC2A6.js} +3 -3
  25. package/dist/{chunk-7VLUGEMJ.js → chunk-66NVRO4K.js} +4 -4
  26. package/dist/{chunk-ZREZOIGS.js → chunk-66RUL3XF.js} +6 -6
  27. package/dist/{chunk-MJCG5K2O.js → chunk-6BFZKBGD.js} +2 -2
  28. package/dist/{chunk-2WMBWZY2.js → chunk-6HJBFVLO.js} +3 -3
  29. package/dist/{chunk-XCC2RENT.js → chunk-6IAA2QQ2.js} +2 -2
  30. package/dist/{chunk-B57V3DWN.js → chunk-7L3R6I3U.js} +3 -3
  31. package/dist/chunk-7PQYTZMA.js +681 -0
  32. package/dist/{chunk-6SA7FJE4.js → chunk-7QKLIMRZ.js} +10 -10
  33. package/dist/{chunk-YTN572Q2.js → chunk-7TV5Y53Y.js} +2 -2
  34. package/dist/{chunk-6CLKNXVP.js → chunk-BBGDM4NQ.js} +457 -78
  35. package/dist/{chunk-3NFJWFNP.js → chunk-BDXC7MDK.js} +1045 -124
  36. package/dist/{chunk-D5AVQCDN.js → chunk-BH3UYK36.js} +3 -3
  37. package/dist/chunk-BTUTZMPT.js +482 -0
  38. package/dist/{chunk-LVHPTBO3.js → chunk-C2CVAM3U.js} +4 -4
  39. package/dist/{chunk-BCT5G2VN.js → chunk-DFTFPYUD.js} +5 -5
  40. package/dist/{chunk-KV6Y2HE6.js → chunk-DSWVNQVS.js} +4 -4
  41. package/dist/{chunk-4YNP6O47.js → chunk-DZXYF2F5.js} +13 -3
  42. package/dist/{chunk-FUCAB3KQ.js → chunk-EAMEADTV.js} +3 -3
  43. package/dist/chunk-FA6K3FWM.js +940 -0
  44. package/dist/{chunk-HBVD67XG.js → chunk-FJUNPCYI.js} +2 -2
  45. package/dist/{chunk-6VE3VLWM.js → chunk-GBE54KY6.js} +6 -5
  46. package/dist/{chunk-YRVLP7UU.js → chunk-GKC3HILQ.js} +4 -4
  47. package/dist/{chunk-ZXL6MB4R.js → chunk-GL5UZ6NY.js} +3 -3
  48. package/dist/{chunk-GB3YZTAM.js → chunk-H73FP42Q.js} +5 -5
  49. package/dist/{chunk-4UDKKGHH.js → chunk-HEVYAHLW.js} +2 -2
  50. package/dist/{chunk-DDTJ5N7Q.js → chunk-HLJVEAOF.js} +6 -6
  51. package/dist/{chunk-CLR4A2N2.js → chunk-HTMN2Z6U.js} +4 -4
  52. package/dist/{chunk-TLKMTQYL.js → chunk-I2WKW7C7.js} +3 -3
  53. package/dist/{chunk-IUK7AGD4.js → chunk-I7F2A35O.js} +2 -2
  54. package/dist/{chunk-IBC35BTK.js → chunk-IUMPEA64.js} +2 -2
  55. package/dist/{chunk-5XCM7UUW.js → chunk-J6K7RP6P.js} +100 -36
  56. package/dist/{chunk-AJ2PEY7J.js → chunk-JJUOHGX2.js} +2 -2
  57. package/dist/{chunk-CEHZOPGM.js → chunk-KFZYNWWO.js} +2 -2
  58. package/dist/{chunk-4NQ3IKUM.js → chunk-KHEYDLMT.js} +5 -5
  59. package/dist/{chunk-YM2BSPYW.js → chunk-LE4MYMLI.js} +2 -2
  60. package/dist/{chunk-PU3AUQPA.js → chunk-M5RXSRO2.js} +2 -2
  61. package/dist/{chunk-XKTN7CZF.js → chunk-MCZ5LBZD.js} +4 -4
  62. package/dist/{chunk-35BBZDFE.js → chunk-NU3XLTGP.js} +4 -4
  63. package/dist/{chunk-BPIJLRYE.js → chunk-NWED7CYO.js} +3 -3
  64. package/dist/{chunk-YYX3SU6H.js → chunk-OMNGQPEZ.js} +257 -101
  65. package/dist/{chunk-BGJV5ATD.js → chunk-ONA5KPV3.js} +2 -2
  66. package/dist/{chunk-ZNQX6QWH.js → chunk-OTAL43EH.js} +6 -2
  67. package/dist/{chunk-F743CM2N.js → chunk-OTQKUHRS.js} +3 -3
  68. package/dist/{chunk-KUBBJ2CD.js → chunk-P7CE7LXL.js} +6 -6
  69. package/dist/{chunk-UVCXZEGU.js → chunk-PFHVU7UA.js} +2 -2
  70. package/dist/{chunk-5ZZLLBFK.js → chunk-PGEGPSCZ.js} +2 -2
  71. package/dist/chunk-Q4V4XQWV.js +158 -0
  72. package/dist/{chunk-IHLSHCPZ.js → chunk-QJP6PG7F.js} +5 -5
  73. package/dist/{chunk-EYN7VFKL.js → chunk-QROYX7TT.js} +3 -3
  74. package/dist/chunk-QXKWYZNR.js +379 -0
  75. package/dist/{chunk-VC3TR4NL.js → chunk-RZ6YKEUJ.js} +3 -3
  76. package/dist/{chunk-K6HNAY5V.js → chunk-SCHXJTZL.js} +2 -2
  77. package/dist/{chunk-7OVSJI2V.js → chunk-SQLNBA64.js} +3 -3
  78. package/dist/{chunk-65RTDUZH.js → chunk-SXRTRMEE.js} +3 -3
  79. package/dist/{chunk-3BIAFYD2.js → chunk-T4VOVZT5.js} +2 -2
  80. package/dist/{chunk-UWDO3O52.js → chunk-TN35C5KM.js} +2 -2
  81. package/dist/{chunk-IFK3GIUW.js → chunk-TSA237IM.js} +2 -2
  82. package/dist/{chunk-DKEPS5LH.js → chunk-U2HGPLZS.js} +36 -2
  83. package/dist/{chunk-4HVNZ7WF.js → chunk-VBYSIOOY.js} +3 -3
  84. package/dist/{chunk-ZTLWVRNS.js → chunk-VDOOQZUD.js} +2 -2
  85. package/dist/{chunk-RTERS6S5.js → chunk-VUJGMJE6.js} +4 -4
  86. package/dist/{chunk-X2CH42BN.js → chunk-VVW3F3MD.js} +7 -7
  87. package/dist/{chunk-RI4NIMFP.js → chunk-VVZRV54S.js} +75 -35
  88. package/dist/{chunk-LG4TWW4U.js → chunk-WW32K72E.js} +8 -8
  89. package/dist/{chunk-NVT6C2VE.js → chunk-X6EZPSW6.js} +4 -4
  90. package/dist/{chunk-KQAEKMIX.js → chunk-XDXNDSKO.js} +2 -2
  91. package/dist/{chunk-FMKTYMP4.js → chunk-XJLKLU4D.js} +3 -3
  92. package/dist/chunk-Y4RNXEAO.js +952 -0
  93. package/dist/{chunk-26RVGM44.js → chunk-YIA4LEX4.js} +15 -7
  94. package/dist/chunk-YNRDWYZP.js +295 -0
  95. package/dist/{chunk-SGHSY3LU.js → chunk-Z6XJQ6KO.js} +81 -6
  96. package/dist/{chunk-SVDWQGX2.js → chunk-ZAD4HV2G.js} +139 -78
  97. package/dist/cli.cjs +153 -144
  98. package/dist/clock.d.ts +10 -0
  99. package/dist/clock.js +235 -0
  100. package/dist/countdown.d.ts +12 -0
  101. package/dist/countdown.js +450 -0
  102. package/dist/dgmo-router-YTU3ENAX.js +84 -0
  103. package/dist/{dimensions-WSIJXT5Q.js → dimensions-OTBKC5M6.js} +5 -5
  104. package/dist/editor.js +39 -1
  105. package/dist/element.js +131 -121
  106. package/dist/element.mjs +19496 -12761
  107. package/dist/{flowchart-parser-IVZN7CQN.js → flowchart-parser-OE4WHLTF.js} +4 -4
  108. package/dist/{flowchart-renderer-GMI2U3DD.js → flowchart-renderer-GPCSMTOR.js} +6 -6
  109. package/dist/highlight.d.ts +17 -1
  110. package/dist/highlight.js +156 -5
  111. package/dist/index.js +50 -45
  112. package/dist/{layout-HQMBPJVS.js → layout-46366KBT.js} +2 -2
  113. package/dist/{layout-D42XE4RE.js → layout-5BG6DFCU.js} +3 -3
  114. package/dist/{layout-K2ZN3Q42.js → layout-7MZ5NF2N.js} +4 -4
  115. package/dist/{layout-4Z5JM7PT.js → layout-FWODLIMP.js} +4 -4
  116. package/dist/{layout-GZ2CWONU.js → layout-J36454XU.js} +4 -4
  117. package/dist/{layout-S3EK4IYO.js → layout-LD6XTLD6.js} +4 -4
  118. package/dist/{parser-CLMFZWCC.js → parser-36HVKU5U.js} +5 -5
  119. package/dist/{parser-MCJWF5G3.js → parser-4AI5ZN5F.js} +3 -3
  120. package/dist/{parser-DERPY5KC.js → parser-4NO6VZ6S.js} +4 -4
  121. package/dist/parser-4WQQQXCG.js +13 -0
  122. package/dist/{parser-4ROBKVUR.js → parser-5OXGPNBF.js} +5 -5
  123. package/dist/{parser-XWUDFJ7P.js → parser-AGVYTQXV.js} +4 -4
  124. package/dist/{parser-TITK4YW6.js → parser-AXKBDGNO.js} +5 -5
  125. package/dist/parser-B5FVS7O6.js +11 -0
  126. package/dist/parser-CSFUN3CT.js +14 -0
  127. package/dist/parser-CVMEDULU.js +15 -0
  128. package/dist/{parser-KPMN5KKE.js → parser-D5VILGN2.js} +4 -4
  129. package/dist/{parser-IKZFTLOJ.js → parser-DFFEDKHH.js} +3 -3
  130. package/dist/{parser-JD7OQ2E6.js → parser-H3XEPFPV.js} +4 -4
  131. package/dist/{parser-UBGPTIZD.js → parser-HYRTF3DO.js} +3 -3
  132. package/dist/{parser-K647FRI4.js → parser-IBWNAPY4.js} +3 -3
  133. package/dist/{parser-4BKIFG2C.js → parser-IJBMRXMC.js} +5 -5
  134. package/dist/{parser-MBJSBTL5.js → parser-JJR52VAT.js} +5 -5
  135. package/dist/{parser-SMBJO3XN.js → parser-K3XXLMUW.js} +4 -4
  136. package/dist/{parser-OBQG655V.js → parser-KCR2WS3V.js} +4 -4
  137. package/dist/{parser-HVJFTOXL.js → parser-LWKKBNSA.js} +3 -3
  138. package/dist/{parser-ZYC3XGNS.js → parser-MPCE5JBG.js} +4 -4
  139. package/dist/{parser-QJYS7KQQ.js → parser-MTOMTWTD.js} +4 -4
  140. package/dist/{parser-GFSOPDB7.js → parser-O4HIUN6G.js} +4 -4
  141. package/dist/{parser-BL7Z72EY.js → parser-PSA4UBSP.js} +4 -4
  142. package/dist/{parser-TNYX5S7E.js → parser-RV4M6AS2.js} +4 -4
  143. package/dist/parser-RZPVAQVX.js +11 -0
  144. package/dist/{parser-UGA23PYK.js → parser-TGQZJ5OT.js} +4 -4
  145. package/dist/parser-TXND652E.js +13 -0
  146. package/dist/{parser-WISPH7LW.js → parser-VKOJM7KS.js} +4 -4
  147. package/dist/{parser-ZKF5K2H2.js → parser-W4PQUGX3.js} +4 -4
  148. package/dist/{parser-MRBPXXIV.js → parser-WAV5JRPT.js} +4 -4
  149. package/dist/{parser-D6ONJQFR.js → parser-YS7TOS2K.js} +3 -3
  150. package/dist/pert.d.ts +8 -0
  151. package/dist/{renderer-VFUVRNLK.js → renderer-2AZ5HJFK.js} +4 -4
  152. package/dist/{renderer-V3JEMWMM.js → renderer-2QPMJ2DA.js} +6 -6
  153. package/dist/renderer-45PSOL3E.js +19 -0
  154. package/dist/{renderer-BB5PREMY.js → renderer-4ITCHBT7.js} +4 -4
  155. package/dist/{renderer-XEKIRPI6.js → renderer-5DSEWF74.js} +5 -5
  156. package/dist/{renderer-QNHUXCRL.js → renderer-6OKF44KS.js} +9 -9
  157. package/dist/renderer-72LGR2YF.js +14 -0
  158. package/dist/{renderer-YHXPN3GF.js → renderer-7SD6MSBS.js} +7 -7
  159. package/dist/renderer-A5VE5BCI.js +24 -0
  160. package/dist/{renderer-A5VFZQQK.js → renderer-AUW2BE6G.js} +6 -6
  161. package/dist/{renderer-LWGJFT3D.js → renderer-B5TBNZJE.js} +5 -5
  162. package/dist/{renderer-4IUPINAE.js → renderer-BSR2O2H6.js} +7 -7
  163. package/dist/{renderer-DKESNMU5.js → renderer-CYB4LK3G.js} +6 -6
  164. package/dist/{renderer-MFJ7HY2H.js → renderer-FF24KZCI.js} +5 -5
  165. package/dist/{renderer-CGW7QPNA.js → renderer-FPE3J5VZ.js} +7 -7
  166. package/dist/{renderer-6T3KK4S3.js → renderer-FYSVXL7M.js} +7 -7
  167. package/dist/{renderer-THD6V5TL.js → renderer-HDCCZURL.js} +9 -7
  168. package/dist/{renderer-TPIBXNOS.js → renderer-JCCHNECZ.js} +6 -6
  169. package/dist/{renderer-QL5KO6SK.js → renderer-KS7YZJE2.js} +7 -7
  170. package/dist/{renderer-SQ3JUAI7.js → renderer-NGXZTRK6.js} +6 -6
  171. package/dist/{renderer-MJDDU27W.js → renderer-ODUUOPVT.js} +10 -10
  172. package/dist/renderer-PJM35LJN.js +17 -0
  173. package/dist/{renderer-TYXRHMRI.js → renderer-PPIHO5FI.js} +9 -9
  174. package/dist/{renderer-W5RMOURB.js → renderer-PSMMZCKH.js} +6 -6
  175. package/dist/{renderer-UZF3JROD.js → renderer-QAOBLRXV.js} +8 -8
  176. package/dist/{renderer-ROV756WT.js → renderer-R2WNIC2C.js} +5 -5
  177. package/dist/{renderer-VICQ4WNY.js → renderer-SBS3YWU5.js} +5 -5
  178. package/dist/{renderer-6L3NBEY5.js → renderer-UYMQQCJK.js} +6 -6
  179. package/dist/{renderer-radial-MHO2VDXN.js → renderer-radial-F7X5F2VU.js} +6 -6
  180. package/dist/{state-parser-RX3GXOIB.js → state-parser-3REXRK3R.js} +4 -4
  181. package/dist/{state-renderer-AJUKGNWU.js → state-renderer-XYLNRWXR.js} +6 -6
  182. package/docs/ai-integration.md +6 -2
  183. package/docs/language-reference.md +253 -22
  184. package/gallery/fixtures/body.dgmo +17 -0
  185. package/gallery/fixtures/bracket.dgmo +30 -0
  186. package/gallery/fixtures/clock.dgmo +8 -0
  187. package/gallery/fixtures/countdown.dgmo +3 -0
  188. package/gallery/fixtures/goal.dgmo +4 -0
  189. package/package.json +12 -4
  190. package/dist/advanced.d.ts +0 -6162
  191. package/dist/auto.d.ts +0 -54
  192. package/dist/block.d.ts +0 -123
  193. package/dist/dgmo-router-ODKPEJ3P.js +0 -79
  194. package/dist/element.d.ts +0 -62
  195. package/dist/index.d.ts +0 -166
  196. package/dist/parser-667RGSUW.js +0 -13
  197. package/dist/parser-J3P2D6IP.js +0 -13
  198. package/dist/themes-1-CuKpeH.d.ts +0 -908
@@ -6,10 +6,10 @@ import {
6
6
  tagAttrKey,
7
7
  validateTagGroupNames,
8
8
  validateTagValues
9
- } from "./chunk-HBVD67XG.js";
9
+ } from "./chunk-FJUNPCYI.js";
10
10
  import {
11
11
  tryCollectNote
12
- } from "./chunk-K6HNAY5V.js";
12
+ } from "./chunk-SCHXJTZL.js";
13
13
  import {
14
14
  resolveNotes
15
15
  } from "./chunk-FMDSF3OV.js";
@@ -32,7 +32,7 @@ import {
32
32
  tryParseSharedOption,
33
33
  warnUnknownMetaKeys,
34
34
  withTagAliases
35
- } from "./chunk-ZNQX6QWH.js";
35
+ } from "./chunk-OTAL43EH.js";
36
36
  import {
37
37
  resolveColorWithDiagnostic
38
38
  } from "./chunk-TLVIHFRO.js";
@@ -521,4 +521,4 @@ export {
521
521
  looksLikeERDiagram,
522
522
  extractSymbols
523
523
  };
524
- //# sourceMappingURL=chunk-35BBZDFE.js.map
524
+ //# sourceMappingURL=chunk-NU3XLTGP.js.map
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-YYVTBZZC.js";
8
8
  import {
9
9
  renderIntegratedLegend
10
- } from "./chunk-4UDKKGHH.js";
10
+ } from "./chunk-HEVYAHLW.js";
11
11
  import {
12
12
  controlsGroupCapsuleWidth,
13
13
  getMaxLegendReservedHeight
@@ -50,7 +50,7 @@ import {
50
50
  resolveActiveTagGroup,
51
51
  resolveTagColor,
52
52
  tagAttrKey
53
- } from "./chunk-HBVD67XG.js";
53
+ } from "./chunk-FJUNPCYI.js";
54
54
  import {
55
55
  normalizeName
56
56
  } from "./chunk-NOTA6TEI.js";
@@ -2101,4 +2101,4 @@ export {
2101
2101
  renderGantt,
2102
2102
  buildTagLaneRowList
2103
2103
  };
2104
- //# sourceMappingURL=chunk-BPIJLRYE.js.map
2104
+ //# sourceMappingURL=chunk-NWED7CYO.js.map
@@ -4,12 +4,12 @@ import {
4
4
  matchTagBlockHeading,
5
5
  stripDefaultModifier,
6
6
  tagAttrKey
7
- } from "./chunk-HBVD67XG.js";
7
+ } from "./chunk-FJUNPCYI.js";
8
8
  import {
9
9
  extractColor,
10
10
  measureIndent,
11
11
  parseFirstLine
12
- } from "./chunk-ZNQX6QWH.js";
12
+ } from "./chunk-OTAL43EH.js";
13
13
  import {
14
14
  emit
15
15
  } from "./chunk-CXK4DZH3.js";
@@ -22,10 +22,9 @@ var SWIMLANE_DX = {
22
22
  chartType: "swimlane",
23
23
  title: "Duplicate node",
24
24
  message: (p) => `Duplicate node name '${p.name ?? "Foo"}'`,
25
- hint: "Every node name must be unique across the diagram \u2014 rename or remove the second declaration.",
25
+ hint: "Within a lane a node name must be unique \u2014 rename or remove the second declaration (different lanes may reuse a name).",
26
26
  example: `swimlane T
27
27
  lane L
28
- L
29
28
  Foo
30
29
  Foo`
31
30
  },
@@ -35,12 +34,23 @@ L
35
34
  chartType: "swimlane",
36
35
  title: "Unknown node in edge",
37
36
  message: (p) => `Edge references unknown node '${p.node ?? "Bar"}'`,
38
- hint: "Declare the node under a lane before referencing it in a flow arrow.",
37
+ hint: "A bare-task target must be declared as a line-head in some lane; delimited endpoints ((\u2026)/<\u2026>/[[\u2026]]) auto-create. Check for a typo, or qualify a cross-lane name as Lane.Node.",
39
38
  example: `swimlane T
40
39
  lane L
41
- L
42
- Foo
43
- Foo -> Bar`
40
+ Foo -> Bar`
41
+ },
42
+ AMBIGUOUS_NODE: {
43
+ code: "E_SWIMLANE_AMBIGUOUS_NODE",
44
+ severity: "warning",
45
+ chartType: "swimlane",
46
+ title: "Ambiguous node reference",
47
+ message: (p) => `Node '${p.node ?? "Review"}' is declared in more than one lane${p.lanes ? ` (${p.lanes})` : ""} \u2014 qualify it as Lane.${p.node ?? "Review"}`,
48
+ hint: "Two lanes hold a node with this name. Prefix the reference with its lane (`Customs.Inspect`) to pick one; resolved to the first match otherwise.",
49
+ example: `swimlane T
50
+ lane Customs
51
+ Customs.Inspect -> Harbor.Inspect
52
+ lane Harbor
53
+ Harbor.Inspect`
44
54
  },
45
55
  UNKNOWN_LANE: {
46
56
  code: "E_SWIMLANE_UNKNOWN_LANE",
@@ -205,7 +215,6 @@ function parseSwimlane(content, palette) {
205
215
  const tagGroups = [];
206
216
  const laneByKey = /* @__PURE__ */ new Map();
207
217
  const phaseByKey = /* @__PURE__ */ new Map();
208
- const nodeByKey = /* @__PURE__ */ new Map();
209
218
  const metaAliasMap = /* @__PURE__ */ new Map();
210
219
  const options = {};
211
220
  let direction = "LR";
@@ -299,7 +308,7 @@ function parseSwimlane(content, palette) {
299
308
  }
300
309
  continue;
301
310
  }
302
- if (indent === 0 && /^lane\s+/i.test(trimmed)) {
311
+ if (/^lane\s+/i.test(trimmed)) {
303
312
  const rest = trimmed.replace(/^lane\s+/i, "").trim();
304
313
  const { label, color } = extractColor(
305
314
  rest,
@@ -321,39 +330,22 @@ function parseSwimlane(content, palette) {
321
330
  }
322
331
  if (indent === 0 && !trimmed.startsWith("tag ")) sawContent = true;
323
332
  }
324
- let currentPhase = null;
325
- let currentLane = null;
326
- let laneIndent = -1;
327
- let currentFlowSource = null;
328
- const declareNode = (token, meta, lineNum) => {
329
- const parsed = parseNodeToken(token);
330
- if (parsed.unsupported) {
331
- diagnostics.push(
332
- emit(SWIMLANE_DX.UNSUPPORTED, lineNum, { reason: parsed.unsupported })
333
- );
334
- return;
335
- }
336
- if (!parsed.label) return;
337
- if (!currentLane) {
338
- diagnostics.push(
339
- emit(SWIMLANE_DX.UNKNOWN_LANE, lineNum, { node: parsed.label })
340
- );
341
- return;
333
+ const drafts = [];
334
+ const draftByKey = /* @__PURE__ */ new Map();
335
+ const draftsByLabel = /* @__PURE__ */ new Map();
336
+ const rawEdges = [];
337
+ const laneKey = (laneId, label) => `${normKey(laneId)}\0${normKey(label)}`;
338
+ const splitQualifier = (token) => {
339
+ const t = token.trim();
340
+ if (/^[<([]/.test(t)) return { rest: t };
341
+ const dot = t.indexOf(".");
342
+ if (dot > 0) {
343
+ const lane = laneByKey.get(normKey(t.slice(0, dot)));
344
+ if (lane) return { laneId: lane.id, rest: t.slice(dot + 1).trim() };
342
345
  }
343
- const { label: cleanLabel, color } = extractColor(
344
- parsed.label,
345
- palette,
346
- diagnostics,
347
- lineNum
348
- );
349
- const key = normKey(cleanLabel);
350
- if (nodeByKey.has(key)) {
351
- diagnostics.push(
352
- emit(SWIMLANE_DX.DUPLICATE_NODE, lineNum, { name: cleanLabel })
353
- );
354
- return;
355
- }
356
- const tags = {};
346
+ return { rest: t };
347
+ };
348
+ const applyMeta = (draft, meta, lineNum) => {
357
349
  for (const [k, v] of Object.entries(meta)) {
358
350
  if (k === "note") {
359
351
  diagnostics.push(
@@ -380,75 +372,147 @@ function parseSwimlane(content, palette) {
380
372
  continue;
381
373
  }
382
374
  const canonical = metaAliasMap.get(k) ?? k;
383
- tags[canonical] = v;
375
+ draft.tags[canonical] = v;
384
376
  }
385
- const node = {
377
+ };
378
+ const registerDraft = (draft) => {
379
+ draftByKey.set(laneKey(draft.laneId, draft.label), draft);
380
+ const nk = normKey(draft.label);
381
+ (draftsByLabel.get(nk) ?? draftsByLabel.set(nk, []).get(nk)).push(draft);
382
+ drafts.push(draft);
383
+ };
384
+ const mergeDraft = (draft, parsed, color) => {
385
+ if (draft.shape === "task" && parsed.shape !== "task")
386
+ draft.shape = parsed.shape;
387
+ if (draft.event === "none" && parsed.event !== "none")
388
+ draft.event = parsed.event;
389
+ if (draft.color === void 0 && color !== void 0) draft.color = color;
390
+ };
391
+ const declareInLane = (rawText, laneId, phaseId, bare, lineNum) => {
392
+ const { token, meta } = splitNodeMeta(rawText);
393
+ const { rest } = splitQualifier(token);
394
+ const parsed = parseNodeToken(rest);
395
+ if (parsed.unsupported) {
396
+ diagnostics.push(
397
+ emit(SWIMLANE_DX.UNSUPPORTED, lineNum, { reason: parsed.unsupported })
398
+ );
399
+ return null;
400
+ }
401
+ if (!parsed.label) return null;
402
+ const { label: cleanLabel, color } = extractColor(
403
+ parsed.label,
404
+ palette,
405
+ diagnostics,
406
+ lineNum
407
+ );
408
+ const key = laneKey(laneId, cleanLabel);
409
+ const existing = draftByKey.get(key);
410
+ if (existing) {
411
+ if (bare && existing.hasBareDecl) {
412
+ diagnostics.push(
413
+ emit(SWIMLANE_DX.DUPLICATE_NODE, lineNum, { name: cleanLabel })
414
+ );
415
+ return existing;
416
+ }
417
+ mergeDraft(existing, parsed, color);
418
+ if (bare) existing.hasBareDecl = true;
419
+ if (existing.phaseId === void 0 && phaseId !== void 0)
420
+ existing.phaseId = phaseId;
421
+ applyMeta(existing, meta, lineNum);
422
+ return existing;
423
+ }
424
+ const draft = {
386
425
  id: cleanLabel,
387
426
  label: cleanLabel,
427
+ laneId,
428
+ ...phaseId !== void 0 && { phaseId },
388
429
  shape: parsed.shape,
389
430
  event: parsed.event,
390
- lane: currentLane.id,
391
- ...currentPhase && { phase: currentPhase.id },
392
431
  ...color !== void 0 && { color },
393
- tags,
394
- lineNumber: lineNum
432
+ tags: {},
433
+ lineNumber: lineNum,
434
+ hasBareDecl: bare
395
435
  };
396
- nodes.push(node);
397
- nodeByKey.set(key, node);
436
+ applyMeta(draft, meta, lineNum);
437
+ registerDraft(draft);
438
+ return draft;
398
439
  };
399
- const resolveRef = (token, lineNum) => {
400
- const parsed = parseNodeToken(token);
440
+ const resolveEndpoint = (rawText, laneId, phaseId, lineNum) => {
441
+ const { token, meta } = splitNodeMeta(rawText);
442
+ const { laneId: qLane, rest } = splitQualifier(token);
443
+ const parsed = parseNodeToken(rest);
401
444
  if (parsed.unsupported) {
402
445
  diagnostics.push(
403
446
  emit(SWIMLANE_DX.UNSUPPORTED, lineNum, { reason: parsed.unsupported })
404
447
  );
405
448
  return null;
406
449
  }
407
- const { label } = extractColor(parsed.label, palette);
408
- const key = normKey(label);
409
- const node = nodeByKey.get(key);
410
- if (!node) {
450
+ const { label: cleanLabel } = extractColor(parsed.label, palette);
451
+ const nk = normKey(cleanLabel);
452
+ const delimited = parsed.shape !== "task";
453
+ const finish = (d) => {
454
+ applyMeta(d, meta, lineNum);
455
+ return d;
456
+ };
457
+ const implicit = (owner) => {
458
+ const draft = {
459
+ id: cleanLabel,
460
+ label: cleanLabel,
461
+ laneId: owner,
462
+ ...phaseId !== void 0 && { phaseId },
463
+ shape: parsed.shape,
464
+ event: parsed.event,
465
+ tags: {},
466
+ lineNumber: lineNum,
467
+ hasBareDecl: false
468
+ };
469
+ applyMeta(draft, meta, lineNum);
470
+ registerDraft(draft);
471
+ return draft;
472
+ };
473
+ if (qLane) {
474
+ const hit = draftByKey.get(laneKey(qLane, cleanLabel));
475
+ if (hit) return finish(hit);
476
+ if (delimited) return implicit(qLane);
411
477
  diagnostics.push(
412
- emit(SWIMLANE_DX.UNKNOWN_NODE, lineNum, { node: parsed.label })
478
+ emit(SWIMLANE_DX.UNKNOWN_NODE, lineNum, {
479
+ node: `${qLane}.${cleanLabel}`
480
+ })
413
481
  );
414
482
  return null;
415
483
  }
416
- return node.id;
417
- };
418
- const addChain = (line, lineNum) => {
419
- if (line.includes("~>")) {
484
+ if (laneId) {
485
+ const own = draftByKey.get(laneKey(laneId, cleanLabel));
486
+ if (own) return finish(own);
487
+ }
488
+ const cands = draftsByLabel.get(nk) ?? [];
489
+ if (cands.length === 1) return finish(cands[0]);
490
+ if (cands.length > 1) {
420
491
  diagnostics.push(
421
- emit(SWIMLANE_DX.UNSUPPORTED, lineNum, {
422
- reason: "message flow (~>) is fast-follow"
492
+ emit(SWIMLANE_DX.AMBIGUOUS_NODE, lineNum, {
493
+ node: cleanLabel,
494
+ lanes: cands.map((c) => c.laneId).join(", ")
423
495
  })
424
496
  );
425
- return;
426
- }
427
- const parts = splitChain(line);
428
- if (parts.length < 2) return;
429
- const resolved = [];
430
- for (let p = 0; p < parts.length; p++) {
431
- const text = parts[p].text;
432
- if (p === 0 && text === "") {
433
- resolved.push(currentFlowSource);
434
- continue;
435
- }
436
- resolved.push(resolveRef(text, lineNum));
437
- }
438
- for (let p = 0; p < parts.length - 1; p++) {
439
- const src = resolved[p];
440
- const tgt = resolved[p + 1];
441
- const label = parts[p].labelAfter;
442
- if (!src || !tgt) continue;
443
- edges.push({
444
- source: src,
445
- target: tgt,
446
- ...label !== void 0 && { label },
447
- lineNumber: lineNum
448
- });
497
+ return finish(cands[0]);
449
498
  }
499
+ if (delimited && laneId) return implicit(laneId);
500
+ diagnostics.push(
501
+ emit(SWIMLANE_DX.UNKNOWN_NODE, lineNum, { node: parsed.label })
502
+ );
503
+ return null;
450
504
  };
505
+ let currentPhase = null;
506
+ let currentLane = null;
507
+ let laneIndent = -1;
508
+ let flowSource = null;
451
509
  let inTagBlock = false;
510
+ const openLane = (lane, indent, phased) => {
511
+ currentLane = lane;
512
+ laneIndent = indent;
513
+ if (!phased) currentPhase = null;
514
+ flowSource = null;
515
+ };
452
516
  for (let i = startIdx; i < rawLines.length; i++) {
453
517
  const raw = rawLines[i];
454
518
  const lineNum = i + 1;
@@ -458,10 +522,7 @@ function parseSwimlane(content, palette) {
458
522
  if (cIdx > 0) trimmed = trimmed.slice(0, cIdx).trim();
459
523
  if (!trimmed) continue;
460
524
  const indent = measureIndent(raw);
461
- if (indent === 0 && /^(lane|direction|tag)\s+/i.test(trimmed)) {
462
- inTagBlock = /^tag\s+/i.test(trimmed);
463
- continue;
464
- }
525
+ if (indent === 0 && /^direction\s+/i.test(trimmed)) continue;
465
526
  if (indent === 0 && /^solid-fill\s*$/i.test(trimmed)) continue;
466
527
  if (matchTagBlockHeading(trimmed) && indent === 0) {
467
528
  inTagBlock = true;
@@ -469,6 +530,13 @@ function parseSwimlane(content, palette) {
469
530
  }
470
531
  if (indent === 0) inTagBlock = false;
471
532
  if (inTagBlock && indent > 0) continue;
533
+ if (/^lane\s+/i.test(trimmed)) {
534
+ const rest = trimmed.replace(/^lane\s+/i, "").trim();
535
+ const { label } = extractColor(rest, palette);
536
+ const lane = laneByKey.get(normKey(label));
537
+ if (lane) openLane(lane, indent, indent > 0);
538
+ continue;
539
+ }
472
540
  if (indent === 0 && trimmed.startsWith("[") && trimmed.endsWith("]") && !trimmed.startsWith("[[")) {
473
541
  const label = trimmed.slice(1, -1).trim();
474
542
  if (lanes.length === 0) {
@@ -484,27 +552,115 @@ function parseSwimlane(content, palette) {
484
552
  currentPhase = phase;
485
553
  currentLane = null;
486
554
  laneIndent = -1;
487
- currentFlowSource = null;
555
+ flowSource = null;
488
556
  continue;
489
557
  }
558
+ const cl = currentLane;
559
+ const cp = currentPhase;
560
+ const laneCtx = cl?.id ?? null;
561
+ const phaseCtx = cp?.id;
562
+ const inLane = cl !== null && indent > laneIndent;
490
563
  if (trimmed.includes("->") || trimmed.includes("~>")) {
491
- addChain(trimmed, lineNum);
564
+ if (trimmed.includes("~>")) {
565
+ diagnostics.push(
566
+ emit(SWIMLANE_DX.UNSUPPORTED, lineNum, {
567
+ reason: "message flow (~>) is fast-follow"
568
+ })
569
+ );
570
+ continue;
571
+ }
572
+ const parts = splitChain(trimmed);
573
+ if (parts.length < 2) continue;
574
+ let headText;
575
+ if (parts[0].text === "") {
576
+ headText = flowSource;
577
+ } else {
578
+ headText = parts[0].text;
579
+ if (inLane) declareInLane(headText, laneCtx, phaseCtx, false, lineNum);
580
+ }
581
+ for (let p = 0; p < parts.length - 1; p++) {
582
+ const srcText = p === 0 ? headText : parts[p].text;
583
+ rawEdges.push({
584
+ srcText,
585
+ tgtText: parts[p + 1].text,
586
+ ...parts[p].labelAfter !== void 0 && {
587
+ label: parts[p].labelAfter
588
+ },
589
+ laneId: laneCtx,
590
+ ...phaseCtx !== void 0 && { phaseId: phaseCtx },
591
+ inLane,
592
+ lineNumber: lineNum
593
+ });
594
+ }
492
595
  continue;
493
596
  }
494
597
  const laneRef = laneByKey.get(normKey(trimmed));
495
598
  if (laneRef && (laneIndent < 0 || indent <= laneIndent)) {
496
- currentLane = laneRef;
497
- laneIndent = indent;
498
- currentFlowSource = null;
599
+ openLane(laneRef, indent, currentPhase !== null && indent > 0);
600
+ continue;
601
+ }
602
+ if (inLane) {
603
+ declareInLane(trimmed, laneCtx, phaseCtx, true, lineNum);
604
+ flowSource = trimmed;
499
605
  continue;
500
606
  }
501
607
  if (indent === 0) {
502
- const ref = resolveRef(trimmed, lineNum);
503
- if (ref) currentFlowSource = ref;
608
+ flowSource = trimmed;
504
609
  continue;
505
610
  }
506
- const { token, meta } = splitNodeMeta(trimmed);
507
- declareNode(token, meta, lineNum);
611
+ const { token } = splitNodeMeta(trimmed);
612
+ const nodeLabel = parseNodeToken(splitQualifier(token).rest).label;
613
+ diagnostics.push(
614
+ emit(SWIMLANE_DX.UNKNOWN_LANE, lineNum, { node: nodeLabel })
615
+ );
616
+ }
617
+ const resolvedPairs = [];
618
+ for (const e of rawEdges) {
619
+ if (e.srcText === null) continue;
620
+ const s = resolveEndpoint(e.srcText, e.laneId, e.phaseId, e.lineNumber);
621
+ const t = resolveEndpoint(e.tgtText, e.laneId, e.phaseId, e.lineNumber);
622
+ if (!s || !t) continue;
623
+ resolvedPairs.push({
624
+ s,
625
+ t,
626
+ ...e.label !== void 0 && { label: e.label },
627
+ lineNumber: e.lineNumber
628
+ });
629
+ }
630
+ const labelCounts = /* @__PURE__ */ new Map();
631
+ for (const d of drafts)
632
+ labelCounts.set(
633
+ normKey(d.label),
634
+ (labelCounts.get(normKey(d.label)) ?? 0) + 1
635
+ );
636
+ const usedIds = /* @__PURE__ */ new Set();
637
+ for (const d of drafts) {
638
+ let id = d.label;
639
+ if ((labelCounts.get(normKey(d.label)) ?? 0) > 1)
640
+ id = `${d.label}\u241F${d.laneId}`;
641
+ while (usedIds.has(id)) id = `${id}\u241F`;
642
+ usedIds.add(id);
643
+ d.id = id;
644
+ nodes.push({
645
+ id,
646
+ label: d.label,
647
+ shape: d.shape,
648
+ event: d.event,
649
+ lane: d.laneId,
650
+ ...d.phaseId !== void 0 && { phase: d.phaseId },
651
+ ...d.color !== void 0 && { color: d.color },
652
+ tags: d.tags,
653
+ lineNumber: d.lineNumber
654
+ });
655
+ }
656
+ for (const p of resolvedPairs) {
657
+ if (p.s.id === p.t.id) continue;
658
+ edges.push({
659
+ source: p.s.id,
660
+ target: p.t.id,
661
+ ...p.label !== void 0 && { label: p.label },
662
+ lineNumber: p.lineNumber
663
+ });
508
664
  }
509
665
  finalizeAutoTagColors(tagGroups, palette);
510
666
  return {
@@ -526,4 +682,4 @@ export {
526
682
  SWIMLANE_DIAGNOSTICS,
527
683
  parseSwimlane
528
684
  };
529
- //# sourceMappingURL=chunk-YYX3SU6H.js.map
685
+ //# sourceMappingURL=chunk-OMNGQPEZ.js.map
@@ -41,7 +41,7 @@ import {
41
41
  } from "./chunk-P6T66CCZ.js";
42
42
  import {
43
43
  parseState
44
- } from "./chunk-5FGDJIJX.js";
44
+ } from "./chunk-2C56LEML.js";
45
45
 
46
46
  // src/graph/state-renderer.ts
47
47
  import * as d3Selection from "d3-selection";
@@ -375,4 +375,4 @@ export {
375
375
  renderState,
376
376
  renderStateForExport
377
377
  };
378
- //# sourceMappingURL=chunk-BGJV5ATD.js.map
378
+ //# sourceMappingURL=chunk-ONA5KPV3.js.map
@@ -217,10 +217,14 @@ var ALL_CHART_TYPES = /* @__PURE__ */ new Set([
217
217
  "ring",
218
218
  "treemap",
219
219
  "block",
220
+ "goal",
221
+ "countdown",
222
+ "clock",
220
223
  "sketch",
221
224
  "raci",
222
225
  "map",
223
- "family"
226
+ "family",
227
+ "bracket"
224
228
  ]);
225
229
  function measureIndent(line) {
226
230
  let indent = 0;
@@ -671,4 +675,4 @@ export {
671
675
  splitNameAndMeta,
672
676
  warnUnknownMetaKeys
673
677
  };
674
- //# sourceMappingURL=chunk-ZNQX6QWH.js.map
678
+ //# sourceMappingURL=chunk-OTAL43EH.js.map
@@ -7,7 +7,7 @@ import {
7
7
  tagAttrKey,
8
8
  validateTagGroupNames,
9
9
  validateTagValues
10
- } from "./chunk-HBVD67XG.js";
10
+ } from "./chunk-FJUNPCYI.js";
11
11
  import {
12
12
  normalizeName
13
13
  } from "./chunk-NOTA6TEI.js";
@@ -20,7 +20,7 @@ import {
20
20
  splitNameAndMeta,
21
21
  warnUnknownMetaKeys,
22
22
  withTagAliases
23
- } from "./chunk-ZNQX6QWH.js";
23
+ } from "./chunk-OTAL43EH.js";
24
24
  import {
25
25
  formatDgmoError,
26
26
  makeDgmoError,
@@ -351,4 +351,4 @@ export {
351
351
  looksLikeOrg,
352
352
  parseOrg
353
353
  };
354
- //# sourceMappingURL=chunk-F743CM2N.js.map
354
+ //# sourceMappingURL=chunk-OTQKUHRS.js.map
@@ -1,3 +1,6 @@
1
+ import {
2
+ layoutClassDiagram
3
+ } from "./chunk-CMCR5WBW.js";
1
4
  import {
2
5
  NOTE_BADGE_RADIUS,
3
6
  noteConnectorPoints,
@@ -9,9 +12,6 @@ import {
9
12
  extractExportSvg,
10
13
  runInExportContainer
11
14
  } from "./chunk-JTSMEYIZ.js";
12
- import {
13
- layoutClassDiagram
14
- } from "./chunk-CMCR5WBW.js";
15
15
  import {
16
16
  EDGE_STROKE_WIDTH,
17
17
  NODE_STROKE_WIDTH
@@ -21,7 +21,7 @@ import {
21
21
  } from "./chunk-YYVTBZZC.js";
22
22
  import {
23
23
  renderIntegratedLegend
24
- } from "./chunk-4UDKKGHH.js";
24
+ } from "./chunk-HEVYAHLW.js";
25
25
  import {
26
26
  TITLE_FONT_SIZE,
27
27
  TITLE_FONT_WEIGHT,
@@ -42,7 +42,7 @@ import {
42
42
  } from "./chunk-P6T66CCZ.js";
43
43
  import {
44
44
  parseClassDiagram
45
- } from "./chunk-ZXL6MB4R.js";
45
+ } from "./chunk-GL5UZ6NY.js";
46
46
 
47
47
  // src/class/renderer.ts
48
48
  import * as d3Selection from "d3-selection";
@@ -407,4 +407,4 @@ export {
407
407
  renderClassDiagram,
408
408
  renderClassDiagramForExport
409
409
  };
410
- //# sourceMappingURL=chunk-KUBBJ2CD.js.map
410
+ //# sourceMappingURL=chunk-P7CE7LXL.js.map
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  resolveTagColor,
6
6
  tagAttrKey
7
- } from "./chunk-HBVD67XG.js";
7
+ } from "./chunk-FJUNPCYI.js";
8
8
  import {
9
9
  resolveColor
10
10
  } from "./chunk-TLVIHFRO.js";
@@ -164,4 +164,4 @@ export {
164
164
  formatPct,
165
165
  buildLegend
166
166
  };
167
- //# sourceMappingURL=chunk-UVCXZEGU.js.map
167
+ //# sourceMappingURL=chunk-PFHVU7UA.js.map
@@ -10,7 +10,7 @@ import {
10
10
  splitNameAndMeta,
11
11
  tryParseSharedOption,
12
12
  warnUnknownMetaKeys
13
- } from "./chunk-ZNQX6QWH.js";
13
+ } from "./chunk-OTAL43EH.js";
14
14
  import {
15
15
  resolveColorWithDiagnostic
16
16
  } from "./chunk-TLVIHFRO.js";
@@ -952,4 +952,4 @@ export {
952
952
  parseRaci,
953
953
  allTasks
954
954
  };
955
- //# sourceMappingURL=chunk-5ZZLLBFK.js.map
955
+ //# sourceMappingURL=chunk-PGEGPSCZ.js.map