@diagrammo/dgmo 0.92.1 → 0.94.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 (174) hide show
  1. package/dist/advanced.d.ts +103 -38
  2. package/dist/advanced.js +457 -423
  3. package/dist/block.d.ts +2 -2
  4. package/dist/block.js +75 -70
  5. package/dist/{chart-meta-BBqLnv5q.d.ts → chart-meta-BbjsRY7o.d.ts} +2 -2
  6. package/dist/chart-meta.d.ts +3 -3
  7. package/dist/chart-meta.js +25 -19
  8. package/dist/{chart-types-CbXlZFLd.d.ts → chart-types-Cppnp31G.d.ts} +173 -4
  9. package/dist/{charts-d3-QUUDVETP.js → charts-d3-SZV2SFTM.js} +7 -6
  10. package/dist/{chunk-ADNIO3XY.js → chunk-2FDQEQID.js} +5 -5
  11. package/dist/{chunk-QUGC7GWB.js → chunk-2HSHWPTO.js} +15 -15
  12. package/dist/{chunk-L5NW3PVL.js → chunk-2I4UQG7W.js} +1 -1
  13. package/dist/{chunk-2YAFDND3.js → chunk-2MS623GW.js} +4 -6
  14. package/dist/{chunk-73EYNV4O.js → chunk-2XMTZ5JR.js} +4 -6
  15. package/dist/{chunk-ZJAK6C7Y.js → chunk-3PP746YM.js} +6 -1
  16. package/dist/{chunk-MDVJYRJT.js → chunk-3TWBMU7K.js} +22 -22
  17. package/dist/{chunk-FTUMRSGT.js → chunk-3ZP3QC47.js} +8 -288
  18. package/dist/{chunk-J2E7EUER.js → chunk-4EX4OKGZ.js} +86 -23
  19. package/dist/{chunk-Y2V5AEVG.js → chunk-4SP6OUO7.js} +1952 -1824
  20. package/dist/{chunk-HIWHIYLD.js → chunk-4TEPDQHJ.js} +19 -19
  21. package/dist/{chunk-DEFBUZWV.js → chunk-5HAYT43L.js} +70 -54
  22. package/dist/{chunk-6WVX4KNP.js → chunk-5ZUZZDW5.js} +97 -297
  23. package/dist/{chunk-X5BUX2GK.js → chunk-6JCTW74W.js} +7 -5
  24. package/dist/{chunk-Q6W2K33N.js → chunk-6XLMTAEX.js} +1 -1
  25. package/dist/{chunk-ONYO5WJW.js → chunk-7IOZ6JE4.js} +21 -21
  26. package/dist/chunk-7SXV7NUS.js +416 -0
  27. package/dist/{chunk-NPWVOFB3.js → chunk-7WEYXYLC.js} +1 -1
  28. package/dist/{chunk-GE7ICBX6.js → chunk-AM42TLSZ.js} +102 -97
  29. package/dist/{chunk-WLLO3PZ3.js → chunk-AYUSD4Z6.js} +45 -19
  30. package/dist/{chunk-45QUTYPD.js → chunk-B25IWGDH.js} +69 -20
  31. package/dist/{chunk-JKST4RTT.js → chunk-BH2SF4TT.js} +6 -6
  32. package/dist/{chunk-6OIMUSDX.js → chunk-C6G36F5S.js} +9 -9
  33. package/dist/{chunk-DRFGIOZ6.js → chunk-CIHHTS5B.js} +4 -6
  34. package/dist/chunk-CYTFO2LF.js +209 -0
  35. package/dist/{chunk-Q2UFOKPB.js → chunk-DDIOWNHS.js} +22 -22
  36. package/dist/{chunk-Q6ZQX2HX.js → chunk-DLJJOCIT.js} +4 -6
  37. package/dist/{chunk-26BBJUBW.js → chunk-DNM3XZCK.js} +4 -6
  38. package/dist/{chunk-AUS7V54P.js → chunk-ERT7XDQW.js} +1 -1
  39. package/dist/{chunk-7ENDOHAA.js → chunk-FMAVHTYB.js} +919 -927
  40. package/dist/{chunk-URQIWIKX.js → chunk-FWVE373X.js} +4 -4
  41. package/dist/{chunk-VOR32OHN.js → chunk-G3HZ4PGE.js} +13 -15
  42. package/dist/{chunk-RBFJT23E.js → chunk-GWQRTA5W.js} +6 -6
  43. package/dist/chunk-GXCDD6NG.js +24 -0
  44. package/dist/{chunk-3PFMGNOM.js → chunk-HHVIE45A.js} +26 -11
  45. package/dist/{chunk-MXAP37W6.js → chunk-HI6R27YA.js} +16 -7
  46. package/dist/{chunk-QQPNCXAO.js → chunk-I37S3EZE.js} +18 -18
  47. package/dist/{chunk-YITHYQCL.js → chunk-IGJEKO2P.js} +8 -8
  48. package/dist/{chunk-BZX7QCXJ.js → chunk-IHN6WDEY.js} +15 -15
  49. package/dist/{chunk-QT3KDDXK.js → chunk-IN7XI6NO.js} +0 -7
  50. package/dist/{chunk-4QLGGQNO.js → chunk-IZHGT5HD.js} +44 -18
  51. package/dist/{chunk-5SSTVFPX.js → chunk-JT2BG7LM.js} +5 -7
  52. package/dist/{chunk-2BJW7FSF.js → chunk-KBEWVCK3.js} +1 -1
  53. package/dist/{chunk-DUPZ2BBY.js → chunk-KBHT5XEY.js} +143 -6
  54. package/dist/{chunk-V4D2ZQBE.js → chunk-KRPLP5LP.js} +6 -1
  55. package/dist/{chunk-QKY6W4NA.js → chunk-KSZB7TIY.js} +25 -25
  56. package/dist/{chunk-6ZL2XYM7.js → chunk-MLY5ALOV.js} +6 -6
  57. package/dist/{chunk-VSOZZYLK.js → chunk-NERQSSYD.js} +20 -9
  58. package/dist/{chunk-OQW4ETJX.js → chunk-NM5V5EKY.js} +6 -1
  59. package/dist/{chunk-EBSFSOJC.js → chunk-NOQB4KMV.js} +22 -22
  60. package/dist/{chunk-6BNNLVAR.js → chunk-NPDVWFAQ.js} +6 -1
  61. package/dist/{chunk-FSJ3ZA6N.js → chunk-OSSTOSXU.js} +12 -12
  62. package/dist/chunk-P7TRFL4P.js +54 -0
  63. package/dist/{chunk-A4PNWAUW.js → chunk-PGSGJLUR.js} +6 -1
  64. package/dist/{chunk-S7W75MIM.js → chunk-QKPOIJBT.js} +23 -5
  65. package/dist/{chunk-YO6AQU4A.js → chunk-QPQWY5RU.js} +12 -12
  66. package/dist/{chunk-NREU4JFE.js → chunk-RBVFNUAL.js} +6 -8
  67. package/dist/{chunk-5EBYPETE.js → chunk-RESEJSCV.js} +3 -5
  68. package/dist/{chunk-BRSM6Z34.js → chunk-RITTLIDJ.js} +14 -14
  69. package/dist/{chunk-MX4SZLSV.js → chunk-S5Y3OO3V.js} +16 -8
  70. package/dist/{chunk-O5WUZGPV.js → chunk-TASRGDYP.js} +18 -18
  71. package/dist/{chunk-HXULJZA2.js → chunk-TDAGJJPZ.js} +6 -1
  72. package/dist/chunk-UCHZJJIT.js +421 -0
  73. package/dist/{chunk-42UJ23H3.js → chunk-UIEKW4SG.js} +1 -0
  74. package/dist/{chunk-WFA6IULY.js → chunk-URRAWU5D.js} +5 -0
  75. package/dist/{chunk-IGKFOHBG.js → chunk-VBMRZCMQ.js} +13 -13
  76. package/dist/{chunk-JRWUHLRP.js → chunk-VDY2GR6U.js} +51 -8
  77. package/dist/{chunk-EJS3K44P.js → chunk-VGAMBOOC.js} +5 -3
  78. package/dist/{chunk-B5PEKSRH.js → chunk-VSAKEMDD.js} +6 -1
  79. package/dist/chunk-WTTIODDV.js +9 -0
  80. package/dist/{chunk-JLU52ZDT.js → chunk-XJQ6Z3FO.js} +10 -10
  81. package/dist/{chunk-KTGZDMDX.js → chunk-XKCRKD2B.js} +140 -53
  82. package/dist/{chunk-LRP5FXST.js → chunk-YQMIKX54.js} +61 -24
  83. package/dist/{chunk-H5UEVW6Q.js → chunk-ZD3QCNB7.js} +1 -1
  84. package/dist/clock.js +168 -0
  85. package/dist/completion-registry.js +3 -1
  86. package/dist/countdown.js +36 -395
  87. package/dist/{dgmo-router-4UAPPIKN.js → dgmo-router-E5O7RJSW.js} +50 -43
  88. package/dist/{dimensions-SCNVYLRF.js → dimensions-DS6FWLRY.js} +3 -3
  89. package/dist/{d3-BThYBTQk.d.ts → export-context-Ceh3wr0E.d.ts} +2 -8
  90. package/dist/{flowchart-parser-NA75YQ77.js → flowchart-parser-NZXASOZG.js} +8 -3
  91. package/dist/{flowchart-renderer-6MGGX4RC.js → flowchart-renderer-PTCRIANF.js} +17 -19
  92. package/dist/index.d.ts +8 -7
  93. package/dist/index.js +80 -74
  94. package/dist/{layout-MBVBAMPA.js → layout-3TSVAGWH.js} +2 -2
  95. package/dist/layout-ISSBWBH7.js +24 -0
  96. package/dist/layout-IT4ZTV6C.js +24 -0
  97. package/dist/{layout-BNLFQHSB.js → layout-U3AH6M7J.js} +9 -10
  98. package/dist/layout-VC3MXRB4.js +29 -0
  99. package/dist/layout-VDCJOZSH.js +11 -0
  100. package/dist/{layout-search-PMYL3VWS.js → layout-search-BBX2BMEF.js} +11 -12
  101. package/dist/{palettes-IN7ZFRJM.js → palettes-4Y7CL2QL.js} +4 -2
  102. package/dist/{parser-QYISOAGR.js → parser-4RFY7D52.js} +8 -3
  103. package/dist/{parser-3MK56JZC.js → parser-4Y6PODW6.js} +2 -2
  104. package/dist/{parser-GX5YLRIP.js → parser-7QKQ4P4P.js} +8 -3
  105. package/dist/{parser-2NWH5JUS.js → parser-A3AN76RQ.js} +2 -1
  106. package/dist/{parser-LCJ76UXS.js → parser-BT4NI6JY.js} +5 -1
  107. package/dist/{parser-FXDS4JDK.js → parser-F7NDRPMA.js} +2 -2
  108. package/dist/{parser-BES6LV3G.js → parser-GDLKUBTO.js} +5 -1
  109. package/dist/{parser-SEUTXN6U.js → parser-KJPPUN4D.js} +2 -2
  110. package/dist/{parser-SIKL4PLF.js → parser-KMKVFET2.js} +5 -1
  111. package/dist/{parser-5LW5JDYG.js → parser-NL73FSFI.js} +5 -1
  112. package/dist/{parser-VA7ZQQTA.js → parser-NUU3DVW4.js} +5 -1
  113. package/dist/{parser-XZUKNZPB.js → parser-R3LPEQIT.js} +7 -1
  114. package/dist/{parser-X23GRTQJ.js → parser-RCIEKN7Y.js} +5 -1
  115. package/dist/{parser-L6RWDXQN.js → parser-TAYRTCPR.js} +8 -3
  116. package/dist/redraw-AHW7EUUF.js +1698 -0
  117. package/dist/redraw-STZ4WJAI.js +73 -0
  118. package/dist/{renderer-LM4ICK6I.js → renderer-2LYX6NHN.js} +4 -5
  119. package/dist/{renderer-NHTR7IRR.js → renderer-3NLDX7DQ.js} +4 -5
  120. package/dist/{renderer-TO2NVJP3.js → renderer-4SE7R22T.js} +50 -45
  121. package/dist/{renderer-3IHQI4A4.js → renderer-53B523PM.js} +11 -10
  122. package/dist/{renderer-3JY6JAQJ.js → renderer-7OGGV327.js} +5 -6
  123. package/dist/{renderer-2FVUPBGV.js → renderer-AM7P4LN7.js} +1 -1
  124. package/dist/{renderer-5VKPB4LL.js → renderer-BXD5KVSR.js} +5 -5
  125. package/dist/{renderer-OAR5VPH4.js → renderer-DAZWHNLI.js} +2 -2
  126. package/dist/{renderer-WIU5BJUK.js → renderer-DDWDCM2K.js} +2 -2
  127. package/dist/{renderer-3QAFDXEY.js → renderer-FMTLSOCX.js} +16 -12
  128. package/dist/{renderer-JEJT3YET.js → renderer-HX6ICPDX.js} +2 -3
  129. package/dist/{renderer-NDA2FFYB.js → renderer-ISQJ2ELA.js} +5 -5
  130. package/dist/{renderer-XGG2UNXT.js → renderer-IXBOT6DU.js} +3 -4
  131. package/dist/{renderer-S3YCLJKL.js → renderer-J3GPDK73.js} +20 -22
  132. package/dist/{renderer-DVNMCYHZ.js → renderer-J7ZSTJUE.js} +15 -15
  133. package/dist/{renderer-ALWVK3EJ.js → renderer-JJ4QW3SK.js} +6 -6
  134. package/dist/{renderer-RUSFL7WU.js → renderer-JYHA6R2D.js} +8 -7
  135. package/dist/{renderer-5TZVFQ7K.js → renderer-KJ3V5BYP.js} +7 -8
  136. package/dist/{renderer-RSK6QFWN.js → renderer-LNP23NSM.js} +7 -9
  137. package/dist/{renderer-ZHGHTSNG.js → renderer-M5DUMITP.js} +13 -12
  138. package/dist/{renderer-O6DY46AV.js → renderer-MWZC7TMD.js} +7 -7
  139. package/dist/{renderer-DC7C5Q3G.js → renderer-NOYLNVTI.js} +2 -2
  140. package/dist/{renderer-ISSDGK54.js → renderer-O6RP52CQ.js} +3 -3
  141. package/dist/{renderer-ZGY7P4BM.js → renderer-OUDHH5MV.js} +19 -22
  142. package/dist/{renderer-QGIHLZOJ.js → renderer-PHLCYVSN.js} +9 -10
  143. package/dist/{renderer-VPIELEE5.js → renderer-QTPWRRJ7.js} +8 -9
  144. package/dist/{renderer-LQP3AGEJ.js → renderer-RUSQJFFC.js} +3 -4
  145. package/dist/{renderer-MM27BSBO.js → renderer-TINHO2IO.js} +3 -4
  146. package/dist/{renderer-7ZZG5HR3.js → renderer-UTEEJDGB.js} +9 -9
  147. package/dist/{renderer-J5FKF423.js → renderer-W4MUMXJE.js} +7 -4
  148. package/dist/{renderer-XO57LTU4.js → renderer-WPN2SXGT.js} +5 -5
  149. package/dist/{renderer-ZZ6MWVB7.js → renderer-XCLARXCK.js} +4 -4
  150. package/dist/{renderer-J666LZXJ.js → renderer-XOWDERU2.js} +8 -8
  151. package/dist/{state-parser-TIR2ORJY.js → state-parser-KPVW5CRI.js} +8 -3
  152. package/dist/{state-renderer-G6SUXU4J.js → state-renderer-ZVEI265C.js} +18 -21
  153. package/dist/{tag-groups-DsoVpAY-.d.ts → tag-groups-DydewK3D.d.ts} +2 -173
  154. package/dist/{themes-DRNjxX7Q.d.ts → themes-DzIH3Hjv.d.ts} +3 -2
  155. package/docs/ai-integration.md +1 -1
  156. package/docs/language-reference.md +23 -2
  157. package/gallery/fixtures/whiteboard.dgmo +3 -0
  158. package/package.json +2 -6
  159. package/dist/chunk-3Y63RFJL.js +0 -75
  160. package/dist/chunk-5DH3KYFH.js +0 -20
  161. package/dist/chunk-O753JUEZ.js +0 -67
  162. package/dist/chunk-RJNZHFNG.js +0 -51
  163. package/dist/chunk-Z6DXWULM.js +0 -23
  164. package/dist/layout-5USEVQBY.js +0 -25
  165. package/dist/layout-J3AGFZZ7.js +0 -10
  166. package/dist/layout-S3RLVPH4.js +0 -25
  167. package/dist/layout-WRG4APSJ.js +0 -32
  168. package/dist/{chunk-DGUGE67L.js → chunk-CDYV46JE.js} +3 -3
  169. package/dist/{chunk-TKAB3FTK.js → chunk-DRQSB72S.js} +11 -11
  170. package/dist/{chunk-ZKP77MB3.js → chunk-FVTYJUXR.js} +5 -5
  171. package/dist/{chunk-MA42PIGJ.js → chunk-H5NVCOEJ.js} +4 -4
  172. package/dist/{chunk-BEA4D7OS.js → chunk-IXHWS2HI.js} +3 -3
  173. package/dist/{chunk-SOHZDW6N.js → chunk-UXNA2H2V.js} +3 -3
  174. package/dist/{chunk-NO3UX6AP.js → chunk-V2NQV7VL.js} +4 -4
@@ -112,7 +112,7 @@ Valid markup is the floor, not the goal. A good diagram reads at a glance. Apply
112
112
  - **Always title it.** Every diagram gets a short title on the type-declaration line (`flowchart Checkout Flow`, `sequence Checkout`, `boxes-and-lines Service Map`) so it is self-describing — never leave the bare type keyword alone. Infer a fitting title from the request when the user gives none.
113
113
  <!-- TITLE end -->
114
114
  <!-- CATEGORIZE start -->
115
- - **Categorize and color — by default, not only when obvious.** Before drawing, find the axis that sorts the items into kinds and color by it: layer (frontend / backend / data), role (client / service / datastore), trust zone (internal / external / third-party), status (done / active / blocked), owner/team, or read-path vs write-path. Almost every diagram has such an axis — actively look for one rather than leaving everything monochrome. Express it with a **tag group**, never ad-hoc per-node colors: declare `tag <Axis> as t` (the name is a single word — `tag TrustZone as tz` — or quote a multi-word name: `tag "Trust Zone" as tz`), indent the category values (a trailing color is optional — bare values auto-pick a palette color), set `active-tag <Axis>` in the header — after the tag group and before the first element, because a type such as c4 refuses it after content — then assign each item `Node t: <Category>` (see the tag-group syntax in the per-type section below). **Bracket, block, body, event-line, family and sketch** take the tag group but no `active-tag` line — declare the group and stop there; on event-line, family and sketch the line would be drawn as an element. **Class, flowchart, whiteboard, wireframe, raci, cycle, pyramid, ring, sankey, tech-radar, venn, version-control, wordcloud, arc, bar, clock, countdown, funnel, function, goal, heatmap, line, pie, polar-area, quadrant, radar, scatter and slope** take no tag group at all — skip this rule for them. Most report the lines; cycle, pyramid, ring, sankey, venn, version-control and wordcloud read them as content, and flowchart and tech-radar drop them without a word. Only the 11 named palette colors exist, and they re-resolve per palette/theme. Color the grouping so the categories — and the boundaries between them — read at a glance. **Buckets, not name tags — never 1:1.** A tag group must have _fewer_ values than it has members: each color should bucket two or more items so the palette compresses the diagram into a few meaningful kinds (aim for ~2–4 categories, and keep distinct colors well under half the item count). If you find yourself giving nearly every item its own value, you've enumerated, not categorized — merge the singletons up a level until each color groups at least two (a `cache` and a `database` are both `datastore`; a caller and a gateway are both `client`; two microservices are both `service`). One color per item is the same visual noise as random colors — the grouping only earns its place when a color means "these belong together." Leave items uncolored only when they genuinely form a single undifferentiated kind, or the user asked for no color.
115
+ - **Categorize and color — by default, not only when obvious.** Before drawing, find the axis that sorts the items into kinds and color by it: layer (frontend / backend / data), role (client / service / datastore), trust zone (internal / external / third-party), status (done / active / blocked), owner/team, or read-path vs write-path. Almost every diagram has such an axis — actively look for one rather than leaving everything monochrome. Express it with a **tag group**, never ad-hoc per-node colors: declare `tag <Axis> as t` (the name is a single word — `tag TrustZone as tz` — or quote a multi-word name: `tag "Trust Zone" as tz`), indent the category values (a trailing color is optional — bare values auto-pick a palette color), set `active-tag <Axis>` in the header — after the tag group and before the first element, because a type such as c4 refuses it after content — then assign each item `Node t: <Category>` (see the tag-group syntax in the per-type section below). **Bracket, block, body, event-line, family, sketch and whiteboard** take the tag group but no `active-tag` line — declare the group and stop there; on event-line, family and sketch the line would be drawn as an element. **Class, flowchart, wireframe, raci, cycle, pyramid, ring, sankey, tech-radar, venn, version-control, wordcloud, arc, bar, clock, countdown, funnel, function, goal, heatmap, line, pie, polar-area, quadrant, radar, scatter and slope** take no tag group at all — skip this rule for them. Most report the lines; cycle, pyramid, ring, sankey, venn, version-control and wordcloud read them as content, and flowchart and tech-radar drop them without a word. Only the 11 named palette colors exist, and they re-resolve per palette/theme. Color the grouping so the categories — and the boundaries between them — read at a glance. **Buckets, not name tags — never 1:1.** A tag group must have _fewer_ values than it has members: each color should bucket two or more items so the palette compresses the diagram into a few meaningful kinds (aim for ~2–4 categories, and keep distinct colors well under half the item count). If you find yourself giving nearly every item its own value, you've enumerated, not categorized — merge the singletons up a level until each color groups at least two (a `cache` and a `database` are both `datastore`; a caller and a gateway are both `client`; two microservices are both `service`). One color per item is the same visual noise as random colors — the grouping only earns its place when a color means "these belong together." Leave items uncolored only when they genuinely form a single undifferentiated kind, or the user asked for no color.
116
116
  <!-- CATEGORIZE end -->
117
117
  - **Keep labels short.** A few words per node. Move detail into notes or metadata, never a full sentence inside a label.
118
118
  - **Let the defaults show.** Don't add `no-*` opt-outs unless the user asked to hide or disable something — they strip helpful labels, values, and color.
@@ -98,7 +98,7 @@ Valid markup is the floor, not the goal. A good diagram reads at a glance. Apply
98
98
  - **Always title it.** Every diagram gets a short title on the type-declaration line (`flowchart Checkout Flow`, `sequence Checkout`, `boxes-and-lines Service Map`) so it is self-describing — never leave the bare type keyword alone. Infer a fitting title from the request when the user gives none.
99
99
  <!-- TITLE end -->
100
100
  <!-- CATEGORIZE start -->
101
- - **Categorize and color — by default, not only when obvious.** Before drawing, find the axis that sorts the items into kinds and color by it: layer (frontend / backend / data), role (client / service / datastore), trust zone (internal / external / third-party), status (done / active / blocked), owner/team, or read-path vs write-path. Almost every diagram has such an axis — actively look for one rather than leaving everything monochrome. Express it with a **tag group**, never ad-hoc per-node colors: declare `tag <Axis> as t` (the name is a single word — `tag TrustZone as tz` — or quote a multi-word name: `tag "Trust Zone" as tz`), indent the category values (a trailing color is optional — bare values auto-pick a palette color), set `active-tag <Axis>` in the header — after the tag group and before the first element, because a type such as c4 refuses it after content — then assign each item `Node t: <Category>` (see the tag-group syntax in the per-type section below). **Bracket, block, body, event-line, family and sketch** take the tag group but no `active-tag` line — declare the group and stop there; on event-line, family and sketch the line would be drawn as an element. **Class, flowchart, whiteboard, wireframe, raci, cycle, pyramid, ring, sankey, tech-radar, venn, version-control, wordcloud, arc, bar, clock, countdown, funnel, function, goal, heatmap, line, pie, polar-area, quadrant, radar, scatter and slope** take no tag group at all — skip this rule for them. Most report the lines; cycle, pyramid, ring, sankey, venn, version-control and wordcloud read them as content, and flowchart and tech-radar drop them without a word. Only the 11 named palette colors exist, and they re-resolve per palette/theme. Color the grouping so the categories — and the boundaries between them — read at a glance. **Buckets, not name tags — never 1:1.** A tag group must have _fewer_ values than it has members: each color should bucket two or more items so the palette compresses the diagram into a few meaningful kinds (aim for ~2–4 categories, and keep distinct colors well under half the item count). If you find yourself giving nearly every item its own value, you've enumerated, not categorized — merge the singletons up a level until each color groups at least two (a `cache` and a `database` are both `datastore`; a caller and a gateway are both `client`; two microservices are both `service`). One color per item is the same visual noise as random colors — the grouping only earns its place when a color means "these belong together." Leave items uncolored only when they genuinely form a single undifferentiated kind, or the user asked for no color.
101
+ - **Categorize and color — by default, not only when obvious.** Before drawing, find the axis that sorts the items into kinds and color by it: layer (frontend / backend / data), role (client / service / datastore), trust zone (internal / external / third-party), status (done / active / blocked), owner/team, or read-path vs write-path. Almost every diagram has such an axis — actively look for one rather than leaving everything monochrome. Express it with a **tag group**, never ad-hoc per-node colors: declare `tag <Axis> as t` (the name is a single word — `tag TrustZone as tz` — or quote a multi-word name: `tag "Trust Zone" as tz`), indent the category values (a trailing color is optional — bare values auto-pick a palette color), set `active-tag <Axis>` in the header — after the tag group and before the first element, because a type such as c4 refuses it after content — then assign each item `Node t: <Category>` (see the tag-group syntax in the per-type section below). **Bracket, block, body, event-line, family, sketch and whiteboard** take the tag group but no `active-tag` line — declare the group and stop there; on event-line, family and sketch the line would be drawn as an element. **Class, flowchart, wireframe, raci, cycle, pyramid, ring, sankey, tech-radar, venn, version-control, wordcloud, arc, bar, clock, countdown, funnel, function, goal, heatmap, line, pie, polar-area, quadrant, radar, scatter and slope** take no tag group at all — skip this rule for them. Most report the lines; cycle, pyramid, ring, sankey, venn, version-control and wordcloud read them as content, and flowchart and tech-radar drop them without a word. Only the 11 named palette colors exist, and they re-resolve per palette/theme. Color the grouping so the categories — and the boundaries between them — read at a glance. **Buckets, not name tags — never 1:1.** A tag group must have _fewer_ values than it has members: each color should bucket two or more items so the palette compresses the diagram into a few meaningful kinds (aim for ~2–4 categories, and keep distinct colors well under half the item count). If you find yourself giving nearly every item its own value, you've enumerated, not categorized — merge the singletons up a level until each color groups at least two (a `cache` and a `database` are both `datastore`; a caller and a gateway are both `client`; two microservices are both `service`). One color per item is the same visual noise as random colors — the grouping only earns its place when a color means "these belong together." Leave items uncolored only when they genuinely form a single undifferentiated kind, or the user asked for no color.
102
102
  <!-- CATEGORIZE end -->
103
103
  - **Keep labels short.** A few words per node. Move detail into notes or metadata, never a full sentence inside a label.
104
104
  - **Let the defaults show.** Don't add `no-*` opt-outs unless the user asked to hide or disable something — they strip helpful labels, values, and color.
@@ -215,7 +215,7 @@ tag GroupName as <alias>
215
215
  - Must appear before diagram content
216
216
  - Bare shorthand is not an alias (TD-18): `tag Priority p` declares a group _named_ "Priority p" — no alias registers, so `p:` assignments silently miss. The parser warns on this shape (spaced name, no alias, alias-shaped trailing word), suggesting `tag Priority as p` or a quoted name
217
217
 
218
- **Diagram types that support tags**: the tag model is near-universal across the structural types — sequence, infra, org, c4, er, kanban, gantt, sitemap, timeline, boxes-and-lines, state (§5.7), pert, swimlane, mindmap, journey-map, event-line, treemap, map, block, sketch, bracket and family all accept `tag <Group> as <alias>` blocks. Check the per-type Options section for the exact directive set; if a type draws a tag legend, it takes tags. **Flowchart, wireframe, raci and class take no tags** — a `tag` block or `active-tag` on any of them is ignored with a warning, because what an element looks like is fixed by what it is (a flowchart's shape, a wireframe's state keywords, a class's trailing colour word) or by the roles (raci).
218
+ **Diagram types that support tags**: the tag model is near-universal across the structural types — sequence, infra, org, c4, er, kanban, gantt, sitemap, timeline, boxes-and-lines, state (§5.7), pert, swimlane, mindmap, journey-map, event-line, treemap, map, block, sketch, bracket, family and whiteboard all accept `tag <Group> as <alias>` blocks (a whiteboard's names its colours — §24Ea). Check the per-type Options section for the exact directive set; if a type draws a tag legend, it takes tags. **Flowchart, wireframe, raci and class take no tags** — a `tag` block or `active-tag` on any of them is ignored with a warning, because what an element looks like is fixed by what it is (a flowchart's shape, a wireframe's state keywords, a class's trailing colour word) or by the roles (raci).
219
219
 
220
220
  ### 1.4 Same-Line Metadata
221
221
 
@@ -4066,6 +4066,19 @@ An `arrow` takes `heads: both` for a head at each end. Arrows and lines take `be
4066
4066
 
4067
4067
  `color:` takes a palette **name**: `ink` (the default, never written — the theme's text colour, near-black on light and near-white on dark), `red`, `green`, `blue`, `teal`, `purple`, `orange`, `yellow`, `cyan`, `gray`. Each takes the palette's own light or dark shade. No hex values. A `note` defaults to `yellow` instead of `ink`, and writes `color:` only when it is not yellow.
4068
4068
 
4069
+ A `tag` block gives a colour a **meaning**. Each entry is a name and the colour it names; shapes keep their own `color:`, so the name attaches to the colour, never to a shape:
4070
+
4071
+ ```
4072
+ whiteboard Launch plan
4073
+ tag Meaning
4074
+ Blocked red
4075
+ Done green
4076
+ rectangle Legal review at: 0 0, size: 160 80, color: red
4077
+ rectangle Copy at: 200 0, size: 160 80, color: green
4078
+ ```
4079
+
4080
+ With two or more colours on the board, a legend sits centred above it, below the title, one dot per colour. A colour with an entry shows its name; while no colour is named the legend is drawn faintly, as bare dots. Under two colours there is no legend. `ink` is no colour, and a note in its default yellow does not count. An entry must end with one of the nine colour names, or it is ignored with a warning. Only the first `tag` block is shown.
4081
+
4069
4082
  ### Images
4070
4083
 
4071
4084
  An image whose ref cannot be loaded — a local file that is not there, or a copied fence — draws a plain box at its size labelled _image not uploaded_. It is never an error.
@@ -4654,6 +4667,8 @@ The directive set is **13, all colon-free**: six naming intent the renderer can'
4654
4667
 
4655
4668
  A pointer to a diagram published at Diagrammo Cloud — the file holds no drawing of its own, and whoever opens it sees the publisher's current version. Renders as a reference card until a host resolves it.
4656
4669
 
4670
+ **Where the link comes from.** In the Diagrammo app, open the diagram and press Share on the left rail (or ⌘E / Ctrl+E), then "Show on the web" → "Show"; or right-click the diagram in the file list and choose "Show and copy link". Either route copies the link to the clipboard. A diagram that is shown on the web wears an amber globe; pressing the lit amber globe on the left rail copies the link again.
4671
+
4657
4672
  **Do not author one from scratch.** A pointer needs a diagram id only the publisher can hand out, so it arrives by being saved from a shared link. It is not offered in any chart-type picker for that reason.
4658
4673
 
4659
4674
  Two forms. The titled form names the diagram and carries a `url` directive:
@@ -4669,6 +4684,12 @@ The shorthand form is one line, and is what a docs-site fence contains:
4669
4684
  live-link dgm_01M1JBN56CAVS728HPWDACVNMC
4670
4685
  ```
4671
4686
 
4687
+ In a docs-site or Obsidian fence the bare link on a line of its own does the same job:
4688
+
4689
+ ```
4690
+ https://online.diagrammo.app/d/dgm_01M1JBN56CAVS728HPWDACVNMC
4691
+ ```
4692
+
4672
4693
  The id may be the whole share link instead — `live-link ` followed by a paste resolves exactly as the id does:
4673
4694
 
4674
4695
  ```
@@ -1,4 +1,7 @@
1
1
  whiteboard Login ideas
2
+ tag Meaning
3
+ Open question red
4
+ Chosen green
2
5
  rectangle Sign in at: 60 60, size: 180 70
3
6
  ellipse OAuth? at: 345 53, size: 170 84, color: blue
4
7
  arrow from: 150 95, to: 430 95, heads: both
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@diagrammo/dgmo",
3
- "version": "0.92.1",
3
+ "version": "0.94.0",
4
4
  "description": "DGMO diagram markup language — parser, renderer, and color system",
5
5
  "license": "MIT",
6
6
  "author": "Diagrammo LLC",
@@ -77,10 +77,6 @@
77
77
  "docs/*.md",
78
78
  "gallery/fixtures"
79
79
  ],
80
- "sideEffects": [
81
- "./src/palettes/*.ts",
82
- "./dist/palettes/*"
83
- ],
84
80
  "scripts": {
85
81
  "codegen": "lezer-generator src/editor/dgmo.grammar -o src/editor/dgmo.grammar.js",
86
82
  "fonts": "node scripts/build-fonts.mjs",
@@ -148,7 +144,7 @@
148
144
  },
149
145
  "pnpm": {
150
146
  "overrides": {
151
- "undici": "^7.29.1"
147
+ "undici": "^7.30.1"
152
148
  }
153
149
  },
154
150
  "devDependencies": {
@@ -1,75 +0,0 @@
1
- import {
2
- extractColor,
3
- measureIndent
4
- } from "./chunk-TIIZIAGS.js";
5
- import {
6
- makeDgmoError
7
- } from "./chunk-BYU54C3S.js";
8
-
9
- // src/utils/notes/parse.ts
10
- function parseNoteHeader(rest) {
11
- const t = rest.trim();
12
- const quoted = t.match(/^"([^"]+)"\s*(.*)$/);
13
- if (quoted) {
14
- return { ref: quoted[1].trim(), inlineBody: quoted[2].trim() };
15
- }
16
- const m = t.match(/^(\S+)\s*(.*)$/);
17
- if (m) {
18
- return { ref: m[1], inlineBody: m[2].trim() };
19
- }
20
- return { ref: t, inlineBody: "" };
21
- }
22
- function collectNoteBody(lines, noteIndex, noteIndent, inlineBody) {
23
- const parts = [];
24
- if (inlineBody) parts.push(inlineBody);
25
- let lastIndex = noteIndex;
26
- let endLineNumber = noteIndex + 1;
27
- for (let j = noteIndex + 1; j < lines.length; j++) {
28
- const raw = lines[j];
29
- const trimmed = raw.trim();
30
- if (!trimmed) break;
31
- if (measureIndent(raw) <= noteIndent) break;
32
- parts.push(trimmed);
33
- lastIndex = j;
34
- endLineNumber = j + 1;
35
- }
36
- return { body: parts.join("\n"), endLineNumber, lastIndex };
37
- }
38
- function tryCollectNote(lines, index, indent, palette, diagnostics) {
39
- const trimmed = lines[index].trim();
40
- const m = trimmed.match(/^note\s+(.+)$/i);
41
- if (!m || /^note\s+->/i.test(trimmed)) return null;
42
- const lineNumber = index + 1;
43
- const { label: headerNoColor, color } = extractColor(
44
- m[1],
45
- palette,
46
- diagnostics,
47
- lineNumber
48
- );
49
- const { ref, inlineBody } = parseNoteHeader(headerNoColor);
50
- const collected = collectNoteBody(lines, index, indent, inlineBody);
51
- if (!collected.body.trim()) {
52
- diagnostics.push(
53
- makeDgmoError(
54
- lineNumber,
55
- `Note on "${ref}" has no text \u2014 ignored.`,
56
- "warning"
57
- )
58
- );
59
- return { lastIndex: collected.lastIndex };
60
- }
61
- return {
62
- note: {
63
- ref,
64
- body: collected.body,
65
- ...color && { color },
66
- lineNumber,
67
- endLineNumber: collected.endLineNumber
68
- },
69
- lastIndex: collected.lastIndex
70
- };
71
- }
72
-
73
- export {
74
- tryCollectNote
75
- };
@@ -1,20 +0,0 @@
1
- // src/utils/note-box/constants.ts
2
- var NOTE_MAX_W = 200;
3
- var NOTE_FOLD = 10;
4
- var NOTE_PAD_H = 8;
5
- var NOTE_PAD_V = 6;
6
- var NOTE_FONT_SIZE = 10;
7
- var NOTE_LINE_H = 14;
8
- var NOTE_GAP = 22;
9
- var NOTE_BULLET_INDENT = 10;
10
-
11
- export {
12
- NOTE_MAX_W,
13
- NOTE_FOLD,
14
- NOTE_PAD_H,
15
- NOTE_PAD_V,
16
- NOTE_FONT_SIZE,
17
- NOTE_LINE_H,
18
- NOTE_GAP,
19
- NOTE_BULLET_INDENT
20
- };
@@ -1,67 +0,0 @@
1
- import {
2
- normalizeName
3
- } from "./chunk-NOTA6TEI.js";
4
- import {
5
- makeDgmoError,
6
- suggest
7
- } from "./chunk-BYU54C3S.js";
8
-
9
- // src/utils/notes/resolve.ts
10
- function resolveNotes(notes, targets, diagnostics) {
11
- const byNodeId = /* @__PURE__ */ new Map();
12
- if (notes.length === 0) return byNodeId;
13
- const byNormLabel = /* @__PURE__ */ new Map();
14
- for (const t of targets) {
15
- const key = normalizeName(t.label);
16
- const arr = byNormLabel.get(key);
17
- if (arr) arr.push(t);
18
- else byNormLabel.set(key, [t]);
19
- }
20
- for (const note of notes) {
21
- const matches = byNormLabel.get(normalizeName(note.ref));
22
- if (!matches || matches.length === 0) {
23
- if (diagnostics) {
24
- const hint = suggest(
25
- note.ref,
26
- targets.map((t) => t.label)
27
- );
28
- diagnostics.push(
29
- makeDgmoError(
30
- note.lineNumber,
31
- `Note references unknown node id "${note.ref}".${hint ? " " + hint : ""}`,
32
- "error"
33
- )
34
- );
35
- }
36
- continue;
37
- }
38
- const target = matches[0];
39
- if (matches.length > 1 && diagnostics) {
40
- diagnostics.push(
41
- makeDgmoError(
42
- note.lineNumber,
43
- `Note ref "${note.ref}" matches ${matches.length} nodes; attaching to the first.`,
44
- "warning"
45
- )
46
- );
47
- }
48
- if (byNodeId.has(target.id)) {
49
- if (diagnostics) {
50
- diagnostics.push(
51
- makeDgmoError(
52
- note.lineNumber,
53
- `Multiple notes on node "${target.label}"; keeping the first.`,
54
- "warning"
55
- )
56
- );
57
- }
58
- continue;
59
- }
60
- byNodeId.set(target.id, note);
61
- }
62
- return byNodeId;
63
- }
64
-
65
- export {
66
- resolveNotes
67
- };
@@ -1,51 +0,0 @@
1
- import {
2
- NOTE_BULLET_INDENT,
3
- NOTE_FOLD,
4
- NOTE_FONT_SIZE,
5
- NOTE_LINE_H,
6
- NOTE_MAX_W,
7
- NOTE_PAD_H,
8
- NOTE_PAD_V
9
- } from "./chunk-5DH3KYFH.js";
10
- import {
11
- wrapDescriptionLines
12
- } from "./chunk-NPWVOFB3.js";
13
- import {
14
- measureText
15
- } from "./chunk-KAO7JL4I.js";
16
-
17
- // src/utils/note-box/metrics.ts
18
- function normalizeBulletLine(line) {
19
- return line.replace(/^\s*[-*]\s+/, "\u2022 ");
20
- }
21
- function wrapNoteBody(body, textMaxWidth, fontSize = NOTE_FONT_SIZE) {
22
- const sourceLines = body.split("\n").map(normalizeBulletLine);
23
- return wrapDescriptionLines(
24
- sourceLines,
25
- textMaxWidth,
26
- (s) => measureText(s, fontSize)
27
- );
28
- }
29
- function noteBoxSize(body, opts = {}) {
30
- const fontSize = opts.fontSize ?? NOTE_FONT_SIZE;
31
- const maxW = opts.maxW ?? NOTE_MAX_W;
32
- const textMaxWidth = maxW - NOTE_PAD_H * 2;
33
- const lines = wrapNoteBody(body, textMaxWidth, fontSize);
34
- let maxLineW = 0;
35
- for (const line of lines) {
36
- const indent = line.kind === "plain" ? 0 : NOTE_BULLET_INDENT;
37
- const w = measureText(line.text, fontSize) + indent;
38
- if (w > maxLineW) maxLineW = w;
39
- }
40
- const width = Math.min(
41
- maxW,
42
- Math.max(80, maxLineW + NOTE_PAD_H * 2 + NOTE_FOLD)
43
- );
44
- const height = Math.max(1, lines.length) * NOTE_LINE_H + NOTE_PAD_V * 2;
45
- return { width, height, lines };
46
- }
47
-
48
- export {
49
- wrapNoteBody,
50
- noteBoxSize
51
- };
@@ -1,23 +0,0 @@
1
- // src/utils/safe-href.ts
2
- var ALLOWED_SCHEMES = ["http", "https", "mailto"];
3
- var SCHEME_RE = /^([a-z][a-z0-9+.-]*):/i;
4
- var LEADING_TRIM_RE = /^[\x00-\x20]+/;
5
- var URL_STRIP_RE = /[\x09\x0A\x0D]/g;
6
- function safeHref(url) {
7
- if (typeof url !== "string") return null;
8
- const trimmed = url.replace(URL_STRIP_RE, "").replace(LEADING_TRIM_RE, "");
9
- if (trimmed.length === 0) return null;
10
- const match = SCHEME_RE.exec(trimmed);
11
- if (!match) {
12
- return url;
13
- }
14
- const scheme = match[1].toLowerCase();
15
- if (ALLOWED_SCHEMES.includes(scheme)) {
16
- return url;
17
- }
18
- return null;
19
- }
20
-
21
- export {
22
- safeHref
23
- };
@@ -1,25 +0,0 @@
1
- import {
2
- layoutERDiagram
3
- } from "./chunk-MXAP37W6.js";
4
- import "./chunk-HXULJZA2.js";
5
- import "./chunk-X5BUX2GK.js";
6
- import "./chunk-EJS3K44P.js";
7
- import "./chunk-FTUMRSGT.js";
8
- import "./chunk-RJNZHFNG.js";
9
- import "./chunk-JRWUHLRP.js";
10
- import "./chunk-5DH3KYFH.js";
11
- import "./chunk-QT3KDDXK.js";
12
- import "./chunk-NPWVOFB3.js";
13
- import "./chunk-S7W75MIM.js";
14
- import "./chunk-Z6DXWULM.js";
15
- import "./chunk-ICLB27PZ.js";
16
- import "./chunk-O753JUEZ.js";
17
- import "./chunk-NOTA6TEI.js";
18
- import "./chunk-KAO7JL4I.js";
19
- import "./chunk-6GXLAKUH.js";
20
- import "./chunk-3J7O3CU6.js";
21
- import "./chunk-BYU54C3S.js";
22
- import "./chunk-YLJ4XMA6.js";
23
- export {
24
- layoutERDiagram
25
- };
@@ -1,10 +0,0 @@
1
- import {
2
- layoutSwimlane
3
- } from "./chunk-AUS7V54P.js";
4
- import "./chunk-EJS3K44P.js";
5
- import "./chunk-QT3KDDXK.js";
6
- import "./chunk-KAO7JL4I.js";
7
- import "./chunk-YLJ4XMA6.js";
8
- export {
9
- layoutSwimlane
10
- };
@@ -1,25 +0,0 @@
1
- import {
2
- layoutClassDiagram
3
- } from "./chunk-5EBYPETE.js";
4
- import "./chunk-HXULJZA2.js";
5
- import "./chunk-X5BUX2GK.js";
6
- import "./chunk-EJS3K44P.js";
7
- import "./chunk-FTUMRSGT.js";
8
- import "./chunk-RJNZHFNG.js";
9
- import "./chunk-JRWUHLRP.js";
10
- import "./chunk-5DH3KYFH.js";
11
- import "./chunk-QT3KDDXK.js";
12
- import "./chunk-NPWVOFB3.js";
13
- import "./chunk-S7W75MIM.js";
14
- import "./chunk-Z6DXWULM.js";
15
- import "./chunk-ICLB27PZ.js";
16
- import "./chunk-O753JUEZ.js";
17
- import "./chunk-NOTA6TEI.js";
18
- import "./chunk-KAO7JL4I.js";
19
- import "./chunk-6GXLAKUH.js";
20
- import "./chunk-3J7O3CU6.js";
21
- import "./chunk-BYU54C3S.js";
22
- import "./chunk-YLJ4XMA6.js";
23
- export {
24
- layoutClassDiagram
25
- };
@@ -1,32 +0,0 @@
1
- import {
2
- NODE_LABEL_LINE_HEIGHT,
3
- layoutGraph,
4
- wrapNodeLabel
5
- } from "./chunk-5SSTVFPX.js";
6
- import "./chunk-HXULJZA2.js";
7
- import "./chunk-X5BUX2GK.js";
8
- import "./chunk-EJS3K44P.js";
9
- import "./chunk-FTUMRSGT.js";
10
- import "./chunk-RJNZHFNG.js";
11
- import "./chunk-JRWUHLRP.js";
12
- import "./chunk-5DH3KYFH.js";
13
- import "./chunk-QT3KDDXK.js";
14
- import "./chunk-NPWVOFB3.js";
15
- import "./chunk-S7W75MIM.js";
16
- import "./chunk-Z6DXWULM.js";
17
- import "./chunk-ICLB27PZ.js";
18
- import "./chunk-NXMESY4J.js";
19
- import "./chunk-3Y63RFJL.js";
20
- import "./chunk-O753JUEZ.js";
21
- import "./chunk-NOTA6TEI.js";
22
- import "./chunk-TIIZIAGS.js";
23
- import "./chunk-KAO7JL4I.js";
24
- import "./chunk-6GXLAKUH.js";
25
- import "./chunk-3J7O3CU6.js";
26
- import "./chunk-BYU54C3S.js";
27
- import "./chunk-YLJ4XMA6.js";
28
- export {
29
- NODE_LABEL_LINE_HEIGHT,
30
- layoutGraph,
31
- wrapNodeLabel
32
- };
@@ -1,9 +1,6 @@
1
1
  import {
2
2
  buildSwatches
3
3
  } from "./chunk-T7NWBVSC.js";
4
- import {
5
- now
6
- } from "./chunk-3DPOIW3W.js";
7
4
  import {
8
5
  fixedParts,
9
6
  fixedTimeCells,
@@ -14,6 +11,9 @@ import {
14
11
  workStatus,
15
12
  zoneParts
16
13
  } from "./chunk-A2RUBBVT.js";
14
+ import {
15
+ now
16
+ } from "./chunk-3DPOIW3W.js";
17
17
  import {
18
18
  FONT_FAMILY
19
19
  } from "./chunk-ICLB27PZ.js";
@@ -5,12 +5,17 @@ import {
5
5
  renderCollapseBar,
6
6
  renderNodeCard
7
7
  } from "./chunk-R2K5L4UA.js";
8
+ import {
9
+ extractExportSvg,
10
+ runInExportContainer
11
+ } from "./chunk-TOHTKLKE.js";
8
12
  import {
9
13
  ScaleContext
10
14
  } from "./chunk-24YPR5EH.js";
11
15
  import {
12
- renderIntegratedLegend
13
- } from "./chunk-NMS5XSLX.js";
16
+ TITLE_FONT_SIZE,
17
+ TITLE_FONT_WEIGHT
18
+ } from "./chunk-VLC6WNRD.js";
14
19
  import {
15
20
  CARD_RADIUS,
16
21
  COLLAPSE_BAR_HEIGHT,
@@ -29,22 +34,17 @@ import {
29
34
  SEPARATOR_GAP
30
35
  } from "./chunk-XCKNFFKM.js";
31
36
  import {
32
- extractExportSvg,
33
- runInExportContainer
34
- } from "./chunk-TOHTKLKE.js";
37
+ renderIntegratedLegend
38
+ } from "./chunk-NMS5XSLX.js";
35
39
  import {
36
40
  getMaxLegendReservedHeight
37
41
  } from "./chunk-JILEYZ2V.js";
38
42
  import {
39
- TITLE_FONT_SIZE,
40
- TITLE_FONT_WEIGHT
41
- } from "./chunk-VLC6WNRD.js";
43
+ parseOrg
44
+ } from "./chunk-5OTA2PUH.js";
42
45
  import {
43
46
  FONT_FAMILY
44
47
  } from "./chunk-ICLB27PZ.js";
45
- import {
46
- parseOrg
47
- } from "./chunk-5OTA2PUH.js";
48
48
  import {
49
49
  resolveTagColor,
50
50
  tagAttrKey
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  appendArrowheadMarkers
3
3
  } from "./chunk-XBJJP2HN.js";
4
- import {
5
- ARROWHEAD_HEIGHT,
6
- ARROWHEAD_WIDTH,
7
- EDGE_DASH
8
- } from "./chunk-XCKNFFKM.js";
9
4
  import {
10
5
  TITLE_FONT_SIZE,
11
6
  TITLE_FONT_WEIGHT,
12
7
  TITLE_Y
13
8
  } from "./chunk-VLC6WNRD.js";
9
+ import {
10
+ ARROWHEAD_HEIGHT,
11
+ ARROWHEAD_WIDTH,
12
+ EDGE_DASH
13
+ } from "./chunk-XCKNFFKM.js";
14
14
  import {
15
15
  FONT_FAMILY
16
16
  } from "./chunk-ICLB27PZ.js";
@@ -1,6 +1,10 @@
1
1
  import {
2
2
  familyCardRows
3
3
  } from "./chunk-IVKC4GID.js";
4
+ import {
5
+ buildCoupleQuotient,
6
+ rankClasses
7
+ } from "./chunk-QQJUTGQH.js";
4
8
  import {
5
9
  HEADER_HEIGHT,
6
10
  LABEL_FONT_SIZE,
@@ -8,10 +12,6 @@ import {
8
12
  META_LINE_HEIGHT,
9
13
  SEPARATOR_GAP
10
14
  } from "./chunk-XCKNFFKM.js";
11
- import {
12
- buildCoupleQuotient,
13
- rankClasses
14
- } from "./chunk-QQJUTGQH.js";
15
15
  import {
16
16
  measureText
17
17
  } from "./chunk-KAO7JL4I.js";
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  inferParticipantType
3
3
  } from "./chunk-C3Z4DX3V.js";
4
- import {
5
- parseInArrowLabel
6
- } from "./chunk-N7VMGZCU.js";
7
4
  import {
8
5
  tryStripDescriptionKeyword
9
6
  } from "./chunk-IYULMRBE.js";
7
+ import {
8
+ parseInArrowLabel
9
+ } from "./chunk-N7VMGZCU.js";
10
10
  import {
11
11
  normalizeName
12
12
  } from "./chunk-NOTA6TEI.js";
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  GRAPH_DX
3
3
  } from "./chunk-TIVMAITN.js";
4
- import {
5
- parseInArrowLabel
6
- } from "./chunk-N7VMGZCU.js";
7
4
  import {
8
5
  tryStripDescriptionKeyword
9
6
  } from "./chunk-IYULMRBE.js";
7
+ import {
8
+ parseInArrowLabel
9
+ } from "./chunk-N7VMGZCU.js";
10
10
  import {
11
11
  displayName,
12
12
  normalizeName
@@ -1,12 +1,12 @@
1
- import {
2
- EDGE_DASH,
3
- HAIRLINE_DASH
4
- } from "./chunk-XCKNFFKM.js";
5
1
  import {
6
2
  TITLE_FONT_SIZE,
7
3
  TITLE_FONT_WEIGHT,
8
4
  TITLE_Y
9
5
  } from "./chunk-VLC6WNRD.js";
6
+ import {
7
+ EDGE_DASH,
8
+ HAIRLINE_DASH
9
+ } from "./chunk-XCKNFFKM.js";
10
10
  import {
11
11
  FONT_FAMILY
12
12
  } from "./chunk-ICLB27PZ.js";