nirs4all-ui 0.1.13 → 0.1.15
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.
- package/README.md +4 -1
- package/dist/chains/NodeEffectForest.d.ts.map +1 -1
- package/dist/chains/NodeEffectForest.js +5 -1
- package/dist/chains/NodeEffectForest.js.map +1 -1
- package/dist/chains/contract.d.ts.map +1 -1
- package/dist/chains/contract.js +10 -5
- package/dist/chains/contract.js.map +1 -1
- package/dist/datasetBuilder/exportConfig.d.ts.map +1 -1
- package/dist/datasetBuilder/exportConfig.js +1 -7
- package/dist/datasetBuilder/exportConfig.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/nodeRegistry/index.d.ts +9 -0
- package/dist/nodeRegistry/index.d.ts.map +1 -0
- package/dist/nodeRegistry/index.js +9 -0
- package/dist/nodeRegistry/index.js.map +1 -0
- package/dist/nodeRegistry/n4m.d.ts +83 -0
- package/dist/nodeRegistry/n4m.d.ts.map +1 -0
- package/dist/nodeRegistry/n4m.js +131 -0
- package/dist/nodeRegistry/n4m.js.map +1 -0
- package/dist/viz/BiasVarianceBars.d.ts +3 -1
- package/dist/viz/BiasVarianceBars.d.ts.map +1 -1
- package/dist/viz/BiasVarianceBars.js +19 -7
- package/dist/viz/BiasVarianceBars.js.map +1 -1
- package/dist/viz/BoxPlot.d.ts +3 -1
- package/dist/viz/BoxPlot.d.ts.map +1 -1
- package/dist/viz/BoxPlot.js +15 -2
- package/dist/viz/BoxPlot.js.map +1 -1
- package/dist/viz/ConformalIntervalStrip.d.ts +4 -2
- package/dist/viz/ConformalIntervalStrip.d.ts.map +1 -1
- package/dist/viz/ConformalIntervalStrip.js +25 -5
- package/dist/viz/ConformalIntervalStrip.js.map +1 -1
- package/dist/viz/ConfusionMatrix.d.ts +3 -1
- package/dist/viz/ConfusionMatrix.d.ts.map +1 -1
- package/dist/viz/ConfusionMatrix.js +28 -7
- package/dist/viz/ConfusionMatrix.js.map +1 -1
- package/dist/viz/FeatureImportanceBar.d.ts +3 -1
- package/dist/viz/FeatureImportanceBar.d.ts.map +1 -1
- package/dist/viz/FeatureImportanceBar.js +10 -3
- package/dist/viz/FeatureImportanceBar.js.map +1 -1
- package/dist/viz/FoldStabilityLines.d.ts +3 -1
- package/dist/viz/FoldStabilityLines.d.ts.map +1 -1
- package/dist/viz/FoldStabilityLines.js +14 -2
- package/dist/viz/FoldStabilityLines.js.map +1 -1
- package/dist/viz/Histogram.d.ts +3 -1
- package/dist/viz/Histogram.d.ts.map +1 -1
- package/dist/viz/Histogram.js +15 -3
- package/dist/viz/Histogram.js.map +1 -1
- package/dist/viz/PcaScatter.d.ts +3 -1
- package/dist/viz/PcaScatter.d.ts.map +1 -1
- package/dist/viz/PcaScatter.js +30 -6
- package/dist/viz/PcaScatter.js.map +1 -1
- package/dist/viz/PipelineFlow.d.ts +3 -1
- package/dist/viz/PipelineFlow.d.ts.map +1 -1
- package/dist/viz/PipelineFlow.js +8 -2
- package/dist/viz/PipelineFlow.js.map +1 -1
- package/dist/viz/PredictionScatter.d.ts +4 -2
- package/dist/viz/PredictionScatter.d.ts.map +1 -1
- package/dist/viz/PredictionScatter.js +25 -4
- package/dist/viz/PredictionScatter.js.map +1 -1
- package/dist/viz/ResidualPlot.d.ts +3 -1
- package/dist/viz/ResidualPlot.d.ts.map +1 -1
- package/dist/viz/ResidualPlot.js +18 -3
- package/dist/viz/ResidualPlot.js.map +1 -1
- package/dist/viz/ScoreHeatmap.d.ts +3 -1
- package/dist/viz/ScoreHeatmap.d.ts.map +1 -1
- package/dist/viz/ScoreHeatmap.js +23 -2
- package/dist/viz/ScoreHeatmap.js.map +1 -1
- package/dist/viz/ScoreSummary.d.ts +3 -1
- package/dist/viz/ScoreSummary.d.ts.map +1 -1
- package/dist/viz/ScoreSummary.js +8 -2
- package/dist/viz/ScoreSummary.js.map +1 -1
- package/dist/viz/ShapBeeswarm.d.ts +3 -1
- package/dist/viz/ShapBeeswarm.d.ts.map +1 -1
- package/dist/viz/ShapBeeswarm.js +20 -4
- package/dist/viz/ShapBeeswarm.js.map +1 -1
- package/dist/viz/SpectraPlot.d.ts +4 -2
- package/dist/viz/SpectraPlot.d.ts.map +1 -1
- package/dist/viz/SpectraPlot.js +27 -7
- package/dist/viz/SpectraPlot.js.map +1 -1
- package/dist/viz/WaterfallChart.d.ts +3 -1
- package/dist/viz/WaterfallChart.d.ts.map +1 -1
- package/dist/viz/WaterfallChart.js +18 -6
- package/dist/viz/WaterfallChart.js.map +1 -1
- package/dist/viz/description.d.ts +9 -0
- package/dist/viz/description.d.ts.map +1 -0
- package/dist/viz/description.js +25 -0
- package/dist/viz/description.js.map +1 -0
- package/dist/viz/index.d.ts +3 -1
- package/dist/viz/index.d.ts.map +1 -1
- package/dist/viz/index.js +3 -1
- package/dist/viz/index.js.map +1 -1
- package/package.json +5 -1
|
@@ -18,6 +18,8 @@ export interface ScoreHeatmapProps {
|
|
|
18
18
|
xLabel?: string;
|
|
19
19
|
yLabel?: string;
|
|
20
20
|
title?: string;
|
|
21
|
+
/** Faithful host-provided text alternative; defaults to a data summary. */
|
|
22
|
+
description?: string;
|
|
21
23
|
className?: string;
|
|
22
24
|
}
|
|
23
25
|
/**
|
|
@@ -26,5 +28,5 @@ export interface ScoreHeatmapProps {
|
|
|
26
28
|
* non-finite entries drop out as blanks, and a compact gradient legend keys the
|
|
27
29
|
* scale. Pure inline SVG; hosts pass labels + a values matrix.
|
|
28
30
|
*/
|
|
29
|
-
export declare function ScoreHeatmap({ rows, cols, values, colorScale, showValues, valueFormat, min, max, width, height, xLabel, yLabel, title, className, }: ScoreHeatmapProps): import("react").JSX.Element;
|
|
31
|
+
export declare function ScoreHeatmap({ rows, cols, values, colorScale, showValues, valueFormat, min, max, width, height, xLabel, yLabel, title, description, className, }: ScoreHeatmapProps): import("react").JSX.Element;
|
|
30
32
|
//# sourceMappingURL=ScoreHeatmap.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScoreHeatmap.d.ts","sourceRoot":"","sources":["../../src/viz/ScoreHeatmap.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ScoreHeatmap.d.ts","sourceRoot":"","sources":["../../src/viz/ScoreHeatmap.tsx"],"names":[],"mappings":"AAOA,MAAM,WAAW,iBAAiB;IAChC,iDAAiD;IACjD,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,6DAA6D;IAC7D,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,0EAA0E;IAC1E,MAAM,EAAE,aAAa,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;IACzC,yDAAyD;IACzD,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACnC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC,wEAAwE;IACxE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AASD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,IAAI,EACJ,MAAM,EACN,UAAyB,EACzB,UAAiB,EACjB,WAA2B,EAC3B,GAAG,EACH,GAAG,EACH,KAAW,EACX,MAAM,EACN,MAAM,EACN,MAAM,EACN,KAA6B,EAC7B,WAAW,EACX,SAAS,GACV,EAAE,iBAAiB,+BAoKnB"}
|
package/dist/viz/ScoreHeatmap.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useId } from "react";
|
|
2
3
|
import { cx } from "./_cx.js";
|
|
4
|
+
import { countLabel, summaryNumber } from "./description.js";
|
|
3
5
|
import { clamp, extentOf, round } from "./geometry.js";
|
|
4
6
|
import { viridisColor } from "./theme.js";
|
|
5
7
|
function defaultFormat(value) {
|
|
@@ -17,7 +19,8 @@ function defaultFormat(value) {
|
|
|
17
19
|
* non-finite entries drop out as blanks, and a compact gradient legend keys the
|
|
18
20
|
* scale. Pure inline SVG; hosts pass labels + a values matrix.
|
|
19
21
|
*/
|
|
20
|
-
export function ScoreHeatmap({ rows, cols, values, colorScale = viridisColor, showValues = true, valueFormat = defaultFormat, min, max, width = 420, height, xLabel, yLabel, title = "Performance heatmap", className, }) {
|
|
22
|
+
export function ScoreHeatmap({ rows, cols, values, colorScale = viridisColor, showValues = true, valueFormat = defaultFormat, min, max, width = 420, height, xLabel, yLabel, title = "Performance heatmap", description, className, }) {
|
|
23
|
+
const descriptionId = useId();
|
|
21
24
|
const resolvedHeight = height ?? Math.max(160, rows.length * 34 + 60);
|
|
22
25
|
const padLeft = 88;
|
|
23
26
|
const padTop = 34;
|
|
@@ -40,7 +43,25 @@ export function ScoreHeatmap({ rows, cols, values, colorScale = viridisColor, sh
|
|
|
40
43
|
const legendX = gridRight + 14;
|
|
41
44
|
const legendW = 10;
|
|
42
45
|
const segCount = 16;
|
|
43
|
-
|
|
46
|
+
let finiteCellCount = 0;
|
|
47
|
+
let lowest = null;
|
|
48
|
+
let highest = null;
|
|
49
|
+
for (const [row, rowLabel] of rows.entries()) {
|
|
50
|
+
for (const [col, colLabel] of cols.entries()) {
|
|
51
|
+
const value = values[row]?.[col];
|
|
52
|
+
if (typeof value !== "number" || !Number.isFinite(value))
|
|
53
|
+
continue;
|
|
54
|
+
finiteCellCount += 1;
|
|
55
|
+
if (lowest === null || value < lowest.value)
|
|
56
|
+
lowest = { rowLabel, colLabel, value };
|
|
57
|
+
if (highest === null || value > highest.value)
|
|
58
|
+
highest = { rowLabel, colLabel, value };
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
const summary = description?.trim() || (finiteCellCount === 0
|
|
62
|
+
? `${countLabel(rows.length, "row")} by ${countLabel(cols.length, "column")}; no finite scores.`
|
|
63
|
+
: `${countLabel(rows.length, "row")} by ${countLabel(cols.length, "column")}; ${countLabel(finiteCellCount, "finite score")}; lowest ${summaryNumber(lowest.value)} at ${lowest.rowLabel} / ${lowest.colLabel}; highest ${summaryNumber(highest.value)} at ${highest.rowLabel} / ${highest.colLabel}.`);
|
|
64
|
+
return (_jsxs("svg", { className: cx("n4viz", "n4viz-heatmap", className), viewBox: `0 0 ${width} ${resolvedHeight}`, role: "img", "aria-label": title, "aria-describedby": descriptionId, preserveAspectRatio: "xMidYMid meet", children: [_jsx("title", { children: title }), _jsx("desc", { id: descriptionId, children: summary }), rows.map((_, r) => cols.map((__, c) => {
|
|
44
65
|
const raw = values[r]?.[c];
|
|
45
66
|
const hasValue = typeof raw === "number" && Number.isFinite(raw);
|
|
46
67
|
const t = typeof raw === "number" && Number.isFinite(raw) ? clamp((raw - lo) / span, 0, 1) : 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScoreHeatmap.js","sourceRoot":"","sources":["../../src/viz/ScoreHeatmap.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAC9B,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"ScoreHeatmap.js","sourceRoot":"","sources":["../../src/viz/ScoreHeatmap.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAE9B,OAAO,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA2B1C,SAAS,aAAa,CAAC,KAAa;IAClC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IACxC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACrD,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAClD,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC1B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,EAC3B,IAAI,EACJ,IAAI,EACJ,MAAM,EACN,UAAU,GAAG,YAAY,EACzB,UAAU,GAAG,IAAI,EACjB,WAAW,GAAG,aAAa,EAC3B,GAAG,EACH,GAAG,EACH,KAAK,GAAG,GAAG,EACX,MAAM,EACN,MAAM,EACN,MAAM,EACN,KAAK,GAAG,qBAAqB,EAC7B,WAAW,EACX,SAAS,GACS;IAClB,MAAM,aAAa,GAAG,KAAK,EAAE,CAAC;IAC9B,MAAM,cAAc,GAAG,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IAEtE,MAAM,OAAO,GAAG,EAAE,CAAC;IACnB,MAAM,MAAM,GAAG,EAAE,CAAC;IAClB,MAAM,QAAQ,GAAG,EAAE,CAAC;IACpB,MAAM,SAAS,GAAG,EAAE,CAAC;IACrB,MAAM,QAAQ,GAAG,OAAO,CAAC;IACzB,MAAM,SAAS,GAAG,KAAK,GAAG,QAAQ,CAAC;IACnC,MAAM,OAAO,GAAG,MAAM,CAAC;IACvB,MAAM,UAAU,GAAG,cAAc,GAAG,SAAS,CAAC;IAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC,CAAC;IACpD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IACpE,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC;IAEtE,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjG,MAAM,GAAG,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;IACnC,MAAM,EAAE,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;IAC1B,MAAM,EAAE,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;IAC1B,MAAM,IAAI,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IAE1B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/B,MAAM,OAAO,GAAG,SAAS,GAAG,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,EAAE,CAAC;IACnB,MAAM,QAAQ,GAAG,EAAE,CAAC;IACpB,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,MAAM,GAAiE,IAAI,CAAC;IAChF,IAAI,OAAO,GAAiE,IAAI,CAAC;IACjF,KAAK,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;QAC7C,KAAK,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;YACjC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,SAAS;YACnE,eAAe,IAAI,CAAC,CAAC;YACrB,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,GAAG,MAAM,CAAC,KAAK;gBAAE,MAAM,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;YACpF,IAAI,OAAO,KAAK,IAAI,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK;gBAAE,OAAO,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QACzF,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAG,WAAW,EAAE,IAAI,EAAE,IAAI,CACrC,eAAe,KAAK,CAAC;QACnB,CAAC,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,qBAAqB;QAChG,CAAC,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,UAAU,CAAC,eAAe,EAAE,cAAc,CAAC,YAAY,aAAa,CAAC,MAAO,CAAC,KAAK,CAAC,OAAO,MAAO,CAAC,QAAQ,MAAM,MAAO,CAAC,QAAQ,aAAa,aAAa,CAAC,OAAQ,CAAC,KAAK,CAAC,OAAO,OAAQ,CAAC,QAAQ,MAAM,OAAQ,CAAC,QAAQ,GAAG,CAC/S,CAAC;IAEF,OAAO,CACL,eACE,SAAS,EAAE,EAAE,CAAC,OAAO,EAAE,eAAe,EAAE,SAAS,CAAC,EAClD,OAAO,EAAE,OAAO,KAAK,IAAI,cAAc,EAAE,EACzC,IAAI,EAAC,KAAK,gBACE,KAAK,sBACC,aAAa,EAC/B,mBAAmB,EAAC,eAAe,aAEnC,0BAAQ,KAAK,GAAS,EACtB,eAAM,EAAE,EAAE,aAAa,YAAG,OAAO,GAAQ,EAExC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACjB,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;gBACjB,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC3B,MAAM,QAAQ,GAAG,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBACjE,MAAM,CAAC,GAAG,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/F,MAAM,CAAC,GAAG,QAAQ,GAAG,CAAC,GAAG,KAAK,CAAC;gBAC/B,MAAM,CAAC,GAAG,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC;gBAC9B,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;gBAClD,OAAO,CACL,wBACE,eACE,SAAS,EAAC,YAAY,EACtB,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EACf,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EACf,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,EACvB,MAAM,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,EACxB,EAAE,EAAE,CAAC,EACL,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,EAC9C,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,cAAc,EACjD,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAClC,EACD,QAAQ,IAAI,UAAU,CAAC,CAAC,CAAC,CACxB,eACE,SAAS,EAAC,kBAAkB,EAC5B,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,EACvB,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,EAC3B,UAAU,EAAC,QAAQ,EACnB,IAAI,EAAE,QAAQ,YAEb,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAC3C,CACR,CAAC,CAAC,CAAC,IAAI,KAtBF,QAAQ,CAAC,IAAI,CAAC,EAAE,CAuBpB,CACL,CAAC;YACJ,CAAC,CAAC,CACH,EAEA,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CACtB,eAEE,SAAS,EAAC,YAAY,EACtB,CAAC,EAAE,QAAQ,GAAG,CAAC,EACf,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,CAAC,GAAG,KAAK,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,EAC7C,UAAU,EAAC,KAAK,YAEf,KAAK,IAND,OAAO,KAAK,IAAI,CAAC,EAAE,CAOnB,CACR,CAAC,EACD,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;gBACrB,MAAM,GAAG,GAAG,QAAQ,GAAG,CAAC,GAAG,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;gBAC7C,MAAM,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC;gBACtB,OAAO,MAAM,CAAC,CAAC,CAAC,CACd,eAEE,SAAS,EAAC,YAAY,EACtB,SAAS,EAAE,cAAc,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAC3C,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,EACb,CAAC,EAAE,CAAC,EACJ,UAAU,EAAC,KAAK,YAEf,KAAK,IAPD,OAAO,KAAK,IAAI,CAAC,EAAE,CAQnB,CACR,CAAC,CAAC,CAAC,CACF,eAAgC,SAAS,EAAC,YAAY,EAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,EAAC,QAAQ,YAC5F,KAAK,IADG,OAAO,KAAK,IAAI,CAAC,EAAE,CAEvB,CACR,CAAC;YACJ,CAAC,CAAC,EAED,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACzC,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;gBACpC,MAAM,IAAI,GAAG,OAAO,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,UAAU,CAAC;gBACnD,OAAO,CACL,eAEE,SAAS,EAAC,mBAAmB,EAC7B,CAAC,EAAE,OAAO,EACV,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,EACd,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,KAAK,CAAC,UAAU,GAAG,QAAQ,GAAG,GAAG,CAAC,EAC1C,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,IANjB,UAAU,CAAC,EAAE,CAOlB,CACH,CAAC;YACJ,CAAC,CAAC,EACF,eAAM,SAAS,EAAC,YAAY,EAAC,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,OAAO,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,UAAU,EAAC,QAAQ,YAC9F,WAAW,CAAC,EAAE,CAAC,GACX,EACP,eAAM,SAAS,EAAC,YAAY,EAAC,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,OAAO,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,GAAG,EAAE,EAAE,UAAU,EAAC,QAAQ,YAClG,WAAW,CAAC,EAAE,CAAC,GACX,EAEN,MAAM,CAAC,CAAC,CAAC,CACR,eAAM,SAAS,EAAC,kBAAkB,EAAC,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,CAAC,EAAE,CAAC,EAAE,cAAc,GAAG,CAAC,EAAE,UAAU,EAAC,QAAQ,YACvG,MAAM,GACF,CACR,CAAC,CAAC,CAAC,IAAI,EACP,MAAM,CAAC,CAAC,CAAC,CACR,eACE,SAAS,EAAC,kBAAkB,EAC5B,SAAS,EAAE,gBAAgB,OAAO,GAAG,UAAU,GAAG,CAAC,eAAe,EAClE,UAAU,EAAC,QAAQ,YAElB,MAAM,GACF,CACR,CAAC,CAAC,CAAC,IAAI,IACJ,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -12,6 +12,8 @@ export interface ScoreSummaryProps {
|
|
|
12
12
|
tileHeight?: number;
|
|
13
13
|
gap?: number;
|
|
14
14
|
title?: string;
|
|
15
|
+
/** Faithful host-provided text alternative; defaults to a data summary. */
|
|
16
|
+
description?: string;
|
|
15
17
|
className?: string;
|
|
16
18
|
}
|
|
17
19
|
/**
|
|
@@ -19,5 +21,5 @@ export interface ScoreSummaryProps {
|
|
|
19
21
|
* ScoreCardTree and the Web ResultsList, rendered as one presentational SVG so
|
|
20
22
|
* it composes like the other viz charts. Hosts pass pre-formatted strings.
|
|
21
23
|
*/
|
|
22
|
-
export declare function ScoreSummary({ stats, columns, tileWidth, tileHeight, gap, title, className, }: ScoreSummaryProps): import("react").JSX.Element;
|
|
24
|
+
export declare function ScoreSummary({ stats, columns, tileWidth, tileHeight, gap, title, description, className, }: ScoreSummaryProps): import("react").JSX.Element;
|
|
23
25
|
//# sourceMappingURL=ScoreSummary.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScoreSummary.d.ts","sourceRoot":"","sources":["../../src/viz/ScoreSummary.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ScoreSummary.d.ts","sourceRoot":"","sources":["../../src/viz/ScoreSummary.tsx"],"names":[],"mappings":"AAOA,iCAAiC;AACjC,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;CAC5C;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,SAAS,SAAS,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAYD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,OAAW,EACX,SAAe,EACf,UAAe,EACf,GAAQ,EACR,KAAgB,EAChB,WAAW,EACX,SAAS,GACV,EAAE,iBAAiB,+BAgEnB"}
|
package/dist/viz/ScoreSummary.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useId } from "react";
|
|
2
3
|
import { cx } from "./_cx.js";
|
|
4
|
+
import { countLabel } from "./description.js";
|
|
3
5
|
import { round } from "./geometry.js";
|
|
4
6
|
import { N4_VIZ_COLORS } from "./theme.js";
|
|
5
7
|
const TONE_COLORS = {
|
|
@@ -15,12 +17,16 @@ function toneColor(tone) {
|
|
|
15
17
|
* ScoreCardTree and the Web ResultsList, rendered as one presentational SVG so
|
|
16
18
|
* it composes like the other viz charts. Hosts pass pre-formatted strings.
|
|
17
19
|
*/
|
|
18
|
-
export function ScoreSummary({ stats, columns = 3, tileWidth = 120, tileHeight = 76, gap = 10, title = "Scores", className, }) {
|
|
20
|
+
export function ScoreSummary({ stats, columns = 3, tileWidth = 120, tileHeight = 76, gap = 10, title = "Scores", description, className, }) {
|
|
21
|
+
const descriptionId = useId();
|
|
19
22
|
const cols = Math.max(1, Math.trunc(columns));
|
|
20
23
|
const rows = stats.length > 0 ? Math.ceil(stats.length / cols) : 0;
|
|
21
24
|
const width = cols * tileWidth + (cols + 1) * gap;
|
|
22
25
|
const height = rows * tileHeight + (rows + 1) * gap;
|
|
23
|
-
|
|
26
|
+
const summary = description?.trim() || (stats.length === 0
|
|
27
|
+
? "No scores available."
|
|
28
|
+
: `${countLabel(stats.length, "score")}; ${stats.map((stat) => `${stat.label}: ${stat.value}${stat.delta ? `, change ${stat.delta}` : ""}`).join("; ")}.`);
|
|
29
|
+
return (_jsxs("svg", { className: cx("n4viz", "n4viz-scores", className), viewBox: `0 0 ${width} ${height}`, role: "img", "aria-label": title, "aria-describedby": descriptionId, preserveAspectRatio: "xMidYMid meet", children: [_jsx("title", { children: title }), _jsx("desc", { id: descriptionId, children: summary }), stats.map((stat, i) => {
|
|
24
30
|
const col = i % cols;
|
|
25
31
|
const rowIdx = Math.floor(i / cols);
|
|
26
32
|
const x = gap + col * (tileWidth + gap);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScoreSummary.js","sourceRoot":"","sources":["../../src/viz/ScoreSummary.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAC9B,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"ScoreSummary.js","sourceRoot":"","sources":["../../src/viz/ScoreSummary.tsx"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,8 @@ export interface ShapBeeswarmProps {
|
|
|
15
15
|
height?: number;
|
|
16
16
|
pointRadius?: number;
|
|
17
17
|
title?: string;
|
|
18
|
+
/** Faithful host-provided text alternative; defaults to a data summary. */
|
|
19
|
+
description?: string;
|
|
18
20
|
className?: string;
|
|
19
21
|
xLabel?: string;
|
|
20
22
|
}
|
|
@@ -25,5 +27,5 @@ export interface ShapBeeswarmProps {
|
|
|
25
27
|
* contributions. Jitter is deterministic (index-derived, never random) so the
|
|
26
28
|
* markup is stable across renders. Pure inline SVG.
|
|
27
29
|
*/
|
|
28
|
-
export declare function ShapBeeswarm({ features, width, height, pointRadius, title, className, xLabel, }: ShapBeeswarmProps): import("react").JSX.Element;
|
|
30
|
+
export declare function ShapBeeswarm({ features, width, height, pointRadius, title, description, className, xLabel, }: ShapBeeswarmProps): import("react").JSX.Element;
|
|
29
31
|
//# sourceMappingURL=ShapBeeswarm.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ShapBeeswarm.d.ts","sourceRoot":"","sources":["../../src/viz/ShapBeeswarm.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ShapBeeswarm.d.ts","sourceRoot":"","sources":["../../src/viz/ShapBeeswarm.tsx"],"names":[],"mappings":"AAOA,qEAAqE;AACrE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,sEAAsE;AACtE,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,aAAa,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,SAAS,eAAe,EAAE,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAmBD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,KAAW,EACX,MAAM,EACN,WAAiB,EACjB,KAAuB,EACvB,WAAW,EACX,SAAS,EACT,MAAqB,GACtB,EAAE,iBAAiB,+BAiHnB"}
|
package/dist/viz/ShapBeeswarm.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useId } from "react";
|
|
2
3
|
import { cx } from "./_cx.js";
|
|
4
|
+
import { countLabel, rangeText, summaryNumber } from "./description.js";
|
|
3
5
|
import { extentOf, makeScale, round, ticks } from "./geometry.js";
|
|
4
6
|
import { divergingColor, N4_VIZ_COLORS } from "./theme.js";
|
|
5
7
|
function fmt(value) {
|
|
@@ -26,7 +28,11 @@ function jitterUnit(index) {
|
|
|
26
28
|
* contributions. Jitter is deterministic (index-derived, never random) so the
|
|
27
29
|
* markup is stable across renders. Pure inline SVG.
|
|
28
30
|
*/
|
|
29
|
-
export function ShapBeeswarm({ features, width = 420, height, pointRadius = 2.5, title = "SHAP beeswarm", className, xLabel = "SHAP value", }) {
|
|
31
|
+
export function ShapBeeswarm({ features, width = 420, height, pointRadius = 2.5, title = "SHAP beeswarm", description, className, xLabel = "SHAP value", }) {
|
|
32
|
+
const descriptionId = useId();
|
|
33
|
+
const validFeatures = features.map((feature) => ({
|
|
34
|
+
...feature, points: feature.points.filter((point) => Number.isFinite(point.shap)),
|
|
35
|
+
}));
|
|
30
36
|
const resolvedHeight = height ?? Math.max(180, features.length * 34 + 48);
|
|
31
37
|
const padLeft = 96;
|
|
32
38
|
const padRight = 16;
|
|
@@ -37,7 +43,7 @@ export function ShapBeeswarm({ features, width = 420, height, pointRadius = 2.5,
|
|
|
37
43
|
const plotTop = padTop;
|
|
38
44
|
const plotBottom = resolvedHeight - padBottom;
|
|
39
45
|
const plotHeight = Math.max(0, plotBottom - plotTop);
|
|
40
|
-
const allShap =
|
|
46
|
+
const allShap = validFeatures.flatMap((f) => f.points.map((p) => p.shap));
|
|
41
47
|
const ext = extentOf(allShap);
|
|
42
48
|
const domain = { min: Math.min(0, ext.min), max: Math.max(0, ext.max) };
|
|
43
49
|
const xScale = makeScale(domain, plotLeft, plotRight);
|
|
@@ -46,14 +52,24 @@ export function ShapBeeswarm({ features, width = 420, height, pointRadius = 2.5,
|
|
|
46
52
|
const n = features.length;
|
|
47
53
|
const band = n > 0 ? plotHeight / n : plotHeight;
|
|
48
54
|
const amplitude = Math.min(band, 30) * 0.35;
|
|
49
|
-
|
|
55
|
+
const featureSummaries = validFeatures.flatMap((feature) => {
|
|
56
|
+
const values = feature.points.map((point) => point.shap).filter((value) => Number.isFinite(value));
|
|
57
|
+
return values.length
|
|
58
|
+
? [`${feature.label}: ${countLabel(values.length, "contribution")}, mean ${summaryNumber(values.reduce((sum, value) => sum + value, 0) / values.length)}, range ${rangeText(values)}`]
|
|
59
|
+
: [];
|
|
60
|
+
});
|
|
61
|
+
const missingFeatureValues = validFeatures.some((feature) => feature.points.some((point) => !Number.isFinite(point.featureValue)));
|
|
62
|
+
const summary = description?.trim() || (featureSummaries.length === 0
|
|
63
|
+
? "No finite SHAP contributions."
|
|
64
|
+
: `${countLabel(featureSummaries.length, "feature")}; ${featureSummaries.join("; ")}. Color encodes feature value.${missingFeatureValues ? " Unavailable feature values use a neutral color." : ""}`);
|
|
65
|
+
return (_jsxs("svg", { className: cx("n4viz", "n4viz-beeswarm", className), viewBox: `0 0 ${width} ${resolvedHeight}`, role: "img", "aria-label": title, "aria-describedby": descriptionId, preserveAspectRatio: "xMidYMid meet", children: [_jsx("title", { children: title }), _jsx("desc", { id: descriptionId, children: summary }), _jsx("line", { className: "n4viz-reference n4viz-zero", x1: round(xZero), x2: round(xZero), y1: plotTop, y2: plotBottom, stroke: N4_VIZ_COLORS.slate, strokeDasharray: "5 4", strokeWidth: 1.4 }), validFeatures.map((feature, fi) => {
|
|
50
66
|
const center = plotTop + band * fi + band / 2;
|
|
51
67
|
const fvExtent = extentOf(feature.points.map((p) => p.featureValue));
|
|
52
68
|
const fvSpan = fvExtent.max - fvExtent.min;
|
|
53
69
|
return (_jsxs("g", { children: [_jsx("text", { className: "n4viz-tick", x: plotLeft - 6, y: round(center + 3), textAnchor: "end", children: truncate(feature.label) }), feature.points.map((point, pi) => {
|
|
54
70
|
const norm = fvSpan > 0 ? (point.featureValue - fvExtent.min) / fvSpan : 0.5;
|
|
55
71
|
const cy = center + jitterUnit(pi + fi * 131) * amplitude;
|
|
56
|
-
return (_jsx("circle", { className: "n4viz-dot", cx: round(xScale(point.shap)), cy: round(cy), r: pointRadius, fill: divergingColor(norm), fillOpacity: 0.72 }, `p-${fi}-${pi}`));
|
|
72
|
+
return (_jsx("circle", { className: "n4viz-dot", cx: round(xScale(point.shap)), cy: round(cy), r: pointRadius, fill: Number.isFinite(point.featureValue) ? divergingColor(norm) : N4_VIZ_COLORS.slate, fillOpacity: 0.72 }, `p-${fi}-${pi}`));
|
|
57
73
|
})] }, `${feature.label}-${fi}`));
|
|
58
74
|
}), _jsx("line", { className: "n4viz-axis", x1: plotLeft, x2: plotRight, y1: plotBottom, y2: plotBottom }), axisTicks.map((t) => (_jsx("text", { className: "n4viz-tick", x: round(xScale(t)), y: plotBottom + 15, textAnchor: "middle", children: fmt(t) }, `tx-${t}`))), _jsx("text", { className: "n4viz-axis-label", x: plotLeft + (plotRight - plotLeft) / 2, y: resolvedHeight - 2, textAnchor: "middle", children: xLabel })] }));
|
|
59
75
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ShapBeeswarm.js","sourceRoot":"","sources":["../../src/viz/ShapBeeswarm.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"ShapBeeswarm.js","sourceRoot":"","sources":["../../src/viz/ShapBeeswarm.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
2
|
import { type PlotPadding } from "./geometry.js";
|
|
3
3
|
import { type PartitionKey } from "./theme.js";
|
|
4
4
|
/** One overlaid spectrum (absorbance values aligned to the shared wavelength axis). */
|
|
@@ -36,6 +36,8 @@ export interface SpectraPlotProps {
|
|
|
36
36
|
showAxes?: boolean;
|
|
37
37
|
meanColor?: string;
|
|
38
38
|
title?: string;
|
|
39
|
+
/** Faithful host-provided text alternative; defaults to a data summary. */
|
|
40
|
+
description?: string;
|
|
39
41
|
className?: string;
|
|
40
42
|
/** Extra SVG content rendered in data space last (annotations, legends). */
|
|
41
43
|
children?: ReactNode;
|
|
@@ -46,5 +48,5 @@ export interface SpectraPlotProps {
|
|
|
46
48
|
* min/max band. Pure inline SVG — no chart library, no state. Hosts pass
|
|
47
49
|
* already-aligned numeric arrays.
|
|
48
50
|
*/
|
|
49
|
-
export declare function SpectraPlot({ wavelengths, series, mean, band, width, height, padding, unit, xLabel, yLabel, showGrid, showAxes, meanColor, title, className, children, }: SpectraPlotProps): import("react").JSX.Element;
|
|
51
|
+
export declare function SpectraPlot({ wavelengths, series, mean, band, width, height, padding, unit, xLabel, yLabel, showGrid, showAxes, meanColor, title, description, className, children, }: SpectraPlotProps): import("react").JSX.Element;
|
|
50
52
|
//# sourceMappingURL=SpectraPlot.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SpectraPlot.d.ts","sourceRoot":"","sources":["../../src/viz/SpectraPlot.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"SpectraPlot.d.ts","sourceRoot":"","sources":["../../src/viz/SpectraPlot.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAI9C,OAAO,EASL,KAAK,WAAW,EACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAsC,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAEnF,uFAAuF;AACvF,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,mEAAmE;AACnE,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,2CAA2C;IAC3C,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,kFAAkF;IAClF,MAAM,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IAClC,6CAA6C;IAC7C,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,wBAAwB;IACxB,IAAI,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAcD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,EAC1B,WAAW,EACX,MAAW,EACX,IAAI,EACJ,IAAI,EACJ,KAAW,EACX,MAAY,EACZ,OAAO,EACP,IAAW,EACX,MAAM,EACN,MAAqB,EACrB,QAAe,EACf,QAAe,EACf,SAAkC,EAClC,KAAsB,EACtB,WAAW,EACX,SAAS,EACT,QAAQ,GACT,EAAE,gBAAgB,+BAoIlB"}
|
package/dist/viz/SpectraPlot.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useId } from "react";
|
|
2
3
|
import { cx } from "./_cx.js";
|
|
4
|
+
import { countLabel, rangeText } from "./description.js";
|
|
3
5
|
import { bandPath, buildFrame, extentOf, linePath, makeScale, niceExtent, round, ticks, } from "./geometry.js";
|
|
4
6
|
import { N4_PARTITION_COLORS, N4_VIZ_COLORS } from "./theme.js";
|
|
5
7
|
function partitionColor(series) {
|
|
@@ -22,25 +24,43 @@ function formatTick(value) {
|
|
|
22
24
|
* min/max band. Pure inline SVG — no chart library, no state. Hosts pass
|
|
23
25
|
* already-aligned numeric arrays.
|
|
24
26
|
*/
|
|
25
|
-
export function SpectraPlot({ wavelengths, series = [], mean, band, width = 520, height = 260, padding, unit = "nm", xLabel, yLabel = "Absorbance", showGrid = true, showAxes = true, meanColor = N4_VIZ_COLORS.tealDark, title = "NIRS spectra", className, children, }) {
|
|
27
|
+
export function SpectraPlot({ wavelengths, series = [], mean, band, width = 520, height = 260, padding, unit = "nm", xLabel, yLabel = "Absorbance", showGrid = true, showAxes = true, meanColor = N4_VIZ_COLORS.tealDark, title = "NIRS spectra", description, className, children, }) {
|
|
28
|
+
const descriptionId = useId();
|
|
26
29
|
const frame = buildFrame(width, height, padding);
|
|
27
30
|
const { top, left } = frame.padding;
|
|
28
31
|
const bottom = top + frame.innerHeight;
|
|
32
|
+
const usableAxis = wavelengths.length > 0 && wavelengths.every(Number.isFinite);
|
|
33
|
+
const aligned = (values) => usableAxis && values.length === wavelengths.length && values.every(Number.isFinite);
|
|
34
|
+
const validSeries = series.filter((curve) => aligned(curve.values));
|
|
35
|
+
const validMean = mean && aligned(mean) ? mean : null;
|
|
36
|
+
const validBand = band && aligned(band.lower) && aligned(band.upper)
|
|
37
|
+
&& band.lower.every((lower, index) => lower <= band.upper[index]) ? band : null;
|
|
29
38
|
const xDomain = extentOf(wavelengths);
|
|
30
39
|
const allValues = [
|
|
31
|
-
...
|
|
32
|
-
...(
|
|
33
|
-
...(
|
|
40
|
+
...validSeries.flatMap((s) => s.values),
|
|
41
|
+
...(validMean ?? []),
|
|
42
|
+
...(validBand ? [...validBand.lower, ...validBand.upper] : []),
|
|
34
43
|
];
|
|
35
44
|
const yDomain = niceExtent(allValues.length ? allValues : [0, 1], 0.08);
|
|
36
45
|
const xScale = makeScale(xDomain, left, left + frame.innerWidth);
|
|
37
46
|
const yScale = makeScale(yDomain, bottom, top);
|
|
38
|
-
const toPoints = (values) => wavelengths.map((wl, i) => [xScale(wl), yScale(values[i]
|
|
47
|
+
const toPoints = (values) => wavelengths.map((wl, i) => [xScale(wl), yScale(values[i])]);
|
|
39
48
|
const xTicks = ticks(xDomain, 5);
|
|
40
49
|
const yTicks = ticks(yDomain, 4);
|
|
41
50
|
const resolvedXLabel = xLabel ?? `Wavelength (${unit})`;
|
|
42
|
-
|
|
51
|
+
const wavelengthRange = rangeText(wavelengths);
|
|
52
|
+
const valueRange = rangeText(allValues);
|
|
53
|
+
const summary = description?.trim() || (!validSeries.length && !validMean && !validBand
|
|
54
|
+
? "No spectral curves available."
|
|
55
|
+
: [
|
|
56
|
+
`${countLabel(validSeries.length, "sample spectrum", "sample spectra")} across ${countLabel(wavelengths.length, "axis position")}`,
|
|
57
|
+
...(wavelengthRange ? [`axis range ${wavelengthRange} ${unit}`] : []),
|
|
58
|
+
...(valueRange ? [`${yLabel} range ${valueRange}`] : []),
|
|
59
|
+
...(validMean ? ["mean curve shown"] : []),
|
|
60
|
+
...(validBand ? ["range band shown"] : []),
|
|
61
|
+
].join("; ") + ".");
|
|
62
|
+
return (_jsxs("svg", { className: cx("n4viz", "n4viz-spectra", className), viewBox: `0 0 ${width} ${height}`, role: "img", "aria-label": title, "aria-describedby": descriptionId, preserveAspectRatio: "xMidYMid meet", children: [_jsx("title", { children: title }), _jsx("desc", { id: descriptionId, children: summary }), showGrid
|
|
43
63
|
? yTicks.map((t) => (_jsx("line", { className: "n4viz-grid", x1: left, x2: left + frame.innerWidth, y1: round(yScale(t)), y2: round(yScale(t)) }, `gy-${t}`)))
|
|
44
|
-
: null,
|
|
64
|
+
: null, validBand ? (_jsx("path", { className: "n4viz-band", d: bandPath(toPoints(validBand.upper), toPoints(validBand.lower)), fill: validBand.color ?? N4_VIZ_COLORS.teal, fillOpacity: validBand.opacity ?? 0.12, stroke: "none" })) : null, validSeries.map((s) => (_jsx("path", { className: "n4viz-line", d: linePath(toPoints(s.values)), fill: "none", stroke: partitionColor(s), strokeOpacity: s.opacity ?? 0.5, strokeWidth: 1 }, s.id))), validMean ? (_jsx("path", { className: "n4viz-line n4viz-line-mean", d: linePath(toPoints(validMean)), fill: "none", stroke: meanColor, strokeWidth: 2.4, strokeLinecap: "round", strokeLinejoin: "round" })) : null, showAxes ? (_jsxs(_Fragment, { children: [_jsx("line", { className: "n4viz-axis", x1: left, x2: left + frame.innerWidth, y1: bottom, y2: bottom }), _jsx("line", { className: "n4viz-axis", x1: left, x2: left, y1: top, y2: bottom }), xTicks.map((t) => (_jsx("text", { className: "n4viz-tick", x: round(xScale(t)), y: bottom + 16, textAnchor: "middle", children: formatTick(t) }, `tx-${t}`))), yTicks.map((t) => (_jsx("text", { className: "n4viz-tick", x: left - 6, y: round(yScale(t)) + 3, textAnchor: "end", children: formatTick(t) }, `ty-${t}`))), _jsx("text", { className: "n4viz-axis-label", x: left + frame.innerWidth / 2, y: height - 2, textAnchor: "middle", children: resolvedXLabel }), _jsx("text", { className: "n4viz-axis-label", transform: `translate(11 ${top + frame.innerHeight / 2}) rotate(-90)`, textAnchor: "middle", children: yLabel })] })) : null, children] }));
|
|
45
65
|
}
|
|
46
66
|
//# sourceMappingURL=SpectraPlot.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SpectraPlot.js","sourceRoot":"","sources":["../../src/viz/SpectraPlot.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"SpectraPlot.js","sourceRoot":"","sources":["../../src/viz/SpectraPlot.tsx"],"names":[],"mappings":"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"}
|
|
@@ -17,6 +17,8 @@ export interface WaterfallChartProps {
|
|
|
17
17
|
/** Auto-sized from the kept row count when omitted. */
|
|
18
18
|
height?: number;
|
|
19
19
|
title?: string;
|
|
20
|
+
/** Faithful host-provided text alternative; defaults to a data summary. */
|
|
21
|
+
description?: string;
|
|
20
22
|
className?: string;
|
|
21
23
|
}
|
|
22
24
|
/**
|
|
@@ -26,5 +28,5 @@ export interface WaterfallChartProps {
|
|
|
26
28
|
* base value to the prediction. A dashed base reference and a solid prediction
|
|
27
29
|
* reference frame the walk. Pure inline SVG; hosts pass precomputed SHAP values.
|
|
28
30
|
*/
|
|
29
|
-
export declare function WaterfallChart({ baseValue, contributions, predicted, topN, valueFormat, width, height, title, className, }: WaterfallChartProps): import("react").JSX.Element;
|
|
31
|
+
export declare function WaterfallChart({ baseValue, contributions, predicted, topN, valueFormat, width, height, title, description, className, }: WaterfallChartProps): import("react").JSX.Element;
|
|
30
32
|
//# sourceMappingURL=WaterfallChart.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WaterfallChart.d.ts","sourceRoot":"","sources":["../../src/viz/WaterfallChart.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"WaterfallChart.d.ts","sourceRoot":"","sources":["../../src/viz/WaterfallChart.tsx"],"names":[],"mappings":"AAOA,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,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,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,WAAW,EACX,SAAS,GACV,EAAE,mBAAmB,+BAuJrB"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useId } from "react";
|
|
2
3
|
import { cx } from "./_cx.js";
|
|
4
|
+
import { countLabel, summaryNumber } from "./description.js";
|
|
3
5
|
import { makeScale, niceExtent, round, ticks } from "./geometry.js";
|
|
4
6
|
import { N4_VIZ_COLORS } from "./theme.js";
|
|
5
7
|
function defaultFormat(value) {
|
|
@@ -26,11 +28,12 @@ function truncate(label, max = 15) {
|
|
|
26
28
|
* base value to the prediction. A dashed base reference and a solid prediction
|
|
27
29
|
* reference frame the walk. Pure inline SVG; hosts pass precomputed SHAP values.
|
|
28
30
|
*/
|
|
29
|
-
export function WaterfallChart({ baseValue, contributions, predicted, topN = 10, valueFormat = defaultFormat, width = 440, height, title = "SHAP waterfall", className, }) {
|
|
30
|
-
const
|
|
31
|
+
export function WaterfallChart({ baseValue, contributions, predicted, topN = 10, valueFormat = defaultFormat, width = 440, height, title = "SHAP waterfall", description, className, }) {
|
|
32
|
+
const descriptionId = useId();
|
|
33
|
+
const sumAll = contributions.reduce((s, c) => s + c.value, 0);
|
|
31
34
|
const resolvedPredicted = predicted ?? baseValue + sumAll;
|
|
32
35
|
const keep = Math.max(0, Math.trunc(topN));
|
|
33
|
-
const indexed = contributions.map((c, i) => ({ c, i }));
|
|
36
|
+
const indexed = contributions.map((c, i) => ({ c, i })).filter(({ c }) => Number.isFinite(c.value));
|
|
34
37
|
const keptIndices = new Set([...indexed]
|
|
35
38
|
.sort((a, b) => Math.abs(b.c.value) - Math.abs(a.c.value))
|
|
36
39
|
.slice(0, keep)
|
|
@@ -49,19 +52,28 @@ export function WaterfallChart({ baseValue, contributions, predicted, topN = 10,
|
|
|
49
52
|
let running = baseValue;
|
|
50
53
|
const rows = kept.map((c) => {
|
|
51
54
|
const from = running;
|
|
52
|
-
const value =
|
|
55
|
+
const value = c.value;
|
|
53
56
|
const to = from + value;
|
|
54
57
|
running = to;
|
|
55
58
|
return { label: c.label, value, from, to };
|
|
56
59
|
});
|
|
60
|
+
const visibleRows = rows.filter((row) => Number.isFinite(row.from) && Number.isFinite(row.to));
|
|
57
61
|
const boundaries = [baseValue, resolvedPredicted, ...rows.flatMap((r) => [r.from, r.to])];
|
|
58
62
|
const domain = niceExtent(boundaries, 0.06);
|
|
59
63
|
const xScale = makeScale(domain, plotLeft, plotRight);
|
|
60
64
|
const xTicks = ticks(domain, 5);
|
|
61
|
-
const n =
|
|
65
|
+
const n = visibleRows.length;
|
|
62
66
|
const band = n > 0 ? plotHeight / n : plotHeight;
|
|
63
67
|
const barHeight = Math.min(18, Math.max(4, band - 8));
|
|
64
|
-
|
|
68
|
+
const shownSum = visibleRows.reduce((sum, row) => sum + row.value, 0);
|
|
69
|
+
const summary = description?.trim() || ([
|
|
70
|
+
`base value ${summaryNumber(baseValue)}`,
|
|
71
|
+
`predicted value ${summaryNumber(resolvedPredicted)}`,
|
|
72
|
+
`${visibleRows.length} of ${countLabel(contributions.length, "contribution")} shown`,
|
|
73
|
+
...visibleRows.map((row) => `${row.label}: ${row.value >= 0 ? "+" : ""}${summaryNumber(row.value)}`),
|
|
74
|
+
...(contributions.length > visibleRows.length ? [`omitted contribution sum ${summaryNumber(sumAll - shownSum)}`] : []),
|
|
75
|
+
].join("; ") + ".");
|
|
76
|
+
return (_jsxs("svg", { className: cx("n4viz", "n4viz-waterfall", className), viewBox: `0 0 ${width} ${resolvedHeight}`, role: "img", "aria-label": title, "aria-describedby": descriptionId, preserveAspectRatio: "xMidYMid meet", children: [_jsx("title", { children: title }), _jsx("desc", { id: descriptionId, children: summary }), xTicks.map((t) => (_jsx("line", { className: "n4viz-grid", x1: round(xScale(t)), x2: round(xScale(t)), y1: plotTop, y2: plotBottom }, `grid-${t}`))), Number.isFinite(baseValue) ? _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 }) : null, Number.isFinite(resolvedPredicted) ? _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 }) : null, Number.isFinite(baseValue) ? _jsx("text", { className: "n4viz-tick", x: round(xScale(baseValue)), y: plotTop - 6, textAnchor: "middle", children: "base" }) : null, Number.isFinite(resolvedPredicted) ? _jsx("text", { className: "n4viz-tick", x: round(xScale(resolvedPredicted)), y: plotTop - 6, textAnchor: "middle", children: "f(x)" }) : null, visibleRows.map((row, i) => {
|
|
65
77
|
const center = plotTop + band * i + band / 2;
|
|
66
78
|
const x0 = xScale(Math.min(row.from, row.to));
|
|
67
79
|
const x1 = xScale(Math.max(row.from, row.to));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WaterfallChart.js","sourceRoot":"","sources":["../../src/viz/WaterfallChart.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAC9B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"WaterfallChart.js","sourceRoot":"","sources":["../../src/viz/WaterfallChart.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Small, locale-neutral summaries for the data behind accessible SVG charts. */
|
|
2
|
+
export declare function summaryNumber(value: number): string;
|
|
3
|
+
export declare function countLabel(count: number, singular: string, plural?: string): string;
|
|
4
|
+
export declare function finiteRange(values: readonly number[]): {
|
|
5
|
+
min: number;
|
|
6
|
+
max: number;
|
|
7
|
+
} | null;
|
|
8
|
+
export declare function rangeText(values: readonly number[]): string | null;
|
|
9
|
+
//# sourceMappingURL=description.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"description.d.ts","sourceRoot":"","sources":["../../src/viz/description.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAiB,GAAG,MAAM,CAE3F;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAS1F;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAGlE"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** Small, locale-neutral summaries for the data behind accessible SVG charts. */
|
|
2
|
+
export function summaryNumber(value) {
|
|
3
|
+
if (!Number.isFinite(value))
|
|
4
|
+
return "unavailable";
|
|
5
|
+
return Number(value.toPrecision(4)).toString();
|
|
6
|
+
}
|
|
7
|
+
export function countLabel(count, singular, plural = `${singular}s`) {
|
|
8
|
+
return `${count} ${count === 1 ? singular : plural}`;
|
|
9
|
+
}
|
|
10
|
+
export function finiteRange(values) {
|
|
11
|
+
let min = Infinity;
|
|
12
|
+
let max = -Infinity;
|
|
13
|
+
for (const value of values) {
|
|
14
|
+
if (!Number.isFinite(value))
|
|
15
|
+
continue;
|
|
16
|
+
min = Math.min(min, value);
|
|
17
|
+
max = Math.max(max, value);
|
|
18
|
+
}
|
|
19
|
+
return min === Infinity ? null : { min, max };
|
|
20
|
+
}
|
|
21
|
+
export function rangeText(values) {
|
|
22
|
+
const range = finiteRange(values);
|
|
23
|
+
return range ? `${summaryNumber(range.min)} to ${summaryNumber(range.max)}` : null;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=description.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"description.js","sourceRoot":"","sources":["../../src/viz/description.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,aAAa,CAAC;IAClD,OAAO,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,QAAgB,EAAE,MAAM,GAAG,GAAG,QAAQ,GAAG;IACjF,OAAO,GAAG,KAAK,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAyB;IACnD,IAAI,GAAG,GAAG,QAAQ,CAAC;IACnB,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC;IACpB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAS;QACtC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC3B,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,MAAyB;IACjD,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACrF,CAAC"}
|
package/dist/viz/index.d.ts
CHANGED
|
@@ -8,7 +8,9 @@
|
|
|
8
8
|
* nirs4all-ui: pure + stateless, NO app state, network/IO, browser globals, or
|
|
9
9
|
* runtime execution. Hosts pass already-computed numeric arrays; each component
|
|
10
10
|
* accepts `className` + color overrides and reads the shared teal palette by
|
|
11
|
-
* default.
|
|
11
|
+
* default. SVGs include data-derived text descriptions; hosts may override
|
|
12
|
+
* `description` for localized or domain-specific wording. A default stylesheet
|
|
13
|
+
* ships at `nirs4all-ui/assets/viz.css`.
|
|
12
14
|
*
|
|
13
15
|
* Consumed as `nirs4all-ui/viz`.
|
|
14
16
|
*/
|