nirs4all-ui 0.1.12 → 0.1.13

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 (521) hide show
  1. package/README.md +39 -1
  2. package/assets/brands/README.md +28 -8
  3. package/assets/brands/dag-ml/favicon.ico +0 -0
  4. package/assets/brands/dag-ml/horizontal-dark.svg +5 -0
  5. package/assets/brands/dag-ml/horizontal.png +0 -0
  6. package/assets/brands/dag-ml/horizontal.svg +5 -0
  7. package/assets/brands/dag-ml/icon-180.png +0 -0
  8. package/assets/brands/dag-ml/icon-256.png +0 -0
  9. package/assets/brands/dag-ml/icon-32.png +0 -0
  10. package/assets/brands/dag-ml/icon-512.png +0 -0
  11. package/assets/brands/dag-ml/icon.svg +3 -0
  12. package/assets/brands/dag-ml/og.png +0 -0
  13. package/assets/brands/dag-ml/stacked-dark.svg +5 -0
  14. package/assets/brands/dag-ml/stacked.png +0 -0
  15. package/assets/brands/dag-ml/stacked.svg +5 -0
  16. package/assets/brands/dag-ml-data/favicon.ico +0 -0
  17. package/assets/brands/dag-ml-data/horizontal-dark.svg +6 -0
  18. package/assets/brands/dag-ml-data/horizontal.png +0 -0
  19. package/assets/brands/dag-ml-data/horizontal.svg +6 -0
  20. package/assets/brands/dag-ml-data/icon-180.png +0 -0
  21. package/assets/brands/dag-ml-data/icon-256.png +0 -0
  22. package/assets/brands/dag-ml-data/icon-32.png +0 -0
  23. package/assets/brands/dag-ml-data/icon-512.png +0 -0
  24. package/assets/brands/dag-ml-data/icon.svg +3 -0
  25. package/assets/brands/dag-ml-data/og.png +0 -0
  26. package/assets/brands/dag-ml-data/stacked-dark.svg +6 -0
  27. package/assets/brands/dag-ml-data/stacked.png +0 -0
  28. package/assets/brands/dag-ml-data/stacked.svg +6 -0
  29. package/assets/brands/nirs4all/favicon.ico +0 -0
  30. package/assets/brands/nirs4all/horizontal-dark.svg +36 -0
  31. package/assets/brands/nirs4all/horizontal.png +0 -0
  32. package/assets/brands/nirs4all/horizontal.svg +35 -11
  33. package/assets/brands/nirs4all/icon-180.png +0 -0
  34. package/assets/brands/nirs4all/icon-256.png +0 -0
  35. package/assets/brands/nirs4all/icon-32.png +0 -0
  36. package/assets/brands/nirs4all/icon-512.png +0 -0
  37. package/assets/brands/nirs4all/icon.svg +32 -7
  38. package/assets/brands/nirs4all/og.png +0 -0
  39. package/assets/brands/nirs4all/stacked-dark.svg +36 -0
  40. package/assets/brands/nirs4all/stacked.png +0 -0
  41. package/assets/brands/nirs4all/stacked.svg +35 -11
  42. package/assets/brands/nirs4all-benchmarks/favicon.ico +0 -0
  43. package/assets/brands/nirs4all-benchmarks/horizontal-dark.svg +37 -0
  44. package/assets/brands/nirs4all-benchmarks/horizontal.png +0 -0
  45. package/assets/brands/nirs4all-benchmarks/horizontal.svg +37 -0
  46. package/assets/brands/nirs4all-benchmarks/icon-180.png +0 -0
  47. package/assets/brands/nirs4all-benchmarks/icon-256.png +0 -0
  48. package/assets/brands/nirs4all-benchmarks/icon-32.png +0 -0
  49. package/assets/brands/nirs4all-benchmarks/icon-512.png +0 -0
  50. package/assets/brands/nirs4all-benchmarks/icon.svg +33 -0
  51. package/assets/brands/nirs4all-benchmarks/og.png +0 -0
  52. package/assets/brands/nirs4all-benchmarks/stacked-dark.svg +36 -0
  53. package/assets/brands/nirs4all-benchmarks/stacked.png +0 -0
  54. package/assets/brands/nirs4all-benchmarks/stacked.svg +36 -0
  55. package/assets/brands/nirs4all-cluster/favicon.ico +0 -0
  56. package/assets/brands/nirs4all-cluster/horizontal-dark.svg +37 -0
  57. package/assets/brands/nirs4all-cluster/horizontal.png +0 -0
  58. package/assets/brands/nirs4all-cluster/horizontal.svg +37 -0
  59. package/assets/brands/nirs4all-cluster/icon-180.png +0 -0
  60. package/assets/brands/nirs4all-cluster/icon-256.png +0 -0
  61. package/assets/brands/nirs4all-cluster/icon-32.png +0 -0
  62. package/assets/brands/nirs4all-cluster/icon-512.png +0 -0
  63. package/assets/brands/nirs4all-cluster/icon.svg +33 -0
  64. package/assets/brands/nirs4all-cluster/og.png +0 -0
  65. package/assets/brands/nirs4all-cluster/stacked-dark.svg +36 -0
  66. package/assets/brands/nirs4all-cluster/stacked.png +0 -0
  67. package/assets/brands/nirs4all-cluster/stacked.svg +36 -0
  68. package/assets/brands/nirs4all-core/favicon.ico +0 -0
  69. package/assets/brands/nirs4all-core/horizontal-dark.svg +37 -0
  70. package/assets/brands/nirs4all-core/horizontal.png +0 -0
  71. package/assets/brands/nirs4all-core/horizontal.svg +36 -11
  72. package/assets/brands/nirs4all-core/icon-180.png +0 -0
  73. package/assets/brands/nirs4all-core/icon-256.png +0 -0
  74. package/assets/brands/nirs4all-core/icon-32.png +0 -0
  75. package/assets/brands/nirs4all-core/icon-512.png +0 -0
  76. package/assets/brands/nirs4all-core/icon.svg +32 -7
  77. package/assets/brands/nirs4all-core/og.png +0 -0
  78. package/assets/brands/nirs4all-core/stacked-dark.svg +36 -0
  79. package/assets/brands/nirs4all-core/stacked.png +0 -0
  80. package/assets/brands/nirs4all-core/stacked.svg +35 -11
  81. package/assets/brands/nirs4all-datasets/favicon.ico +0 -0
  82. package/assets/brands/nirs4all-datasets/horizontal-dark.svg +37 -0
  83. package/assets/brands/nirs4all-datasets/horizontal.png +0 -0
  84. package/assets/brands/nirs4all-datasets/horizontal.svg +37 -0
  85. package/assets/brands/nirs4all-datasets/icon-180.png +0 -0
  86. package/assets/brands/nirs4all-datasets/icon-256.png +0 -0
  87. package/assets/brands/nirs4all-datasets/icon-32.png +0 -0
  88. package/assets/brands/nirs4all-datasets/icon-512.png +0 -0
  89. package/assets/brands/nirs4all-datasets/icon.svg +33 -0
  90. package/assets/brands/nirs4all-datasets/og.png +0 -0
  91. package/assets/brands/nirs4all-datasets/stacked-dark.svg +36 -0
  92. package/assets/brands/nirs4all-datasets/stacked.png +0 -0
  93. package/assets/brands/nirs4all-datasets/stacked.svg +36 -0
  94. package/assets/brands/nirs4all-device/favicon.ico +0 -0
  95. package/assets/brands/nirs4all-device/horizontal-dark.svg +37 -0
  96. package/assets/brands/nirs4all-device/horizontal.png +0 -0
  97. package/assets/brands/nirs4all-device/horizontal.svg +37 -0
  98. package/assets/brands/nirs4all-device/icon-180.png +0 -0
  99. package/assets/brands/nirs4all-device/icon-256.png +0 -0
  100. package/assets/brands/nirs4all-device/icon-32.png +0 -0
  101. package/assets/brands/nirs4all-device/icon-512.png +0 -0
  102. package/assets/brands/nirs4all-device/icon.svg +33 -0
  103. package/assets/brands/nirs4all-device/og.png +0 -0
  104. package/assets/brands/nirs4all-device/stacked-dark.svg +36 -0
  105. package/assets/brands/nirs4all-device/stacked.png +0 -0
  106. package/assets/brands/nirs4all-device/stacked.svg +36 -0
  107. package/assets/brands/nirs4all-formats/favicon.ico +0 -0
  108. package/assets/brands/nirs4all-formats/horizontal-dark.svg +37 -0
  109. package/assets/brands/nirs4all-formats/horizontal.png +0 -0
  110. package/assets/brands/nirs4all-formats/horizontal.svg +37 -0
  111. package/assets/brands/nirs4all-formats/icon-180.png +0 -0
  112. package/assets/brands/nirs4all-formats/icon-256.png +0 -0
  113. package/assets/brands/nirs4all-formats/icon-32.png +0 -0
  114. package/assets/brands/nirs4all-formats/icon-512.png +0 -0
  115. package/assets/brands/nirs4all-formats/icon.svg +33 -0
  116. package/assets/brands/nirs4all-formats/og.png +0 -0
  117. package/assets/brands/nirs4all-formats/stacked-dark.svg +36 -0
  118. package/assets/brands/nirs4all-formats/stacked.png +0 -0
  119. package/assets/brands/nirs4all-formats/stacked.svg +36 -0
  120. package/assets/brands/nirs4all-io/favicon.ico +0 -0
  121. package/assets/brands/nirs4all-io/horizontal-dark.svg +37 -0
  122. package/assets/brands/nirs4all-io/horizontal.png +0 -0
  123. package/assets/brands/nirs4all-io/horizontal.svg +37 -0
  124. package/assets/brands/nirs4all-io/icon-180.png +0 -0
  125. package/assets/brands/nirs4all-io/icon-256.png +0 -0
  126. package/assets/brands/nirs4all-io/icon-32.png +0 -0
  127. package/assets/brands/nirs4all-io/icon-512.png +0 -0
  128. package/assets/brands/nirs4all-io/icon.svg +33 -0
  129. package/assets/brands/nirs4all-io/og.png +0 -0
  130. package/assets/brands/nirs4all-io/stacked-dark.svg +36 -0
  131. package/assets/brands/nirs4all-io/stacked.png +0 -0
  132. package/assets/brands/nirs4all-io/stacked.svg +36 -0
  133. package/assets/brands/nirs4all-methods/favicon.ico +0 -0
  134. package/assets/brands/nirs4all-methods/horizontal-dark.svg +37 -0
  135. package/assets/brands/nirs4all-methods/horizontal.png +0 -0
  136. package/assets/brands/nirs4all-methods/horizontal.svg +37 -0
  137. package/assets/brands/nirs4all-methods/icon-180.png +0 -0
  138. package/assets/brands/nirs4all-methods/icon-256.png +0 -0
  139. package/assets/brands/nirs4all-methods/icon-32.png +0 -0
  140. package/assets/brands/nirs4all-methods/icon-512.png +0 -0
  141. package/assets/brands/nirs4all-methods/icon.svg +33 -0
  142. package/assets/brands/nirs4all-methods/og.png +0 -0
  143. package/assets/brands/nirs4all-methods/stacked-dark.svg +36 -0
  144. package/assets/brands/nirs4all-methods/stacked.png +0 -0
  145. package/assets/brands/nirs4all-methods/stacked.svg +36 -0
  146. package/assets/brands/nirs4all-papers/favicon.ico +0 -0
  147. package/assets/brands/nirs4all-papers/horizontal-dark.svg +37 -0
  148. package/assets/brands/nirs4all-papers/horizontal.png +0 -0
  149. package/assets/brands/nirs4all-papers/horizontal.svg +37 -0
  150. package/assets/brands/nirs4all-papers/icon-180.png +0 -0
  151. package/assets/brands/nirs4all-papers/icon-256.png +0 -0
  152. package/assets/brands/nirs4all-papers/icon-32.png +0 -0
  153. package/assets/brands/nirs4all-papers/icon-512.png +0 -0
  154. package/assets/brands/nirs4all-papers/icon.svg +33 -0
  155. package/assets/brands/nirs4all-papers/og.png +0 -0
  156. package/assets/brands/nirs4all-papers/stacked-dark.svg +36 -0
  157. package/assets/brands/nirs4all-papers/stacked.png +0 -0
  158. package/assets/brands/nirs4all-papers/stacked.svg +36 -0
  159. package/assets/brands/nirs4all-providers/favicon.ico +0 -0
  160. package/assets/brands/nirs4all-providers/horizontal-dark.svg +37 -0
  161. package/assets/brands/nirs4all-providers/horizontal.png +0 -0
  162. package/assets/brands/nirs4all-providers/horizontal.svg +36 -11
  163. package/assets/brands/nirs4all-providers/icon-180.png +0 -0
  164. package/assets/brands/nirs4all-providers/icon-256.png +0 -0
  165. package/assets/brands/nirs4all-providers/icon-32.png +0 -0
  166. package/assets/brands/nirs4all-providers/icon-512.png +0 -0
  167. package/assets/brands/nirs4all-providers/icon.svg +32 -7
  168. package/assets/brands/nirs4all-providers/og.png +0 -0
  169. package/assets/brands/nirs4all-providers/stacked-dark.svg +36 -0
  170. package/assets/brands/nirs4all-providers/stacked.png +0 -0
  171. package/assets/brands/nirs4all-providers/stacked.svg +35 -11
  172. package/assets/brands/nirs4all-quality/favicon.ico +0 -0
  173. package/assets/brands/nirs4all-quality/horizontal-dark.svg +36 -0
  174. package/assets/brands/nirs4all-quality/horizontal.svg +35 -11
  175. package/assets/brands/nirs4all-quality/icon-180.png +0 -0
  176. package/assets/brands/nirs4all-quality/icon-256.png +0 -0
  177. package/assets/brands/nirs4all-quality/icon-32.png +0 -0
  178. package/assets/brands/nirs4all-quality/icon-512.png +0 -0
  179. package/assets/brands/nirs4all-quality/icon.svg +32 -7
  180. package/assets/brands/nirs4all-quality/og.png +0 -0
  181. package/assets/brands/nirs4all-quality/stacked-dark.svg +36 -0
  182. package/assets/brands/nirs4all-quality/stacked.svg +35 -11
  183. package/assets/brands/nirs4all-repository/favicon.ico +0 -0
  184. package/assets/brands/nirs4all-repository/horizontal-dark.svg +37 -0
  185. package/assets/brands/nirs4all-repository/horizontal.png +0 -0
  186. package/assets/brands/nirs4all-repository/horizontal.svg +37 -0
  187. package/assets/brands/nirs4all-repository/icon-180.png +0 -0
  188. package/assets/brands/nirs4all-repository/icon-256.png +0 -0
  189. package/assets/brands/nirs4all-repository/icon-32.png +0 -0
  190. package/assets/brands/nirs4all-repository/icon-512.png +0 -0
  191. package/assets/brands/nirs4all-repository/icon.svg +33 -0
  192. package/assets/brands/nirs4all-repository/og.png +0 -0
  193. package/assets/brands/nirs4all-repository/stacked-dark.svg +36 -0
  194. package/assets/brands/nirs4all-repository/stacked.png +0 -0
  195. package/assets/brands/nirs4all-repository/stacked.svg +36 -0
  196. package/assets/brands/nirs4all-studio/favicon.ico +0 -0
  197. package/assets/brands/nirs4all-studio/horizontal-dark.svg +37 -0
  198. package/assets/brands/nirs4all-studio/horizontal.png +0 -0
  199. package/assets/brands/nirs4all-studio/horizontal.svg +37 -0
  200. package/assets/brands/nirs4all-studio/icon-180.png +0 -0
  201. package/assets/brands/nirs4all-studio/icon-256.png +0 -0
  202. package/assets/brands/nirs4all-studio/icon-32.png +0 -0
  203. package/assets/brands/nirs4all-studio/icon-512.png +0 -0
  204. package/assets/brands/nirs4all-studio/icon.svg +33 -0
  205. package/assets/brands/nirs4all-studio/og.png +0 -0
  206. package/assets/brands/nirs4all-studio/stacked-dark.svg +36 -0
  207. package/assets/brands/nirs4all-studio/stacked.png +0 -0
  208. package/assets/brands/nirs4all-studio/stacked.svg +36 -0
  209. package/assets/brands/nirs4all-tools/favicon.ico +0 -0
  210. package/assets/brands/nirs4all-tools/horizontal-dark.svg +37 -0
  211. package/assets/brands/nirs4all-tools/horizontal.png +0 -0
  212. package/assets/brands/nirs4all-tools/horizontal.svg +37 -0
  213. package/assets/brands/nirs4all-tools/icon-180.png +0 -0
  214. package/assets/brands/nirs4all-tools/icon-256.png +0 -0
  215. package/assets/brands/nirs4all-tools/icon-32.png +0 -0
  216. package/assets/brands/nirs4all-tools/icon-512.png +0 -0
  217. package/assets/brands/nirs4all-tools/icon.svg +33 -0
  218. package/assets/brands/nirs4all-tools/og.png +0 -0
  219. package/assets/brands/nirs4all-tools/stacked-dark.svg +36 -0
  220. package/assets/brands/nirs4all-tools/stacked.png +0 -0
  221. package/assets/brands/nirs4all-tools/stacked.svg +36 -0
  222. package/assets/brands/nirs4all-ui/favicon.ico +0 -0
  223. package/assets/brands/nirs4all-ui/horizontal-dark.svg +37 -0
  224. package/assets/brands/nirs4all-ui/horizontal.png +0 -0
  225. package/assets/brands/nirs4all-ui/horizontal.svg +36 -11
  226. package/assets/brands/nirs4all-ui/icon-180.png +0 -0
  227. package/assets/brands/nirs4all-ui/icon-256.png +0 -0
  228. package/assets/brands/nirs4all-ui/icon-32.png +0 -0
  229. package/assets/brands/nirs4all-ui/icon-512.png +0 -0
  230. package/assets/brands/nirs4all-ui/icon.svg +32 -7
  231. package/assets/brands/nirs4all-ui/og.png +0 -0
  232. package/assets/brands/nirs4all-ui/stacked-dark.svg +36 -0
  233. package/assets/brands/nirs4all-ui/stacked.png +0 -0
  234. package/assets/brands/nirs4all-ui/stacked.svg +35 -11
  235. package/assets/brands/nirs4all-web/favicon.ico +0 -0
  236. package/assets/brands/nirs4all-web/horizontal-dark.svg +37 -0
  237. package/assets/brands/nirs4all-web/horizontal.png +0 -0
  238. package/assets/brands/nirs4all-web/horizontal.svg +37 -0
  239. package/assets/brands/nirs4all-web/icon-180.png +0 -0
  240. package/assets/brands/nirs4all-web/icon-256.png +0 -0
  241. package/assets/brands/nirs4all-web/icon-32.png +0 -0
  242. package/assets/brands/nirs4all-web/icon-512.png +0 -0
  243. package/assets/brands/nirs4all-web/icon.svg +33 -0
  244. package/assets/brands/nirs4all-web/og.png +0 -0
  245. package/assets/brands/nirs4all-web/stacked-dark.svg +36 -0
  246. package/assets/brands/nirs4all-web/stacked.png +0 -0
  247. package/assets/brands/nirs4all-web/stacked.svg +36 -0
  248. package/assets/chains.css +601 -0
  249. package/assets/conformal.css +323 -0
  250. package/assets/dag.css +446 -0
  251. package/assets/motion/nirs-spectra.svg +26 -9
  252. package/assets/viz.css +152 -0
  253. package/dist/brand/index.d.ts +24 -126
  254. package/dist/brand/index.d.ts.map +1 -1
  255. package/dist/brand/index.js +52 -200
  256. package/dist/brand/index.js.map +1 -1
  257. package/dist/chains/ChainExplorer.d.ts +34 -0
  258. package/dist/chains/ChainExplorer.d.ts.map +1 -0
  259. package/dist/chains/ChainExplorer.js +119 -0
  260. package/dist/chains/ChainExplorer.js.map +1 -0
  261. package/dist/chains/ChainNodeHub.d.ts +31 -0
  262. package/dist/chains/ChainNodeHub.d.ts.map +1 -0
  263. package/dist/chains/ChainNodeHub.js +150 -0
  264. package/dist/chains/ChainNodeHub.js.map +1 -0
  265. package/dist/chains/ChainNodeOrbit.d.ts +31 -0
  266. package/dist/chains/ChainNodeOrbit.d.ts.map +1 -0
  267. package/dist/chains/ChainNodeOrbit.js +158 -0
  268. package/dist/chains/ChainNodeOrbit.js.map +1 -0
  269. package/dist/chains/ChainScoreBeeswarm.d.ts +25 -0
  270. package/dist/chains/ChainScoreBeeswarm.d.ts.map +1 -0
  271. package/dist/chains/ChainScoreBeeswarm.js +84 -0
  272. package/dist/chains/ChainScoreBeeswarm.js.map +1 -0
  273. package/dist/chains/NodeEffectForest.d.ts +33 -0
  274. package/dist/chains/NodeEffectForest.d.ts.map +1 -0
  275. package/dist/chains/NodeEffectForest.js +85 -0
  276. package/dist/chains/NodeEffectForest.js.map +1 -0
  277. package/dist/chains/PositionEffectHeatmap.d.ts +25 -0
  278. package/dist/chains/PositionEffectHeatmap.d.ts.map +1 -0
  279. package/dist/chains/PositionEffectHeatmap.js +77 -0
  280. package/dist/chains/PositionEffectHeatmap.js.map +1 -0
  281. package/dist/chains/SequenceEffectHeatmap.d.ts +22 -0
  282. package/dist/chains/SequenceEffectHeatmap.d.ts.map +1 -0
  283. package/dist/chains/SequenceEffectHeatmap.js +74 -0
  284. package/dist/chains/SequenceEffectHeatmap.js.map +1 -0
  285. package/dist/chains/_cx.d.ts +2 -0
  286. package/dist/chains/_cx.d.ts.map +1 -0
  287. package/dist/chains/_cx.js +8 -0
  288. package/dist/chains/_cx.js.map +1 -0
  289. package/dist/chains/analysis.d.ts +100 -0
  290. package/dist/chains/analysis.d.ts.map +1 -0
  291. package/dist/chains/analysis.js +440 -0
  292. package/dist/chains/analysis.js.map +1 -0
  293. package/dist/chains/colors.d.ts +26 -0
  294. package/dist/chains/colors.d.ts.map +1 -0
  295. package/dist/chains/colors.js +58 -0
  296. package/dist/chains/colors.js.map +1 -0
  297. package/dist/chains/contract.d.ts +54 -0
  298. package/dist/chains/contract.d.ts.map +1 -0
  299. package/dist/chains/contract.js +125 -0
  300. package/dist/chains/contract.js.map +1 -0
  301. package/dist/chains/index.d.ts +35 -0
  302. package/dist/chains/index.d.ts.map +1 -0
  303. package/dist/chains/index.js +41 -0
  304. package/dist/chains/index.js.map +1 -0
  305. package/dist/chains/normalize.d.ts +27 -0
  306. package/dist/chains/normalize.d.ts.map +1 -0
  307. package/dist/chains/normalize.js +104 -0
  308. package/dist/chains/normalize.js.map +1 -0
  309. package/dist/chains/radial.d.ts +21 -0
  310. package/dist/chains/radial.d.ts.map +1 -0
  311. package/dist/chains/radial.js +52 -0
  312. package/dist/chains/radial.js.map +1 -0
  313. package/dist/chains/types.d.ts +240 -0
  314. package/dist/chains/types.d.ts.map +1 -0
  315. package/dist/chains/types.js +52 -0
  316. package/dist/chains/types.js.map +1 -0
  317. package/dist/components/ConformalPredictionTree.d.ts +79 -0
  318. package/dist/components/ConformalPredictionTree.d.ts.map +1 -0
  319. package/dist/components/ConformalPredictionTree.js +223 -0
  320. package/dist/components/ConformalPredictionTree.js.map +1 -0
  321. package/dist/components/DatasetResultCard.d.ts +33 -0
  322. package/dist/components/DatasetResultCard.d.ts.map +1 -0
  323. package/dist/components/DatasetResultCard.js +9 -0
  324. package/dist/components/DatasetResultCard.js.map +1 -0
  325. package/dist/components/PerClassTable.d.ts +27 -0
  326. package/dist/components/PerClassTable.d.ts.map +1 -0
  327. package/dist/components/PerClassTable.js +9 -0
  328. package/dist/components/PerClassTable.js.map +1 -0
  329. package/dist/components/PredictionCard.d.ts +27 -0
  330. package/dist/components/PredictionCard.d.ts.map +1 -0
  331. package/dist/components/PredictionCard.js +6 -0
  332. package/dist/components/PredictionCard.js.map +1 -0
  333. package/dist/components/RankingsTable.d.ts +28 -0
  334. package/dist/components/RankingsTable.d.ts.map +1 -0
  335. package/dist/components/RankingsTable.js +14 -0
  336. package/dist/components/RankingsTable.js.map +1 -0
  337. package/dist/components/ScoreCardTree.d.ts +31 -0
  338. package/dist/components/ScoreCardTree.d.ts.map +1 -0
  339. package/dist/components/ScoreCardTree.js +17 -0
  340. package/dist/components/ScoreCardTree.js.map +1 -0
  341. package/dist/components/index.d.ts +6 -0
  342. package/dist/components/index.d.ts.map +1 -1
  343. package/dist/components/index.js +6 -0
  344. package/dist/components/index.js.map +1 -1
  345. package/dist/conformal/index.d.ts +2 -0
  346. package/dist/conformal/index.d.ts.map +1 -0
  347. package/dist/conformal/index.js +2 -0
  348. package/dist/conformal/index.js.map +1 -0
  349. package/dist/conformal/result.d.ts +224 -0
  350. package/dist/conformal/result.d.ts.map +1 -0
  351. package/dist/conformal/result.js +461 -0
  352. package/dist/conformal/result.js.map +1 -0
  353. package/dist/dag/DagGraphView.d.ts +35 -0
  354. package/dist/dag/DagGraphView.d.ts.map +1 -0
  355. package/dist/dag/DagGraphView.js +424 -0
  356. package/dist/dag/DagGraphView.js.map +1 -0
  357. package/dist/dag/_cx.d.ts +2 -0
  358. package/dist/dag/_cx.d.ts.map +1 -0
  359. package/dist/dag/_cx.js +8 -0
  360. package/dist/dag/_cx.js.map +1 -0
  361. package/dist/dag/collapse.d.ts +81 -0
  362. package/dist/dag/collapse.d.ts.map +1 -0
  363. package/dist/dag/collapse.js +210 -0
  364. package/dist/dag/collapse.js.map +1 -0
  365. package/dist/dag/colors.d.ts +19 -0
  366. package/dist/dag/colors.d.ts.map +1 -0
  367. package/dist/dag/colors.js +54 -0
  368. package/dist/dag/colors.js.map +1 -0
  369. package/dist/dag/fromCompiledGraph.d.ts +27 -0
  370. package/dist/dag/fromCompiledGraph.d.ts.map +1 -0
  371. package/dist/dag/fromCompiledGraph.js +133 -0
  372. package/dist/dag/fromCompiledGraph.js.map +1 -0
  373. package/dist/dag/hierarchy.d.ts +38 -0
  374. package/dist/dag/hierarchy.d.ts.map +1 -0
  375. package/dist/dag/hierarchy.js +75 -0
  376. package/dist/dag/hierarchy.js.map +1 -0
  377. package/dist/dag/index.d.ts +28 -0
  378. package/dist/dag/index.d.ts.map +1 -0
  379. package/dist/dag/index.js +33 -0
  380. package/dist/dag/index.js.map +1 -0
  381. package/dist/dag/layout.d.ts +57 -0
  382. package/dist/dag/layout.d.ts.map +1 -0
  383. package/dist/dag/layout.js +267 -0
  384. package/dist/dag/layout.js.map +1 -0
  385. package/dist/dag/locale.d.ts +31 -0
  386. package/dist/dag/locale.d.ts.map +1 -0
  387. package/dist/dag/locale.js +32 -0
  388. package/dist/dag/locale.js.map +1 -0
  389. package/dist/dag/shape.d.ts +48 -0
  390. package/dist/dag/shape.d.ts.map +1 -0
  391. package/dist/dag/shape.js +263 -0
  392. package/dist/dag/shape.js.map +1 -0
  393. package/dist/dag/types.d.ts +106 -0
  394. package/dist/dag/types.d.ts.map +1 -0
  395. package/dist/dag/types.js +56 -0
  396. package/dist/dag/types.js.map +1 -0
  397. package/dist/index.d.ts +7 -0
  398. package/dist/index.d.ts.map +1 -1
  399. package/dist/index.js +7 -0
  400. package/dist/index.js.map +1 -1
  401. package/dist/keywordRegistry/index.d.ts +9 -0
  402. package/dist/keywordRegistry/index.d.ts.map +1 -0
  403. package/dist/keywordRegistry/index.js +9 -0
  404. package/dist/keywordRegistry/index.js.map +1 -0
  405. package/dist/keywordRegistry/registry.d.ts +107 -0
  406. package/dist/keywordRegistry/registry.d.ts.map +1 -0
  407. package/dist/keywordRegistry/registry.js +234 -0
  408. package/dist/keywordRegistry/registry.js.map +1 -0
  409. package/dist/robustness/index.d.ts +12 -0
  410. package/dist/robustness/index.d.ts.map +1 -0
  411. package/dist/robustness/index.js +12 -0
  412. package/dist/robustness/index.js.map +1 -0
  413. package/dist/robustness/modes.d.ts +15 -0
  414. package/dist/robustness/modes.d.ts.map +1 -0
  415. package/dist/robustness/modes.js +64 -0
  416. package/dist/robustness/modes.js.map +1 -0
  417. package/dist/robustness/scenarios.d.ts +38 -0
  418. package/dist/robustness/scenarios.d.ts.map +1 -0
  419. package/dist/robustness/scenarios.js +159 -0
  420. package/dist/robustness/scenarios.js.map +1 -0
  421. package/dist/robustness/summary.d.ts +135 -0
  422. package/dist/robustness/summary.d.ts.map +1 -0
  423. package/dist/robustness/summary.js +284 -0
  424. package/dist/robustness/summary.js.map +1 -0
  425. package/dist/styles/index.d.ts +19 -1
  426. package/dist/styles/index.d.ts.map +1 -1
  427. package/dist/styles/index.js +21 -0
  428. package/dist/styles/index.js.map +1 -1
  429. package/dist/tuning/index.d.ts +3 -0
  430. package/dist/tuning/index.d.ts.map +1 -0
  431. package/dist/tuning/index.js +3 -0
  432. package/dist/tuning/index.js.map +1 -0
  433. package/dist/tuning/result.d.ts +144 -0
  434. package/dist/tuning/result.d.ts.map +1 -0
  435. package/dist/tuning/result.js +277 -0
  436. package/dist/tuning/result.js.map +1 -0
  437. package/dist/tuning/searchSpace.d.ts +54 -0
  438. package/dist/tuning/searchSpace.d.ts.map +1 -0
  439. package/dist/tuning/searchSpace.js +118 -0
  440. package/dist/tuning/searchSpace.js.map +1 -0
  441. package/dist/viz/BiasVarianceBars.d.ts +27 -0
  442. package/dist/viz/BiasVarianceBars.d.ts.map +1 -0
  443. package/dist/viz/BiasVarianceBars.js +53 -0
  444. package/dist/viz/BiasVarianceBars.js.map +1 -0
  445. package/dist/viz/BoxPlot.d.ts +24 -0
  446. package/dist/viz/BoxPlot.d.ts.map +1 -0
  447. package/dist/viz/BoxPlot.js +50 -0
  448. package/dist/viz/BoxPlot.js.map +1 -0
  449. package/dist/viz/ConformalIntervalStrip.d.ts +66 -0
  450. package/dist/viz/ConformalIntervalStrip.d.ts.map +1 -0
  451. package/dist/viz/ConformalIntervalStrip.js +167 -0
  452. package/dist/viz/ConformalIntervalStrip.js.map +1 -0
  453. package/dist/viz/ConfusionMatrix.d.ts +24 -0
  454. package/dist/viz/ConfusionMatrix.d.ts.map +1 -0
  455. package/dist/viz/ConfusionMatrix.js +39 -0
  456. package/dist/viz/ConfusionMatrix.js.map +1 -0
  457. package/dist/viz/FeatureImportanceBar.d.ts +26 -0
  458. package/dist/viz/FeatureImportanceBar.d.ts.map +1 -0
  459. package/dist/viz/FeatureImportanceBar.js +49 -0
  460. package/dist/viz/FeatureImportanceBar.js.map +1 -0
  461. package/dist/viz/FoldStabilityLines.d.ts +29 -0
  462. package/dist/viz/FoldStabilityLines.d.ts.map +1 -0
  463. package/dist/viz/FoldStabilityLines.js +57 -0
  464. package/dist/viz/FoldStabilityLines.js.map +1 -0
  465. package/dist/viz/Histogram.d.ts +33 -0
  466. package/dist/viz/Histogram.d.ts.map +1 -0
  467. package/dist/viz/Histogram.js +64 -0
  468. package/dist/viz/Histogram.js.map +1 -0
  469. package/dist/viz/PcaScatter.d.ts +36 -0
  470. package/dist/viz/PcaScatter.d.ts.map +1 -0
  471. package/dist/viz/PcaScatter.js +72 -0
  472. package/dist/viz/PcaScatter.js.map +1 -0
  473. package/dist/viz/PipelineFlow.d.ts +28 -0
  474. package/dist/viz/PipelineFlow.d.ts.map +1 -0
  475. package/dist/viz/PipelineFlow.js +57 -0
  476. package/dist/viz/PipelineFlow.js.map +1 -0
  477. package/dist/viz/PredictionScatter.d.ts +41 -0
  478. package/dist/viz/PredictionScatter.d.ts.map +1 -0
  479. package/dist/viz/PredictionScatter.js +41 -0
  480. package/dist/viz/PredictionScatter.js.map +1 -0
  481. package/dist/viz/ResidualPlot.d.ts +32 -0
  482. package/dist/viz/ResidualPlot.d.ts.map +1 -0
  483. package/dist/viz/ResidualPlot.js +58 -0
  484. package/dist/viz/ResidualPlot.js.map +1 -0
  485. package/dist/viz/ScoreHeatmap.d.ts +30 -0
  486. package/dist/viz/ScoreHeatmap.d.ts.map +1 -0
  487. package/dist/viz/ScoreHeatmap.js +61 -0
  488. package/dist/viz/ScoreHeatmap.js.map +1 -0
  489. package/dist/viz/ScoreSummary.d.ts +23 -0
  490. package/dist/viz/ScoreSummary.d.ts.map +1 -0
  491. package/dist/viz/ScoreSummary.js +32 -0
  492. package/dist/viz/ScoreSummary.js.map +1 -0
  493. package/dist/viz/ShapBeeswarm.d.ts +29 -0
  494. package/dist/viz/ShapBeeswarm.d.ts.map +1 -0
  495. package/dist/viz/ShapBeeswarm.js +60 -0
  496. package/dist/viz/ShapBeeswarm.js.map +1 -0
  497. package/dist/viz/SpectraPlot.d.ts +50 -0
  498. package/dist/viz/SpectraPlot.d.ts.map +1 -0
  499. package/dist/viz/SpectraPlot.js +46 -0
  500. package/dist/viz/SpectraPlot.js.map +1 -0
  501. package/dist/viz/WaterfallChart.d.ts +30 -0
  502. package/dist/viz/WaterfallChart.d.ts.map +1 -0
  503. package/dist/viz/WaterfallChart.js +73 -0
  504. package/dist/viz/WaterfallChart.js.map +1 -0
  505. package/dist/viz/_cx.d.ts +2 -0
  506. package/dist/viz/_cx.d.ts.map +1 -0
  507. package/dist/viz/_cx.js +8 -0
  508. package/dist/viz/_cx.js.map +1 -0
  509. package/dist/viz/geometry.d.ts +87 -0
  510. package/dist/viz/geometry.d.ts.map +1 -0
  511. package/dist/viz/geometry.js +208 -0
  512. package/dist/viz/geometry.js.map +1 -0
  513. package/dist/viz/index.d.ts +33 -0
  514. package/dist/viz/index.d.ts.map +1 -0
  515. package/dist/viz/index.js +38 -0
  516. package/dist/viz/index.js.map +1 -0
  517. package/dist/viz/theme.d.ts +50 -0
  518. package/dist/viz/theme.d.ts.map +1 -0
  519. package/dist/viz/theme.js +100 -0
  520. package/dist/viz/theme.js.map +1 -0
  521. package/package.json +34 -2
@@ -0,0 +1,25 @@
1
+ import { type PlotPadding } from "../viz/geometry.js";
2
+ import type { ChainEffectAnalysis } from "./types.js";
3
+ export interface ChainScoreBeeswarmProps {
4
+ analysis: ChainEffectAnalysis;
5
+ /** Split the corpus on the presence of this token. */
6
+ focusToken: string;
7
+ width?: number;
8
+ height?: number;
9
+ padding?: PlotPadding;
10
+ /** Subsample dots above this count (medians stay exact). Default: draw all. */
11
+ maxPoints?: number;
12
+ withColor?: string;
13
+ withoutColor?: string;
14
+ title?: string;
15
+ className?: string;
16
+ }
17
+ /**
18
+ * Two-lane distribution comparison — the honest "does this node shift the whole
19
+ * distribution?" picture that complements the forest's point estimate. Every
20
+ * chain is a dot on a shared goodness axis (higher = better), split into a
21
+ * *with* lane and a *without* lane for the focus token, each with a median line
22
+ * and an IQR band. A dashed baseline marks the corpus median. Pure inline SVG.
23
+ */
24
+ export declare function ChainScoreBeeswarm({ analysis, focusToken, width, height, padding, maxPoints, withColor, withoutColor, title, className, }: ChainScoreBeeswarmProps): import("react").JSX.Element;
25
+ //# sourceMappingURL=ChainScoreBeeswarm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChainScoreBeeswarm.d.ts","sourceRoot":"","sources":["../../src/chains/ChainScoreBeeswarm.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA0D,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAG9G,OAAO,KAAK,EAAE,mBAAmB,EAAoB,MAAM,YAAY,CAAC;AAGxE,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,sDAAsD;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,+EAA+E;IAC/E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAwCD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,UAAU,EACV,KAAW,EACX,MAAY,EACZ,OAAO,EACP,SAAS,EACT,SAA8B,EAC9B,YAAkC,EAClC,KAAsC,EACtC,SAAS,GACV,EAAE,uBAAuB,+BA8GzB"}
@@ -0,0 +1,84 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { buildFrame, clamp, makeScale, niceExtent, round, ticks } from "../viz/geometry.js";
3
+ import { N4_VIZ_COLORS } from "../viz/theme.js";
4
+ import { cx } from "./_cx.js";
5
+ import { CHAIN_LENS_LABELS } from "./types.js";
6
+ function fmt(value) {
7
+ if (!Number.isFinite(value))
8
+ return "—";
9
+ if (Math.abs(value) >= 100)
10
+ return value.toFixed(0);
11
+ if (Math.abs(value) >= 1)
12
+ return value.toFixed(2);
13
+ return value.toFixed(3);
14
+ }
15
+ /** Deterministic [0,1) jitter from a point id (stable across SSR renders). */
16
+ function jitter(id) {
17
+ let h = 2166136261;
18
+ for (let i = 0; i < id.length; i += 1) {
19
+ h ^= id.charCodeAt(i);
20
+ h = Math.imul(h, 16777619);
21
+ }
22
+ return ((h >>> 0) % 1000) / 1000;
23
+ }
24
+ function summarize(points) {
25
+ const values = points.map((point) => point.goodness).filter((value) => Number.isFinite(value)).sort((a, b) => a - b);
26
+ if (values.length === 0)
27
+ return { n: 0, min: NaN, q1: NaN, median: NaN, q3: NaN, max: NaN, mean: NaN };
28
+ const q = (p) => {
29
+ const pos = clamp(p, 0, 1) * (values.length - 1);
30
+ const lo = Math.floor(pos);
31
+ const frac = pos - lo;
32
+ return values[lo] + ((values[Math.min(values.length - 1, lo + 1)] - values[lo]) * frac);
33
+ };
34
+ const mean = values.reduce((s, v) => s + v, 0) / values.length;
35
+ return { n: values.length, min: values[0], q1: q(0.25), median: q(0.5), q3: q(0.75), max: values[values.length - 1], mean };
36
+ }
37
+ function subsample(points, max) {
38
+ if (!max || points.length <= max)
39
+ return points;
40
+ const step = points.length / max;
41
+ const out = [];
42
+ for (let i = 0; i < points.length; i += step)
43
+ out.push(points[Math.floor(i)]);
44
+ return out;
45
+ }
46
+ /**
47
+ * Two-lane distribution comparison — the honest "does this node shift the whole
48
+ * distribution?" picture that complements the forest's point estimate. Every
49
+ * chain is a dot on a shared goodness axis (higher = better), split into a
50
+ * *with* lane and a *without* lane for the focus token, each with a median line
51
+ * and an IQR band. A dashed baseline marks the corpus median. Pure inline SVG.
52
+ */
53
+ export function ChainScoreBeeswarm({ analysis, focusToken, width = 460, height = 220, padding, maxPoints, withColor = N4_VIZ_COLORS.teal, withoutColor = N4_VIZ_COLORS.slate, title = "Distribution with vs without", className, }) {
54
+ const withPoints = analysis.points.filter((point) => point.tokens.includes(focusToken));
55
+ const withoutPoints = analysis.points.filter((point) => !point.tokens.includes(focusToken));
56
+ const withStat = summarize(withPoints);
57
+ const withoutStat = summarize(withoutPoints);
58
+ const label = analysis.tokens.find((token) => token.token === focusToken)?.label ?? focusToken;
59
+ const frame = buildFrame(width, height, {
60
+ top: padding?.top ?? 30,
61
+ right: padding?.right ?? 16,
62
+ bottom: padding?.bottom ?? 30,
63
+ left: padding?.left ?? 86,
64
+ });
65
+ const { top, left } = frame.padding;
66
+ const plotRight = left + frame.innerWidth;
67
+ const bottom = top + frame.innerHeight;
68
+ const domain = niceExtent([analysis.goodnessExtent.min, analysis.goodnessExtent.max, analysis.baseline], 0.04);
69
+ const xScale = makeScale(domain, left, plotRight);
70
+ const xTicks = ticks(domain, frame.innerWidth < 220 ? 4 : 5);
71
+ const baselineX = round(clamp(xScale(analysis.baseline), left, plotRight));
72
+ const laneH = frame.innerHeight / 2;
73
+ const lanes = [
74
+ { key: "with", label: `With ${label}`, color: withColor, stat: withStat, points: subsample(withPoints, maxPoints), y0: top },
75
+ { key: "without", label: "Without", color: withoutColor, stat: withoutStat, points: subsample(withoutPoints, maxPoints), y0: top + laneH },
76
+ ];
77
+ const dotBand = laneH - 22;
78
+ return (_jsxs("svg", { className: cx("n4chains", "n4chains-beeswarm", className), viewBox: `0 0 ${width} ${height}`, role: "img", "aria-label": title, preserveAspectRatio: "xMidYMid meet", children: [_jsx("title", { children: title }), _jsx("text", { className: "n4chains-title", x: 8, y: 16, textAnchor: "start", children: title }), _jsxs("text", { className: "n4chains-caption", x: round(plotRight), y: 16, textAnchor: "end", children: [CHAIN_LENS_LABELS[analysis.lens], " \u00B7 higher = better"] }), xTicks.map((t) => (_jsx("line", { className: "n4chains-grid", x1: round(xScale(t)), x2: round(xScale(t)), y1: top, y2: bottom }, `gx-${t}`))), _jsx("line", { className: "n4chains-baseline", x1: baselineX, x2: baselineX, y1: top - 2, y2: bottom }), lanes.map((lane) => {
79
+ const laneMid = lane.y0 + laneH / 2;
80
+ const hasIqr = Number.isFinite(lane.stat.q1) && Number.isFinite(lane.stat.q3);
81
+ return (_jsxs("g", { className: "n4chains-lane", "data-lane": lane.key, children: [_jsx("text", { className: "n4chains-lane-label", x: left - 8, y: round(laneMid - 4), textAnchor: "end", children: lane.label }), _jsxs("text", { className: "n4chains-lane-readout", x: left - 8, y: round(laneMid + 9), textAnchor: "end", children: ["n=", lane.stat.n, " \u00B7 med ", fmt(lane.stat.median)] }), hasIqr ? (_jsx("rect", { className: "n4chains-lane-iqr", x: round(xScale(lane.stat.q1)), y: round(laneMid - dotBand / 2), width: round(Math.max(0, xScale(lane.stat.q3) - xScale(lane.stat.q1))), height: round(dotBand), fill: lane.color })) : null, lane.points.map((point) => (_jsx("circle", { className: "n4chains-dot", cx: round(xScale(point.goodness)), cy: round(laneMid - dotBand / 2 + jitter(point.id) * dotBand), r: 2.2, fill: lane.color }, point.id))), Number.isFinite(lane.stat.median) ? (_jsx("line", { className: "n4chains-lane-median", x1: round(xScale(lane.stat.median)), x2: round(xScale(lane.stat.median)), y1: round(laneMid - dotBand / 2 - 4), y2: round(laneMid + dotBand / 2 + 4), stroke: lane.color })) : null] }, lane.key));
82
+ }), _jsx("line", { className: "n4chains-axis", x1: left, x2: plotRight, y1: round(top + laneH), y2: round(top + laneH) }), _jsx("line", { className: "n4chains-axis", x1: left, x2: plotRight, y1: bottom, y2: bottom }), xTicks.map((t) => (_jsx("text", { className: "n4chains-tick", x: round(xScale(t)), y: bottom + 14, textAnchor: "middle", children: fmt(t) }, `tx-${t}`)))] }));
83
+ }
84
+ //# sourceMappingURL=ChainScoreBeeswarm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChainScoreBeeswarm.js","sourceRoot":"","sources":["../../src/chains/ChainScoreBeeswarm.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { type PlotPadding } from "../viz/geometry.js";
2
+ import type { ChainEffectAnalysis, ChainStepRole } from "./types.js";
3
+ export type ForestSort = "delta" | "median" | "coverage";
4
+ export interface NodeEffectForestProps {
5
+ analysis: ChainEffectAnalysis;
6
+ /** Restrict to these roles (default: all present). */
7
+ roles?: readonly ChainStepRole[];
8
+ /** Row ordering. Default `"delta"` (biggest positive effect first). */
9
+ sortBy?: ForestSort;
10
+ /** Cap rows; a "+N more" note is drawn when truncated. Default `16`. */
11
+ maxRows?: number;
12
+ /** Highlighted token (row emphasis). */
13
+ selectedToken?: string | null;
14
+ /** Row click — makes the forest a node selector. */
15
+ onSelectToken?: (token: string) => void;
16
+ width?: number;
17
+ rowHeight?: number;
18
+ padding?: PlotPadding;
19
+ title?: string;
20
+ /** Hide the in-SVG title text (e.g. when a panel head already labels it). */
21
+ hideTitle?: boolean;
22
+ className?: string;
23
+ roleColors?: Partial<Record<ChainStepRole, string>> | undefined;
24
+ }
25
+ /**
26
+ * Forest / caterpillar plot of per-node influence — the headline "which steps
27
+ * help" ranking. One row per token: a faint min–max whisker, a bold IQR bar,
28
+ * and a median dot colored by its effect vs the baseline (cool = better, warm =
29
+ * worse). A dashed baseline marks the corpus median. Rows are clickable, so the
30
+ * forest doubles as the node selector for the explorer. Pure inline SVG.
31
+ */
32
+ export declare function NodeEffectForest({ analysis, roles, sortBy, maxRows, selectedToken, onSelectToken, width, rowHeight, padding, title, hideTitle, className, roleColors, }: NodeEffectForestProps): import("react").JSX.Element;
33
+ //# sourceMappingURL=NodeEffectForest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeEffectForest.d.ts","sourceRoot":"","sources":["../../src/chains/NodeEffectForest.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA0D,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAG9G,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAe,MAAM,YAAY,CAAC;AAGlF,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEzD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,sDAAsD;IACtD,KAAK,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IACjC,uEAAuE;IACvE,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,oDAAoD;IACpD,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC;CACjE;AA0BD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,QAAQ,EACR,KAAK,EACL,MAAgB,EAChB,OAAY,EACZ,aAAa,EACb,aAAa,EACb,KAAW,EACX,SAAc,EACd,OAAO,EACP,KAAwB,EACxB,SAAiB,EACjB,SAAS,EACT,UAAU,GACX,EAAE,qBAAqB,+BA+JvB"}
@@ -0,0 +1,85 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { buildFrame, clamp, makeScale, niceExtent, round, ticks } from "../viz/geometry.js";
3
+ import { cx } from "./_cx.js";
4
+ import { effectColor, roleColor } from "./colors.js";
5
+ import { CHAIN_LENS_LABELS } from "./types.js";
6
+ function fmt(value) {
7
+ if (!Number.isFinite(value))
8
+ return "—";
9
+ if (Math.abs(value) >= 100)
10
+ return value.toFixed(0);
11
+ if (Math.abs(value) >= 1)
12
+ return value.toFixed(2);
13
+ return value.toFixed(3);
14
+ }
15
+ function fmtDelta(value) {
16
+ if (!Number.isFinite(value))
17
+ return "—";
18
+ const s = fmt(Math.abs(value));
19
+ return value >= 0 ? `+${s}` : `−${s}`;
20
+ }
21
+ function sortTokens(tokens, sortBy) {
22
+ const list = tokens.slice();
23
+ if (sortBy === "median") {
24
+ list.sort((a, b) => (b.with.median || -Infinity) - (a.with.median || -Infinity));
25
+ }
26
+ else if (sortBy === "coverage") {
27
+ list.sort((a, b) => b.coverage - a.coverage);
28
+ }
29
+ // "delta" keeps the analysis order (already delta desc, NaN last)
30
+ return list;
31
+ }
32
+ /**
33
+ * Forest / caterpillar plot of per-node influence — the headline "which steps
34
+ * help" ranking. One row per token: a faint min–max whisker, a bold IQR bar,
35
+ * and a median dot colored by its effect vs the baseline (cool = better, warm =
36
+ * worse). A dashed baseline marks the corpus median. Rows are clickable, so the
37
+ * forest doubles as the node selector for the explorer. Pure inline SVG.
38
+ */
39
+ export function NodeEffectForest({ analysis, roles, sortBy = "delta", maxRows = 16, selectedToken, onSelectToken, width = 460, rowHeight = 26, padding, title = "Node influence", hideTitle = false, className, roleColors, }) {
40
+ const roleSet = roles ? new Set(roles) : null;
41
+ const filtered = analysis.tokens.filter((token) => (roleSet ? roleSet.has(token.role) : true));
42
+ const sorted = sortTokens(filtered, sortBy);
43
+ const shown = sorted.slice(0, Math.max(0, maxRows));
44
+ const hiddenCount = sorted.length - shown.length;
45
+ const headH = 30;
46
+ const footH = 26;
47
+ const frame = buildFrame(width, shown.length * rowHeight + headH + footH, {
48
+ top: headH,
49
+ right: padding?.right ?? 98,
50
+ bottom: footH,
51
+ left: padding?.left ?? 150,
52
+ });
53
+ const { top, left } = frame.padding;
54
+ const plotRight = left + frame.innerWidth;
55
+ const bottom = top + frame.innerHeight;
56
+ const spread = [analysis.baseline];
57
+ for (const token of shown) {
58
+ for (const value of [token.with.min, token.with.q1, token.with.median, token.with.q3, token.with.max]) {
59
+ if (Number.isFinite(value))
60
+ spread.push(value);
61
+ }
62
+ }
63
+ const domain = niceExtent(spread.length > 1 ? spread : [0, 1], 0.06);
64
+ const xScale = makeScale(domain, left, plotRight);
65
+ const halfRange = Math.max(Math.abs(domain.max - analysis.baseline), Math.abs(analysis.baseline - domain.min)) || 1;
66
+ const xTicks = ticks(domain, frame.innerWidth < 220 ? 2 : 5);
67
+ const baselineX = round(clamp(xScale(analysis.baseline), left, plotRight));
68
+ const interactive = typeof onSelectToken === "function";
69
+ return (_jsxs("svg", { className: cx("n4chains", "n4chains-forest", className), viewBox: `0 0 ${frame.width} ${frame.height}`, role: "img", "aria-label": title, preserveAspectRatio: "xMidYMid meet", children: [_jsx("title", { children: title }), hideTitle ? null : (_jsx("text", { className: "n4chains-title", x: 8, y: 16, textAnchor: "start", children: title })), _jsxs("text", { className: "n4chains-caption", x: round(plotRight), y: 16, textAnchor: "end", children: [CHAIN_LENS_LABELS[analysis.lens], " \u00B7 higher = better"] }), xTicks.map((t) => (_jsx("line", { className: "n4chains-grid", x1: round(xScale(t)), x2: round(xScale(t)), y1: top, y2: bottom }, `gx-${t}`))), _jsx("line", { className: "n4chains-baseline", x1: baselineX, x2: baselineX, y1: top - 4, y2: bottom, children: _jsx("title", { children: "baseline (corpus median)" }) }), shown.map((token, i) => {
70
+ const cy = round(top + (i + 0.5) * rowHeight);
71
+ const color = roleColor(token.role, roleColors);
72
+ const isSelected = selectedToken === token.token;
73
+ const hasSpan = Number.isFinite(token.with.q1) && Number.isFinite(token.with.q3);
74
+ const dotColor = effectColor(token.with.median, analysis.baseline, halfRange);
75
+ return (_jsxs("g", { className: cx("n4chains-forest-row", isSelected && "is-selected", interactive && "is-interactive"), "data-role": token.role, onClick: interactive ? () => onSelectToken?.(token.token) : undefined, onKeyDown: interactive
76
+ ? (event) => {
77
+ if (event.key === "Enter" || event.key === " ") {
78
+ event.preventDefault();
79
+ onSelectToken?.(token.token);
80
+ }
81
+ }
82
+ : undefined, tabIndex: interactive ? 0 : undefined, role: interactive ? "button" : undefined, "aria-pressed": interactive ? isSelected : undefined, children: [_jsx("title", { children: `${token.label} — median ${fmt(token.with.median)}, Δ ${fmtDelta(token.delta)} vs without, n=${token.n}` }), _jsx("rect", { className: "n4chains-forest-rowbg", x: 0, y: round(cy - rowHeight / 2), width: frame.width, height: rowHeight }), _jsx("rect", { className: "n4chains-chip", x: 12, y: round(cy - 5), width: 10, height: 10, rx: 2.5, fill: color }), _jsx("text", { className: "n4chains-row-label", x: 28, y: round(cy + 3.5), children: token.label }), hasSpan ? (_jsxs(_Fragment, { children: [_jsx("line", { className: "n4chains-whisker", x1: round(xScale(token.with.min)), x2: round(xScale(token.with.max)), y1: cy, y2: cy, stroke: color }), _jsx("line", { className: "n4chains-iqr", x1: round(xScale(token.with.q1)), x2: round(xScale(token.with.q3)), y1: cy, y2: cy, stroke: color }), _jsx("circle", { className: "n4chains-median", cx: round(xScale(token.with.median)), cy: cy, r: 4.5, fill: dotColor })] })) : (_jsx("text", { className: "n4chains-row-empty", x: round(left + 8), y: round(cy + 3.5), children: "n/a" })), _jsx("text", { className: cx("n4chains-row-delta", token.delta >= 0 ? "is-up" : "is-down"), x: round(frame.width - 44), y: round(cy + 3.5), textAnchor: "end", children: fmtDelta(token.delta) }), _jsxs("text", { className: "n4chains-row-n", x: round(frame.width - 6), y: round(cy + 3.5), textAnchor: "end", children: ["n=", token.n] })] }, token.token));
83
+ }), _jsx("line", { className: "n4chains-axis", x1: left, x2: plotRight, y1: bottom, y2: bottom }), xTicks.map((t) => (_jsx("text", { className: "n4chains-tick", x: round(xScale(t)), y: bottom + 14, textAnchor: "middle", children: fmt(t) }, `tx-${t}`))), hiddenCount > 0 ? (_jsxs("text", { className: "n4chains-more", x: round(frame.width - 8), y: frame.height - 8, textAnchor: "end", children: ["+", hiddenCount, " more nodes"] })) : null] }));
84
+ }
85
+ //# sourceMappingURL=NodeEffectForest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeEffectForest.js","sourceRoot":"","sources":["../../src/chains/NodeEffectForest.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { ChainStepRole, PositionMatrix } from "./types.js";
2
+ export interface PositionEffectHeatmapProps {
3
+ matrix: PositionMatrix;
4
+ width?: number;
5
+ height?: number;
6
+ /** Draw the per-cell sample size under the value. Default `true`. */
7
+ showCounts?: boolean;
8
+ selectedToken?: string | null;
9
+ onSelectToken?: (token: string) => void;
10
+ title?: string;
11
+ hideTitle?: boolean;
12
+ xLabel?: string;
13
+ className?: string;
14
+ roleColors?: Partial<Record<ChainStepRole, string>> | undefined;
15
+ }
16
+ /**
17
+ * Token × position goodness heatmap — answers "is this step better early, mid,
18
+ * or late (1st vs 2nd)?". Each cell is the median goodness of chains where the
19
+ * row token sits in that position bucket, colored on the diverging effect ramp
20
+ * pivoted at the corpus baseline (cool = better, warm = worse). Cells below the
21
+ * min-count gate drop out as blanks. Pure inline SVG; feed it a
22
+ * {@link PositionMatrix} from `positionMatrix()`.
23
+ */
24
+ export declare function PositionEffectHeatmap({ matrix, width, height, showCounts, selectedToken, onSelectToken, title, hideTitle, xLabel, className, roleColors, }: PositionEffectHeatmapProps): import("react").JSX.Element;
25
+ //# sourceMappingURL=PositionEffectHeatmap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PositionEffectHeatmap.d.ts","sourceRoot":"","sources":["../../src/chains/PositionEffectHeatmap.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAQ,MAAM,YAAY,CAAC;AAEtE,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC;CACjE;AAeD;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,MAAM,EACN,KAAW,EACX,MAAM,EACN,UAAiB,EACjB,aAAa,EACb,aAAa,EACb,KAA4B,EAC5B,SAAiB,EACjB,MAAM,EACN,SAAS,EACT,UAAU,GACX,EAAE,0BAA0B,+BA8J5B"}
@@ -0,0 +1,77 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { extentOf, round } from "../viz/geometry.js";
3
+ import { cx } from "./_cx.js";
4
+ import { effectColor, effectTextColor, roleColor } from "./colors.js";
5
+ function fmt(value) {
6
+ if (!Number.isFinite(value))
7
+ return "—";
8
+ if (Math.abs(value) >= 100)
9
+ return value.toFixed(0);
10
+ if (Math.abs(value) >= 1)
11
+ return value.toFixed(2);
12
+ return value.toFixed(2);
13
+ }
14
+ function cellMedians(matrix) {
15
+ const out = [matrix.baseline];
16
+ for (const row of matrix.rows)
17
+ for (const cell of row.cells)
18
+ if (cell)
19
+ out.push(cell.median);
20
+ return out;
21
+ }
22
+ /**
23
+ * Token × position goodness heatmap — answers "is this step better early, mid,
24
+ * or late (1st vs 2nd)?". Each cell is the median goodness of chains where the
25
+ * row token sits in that position bucket, colored on the diverging effect ramp
26
+ * pivoted at the corpus baseline (cool = better, warm = worse). Cells below the
27
+ * min-count gate drop out as blanks. Pure inline SVG; feed it a
28
+ * {@link PositionMatrix} from `positionMatrix()`.
29
+ */
30
+ export function PositionEffectHeatmap({ matrix, width = 460, height, showCounts = true, selectedToken, onSelectToken, title = "Effect by position", hideTitle = false, xLabel, className, roleColors, }) {
31
+ const rows = matrix.rows;
32
+ const cols = matrix.buckets;
33
+ const resolvedHeight = height ?? Math.max(150, rows.length * 34 + 66);
34
+ const padLeft = 104;
35
+ const padTop = 40;
36
+ const padRight = 44;
37
+ const padBottom = 26;
38
+ const gridLeft = padLeft;
39
+ const gridRight = width - padRight;
40
+ const gridTop = padTop;
41
+ const gridBottom = resolvedHeight - padBottom;
42
+ const gridWidth = Math.max(0, gridRight - gridLeft);
43
+ const gridHeight = Math.max(0, gridBottom - gridTop);
44
+ const cellW = cols.length > 0 ? gridWidth / cols.length : gridWidth;
45
+ const cellH = rows.length > 0 ? gridHeight / rows.length : gridHeight;
46
+ const ext = extentOf(cellMedians(matrix));
47
+ const halfRange = Math.max(Math.abs(ext.max - matrix.baseline), Math.abs(matrix.baseline - ext.min)) || 1;
48
+ const interactive = typeof onSelectToken === "function";
49
+ const legendX = gridRight + 16;
50
+ const legendW = 10;
51
+ const segCount = 16;
52
+ const renderCell = (cell, r, c) => {
53
+ const x = gridLeft + c * cellW;
54
+ const y = gridTop + r * cellH;
55
+ const has = cell !== null;
56
+ const fill = has ? effectColor(cell.median, matrix.baseline, halfRange) : "transparent";
57
+ return (_jsxs("g", { className: "n4chains-hcell", children: [_jsx("rect", { x: round(x + 1.5), y: round(y + 1.5), width: round(cellW - 3), height: round(cellH - 3), rx: 4, fill: fill, stroke: has ? "transparent" : "currentColor", strokeOpacity: has ? 0 : 0.16 }), has ? (_jsxs(_Fragment, { children: [_jsx("title", { children: `${rows[r].label} · ${cols[c].label} — median ${fmt(cell.median)}, n=${cell.n}` }), _jsx("text", { className: "n4chains-cell-value", x: round(x + cellW / 2), y: round(y + cellH / 2 + (showCounts ? 0 : 3.5)), textAnchor: "middle", fill: effectTextColor(cell.median, matrix.baseline, halfRange), children: fmt(cell.median) }), showCounts ? (_jsx("text", { className: "n4chains-cell-n", x: round(x + cellW / 2), y: round(y + cellH / 2 + 12), textAnchor: "middle", fill: effectTextColor(cell.median, matrix.baseline, halfRange), children: cell.n })) : null] })) : null] }, `cell-${r}-${c}`));
58
+ };
59
+ return (_jsxs("svg", { className: cx("n4chains", "n4chains-position", className), viewBox: `0 0 ${width} ${resolvedHeight}`, role: "img", "aria-label": title, preserveAspectRatio: "xMidYMid meet", children: [_jsx("title", { children: title }), hideTitle ? null : (_jsx("text", { className: "n4chains-title", x: 8, y: 16, textAnchor: "start", children: title })), _jsx("text", { className: "n4chains-caption", x: round(gridRight), y: 16, textAnchor: "end", children: matrix.mode === "phase" ? "position phase" : "absolute position" }), rows.map((_, r) => cols.map((__, c) => renderCell(rows[r].cells[c] ?? null, r, c))), rows.map((row, r) => {
60
+ const cy = gridTop + r * cellH + cellH / 2;
61
+ const selected = selectedToken === row.token;
62
+ return (_jsxs("g", { className: cx("n4chains-position-row", selected && "is-selected", interactive && "is-interactive"), onClick: interactive ? () => onSelectToken?.(row.token) : undefined, tabIndex: interactive ? 0 : undefined, role: interactive ? "button" : undefined, "aria-pressed": interactive ? selected : undefined, onKeyDown: interactive
63
+ ? (event) => {
64
+ if (event.key === "Enter" || event.key === " ") {
65
+ event.preventDefault();
66
+ onSelectToken?.(row.token);
67
+ }
68
+ }
69
+ : undefined, children: [_jsx("rect", { className: "n4chains-position-rowbg", x: 0, y: round(cy - cellH / 2), width: gridLeft - 4, height: round(cellH) }), _jsx("rect", { className: "n4chains-chip", x: 8, y: round(cy - 5), width: 10, height: 10, rx: 2.5, fill: roleColor(row.role, roleColors) }), _jsx("text", { className: "n4chains-row-label", x: 24, y: round(cy + 3.5), children: row.label })] }, `row-${row.token}`));
70
+ }), cols.map((col, c) => (_jsx("text", { className: "n4chains-col-label", x: round(gridLeft + c * cellW + cellW / 2), y: gridTop - 8, textAnchor: "middle", children: col.label }, `col-${col.key}`))), Array.from({ length: segCount }, (_, k) => {
71
+ const t = k / (segCount - 1); // 0 top = better
72
+ const value = matrix.baseline + halfRange * (1 - 2 * t);
73
+ const segY = gridTop + t * gridHeight;
74
+ return (_jsx("rect", { x: legendX, y: round(segY), width: legendW, height: round(gridHeight / segCount + 0.8), fill: effectColor(value, matrix.baseline, halfRange) }, `legend-${k}`));
75
+ }), _jsx("text", { className: "n4chains-legend-cap", x: round(legendX + legendW / 2), y: gridTop - 4, textAnchor: "middle", fill: "#0f766e", children: "better" }), _jsx("text", { className: "n4chains-legend-cap", x: round(legendX + legendW / 2), y: gridBottom + 12, textAnchor: "middle", fill: "#b45309", children: "worse" }), xLabel ? (_jsx("text", { className: "n4chains-axis-label", x: round(gridLeft + gridWidth / 2), y: resolvedHeight - 4, textAnchor: "middle", children: xLabel })) : null] }));
76
+ }
77
+ //# sourceMappingURL=PositionEffectHeatmap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PositionEffectHeatmap.js","sourceRoot":"","sources":["../../src/chains/PositionEffectHeatmap.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { ChainStepRole, SequenceMatrix } from "./types.js";
2
+ export interface SequenceEffectHeatmapProps {
3
+ matrix: SequenceMatrix;
4
+ width?: number;
5
+ height?: number;
6
+ /** Draw the per-cell sample size under the value. Default `false`. */
7
+ showCounts?: boolean;
8
+ title?: string;
9
+ hideTitle?: boolean;
10
+ className?: string;
11
+ roleColors?: Partial<Record<ChainStepRole, string>> | undefined;
12
+ }
13
+ /**
14
+ * Predecessor × successor goodness matrix — answers order questions like "is
15
+ * MSC better *after* SNV?". `cells[pred][succ]` is the median goodness of chains
16
+ * where the row token occurs before the column token, on the diverging effect
17
+ * ramp pivoted at the baseline. The diagonal and count-gated pairs are blank.
18
+ * Read a cell as "row → column". Pure inline SVG; feed a {@link SequenceMatrix}
19
+ * from `sequenceMatrix()`.
20
+ */
21
+ export declare function SequenceEffectHeatmap({ matrix, width, height, showCounts, title, hideTitle, className, roleColors, }: SequenceEffectHeatmapProps): import("react").JSX.Element;
22
+ //# sourceMappingURL=SequenceEffectHeatmap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SequenceEffectHeatmap.d.ts","sourceRoot":"","sources":["../../src/chains/SequenceEffectHeatmap.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAQ,MAAM,YAAY,CAAC;AAEtE,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC;CACjE;AAkBD;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,MAAM,EACN,KAAW,EACX,MAAM,EACN,UAAkB,EAClB,KAAyB,EACzB,SAAiB,EACjB,SAAS,EACT,UAAU,GACX,EAAE,0BAA0B,+BAmK5B"}
@@ -0,0 +1,74 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { extentOf, round } from "../viz/geometry.js";
3
+ import { cx } from "./_cx.js";
4
+ import { effectColor, effectTextColor, roleColor } from "./colors.js";
5
+ function fmt(value) {
6
+ if (!Number.isFinite(value))
7
+ return "—";
8
+ if (Math.abs(value) >= 1)
9
+ return value.toFixed(2);
10
+ return value.toFixed(2);
11
+ }
12
+ function shorten(label, max = 10) {
13
+ return label.length > max ? `${label.slice(0, max - 1)}…` : label;
14
+ }
15
+ function medians(matrix) {
16
+ const out = [matrix.baseline];
17
+ for (const row of matrix.cells)
18
+ for (const cell of row)
19
+ if (cell)
20
+ out.push(cell.median);
21
+ return out;
22
+ }
23
+ /**
24
+ * Predecessor × successor goodness matrix — answers order questions like "is
25
+ * MSC better *after* SNV?". `cells[pred][succ]` is the median goodness of chains
26
+ * where the row token occurs before the column token, on the diverging effect
27
+ * ramp pivoted at the baseline. The diagonal and count-gated pairs are blank.
28
+ * Read a cell as "row → column". Pure inline SVG; feed a {@link SequenceMatrix}
29
+ * from `sequenceMatrix()`.
30
+ */
31
+ export function SequenceEffectHeatmap({ matrix, width = 440, height, showCounts = false, title = "Effect by order", hideTitle = false, className, roleColors, }) {
32
+ const tokens = matrix.tokens;
33
+ const n = tokens.length;
34
+ const padLeft = 104;
35
+ const padTop = 66;
36
+ const padRight = 56;
37
+ const padBottom = 34;
38
+ const resolvedHeight = height ?? padTop + n * 34 + padBottom;
39
+ const gridLeft = padLeft;
40
+ const gridRight = width - padRight;
41
+ const gridTop = padTop;
42
+ const gridBottom = resolvedHeight - padBottom;
43
+ const gridWidth = Math.max(0, gridRight - gridLeft);
44
+ const gridHeight = Math.max(0, gridBottom - gridTop);
45
+ const cellW = n > 0 ? gridWidth / n : gridWidth;
46
+ const cellH = n > 0 ? gridHeight / n : gridHeight;
47
+ const ext = extentOf(medians(matrix));
48
+ const halfRange = Math.max(Math.abs(ext.max - matrix.baseline), Math.abs(matrix.baseline - ext.min)) || 1;
49
+ const legendX = gridRight + 14;
50
+ const legendW = 10;
51
+ const segCount = 16;
52
+ const renderCell = (cell, r, c) => {
53
+ const x = gridLeft + c * cellW;
54
+ const y = gridTop + r * cellH;
55
+ if (r === c) {
56
+ return (_jsx("rect", { className: "n4chains-seq-diag", x: round(x + 1.5), y: round(y + 1.5), width: round(cellW - 3), height: round(cellH - 3), rx: 4 }, `d-${r}`));
57
+ }
58
+ const has = cell !== null;
59
+ return (_jsxs("g", { className: "n4chains-hcell", children: [_jsx("rect", { x: round(x + 1.5), y: round(y + 1.5), width: round(cellW - 3), height: round(cellH - 3), rx: 4, fill: has ? effectColor(cell.median, matrix.baseline, halfRange) : "transparent", stroke: has ? "transparent" : "currentColor", strokeOpacity: has ? 0 : 0.14 }), has ? (_jsxs(_Fragment, { children: [_jsx("title", { children: `${tokens[r].label} → ${tokens[c].label} — median ${fmt(cell.median)}, n=${cell.n}` }), _jsx("text", { className: "n4chains-cell-value", x: round(x + cellW / 2), y: round(y + cellH / 2 + (showCounts ? 0 : 3.5)), textAnchor: "middle", fill: effectTextColor(cell.median, matrix.baseline, halfRange), children: fmt(cell.median) }), showCounts ? (_jsxs("text", { className: "n4chains-cell-n", x: round(x + cellW / 2), y: round(y + cellH / 2 + 12), textAnchor: "middle", fill: effectTextColor(cell.median, matrix.baseline, halfRange), children: ["n=", cell.n] })) : null] })) : null] }, `cell-${r}-${c}`));
60
+ };
61
+ return (_jsxs("svg", { className: cx("n4chains", "n4chains-sequence", className), viewBox: `0 0 ${width} ${resolvedHeight}`, role: "img", "aria-label": title, preserveAspectRatio: "xMidYMid meet", children: [_jsx("title", { children: title }), hideTitle ? null : (_jsx("text", { className: "n4chains-title", x: 8, y: 16, textAnchor: "start", children: title })), _jsx("text", { className: "n4chains-caption", x: round(gridRight), y: 16, textAnchor: "end", children: matrix.adjacentOnly ? "directly after" : "somewhere after" }), _jsx("text", { className: "n4chains-seq-axis", x: round(gridLeft + gridWidth / 2), y: gridTop - 30, textAnchor: "middle", children: "successor \u2192" }), _jsx("text", { className: "n4chains-seq-axis", transform: `translate(14 ${round(gridTop + gridHeight / 2)}) rotate(-90)`, textAnchor: "middle", children: "predecessor \u2193" }), matrix.cells.map((row, r) => row.map((cell, c) => renderCell(cell ?? null, r, c))), tokens.map((token, r) => {
62
+ const cy = gridTop + r * cellH + cellH / 2;
63
+ return (_jsxs("g", { children: [_jsx("rect", { className: "n4chains-chip", x: round(gridLeft - 92), y: round(cy - 5), width: 9, height: 9, rx: 2.5, fill: roleColor(token.role, roleColors) }), _jsx("text", { className: "n4chains-row-label", x: round(gridLeft - 78), y: round(cy + 3.5), children: shorten(token.label, 11) })] }, `row-${token.token}`));
64
+ }), tokens.map((token, c) => {
65
+ const cx0 = gridLeft + c * cellW + cellW / 2;
66
+ return (_jsx("text", { className: "n4chains-col-label", transform: `rotate(-38 ${round(cx0)} ${gridTop - 8})`, x: round(cx0), y: gridTop - 8, textAnchor: "start", children: shorten(token.label, 11) }, `col-${token.token}`));
67
+ }), Array.from({ length: segCount }, (_, k) => {
68
+ const t = k / (segCount - 1);
69
+ const value = matrix.baseline + halfRange * (1 - 2 * t);
70
+ const segY = gridTop + t * gridHeight;
71
+ return (_jsx("rect", { x: legendX, y: round(segY), width: legendW, height: round(gridHeight / segCount + 0.8), fill: effectColor(value, matrix.baseline, halfRange) }, `legend-${k}`));
72
+ }), _jsx("text", { className: "n4chains-legend-cap", x: round(legendX + legendW / 2), y: gridTop - 4, textAnchor: "middle", fill: "#0f766e", children: "better" }), _jsx("text", { className: "n4chains-legend-cap", x: round(legendX + legendW / 2), y: gridBottom + 12, textAnchor: "middle", fill: "#b45309", children: "worse" })] }));
73
+ }
74
+ //# sourceMappingURL=SequenceEffectHeatmap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SequenceEffectHeatmap.js","sourceRoot":"","sources":["../../src/chains/SequenceEffectHeatmap.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function cx(...parts: Array<string | false | null | undefined>): string | undefined;
2
+ //# sourceMappingURL=_cx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_cx.d.ts","sourceRoot":"","sources":["../../src/chains/_cx.ts"],"names":[],"mappings":"AAGA,wBAAgB,EAAE,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG,SAAS,CAAC,GAAG,MAAM,GAAG,SAAS,CAGzF"}
@@ -0,0 +1,8 @@
1
+ // Internal class-name join helper for the `chains` domain (not part of the
2
+ // public barrel). Mirrors the same tiny helper used by the viz/lab/dag
3
+ // components so the explorer stays free of any external `clsx` dependency.
4
+ export function cx(...parts) {
5
+ const resolved = parts.filter((p) => typeof p === "string" && p.length > 0);
6
+ return resolved.length > 0 ? resolved.join(" ") : undefined;
7
+ }
8
+ //# sourceMappingURL=_cx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_cx.js","sourceRoot":"","sources":["../../src/chains/_cx.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,uEAAuE;AACvE,2EAA2E;AAC3E,MAAM,UAAU,EAAE,CAAC,GAAG,KAA+C;IACnE,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzF,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9D,CAAC"}