@diagrammo/dgmo 0.48.2 → 0.49.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 (216) hide show
  1. package/.cursorrules +8 -3
  2. package/.github/copilot-instructions.md +8 -3
  3. package/.windsurfrules +8 -3
  4. package/SKILL.md +8 -3
  5. package/dist/advanced.d.ts +444 -1
  6. package/dist/advanced.js +208 -146
  7. package/dist/auto.css +63 -0
  8. package/dist/auto.js +202 -102
  9. package/dist/auto.mjs +6849 -824
  10. package/dist/block.css +63 -0
  11. package/dist/block.d.ts +13 -5
  12. package/dist/block.js +137 -57
  13. package/dist/{charts-d3-QOZHKTCT.js → charts-d3-EW3YQTEA.js} +9 -8
  14. package/dist/chunk-26RVGM44.js +331 -0
  15. package/dist/{chunk-44CM72SQ.js → chunk-2WMBWZY2.js} +3 -3
  16. package/dist/{chunk-L66GEFB6.js → chunk-35BBZDFE.js} +4 -4
  17. package/dist/{chunk-4GRI7MEB.js → chunk-3BIAFYD2.js} +6 -6
  18. package/dist/chunk-3NFJWFNP.js +1474 -0
  19. package/dist/{chunk-76OWZ3BA.js → chunk-4BD7EVPK.js} +2 -2
  20. package/dist/{chunk-MITI6NOL.js → chunk-4FIV4K4Z.js} +9 -9
  21. package/dist/chunk-4HVNZ7WF.js +574 -0
  22. package/dist/{chunk-X5LCYCL5.js → chunk-4NQ3IKUM.js} +2 -2
  23. package/dist/{chunk-PWIHZ6NJ.js → chunk-4UDKKGHH.js} +4 -4
  24. package/dist/{chunk-6NYWYNBI.js → chunk-4XK3FLFB.js} +3 -3
  25. package/dist/chunk-4YNP6O47.js +607 -0
  26. package/dist/{chunk-3MQQNXPD.js → chunk-5FGDJIJX.js} +3 -3
  27. package/dist/{chunk-WCT3NYCV.js → chunk-5LWQH6QV.js} +1 -1
  28. package/dist/chunk-5XCM7UUW.js +261 -0
  29. package/dist/{chunk-RYEGFMUO.js → chunk-5ZZLLBFK.js} +2 -2
  30. package/dist/{chunk-EB6FPQUP.js → chunk-65RTDUZH.js} +3 -3
  31. package/dist/chunk-6CLKNXVP.js +664 -0
  32. package/dist/{chunk-H6PI3KJT.js → chunk-6IUAK7RZ.js} +2 -2
  33. package/dist/{chunk-ZGR7ULFJ.js → chunk-6SA7FJE4.js} +31 -19
  34. package/dist/{chunk-LIOHW36Z.js → chunk-6VE3VLWM.js} +3 -3
  35. package/dist/{chunk-AN2MOO5T.js → chunk-7OVSJI2V.js} +3 -3
  36. package/dist/{chunk-YAA6IID3.js → chunk-7UEMZREK.js} +2 -2
  37. package/dist/{chunk-FCIIHT24.js → chunk-7VLUGEMJ.js} +7 -7
  38. package/dist/{chunk-VOKGH627.js → chunk-AHGF2YYA.js} +13 -3
  39. package/dist/{chunk-3R5POCTZ.js → chunk-AJ2PEY7J.js} +6 -6
  40. package/dist/{chunk-PBHE5UG6.js → chunk-ALRHIR6I.js} +46 -12
  41. package/dist/{chunk-7JEGTRLD.js → chunk-B57V3DWN.js} +3 -3
  42. package/dist/{chunk-ILKORZ3H.js → chunk-BCT5G2VN.js} +7 -7
  43. package/dist/{chunk-TYS6CSS5.js → chunk-BCYVE3N5.js} +2 -2
  44. package/dist/{chunk-ZBWMSD5N.js → chunk-BGJV5ATD.js} +4 -4
  45. package/dist/{chunk-G2H74XJZ.js → chunk-BPIJLRYE.js} +8 -8
  46. package/dist/{chunk-YGJTDXVR.js → chunk-C4GQDB5L.js} +2 -2
  47. package/dist/{chunk-Y2ZE3MSG.js → chunk-C63UWAKM.js} +2 -2
  48. package/dist/{chunk-QEBUY5NY.js → chunk-CEHZOPGM.js} +4 -4
  49. package/dist/{chunk-725LDASD.js → chunk-CLD2OKV7.js} +2 -2
  50. package/dist/{chunk-5QXL4NYS.js → chunk-CLR4A2N2.js} +10 -5
  51. package/dist/{chunk-WBRZJOEC.js → chunk-CMCR5WBW.js} +3 -3
  52. package/dist/{chunk-SML67VPV.js → chunk-D5AVQCDN.js} +3 -3
  53. package/dist/{chunk-2LACINWN.js → chunk-DDTJ5N7Q.js} +9 -9
  54. package/dist/{chunk-FITOLXSX.js → chunk-EOFPYPAU.js} +26 -2
  55. package/dist/{chunk-B65G5DNL.js → chunk-EYN7VFKL.js} +3 -3
  56. package/dist/{chunk-4OHACBGX.js → chunk-F2L5GCQ4.js} +2 -2
  57. package/dist/{chunk-RVMRZAPB.js → chunk-F743CM2N.js} +3 -3
  58. package/dist/{chunk-3JLKYGBQ.js → chunk-F7BFXWNQ.js} +2 -2
  59. package/dist/{chunk-WCSOJFU3.js → chunk-FMKTYMP4.js} +3 -3
  60. package/dist/{chunk-RTLBSQ3G.js → chunk-FUCAB3KQ.js} +3 -3
  61. package/dist/{chunk-SGZYXELT.js → chunk-GB3YZTAM.js} +9 -6
  62. package/dist/{chunk-QLCCJEJI.js → chunk-HBVD67XG.js} +2 -2
  63. package/dist/{chunk-PBAHEPLQ.js → chunk-HGN652MU.js} +7 -6
  64. package/dist/{chunk-3SMGIJDD.js → chunk-HHXOONLX.js} +13 -1
  65. package/dist/{chunk-QOOUC2J5.js → chunk-HQCHYB5F.js} +2 -2
  66. package/dist/chunk-IAEC4KLA.js +492 -0
  67. package/dist/{chunk-J5FIXQRT.js → chunk-IBC35BTK.js} +4 -4
  68. package/dist/{chunk-NURGB5Z4.js → chunk-IFK3GIUW.js} +2 -2
  69. package/dist/{chunk-FANX6UJR.js → chunk-IHLSHCPZ.js} +11 -11
  70. package/dist/{chunk-GMR5MFHJ.js → chunk-IUK7AGD4.js} +2 -2
  71. package/dist/chunk-IVKC4GID.js +32 -0
  72. package/dist/{chunk-OJR3MQYV.js → chunk-JFPY3UJ7.js} +296 -57
  73. package/dist/{chunk-5MLYVTYM.js → chunk-K6HNAY5V.js} +2 -2
  74. package/dist/{chunk-P235SVAH.js → chunk-KQAEKMIX.js} +2 -2
  75. package/dist/{chunk-7DTWEFUE.js → chunk-KUBBJ2CD.js} +10 -10
  76. package/dist/{chunk-BUVJFRPY.js → chunk-KV6Y2HE6.js} +4 -4
  77. package/dist/{chunk-OURHMODR.js → chunk-LG4TWW4U.js} +13 -13
  78. package/dist/{chunk-XAKEUMEJ.js → chunk-LVHPTBO3.js} +3 -3
  79. package/dist/{chunk-ERLBPDGU.js → chunk-MJCG5K2O.js} +2 -2
  80. package/dist/{chunk-THXCFRTU.js → chunk-N4J5KGWG.js} +12 -12
  81. package/dist/{chunk-MZSBFAPJ.js → chunk-NVT6C2VE.js} +9 -9
  82. package/dist/{chunk-AELOBFW5.js → chunk-O5MQPK7E.js} +3 -3
  83. package/dist/{chunk-JM4LEPY3.js → chunk-O7NUCTFU.js} +2 -2
  84. package/dist/{chunk-JED6ZDEE.js → chunk-O7WP4ZD4.js} +2 -2
  85. package/dist/{chunk-ZO27FGJS.js → chunk-PH5X4GIP.js} +2 -2
  86. package/dist/{chunk-B7JUCQUA.js → chunk-PU3AUQPA.js} +4 -4
  87. package/dist/{chunk-YGJZWZTY.js → chunk-PZFVK3IH.js} +2 -2
  88. package/dist/chunk-QQJUTGQH.js +135 -0
  89. package/dist/{chunk-HSH73DP6.js → chunk-RI4NIMFP.js} +99 -39
  90. package/dist/{chunk-33LCUH4H.js → chunk-RTERS6S5.js} +3 -3
  91. package/dist/{chunk-T3UBLACL.js → chunk-SCQ5VPUF.js} +19 -5
  92. package/dist/chunk-SGHSY3LU.js +377 -0
  93. package/dist/{chunk-SRTU6HMQ.js → chunk-SJEGO2QL.js} +8 -8
  94. package/dist/chunk-SQDFK5ZQ.js +273 -0
  95. package/dist/{chunk-PZMETGLY.js → chunk-SVDWQGX2.js} +296 -121
  96. package/dist/{chunk-Z5CGSFJB.js → chunk-T7IKPCMI.js} +4 -4
  97. package/dist/chunk-TC3YWBFO.js +233 -0
  98. package/dist/{chunk-EVCVDTXE.js → chunk-TLKMTQYL.js} +3 -3
  99. package/dist/{chunk-IJZFN3HM.js → chunk-TWQUYVP3.js} +4 -4
  100. package/dist/{chunk-IZMRON6C.js → chunk-UVCXZEGU.js} +2 -2
  101. package/dist/{chunk-CKNVO24D.js → chunk-UWDO3O52.js} +2 -2
  102. package/dist/{chunk-RJE5JTVK.js → chunk-VC3TR4NL.js} +7 -7
  103. package/dist/{chunk-CI2G3OEB.js → chunk-X2CH42BN.js} +9 -9
  104. package/dist/{chunk-6HO5ZTXK.js → chunk-XCC2RENT.js} +2 -2
  105. package/dist/chunk-XHVV4NVW.js +51 -0
  106. package/dist/{chunk-ZJEL4H2R.js → chunk-XJ7J6WOO.js} +9 -9
  107. package/dist/{chunk-ULOEATBZ.js → chunk-XKTN7CZF.js} +106 -29
  108. package/dist/{chunk-IPWPWM6R.js → chunk-YM2BSPYW.js} +111 -10
  109. package/dist/{chunk-BUPDIHML.js → chunk-YRVLP7UU.js} +3 -3
  110. package/dist/{chunk-T2OE3YQB.js → chunk-YTN572Q2.js} +3 -3
  111. package/dist/{chunk-WVAJFAIA.js → chunk-YYX3SU6H.js} +3 -3
  112. package/dist/{chunk-MO5YHHMQ.js → chunk-ZDUQGL3N.js} +2 -2
  113. package/dist/{chunk-Y3J7VR52.js → chunk-ZNQX6QWH.js} +30 -2
  114. package/dist/{chunk-UWN33VNX.js → chunk-ZREZOIGS.js} +8 -8
  115. package/dist/{chunk-6SM5NJQH.js → chunk-ZTLWVRNS.js} +4 -4
  116. package/dist/{chunk-RUNNI6VE.js → chunk-ZXL6MB4R.js} +3 -3
  117. package/dist/cli.cjs +159 -122
  118. package/dist/dgmo-router-ODKPEJ3P.js +79 -0
  119. package/dist/dimensions-WSIJXT5Q.js +22 -0
  120. package/dist/editor.js +4 -1
  121. package/dist/element.js +203 -103
  122. package/dist/element.mjs +6849 -824
  123. package/dist/{flowchart-parser-ZNSKIBVR.js → flowchart-parser-IVZN7CQN.js} +4 -4
  124. package/dist/{flowchart-renderer-SNDSII4D.js → flowchart-renderer-GMI2U3DD.js} +9 -9
  125. package/dist/highlight.js +7 -1
  126. package/dist/index.d.ts +5 -1
  127. package/dist/index.js +193 -232
  128. package/dist/{layout-HRBZPFCN.js → layout-34CLNICW.js} +5 -5
  129. package/dist/{layout-5RA6QWR6.js → layout-4Z5JM7PT.js} +6 -6
  130. package/dist/layout-6RDJHS6E.js +9 -0
  131. package/dist/{layout-7QXCNOVS.js → layout-7H4H46CS.js} +3 -3
  132. package/dist/{layout-46N4JJYK.js → layout-7SKMFYHL.js} +5 -5
  133. package/dist/{layout-HWDSRX5E.js → layout-D42XE4RE.js} +6 -6
  134. package/dist/{layout-EE6GE46Y.js → layout-DC4TVXER.js} +5 -5
  135. package/dist/layout-FGQWRYYW.js +14 -0
  136. package/dist/layout-GZ2CWONU.js +14 -0
  137. package/dist/layout-HQMBPJVS.js +10 -0
  138. package/dist/{layout-UM5F4DJB.js → layout-K2ZN3Q42.js} +5 -5
  139. package/dist/{layout-S2QBYSK2.js → layout-NXG63LWH.js} +3 -3
  140. package/dist/{layout-N76NR4ZO.js → layout-PUQCB6AN.js} +7 -7
  141. package/dist/{layout-HYZPWAK5.js → layout-QNUQLEHU.js} +3 -3
  142. package/dist/layout-S3EK4IYO.js +14 -0
  143. package/dist/{layout-search-OYV77HHS.js → layout-search-QS44PI5R.js} +6 -6
  144. package/dist/{parser-KNSQSKQO.js → parser-4BKIFG2C.js} +5 -5
  145. package/dist/{parser-OV7NOBW6.js → parser-4ROBKVUR.js} +4 -4
  146. package/dist/parser-667RGSUW.js +13 -0
  147. package/dist/{parser-IXSZZQHY.js → parser-BL7Z72EY.js} +4 -4
  148. package/dist/{parser-AQETEVRW.js → parser-CLMFZWCC.js} +4 -4
  149. package/dist/{parser-XKRP7QKP.js → parser-D6ONJQFR.js} +3 -3
  150. package/dist/{parser-2EWECDSA.js → parser-DERPY5KC.js} +4 -4
  151. package/dist/{parser-4OGOBJJ4.js → parser-GFSOPDB7.js} +4 -4
  152. package/dist/{parser-2MFP2H2E.js → parser-HVJFTOXL.js} +3 -3
  153. package/dist/{parser-VQP2UJ6W.js → parser-IKZFTLOJ.js} +3 -3
  154. package/dist/parser-J3P2D6IP.js +13 -0
  155. package/dist/{parser-PQ3POX45.js → parser-JD7OQ2E6.js} +4 -4
  156. package/dist/{parser-O5J4VBII.js → parser-K647FRI4.js} +3 -3
  157. package/dist/{parser-NGU3ETO6.js → parser-KPMN5KKE.js} +4 -4
  158. package/dist/{parser-4FL2CMDG.js → parser-MBJSBTL5.js} +4 -4
  159. package/dist/{parser-TFZFBVWN.js → parser-MCJWF5G3.js} +3 -3
  160. package/dist/{parser-NRAI6O25.js → parser-MRBPXXIV.js} +4 -4
  161. package/dist/{parser-6BTRLKRZ.js → parser-OBQG655V.js} +4 -4
  162. package/dist/{parser-3STE62GB.js → parser-QJYS7KQQ.js} +4 -4
  163. package/dist/{parser-XDVELHRK.js → parser-SMBJO3XN.js} +4 -4
  164. package/dist/{parser-TRTHDFPP.js → parser-TITK4YW6.js} +5 -5
  165. package/dist/{parser-I6KXEYFK.js → parser-TNYX5S7E.js} +4 -4
  166. package/dist/{parser-Y6WTBU76.js → parser-UBGPTIZD.js} +3 -3
  167. package/dist/parser-UGA23PYK.js +14 -0
  168. package/dist/{parser-N5O4IHUN.js → parser-WISPH7LW.js} +4 -4
  169. package/dist/{parser-CFZD5IBL.js → parser-XWUDFJ7P.js} +4 -4
  170. package/dist/parser-ZKF5K2H2.js +15 -0
  171. package/dist/{parser-ZSDPZYQP.js → parser-ZYC3XGNS.js} +4 -4
  172. package/dist/{renderer-AWWAF6XD.js → renderer-4IUPINAE.js} +10 -10
  173. package/dist/renderer-6L3NBEY5.js +24 -0
  174. package/dist/{renderer-ZRNG54CW.js → renderer-6T3KK4S3.js} +11 -11
  175. package/dist/{renderer-KQB7UGDS.js → renderer-7RH2SI3B.js} +3 -3
  176. package/dist/{renderer-6EEZHMH4.js → renderer-A5VFZQQK.js} +9 -9
  177. package/dist/{renderer-5MYBMBYO.js → renderer-BB5PREMY.js} +5 -5
  178. package/dist/{renderer-BYCNMBF7.js → renderer-CGW7QPNA.js} +10 -10
  179. package/dist/{renderer-QIWVHWZO.js → renderer-DAXMXIKD.js} +3 -3
  180. package/dist/{renderer-7MVLWWQD.js → renderer-DKESNMU5.js} +9 -9
  181. package/dist/{renderer-UV6MI64M.js → renderer-HVCU2C3Z.js} +3 -3
  182. package/dist/{renderer-VACVQYML.js → renderer-LWGJFT3D.js} +8 -8
  183. package/dist/{renderer-PGX2TKVS.js → renderer-MFJ7HY2H.js} +8 -8
  184. package/dist/{renderer-B2OMQIQG.js → renderer-MJDDU27W.js} +15 -15
  185. package/dist/{renderer-4JHRUBE6.js → renderer-QL5KO6SK.js} +10 -10
  186. package/dist/{renderer-W4M6QLIJ.js → renderer-QNHUXCRL.js} +14 -14
  187. package/dist/{renderer-ZGNTUWC4.js → renderer-ROV756WT.js} +8 -8
  188. package/dist/{renderer-YY2OSF6E.js → renderer-SQ3JUAI7.js} +9 -9
  189. package/dist/renderer-THD6V5TL.js +22 -0
  190. package/dist/{renderer-5NDVNDAZ.js → renderer-TPIBXNOS.js} +9 -9
  191. package/dist/{renderer-RPOA5YPZ.js → renderer-TYXRHMRI.js} +13 -13
  192. package/dist/{renderer-N43WR5GV.js → renderer-UZF3JROD.js} +11 -11
  193. package/dist/{renderer-6W5462RB.js → renderer-V3JEMWMM.js} +9 -9
  194. package/dist/{renderer-JGBKUCZD.js → renderer-VFUVRNLK.js} +4 -4
  195. package/dist/{renderer-Z7I3W2PP.js → renderer-VICQ4WNY.js} +8 -8
  196. package/dist/renderer-W5RMOURB.js +21 -0
  197. package/dist/renderer-XEKIRPI6.js +23 -0
  198. package/dist/{renderer-CLJHQPBJ.js → renderer-YHXPN3GF.js} +12 -12
  199. package/dist/renderer-radial-MHO2VDXN.js +21 -0
  200. package/dist/{resolver-NOAA7ID7.js → resolver-FHBCO3PL.js} +3 -3
  201. package/dist/{state-parser-Z2V23ATR.js → state-parser-RX3GXOIB.js} +4 -4
  202. package/dist/{state-renderer-B4DQBM6M.js → state-renderer-AJUKGNWU.js} +9 -9
  203. package/docs/ai-integration.md +8 -3
  204. package/docs/language-reference.md +179 -5
  205. package/gallery/fixtures/family.dgmo +23 -0
  206. package/gallery/fixtures/sketch.dgmo +22 -0
  207. package/package.json +1 -1
  208. package/dist/chunk-ODZVHU3R.js +0 -153
  209. package/dist/dgmo-router-X35VLZLM.js +0 -73
  210. package/dist/dimensions-J3FHIMJ6.js +0 -22
  211. package/dist/layout-5T6RH5M6.js +0 -14
  212. package/dist/layout-G23F7LDH.js +0 -9
  213. package/dist/layout-OB3RI63S.js +0 -14
  214. package/dist/parser-JAL2HD4I.js +0 -13
  215. package/dist/renderer-SMIBCRVB.js +0 -24
  216. package/dist/renderer-radial-C32GPJQ7.js +0 -21
@@ -3,10 +3,10 @@ import {
3
3
  mapLegendConfig,
4
4
  mapLegendGroups,
5
5
  parsePathRings
6
- } from "./chunk-IPWPWM6R.js";
6
+ } from "./chunk-YM2BSPYW.js";
7
7
  import {
8
8
  renderIntegratedLegend
9
- } from "./chunk-PWIHZ6NJ.js";
9
+ } from "./chunk-4UDKKGHH.js";
10
10
  import {
11
11
  TITLE_FONT_SIZE,
12
12
  TITLE_FONT_WEIGHT,
@@ -17,7 +17,7 @@ import {
17
17
  } from "./chunk-6KFWC4CO.js";
18
18
  import {
19
19
  measureText
20
- } from "./chunk-WCT3NYCV.js";
20
+ } from "./chunk-5LWQH6QV.js";
21
21
  import {
22
22
  mix
23
23
  } from "./chunk-P6T66CCZ.js";
@@ -644,4 +644,4 @@ export {
644
644
  renderMap,
645
645
  renderMapForExport
646
646
  };
647
- //# sourceMappingURL=chunk-Z5CGSFJB.js.map
647
+ //# sourceMappingURL=chunk-T7IKPCMI.js.map
@@ -0,0 +1,233 @@
1
+ import {
2
+ getFigure,
3
+ resolvePartKey
4
+ } from "./chunk-3NFJWFNP.js";
5
+ import {
6
+ AUTO_TAG_COLOR_SENTINEL,
7
+ finalizeAutoTagColors,
8
+ matchTagBlockHeading,
9
+ stripDefaultModifier,
10
+ tagAttrKey
11
+ } from "./chunk-HBVD67XG.js";
12
+ import {
13
+ extractColor,
14
+ measureIndent,
15
+ parseFirstLine
16
+ } from "./chunk-ZNQX6QWH.js";
17
+ import {
18
+ emit
19
+ } from "./chunk-CXK4DZH3.js";
20
+
21
+ // src/body/diagnostics.ts
22
+ var BODY_DX = {
23
+ // parser.ts: header line is not `body …`
24
+ EXPECTED_HEADER: {
25
+ code: "E_BODY_EXPECTED_HEADER",
26
+ severity: "error",
27
+ chartType: "body",
28
+ title: "Missing header",
29
+ message: 'Expected "body [Title]" as the first line.',
30
+ hint: "Start the diagram with `body` (optionally followed by a title).",
31
+ example: `body Push Day
32
+ muscle
33
+ chest effort: Primary`
34
+ },
35
+ // parser.ts: a named part isn't in the catalog for the active figure
36
+ UNKNOWN_PART: {
37
+ code: "W_BODY_UNKNOWN_PART",
38
+ severity: "warning",
39
+ chartType: "body",
40
+ title: "Unknown body part",
41
+ message: (p) => `Unknown body part '${p.name ?? "quadratus"}' \u2014 not in the anatomy catalog for this figure.`,
42
+ hint: "Use a catalog name like chest, biceps, triceps, abs, quadriceps, or calves.",
43
+ example: `body
44
+
45
+ xyz effort: Primary`
46
+ },
47
+ // renderer.ts: requested form/sex/view isn't shipped in this build
48
+ UNSUPPORTED_FIGURE: {
49
+ code: "W_BODY_UNSUPPORTED_FIGURE",
50
+ severity: "warning",
51
+ chartType: "body",
52
+ title: "Figure not available",
53
+ message: (p) => `The ${p.figure ?? "female back skin"} figure isn't available yet; rendering the male front-view muscle figure instead.`,
54
+ hint: "This build ships only male / front / muscle. Other forms/views are a fast-follow.",
55
+ example: `body
56
+
57
+ female
58
+ back`
59
+ }
60
+ };
61
+ var BODY_DIAGNOSTICS = Object.values(BODY_DX);
62
+
63
+ // src/body/parser.ts
64
+ var FORM_RE = /^(muscle|skin|skeletal)$/i;
65
+ var SEX_RE = /^(male|female)$/i;
66
+ var VIEW_RE = /^(front|back)$/i;
67
+ var PART_RE = /^([a-zA-Z][\w-]*)\s*(.*)$/;
68
+ var META_PAIR_RE = /([a-zA-Z][\w-]*)\s*:\s*([^,]+)/g;
69
+ function parseBody(content, palette) {
70
+ const lines = content.split("\n");
71
+ const diagnostics = [];
72
+ const views = [];
73
+ const options = {
74
+ form: "muscle",
75
+ sex: "male",
76
+ views,
77
+ noLegend: false
78
+ };
79
+ const tagGroups = [];
80
+ const parts = [];
81
+ const aliasMap = /* @__PURE__ */ new Map();
82
+ let title = null;
83
+ let titleLineNumber = null;
84
+ let headerParsed = false;
85
+ let currentTagGroup = null;
86
+ let currentPart = null;
87
+ let contentStarted = false;
88
+ for (let i = 0; i < lines.length; i++) {
89
+ const line = lines[i];
90
+ const trimmed = line.trim();
91
+ if (!trimmed) {
92
+ currentTagGroup = null;
93
+ continue;
94
+ }
95
+ if (trimmed.startsWith("//")) continue;
96
+ const indent = measureIndent(line);
97
+ const lineNumber = i + 1;
98
+ if (!headerParsed) {
99
+ const firstLine = parseFirstLine(trimmed);
100
+ if (firstLine?.chartType === "body") {
101
+ title = firstLine.title ?? null;
102
+ titleLineNumber = lineNumber;
103
+ headerParsed = true;
104
+ continue;
105
+ }
106
+ return {
107
+ title: null,
108
+ titleLineNumber: null,
109
+ options,
110
+ tagGroups: [],
111
+ parts: [],
112
+ diagnostics,
113
+ error: emit(BODY_DX.EXPECTED_HEADER, lineNumber)
114
+ };
115
+ }
116
+ if (indent === 0 && !contentStarted) {
117
+ if (FORM_RE.test(trimmed)) {
118
+ options.form = trimmed.toLowerCase();
119
+ currentTagGroup = null;
120
+ continue;
121
+ }
122
+ if (SEX_RE.test(trimmed)) {
123
+ options.sex = trimmed.toLowerCase();
124
+ currentTagGroup = null;
125
+ continue;
126
+ }
127
+ if (VIEW_RE.test(trimmed)) {
128
+ const v = trimmed.toLowerCase();
129
+ if (!views.includes(v)) views.push(v);
130
+ currentTagGroup = null;
131
+ continue;
132
+ }
133
+ if (/^no-legend$/i.test(trimmed)) {
134
+ options.noLegend = true;
135
+ continue;
136
+ }
137
+ }
138
+ const tagBlockMatch = matchTagBlockHeading(trimmed);
139
+ if (tagBlockMatch && !contentStarted) {
140
+ currentTagGroup = {
141
+ name: tagBlockMatch.name,
142
+ ...tagBlockMatch.alias !== void 0 && {
143
+ alias: tagBlockMatch.alias
144
+ },
145
+ entries: [],
146
+ lineNumber
147
+ };
148
+ if (tagBlockMatch.alias) {
149
+ aliasMap.set(
150
+ tagBlockMatch.alias.toLowerCase(),
151
+ tagAttrKey(tagBlockMatch.name)
152
+ );
153
+ }
154
+ aliasMap.set(
155
+ tagAttrKey(tagBlockMatch.name),
156
+ tagAttrKey(tagBlockMatch.name)
157
+ );
158
+ tagGroups.push(currentTagGroup);
159
+ currentPart = null;
160
+ continue;
161
+ }
162
+ if (currentTagGroup && !contentStarted && indent > 0) {
163
+ const { text: cleanEntry, isDefault } = stripDefaultModifier(trimmed);
164
+ const { label, color } = extractColor(
165
+ cleanEntry,
166
+ palette,
167
+ diagnostics,
168
+ lineNumber
169
+ );
170
+ if (isDefault || currentTagGroup.entries.length === 0) {
171
+ currentTagGroup.defaultValue = label;
172
+ }
173
+ currentTagGroup.entries.push({
174
+ value: label,
175
+ color: color ?? AUTO_TAG_COLOR_SENTINEL,
176
+ lineNumber
177
+ });
178
+ continue;
179
+ }
180
+ if (indent > 0 && currentPart) {
181
+ currentPart.notes = [
182
+ ...currentPart.notes,
183
+ trimmed.replace(/^[-*]\s*/, "")
184
+ ];
185
+ continue;
186
+ }
187
+ if (indent === 0) {
188
+ const m = trimmed.match(PART_RE);
189
+ if (m) {
190
+ contentStarted = true;
191
+ currentTagGroup = null;
192
+ const metadata = {};
193
+ const rest = m[2] ?? "";
194
+ for (const pair of rest.matchAll(META_PAIR_RE)) {
195
+ const key = aliasMap.get(pair[1].toLowerCase()) ?? tagAttrKey(pair[1]);
196
+ metadata[key] = pair[2].trim();
197
+ }
198
+ currentPart = {
199
+ name: m[1],
200
+ metadata,
201
+ notes: [],
202
+ lineNumber
203
+ };
204
+ parts.push(currentPart);
205
+ continue;
206
+ }
207
+ }
208
+ }
209
+ finalizeAutoTagColors(tagGroups, palette);
210
+ if (views.length === 0) views.push("front");
211
+ const figures = views.map((v) => getFigure(options.sex, v));
212
+ for (const part of parts) {
213
+ if (!figures.some((f) => resolvePartKey(f, part.name))) {
214
+ diagnostics.push(
215
+ emit(BODY_DX.UNKNOWN_PART, part.lineNumber, { name: part.name })
216
+ );
217
+ }
218
+ }
219
+ return {
220
+ title,
221
+ titleLineNumber,
222
+ options,
223
+ tagGroups,
224
+ parts,
225
+ diagnostics
226
+ };
227
+ }
228
+
229
+ export {
230
+ BODY_DIAGNOSTICS,
231
+ parseBody
232
+ };
233
+ //# sourceMappingURL=chunk-TC3YWBFO.js.map
@@ -5,14 +5,14 @@ import {
5
5
  matchTagBlockHeading,
6
6
  stripDefaultModifier,
7
7
  validateTagGroupNames
8
- } from "./chunk-QLCCJEJI.js";
8
+ } from "./chunk-HBVD67XG.js";
9
9
  import {
10
10
  OPTION_NOCOLON_RE,
11
11
  extractColor,
12
12
  measureIndent,
13
13
  parseFirstLine,
14
14
  tryParseSharedOption
15
- } from "./chunk-Y3J7VR52.js";
15
+ } from "./chunk-ZNQX6QWH.js";
16
16
  import {
17
17
  formatDgmoError,
18
18
  makeDgmoError
@@ -729,4 +729,4 @@ export {
729
729
  resetWireframeIds,
730
730
  parseWireframe
731
731
  };
732
- //# sourceMappingURL=chunk-EVCVDTXE.js.map
732
+ //# sourceMappingURL=chunk-TLKMTQYL.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  buildPlacedNotes
3
- } from "./chunk-JED6ZDEE.js";
3
+ } from "./chunk-O7WP4ZD4.js";
4
4
  import {
5
5
  noteCanvasShift
6
6
  } from "./chunk-6EK55ART.js";
@@ -8,7 +8,7 @@ import {
8
8
  measureText,
9
9
  truncateText,
10
10
  wrapTextToWidth
11
- } from "./chunk-WCT3NYCV.js";
11
+ } from "./chunk-5LWQH6QV.js";
12
12
  import {
13
13
  resolveNotes
14
14
  } from "./chunk-FMDSF3OV.js";
@@ -311,7 +311,7 @@ function computeNodeSize(node, reserveValueRow) {
311
311
  return { width: w, height: Math.max(NODE_HEIGHT, totalHeight) };
312
312
  }
313
313
  async function layoutBoxesAndLines(parsed, collapseInfo, layoutOptions) {
314
- const { layoutBoxesAndLinesSearch } = await import("./layout-search-OYV77HHS.js");
314
+ const { layoutBoxesAndLinesSearch } = await import("./layout-search-QS44PI5R.js");
315
315
  const searchOpts = {
316
316
  ...layoutOptions?.hideDescriptions !== void 0 && {
317
317
  hideDescriptions: layoutOptions.hideDescriptions
@@ -460,4 +460,4 @@ export {
460
460
  computeNodeSize,
461
461
  layoutBoxesAndLines
462
462
  };
463
- //# sourceMappingURL=chunk-IJZFN3HM.js.map
463
+ //# sourceMappingURL=chunk-TWQUYVP3.js.map
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  resolveTagColor,
6
6
  tagAttrKey
7
- } from "./chunk-QLCCJEJI.js";
7
+ } from "./chunk-HBVD67XG.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-IZMRON6C.js.map
167
+ //# sourceMappingURL=chunk-UVCXZEGU.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  buildMapProjection
3
- } from "./chunk-IPWPWM6R.js";
3
+ } from "./chunk-YM2BSPYW.js";
4
4
  import {
5
5
  TITLE_FONT_SIZE,
6
6
  TITLE_Y
@@ -51,4 +51,4 @@ export {
51
51
  mapContentAspect,
52
52
  mapExportDimensions
53
53
  };
54
- //# sourceMappingURL=chunk-CKNVO24D.js.map
54
+ //# sourceMappingURL=chunk-UWDO3O52.js.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  renderIntegratedLegend
3
- } from "./chunk-PWIHZ6NJ.js";
3
+ } from "./chunk-4UDKKGHH.js";
4
4
  import {
5
5
  getMaxLegendReservedHeight
6
- } from "./chunk-YAA6IID3.js";
6
+ } from "./chunk-7UEMZREK.js";
7
7
  import {
8
8
  TITLE_FONT_SIZE,
9
9
  TITLE_FONT_WEIGHT,
@@ -14,10 +14,10 @@ import {
14
14
  } from "./chunk-6KFWC4CO.js";
15
15
  import {
16
16
  LEGEND_GROUP_GAP
17
- } from "./chunk-QOOUC2J5.js";
17
+ } from "./chunk-HQCHYB5F.js";
18
18
  import {
19
19
  measureText
20
- } from "./chunk-WCT3NYCV.js";
20
+ } from "./chunk-5LWQH6QV.js";
21
21
  import {
22
22
  isBlockNode
23
23
  } from "./chunk-NNAAJVBU.js";
@@ -27,7 +27,7 @@ import {
27
27
  import {
28
28
  resolveTagColor,
29
29
  tagAttrKey
30
- } from "./chunk-QLCCJEJI.js";
30
+ } from "./chunk-HBVD67XG.js";
31
31
 
32
32
  // src/block/renderer.ts
33
33
  import * as d3Selection from "d3-selection";
@@ -305,7 +305,7 @@ function drawItems(g, items, ctx, path = []) {
305
305
  if (it.inner) drawItems(g, it.inner, ctx, itemPath);
306
306
  continue;
307
307
  }
308
- const fill = color ? solid ? color : mix(color, palette.bg, 14) : palette.bg;
308
+ const fill = color ? solid ? mix(color, palette.bg, 80) : mix(color, palette.bg, 14) : palette.bg;
309
309
  cell.attr("data-leaf", "true");
310
310
  cell.append("rect").attr("x", it.x).attr("y", it.y).attr("width", it.w).attr("height", it.h).attr("rx", 8).attr("fill", fill).attr("stroke", stroke).attr("stroke-width", 1.25);
311
311
  cell.append("text").attr("x", it.x + it.w / 2).attr("y", it.y + it.h / 2 + 5).attr("text-anchor", "middle").attr("font-size", 13).attr("font-weight", 600).attr("fill", palette.text).text(clipLabel(it.label ?? "", it.w - 16, 13));
@@ -359,4 +359,4 @@ export {
359
359
  renderBlock,
360
360
  authoredCollapsedIds
361
361
  };
362
- //# sourceMappingURL=chunk-RJE5JTVK.js.map
362
+ //# sourceMappingURL=chunk-VC3TR4NL.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  computeNodeSizing,
3
3
  layoutPert
4
- } from "./chunk-4OHACBGX.js";
4
+ } from "./chunk-F2L5GCQ4.js";
5
5
  import {
6
6
  analyzePert
7
7
  } from "./chunk-NX4EQS3U.js";
@@ -13,12 +13,12 @@ import {
13
13
  EDGE_STROKE_WIDTH,
14
14
  NODE_STROKE_WIDTH
15
15
  } from "./chunk-3CIOJ5YJ.js";
16
- import {
17
- renderIntegratedLegend
18
- } from "./chunk-PWIHZ6NJ.js";
19
16
  import {
20
17
  ScaleContext
21
18
  } from "./chunk-YYVTBZZC.js";
19
+ import {
20
+ renderIntegratedLegend
21
+ } from "./chunk-4UDKKGHH.js";
22
22
  import {
23
23
  CAPTION_BOX_PADDING_X,
24
24
  CAPTION_BOX_PADDING_Y,
@@ -35,15 +35,15 @@ import {
35
35
  } from "./chunk-6KFWC4CO.js";
36
36
  import {
37
37
  LEGEND_HEIGHT
38
- } from "./chunk-QOOUC2J5.js";
38
+ } from "./chunk-HQCHYB5F.js";
39
39
  import {
40
40
  measureText,
41
41
  truncateText,
42
42
  wrapTextToWidth
43
- } from "./chunk-WCT3NYCV.js";
43
+ } from "./chunk-5LWQH6QV.js";
44
44
  import {
45
45
  parsePert
46
- } from "./chunk-RTLBSQ3G.js";
46
+ } from "./chunk-FUCAB3KQ.js";
47
47
  import {
48
48
  addCalendarDays,
49
49
  formatDuration,
@@ -60,7 +60,7 @@ import {
60
60
  import {
61
61
  resolveActiveTagGroup,
62
62
  resolveTagColor
63
- } from "./chunk-QLCCJEJI.js";
63
+ } from "./chunk-HBVD67XG.js";
64
64
 
65
65
  // src/pert/renderer.ts
66
66
  import * as d3Selection from "d3-selection";
@@ -1815,4 +1815,4 @@ export {
1815
1815
  measurePertAnalysisBlock,
1816
1816
  renderPertAnalysisBlock
1817
1817
  };
1818
- //# sourceMappingURL=chunk-CI2G3OEB.js.map
1818
+ //# sourceMappingURL=chunk-X2CH42BN.js.map
@@ -5,7 +5,7 @@ import {
5
5
  splitNameAndMeta,
6
6
  tryParseSharedOption,
7
7
  warnUnknownMetaKeys
8
- } from "./chunk-Y3J7VR52.js";
8
+ } from "./chunk-ZNQX6QWH.js";
9
9
  import {
10
10
  makeDgmoError,
11
11
  makeFail
@@ -274,4 +274,4 @@ function parseCycle(content) {
274
274
  export {
275
275
  parseCycle
276
276
  };
277
- //# sourceMappingURL=chunk-6HO5ZTXK.js.map
277
+ //# sourceMappingURL=chunk-XCC2RENT.js.map
@@ -0,0 +1,51 @@
1
+ // src/sketch/diagnostics.ts
2
+ var SKETCH_DIAGNOSTIC_CODES = {
3
+ NESTED_BOX: "E_SKETCH_NESTED_BOX",
4
+ AMBIGUOUS_TARGET: "E_SKETCH_AMBIGUOUS_TARGET",
5
+ UNKNOWN_SHAPE: "W_SKETCH_UNKNOWN_SHAPE",
6
+ OVERLAP_RESOLVED: "W_SKETCH_OVERLAP_RESOLVED"
7
+ };
8
+ var SKETCH_DIAGNOSTICS = [
9
+ {
10
+ code: SKETCH_DIAGNOSTIC_CODES.NESTED_BOX,
11
+ severity: "error",
12
+ chartType: "sketch",
13
+ title: "Nested box",
14
+ message: (p) => `Box "${String(p.label ?? "?")}" is nested inside another box \u2014 sketch boxes are one level only; its shapes join the outer box`,
15
+ hint: "Move the inner [Box] to the top level.",
16
+ example: "sketch\n[Outer]\n [Inner]\n Shape"
17
+ },
18
+ {
19
+ code: SKETCH_DIAGNOSTIC_CODES.AMBIGUOUS_TARGET,
20
+ severity: "error",
21
+ chartType: "sketch",
22
+ title: "Ambiguous edge target",
23
+ message: (p) => `Edge target "${String(p.target ?? "?")}" matches more than one shape \u2014 give each duplicate an alias (as x) and target the alias`,
24
+ hint: "Alias duplicate-label shapes and reference the alias.",
25
+ example: "sketch\nCache as c1\nCache as c2\nApp\n -> c1"
26
+ },
27
+ {
28
+ code: SKETCH_DIAGNOSTIC_CODES.UNKNOWN_SHAPE,
29
+ severity: "warning",
30
+ chartType: "sketch",
31
+ title: "Unknown shape",
32
+ message: (p) => `Unknown shape "${String(p.shape ?? "?")}" \u2014 rendered as a rectangle (valid: database, queue, person, document, note)`,
33
+ hint: "Use one of the closed shape kinds, or drop shape: for a rectangle.",
34
+ example: "sketch\nStore shape: database"
35
+ },
36
+ {
37
+ code: SKETCH_DIAGNOSTIC_CODES.OVERLAP_RESOLVED,
38
+ severity: "warning",
39
+ chartType: "sketch",
40
+ title: "Overlapping shapes auto-resolved",
41
+ message: (p) => `Shape "${String(p.label ?? "?")}" overlapped another at its authored position \u2014 moved to the nearest free slot`,
42
+ hint: "Keep shapes at least 2 half-slots apart on one axis, or omit at: to flow-place.",
43
+ example: "sketch\nA at: 0 0\nB at: 0 0"
44
+ }
45
+ ];
46
+
47
+ export {
48
+ SKETCH_DIAGNOSTIC_CODES,
49
+ SKETCH_DIAGNOSTICS
50
+ };
51
+ //# sourceMappingURL=chunk-XHVV4NVW.js.map
@@ -3,10 +3,10 @@ import {
3
3
  layoutJourneyMap,
4
4
  scoreToColor,
5
5
  scoreToCurveY
6
- } from "./chunk-3JLKYGBQ.js";
6
+ } from "./chunk-F7BFXWNQ.js";
7
7
  import {
8
8
  wrapNoteBody
9
- } from "./chunk-TYS6CSS5.js";
9
+ } from "./chunk-BCYVE3N5.js";
10
10
  import {
11
11
  NOTE_BULLET_INDENT
12
12
  } from "./chunk-5DH3KYFH.js";
@@ -16,12 +16,12 @@ import {
16
16
  import {
17
17
  CARD_RADIUS
18
18
  } from "./chunk-3CIOJ5YJ.js";
19
- import {
20
- renderIntegratedLegend
21
- } from "./chunk-PWIHZ6NJ.js";
22
19
  import {
23
20
  ScaleContext
24
21
  } from "./chunk-YYVTBZZC.js";
22
+ import {
23
+ renderIntegratedLegend
24
+ } from "./chunk-4UDKKGHH.js";
25
25
  import {
26
26
  FONT_FAMILY
27
27
  } from "./chunk-6KFWC4CO.js";
@@ -29,10 +29,10 @@ import {
29
29
  measureText,
30
30
  truncateText,
31
31
  wrapTextToWidth
32
- } from "./chunk-WCT3NYCV.js";
32
+ } from "./chunk-5LWQH6QV.js";
33
33
  import {
34
34
  parseJourneyMap
35
- } from "./chunk-44CM72SQ.js";
35
+ } from "./chunk-2WMBWZY2.js";
36
36
  import {
37
37
  contrastText,
38
38
  mix,
@@ -41,7 +41,7 @@ import {
41
41
  import {
42
42
  resolveActiveTagGroup,
43
43
  tagAttrKey
44
- } from "./chunk-QLCCJEJI.js";
44
+ } from "./chunk-HBVD67XG.js";
45
45
 
46
46
  // src/journey-map/renderer.ts
47
47
  import * as d3 from "d3-selection";
@@ -848,4 +848,4 @@ export {
848
848
  renderJourneyMap,
849
849
  renderJourneyMapForExport
850
850
  };
851
- //# sourceMappingURL=chunk-ZJEL4H2R.js.map
851
+ //# sourceMappingURL=chunk-XJ7J6WOO.js.map