nirs4all-ui 0.1.4 → 0.1.5

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 CHANGED
@@ -15,18 +15,20 @@ UI surfaces.
15
15
  | --- | --- | --- |
16
16
  | `score` | `nirs4all-ui/score` | Metric-key normalization, metric catalog helpers, direction-aware score parsing, comparison, and formatting. |
17
17
  | `runtime` | `nirs4all-ui/runtime` | Runtime/result status display tokens, busy-state predicates, progress projection, engine metadata summaries, diagnostics, and native-result affordances. |
18
+ | `dataset` | `nirs4all-ui/dataset` | Dataset preview contracts, counts, split summaries, spectral ranges, task labels, badges, and stats. |
18
19
  | `components` | `nirs4all-ui/components` | Stateless React components that render shared runtime, diagnostic, and metric affordances. |
19
20
 
20
21
  The root export also exposes namespace barrels:
21
22
 
22
23
  ```ts
23
- import { runtime, score } from "nirs4all-ui";
24
+ import { dataset, runtime, score } from "nirs4all-ui";
24
25
  ```
25
26
 
26
27
  Prefer domain imports when a consumer only needs one area:
27
28
 
28
29
  ```ts
29
30
  import { canonicalMetricKey, formatMetricValue } from "nirs4all-ui/score";
31
+ import { buildDatasetPreview } from "nirs4all-ui/dataset";
30
32
  import { buildRuntimeResultStatusView } from "nirs4all-ui/runtime";
31
33
  import { MetricValueBadge, RuntimeEngineBadge } from "nirs4all-ui/components";
32
34
  ```
@@ -61,3 +63,8 @@ the npm package keeps the same files available under `assets/brand` through the
61
63
  the GitHub project-page path; set
62
64
  `NIRS4ALL_UI_BASE=/` and add a `CNAME` only when switching to a dedicated
63
65
  subdomain such as `ui.nirs4all.org`.
66
+
67
+ `site/src/App.test.tsx` is the focused hardening check for the showcase: it
68
+ verifies that every public React component export appears in the page and that
69
+ the mirrored brand/logo, crawler metadata, manifest, and canonical URLs stay in
70
+ sync with the packaged asset set.
@@ -0,0 +1,22 @@
1
+ import type { ReactNode } from "react";
2
+ import { type DatasetPreviewBadge, type DatasetPreviewInput, type DatasetPreviewStat, type DatasetPreviewView } from "../dataset/index.js";
3
+ export interface DatasetPreviewCardProps {
4
+ dataset?: DatasetPreviewInput | null;
5
+ view?: DatasetPreviewView | null;
6
+ className?: string;
7
+ headerClassName?: string;
8
+ titleClassName?: string;
9
+ descriptionClassName?: string;
10
+ badgeListClassName?: string;
11
+ badgeClassName?: string | ((badge: DatasetPreviewBadge) => string | undefined);
12
+ statListClassName?: string;
13
+ statClassName?: string | ((stat: DatasetPreviewStat) => string | undefined);
14
+ statLabelClassName?: string;
15
+ statValueClassName?: string;
16
+ statDetailClassName?: string;
17
+ empty?: ReactNode;
18
+ renderBadge?: (badge: DatasetPreviewBadge) => ReactNode;
19
+ renderStat?: (stat: DatasetPreviewStat) => ReactNode;
20
+ }
21
+ export declare function DatasetPreviewCard({ dataset, view, className, headerClassName, titleClassName, descriptionClassName, badgeListClassName, badgeClassName, statListClassName, statClassName, statLabelClassName, statValueClassName, statDetailClassName, empty, renderBadge, renderStat, }: DatasetPreviewCardProps): import("react").JSX.Element | null;
22
+ //# sourceMappingURL=DatasetPreviewCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DatasetPreviewCard.d.ts","sourceRoot":"","sources":["../../src/components/DatasetPreviewCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACxB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,uBAAuB;IACtC,OAAO,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACrC,IAAI,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,mBAAmB,KAAK,MAAM,GAAG,SAAS,CAAC,CAAC;IAC/E,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,kBAAkB,KAAK,MAAM,GAAG,SAAS,CAAC,CAAC;IAC5E,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,SAAS,CAAC;IACxD,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,SAAS,CAAC;CACtD;AAwBD,wBAAgB,kBAAkB,CAAC,EACjC,OAAO,EACP,IAAI,EACJ,SAAS,EACT,eAAe,EACf,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,KAAK,EACL,WAAW,EACX,UAAU,GACX,EAAE,uBAAuB,sCAoCzB"}
@@ -0,0 +1,17 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { buildDatasetPreview, } from "../dataset/index.js";
3
+ function resolveClassName(className, item) {
4
+ return typeof className === "function" ? className(item) : className;
5
+ }
6
+ function defaultStatNode(stat, labelClassName, valueClassName, detailClassName) {
7
+ return (_jsxs(_Fragment, { children: [_jsx("dt", { className: labelClassName, children: stat.label }), _jsx("dd", { className: valueClassName, children: stat.value }), stat.detail ? _jsx("span", { className: detailClassName, children: stat.detail }) : null] }));
8
+ }
9
+ export function DatasetPreviewCard({ dataset, view, className, headerClassName, titleClassName, descriptionClassName, badgeListClassName, badgeClassName, statListClassName, statClassName, statLabelClassName, statValueClassName, statDetailClassName, empty, renderBadge, renderStat, }) {
10
+ const preview = view ?? buildDatasetPreview(dataset);
11
+ if (!preview)
12
+ return empty == null ? null : _jsx(_Fragment, { children: empty });
13
+ return (_jsxs("article", { className: className, "data-dataset-id": preview.id ?? undefined, children: [_jsxs("header", { className: headerClassName, children: [_jsx("strong", { className: titleClassName, children: preview.title }), preview.description ? (_jsx("p", { className: descriptionClassName, children: preview.description })) : null] }), preview.badges.length > 0 ? (_jsx("div", { className: badgeListClassName, children: preview.badges.map((badge) => (_jsx("span", { className: resolveClassName(badgeClassName, badge), children: renderBadge ? renderBadge(badge) : badge.label }, badge.id))) })) : null, preview.stats.length > 0 ? (_jsx("dl", { className: statListClassName, children: preview.stats.map((stat) => (_jsx("div", { className: resolveClassName(statClassName, stat), children: renderStat
14
+ ? renderStat(stat)
15
+ : defaultStatNode(stat, statLabelClassName, statValueClassName, statDetailClassName) }, stat.id))) })) : null] }));
16
+ }
17
+ //# sourceMappingURL=DatasetPreviewCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DatasetPreviewCard.js","sourceRoot":"","sources":["../../src/components/DatasetPreviewCard.tsx"],"names":[],"mappings":";AAEA,OAAO,EACL,mBAAmB,GAKpB,MAAM,qBAAqB,CAAC;AAqB7B,SAAS,gBAAgB,CACvB,SAAiE,EACjE,IAAO;IAEP,OAAO,OAAO,SAAS,KAAK,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACvE,CAAC;AAED,SAAS,eAAe,CACtB,IAAwB,EACxB,cAAkC,EAClC,cAAkC,EAClC,eAAmC;IAEnC,OAAO,CACL,8BACE,aAAI,SAAS,EAAE,cAAc,YAAG,IAAI,CAAC,KAAK,GAAM,EAChD,aAAI,SAAS,EAAE,cAAc,YAAG,IAAI,CAAC,KAAK,GAAM,EAC/C,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,eAAM,SAAS,EAAE,eAAe,YAAG,IAAI,CAAC,MAAM,GAAQ,CAAC,CAAC,CAAC,IAAI,IAC3E,CACJ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,EACjC,OAAO,EACP,IAAI,EACJ,SAAS,EACT,eAAe,EACf,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,KAAK,EACL,WAAW,EACX,UAAU,GACc;IACxB,MAAM,OAAO,GAAG,IAAI,IAAI,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACrD,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,4BAAG,KAAK,GAAI,CAAC;IAEzD,OAAO,CACL,mBAAS,SAAS,EAAE,SAAS,qBAAmB,OAAO,CAAC,EAAE,IAAI,SAAS,aACrE,kBAAQ,SAAS,EAAE,eAAe,aAChC,iBAAQ,SAAS,EAAE,cAAc,YAAG,OAAO,CAAC,KAAK,GAAU,EAC1D,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CACrB,YAAG,SAAS,EAAE,oBAAoB,YAAG,OAAO,CAAC,WAAW,GAAK,CAC9D,CAAC,CAAC,CAAC,IAAI,IACD,EAER,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAC3B,cAAK,SAAS,EAAE,kBAAkB,YAC/B,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAC7B,eAAM,SAAS,EAAE,gBAAgB,CAAC,cAAc,EAAE,KAAK,CAAC,YACrD,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IADc,KAAK,CAAC,EAAE,CAEhE,CACR,CAAC,GACE,CACP,CAAC,CAAC,CAAC,IAAI,EAEP,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAC1B,aAAI,SAAS,EAAE,iBAAiB,YAC7B,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAC3B,cAAK,SAAS,EAAE,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,YAClD,UAAU;wBACT,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;wBAClB,CAAC,CAAC,eAAe,CAAC,IAAI,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,mBAAmB,CAAC,IAH5B,IAAI,CAAC,EAAE,CAI7D,CACP,CAAC,GACC,CACN,CAAC,CAAC,CAAC,IAAI,IACA,CACX,CAAC;AACJ,CAAC"}
@@ -1,3 +1,4 @@
1
+ export * from "./DatasetPreviewCard.js";
1
2
  export * from "./MetricValueBadge.js";
2
3
  export * from "./RuntimeDiagnosticList.js";
3
4
  export * from "./RuntimeEngineBadge.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC"}
@@ -1,3 +1,4 @@
1
+ export * from "./DatasetPreviewCard.js";
1
2
  export * from "./MetricValueBadge.js";
2
3
  export * from "./RuntimeDiagnosticList.js";
3
4
  export * from "./RuntimeEngineBadge.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Pure dataset preview view-model helpers.
3
+ *
4
+ * Hosts keep ownership of dataset loading and schema adapters; this module only
5
+ * turns small, package-level display contracts into reusable labels, stats, and
6
+ * badges for Studio/Web dataset cards.
7
+ */
8
+ export type DatasetPreviewTaskKind = "regression" | "classification" | "mixed" | "unknown";
9
+ export type DatasetPreviewTone = "default" | "muted" | "warning";
10
+ export type DatasetPreviewCount = number | string | null | undefined;
11
+ export interface DatasetSplitCountInput {
12
+ id?: string | null;
13
+ key?: string | null;
14
+ label?: string | null;
15
+ count?: DatasetPreviewCount;
16
+ }
17
+ export type DatasetSplitCountsInput = readonly DatasetSplitCountInput[] | Record<string, DatasetPreviewCount>;
18
+ export interface DatasetSpectralRangeInput {
19
+ start?: DatasetPreviewCount;
20
+ end?: DatasetPreviewCount;
21
+ min?: DatasetPreviewCount;
22
+ max?: DatasetPreviewCount;
23
+ unit?: string | null;
24
+ }
25
+ export interface DatasetPreviewInput {
26
+ id?: string | null;
27
+ name?: string | null;
28
+ title?: string | null;
29
+ description?: string | null;
30
+ taskType?: string | null;
31
+ sampleCount?: DatasetPreviewCount;
32
+ spectrumCount?: DatasetPreviewCount;
33
+ rowCount?: DatasetPreviewCount;
34
+ featureCount?: DatasetPreviewCount;
35
+ wavelengthCount?: DatasetPreviewCount;
36
+ targetCount?: DatasetPreviewCount;
37
+ classCount?: DatasetPreviewCount;
38
+ splitCounts?: DatasetSplitCountsInput | null;
39
+ splits?: DatasetSplitCountsInput | null;
40
+ spectralRange?: DatasetSpectralRangeInput | readonly [DatasetPreviewCount, DatasetPreviewCount] | null;
41
+ tags?: readonly (string | null | undefined)[] | null;
42
+ }
43
+ export interface DatasetSplitCountView {
44
+ id: string;
45
+ label: string;
46
+ count: number;
47
+ countLabel: string;
48
+ percentage: number | null;
49
+ percentageLabel: string | null;
50
+ }
51
+ export interface DatasetPreviewBadge {
52
+ id: string;
53
+ label: string;
54
+ tone: DatasetPreviewTone;
55
+ }
56
+ export interface DatasetPreviewStat {
57
+ id: "samples" | "features" | "targets" | "classes" | "splits" | "range";
58
+ label: string;
59
+ value: string;
60
+ detail: string | null;
61
+ tone: DatasetPreviewTone;
62
+ }
63
+ export interface DatasetPreviewView {
64
+ id: string | null;
65
+ title: string;
66
+ description: string | null;
67
+ taskKind: DatasetPreviewTaskKind;
68
+ taskLabel: string;
69
+ sampleCount: number | null;
70
+ sampleCountLabel: string | null;
71
+ featureCount: number | null;
72
+ featureCountLabel: string | null;
73
+ targetCount: number | null;
74
+ targetCountLabel: string | null;
75
+ classCount: number | null;
76
+ classCountLabel: string | null;
77
+ spectralRangeLabel: string | null;
78
+ splitCounts: DatasetSplitCountView[];
79
+ splitSummaryLabel: string | null;
80
+ tags: string[];
81
+ badges: DatasetPreviewBadge[];
82
+ stats: DatasetPreviewStat[];
83
+ }
84
+ export declare function parseDatasetCount(value: DatasetPreviewCount): number | null;
85
+ export declare function formatDatasetCount(value: DatasetPreviewCount, singular: string, plural?: string): string | null;
86
+ export declare function resolveDatasetTaskKind(taskType: string | null | undefined): DatasetPreviewTaskKind;
87
+ export declare function formatDatasetTaskLabel(taskType: string | null | undefined): string;
88
+ export declare function formatDatasetTokenLabel(value: string | null | undefined): string;
89
+ export declare function normalizeDatasetSplitCounts(input: DatasetSplitCountsInput | null | undefined, sampleCount?: DatasetPreviewCount): DatasetSplitCountView[];
90
+ export declare function formatDatasetSpectralRange(range: DatasetPreviewInput["spectralRange"]): string | null;
91
+ export declare function buildDatasetPreview(input: DatasetPreviewInput | null | undefined): DatasetPreviewView | null;
92
+ //# sourceMappingURL=datasetPreview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datasetPreview.d.ts","sourceRoot":"","sources":["../../src/dataset/datasetPreview.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,328 @@
1
+ /**
2
+ * Pure dataset preview view-model helpers.
3
+ *
4
+ * Hosts keep ownership of dataset loading and schema adapters; this module only
5
+ * turns small, package-level display contracts into reusable labels, stats, and
6
+ * badges for Studio/Web dataset cards.
7
+ */
8
+ function readTrimmedString(value) {
9
+ if (typeof value !== "string")
10
+ return null;
11
+ const trimmed = value.trim();
12
+ return trimmed.length > 0 ? trimmed : null;
13
+ }
14
+ function parseFiniteNumber(value) {
15
+ if (typeof value === "number")
16
+ return Number.isFinite(value) ? value : null;
17
+ if (typeof value === "string") {
18
+ const parsed = Number.parseFloat(value);
19
+ return Number.isFinite(parsed) ? parsed : null;
20
+ }
21
+ return null;
22
+ }
23
+ export function parseDatasetCount(value) {
24
+ const parsed = parseFiniteNumber(value);
25
+ return parsed != null && parsed >= 0 ? Math.trunc(parsed) : null;
26
+ }
27
+ function firstDatasetCount(...values) {
28
+ for (const value of values) {
29
+ const count = parseDatasetCount(value);
30
+ if (count != null)
31
+ return count;
32
+ }
33
+ return null;
34
+ }
35
+ const COUNT_FORMATTER = new Intl.NumberFormat("en-US", {
36
+ maximumFractionDigits: 0,
37
+ });
38
+ const RANGE_FORMATTER = new Intl.NumberFormat("en-US", {
39
+ maximumFractionDigits: 2,
40
+ });
41
+ export function formatDatasetCount(value, singular, plural = `${singular}s`) {
42
+ const count = parseDatasetCount(value);
43
+ if (count == null)
44
+ return null;
45
+ return `${COUNT_FORMATTER.format(count)} ${count === 1 ? singular : plural}`;
46
+ }
47
+ function formatCountValue(value) {
48
+ return value == null ? "Unknown" : COUNT_FORMATTER.format(value);
49
+ }
50
+ function normalizeLookupToken(value) {
51
+ return readTrimmedString(value)?.toLowerCase().replace(/[\s_]+/g, "-") ?? "";
52
+ }
53
+ export function resolveDatasetTaskKind(taskType) {
54
+ const normalized = normalizeLookupToken(taskType);
55
+ if (!normalized)
56
+ return "unknown";
57
+ if (normalized.includes("mixed") || normalized.includes("multi-task"))
58
+ return "mixed";
59
+ if (normalized.includes("class"))
60
+ return "classification";
61
+ if (normalized.includes("regress"))
62
+ return "regression";
63
+ return "unknown";
64
+ }
65
+ export function formatDatasetTaskLabel(taskType) {
66
+ const kind = resolveDatasetTaskKind(taskType);
67
+ if (kind === "classification")
68
+ return "Classification";
69
+ if (kind === "regression")
70
+ return "Regression";
71
+ if (kind === "mixed")
72
+ return "Mixed tasks";
73
+ const trimmed = readTrimmedString(taskType);
74
+ if (!trimmed)
75
+ return "Dataset";
76
+ return formatDatasetTokenLabel(trimmed);
77
+ }
78
+ export function formatDatasetTokenLabel(value) {
79
+ const trimmed = readTrimmedString(value);
80
+ if (!trimmed)
81
+ return "";
82
+ return trimmed
83
+ .replace(/([a-z])([A-Z])/g, "$1 $2")
84
+ .split(/[-_\s]+/)
85
+ .filter(Boolean)
86
+ .map((part) => {
87
+ const lower = part.toLowerCase();
88
+ if (lower === "id")
89
+ return "ID";
90
+ if (lower === "nirs")
91
+ return "NIRS";
92
+ if (lower === "nir")
93
+ return "NIR";
94
+ if (lower === "uv")
95
+ return "UV";
96
+ if (lower === "vis")
97
+ return "VIS";
98
+ return lower.charAt(0).toUpperCase() + lower.slice(1);
99
+ })
100
+ .join(" ");
101
+ }
102
+ function percentageLabel(percentage) {
103
+ if (percentage == null)
104
+ return null;
105
+ return `${RANGE_FORMATTER.format(percentage)}%`;
106
+ }
107
+ function splitEntries(input) {
108
+ if (!input)
109
+ return [];
110
+ if (Array.isArray(input))
111
+ return [...input];
112
+ return Object.entries(input).map(([key, count]) => ({
113
+ id: key,
114
+ count,
115
+ }));
116
+ }
117
+ function isSpectralRangeTuple(range) {
118
+ return Array.isArray(range);
119
+ }
120
+ export function normalizeDatasetSplitCounts(input, sampleCount) {
121
+ const total = parseDatasetCount(sampleCount);
122
+ const seen = new Set();
123
+ return splitEntries(input)
124
+ .map((entry, index) => {
125
+ const count = parseDatasetCount(entry.count);
126
+ if (count == null)
127
+ return null;
128
+ const rawId = readTrimmedString(entry.id) ?? readTrimmedString(entry.key) ?? readTrimmedString(entry.label);
129
+ const id = normalizeLookupToken(rawId) || `split-${index + 1}`;
130
+ if (seen.has(id))
131
+ return null;
132
+ seen.add(id);
133
+ const percentage = total && total > 0
134
+ ? Math.round((count / total) * 1000) / 10
135
+ : null;
136
+ return {
137
+ id,
138
+ label: readTrimmedString(entry.label) ?? (formatDatasetTokenLabel(rawId) || `Split ${index + 1}`),
139
+ count,
140
+ countLabel: formatDatasetCount(count, "sample") ?? "0 samples",
141
+ percentage,
142
+ percentageLabel: percentageLabel(percentage),
143
+ };
144
+ })
145
+ .filter((entry) => entry != null);
146
+ }
147
+ function readSpectralRangeValue(range, keys) {
148
+ if (!range)
149
+ return null;
150
+ if (isSpectralRangeTuple(range)) {
151
+ const index = keys.includes("start") || keys.includes("min") ? 0 : 1;
152
+ return parseFiniteNumber(range[index]);
153
+ }
154
+ for (const key of keys) {
155
+ const value = parseFiniteNumber(range[key]);
156
+ if (value != null)
157
+ return value;
158
+ }
159
+ return null;
160
+ }
161
+ function readSpectralRangeUnit(range) {
162
+ if (!range || isSpectralRangeTuple(range))
163
+ return "nm";
164
+ return readTrimmedString(range.unit) ?? "nm";
165
+ }
166
+ export function formatDatasetSpectralRange(range) {
167
+ const start = readSpectralRangeValue(range, ["start", "min"]);
168
+ const end = readSpectralRangeValue(range, ["end", "max"]);
169
+ if (start == null && end == null)
170
+ return null;
171
+ const unit = readSpectralRangeUnit(range);
172
+ if (start != null && end != null) {
173
+ const lower = Math.min(start, end);
174
+ const upper = Math.max(start, end);
175
+ return `${RANGE_FORMATTER.format(lower)}-${RANGE_FORMATTER.format(upper)} ${unit}`;
176
+ }
177
+ if (start != null)
178
+ return `from ${RANGE_FORMATTER.format(start)} ${unit}`;
179
+ if (end != null)
180
+ return `up to ${RANGE_FORMATTER.format(end)} ${unit}`;
181
+ return null;
182
+ }
183
+ function normalizeTags(tags) {
184
+ const seen = new Set();
185
+ const normalized = [];
186
+ for (const tag of tags ?? []) {
187
+ const label = readTrimmedString(tag);
188
+ if (!label)
189
+ continue;
190
+ const key = normalizeLookupToken(label);
191
+ if (seen.has(key))
192
+ continue;
193
+ seen.add(key);
194
+ normalized.push(label);
195
+ }
196
+ return normalized;
197
+ }
198
+ function buildSplitSummaryLabel(splits) {
199
+ if (splits.length === 0)
200
+ return null;
201
+ return splits
202
+ .map((split) => split.percentageLabel
203
+ ? `${split.label} ${split.percentageLabel}`
204
+ : `${split.label} ${split.countLabel}`)
205
+ .join(", ");
206
+ }
207
+ function buildBadges(taskLabel, taskKind, splitSummaryLabel, spectralRangeLabel, tags) {
208
+ const badges = [
209
+ {
210
+ id: "task",
211
+ label: taskLabel,
212
+ tone: taskKind === "unknown" ? "muted" : "default",
213
+ },
214
+ ];
215
+ if (spectralRangeLabel) {
216
+ badges.push({ id: "range", label: spectralRangeLabel, tone: "muted" });
217
+ }
218
+ if (splitSummaryLabel) {
219
+ badges.push({ id: "splits", label: splitSummaryLabel, tone: "muted" });
220
+ }
221
+ for (const tag of tags) {
222
+ badges.push({
223
+ id: `tag-${normalizeLookupToken(tag)}`,
224
+ label: tag,
225
+ tone: "default",
226
+ });
227
+ }
228
+ return badges;
229
+ }
230
+ function buildStats(view) {
231
+ const stats = [
232
+ {
233
+ id: "samples",
234
+ label: "Samples",
235
+ value: formatCountValue(view.sampleCount),
236
+ detail: view.splitSummaryLabel,
237
+ tone: view.sampleCount == null ? "warning" : "default",
238
+ },
239
+ {
240
+ id: "features",
241
+ label: "Features",
242
+ value: formatCountValue(view.featureCount),
243
+ detail: view.spectralRangeLabel,
244
+ tone: view.featureCount == null ? "muted" : "default",
245
+ },
246
+ ];
247
+ if (view.classCount != null) {
248
+ stats.push({
249
+ id: "classes",
250
+ label: "Classes",
251
+ value: formatCountValue(view.classCount),
252
+ detail: view.targetCountLabel,
253
+ tone: "default",
254
+ });
255
+ }
256
+ else if (view.targetCount != null) {
257
+ stats.push({
258
+ id: "targets",
259
+ label: "Targets",
260
+ value: formatCountValue(view.targetCount),
261
+ detail: null,
262
+ tone: "default",
263
+ });
264
+ }
265
+ if (view.splitCounts.length > 0) {
266
+ stats.push({
267
+ id: "splits",
268
+ label: "Splits",
269
+ value: COUNT_FORMATTER.format(view.splitCounts.length),
270
+ detail: view.splitSummaryLabel,
271
+ tone: "muted",
272
+ });
273
+ }
274
+ if (view.spectralRangeLabel && view.featureCount == null) {
275
+ stats.push({
276
+ id: "range",
277
+ label: "Range",
278
+ value: view.spectralRangeLabel,
279
+ detail: null,
280
+ tone: "muted",
281
+ });
282
+ }
283
+ return stats;
284
+ }
285
+ export function buildDatasetPreview(input) {
286
+ if (!input)
287
+ return null;
288
+ const title = readTrimmedString(input.title)
289
+ ?? readTrimmedString(input.name)
290
+ ?? readTrimmedString(input.id)
291
+ ?? "Untitled dataset";
292
+ const description = readTrimmedString(input.description);
293
+ const taskKind = resolveDatasetTaskKind(input.taskType);
294
+ const taskLabel = formatDatasetTaskLabel(input.taskType);
295
+ const sampleCount = firstDatasetCount(input.sampleCount, input.spectrumCount, input.rowCount);
296
+ const featureCount = firstDatasetCount(input.featureCount, input.wavelengthCount);
297
+ const targetCount = parseDatasetCount(input.targetCount);
298
+ const classCount = parseDatasetCount(input.classCount);
299
+ const splitCounts = normalizeDatasetSplitCounts(input.splitCounts ?? input.splits, sampleCount);
300
+ const splitSummaryLabel = buildSplitSummaryLabel(splitCounts);
301
+ const spectralRangeLabel = formatDatasetSpectralRange(input.spectralRange);
302
+ const tags = normalizeTags(input.tags);
303
+ const baseView = {
304
+ id: readTrimmedString(input.id),
305
+ title,
306
+ description,
307
+ taskKind,
308
+ taskLabel,
309
+ sampleCount,
310
+ sampleCountLabel: formatDatasetCount(sampleCount, "sample"),
311
+ featureCount,
312
+ featureCountLabel: formatDatasetCount(featureCount, "feature"),
313
+ targetCount,
314
+ targetCountLabel: formatDatasetCount(targetCount, "target"),
315
+ classCount,
316
+ classCountLabel: formatDatasetCount(classCount, "class", "classes"),
317
+ spectralRangeLabel,
318
+ splitCounts,
319
+ splitSummaryLabel,
320
+ tags,
321
+ };
322
+ return {
323
+ ...baseView,
324
+ badges: buildBadges(taskLabel, taskKind, splitSummaryLabel, spectralRangeLabel, tags),
325
+ stats: buildStats(baseView),
326
+ };
327
+ }
328
+ //# sourceMappingURL=datasetPreview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datasetPreview.js","sourceRoot":"","sources":["../../src/dataset/datasetPreview.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Dataset preview view-model foundation — public surface.
3
+ *
4
+ * Pure, dependency-free helpers for small dataset summaries shared by Studio
5
+ * and Web. Hosts adapt their local dataset objects into this package-level
6
+ * contract and keep ownership of loading, routing, and app state.
7
+ */
8
+ export * from "./datasetPreview.js";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dataset/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Dataset preview view-model foundation — public surface.
3
+ *
4
+ * Pure, dependency-free helpers for small dataset summaries shared by Studio
5
+ * and Web. Hosts adapt their local dataset objects into this package-level
6
+ * contract and keep ownership of loading, routing, and app state.
7
+ */
8
+ export * from "./datasetPreview.js";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dataset/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,cAAc,qBAAqB,CAAC"}
package/dist/index.d.ts CHANGED
@@ -7,5 +7,6 @@
7
7
  */
8
8
  export * as score from "./score/index.js";
9
9
  export * as runtime from "./runtime/index.js";
10
+ export * as dataset from "./dataset/index.js";
10
11
  export * as components from "./components/index.js";
11
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,UAAU,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,UAAU,MAAM,uBAAuB,CAAC"}
package/dist/index.js CHANGED
@@ -7,5 +7,6 @@
7
7
  */
8
8
  export * as score from "./score/index.js";
9
9
  export * as runtime from "./runtime/index.js";
10
+ export * as dataset from "./dataset/index.js";
10
11
  export * as components from "./components/index.js";
11
12
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,UAAU,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,UAAU,MAAM,uBAAuB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nirs4all-ui",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "description": "Shared React UI components and pure view-model helpers for nirs4all apps.",
5
5
  "type": "module",
6
6
  "license": "(CECILL-2.1 OR AGPL-3.0-or-later)",
@@ -35,6 +35,10 @@
35
35
  "types": "./dist/runtime/index.d.ts",
36
36
  "import": "./dist/runtime/index.js"
37
37
  },
38
+ "./dataset": {
39
+ "types": "./dist/dataset/index.d.ts",
40
+ "import": "./dist/dataset/index.js"
41
+ },
38
42
  "./components": {
39
43
  "types": "./dist/components/index.d.ts",
40
44
  "import": "./dist/components/index.js"