nirs4all-ui 0.1.11 → 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 @@
1
+ {"version":3,"file":"WaterfallChart.d.ts","sourceRoot":"","sources":["../../src/viz/WaterfallChart.tsx"],"names":[],"mappings":"AAIA,0EAA0E;AAC1E,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,gFAAgF;IAChF,SAAS,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,aAAa,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAChD,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wFAAwF;IACxF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAkBD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,EAC7B,SAAS,EACT,aAAa,EACb,SAAS,EACT,IAAS,EACT,WAA2B,EAC3B,KAAW,EACX,MAAM,EACN,KAAwB,EACxB,SAAS,GACV,EAAE,mBAAmB,+BAyIrB"}
@@ -0,0 +1,73 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cx } from "./_cx.js";
3
+ import { makeScale, niceExtent, round, ticks } from "./geometry.js";
4
+ import { N4_VIZ_COLORS } from "./theme.js";
5
+ function defaultFormat(value) {
6
+ if (!Number.isFinite(value))
7
+ return "—";
8
+ if (Math.abs(value) >= 1000)
9
+ return value.toFixed(0);
10
+ if (Math.abs(value) >= 1)
11
+ return value.toFixed(2);
12
+ return value.toFixed(3);
13
+ }
14
+ function signed(value, format) {
15
+ if (!Number.isFinite(value))
16
+ return "—";
17
+ return value > 0 ? `+${format(value)}` : format(value);
18
+ }
19
+ function truncate(label, max = 15) {
20
+ return label.length > max ? `${label.slice(0, max - 1)}…` : label;
21
+ }
22
+ /**
23
+ * Per-sample SHAP waterfall — the Studio Variable-Importance waterfall. Each
24
+ * feature contribution is a floating horizontal bar from the running total,
25
+ * green when it pushes the prediction up and rose when down, walking from the
26
+ * base value to the prediction. A dashed base reference and a solid prediction
27
+ * reference frame the walk. Pure inline SVG; hosts pass precomputed SHAP values.
28
+ */
29
+ export function WaterfallChart({ baseValue, contributions, predicted, topN = 10, valueFormat = defaultFormat, width = 440, height, title = "SHAP waterfall", className, }) {
30
+ const sumAll = contributions.reduce((s, c) => s + (Number.isFinite(c.value) ? c.value : 0), 0);
31
+ const resolvedPredicted = predicted ?? baseValue + sumAll;
32
+ const keep = Math.max(0, Math.trunc(topN));
33
+ const indexed = contributions.map((c, i) => ({ c, i }));
34
+ const keptIndices = new Set([...indexed]
35
+ .sort((a, b) => Math.abs(b.c.value) - Math.abs(a.c.value))
36
+ .slice(0, keep)
37
+ .map((x) => x.i));
38
+ const kept = indexed.filter((x) => keptIndices.has(x.i)).map((x) => x.c);
39
+ const resolvedHeight = height ?? Math.max(180, kept.length * 30 + 70);
40
+ const padLeft = 100;
41
+ const padRight = 48;
42
+ const padTop = 26;
43
+ const padBottom = 30;
44
+ const plotLeft = padLeft;
45
+ const plotRight = width - padRight;
46
+ const plotTop = padTop;
47
+ const plotBottom = resolvedHeight - padBottom;
48
+ const plotHeight = Math.max(0, plotBottom - plotTop);
49
+ let running = baseValue;
50
+ const rows = kept.map((c) => {
51
+ const from = running;
52
+ const value = Number.isFinite(c.value) ? c.value : 0;
53
+ const to = from + value;
54
+ running = to;
55
+ return { label: c.label, value, from, to };
56
+ });
57
+ const boundaries = [baseValue, resolvedPredicted, ...rows.flatMap((r) => [r.from, r.to])];
58
+ const domain = niceExtent(boundaries, 0.06);
59
+ const xScale = makeScale(domain, plotLeft, plotRight);
60
+ const xTicks = ticks(domain, 5);
61
+ const n = rows.length;
62
+ const band = n > 0 ? plotHeight / n : plotHeight;
63
+ const barHeight = Math.min(18, Math.max(4, band - 8));
64
+ return (_jsxs("svg", { className: cx("n4viz", "n4viz-waterfall", className), viewBox: `0 0 ${width} ${resolvedHeight}`, role: "img", "aria-label": title, preserveAspectRatio: "xMidYMid meet", children: [_jsx("title", { children: title }), xTicks.map((t) => (_jsx("line", { className: "n4viz-grid", x1: round(xScale(t)), x2: round(xScale(t)), y1: plotTop, y2: plotBottom }, `grid-${t}`))), _jsx("line", { className: "n4viz-reference n4viz-base", x1: round(xScale(baseValue)), x2: round(xScale(baseValue)), y1: plotTop, y2: plotBottom, stroke: N4_VIZ_COLORS.slate, strokeDasharray: "5 4", strokeWidth: 1.4 }), _jsx("line", { className: "n4viz-reference n4viz-prediction", x1: round(xScale(resolvedPredicted)), x2: round(xScale(resolvedPredicted)), y1: plotTop, y2: plotBottom, stroke: N4_VIZ_COLORS.tealDark, strokeWidth: 1.6 }), _jsx("text", { className: "n4viz-tick", x: round(xScale(baseValue)), y: plotTop - 6, textAnchor: "middle", children: "base" }), _jsx("text", { className: "n4viz-tick", x: round(xScale(resolvedPredicted)), y: plotTop - 6, textAnchor: "middle", children: "f(x)" }), rows.map((row, i) => {
65
+ const center = plotTop + band * i + band / 2;
66
+ const x0 = xScale(Math.min(row.from, row.to));
67
+ const x1 = xScale(Math.max(row.from, row.to));
68
+ const up = row.value > 0;
69
+ const labelX = up ? xScale(row.to) + 4 : xScale(row.to) - 4;
70
+ return (_jsxs("g", { children: [_jsx("text", { className: "n4viz-tick", x: plotLeft - 6, y: round(center + 3), textAnchor: "end", children: truncate(row.label) }), _jsx("rect", { className: "n4viz-bar", x: round(x0), y: round(center - barHeight / 2), width: round(Math.max(1, x1 - x0)), height: round(barHeight), rx: 2, fill: up ? N4_VIZ_COLORS.green : N4_VIZ_COLORS.rose }), _jsx("text", { className: "n4viz-badge", x: round(labelX), y: round(center + 3), textAnchor: up ? "start" : "end", children: signed(row.value, valueFormat) })] }, `${row.label}-${i}`));
71
+ }), _jsx("line", { className: "n4viz-axis", x1: plotLeft, x2: plotRight, y1: plotBottom, y2: plotBottom }), xTicks.map((t) => (_jsx("text", { className: "n4viz-tick", x: round(xScale(t)), y: plotBottom + 15, textAnchor: "middle", children: valueFormat(t) }, `tx-${t}`)))] }));
72
+ }
73
+ //# sourceMappingURL=WaterfallChart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WaterfallChart.js","sourceRoot":"","sources":["../../src/viz/WaterfallChart.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/viz/_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 viz domain (not part of the public
2
+ // barrel). Mirrors the same tiny helper used by the lab components so the charts
3
+ // stay 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/viz/_cx.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,iFAAiF;AACjF,+CAA+C;AAC/C,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"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Pure geometry + descriptive-statistics helpers for the `viz` domain.
3
+ *
4
+ * Framework-free: these turn numeric data into SVG-ready coordinates, paths,
5
+ * axis ticks, histograms, and summary statistics. Every presentational chart in
6
+ * this package is built on top of these so the scale math stays in one tested
7
+ * place and the components stay declarative.
8
+ */
9
+ export interface Extent {
10
+ min: number;
11
+ max: number;
12
+ }
13
+ /** Inner drawing box after padding is applied. */
14
+ export interface PlotFrame {
15
+ width: number;
16
+ height: number;
17
+ padding: {
18
+ top: number;
19
+ right: number;
20
+ bottom: number;
21
+ left: number;
22
+ };
23
+ innerWidth: number;
24
+ innerHeight: number;
25
+ }
26
+ export interface PlotPadding {
27
+ top?: number;
28
+ right?: number;
29
+ bottom?: number;
30
+ left?: number;
31
+ }
32
+ export declare function clamp(value: number, lo: number, hi: number): number;
33
+ export declare function buildFrame(width: number, height: number, padding?: PlotPadding): PlotFrame;
34
+ /** Min/max of a numeric list; falls back to [0, 1] when empty. */
35
+ export declare function extentOf(values: readonly number[]): Extent;
36
+ /** Extent padded by a fraction of its span on both ends. */
37
+ export declare function niceExtent(values: readonly number[], padFraction?: number): Extent;
38
+ /** Symmetric extent covering several lists (useful for parity plots). */
39
+ export declare function sharedExtent(...lists: ReadonlyArray<readonly number[]>): Extent;
40
+ /**
41
+ * Map a value from a data domain to a pixel range. Returns a function so a
42
+ * scale can be reused for every point in a series.
43
+ */
44
+ export declare function makeScale(domain: Extent, rangeMin: number, rangeMax: number): (value: number) => number;
45
+ /** Evenly spaced, human-friendly tick values across an extent. */
46
+ export declare function ticks(extent: Extent, count?: number): number[];
47
+ /** SVG `M…L…` path from `[x, y]` pixel points. */
48
+ export declare function linePath(points: ReadonlyArray<readonly [number, number]>): string;
49
+ /** `points` attribute string for `<polyline>` / `<polygon>`. */
50
+ export declare function polylinePoints(points: ReadonlyArray<readonly [number, number]>): string;
51
+ /**
52
+ * Closed area between an upper and lower pixel boundary (min/max spectra band).
53
+ * `upper` is drawn left→right, `lower` right→left.
54
+ */
55
+ export declare function bandPath(upper: ReadonlyArray<readonly [number, number]>, lower: ReadonlyArray<readonly [number, number]>): string;
56
+ export interface HistogramBin {
57
+ x0: number;
58
+ x1: number;
59
+ mid: number;
60
+ count: number;
61
+ }
62
+ /** Equal-width histogram bins over `values`. */
63
+ export declare function histogram(values: readonly number[], binCount?: number): HistogramBin[];
64
+ /** Quantile of an already-sorted ascending list (linear interpolation). */
65
+ export declare function quantileSorted(sorted: readonly number[], q: number): number;
66
+ export interface FiveNumberSummary {
67
+ min: number;
68
+ q1: number;
69
+ median: number;
70
+ q3: number;
71
+ max: number;
72
+ mean: number;
73
+ }
74
+ export declare function fiveNumberSummary(values: readonly number[]): FiveNumberSummary;
75
+ export declare function mean(values: readonly number[]): number;
76
+ export declare function stdDev(values: readonly number[]): number;
77
+ export interface LinearFit {
78
+ slope: number;
79
+ intercept: number;
80
+ }
81
+ /** Ordinary-least-squares fit of `ys` on `xs`. */
82
+ export declare function linearFit(xs: readonly number[], ys: readonly number[]): LinearFit;
83
+ /** Pearson correlation coefficient. */
84
+ export declare function pearson(xs: readonly number[], ys: readonly number[]): number;
85
+ /** Round to 2 decimals for compact SVG coordinate strings. */
86
+ export declare function round(value: number): number;
87
+ //# sourceMappingURL=geometry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../../src/viz/geometry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,208 @@
1
+ /**
2
+ * Pure geometry + descriptive-statistics helpers for the `viz` domain.
3
+ *
4
+ * Framework-free: these turn numeric data into SVG-ready coordinates, paths,
5
+ * axis ticks, histograms, and summary statistics. Every presentational chart in
6
+ * this package is built on top of these so the scale math stays in one tested
7
+ * place and the components stay declarative.
8
+ */
9
+ export function clamp(value, lo, hi) {
10
+ return Math.max(lo, Math.min(hi, value));
11
+ }
12
+ export function buildFrame(width, height, padding = {}) {
13
+ const resolved = {
14
+ top: padding.top ?? 16,
15
+ right: padding.right ?? 16,
16
+ bottom: padding.bottom ?? 28,
17
+ left: padding.left ?? 40,
18
+ };
19
+ return {
20
+ width,
21
+ height,
22
+ padding: resolved,
23
+ innerWidth: Math.max(0, width - resolved.left - resolved.right),
24
+ innerHeight: Math.max(0, height - resolved.top - resolved.bottom),
25
+ };
26
+ }
27
+ /** Min/max of a numeric list; falls back to [0, 1] when empty. */
28
+ export function extentOf(values) {
29
+ let min = Number.POSITIVE_INFINITY;
30
+ let max = Number.NEGATIVE_INFINITY;
31
+ for (const value of values) {
32
+ if (!Number.isFinite(value))
33
+ continue;
34
+ if (value < min)
35
+ min = value;
36
+ if (value > max)
37
+ max = value;
38
+ }
39
+ if (!Number.isFinite(min) || !Number.isFinite(max))
40
+ return { min: 0, max: 1 };
41
+ if (min === max)
42
+ return { min: min - 0.5, max: max + 0.5 };
43
+ return { min, max };
44
+ }
45
+ /** Extent padded by a fraction of its span on both ends. */
46
+ export function niceExtent(values, padFraction = 0.05) {
47
+ const { min, max } = extentOf(values);
48
+ const pad = (max - min) * padFraction;
49
+ return { min: min - pad, max: max + pad };
50
+ }
51
+ /** Symmetric extent covering several lists (useful for parity plots). */
52
+ export function sharedExtent(...lists) {
53
+ return extentOf(lists.flat());
54
+ }
55
+ /**
56
+ * Map a value from a data domain to a pixel range. Returns a function so a
57
+ * scale can be reused for every point in a series.
58
+ */
59
+ export function makeScale(domain, rangeMin, rangeMax) {
60
+ const span = domain.max - domain.min || 1;
61
+ const slope = (rangeMax - rangeMin) / span;
62
+ return (value) => rangeMin + (value - domain.min) * slope;
63
+ }
64
+ /** Evenly spaced, human-friendly tick values across an extent. */
65
+ export function ticks(extent, count = 5) {
66
+ const span = extent.max - extent.min;
67
+ if (span <= 0 || !Number.isFinite(span))
68
+ return [extent.min];
69
+ const rawStep = span / Math.max(1, count);
70
+ const magnitude = Math.pow(10, Math.floor(Math.log10(rawStep)));
71
+ const normalized = rawStep / magnitude;
72
+ const niceStep = (normalized >= 5 ? 5 : normalized >= 2 ? 2 : 1) * magnitude;
73
+ const start = Math.ceil(extent.min / niceStep) * niceStep;
74
+ const out = [];
75
+ for (let value = start; value <= extent.max + niceStep * 1e-6; value += niceStep) {
76
+ out.push(Number(value.toFixed(10)));
77
+ }
78
+ return out;
79
+ }
80
+ /** SVG `M…L…` path from `[x, y]` pixel points. */
81
+ export function linePath(points) {
82
+ if (points.length === 0)
83
+ return "";
84
+ return points
85
+ .map(([x, y], index) => `${index === 0 ? "M" : "L"}${round(x)} ${round(y)}`)
86
+ .join(" ");
87
+ }
88
+ /** `points` attribute string for `<polyline>` / `<polygon>`. */
89
+ export function polylinePoints(points) {
90
+ return points.map(([x, y]) => `${round(x)},${round(y)}`).join(" ");
91
+ }
92
+ /**
93
+ * Closed area between an upper and lower pixel boundary (min/max spectra band).
94
+ * `upper` is drawn left→right, `lower` right→left.
95
+ */
96
+ export function bandPath(upper, lower) {
97
+ if (upper.length === 0 || lower.length === 0)
98
+ return "";
99
+ const forward = upper.map(([x, y], i) => `${i === 0 ? "M" : "L"}${round(x)} ${round(y)}`).join(" ");
100
+ const backward = [...lower].reverse().map(([x, y]) => `L${round(x)} ${round(y)}`).join(" ");
101
+ return `${forward} ${backward} Z`;
102
+ }
103
+ /** Equal-width histogram bins over `values`. */
104
+ export function histogram(values, binCount = 12) {
105
+ const finite = values.filter((v) => Number.isFinite(v));
106
+ if (finite.length === 0)
107
+ return [];
108
+ const { min, max } = extentOf(finite);
109
+ const bins = Math.max(1, Math.trunc(binCount));
110
+ const width = (max - min) / bins || 1;
111
+ const out = Array.from({ length: bins }, (_, i) => ({
112
+ x0: min + i * width,
113
+ x1: min + (i + 1) * width,
114
+ mid: min + (i + 0.5) * width,
115
+ count: 0,
116
+ }));
117
+ for (const value of finite) {
118
+ const raw = Math.floor((value - min) / width);
119
+ const index = clamp(raw, 0, bins - 1);
120
+ const bin = out[index];
121
+ if (bin)
122
+ bin.count += 1;
123
+ }
124
+ return out;
125
+ }
126
+ /** Quantile of an already-sorted ascending list (linear interpolation). */
127
+ export function quantileSorted(sorted, q) {
128
+ if (sorted.length === 0)
129
+ return Number.NaN;
130
+ if (sorted.length === 1)
131
+ return sorted[0];
132
+ const pos = clamp(q, 0, 1) * (sorted.length - 1);
133
+ const base = Math.floor(pos);
134
+ const rest = pos - base;
135
+ const lower = sorted[base];
136
+ const upper = sorted[Math.min(sorted.length - 1, base + 1)];
137
+ return lower + (upper - lower) * rest;
138
+ }
139
+ export function fiveNumberSummary(values) {
140
+ const sorted = values.filter((v) => Number.isFinite(v)).slice().sort((a, b) => a - b);
141
+ const mean = sorted.length ? sorted.reduce((s, v) => s + v, 0) / sorted.length : Number.NaN;
142
+ return {
143
+ min: sorted[0] ?? Number.NaN,
144
+ q1: quantileSorted(sorted, 0.25),
145
+ median: quantileSorted(sorted, 0.5),
146
+ q3: quantileSorted(sorted, 0.75),
147
+ max: sorted[sorted.length - 1] ?? Number.NaN,
148
+ mean,
149
+ };
150
+ }
151
+ export function mean(values) {
152
+ const finite = values.filter((v) => Number.isFinite(v));
153
+ return finite.length ? finite.reduce((s, v) => s + v, 0) / finite.length : Number.NaN;
154
+ }
155
+ export function stdDev(values) {
156
+ const finite = values.filter((v) => Number.isFinite(v));
157
+ if (finite.length < 2)
158
+ return 0;
159
+ const m = mean(finite);
160
+ const variance = finite.reduce((s, v) => s + (v - m) ** 2, 0) / (finite.length - 1);
161
+ return Math.sqrt(variance);
162
+ }
163
+ /** Ordinary-least-squares fit of `ys` on `xs`. */
164
+ export function linearFit(xs, ys) {
165
+ const n = Math.min(xs.length, ys.length);
166
+ if (n < 2)
167
+ return { slope: 0, intercept: ys[0] ?? 0 };
168
+ let sx = 0;
169
+ let sy = 0;
170
+ let sxx = 0;
171
+ let sxy = 0;
172
+ for (let i = 0; i < n; i += 1) {
173
+ const x = xs[i];
174
+ const y = ys[i];
175
+ sx += x;
176
+ sy += y;
177
+ sxx += x * x;
178
+ sxy += x * y;
179
+ }
180
+ const denom = n * sxx - sx * sx || 1;
181
+ const slope = (n * sxy - sx * sy) / denom;
182
+ return { slope, intercept: (sy - slope * sx) / n };
183
+ }
184
+ /** Pearson correlation coefficient. */
185
+ export function pearson(xs, ys) {
186
+ const n = Math.min(xs.length, ys.length);
187
+ if (n < 2)
188
+ return 0;
189
+ const mx = mean(xs.slice(0, n));
190
+ const my = mean(ys.slice(0, n));
191
+ let num = 0;
192
+ let dx = 0;
193
+ let dy = 0;
194
+ for (let i = 0; i < n; i += 1) {
195
+ const a = xs[i] - mx;
196
+ const b = ys[i] - my;
197
+ num += a * b;
198
+ dx += a * a;
199
+ dy += b * b;
200
+ }
201
+ const denom = Math.sqrt(dx * dy) || 1;
202
+ return num / denom;
203
+ }
204
+ /** Round to 2 decimals for compact SVG coordinate strings. */
205
+ export function round(value) {
206
+ return Math.round(value * 100) / 100;
207
+ }
208
+ //# sourceMappingURL=geometry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geometry.js","sourceRoot":"","sources":["../../src/viz/geometry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * nirs4all-ui `viz` domain — the reusable scientific visualization kit.
3
+ *
4
+ * Presentational, dependency-free inline-SVG charts that mirror what nirs4all
5
+ * Studio and the Web/WASM client render: spectra, prediction diagnostics,
6
+ * confusion matrices, distributions, importance/SHAP views, projections,
7
+ * pipeline graphs, and score summaries. Same package boundary as the rest of
8
+ * nirs4all-ui: pure + stateless, NO app state, network/IO, browser globals, or
9
+ * runtime execution. Hosts pass already-computed numeric arrays; each component
10
+ * accepts `className` + color overrides and reads the shared teal palette by
11
+ * default. A default stylesheet ships at `nirs4all-ui/assets/viz.css`.
12
+ *
13
+ * Consumed as `nirs4all-ui/viz`.
14
+ */
15
+ export * from "./theme.js";
16
+ export * from "./geometry.js";
17
+ export * from "./SpectraPlot.js";
18
+ export * from "./Histogram.js";
19
+ export * from "./PcaScatter.js";
20
+ export * from "./PredictionScatter.js";
21
+ export * from "./ResidualPlot.js";
22
+ export * from "./ConformalIntervalStrip.js";
23
+ export * from "./ConfusionMatrix.js";
24
+ export * from "./BoxPlot.js";
25
+ export * from "./ScoreHeatmap.js";
26
+ export * from "./FoldStabilityLines.js";
27
+ export * from "./BiasVarianceBars.js";
28
+ export * from "./FeatureImportanceBar.js";
29
+ export * from "./ShapBeeswarm.js";
30
+ export * from "./WaterfallChart.js";
31
+ export * from "./PipelineFlow.js";
32
+ export * from "./ScoreSummary.js";
33
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/viz/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAG9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAGhC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AAGtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AAGpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * nirs4all-ui `viz` domain — the reusable scientific visualization kit.
3
+ *
4
+ * Presentational, dependency-free inline-SVG charts that mirror what nirs4all
5
+ * Studio and the Web/WASM client render: spectra, prediction diagnostics,
6
+ * confusion matrices, distributions, importance/SHAP views, projections,
7
+ * pipeline graphs, and score summaries. Same package boundary as the rest of
8
+ * nirs4all-ui: pure + stateless, NO app state, network/IO, browser globals, or
9
+ * runtime execution. Hosts pass already-computed numeric arrays; each component
10
+ * accepts `className` + color overrides and reads the shared teal palette by
11
+ * default. A default stylesheet ships at `nirs4all-ui/assets/viz.css`.
12
+ *
13
+ * Consumed as `nirs4all-ui/viz`.
14
+ */
15
+ // --- palette + pure geometry toolkit ---
16
+ export * from "./theme.js";
17
+ export * from "./geometry.js";
18
+ // --- spectra + dataset ---
19
+ export * from "./SpectraPlot.js";
20
+ export * from "./Histogram.js";
21
+ export * from "./PcaScatter.js";
22
+ // --- regression + classification diagnostics ---
23
+ export * from "./PredictionScatter.js";
24
+ export * from "./ResidualPlot.js";
25
+ export * from "./ConformalIntervalStrip.js";
26
+ export * from "./ConfusionMatrix.js";
27
+ export * from "./BoxPlot.js";
28
+ export * from "./ScoreHeatmap.js";
29
+ export * from "./FoldStabilityLines.js";
30
+ export * from "./BiasVarianceBars.js";
31
+ // --- explainability ---
32
+ export * from "./FeatureImportanceBar.js";
33
+ export * from "./ShapBeeswarm.js";
34
+ export * from "./WaterfallChart.js";
35
+ // --- pipeline + scores ---
36
+ export * from "./PipelineFlow.js";
37
+ export * from "./ScoreSummary.js";
38
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/viz/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,0CAA0C;AAC1C,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAE9B,4BAA4B;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAEhC,kDAAkD;AAClD,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AAEtC,yBAAyB;AACzB,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AAEpC,4BAA4B;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Shared visualization palette for the nirs4all `viz` domain.
3
+ *
4
+ * Pure data + pure color math: no DOM, no React. These are the canonical
5
+ * "teal system" chart colors used across nirs4all Studio and the Web/WASM
6
+ * client, exposed so every presentational chart in this package (and its
7
+ * hosts) draws from one source of truth. Components read these as defaults but
8
+ * always accept explicit color overrides so hosts can retheme.
9
+ */
10
+ /** Named brand-ramp colors (verbatim from the nirs4all-org teal system). */
11
+ export declare const N4_VIZ_COLORS: {
12
+ readonly teal: "#0d9488";
13
+ readonly tealDark: "#0f766e";
14
+ readonly tealLight: "#2dd4bf";
15
+ readonly cyan: "#06b6d4";
16
+ readonly indigo: "#4f46e5";
17
+ readonly green: "#10b981";
18
+ readonly amber: "#d97706";
19
+ readonly rose: "#e11d48";
20
+ readonly violet: "#7c3aed";
21
+ readonly slate: "#64748b";
22
+ };
23
+ /** Ordered categorical series (mirrors `--chart-1..5` in the shared theme). */
24
+ export declare const N4_CHART_SERIES: readonly ["#0d9488", "#06b6d4", "#4f46e5", "#10b981", "#d97706"];
25
+ /**
26
+ * Wide categorical palette for group-colored scatter/topology views (mirrors
27
+ * Studio's `INSPECTOR_GROUP_COLORS`).
28
+ */
29
+ export declare const N4_CATEGORICAL: readonly ["#0d9488", "#2563eb", "#d97706", "#e11d48", "#7c3aed", "#059669", "#ea580c", "#0284c7", "#db2777", "#65a30d"];
30
+ /** Canonical train / validation / test partition colors. */
31
+ export declare const N4_PARTITION_COLORS: {
32
+ readonly train: "#0d9488";
33
+ readonly validation: "#4f46e5";
34
+ readonly test: "#d97706";
35
+ };
36
+ export type PartitionKey = keyof typeof N4_PARTITION_COLORS;
37
+ /** Resolve a categorical color by index, wrapping around the palette. */
38
+ export declare function categoricalColor(index: number, palette?: readonly string[]): string;
39
+ /** Interpolate a stop-based color ramp; `t` is clamped to [0, 1]. */
40
+ export declare function rampAt(stops: readonly string[], t: number): string;
41
+ /** Sequential teal→amber ramp (used for continuous coloring by value). */
42
+ export declare const N4_SEQUENTIAL_STOPS: readonly ["#0f766e", "#0d9488", "#06b6d4", "#84cc16", "#d97706"];
43
+ /** Perceptual viridis approximation for heatmap intensity. */
44
+ export declare const N4_VIRIDIS_STOPS: readonly ["#440154", "#3b528b", "#21918c", "#5ec962", "#fde725"];
45
+ /** Diverging blue→neutral→red ramp for signed SHAP values. */
46
+ export declare const N4_DIVERGING_STOPS: readonly ["#2563eb", "#e2e8f0", "#e11d48"];
47
+ export declare function sequentialColor(t: number): string;
48
+ export declare function viridisColor(t: number): string;
49
+ export declare function divergingColor(t: number): string;
50
+ //# sourceMappingURL=theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/viz/theme.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,4EAA4E;AAC5E,eAAO,MAAM,aAAa;;;;;;;;;;;CAWhB,CAAC;AAEX,+EAA+E;AAC/E,eAAO,MAAM,eAAe,kEAMlB,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,cAAc,yHAWjB,CAAC;AAEX,4DAA4D;AAC5D,eAAO,MAAM,mBAAmB;;;;CAItB,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,MAAM,OAAO,mBAAmB,CAAC;AAE5D,yEAAyE;AACzE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,SAAS,MAAM,EAAmB,GAAG,MAAM,CAInG;AAoBD,qEAAqE;AACrE,wBAAgB,MAAM,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAQlE;AAED,0EAA0E;AAC1E,eAAO,MAAM,mBAAmB,kEAAmE,CAAC;AAEpG,8DAA8D;AAC9D,eAAO,MAAM,gBAAgB,kEAAmE,CAAC;AAEjG,8DAA8D;AAC9D,eAAO,MAAM,kBAAkB,4CAA6C,CAAC;AAE7E,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEhD"}