@diagrammo/dgmo 0.48.2 → 0.50.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 (244) hide show
  1. package/.cursorrules +12 -3
  2. package/.github/copilot-instructions.md +12 -3
  3. package/.windsurfrules +12 -3
  4. package/SKILL.md +12 -3
  5. package/dist/advanced.d.ts +851 -1
  6. package/dist/advanced.js +601 -177
  7. package/dist/auto.css +63 -0
  8. package/dist/auto.js +220 -110
  9. package/dist/auto.mjs +45920 -33167
  10. package/dist/block.css +63 -0
  11. package/dist/block.d.ts +13 -5
  12. package/dist/block.js +239 -62
  13. package/dist/{charts-d3-QOZHKTCT.js → charts-d3-DKUD7MQE.js} +9 -8
  14. package/dist/{chunk-3MQQNXPD.js → chunk-2C56LEML.js} +3 -3
  15. package/dist/{chunk-L66GEFB6.js → chunk-2JJ2KNPI.js} +4 -4
  16. package/dist/{chunk-6SM5NJQH.js → chunk-2QYTMIRR.js} +4 -4
  17. package/dist/{chunk-RJE5JTVK.js → chunk-3G6TMNVF.js} +7 -7
  18. package/dist/{chunk-MO5YHHMQ.js → chunk-3LKM6FMW.js} +2 -2
  19. package/dist/{chunk-76OWZ3BA.js → chunk-3P2DKJCG.js} +2 -2
  20. package/dist/chunk-3TDRHT4J.js +1043 -0
  21. package/dist/chunk-3XPUDB7B.js +420 -0
  22. package/dist/{chunk-2LACINWN.js → chunk-3ZPC476N.js} +7 -7
  23. package/dist/{chunk-G2H74XJZ.js → chunk-4BMJQFNK.js} +8 -8
  24. package/dist/{chunk-THXCFRTU.js → chunk-4S723I74.js} +9 -9
  25. package/dist/{chunk-6NYWYNBI.js → chunk-4XK3FLFB.js} +3 -3
  26. package/dist/chunk-5JSWBPZZ.js +607 -0
  27. package/dist/{chunk-WCT3NYCV.js → chunk-5LWQH6QV.js} +1 -1
  28. package/dist/{chunk-7DTWEFUE.js → chunk-5Z736BSU.js} +8 -8
  29. package/dist/{chunk-ERLBPDGU.js → chunk-6BFZKBGD.js} +2 -2
  30. package/dist/{chunk-6HO5ZTXK.js → chunk-6IAA2QQ2.js} +2 -2
  31. package/dist/{chunk-H6PI3KJT.js → chunk-6IUAK7RZ.js} +2 -2
  32. package/dist/{chunk-RTLBSQ3G.js → chunk-6M5PJFQG.js} +3 -3
  33. package/dist/{chunk-Z5CGSFJB.js → chunk-6X4AKWLF.js} +4 -4
  34. package/dist/{chunk-OJR3MQYV.js → chunk-6ZT4U37Q.js} +291 -52
  35. package/dist/{chunk-5QXL4NYS.js → chunk-7G2ER4CY.js} +10 -5
  36. package/dist/chunk-7PQYTZMA.js +681 -0
  37. package/dist/{chunk-OURHMODR.js → chunk-7RB5Q6MB.js} +11 -11
  38. package/dist/{chunk-YAA6IID3.js → chunk-7UEMZREK.js} +2 -2
  39. package/dist/{chunk-AN2MOO5T.js → chunk-A3WQVFBS.js} +3 -3
  40. package/dist/{chunk-VOKGH627.js → chunk-AHGF2YYA.js} +13 -3
  41. package/dist/{chunk-CI2G3OEB.js → chunk-ASS5YYIZ.js} +12 -12
  42. package/dist/{chunk-TYS6CSS5.js → chunk-BCYVE3N5.js} +2 -2
  43. package/dist/chunk-BDXC7MDK.js +2395 -0
  44. package/dist/chunk-BTUTZMPT.js +482 -0
  45. package/dist/{chunk-YGJTDXVR.js → chunk-C4GQDB5L.js} +2 -2
  46. package/dist/{chunk-Y2ZE3MSG.js → chunk-C63UWAKM.js} +2 -2
  47. package/dist/{chunk-725LDASD.js → chunk-CLD2OKV7.js} +2 -2
  48. package/dist/{chunk-WBRZJOEC.js → chunk-CMCR5WBW.js} +3 -3
  49. package/dist/{chunk-IZMRON6C.js → chunk-CVV36CWI.js} +2 -2
  50. package/dist/chunk-DMJJ3CEQ.js +254 -0
  51. package/dist/{chunk-MZSBFAPJ.js → chunk-EJTKV7CY.js} +9 -9
  52. package/dist/{chunk-FITOLXSX.js → chunk-EOFPYPAU.js} +26 -2
  53. package/dist/{chunk-X5LCYCL5.js → chunk-ER5SCQWQ.js} +5 -5
  54. package/dist/{chunk-4OHACBGX.js → chunk-F2L5GCQ4.js} +2 -2
  55. package/dist/{chunk-FCIIHT24.js → chunk-F5UDBSJY.js} +7 -7
  56. package/dist/{chunk-3JLKYGBQ.js → chunk-F7BFXWNQ.js} +2 -2
  57. package/dist/{chunk-FANX6UJR.js → chunk-FAL7NOK3.js} +11 -11
  58. package/dist/{chunk-BUPDIHML.js → chunk-FB2WHOEQ.js} +4 -4
  59. package/dist/chunk-FL4IOQ37.js +379 -0
  60. package/dist/{chunk-LIOHW36Z.js → chunk-GBE54KY6.js} +6 -5
  61. package/dist/{chunk-RUNNI6VE.js → chunk-GL5UZ6NY.js} +3 -3
  62. package/dist/{chunk-4GRI7MEB.js → chunk-GPWHQ5FJ.js} +6 -6
  63. package/dist/chunk-GROQGHCT.js +960 -0
  64. package/dist/{chunk-SGZYXELT.js → chunk-H73FP42Q.js} +9 -6
  65. package/dist/{chunk-PBAHEPLQ.js → chunk-HGN652MU.js} +7 -6
  66. package/dist/{chunk-3SMGIJDD.js → chunk-HHXOONLX.js} +13 -1
  67. package/dist/{chunk-QOOUC2J5.js → chunk-HQCHYB5F.js} +2 -2
  68. package/dist/{chunk-AELOBFW5.js → chunk-I4IFRCUB.js} +3 -3
  69. package/dist/{chunk-GMR5MFHJ.js → chunk-I7F2A35O.js} +2 -2
  70. package/dist/{chunk-T2OE3YQB.js → chunk-IA3FJYWR.js} +3 -3
  71. package/dist/chunk-IAEC4KLA.js +492 -0
  72. package/dist/chunk-IVKC4GID.js +32 -0
  73. package/dist/{chunk-HSH73DP6.js → chunk-JFYIP7XU.js} +139 -39
  74. package/dist/{chunk-CKNVO24D.js → chunk-JZNMXEIV.js} +2 -2
  75. package/dist/chunk-KJXIHOVL.js +940 -0
  76. package/dist/chunk-L2ZTFHAY.js +331 -0
  77. package/dist/{chunk-B7JUCQUA.js → chunk-M5RXSRO2.js} +4 -4
  78. package/dist/{chunk-ULOEATBZ.js → chunk-NFFIKVNO.js} +106 -29
  79. package/dist/{chunk-PZMETGLY.js → chunk-NISQC5KW.js} +358 -122
  80. package/dist/chunk-O4VUFXIH.js +574 -0
  81. package/dist/{chunk-RVMRZAPB.js → chunk-O76UD6VJ.js} +3 -3
  82. package/dist/{chunk-JM4LEPY3.js → chunk-O7NUCTFU.js} +2 -2
  83. package/dist/{chunk-JED6ZDEE.js → chunk-O7WP4ZD4.js} +2 -2
  84. package/dist/{chunk-EVCVDTXE.js → chunk-OHQEMBLI.js} +3 -3
  85. package/dist/{chunk-ZBWMSD5N.js → chunk-ONA5KPV3.js} +4 -4
  86. package/dist/{chunk-Y3J7VR52.js → chunk-OTAL43EH.js} +34 -2
  87. package/dist/{chunk-WCSOJFU3.js → chunk-OTP5KVLO.js} +3 -3
  88. package/dist/{chunk-RYEGFMUO.js → chunk-PGEGPSCZ.js} +2 -2
  89. package/dist/{chunk-ZO27FGJS.js → chunk-PH5X4GIP.js} +2 -2
  90. package/dist/{chunk-ZJEL4H2R.js → chunk-PJUGRJHJ.js} +9 -9
  91. package/dist/{chunk-ZGR7ULFJ.js → chunk-PLZI6KPM.js} +26 -14
  92. package/dist/{chunk-3R5POCTZ.js → chunk-PMN3Q7RJ.js} +6 -6
  93. package/dist/{chunk-YGJZWZTY.js → chunk-PZFVK3IH.js} +2 -2
  94. package/dist/chunk-Q4V4XQWV.js +158 -0
  95. package/dist/chunk-QDFNCATJ.js +325 -0
  96. package/dist/{chunk-QEBUY5NY.js → chunk-QFQ35BTO.js} +4 -4
  97. package/dist/chunk-QQJUTGQH.js +135 -0
  98. package/dist/{chunk-PWIHZ6NJ.js → chunk-QUJGFNFN.js} +4 -4
  99. package/dist/{chunk-J5FIXQRT.js → chunk-R56LASIN.js} +4 -4
  100. package/dist/{chunk-SRTU6HMQ.js → chunk-RV26LTUU.js} +8 -8
  101. package/dist/chunk-RV6A2B5S.js +354 -0
  102. package/dist/{chunk-EB6FPQUP.js → chunk-S5GRONXL.js} +3 -3
  103. package/dist/{chunk-5MLYVTYM.js → chunk-SCHXJTZL.js} +2 -2
  104. package/dist/{chunk-T3UBLACL.js → chunk-SCQ5VPUF.js} +19 -5
  105. package/dist/{chunk-PBHE5UG6.js → chunk-SGFZZAUO.js} +46 -12
  106. package/dist/{chunk-BUVJFRPY.js → chunk-SU2VBK4L.js} +4 -4
  107. package/dist/{chunk-SML67VPV.js → chunk-T4BRO3Z6.js} +3 -3
  108. package/dist/{chunk-NURGB5Z4.js → chunk-TSA237IM.js} +2 -2
  109. package/dist/chunk-TWCLK2GA.js +273 -0
  110. package/dist/{chunk-IJZFN3HM.js → chunk-TWQUYVP3.js} +4 -4
  111. package/dist/{chunk-DKEPS5LH.js → chunk-U2HGPLZS.js} +36 -2
  112. package/dist/{chunk-B65G5DNL.js → chunk-URSQLCTR.js} +3 -3
  113. package/dist/{chunk-ILKORZ3H.js → chunk-UUS2GIJZ.js} +7 -7
  114. package/dist/{chunk-XAKEUMEJ.js → chunk-UXOSVCLJ.js} +4 -4
  115. package/dist/{chunk-QLCCJEJI.js → chunk-WCUHAQKB.js} +2 -2
  116. package/dist/{chunk-WVAJFAIA.js → chunk-WWN566I7.js} +257 -101
  117. package/dist/{chunk-IPWPWM6R.js → chunk-X2NMFTG3.js} +111 -10
  118. package/dist/{chunk-UWN33VNX.js → chunk-XCLHOZAM.js} +10 -10
  119. package/dist/{chunk-P235SVAH.js → chunk-XDXNDSKO.js} +2 -2
  120. package/dist/chunk-XHVV4NVW.js +51 -0
  121. package/dist/{chunk-33LCUH4H.js → chunk-XMVQ5F4M.js} +4 -4
  122. package/dist/{chunk-MITI6NOL.js → chunk-YA7D2N2O.js} +11 -11
  123. package/dist/{chunk-7JEGTRLD.js → chunk-YB3FW24O.js} +3 -3
  124. package/dist/chunk-YNRDWYZP.js +295 -0
  125. package/dist/{chunk-44CM72SQ.js → chunk-YZLMKW4T.js} +3 -3
  126. package/dist/chunk-Z6XJQ6KO.js +452 -0
  127. package/dist/cli.cjs +179 -133
  128. package/dist/clock.d.ts +10 -0
  129. package/dist/clock.js +235 -0
  130. package/dist/countdown.d.ts +12 -0
  131. package/dist/countdown.js +450 -0
  132. package/dist/dgmo-router-QOMFCOOV.js +84 -0
  133. package/dist/dimensions-P5FSX2QN.js +22 -0
  134. package/dist/editor.js +43 -2
  135. package/dist/element.js +220 -110
  136. package/dist/element.mjs +45920 -33167
  137. package/dist/{flowchart-parser-ZNSKIBVR.js → flowchart-parser-OE4WHLTF.js} +4 -4
  138. package/dist/{flowchart-renderer-SNDSII4D.js → flowchart-renderer-GPCSMTOR.js} +8 -8
  139. package/dist/highlight.d.ts +17 -1
  140. package/dist/highlight.js +163 -6
  141. package/dist/index.d.ts +5 -1
  142. package/dist/index.js +199 -233
  143. package/dist/{layout-HRBZPFCN.js → layout-34CLNICW.js} +5 -5
  144. package/dist/layout-46366KBT.js +10 -0
  145. package/dist/{layout-HWDSRX5E.js → layout-5BG6DFCU.js} +6 -6
  146. package/dist/layout-6RDJHS6E.js +9 -0
  147. package/dist/{layout-7QXCNOVS.js → layout-7H4H46CS.js} +3 -3
  148. package/dist/{layout-46N4JJYK.js → layout-7SKMFYHL.js} +5 -5
  149. package/dist/{layout-EE6GE46Y.js → layout-DC4TVXER.js} +5 -5
  150. package/dist/layout-FGQWRYYW.js +14 -0
  151. package/dist/{layout-S2QBYSK2.js → layout-NXG63LWH.js} +3 -3
  152. package/dist/{layout-N76NR4ZO.js → layout-PUQCB6AN.js} +7 -7
  153. package/dist/{layout-HYZPWAK5.js → layout-QNUQLEHU.js} +3 -3
  154. package/dist/{layout-UM5F4DJB.js → layout-T3OZU5QW.js} +5 -5
  155. package/dist/layout-TJIWF7EM.js +14 -0
  156. package/dist/layout-VYELEAW7.js +14 -0
  157. package/dist/{layout-5RA6QWR6.js → layout-WZHNDT2O.js} +6 -6
  158. package/dist/{layout-search-OYV77HHS.js → layout-search-QS44PI5R.js} +6 -6
  159. package/dist/{parser-6BTRLKRZ.js → parser-45DENHFZ.js} +4 -4
  160. package/dist/{parser-TFZFBVWN.js → parser-4AI5ZN5F.js} +3 -3
  161. package/dist/{parser-XDVELHRK.js → parser-4P36TUVD.js} +4 -4
  162. package/dist/{parser-ZSDPZYQP.js → parser-5AURY4A6.js} +4 -4
  163. package/dist/{parser-N5O4IHUN.js → parser-A2BEFMGK.js} +4 -4
  164. package/dist/parser-B5FVS7O6.js +11 -0
  165. package/dist/{parser-NGU3ETO6.js → parser-C2HF2C2E.js} +4 -4
  166. package/dist/parser-CSFUN3CT.js +14 -0
  167. package/dist/{parser-TRTHDFPP.js → parser-D3QT6GWN.js} +5 -5
  168. package/dist/parser-D5637H5H.js +15 -0
  169. package/dist/{parser-VQP2UJ6W.js → parser-DFFEDKHH.js} +3 -3
  170. package/dist/parser-DOKMZXVZ.js +13 -0
  171. package/dist/parser-FMPCVFRK.js +15 -0
  172. package/dist/{parser-Y6WTBU76.js → parser-HYRTF3DO.js} +3 -3
  173. package/dist/{parser-I6KXEYFK.js → parser-I2UIJKVQ.js} +4 -4
  174. package/dist/{parser-O5J4VBII.js → parser-IBWNAPY4.js} +3 -3
  175. package/dist/{parser-PQ3POX45.js → parser-KUQWRPIT.js} +4 -4
  176. package/dist/{parser-2MFP2H2E.js → parser-LWKKBNSA.js} +3 -3
  177. package/dist/{parser-OV7NOBW6.js → parser-O4QFCUW7.js} +5 -5
  178. package/dist/{parser-IXSZZQHY.js → parser-PGMQDD4G.js} +4 -4
  179. package/dist/{parser-3STE62GB.js → parser-Q4QKCIWQ.js} +4 -4
  180. package/dist/parser-QTOB4KFL.js +14 -0
  181. package/dist/{parser-2EWECDSA.js → parser-QYYM4QVW.js} +4 -4
  182. package/dist/{parser-4OGOBJJ4.js → parser-RZMQP7MM.js} +4 -4
  183. package/dist/parser-RZPVAQVX.js +11 -0
  184. package/dist/parser-SOUJOEYI.js +13 -0
  185. package/dist/{parser-4FL2CMDG.js → parser-UQE5OWZI.js} +5 -5
  186. package/dist/{parser-NRAI6O25.js → parser-WAV5JRPT.js} +4 -4
  187. package/dist/{parser-KNSQSKQO.js → parser-YLKYBRIT.js} +5 -5
  188. package/dist/{parser-XKRP7QKP.js → parser-YS7TOS2K.js} +3 -3
  189. package/dist/{parser-AQETEVRW.js → parser-ZSOWUBML.js} +5 -5
  190. package/dist/{parser-CFZD5IBL.js → parser-ZTBATMLX.js} +4 -4
  191. package/dist/{renderer-VACVQYML.js → renderer-35HSIDMZ.js} +8 -8
  192. package/dist/{renderer-5MYBMBYO.js → renderer-4ITCHBT7.js} +5 -5
  193. package/dist/{renderer-CLJHQPBJ.js → renderer-67NPCBIS.js} +11 -11
  194. package/dist/{renderer-5NDVNDAZ.js → renderer-6GHYK7DX.js} +9 -9
  195. package/dist/{renderer-Z7I3W2PP.js → renderer-6RNGHC5Z.js} +8 -8
  196. package/dist/renderer-72LGR2YF.js +14 -0
  197. package/dist/{renderer-KQB7UGDS.js → renderer-7RH2SI3B.js} +3 -3
  198. package/dist/renderer-7SWMIFMM.js +21 -0
  199. package/dist/renderer-BBCEFILK.js +24 -0
  200. package/dist/{renderer-JGBKUCZD.js → renderer-BSW7SRIZ.js} +4 -4
  201. package/dist/{renderer-BYCNMBF7.js → renderer-BY533UWU.js} +11 -11
  202. package/dist/{renderer-6W5462RB.js → renderer-BZSBPTZJ.js} +9 -9
  203. package/dist/{renderer-7MVLWWQD.js → renderer-CXUC4KAD.js} +9 -9
  204. package/dist/{renderer-QIWVHWZO.js → renderer-DAXMXIKD.js} +3 -3
  205. package/dist/renderer-FZUKFUNZ.js +23 -0
  206. package/dist/renderer-G2NLGNKF.js +17 -0
  207. package/dist/renderer-GO3FE3RA.js +24 -0
  208. package/dist/{renderer-ZGNTUWC4.js → renderer-HPGR6USK.js} +8 -8
  209. package/dist/{renderer-UV6MI64M.js → renderer-HVCU2C3Z.js} +3 -3
  210. package/dist/renderer-ICJN2SA2.js +24 -0
  211. package/dist/{renderer-AWWAF6XD.js → renderer-INEXO7B6.js} +10 -10
  212. package/dist/{renderer-YY2OSF6E.js → renderer-KDYCFRBX.js} +8 -8
  213. package/dist/renderer-KY4KQBTF.js +19 -0
  214. package/dist/{renderer-B2OMQIQG.js → renderer-LBN65V45.js} +13 -13
  215. package/dist/{renderer-N43WR5GV.js → renderer-MGBWOCXG.js} +10 -10
  216. package/dist/{renderer-PGX2TKVS.js → renderer-O4JKUGKO.js} +8 -8
  217. package/dist/{renderer-4JHRUBE6.js → renderer-OOGFODWP.js} +10 -10
  218. package/dist/{renderer-6EEZHMH4.js → renderer-Q6ZKPLS6.js} +9 -9
  219. package/dist/{renderer-RPOA5YPZ.js → renderer-SZQ326M5.js} +12 -12
  220. package/dist/{renderer-ZRNG54CW.js → renderer-TKG6LS4U.js} +11 -11
  221. package/dist/{renderer-W4M6QLIJ.js → renderer-TQMZGDAX.js} +13 -13
  222. package/dist/renderer-radial-JELMHQ24.js +21 -0
  223. package/dist/{resolver-NOAA7ID7.js → resolver-FHBCO3PL.js} +3 -3
  224. package/dist/{state-parser-Z2V23ATR.js → state-parser-3REXRK3R.js} +4 -4
  225. package/dist/{state-renderer-B4DQBM6M.js → state-renderer-XYLNRWXR.js} +8 -8
  226. package/docs/ai-integration.md +12 -3
  227. package/docs/language-reference.md +429 -24
  228. package/gallery/fixtures/body.dgmo +17 -0
  229. package/gallery/fixtures/bracket.dgmo +30 -0
  230. package/gallery/fixtures/clock.dgmo +8 -0
  231. package/gallery/fixtures/countdown.dgmo +3 -0
  232. package/gallery/fixtures/family.dgmo +23 -0
  233. package/gallery/fixtures/goal.dgmo +4 -0
  234. package/gallery/fixtures/sketch.dgmo +22 -0
  235. package/package.json +12 -4
  236. package/dist/chunk-ODZVHU3R.js +0 -153
  237. package/dist/dgmo-router-X35VLZLM.js +0 -73
  238. package/dist/dimensions-J3FHIMJ6.js +0 -22
  239. package/dist/layout-5T6RH5M6.js +0 -14
  240. package/dist/layout-G23F7LDH.js +0 -9
  241. package/dist/layout-OB3RI63S.js +0 -14
  242. package/dist/parser-JAL2HD4I.js +0 -13
  243. package/dist/renderer-SMIBCRVB.js +0 -24
  244. package/dist/renderer-radial-C32GPJQ7.js +0 -21
@@ -0,0 +1,254 @@
1
+ import {
2
+ BODY_TERMS,
3
+ getFigure,
4
+ resolvePartKey
5
+ } from "./chunk-BDXC7MDK.js";
6
+ import {
7
+ AUTO_TAG_COLOR_SENTINEL,
8
+ finalizeAutoTagColors,
9
+ matchTagBlockHeading,
10
+ stripDefaultModifier,
11
+ tagAttrKey
12
+ } from "./chunk-WCUHAQKB.js";
13
+ import {
14
+ extractColor,
15
+ measureIndent,
16
+ parseFirstLine
17
+ } from "./chunk-OTAL43EH.js";
18
+ import {
19
+ emit
20
+ } from "./chunk-CXK4DZH3.js";
21
+
22
+ // src/body/diagnostics.ts
23
+ var BODY_DX = {
24
+ // parser.ts: header line is not `body …`
25
+ EXPECTED_HEADER: {
26
+ code: "E_BODY_EXPECTED_HEADER",
27
+ severity: "error",
28
+ chartType: "body",
29
+ title: "Missing header",
30
+ message: 'Expected "body [Title]" as the first line.',
31
+ hint: "Start the diagram with `body` (optionally followed by a title).",
32
+ example: `body Push Day
33
+ muscle
34
+ chest effort: Primary`
35
+ },
36
+ // parser.ts: a named part isn't in the catalog for the active figure
37
+ UNKNOWN_PART: {
38
+ code: "W_BODY_UNKNOWN_PART",
39
+ severity: "warning",
40
+ chartType: "body",
41
+ title: "Unknown body part",
42
+ message: (p) => `Unknown body part '${p.name ?? "quadratus"}' \u2014 not in the anatomy catalog for this figure.`,
43
+ hint: "Use a catalog name like chest, biceps, triceps, abs, quadriceps, or calves.",
44
+ example: `body
45
+
46
+ xyz effort: Primary`
47
+ },
48
+ // renderer.ts: requested form/sex/view isn't shipped in this build
49
+ UNSUPPORTED_FIGURE: {
50
+ code: "W_BODY_UNSUPPORTED_FIGURE",
51
+ severity: "warning",
52
+ chartType: "body",
53
+ title: "Figure not available",
54
+ message: (p) => `The ${p.figure ?? "female back skin"} figure isn't available yet; rendering the male front-view muscle figure instead.`,
55
+ hint: "This build ships only male / front / muscle. Other forms/views are a fast-follow.",
56
+ example: `body
57
+
58
+ female
59
+ back`
60
+ }
61
+ };
62
+ var BODY_DIAGNOSTICS = Object.values(BODY_DX);
63
+
64
+ // src/body/parser.ts
65
+ var FORM_RE = /^(muscle|skin|skeletal)$/i;
66
+ var SEX_RE = /^(male|female)$/i;
67
+ var VIEW_RE = /^(front|back)$/i;
68
+ var PART_RE = /^([a-zA-Z][\w-]*)\s*(.*)$/;
69
+ var META_PAIR_RE = /([a-zA-Z][\w-]*)\s*:\s*([^,]+)/g;
70
+ function parseBody(content, palette) {
71
+ const lines = content.split("\n");
72
+ const diagnostics = [];
73
+ const views = [];
74
+ const options = {
75
+ form: "muscle",
76
+ sex: "male",
77
+ views,
78
+ noLegend: false
79
+ };
80
+ const tagGroups = [];
81
+ const parts = [];
82
+ const aliasMap = /* @__PURE__ */ new Map();
83
+ let title = null;
84
+ let titleLineNumber = null;
85
+ let headerParsed = false;
86
+ let currentTagGroup = null;
87
+ let currentPart = null;
88
+ let contentStarted = false;
89
+ for (let i = 0; i < lines.length; i++) {
90
+ const line = lines[i];
91
+ const trimmed = line.trim();
92
+ if (!trimmed) {
93
+ currentTagGroup = null;
94
+ continue;
95
+ }
96
+ if (trimmed.startsWith("//")) continue;
97
+ const indent = measureIndent(line);
98
+ const lineNumber = i + 1;
99
+ if (!headerParsed) {
100
+ const firstLine = parseFirstLine(trimmed);
101
+ if (firstLine?.chartType === "body") {
102
+ title = firstLine.title ?? null;
103
+ titleLineNumber = lineNumber;
104
+ headerParsed = true;
105
+ continue;
106
+ }
107
+ return {
108
+ title: null,
109
+ titleLineNumber: null,
110
+ options,
111
+ tagGroups: [],
112
+ parts: [],
113
+ diagnostics,
114
+ error: emit(BODY_DX.EXPECTED_HEADER, lineNumber)
115
+ };
116
+ }
117
+ if (indent === 0 && !contentStarted) {
118
+ if (FORM_RE.test(trimmed)) {
119
+ options.form = trimmed.toLowerCase();
120
+ currentTagGroup = null;
121
+ continue;
122
+ }
123
+ if (SEX_RE.test(trimmed)) {
124
+ options.sex = trimmed.toLowerCase();
125
+ currentTagGroup = null;
126
+ continue;
127
+ }
128
+ if (VIEW_RE.test(trimmed)) {
129
+ const v = trimmed.toLowerCase();
130
+ if (!views.includes(v)) views.push(v);
131
+ currentTagGroup = null;
132
+ continue;
133
+ }
134
+ if (/^no-legend$/i.test(trimmed)) {
135
+ options.noLegend = true;
136
+ continue;
137
+ }
138
+ }
139
+ const tagBlockMatch = matchTagBlockHeading(trimmed);
140
+ if (tagBlockMatch && !contentStarted) {
141
+ currentTagGroup = {
142
+ name: tagBlockMatch.name,
143
+ ...tagBlockMatch.alias !== void 0 && {
144
+ alias: tagBlockMatch.alias
145
+ },
146
+ entries: [],
147
+ lineNumber
148
+ };
149
+ if (tagBlockMatch.alias) {
150
+ aliasMap.set(
151
+ tagBlockMatch.alias.toLowerCase(),
152
+ tagAttrKey(tagBlockMatch.name)
153
+ );
154
+ }
155
+ aliasMap.set(
156
+ tagAttrKey(tagBlockMatch.name),
157
+ tagAttrKey(tagBlockMatch.name)
158
+ );
159
+ tagGroups.push(currentTagGroup);
160
+ currentPart = null;
161
+ continue;
162
+ }
163
+ if (currentTagGroup && !contentStarted && indent > 0) {
164
+ const { text: cleanEntry, isDefault } = stripDefaultModifier(trimmed);
165
+ const { label, color } = extractColor(
166
+ cleanEntry,
167
+ palette,
168
+ diagnostics,
169
+ lineNumber
170
+ );
171
+ if (isDefault || currentTagGroup.entries.length === 0) {
172
+ currentTagGroup.defaultValue = label;
173
+ }
174
+ currentTagGroup.entries.push({
175
+ value: label,
176
+ color: color ?? AUTO_TAG_COLOR_SENTINEL,
177
+ lineNumber
178
+ });
179
+ continue;
180
+ }
181
+ if (indent > 0 && currentPart) {
182
+ currentPart.notes = [
183
+ ...currentPart.notes,
184
+ trimmed.replace(/^[-*]\s*/, "")
185
+ ];
186
+ continue;
187
+ }
188
+ if (indent === 0) {
189
+ const m = trimmed.match(PART_RE);
190
+ if (m) {
191
+ contentStarted = true;
192
+ currentTagGroup = null;
193
+ let name = m[1];
194
+ let rest = m[2] ?? "";
195
+ let side;
196
+ if (/^(left|right)$/i.test(name)) {
197
+ const m2 = rest.match(PART_RE);
198
+ if (m2) {
199
+ side = name.toLowerCase();
200
+ name = m2[1];
201
+ rest = m2[2] ?? "";
202
+ }
203
+ }
204
+ const metadata = {};
205
+ for (const pair of rest.matchAll(META_PAIR_RE)) {
206
+ const key = aliasMap.get(pair[1].toLowerCase()) ?? tagAttrKey(pair[1]);
207
+ metadata[key] = pair[2].trim();
208
+ }
209
+ currentPart = {
210
+ name,
211
+ metadata,
212
+ notes: [],
213
+ lineNumber,
214
+ ...side && { side }
215
+ };
216
+ parts.push(currentPart);
217
+ continue;
218
+ }
219
+ }
220
+ }
221
+ finalizeAutoTagColors(tagGroups, palette);
222
+ if (views.length === 0) views.push("front");
223
+ const figures = views.map((v) => getFigure(options.sex, v));
224
+ for (const part of parts) {
225
+ if (!figures.some((f) => resolvePartKey(f, part.name))) {
226
+ diagnostics.push(
227
+ emit(BODY_DX.UNKNOWN_PART, part.lineNumber, { name: part.name })
228
+ );
229
+ }
230
+ }
231
+ return {
232
+ title,
233
+ titleLineNumber,
234
+ options,
235
+ tagGroups,
236
+ parts,
237
+ diagnostics
238
+ };
239
+ }
240
+ function extractSymbols(docText) {
241
+ const parsed = parseBody(docText);
242
+ const figures = (parsed.options.views.length ? parsed.options.views : ["front"]).map((v) => getFigure(parsed.options.sex, v));
243
+ const entities = BODY_TERMS.filter(
244
+ (t) => t === "left" || t === "right" || figures.some((f) => resolvePartKey(f, t))
245
+ );
246
+ return { kind: "body", entities };
247
+ }
248
+
249
+ export {
250
+ BODY_DIAGNOSTICS,
251
+ parseBody,
252
+ extractSymbols
253
+ };
254
+ //# sourceMappingURL=chunk-DMJJ3CEQ.js.map
@@ -4,15 +4,15 @@ import {
4
4
  import {
5
5
  CARD_RADIUS
6
6
  } from "./chunk-3CIOJ5YJ.js";
7
- import {
8
- renderIntegratedLegend
9
- } from "./chunk-PWIHZ6NJ.js";
10
7
  import {
11
8
  ScaleContext
12
9
  } from "./chunk-YYVTBZZC.js";
10
+ import {
11
+ renderIntegratedLegend
12
+ } from "./chunk-QUJGFNFN.js";
13
13
  import {
14
14
  getMaxLegendReservedHeight
15
- } from "./chunk-YAA6IID3.js";
15
+ } from "./chunk-7UEMZREK.js";
16
16
  import {
17
17
  TITLE_FONT_SIZE,
18
18
  TITLE_FONT_WEIGHT
@@ -23,13 +23,13 @@ import {
23
23
  import {
24
24
  LEGEND_HEIGHT,
25
25
  measureLegendText
26
- } from "./chunk-QOOUC2J5.js";
26
+ } from "./chunk-HQCHYB5F.js";
27
27
  import {
28
28
  measureText
29
- } from "./chunk-WCT3NYCV.js";
29
+ } from "./chunk-5LWQH6QV.js";
30
30
  import {
31
31
  parseKanban
32
- } from "./chunk-AELOBFW5.js";
32
+ } from "./chunk-I4IFRCUB.js";
33
33
  import {
34
34
  contrastText,
35
35
  mix,
@@ -37,7 +37,7 @@ import {
37
37
  } from "./chunk-P6T66CCZ.js";
38
38
  import {
39
39
  tagAttrKey
40
- } from "./chunk-QLCCJEJI.js";
40
+ } from "./chunk-WCUHAQKB.js";
41
41
 
42
42
  // src/kanban/renderer.ts
43
43
  import * as d3Selection from "d3-selection";
@@ -882,4 +882,4 @@ export {
882
882
  renderKanban,
883
883
  renderKanbanForExport
884
884
  };
885
- //# sourceMappingURL=chunk-MZSBFAPJ.js.map
885
+ //# sourceMappingURL=chunk-EJTKV7CY.js.map
@@ -9,7 +9,7 @@ import {
9
9
  } from "./chunk-I5IGB56C.js";
10
10
  import {
11
11
  MAP_DX
12
- } from "./chunk-3SMGIJDD.js";
12
+ } from "./chunk-HHXOONLX.js";
13
13
  import {
14
14
  emit,
15
15
  formatDgmoError,
@@ -420,11 +420,29 @@ function resolveMap(parsed, data) {
420
420
  if (fn && fn !== p.id && !declaredByName.has(fn))
421
421
  declaredByName.set(fn, p.id);
422
422
  }
423
+ const declaredByLabel = /* @__PURE__ */ new Map();
424
+ const ambiguousLabel = /* @__PURE__ */ new Set();
425
+ for (const p of pois) {
426
+ const fl = p.label ? fold(p.label) : void 0;
427
+ if (!fl) continue;
428
+ if (declaredByLabel.has(fl)) ambiguousLabel.add(fl);
429
+ else declaredByLabel.set(fl, p.id);
430
+ }
431
+ const resolveByLabel = (f) => {
432
+ if (ambiguousLabel.has(f)) return "ambiguous";
433
+ return declaredByLabel.get(f);
434
+ };
423
435
  const resolveEndpoint = (ref, line) => {
424
436
  const f = fold(ref);
425
437
  if (registry.has(f)) return f;
426
438
  const aliased = declaredByName.get(f);
427
439
  if (aliased) return aliased;
440
+ const byLabel = resolveByLabel(f);
441
+ if (byLabel === "ambiguous") {
442
+ diagnostics.push(emit(MAP_DX.AMBIGUOUS_LABEL, line, { name: ref }));
443
+ return null;
444
+ }
445
+ if (byLabel) return byLabel;
428
446
  const got = lookupName(ref, void 0, line, inferredCountry, true);
429
447
  if (got.kind !== "ok") return null;
430
448
  noteCountry(got.iso);
@@ -485,6 +503,12 @@ function resolveMap(parsed, data) {
485
503
  if (registry.has(f)) return f;
486
504
  const aliased = declaredByName.get(f);
487
505
  if (aliased) return aliased;
506
+ const byLabel = resolveByLabel(f);
507
+ if (byLabel === "ambiguous") {
508
+ diagnostics.push(emit(MAP_DX.AMBIGUOUS_LABEL, line, { name: pos.name }));
509
+ return null;
510
+ }
511
+ if (byLabel) return byLabel;
488
512
  const got = lookupName(pos.name, pos.scope, line, inferredScope, true);
489
513
  if (got.kind !== "ok") return null;
490
514
  noteCountry(got.iso);
@@ -711,4 +735,4 @@ export {
711
735
  isSubNationalUsExtent,
712
736
  resolveMap
713
737
  };
714
- //# sourceMappingURL=chunk-FITOLXSX.js.map
738
+ //# sourceMappingURL=chunk-EOFPYPAU.js.map
@@ -17,7 +17,7 @@ import {
17
17
  import {
18
18
  resolveTagColor,
19
19
  tagAttrKey
20
- } from "./chunk-QLCCJEJI.js";
20
+ } from "./chunk-WCUHAQKB.js";
21
21
  import {
22
22
  CATEGORICAL_COLOR_ORDER,
23
23
  resolveColor
@@ -113,7 +113,7 @@ function renderSwimlaneForExport(container, parsed, layout, palette, isDark, opt
113
113
  });
114
114
  const root = svg.append("g").attr("transform", `translate(0, ${titleOffset})`);
115
115
  if (parsed.title) {
116
- svg.append("text").attr("x", width / 2).attr("y", TITLE_Y).attr("text-anchor", "middle").attr("font-size", TITLE_FONT_SIZE).attr("font-weight", TITLE_FONT_WEIGHT).attr("fill", palette.text).text(parsed.title);
116
+ svg.append("text").attr("class", "chart-title").attr("x", width / 2).attr("y", TITLE_Y).attr("text-anchor", "middle").attr("font-size", TITLE_FONT_SIZE).attr("font-weight", TITLE_FONT_WEIGHT).attr("fill", palette.text).attr("data-line-number", String(parsed.titleLineNumber ?? 1)).text(parsed.title);
117
117
  }
118
118
  const laneColorById = /* @__PURE__ */ new Map();
119
119
  parsed.lanes.forEach((lane, i) => {
@@ -223,7 +223,7 @@ function renderSwimlaneForExport(container, parsed, layout, palette, isDark, opt
223
223
  marker = `sw-arrow-${ev.success.replace("#", "")}`;
224
224
  }
225
225
  const d = roundedPolyline(e.points, EDGE_CORNER_R);
226
- edgeG.append("path").attr("d", d).attr("fill", "none").attr("stroke", stroke).attr("stroke-width", EDGE_STROKE).attr("stroke-dasharray", e.back ? "5 4" : null).attr("marker-end", `url(#${marker})`).attr("data-line-number", String(e.lineNumber));
226
+ edgeG.append("path").attr("class", "sw-edge sw-edge-group").attr("d", d).attr("fill", "none").attr("stroke", stroke).attr("stroke-width", EDGE_STROKE).attr("stroke-dasharray", e.back ? "5 4" : null).attr("marker-end", `url(#${marker})`).attr("data-line-number", String(e.lineNumber));
227
227
  if (e.label) {
228
228
  const segLen = [];
229
229
  let total = 0;
@@ -300,7 +300,7 @@ function renderSwimlaneForExport(container, parsed, layout, palette, isDark, opt
300
300
  const nodesG = root.append("g").attr("class", "dgmo-swimlane-nodes");
301
301
  for (const n of layout.nodes) {
302
302
  const { fill, stroke } = nodeFill(n);
303
- const g = nodesG.append("g").attr("data-line-number", String(n.lineNumber)).attr("data-lane", n.lane);
303
+ const g = nodesG.append("g").attr("class", "sw-node").attr("data-node-id", n.id).attr("data-line-number", String(n.lineNumber)).attr("data-lane", n.lane);
304
304
  const cx = n.x;
305
305
  const cy = n.y;
306
306
  if (n.shape === "exclusive" || n.shape === "parallel") {
@@ -391,4 +391,4 @@ function drawCenteredLabel(g, label, cx, cy, fill, fontSize, tight = false, halo
391
391
  export {
392
392
  renderSwimlaneForExport
393
393
  };
394
- //# sourceMappingURL=chunk-X5LCYCL5.js.map
394
+ //# sourceMappingURL=chunk-ER5SCQWQ.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  measureText
3
- } from "./chunk-WCT3NYCV.js";
3
+ } from "./chunk-5LWQH6QV.js";
4
4
  import {
5
5
  formatDuration,
6
6
  formatScheduleValue,
@@ -603,4 +603,4 @@ export {
603
603
  layoutPert,
604
604
  relayoutPert
605
605
  };
606
- //# sourceMappingURL=chunk-4OHACBGX.js.map
606
+ //# sourceMappingURL=chunk-F2L5GCQ4.js.map
@@ -5,13 +5,13 @@ import {
5
5
  formatPct,
6
6
  resolveCellColor,
7
7
  resolveColorMode
8
- } from "./chunk-IZMRON6C.js";
8
+ } from "./chunk-CVV36CWI.js";
9
9
  import {
10
10
  renderIntegratedLegend
11
- } from "./chunk-PWIHZ6NJ.js";
11
+ } from "./chunk-QUJGFNFN.js";
12
12
  import {
13
13
  getMaxLegendReservedHeight
14
- } from "./chunk-YAA6IID3.js";
14
+ } from "./chunk-7UEMZREK.js";
15
15
  import {
16
16
  TITLE_FONT_SIZE,
17
17
  TITLE_FONT_WEIGHT,
@@ -22,10 +22,10 @@ import {
22
22
  } from "./chunk-6KFWC4CO.js";
23
23
  import {
24
24
  LEGEND_GROUP_GAP
25
- } from "./chunk-QOOUC2J5.js";
25
+ } from "./chunk-HQCHYB5F.js";
26
26
  import {
27
27
  measureText
28
- } from "./chunk-WCT3NYCV.js";
28
+ } from "./chunk-5LWQH6QV.js";
29
29
  import {
30
30
  contrastText,
31
31
  getSeriesColors,
@@ -33,7 +33,7 @@ import {
33
33
  } from "./chunk-P6T66CCZ.js";
34
34
  import {
35
35
  tagAttrKey
36
- } from "./chunk-QLCCJEJI.js";
36
+ } from "./chunk-WCUHAQKB.js";
37
37
 
38
38
  // src/treemap/renderer.ts
39
39
  import * as d3Selection from "d3-selection";
@@ -381,4 +381,4 @@ export {
381
381
  renderTreemapForExport,
382
382
  renderTreemap
383
383
  };
384
- //# sourceMappingURL=chunk-FCIIHT24.js.map
384
+ //# sourceMappingURL=chunk-F5UDBSJY.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  measureText,
3
3
  wrapTextToWidth
4
- } from "./chunk-WCT3NYCV.js";
4
+ } from "./chunk-5LWQH6QV.js";
5
5
  import {
6
6
  mix,
7
7
  shapeFill
@@ -287,4 +287,4 @@ export {
287
287
  scoreToCurveY,
288
288
  layoutJourneyMap
289
289
  };
290
- //# sourceMappingURL=chunk-3JLKYGBQ.js.map
290
+ //# sourceMappingURL=chunk-F7BFXWNQ.js.map
@@ -5,7 +5,7 @@ import {
5
5
  import {
6
6
  renderCollapseBar,
7
7
  renderNodeCard
8
- } from "./chunk-VOKGH627.js";
8
+ } from "./chunk-AHGF2YYA.js";
9
9
  import {
10
10
  CARD_RADIUS,
11
11
  COLLAPSE_BAR_HEIGHT,
@@ -25,16 +25,16 @@ import {
25
25
  } from "./chunk-3CIOJ5YJ.js";
26
26
  import {
27
27
  layoutOrg
28
- } from "./chunk-J5FIXQRT.js";
29
- import {
30
- renderIntegratedLegend
31
- } from "./chunk-PWIHZ6NJ.js";
28
+ } from "./chunk-R56LASIN.js";
32
29
  import {
33
30
  ScaleContext
34
31
  } from "./chunk-YYVTBZZC.js";
32
+ import {
33
+ renderIntegratedLegend
34
+ } from "./chunk-QUJGFNFN.js";
35
35
  import {
36
36
  getMaxLegendReservedHeight
37
- } from "./chunk-YAA6IID3.js";
37
+ } from "./chunk-7UEMZREK.js";
38
38
  import {
39
39
  TITLE_FONT_SIZE,
40
40
  TITLE_FONT_WEIGHT
@@ -49,13 +49,13 @@ import {
49
49
  LEGEND_EYE_SIZE,
50
50
  LEGEND_GROUP_GAP,
51
51
  LEGEND_HEIGHT
52
- } from "./chunk-QOOUC2J5.js";
52
+ } from "./chunk-HQCHYB5F.js";
53
53
  import {
54
54
  measureText
55
- } from "./chunk-WCT3NYCV.js";
55
+ } from "./chunk-5LWQH6QV.js";
56
56
  import {
57
57
  parseOrg
58
- } from "./chunk-RVMRZAPB.js";
58
+ } from "./chunk-O76UD6VJ.js";
59
59
  import {
60
60
  contrastText,
61
61
  mix,
@@ -65,7 +65,7 @@ import {
65
65
  import {
66
66
  resolveTagColor,
67
67
  tagAttrKey
68
- } from "./chunk-QLCCJEJI.js";
68
+ } from "./chunk-WCUHAQKB.js";
69
69
 
70
70
  // src/org/renderer.ts
71
71
  import * as d3Selection from "d3-selection";
@@ -484,4 +484,4 @@ export {
484
484
  renderOrg,
485
485
  renderOrgForExport
486
486
  };
487
- //# sourceMappingURL=chunk-FANX6UJR.js.map
487
+ //# sourceMappingURL=chunk-FAL7NOK3.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  MAP_DIRECTIVE_KEY_SET
3
- } from "./chunk-DKEPS5LH.js";
3
+ } from "./chunk-U2HGPLZS.js";
4
4
  import {
5
5
  AUTO_TAG_COLOR_SENTINEL,
6
6
  finalizeAutoTagColors,
@@ -8,7 +8,7 @@ import {
8
8
  stripDefaultModifier,
9
9
  tagAttrKey,
10
10
  validateTagGroupNames
11
- } from "./chunk-QLCCJEJI.js";
11
+ } from "./chunk-WCUHAQKB.js";
12
12
  import {
13
13
  parseInArrowLabel
14
14
  } from "./chunk-FFUN5D66.js";
@@ -19,7 +19,7 @@ import {
19
19
  peelRampColors,
20
20
  splitNameAndMeta,
21
21
  withTagAliases
22
- } from "./chunk-Y3J7VR52.js";
22
+ } from "./chunk-OTAL43EH.js";
23
23
  import {
24
24
  formatDgmoError,
25
25
  makeDgmoError
@@ -610,4 +610,4 @@ export {
610
610
  looksLikeMap,
611
611
  parseMap
612
612
  };
613
- //# sourceMappingURL=chunk-BUPDIHML.js.map
613
+ //# sourceMappingURL=chunk-FB2WHOEQ.js.map