@diagrammo/dgmo 0.77.0 → 0.78.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 (228) hide show
  1. package/README.md +17 -13
  2. package/dist/advanced.d.ts +19 -12
  3. package/dist/advanced.js +124 -120
  4. package/dist/block.css +1 -1
  5. package/dist/block.d.ts +2 -2
  6. package/dist/block.js +45 -41
  7. package/dist/{chart-meta-Cf_jkApJ.d.ts → chart-meta-BKN2ORkc.d.ts} +2 -2
  8. package/dist/chart-meta.d.ts +3 -3
  9. package/dist/chart-meta.js +30 -29
  10. package/dist/charts-d3-KEQ7XVSM.js +31 -0
  11. package/dist/{chunk-7IATMZSA.js → chunk-26EVL454.js} +1 -25
  12. package/dist/{chunk-3H4PDNP4.js → chunk-2NLBIZEW.js} +2 -2
  13. package/dist/{chunk-BH3BQICT.js → chunk-32VR65TL.js} +63 -36
  14. package/dist/{chunk-N5NQIZ56.js → chunk-36UQ77JV.js} +24 -24
  15. package/dist/chunk-3DPOIW3W.js +10 -0
  16. package/dist/{chunk-3SP6G4LN.js → chunk-3GLTQZKE.js} +2 -2
  17. package/dist/{chunk-DY7KDZUF.js → chunk-3OWIYK52.js} +2 -2
  18. package/dist/{chunk-3E4YB6TY.js → chunk-3XFOE3DQ.js} +12 -7
  19. package/dist/{chunk-W7UBPARG.js → chunk-3ZLQM6XN.js} +2 -2
  20. package/dist/{chunk-5GM6BZO7.js → chunk-4AWLEWSD.js} +5 -2
  21. package/dist/{chunk-SWUQJ5VR.js → chunk-4IGUEGD6.js} +80 -61
  22. package/dist/{chunk-QOVM5VRC.js → chunk-57GSSHBR.js} +2 -2
  23. package/dist/{chunk-5VMUVJO4.js → chunk-5G55TS3H.js} +2 -2
  24. package/dist/{chunk-U4DS2ODO.js → chunk-67I3HFSF.js} +9 -9
  25. package/dist/{chunk-WQXD3IIN.js → chunk-6B3M6LW6.js} +10 -8
  26. package/dist/{chunk-TKIPK5P6.js → chunk-6PHOZBW5.js} +4 -6
  27. package/dist/{chunk-5PFNUDXR.js → chunk-6VTLVU7D.js} +2 -2
  28. package/dist/{chunk-M5JT2AU7.js → chunk-6Z2NUJSX.js} +2 -2
  29. package/dist/{chunk-BWJLLNUX.js → chunk-7BNRHSSF.js} +2 -2
  30. package/dist/{chunk-JLODGGN2.js → chunk-7NNJXYXU.js} +2 -2
  31. package/dist/{chunk-FTTB64OJ.js → chunk-7SMVTA7I.js} +26 -26
  32. package/dist/{chunk-Z7KVOVE4.js → chunk-7WTFX6OA.js} +6 -3
  33. package/dist/{chunk-ZM27UI5O.js → chunk-A7Y32YD6.js} +2 -2
  34. package/dist/{chunk-FPRMP6YA.js → chunk-AHN2CVCH.js} +10 -7
  35. package/dist/{chunk-N6MZSBOL.js → chunk-AN7T6VP7.js} +2 -2
  36. package/dist/{chunk-F4X5NVKY.js → chunk-B6PVPAS5.js} +2 -2
  37. package/dist/{chunk-RV5A3EGI.js → chunk-BB2ORSTF.js} +19 -18
  38. package/dist/{chunk-SI3PYDL4.js → chunk-BJB4YDJP.js} +21 -21
  39. package/dist/{chunk-FR5EVD2X.js → chunk-BPM52K3Z.js} +38 -31
  40. package/dist/{chunk-TI4YUUW6.js → chunk-BSREARWG.js} +29 -28
  41. package/dist/{chunk-F4V67JXG.js → chunk-CTERZC4K.js} +2 -2
  42. package/dist/{chunk-WHWUVDYK.js → chunk-CYLSQO4L.js} +6 -6
  43. package/dist/{chunk-J76YDS4V.js → chunk-DCPD5SHV.js} +3 -3
  44. package/dist/{chunk-H7BYMIVK.js → chunk-ENDB5YSV.js} +67 -27
  45. package/dist/{chunk-RTTZIX34.js → chunk-EOB7XVYR.js} +2 -2
  46. package/dist/chunk-EPDBWATV.js +38 -0
  47. package/dist/{chunk-TPN7RJOM.js → chunk-FJADQOFQ.js} +3 -3
  48. package/dist/{chunk-MG3DE3VO.js → chunk-FLMXJMMY.js} +3 -3
  49. package/dist/{chunk-WGC42WJU.js → chunk-FWNJDD4U.js} +6 -2
  50. package/dist/{chunk-S5P5Z5Y5.js → chunk-GINNZHVN.js} +2 -2
  51. package/dist/{chunk-LYJ53DBK.js → chunk-GJH7ZEPH.js} +41 -36
  52. package/dist/{chunk-2MTM4E6M.js → chunk-GQEXY7XL.js} +68 -65
  53. package/dist/{chunk-XFXJXLK7.js → chunk-HHHYVTVS.js} +16 -16
  54. package/dist/chunk-ICLB27PZ.js +11 -0
  55. package/dist/{chunk-QMFIZQTB.js → chunk-IDGQB6XD.js} +6 -4
  56. package/dist/{chunk-R3XI2VC7.js → chunk-IDJGV6VM.js} +2 -1
  57. package/dist/{chunk-HDLRRY3N.js → chunk-IE47TYZT.js} +177 -118
  58. package/dist/{chunk-FJ57274M.js → chunk-IIEI7VK5.js} +15 -1
  59. package/dist/{chunk-XPBJVSRY.js → chunk-IMO46ROR.js} +38 -32
  60. package/dist/{chunk-VRPV6QXR.js → chunk-IZTU6WVR.js} +2 -2
  61. package/dist/{chunk-CIWFL2LM.js → chunk-JOD2CK2M.js} +16 -14
  62. package/dist/{chunk-XCFIAGT7.js → chunk-JUNTVLOU.js} +16 -15
  63. package/dist/{chunk-RWFMOVHG.js → chunk-KAZQX2EY.js} +2 -2
  64. package/dist/{chunk-NHQ7HUAS.js → chunk-KGX5LIUG.js} +10 -8
  65. package/dist/{chunk-Q74GP3GK.js → chunk-KO6DGOOB.js} +3 -3
  66. package/dist/{chunk-5ZD4DDG7.js → chunk-L26M3X7K.js} +16 -13
  67. package/dist/{chunk-RU2HHHYA.js → chunk-LD2JSKU3.js} +12 -2
  68. package/dist/{chunk-OO2L2LWV.js → chunk-LEBPWFVF.js} +50 -46
  69. package/dist/{chunk-MU3CJPJF.js → chunk-LGI735AJ.js} +2 -2
  70. package/dist/{chunk-OWVDD5EC.js → chunk-LMWXBFLA.js} +2 -2
  71. package/dist/{chunk-6IN4F4RH.js → chunk-M3LZCDB6.js} +40 -42
  72. package/dist/{chunk-YT5ICQ4R.js → chunk-MFK7LF66.js} +2 -2
  73. package/dist/{chunk-UH5YTZN7.js → chunk-MJYFPFZT.js} +110 -20
  74. package/dist/{chunk-2QRIMMIH.js → chunk-N56W4R66.js} +2 -2
  75. package/dist/{chunk-LXXVHLTH.js → chunk-NN5IDH2I.js} +2 -2
  76. package/dist/{chunk-46KVXDUJ.js → chunk-NS3KIRSW.js} +2 -2
  77. package/dist/{chunk-LM3HY3VG.js → chunk-P2DM7Q5U.js} +2 -2
  78. package/dist/{chunk-DJL5PO27.js → chunk-P4SQV3XD.js} +2 -2
  79. package/dist/{chunk-B52RL5VV.js → chunk-P54AX5XN.js} +9 -9
  80. package/dist/{chunk-MZEGUDTA.js → chunk-P64NBPSK.js} +14 -14
  81. package/dist/{chunk-FF7LRT5L.js → chunk-PIWUZFG7.js} +33 -25
  82. package/dist/{chunk-SWEKCK34.js → chunk-QAPFXLAC.js} +2 -2
  83. package/dist/chunk-QFIXL3OK.js +68 -0
  84. package/dist/{chunk-KRTLS3G6.js → chunk-QVMV4KCA.js} +2 -2
  85. package/dist/{chunk-76LHNLGX.js → chunk-R4YGH7DJ.js} +5 -3
  86. package/dist/{chunk-OZOHREFQ.js → chunk-RC3FM3FE.js} +12 -13
  87. package/dist/{chunk-UJBP57UJ.js → chunk-RC6GGF6X.js} +2 -2
  88. package/dist/{chunk-S6OXNZBM.js → chunk-RHZZVIGA.js} +3 -3
  89. package/dist/{chunk-MS5574I7.js → chunk-RIXWLFB4.js} +2 -2
  90. package/dist/{chunk-D3B6YEZK.js → chunk-RUNI4OXP.js} +18 -14
  91. package/dist/{chunk-ICVIJLBA.js → chunk-SFSJ6XWV.js} +2 -2
  92. package/dist/{chunk-QBM5BURJ.js → chunk-SNBEAO4Q.js} +8 -8
  93. package/dist/{chunk-DSXWJAOA.js → chunk-SXD6VY7D.js} +16 -14
  94. package/dist/{chunk-V4NHFY22.js → chunk-TLM3I4XF.js} +16 -16
  95. package/dist/{chunk-3O7ZYVJV.js → chunk-TO6TWNMF.js} +19 -15
  96. package/dist/{chunk-CYMYZYLI.js → chunk-U2JIFCJN.js} +18 -18
  97. package/dist/{chunk-SSEAULA5.js → chunk-U4ND3J6C.js} +18 -14
  98. package/dist/{chunk-QXMHBIQG.js → chunk-UCF6TKWV.js} +51 -48
  99. package/dist/{chunk-RGW26UAR.js → chunk-UDYJVX6Y.js} +9 -9
  100. package/dist/{chunk-7CXW6EGX.js → chunk-UQY2VLUK.js} +25 -23
  101. package/dist/{chunk-EUVUOPRC.js → chunk-VAA7QSZ7.js} +53 -32
  102. package/dist/{chunk-43AJKH2U.js → chunk-VQGQF7O7.js} +12 -10
  103. package/dist/{chunk-DEW62ON3.js → chunk-VSPNH7LC.js} +2 -2
  104. package/dist/{chunk-4YER7UCV.js → chunk-VUJQ6RU6.js} +2 -2
  105. package/dist/{chunk-CHOK7NCJ.js → chunk-VZD3ZV4Y.js} +26 -22
  106. package/dist/{chunk-NCT22MOD.js → chunk-WMIKC5XO.js} +2 -2
  107. package/dist/{chunk-C2WH3BMS.js → chunk-X326N4GN.js} +10 -7
  108. package/dist/chunk-XBJJP2HN.js +37 -0
  109. package/dist/{chunk-7NSNE52V.js → chunk-XCR3PDFF.js} +2 -2
  110. package/dist/{chunk-UBDVAHGK.js → chunk-XDPJMLOH.js} +30 -27
  111. package/dist/{chunk-CF3I5SOG.js → chunk-YKDZ3ZRI.js} +27 -25
  112. package/dist/{chunk-GLREDNBA.js → chunk-YVLTNNME.js} +12 -2
  113. package/dist/{chunk-6ZZKEYBS.js → chunk-ZGOBAMQ2.js} +15 -13
  114. package/dist/{chunk-6BVAW7KI.js → chunk-ZMCFUGKO.js} +49 -42
  115. package/dist/clock.js +11 -5
  116. package/dist/completion-registry.js +2 -2
  117. package/dist/countdown.js +26 -20
  118. package/dist/{d3-BiaJtaSw.d.ts → d3-CQT5bwpb.d.ts} +1 -1
  119. package/dist/{dgmo-router-BwXHZ_P3.d.ts → dgmo-router-C9CsswPZ.d.ts} +1 -1
  120. package/dist/{dgmo-router-A3LIHT6H.js → dgmo-router-XZNCLYTV.js} +30 -29
  121. package/dist/{dimensions-OFF4GRFL.js → dimensions-SIZMZ4DC.js} +8 -8
  122. package/dist/{flowchart-renderer-BBJUPORB.js → flowchart-renderer-FDJ4QQXE.js} +15 -14
  123. package/dist/index.d.ts +7 -7
  124. package/dist/index.js +58 -43
  125. package/dist/{layout-Y2V3LYV7.js → layout-5DZ2LI2R.js} +2 -2
  126. package/dist/{layout-ZAGUFT2G.js → layout-6I6LSBUR.js} +6 -5
  127. package/dist/{layout-2OJ25STS.js → layout-C2SCZV5M.js} +6 -5
  128. package/dist/{layout-6SKHNQYO.js → layout-CHWKNE3O.js} +3 -3
  129. package/dist/{layout-EM4DLMAX.js → layout-K4KML2DL.js} +3 -3
  130. package/dist/{layout-KQUSB45X.js → layout-S53FSD6R.js} +7 -6
  131. package/dist/{layout-ROORJQ4X.js → layout-TCFXB5XH.js} +7 -6
  132. package/dist/{layout-5ILNODTP.js → layout-XK6ZD7BU.js} +6 -5
  133. package/dist/{layout-B5GQVXXY.js → layout-YVY72CIG.js} +7 -6
  134. package/dist/{layout-VUZ3MLOI.js → layout-YY6VH5XH.js} +6 -5
  135. package/dist/{layout-RV2T2YTT.js → layout-ZDN252GR.js} +4 -3
  136. package/dist/{layout-search-UOKEMER5.js → layout-search-TSV4FURP.js} +7 -6
  137. package/dist/{legend-constants-PLN2YHGM.js → legend-constants-SB4PLHV5.js} +3 -3
  138. package/dist/{palettes-54YSI3IX.js → palettes-YIPSRYXP.js} +5 -3
  139. package/dist/{parser-GCVSRQPY.js → parser-2BX2EJUB.js} +3 -3
  140. package/dist/{parser-WVE6SKB7.js → parser-3UNIPVNY.js} +3 -3
  141. package/dist/{parser-5XFGK5C5.js → parser-4IHIVDJD.js} +5 -5
  142. package/dist/{parser-ZT3PU2HT.js → parser-62VNEQRT.js} +3 -3
  143. package/dist/{parser-PR3OR3LO.js → parser-6JNJHQAG.js} +3 -3
  144. package/dist/{parser-ZXQZZK6W.js → parser-6ZFQLLVE.js} +3 -2
  145. package/dist/{parser-WMJEPZDC.js → parser-BOPXE6RP.js} +3 -3
  146. package/dist/{parser-WWRRG2DV.js → parser-DFBQ2RID.js} +3 -3
  147. package/dist/{parser-2GMHFSTS.js → parser-EPKXJ2RL.js} +3 -3
  148. package/dist/{parser-ML3LVNDV.js → parser-G7E2BURB.js} +3 -3
  149. package/dist/{parser-QOIZGW7I.js → parser-GFGU5ZLQ.js} +3 -3
  150. package/dist/{parser-L7T7FY3H.js → parser-GKZWI5SZ.js} +3 -3
  151. package/dist/{parser-QYAIFXLP.js → parser-HSPODF4H.js} +3 -3
  152. package/dist/{parser-EQ4I3TSH.js → parser-IK3FXZ7D.js} +3 -3
  153. package/dist/{parser-LV7PQBUG.js → parser-LJWPKRDM.js} +3 -3
  154. package/dist/{parser-RDBXEVI4.js → parser-OYWUBQV4.js} +3 -3
  155. package/dist/{parser-6FUESG4N.js → parser-PD4TP6NM.js} +3 -3
  156. package/dist/{parser-E3OHNNTH.js → parser-R2JHC7LQ.js} +3 -3
  157. package/dist/{parser-CJNP7RKR.js → parser-RMZ6YI7H.js} +3 -3
  158. package/dist/{parser-TA5TYZNL.js → parser-RUJNN5PK.js} +3 -3
  159. package/dist/{parser-UTR5WE4O.js → parser-YWE7GHW6.js} +3 -3
  160. package/dist/{parser-3AOMUX5D.js → parser-Z5UK6ADF.js} +3 -3
  161. package/dist/{parser-YWQCC33R.js → parser-ZO5YT5SV.js} +3 -3
  162. package/dist/renderer-5TPUPMZ7.js +26 -0
  163. package/dist/{renderer-2NYQDW37.js → renderer-AIVALEQR.js} +7 -7
  164. package/dist/renderer-AMELXBNW.js +23 -0
  165. package/dist/renderer-BF7FYXG3.js +25 -0
  166. package/dist/renderer-CRRW7LTW.js +17 -0
  167. package/dist/renderer-CXU2MGSC.js +27 -0
  168. package/dist/renderer-DI66RLAG.js +30 -0
  169. package/dist/renderer-E2JTYQY5.js +39 -0
  170. package/dist/{renderer-Y3Y7PEUS.js → renderer-FA4BTAOL.js} +7 -7
  171. package/dist/{renderer-G2DPKJAN.js → renderer-FFGFTIT4.js} +15 -14
  172. package/dist/renderer-IVAM7Z3Y.js +27 -0
  173. package/dist/renderer-J6HK2KOW.js +23 -0
  174. package/dist/renderer-J7J3OVLQ.js +39 -0
  175. package/dist/{renderer-GHBF5PRH.js → renderer-JC7MK7SD.js} +6 -5
  176. package/dist/{renderer-VF7X66SL.js → renderer-JHQC5RGJ.js} +14 -14
  177. package/dist/renderer-JRITSZY3.js +28 -0
  178. package/dist/{renderer-ANJUDBOS.js → renderer-KD5X4RIS.js} +14 -13
  179. package/dist/{renderer-CVWQD442.js → renderer-KWNNWCGD.js} +6 -5
  180. package/dist/{renderer-FTX67CYZ.js → renderer-LGMIAG6N.js} +7 -6
  181. package/dist/{renderer-EDVCGIQO.js → renderer-LQN3FXAP.js} +33 -32
  182. package/dist/renderer-LRL4SU43.js +29 -0
  183. package/dist/{renderer-R5HIRN2M.js → renderer-MBL64AJI.js} +6 -6
  184. package/dist/renderer-NA3DTAWF.js +39 -0
  185. package/dist/renderer-OR5QHR7X.js +31 -0
  186. package/dist/renderer-SBVWHQVW.js +30 -0
  187. package/dist/{renderer-DNFV2IQI.js → renderer-TLOSBJKW.js} +13 -13
  188. package/dist/{renderer-EFQSMHID.js → renderer-UDWJRRIC.js} +11 -11
  189. package/dist/renderer-VHK6UAW2.js +20 -0
  190. package/dist/{renderer-2ANDPQWC.js → renderer-W5UG2HWT.js} +5 -5
  191. package/dist/renderer-WOOKJOBQ.js +25 -0
  192. package/dist/renderer-WYNLGZRF.js +25 -0
  193. package/dist/{renderer-RNFECJ5D.js → renderer-Y74Y54C3.js} +8 -8
  194. package/dist/renderer-ZUAXGHFC.js +28 -0
  195. package/dist/renderer-radial-YVUDGR7C.js +21 -0
  196. package/dist/{state-parser-TPA67IXM.js → state-parser-CT5HQQ7E.js} +3 -3
  197. package/dist/state-renderer-7O3QGNJ5.js +41 -0
  198. package/dist/{tag-groups-BAtkq0b_.d.ts → tag-groups-BoJg3lFV.d.ts} +0 -16
  199. package/dist/{themes-DpsyRSO7.d.ts → themes-CXYnNA4e.d.ts} +2 -2
  200. package/docs/architecture-report.md +3 -3
  201. package/docs/language-reference.md +122 -30
  202. package/docs/migration-sequence-color-to-tags.md +16 -8
  203. package/package.json +4 -4
  204. package/dist/charts-d3-HMEMHSSW.js +0 -29
  205. package/dist/chunk-53SEVJQM.js +0 -9
  206. package/dist/chunk-LP7EC4MI.js +0 -16
  207. package/dist/chunk-YM5RMLFO.js +0 -40
  208. package/dist/renderer-2LDT4TUX.js +0 -25
  209. package/dist/renderer-2RIIIO34.js +0 -39
  210. package/dist/renderer-3HFU3DTO.js +0 -25
  211. package/dist/renderer-4BF6ILP6.js +0 -27
  212. package/dist/renderer-5E2AH5TO.js +0 -38
  213. package/dist/renderer-62SLWRYF.js +0 -27
  214. package/dist/renderer-D6GJ6EVK.js +0 -30
  215. package/dist/renderer-GZLRX764.js +0 -24
  216. package/dist/renderer-H2HYLFN3.js +0 -20
  217. package/dist/renderer-IR5655M7.js +0 -28
  218. package/dist/renderer-L237AOOZ.js +0 -16
  219. package/dist/renderer-LSJWYGOL.js +0 -39
  220. package/dist/renderer-LWXDMZOV.js +0 -28
  221. package/dist/renderer-MYSVPERC.js +0 -22
  222. package/dist/renderer-OL5QSZPC.js +0 -31
  223. package/dist/renderer-P26HH3NA.js +0 -30
  224. package/dist/renderer-RPZVNCTF.js +0 -26
  225. package/dist/renderer-SDNWZDUY.js +0 -23
  226. package/dist/renderer-UKHH4UWV.js +0 -25
  227. package/dist/renderer-radial-QNGCGKZP.js +0 -21
  228. package/dist/state-renderer-ELWDRXD6.js +0 -40
@@ -1,41 +1,41 @@
1
1
  import {
2
2
  renderInlineText
3
- } from "./chunk-WGC42WJU.js";
3
+ } from "./chunk-FWNJDD4U.js";
4
4
  import {
5
5
  layoutInlineHeader
6
- } from "./chunk-MG3DE3VO.js";
6
+ } from "./chunk-FLMXJMMY.js";
7
7
  import {
8
8
  TITLE_FONT_SIZE,
9
9
  TITLE_FONT_WEIGHT,
10
10
  TITLE_Y
11
- } from "./chunk-DEW62ON3.js";
11
+ } from "./chunk-VSPNH7LC.js";
12
12
  import {
13
13
  renderIntegratedLegend
14
- } from "./chunk-U4DS2ODO.js";
14
+ } from "./chunk-67I3HFSF.js";
15
15
  import {
16
16
  getLegendExtent,
17
17
  getMaxLegendReservedHeight
18
- } from "./chunk-VRPV6QXR.js";
18
+ } from "./chunk-IZTU6WVR.js";
19
19
  import {
20
20
  FONT_FAMILY
21
- } from "./chunk-53SEVJQM.js";
21
+ } from "./chunk-ICLB27PZ.js";
22
22
  import {
23
23
  LEGEND_GROUP_GAP
24
- } from "./chunk-YT5ICQ4R.js";
24
+ } from "./chunk-MFK7LF66.js";
25
25
  import {
26
26
  measureText
27
27
  } from "./chunk-MTGGOCND.js";
28
28
  import {
29
29
  resolveTagColor,
30
30
  tagAttrKey
31
- } from "./chunk-76LHNLGX.js";
31
+ } from "./chunk-R4YGH7DJ.js";
32
32
  import {
33
33
  contrastText,
34
34
  getSeriesColors,
35
35
  mix,
36
36
  shapeFill,
37
37
  themeBaseBg
38
- } from "./chunk-GLREDNBA.js";
38
+ } from "./chunk-YVLTNNME.js";
39
39
  import {
40
40
  resolveColor
41
41
  } from "./chunk-XOGQY4EC.js";
@@ -806,14 +806,14 @@ function renderBracket(container, parsed, palette, isDark, exportDims) {
806
806
  "fill",
807
807
  fillMode === "outline" ? themeBaseBg(palette, isDark) : mix(c, palette.bg, isDark ? 20 : 14)
808
808
  ).attr("stroke", fillMode === "outline" ? c : mix(c, palette.bg, 55)).attr("stroke-width", 1);
809
- root.append("text").attr("x", (s.x0 + s.x1) / 2).attr("y", 18).attr("text-anchor", "middle").attr("font-size", 13).attr("font-weight", 800).attr("letter-spacing", 0.3).attr("fill", c).text(clip(s.label, s.x1 - s.x0, 13, true));
809
+ root.append("text").attr("x", (s.x0 + s.x1) / 2).attr("y", 18).attr("text-anchor", "middle").attr("font-size", 13).attr("font-weight", "bold").attr("letter-spacing", 0.3).attr("fill", c).text(clip(s.label, s.x1 - s.x0, 13, true));
810
810
  }
811
811
  for (const col of layout.columns) {
812
812
  const c = col.color ? resolveColor(col.color, palette) ?? col.color : basePaint.muted;
813
813
  const covered = layout.sideLabels.some(
814
814
  (s) => col.x >= s.x0 && col.x <= s.x1
815
815
  );
816
- root.append("text").attr("x", col.x).attr("y", covered ? roundY : 22).attr("text-anchor", "middle").attr("font-size", covered ? 14 : 15).attr("font-weight", covered ? 700 : 800).attr("fill", c).attr("letter-spacing", 0.4).text(clip(col.label, BOX_W + 20, covered ? 14 : 15, true));
816
+ root.append("text").attr("x", col.x).attr("y", covered ? roundY : 22).attr("text-anchor", "middle").attr("font-size", covered ? 14 : 15).attr("font-weight", "bold").attr("fill", c).attr("letter-spacing", 0.4).text(clip(col.label, BOX_W + 20, covered ? 14 : 15, true));
817
817
  }
818
818
  for (const m of layout.matches) {
819
819
  drawConnector(root, m, m.topFrom, m.y - HALF_SPAN2, basePaint);
@@ -905,26 +905,26 @@ function drawBox(g, cx, cy, name, info, sidePaint, palette, isDark, m, activeKey
905
905
  let sw = 1.25;
906
906
  let dash = null;
907
907
  let textColor = paint.ink;
908
- let weight = 600;
908
+ let weight = "bold";
909
909
  if (info.isChampion) {
910
910
  fill = paint.tint;
911
911
  stroke = paint.accent;
912
912
  sw = 3;
913
- weight = 800;
913
+ weight = "bold";
914
914
  } else if (isTBD) {
915
915
  fill = paint.track;
916
916
  dash = "4 4";
917
917
  textColor = paint.muted;
918
- weight = 500;
918
+ weight = "normal";
919
919
  } else if (info.isWinner) {
920
920
  fill = paint.tint;
921
921
  stroke = paint.accent;
922
922
  sw = 2;
923
- weight = 700;
923
+ weight = "bold";
924
924
  } else if (info.isLoser) {
925
925
  stroke = paint.hair;
926
926
  textColor = paint.muted;
927
- weight = 500;
927
+ weight = "normal";
928
928
  } else if (info.pending) {
929
929
  stroke = mix(paint.accent, paint.hair, 50);
930
930
  }
@@ -939,7 +939,7 @@ function drawBox(g, cx, cy, name, info, sidePaint, palette, isDark, m, activeKey
939
939
  if (dash) rect.attr("stroke-dasharray", dash);
940
940
  let leftPad = 11;
941
941
  if (info.seed !== null) {
942
- cell.append("text").attr("x", x + 9).attr("y", cy + 4).attr("text-anchor", "start").attr("font-size", 10).attr("font-weight", 700).attr("fill", gutterColor).text(info.seed);
942
+ cell.append("text").attr("x", x + 9).attr("y", cy + 4).attr("text-anchor", "start").attr("font-size", 10).attr("font-weight", "bold").attr("fill", gutterColor).text(info.seed);
943
943
  leftPad = 9 + Math.max(12, measureText(String(info.seed), 10, { bold: true })) + 6;
944
944
  }
945
945
  let rightPad = 11;
@@ -953,11 +953,11 @@ function drawBox(g, cx, cy, name, info, sidePaint, palette, isDark, m, activeKey
953
953
  isTBD ? "TBD" : name,
954
954
  BOX_W - leftPad - rightPad,
955
955
  12.5,
956
- weight >= 600
956
+ weight === "bold"
957
957
  )
958
958
  );
959
959
  if (info.score) {
960
- cell.append("text").attr("x", x + BOX_W - 11).attr("y", cy + 4).attr("text-anchor", "end").attr("font-size", 12).attr("font-weight", info.isWinner ? 700 : 500).attr("fill", info.isWinner ? textColor : gutterColor).text(info.score);
960
+ cell.append("text").attr("x", x + BOX_W - 11).attr("y", cy + 4).attr("text-anchor", "end").attr("font-size", 12).attr("font-weight", info.isWinner ? "bold" : "normal").attr("fill", info.isWinner ? textColor : gutterColor).text(info.score);
961
961
  }
962
962
  }
963
963
  function drawHome(cell, hx, cy, color) {
@@ -967,7 +967,7 @@ function drawHome(cell, hx, cy, color) {
967
967
  cell.append("path").attr("d", d).attr("fill", "none").attr("stroke", color).attr("stroke-width", 1.2).attr("stroke-linejoin", "round");
968
968
  }
969
969
  function drawUpset(g, m, paint) {
970
- g.append("text").attr("x", m.x + BOX_W / 2).attr("y", m.y - HALF_SPAN2 - BOX_H / 2 - 4).attr("text-anchor", "end").attr("font-size", 9).attr("font-weight", 800).attr("letter-spacing", 0.6).attr("fill", paint.accent).text("UPSET");
970
+ g.append("text").attr("x", m.x + BOX_W / 2).attr("y", m.y - HALF_SPAN2 - BOX_H / 2 - 4).attr("text-anchor", "end").attr("font-size", 9).attr("font-weight", "bold").attr("letter-spacing", 0.6).attr("fill", paint.accent).text("UPSET");
971
971
  }
972
972
  function drawCommentary(g, m, palette) {
973
973
  const x = m.x - BOX_W / 2 + 2;
@@ -1001,4 +1001,4 @@ export {
1001
1001
  renderBracket,
1002
1002
  renderBracketForExport
1003
1003
  };
1004
- //# sourceMappingURL=chunk-SI3PYDL4.js.map
1004
+ //# sourceMappingURL=chunk-BJB4YDJP.js.map
@@ -95,22 +95,28 @@ function unitRect(c, r) {
95
95
  return { c, r, w: SKETCH_SEP, h: SKETCH_SEP };
96
96
  }
97
97
  var childBoxAt = /* @__PURE__ */ new Map();
98
+ function firstFreeOnRing(base, occupied, d) {
99
+ for (let quadrant = 0; quadrant < 4; quadrant++) {
100
+ for (let dr = -d; dr <= d; dr++) {
101
+ const r = base.r + dr;
102
+ const spread = d - Math.abs(dr);
103
+ for (const c of spread === 0 ? [base.c] : [base.c - spread, base.c + spread]) {
104
+ const cost = (r < base.r ? 2 : 0) + (c < base.c ? 1 : 0);
105
+ if (cost !== quadrant) continue;
106
+ if (!occupied.hits({ ...base, c, r })) return { c, r };
107
+ }
108
+ }
109
+ }
110
+ return null;
111
+ }
98
112
  function nearestFreeRect(base, occupied) {
99
113
  if (!occupied.hits(base)) return { c: base.c, r: base.r };
100
- for (let d = 1; d <= 200; d++) {
101
- const candidates = [];
102
- for (let dc = -d; dc <= d; dc++) {
103
- const dr = d - Math.abs(dc);
104
- candidates.push({ c: base.c + dc, r: base.r + dr });
105
- if (dr !== 0) candidates.push({ c: base.c + dc, r: base.r - dr });
106
- }
107
- candidates.sort((a, b) => {
108
- const costA = (a.r < base.r ? 2 : 0) + (a.c < base.c ? 1 : 0);
109
- const costB = (b.r < base.r ? 2 : 0) + (b.c < base.c ? 1 : 0);
110
- return costA - costB || a.r - b.r || a.c - b.c;
111
- });
112
- for (const cand of candidates) {
113
- if (!occupied.hits({ ...base, c: cand.c, r: cand.r })) return cand;
114
+ const key = `${base.c},${base.r},${base.w},${base.h}`;
115
+ for (let d = occupied.ringStart.get(key) ?? 1; d <= 200; d++) {
116
+ const found = firstFreeOnRing(base, occupied, d);
117
+ if (found) {
118
+ occupied.ringStart.set(key, d);
119
+ return found;
114
120
  }
115
121
  }
116
122
  return { c: base.c, r: base.r };
@@ -136,6 +142,17 @@ var Occupancy = class {
136
142
  oversized = [];
137
143
  /** Every rect, in insertion order — the extent and flow-origin maths want it. */
138
144
  rects = [];
145
+ /**
146
+ * The ring a search from a given base last had to reach, keyed by that base.
147
+ *
148
+ * Slots are only ever taken here, never given back, so a ring that was full
149
+ * once is full for the rest of the layout. The next unit authored at the
150
+ * same slot can therefore start where the last one finished instead of
151
+ * re-walking every ring inside it — which is what made a stack of shapes on
152
+ * one coordinate cost more than linear even with the collision index in
153
+ * place (#484). Skipping proven-full rings cannot change where a unit lands.
154
+ */
155
+ ringStart = /* @__PURE__ */ new Map();
139
156
  add(rect) {
140
157
  this.rects.push(rect);
141
158
  const range = cellRange(rect);
@@ -173,22 +190,12 @@ var Occupancy = class {
173
190
  };
174
191
  function nearestFree(base, occupied) {
175
192
  if (!occupied.hits(base)) return { c: base.c, r: base.r };
176
- for (let d = 1; d <= 200; d++) {
177
- const candidates = [];
178
- for (let dc = -d; dc <= d; dc++) {
179
- const dr = d - Math.abs(dc);
180
- candidates.push({ c: base.c + dc, r: base.r + dr });
181
- if (dr !== 0) candidates.push({ c: base.c + dc, r: base.r - dr });
182
- }
183
- candidates.sort((a, b) => {
184
- const costA = (a.r < base.r ? 2 : 0) + (a.c < base.c ? 1 : 0);
185
- const costB = (b.r < base.r ? 2 : 0) + (b.c < base.c ? 1 : 0);
186
- return costA - costB || a.r - b.r || a.c - b.c;
187
- });
188
- for (const cand of candidates) {
189
- if (!occupied.hits({ ...base, c: cand.c, r: cand.r })) {
190
- return cand;
191
- }
193
+ const key = `${base.c},${base.r},${base.w},${base.h}`;
194
+ for (let d = occupied.ringStart.get(key) ?? 1; d <= 200; d++) {
195
+ const found = firstFreeOnRing(base, occupied, d);
196
+ if (found) {
197
+ occupied.ringStart.set(key, d);
198
+ return found;
192
199
  }
193
200
  }
194
201
  return { c: base.c, r: base.r };
@@ -706,4 +713,4 @@ export {
706
713
  SKETCH_AUTO_LAYOUT_DEFAULTS,
707
714
  layoutSketch
708
715
  };
709
- //# sourceMappingURL=chunk-FR5EVD2X.js.map
716
+ //# sourceMappingURL=chunk-BPM52K3Z.js.map
@@ -3,31 +3,34 @@ import {
3
3
  layoutJourneyMap,
4
4
  scoreToColor,
5
5
  scoreToCurveY
6
- } from "./chunk-F4V67JXG.js";
6
+ } from "./chunk-CTERZC4K.js";
7
7
  import {
8
8
  wrapNoteBody
9
- } from "./chunk-MU3CJPJF.js";
9
+ } from "./chunk-LGI735AJ.js";
10
10
  import {
11
11
  NOTE_BULLET_INDENT
12
12
  } from "./chunk-5DH3KYFH.js";
13
13
  import {
14
14
  renderInlineText
15
- } from "./chunk-WGC42WJU.js";
16
- import {
17
- CARD_RADIUS
18
- } from "./chunk-FJ57274M.js";
15
+ } from "./chunk-FWNJDD4U.js";
19
16
  import {
20
17
  ScaleContext
21
18
  } from "./chunk-24YPR5EH.js";
19
+ import {
20
+ CARD_RADIUS,
21
+ CONTAINER_RADIUS,
22
+ GRID_DASH,
23
+ NODE_STROKE_WIDTH
24
+ } from "./chunk-IIEI7VK5.js";
22
25
  import {
23
26
  serializeSvg
24
- } from "./chunk-RU2HHHYA.js";
27
+ } from "./chunk-LD2JSKU3.js";
25
28
  import {
26
29
  renderIntegratedLegend
27
- } from "./chunk-U4DS2ODO.js";
30
+ } from "./chunk-67I3HFSF.js";
28
31
  import {
29
32
  FONT_FAMILY
30
- } from "./chunk-53SEVJQM.js";
33
+ } from "./chunk-ICLB27PZ.js";
31
34
  import {
32
35
  measureText,
33
36
  truncateText,
@@ -35,11 +38,11 @@ import {
35
38
  } from "./chunk-MTGGOCND.js";
36
39
  import {
37
40
  parseJourneyMap
38
- } from "./chunk-2QRIMMIH.js";
41
+ } from "./chunk-N56W4R66.js";
39
42
  import {
40
43
  resolveActiveTagGroup,
41
44
  tagAttrKey
42
- } from "./chunk-76LHNLGX.js";
45
+ } from "./chunk-R4YGH7DJ.js";
43
46
  import {
44
47
  fillModeFromOptions
45
48
  } from "./chunk-M5OOAP65.js";
@@ -48,7 +51,7 @@ import {
48
51
  mix,
49
52
  shapeFill,
50
53
  themeBaseBg
51
- } from "./chunk-GLREDNBA.js";
54
+ } from "./chunk-YVLTNNME.js";
52
55
 
53
56
  // src/journey-map/renderer.ts
54
57
  import * as d3 from "d3-selection";
@@ -58,10 +61,8 @@ var PADDING = DIAGRAM_PADDING;
58
61
  var CARD_PADDING_X = 10;
59
62
  var CARD_PADDING_Y = 6;
60
63
  var CARD_HEADER_HEIGHT = 24;
61
- var CARD_STROKE_WIDTH = 1.5;
62
64
  var CARD_META_LINE_HEIGHT = 14;
63
65
  var CARD_GAP_INTERNAL = 8;
64
- var COLUMN_RADIUS = 8;
65
66
  var COLUMN_HEADER_HEIGHT = 36;
66
67
  var COLUMN_PADDING = 12;
67
68
  var FONT_SIZE_TITLE = 18;
@@ -173,8 +174,8 @@ function renderJourneyMap(container, parsed, palette, isDark, options) {
173
174
  1.2,
174
175
  fillMode
175
176
  );
176
- personaG.append("rect").attr("x", panelX).attr("y", panelY).attr("width", panelWidth).attr("height", panelHeight).attr("rx", CARD_RADIUS).attr("fill", "none").attr("stroke", personaColor).attr("stroke-width", CARD_STROKE_WIDTH);
177
- personaG.append("text").attr("x", textX).attr("y", panelY + CARD_PADDING_Y + FONT_SIZE_STEP).attr("font-size", FONT_SIZE_STEP).attr("font-weight", "500").attr("fill", onPersonaText).text(
177
+ personaG.append("rect").attr("x", panelX).attr("y", panelY).attr("width", panelWidth).attr("height", panelHeight).attr("rx", CARD_RADIUS).attr("fill", "none").attr("stroke", personaColor).attr("stroke-width", NODE_STROKE_WIDTH);
178
+ personaG.append("text").attr("x", textX).attr("y", panelY + CARD_PADDING_Y + FONT_SIZE_STEP).attr("font-size", FONT_SIZE_STEP).attr("font-weight", "normal").attr("fill", onPersonaText).text(
178
179
  truncateText(parsed.persona.name, FONT_SIZE_STEP, textAreaWidth)
179
180
  );
180
181
  for (let li = 0; li < descLines.length; li++) {
@@ -270,7 +271,7 @@ function renderJourneyMap(container, parsed, palette, isDark, options) {
270
271
  const curveG = svg.append("g").attr("class", "journey-curve-area");
271
272
  for (let score = 1; score <= 5; score++) {
272
273
  const y = scoreToCurveY(score, layout.curveAreaBottom);
273
- curveG.append("line").attr("x1", PADDING).attr("x2", layout.totalWidth - PADDING).attr("y1", y).attr("y2", y).attr("stroke", palette.textMuted).attr("stroke-opacity", GRID_LINE_OPACITY).attr("stroke-dasharray", "4,4");
274
+ curveG.append("line").attr("x1", PADDING).attr("x2", layout.totalWidth - PADDING).attr("y1", y).attr("y2", y).attr("stroke", palette.textMuted).attr("stroke-opacity", GRID_LINE_OPACITY).attr("stroke-dasharray", GRID_DASH);
274
275
  }
275
276
  if (layout.curvePoints.length >= 2) {
276
277
  const first = layout.curvePoints[0];
@@ -376,9 +377,9 @@ function renderJourneyMap(container, parsed, palette, isDark, options) {
376
377
  const isCollapsed = collapsedPhases.has(pl.phase.name);
377
378
  const phaseG = phasesG.append("g").attr("class", "journey-phase").attr("data-line-number", pl.phase.lineNumber);
378
379
  const colBg = isDark ? mix(palette.surface, palette.bg, 50) : mix(palette.surface, palette.bg, 30);
379
- phaseG.append("rect").attr("x", pl.x).attr("y", pl.y).attr("width", pl.width).attr("height", pl.height).attr("rx", COLUMN_RADIUS).attr("fill", colBg);
380
- phaseG.append("rect").attr("x", pl.x).attr("y", pl.y).attr("width", pl.width).attr("height", COLUMN_HEADER_HEIGHT).attr("rx", COLUMN_RADIUS).attr("fill", pl.headerColor);
381
- phaseG.append("rect").attr("x", pl.x).attr("y", pl.y + COLUMN_HEADER_HEIGHT - COLUMN_RADIUS).attr("width", pl.width).attr("height", COLUMN_RADIUS).attr("fill", pl.headerColor);
380
+ phaseG.append("rect").attr("x", pl.x).attr("y", pl.y).attr("width", pl.width).attr("height", pl.height).attr("rx", CONTAINER_RADIUS).attr("fill", colBg);
381
+ phaseG.append("rect").attr("x", pl.x).attr("y", pl.y).attr("width", pl.width).attr("height", COLUMN_HEADER_HEIGHT).attr("rx", CONTAINER_RADIUS).attr("fill", pl.headerColor);
382
+ phaseG.append("rect").attr("x", pl.x).attr("y", pl.y + COLUMN_HEADER_HEIGHT - CONTAINER_RADIUS).attr("width", pl.width).attr("height", CONTAINER_RADIUS).attr("fill", pl.headerColor);
382
383
  const onHeaderText = contrastText(
383
384
  pl.headerColor,
384
385
  palette.textOnFillLight,
@@ -435,7 +436,7 @@ function renderJourneyMap(container, parsed, palette, isDark, options) {
435
436
  { mode: fillMode }
436
437
  );
437
438
  const rowStroke = stepColor ?? palette.textMuted;
438
- itemG.append("rect").attr("x", listX).attr("y", itemY).attr("width", cardW).attr("height", COLLAPSED_CARD_H).attr("rx", CARD_RADIUS).attr("fill", rowFill).attr("stroke", rowStroke).attr("stroke-width", CARD_STROKE_WIDTH);
439
+ itemG.append("rect").attr("x", listX).attr("y", itemY).attr("width", cardW).attr("height", COLLAPSED_CARD_H).attr("rx", CARD_RADIUS).attr("fill", rowFill).attr("stroke", rowStroke).attr("stroke-width", NODE_STROKE_WIDTH);
439
440
  const faceCx = listX + CARD_PADDING_X + COLLAPSED_FACE_R;
440
441
  const faceCy = itemY + COLLAPSED_CARD_H / 2;
441
442
  if (step.score !== void 0) {
@@ -567,8 +568,8 @@ function renderJourneyMap(container, parsed, palette, isDark, options) {
567
568
  const scoreColor = scoreToColor(score, palette);
568
569
  const tintedBg = fillMode === "outline" ? themeBaseBg(palette, isDark) : mix(scoreColor, palette.surface, 20);
569
570
  const g = overlayG.append("g").attr("class", "journey-thought-hover");
570
- g.append("rect").attr("x", bx).attr("y", by).attr("width", bw).attr("height", bh).attr("rx", CARD_RADIUS).attr("fill", tintedBg).attr("stroke", scoreColor).attr("stroke-width", CARD_STROKE_WIDTH);
571
- g.append("line").attr("x1", fcx).attr("y1", by + bh).attr("x2", fcx).attr("y2", fcy - FACE_HOVER_R - 1).attr("stroke", scoreColor).attr("stroke-width", CARD_STROKE_WIDTH);
571
+ g.append("rect").attr("x", bx).attr("y", by).attr("width", bw).attr("height", bh).attr("rx", CARD_RADIUS).attr("fill", tintedBg).attr("stroke", scoreColor).attr("stroke-width", NODE_STROKE_WIDTH);
572
+ g.append("line").attr("x1", fcx).attr("y1", by + bh).attr("x2", fcx).attr("y2", fcy - FACE_HOVER_R - 1).attr("stroke", scoreColor).attr("stroke-width", NODE_STROKE_WIDTH);
572
573
  const centerX = bx + bw / 2;
573
574
  for (let i = 0; i < lines.length; i++) {
574
575
  g.append("text").attr("x", centerX).attr("y", by + THOUGHT_PAD_Y + (i + 1) * THOUGHT_LINE_H - 2).attr("text-anchor", "middle").attr("font-size", THOUGHT_FONT).attr("font-style", "italic").attr("fill", palette.textMuted).text(lines[i]);
@@ -688,11 +689,11 @@ function renderStepCard(parent, sl, palette, isDark, activeGroup, tagGroups, onN
688
689
  palette.textOnFillLight,
689
690
  palette.textOnFillDark
690
691
  );
691
- stepG.append("rect").attr("x", cx).attr("y", cy).attr("width", sl.width).attr("height", sl.height).attr("rx", CARD_RADIUS).attr("fill", cardFill).attr("stroke", cardStroke).attr("stroke-width", CARD_STROKE_WIDTH);
692
+ stepG.append("rect").attr("x", cx).attr("y", cy).attr("width", sl.width).attr("height", sl.height).attr("rx", CARD_RADIUS).attr("fill", cardFill).attr("stroke", cardStroke).attr("stroke-width", NODE_STROKE_WIDTH);
692
693
  const titleMaxW = sl.width - CARD_PADDING_X * 2;
693
694
  const titleLines = wrapTextToWidth(sl.step.title, FONT_SIZE_STEP, titleMaxW);
694
695
  for (let i = 0; i < titleLines.length; i++) {
695
- stepG.append("text").attr("x", cx + CARD_PADDING_X).attr("y", cy + CARD_PADDING_Y + FONT_SIZE_STEP + i * TITLE_LINE_HEIGHT).attr("font-size", FONT_SIZE_STEP).attr("font-weight", "500").attr("fill", onCardText).text(titleLines[i]);
696
+ stepG.append("text").attr("x", cx + CARD_PADDING_X).attr("y", cy + CARD_PADDING_Y + FONT_SIZE_STEP + i * TITLE_LINE_HEIGHT).attr("font-size", FONT_SIZE_STEP).attr("font-weight", "normal").attr("fill", onCardText).text(titleLines[i]);
696
697
  }
697
698
  const titleBlockH = CARD_PADDING_Y + titleLines.length * TITLE_LINE_HEIGHT + CARD_PADDING_Y;
698
699
  const cardAnnotations = sl.step.annotations;
@@ -747,7 +748,7 @@ function renderStepCard(parent, sl, palette, isDark, activeGroup, tagGroups, onN
747
748
  const stripFill = shapeFill(palette, stripColor, isDark, {
748
749
  mode: fillMode
749
750
  });
750
- stepG.append("rect").attr("x", cx).attr("y", stripY).attr("width", sl.width).attr("height", TAG_STRIP_HEIGHT).attr("rx", CARD_RADIUS).attr("fill", stripFill).attr("stroke", stripColor).attr("stroke-width", CARD_STROKE_WIDTH);
751
+ stepG.append("rect").attr("x", cx).attr("y", stripY).attr("width", sl.width).attr("height", TAG_STRIP_HEIGHT).attr("rx", CARD_RADIUS).attr("fill", stripFill).attr("stroke", stripColor).attr("stroke-width", NODE_STROKE_WIDTH);
751
752
  const stripTextColor = contrastText(
752
753
  stripFill,
753
754
  palette.textOnFillLight,
@@ -809,7 +810,7 @@ function addEmotionLabel(faceG, pt, palette) {
809
810
  EMOTION_LABEL_MAX_WIDTH
810
811
  );
811
812
  const y = pt.y + FACE_RADIUS + 5 + EMOTION_LABEL_FONT_SIZE;
812
- faceG.append("text").attr("class", "journey-emotion-label").attr("x", pt.x).attr("y", y).attr("text-anchor", "middle").attr("font-family", FONT_FAMILY).attr("font-size", EMOTION_LABEL_FONT_SIZE).attr("font-weight", 500).attr("fill", palette.text).attr("stroke", palette.bg).attr("stroke-width", 3).attr("stroke-linejoin", "round").attr("stroke-opacity", 0.8).attr("paint-order", "stroke").attr("pointer-events", "none").text(text);
813
+ faceG.append("text").attr("class", "journey-emotion-label").attr("x", pt.x).attr("y", y).attr("text-anchor", "middle").attr("font-family", FONT_FAMILY).attr("font-size", EMOTION_LABEL_FONT_SIZE).attr("font-weight", "normal").attr("fill", palette.text).attr("stroke", palette.bg).attr("stroke-width", 3).attr("stroke-linejoin", "round").attr("stroke-opacity", 0.8).attr("paint-order", "stroke").attr("pointer-events", "none").text(text);
813
814
  }
814
815
  function annotationColor(type, palette) {
815
816
  switch (type) {
@@ -877,4 +878,4 @@ export {
877
878
  renderJourneyMap,
878
879
  renderJourneyMapForExport
879
880
  };
880
- //# sourceMappingURL=chunk-TI4YUUW6.js.map
881
+ //# sourceMappingURL=chunk-BSREARWG.js.map
@@ -8,7 +8,7 @@ import {
8
8
  import {
9
9
  mix,
10
10
  shapeFill
11
- } from "./chunk-GLREDNBA.js";
11
+ } from "./chunk-YVLTNNME.js";
12
12
 
13
13
  // src/journey-map/layout.ts
14
14
  var PADDING = 24;
@@ -290,4 +290,4 @@ export {
290
290
  scoreToCurveY,
291
291
  layoutJourneyMap
292
292
  };
293
- //# sourceMappingURL=chunk-F4V67JXG.js.map
293
+ //# sourceMappingURL=chunk-CTERZC4K.js.map
@@ -12,24 +12,24 @@ import {
12
12
  import {
13
13
  TITLE_FONT_SIZE,
14
14
  TITLE_Y
15
- } from "./chunk-DEW62ON3.js";
15
+ } from "./chunk-VSPNH7LC.js";
16
16
  import {
17
17
  compactNumber,
18
18
  computeLegendLayout
19
- } from "./chunk-VRPV6QXR.js";
19
+ } from "./chunk-IZTU6WVR.js";
20
20
  import {
21
21
  measureLegendText
22
- } from "./chunk-YT5ICQ4R.js";
22
+ } from "./chunk-MFK7LF66.js";
23
23
  import {
24
24
  tagAttrKey
25
- } from "./chunk-76LHNLGX.js";
25
+ } from "./chunk-R4YGH7DJ.js";
26
26
  import {
27
27
  contrastRatio,
28
28
  mix,
29
29
  politicalTints,
30
30
  relativeLuminance,
31
31
  valueRampColor
32
- } from "./chunk-GLREDNBA.js";
32
+ } from "./chunk-YVLTNNME.js";
33
33
  import {
34
34
  resolveColor
35
35
  } from "./chunk-XOGQY4EC.js";
@@ -3406,4 +3406,4 @@ export {
3406
3406
  albersSkewFallback,
3407
3407
  layoutMap
3408
3408
  };
3409
- //# sourceMappingURL=chunk-WHWUVDYK.js.map
3409
+ //# sourceMappingURL=chunk-CYLSQO4L.js.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  buildMapProjection
3
- } from "./chunk-WHWUVDYK.js";
3
+ } from "./chunk-CYLSQO4L.js";
4
4
  import {
5
5
  TITLE_FONT_SIZE,
6
6
  TITLE_Y
7
- } from "./chunk-DEW62ON3.js";
7
+ } from "./chunk-VSPNH7LC.js";
8
8
 
9
9
  // src/map/dimensions.ts
10
10
  import { geoPath } from "d3-geo";
@@ -51,4 +51,4 @@ export {
51
51
  mapContentAspect,
52
52
  mapExportDimensions
53
53
  };
54
- //# sourceMappingURL=chunk-J76YDS4V.js.map
54
+ //# sourceMappingURL=chunk-DCPD5SHV.js.map
@@ -1,55 +1,63 @@
1
+ import {
2
+ appendArrowheadMarkers,
3
+ appendReverseArrowheadMarkers
4
+ } from "./chunk-XBJJP2HN.js";
1
5
  import {
2
6
  renderCollapseBar,
3
7
  renderNodeCard
4
- } from "./chunk-5GM6BZO7.js";
8
+ } from "./chunk-4AWLEWSD.js";
5
9
  import {
10
+ ScaleContext
11
+ } from "./chunk-24YPR5EH.js";
12
+ import {
13
+ ARROWHEAD_HEIGHT,
14
+ ARROWHEAD_WIDTH,
6
15
  CARD_RADIUS,
7
16
  COLLAPSE_BAR_HEIGHT,
8
17
  CONTAINER_LABEL_FONT_SIZE,
9
18
  CONTAINER_RADIUS,
19
+ EDGE_DASH,
10
20
  EDGE_LABEL_KNOCKOUT_OPACITY,
11
21
  EDGE_STROKE_WIDTH,
12
22
  HEADER_HEIGHT,
13
23
  LABEL_FONT_SIZE,
14
24
  META_FONT_SIZE,
15
25
  NODE_STROKE_WIDTH
16
- } from "./chunk-FJ57274M.js";
17
- import {
18
- ScaleContext
19
- } from "./chunk-24YPR5EH.js";
26
+ } from "./chunk-IIEI7VK5.js";
20
27
  import {
21
28
  layoutInlineHeader
22
- } from "./chunk-MG3DE3VO.js";
29
+ } from "./chunk-FLMXJMMY.js";
23
30
  import {
24
31
  TITLE_FONT_SIZE,
25
32
  TITLE_FONT_WEIGHT,
26
33
  TITLE_Y
27
- } from "./chunk-DEW62ON3.js";
34
+ } from "./chunk-VSPNH7LC.js";
28
35
  import {
29
36
  renderIntegratedLegend
30
- } from "./chunk-U4DS2ODO.js";
37
+ } from "./chunk-67I3HFSF.js";
31
38
  import {
32
39
  getLegendExtent,
33
40
  getMaxLegendReservedHeight
34
- } from "./chunk-VRPV6QXR.js";
41
+ } from "./chunk-IZTU6WVR.js";
35
42
  import {
36
43
  FONT_FAMILY
37
- } from "./chunk-53SEVJQM.js";
44
+ } from "./chunk-ICLB27PZ.js";
38
45
  import {
39
46
  measureText,
40
47
  wrapTextToWidth
41
48
  } from "./chunk-MTGGOCND.js";
42
49
  import {
50
+ UNTAGGED_TAG_COLOR,
43
51
  resolveActiveTagGroup,
44
52
  resolveTagColor,
45
53
  tagAttrKey
46
- } from "./chunk-76LHNLGX.js";
54
+ } from "./chunk-R4YGH7DJ.js";
47
55
  import {
48
56
  contrastText,
49
57
  mix,
50
58
  shapeFill,
51
59
  themeBaseBg
52
- } from "./chunk-GLREDNBA.js";
60
+ } from "./chunk-YVLTNNME.js";
53
61
 
54
62
  // src/sketch/renderer.ts
55
63
  import * as d3 from "d3-selection";
@@ -316,7 +324,25 @@ var SKETCH_VISUALS = {
316
324
  // their own name was (2026-08-27, #518).
317
325
  titleY: TITLE_Y,
318
326
  titleFontSize: TITLE_FONT_SIZE,
319
- titleFontWeight: Number(TITLE_FONT_WEIGHT),
327
+ // 🔴 `bold` AS A NUMBER, and never `Number('bold')` — which is `NaN`, which is
328
+ // what this shipped. Every other consumer of `TITLE_FONT_WEIGHT` writes it
329
+ // straight into an SVG attribute, where the string is valid; this one is read
330
+ // as a VALUE by the desktop canvas, which puts it on an SVG attribute AND on
331
+ // an input's inline style, so it has to be a weight rather than a word.
332
+ //
333
+ // The result was `font-weight="NaN"` on every sketch title — silently
334
+ // rendered at the default weight, so a sketch's name was the one title in the
335
+ // product that was not bold, and nothing failed. Found 2026-08-29 by an app
336
+ // test asserting the drawn weight, which had been red on it.
337
+ //
338
+ // The comparison rather than a bare `700` so that changing the shared
339
+ // constant is a type error here instead of another silent coercion.
340
+ //
341
+ // ⚠️ Widened back to `number`. Without the assertion the literal `700` leaks
342
+ // into the published type surface — `check:api` caught it on the push — and a
343
+ // consumer would then be typed against this exact weight rather than against
344
+ // "a weight", which is the opposite of what a shared constant is for.
345
+ titleFontWeight: TITLE_FONT_WEIGHT === "bold" ? 700 : 400,
320
346
  // 🔴 SHARED, not overridden. These read 2 and 2 against the conventions'
321
347
  // 1.5, under a comment claiming "a bolder, less-washed look" — and the
322
348
  // boldness was the complaint: a sketch beside a boxes-and-lines or an org
@@ -331,9 +357,9 @@ var SKETCH_VISUALS = {
331
357
  // single difference between the two pictures (#518). `markerUnits` defaults
332
358
  // to `strokeWidth`, so 5×4 here renders 7.5×6 — the same triangle
333
359
  // boxes-and-lines draws.
334
- arrowheadW: 5,
335
- arrowheadH: 4,
336
- dash: "6 3",
360
+ arrowheadW: ARROWHEAD_WIDTH,
361
+ arrowheadH: ARROWHEAD_HEIGHT,
362
+ dash: EDGE_DASH,
337
363
  /** A card's name. Shared, and it fits DOWN to `nodeLabelFontSizeMin` before
338
364
  * it wraps — it used to be allowed up to 30 on a card with no rows, which is
339
365
  * more than twice what any other chart type prints. */
@@ -355,7 +381,17 @@ var SKETCH_VISUALS = {
355
381
  // boxes-and-lines' 14 — and infra's — are the undocumented deviations here;
356
382
  // the fix is those two coming to 13, not a third chart type leaving.
357
383
  bandLabelFontSize: CONTAINER_LABEL_FONT_SIZE,
358
- bandLabelFontWeight: 600,
384
+ // 🔴 A WEIGHT, never the word — the same defect `titleFontWeight` carries
385
+ // the note for, one property along. `'bold'` is valid on the SVG attribute
386
+ // this renderer writes it to, and invalid everywhere a consumer needs a
387
+ // number: the app's live canvas puts a container band's weight on an
388
+ // `<input>`'s inline style and into a `fontWeight: number` slot, so it had
389
+ // to translate the word back to 700 itself and typecheck went red on main
390
+ // when it did not (#537, 2026-08-29). 700 is what `'bold'` already drew —
391
+ // this changes the type, not the picture. `as number` for the same reason
392
+ // `titleFontWeight` carries it: the literal would otherwise leak into the
393
+ // published type surface and `check:api` fails on it.
394
+ bandLabelFontWeight: 700,
359
395
  bandLabelOpacity: 1,
360
396
  /** 11 — what boxes-and-lines prints. It was 12, the only edge label in the
361
397
  * product at that size. */
@@ -567,22 +603,26 @@ function renderSketch(container, parsed, layout, palette, isDark, options = {})
567
603
  const edgeColorFor = (metadata) => {
568
604
  if (activeKey !== null && metadata[activeKey] !== void 0) {
569
605
  const c = resolveTagColor(metadata, tagGroups, activeName);
570
- if (c && c !== "#999999") return c;
606
+ if (c && c !== UNTAGGED_TAG_COLOR) return c;
571
607
  }
572
608
  return palette.textMuted;
573
609
  };
574
610
  const flowColor = (edge) => edgeColorFor(edge.metadata);
575
611
  const edgeColors = new Set(layout.edges.map((e) => flowColor(e)));
576
- for (const color of edgeColors) {
577
- const hex = color.replace("#", "");
578
- defs.append("marker").attr("id", `sk-arrow-${hex}`).attr("viewBox", `0 0 ${ARROWHEAD_W} ${ARROWHEAD_H}`).attr("refX", ARROWHEAD_W).attr("refY", ARROWHEAD_H / 2).attr("markerWidth", ARROWHEAD_W).attr("markerHeight", ARROWHEAD_H).attr("orient", "auto").append("polygon").attr("points", `0,0 ${ARROWHEAD_W},${ARROWHEAD_H / 2} 0,${ARROWHEAD_H}`).attr("fill", color);
579
- defs.append("marker").attr("id", `sk-arrow-rev-${hex}`).attr("viewBox", `0 0 ${ARROWHEAD_W} ${ARROWHEAD_H}`).attr("refX", 0).attr("refY", ARROWHEAD_H / 2).attr("markerWidth", ARROWHEAD_W).attr("markerHeight", ARROWHEAD_H).attr("orient", "auto").append("polygon").attr(
580
- "points",
581
- `${ARROWHEAD_W},0 0,${ARROWHEAD_H / 2} ${ARROWHEAD_W},${ARROWHEAD_H}`
582
- ).attr("fill", color);
612
+ if (edgeColors.size > 0) {
613
+ const markerOpts = {
614
+ idPrefix: "sk",
615
+ width: ARROWHEAD_W,
616
+ height: ARROWHEAD_H,
617
+ // Every marker is per-colour here; the base id is never referenced.
618
+ baseFill: [...edgeColors][0],
619
+ colors: edgeColors
620
+ };
621
+ appendArrowheadMarkers(defs, markerOpts);
622
+ appendReverseArrowheadMarkers(defs, markerOpts);
583
623
  }
584
624
  if (showTitle) {
585
- svg.append("text").attr("class", "chart-title").attr("x", header.titleX).attr("y", TITLE_Y2).attr("text-anchor", header.titleAnchor).attr("font-size", sTitleFontSize).attr("font-weight", 700).attr("fill", palette.text).text(parsed.title);
625
+ svg.append("text").attr("class", "chart-title").attr("x", header.titleX).attr("y", TITLE_Y2).attr("text-anchor", header.titleAnchor).attr("font-size", sTitleFontSize).attr("font-weight", "bold").attr("fill", palette.text).text(parsed.title);
586
626
  }
587
627
  if (legendGroups.length > 0) {
588
628
  const legendG = svg.append("g").attr(
@@ -1321,4 +1361,4 @@ export {
1321
1361
  sketchEdgeGeometry,
1322
1362
  renderSketchForExport
1323
1363
  };
1324
- //# sourceMappingURL=chunk-H7BYMIVK.js.map
1364
+ //# sourceMappingURL=chunk-ENDB5YSV.js.map