@cellarnode/ui 0.8.18 → 0.9.1

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.
@@ -1,11 +1,23 @@
1
+ export interface SensoryFieldDef {
2
+ label: string;
3
+ type: string;
4
+ enum?: string[];
5
+ enumLabels?: string[];
6
+ "x-maturity"?: "stable" | "candidate" | "draft" | "deprecated";
7
+ }
1
8
  export interface SensoryProfileProps {
2
9
  /** Stages keyed by stage name, each containing field key/value pairs. */
3
- sensoryDetails?: Record<string, Record<string, string | null> | null> | null;
10
+ sensoryDetails?: Record<string, Record<string, string | string[] | null> | null> | null;
4
11
  /** Optional label overrides per stage key. */
5
12
  stageLabels?: Record<string, string>;
6
13
  /** Optional label overrides per field, keyed by stage then field. */
7
14
  fieldLabels?: Record<string, Record<string, string>>;
15
+ /**
16
+ * Optional field definitions per stage, keyed by stage then field.
17
+ * Used to resolve enum display labels and skip deprecated fields.
18
+ */
19
+ fieldDefs?: Record<string, Record<string, SensoryFieldDef>>;
8
20
  className?: string;
9
21
  }
10
- export declare function SensoryProfile({ sensoryDetails, stageLabels, fieldLabels, className, }: SensoryProfileProps): import("react/jsx-runtime").JSX.Element | null;
22
+ export declare function SensoryProfile({ sensoryDetails, stageLabels, fieldLabels, fieldDefs, className, }: SensoryProfileProps): import("react/jsx-runtime").JSX.Element | null;
11
23
  //# sourceMappingURL=sensory-profile.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sensory-profile.d.ts","sourceRoot":"","sources":["../../src/offer/sensory-profile.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,mBAAmB;IAClC,yEAAyE;IACzE,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAC7E,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,qEAAqE;IACrE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAWD,wBAAgB,cAAc,CAAC,EAC7B,cAAc,EACd,WAAW,EACX,WAAW,EACX,SAAS,GACV,EAAE,mBAAmB,kDAsCrB"}
1
+ {"version":3,"file":"sensory-profile.d.ts","sourceRoot":"","sources":["../../src/offer/sensory-profile.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,CAAC,EAAE,QAAQ,GAAG,WAAW,GAAG,OAAO,GAAG,YAAY,CAAC;CAChE;AAED,MAAM,WAAW,mBAAmB;IAClC,yEAAyE;IACzE,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACxF,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,qEAAqE;IACrE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACrD;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA6CD,wBAAgB,cAAc,CAAC,EAC7B,cAAc,EACd,WAAW,EACX,WAAW,EACX,SAAS,EACT,SAAS,GACV,EAAE,mBAAmB,kDA6DrB"}
@@ -3,12 +3,41 @@ import { cn } from "../lib/utils";
3
3
  function capitalize(s) {
4
4
  return s.charAt(0).toUpperCase() + s.slice(1).replace(/[_-]/g, " ");
5
5
  }
6
+ function isNonEmpty(value) {
7
+ if (value == null)
8
+ return false;
9
+ if (Array.isArray(value))
10
+ return value.length > 0;
11
+ return value.trim() !== "";
12
+ }
6
13
  function hasValues(fields) {
7
14
  if (!fields)
8
15
  return false;
9
- return Object.values(fields).some((v) => v != null && v.trim() !== "");
16
+ return Object.values(fields).some(isNonEmpty);
17
+ }
18
+ function resolveDisplayValue(value, fieldDef) {
19
+ if (value == null)
20
+ return { isArray: false, items: [] };
21
+ if (Array.isArray(value)) {
22
+ const items = value.filter((v) => v != null && v.trim() !== "");
23
+ if (fieldDef?.type === "enum" && fieldDef.enum && fieldDef.enumLabels) {
24
+ const resolved = items.map((item) => {
25
+ const idx = fieldDef.enum.indexOf(item);
26
+ return idx !== -1 ? fieldDef.enumLabels[idx] : capitalize(item);
27
+ });
28
+ return { isArray: true, items: resolved };
29
+ }
30
+ return { isArray: true, items };
31
+ }
32
+ // Single string — resolve enum label if applicable
33
+ if (fieldDef?.type === "enum" && fieldDef.enum && fieldDef.enumLabels) {
34
+ const idx = fieldDef.enum.indexOf(value);
35
+ const label = idx !== -1 ? fieldDef.enumLabels[idx] : capitalize(value);
36
+ return { isArray: false, items: [label] };
37
+ }
38
+ return { isArray: false, items: [value] };
10
39
  }
11
- export function SensoryProfile({ sensoryDetails, stageLabels, fieldLabels, className, }) {
40
+ export function SensoryProfile({ sensoryDetails, stageLabels, fieldLabels, fieldDefs, className, }) {
12
41
  if (!sensoryDetails)
13
42
  return null;
14
43
  const stages = Object.entries(sensoryDetails).filter(([, fields]) => hasValues(fields));
@@ -19,10 +48,24 @@ export function SensoryProfile({ sensoryDetails, stageLabels, fieldLabels, class
19
48
  return null;
20
49
  const stageLabel = stageLabels?.[stageKey] ?? capitalize(stageKey);
21
50
  const stageFieldLabels = fieldLabels?.[stageKey];
22
- const entries = Object.entries(fields).filter(([, v]) => v != null && v.trim() !== "");
51
+ const stageFieldDefs = fieldDefs?.[stageKey];
52
+ const entries = Object.entries(fields).filter(([fieldKey, v]) => {
53
+ if (!isNonEmpty(v))
54
+ return false;
55
+ // Skip deprecated fields when schema info is available
56
+ const def = stageFieldDefs?.[fieldKey];
57
+ if (def && def["x-maturity"] === "deprecated")
58
+ return false;
59
+ return true;
60
+ });
23
61
  if (entries.length === 0)
24
62
  return null;
25
- return (_jsxs("div", { className: "grid gap-2", children: [_jsx("h4", { className: "text-sm font-semibold text-foreground", children: stageLabel }), _jsx("div", { className: "grid grid-cols-2 gap-x-4 gap-y-2 sm:grid-cols-3", children: entries.map(([fieldKey, value]) => (_jsxs("div", { className: "grid gap-0.5", children: [_jsx("span", { className: "text-xs text-muted-foreground", children: stageFieldLabels?.[fieldKey] ?? capitalize(fieldKey) }), _jsx("span", { className: "text-sm text-foreground", children: value })] }, fieldKey))) })] }, stageKey));
63
+ return (_jsxs("div", { className: "grid gap-2", children: [_jsx("h4", { className: "text-sm font-semibold text-foreground", children: stageLabel }), _jsx("div", { className: "grid grid-cols-2 gap-x-4 gap-y-2 sm:grid-cols-3", children: entries.map(([fieldKey, value]) => {
64
+ const fieldDef = stageFieldDefs?.[fieldKey];
65
+ const displayLabel = stageFieldLabels?.[fieldKey] ?? fieldDef?.label ?? capitalize(fieldKey);
66
+ const { isArray, items } = resolveDisplayValue(value, fieldDef);
67
+ return (_jsxs("div", { className: "grid gap-0.5", children: [_jsx("span", { className: "text-xs text-muted-foreground", children: displayLabel }), isArray ? (_jsx("div", { className: "flex flex-wrap gap-1", children: items.map((item, i) => (_jsx("span", { className: "inline-flex rounded-full bg-primary/10 px-2 py-0.5 text-xs text-foreground", children: item }, i))) })) : (_jsx("span", { className: "text-sm text-foreground", children: items[0] }))] }, fieldKey));
68
+ }) })] }, stageKey));
26
69
  }) }));
27
70
  }
28
71
  //# sourceMappingURL=sensory-profile.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sensory-profile.js","sourceRoot":"","sources":["../../src/offer/sensory-profile.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAYlC,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,SAAS,CAAC,MAAwD;IACzE,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1B,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,EAC7B,cAAc,EACd,WAAW,EACX,WAAW,EACX,SAAS,GACW;IACpB,IAAI,CAAC,cAAc;QAAE,OAAO,IAAI,CAAC;IAEjC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAExF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAErC,OAAO,CACL,cAAK,SAAS,EAAE,EAAE,CAAC,YAAY,EAAE,SAAS,CAAC,YACxC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE;YACjC,IAAI,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC;YACzB,MAAM,UAAU,GAAG,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC;YACnE,MAAM,gBAAgB,GAAG,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC;YAEjD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAC3C,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CACxC,CAAC;YAEF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;YAEtC,OAAO,CACL,eAAoB,SAAS,EAAC,YAAY,aACxC,aAAI,SAAS,EAAC,uCAAuC,YAAE,UAAU,GAAM,EACvE,cAAK,SAAS,EAAC,iDAAiD,YAC7D,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAClC,eAAoB,SAAS,EAAC,cAAc,aAC1C,eAAM,SAAS,EAAC,+BAA+B,YAC5C,gBAAgB,EAAE,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,GAChD,EACP,eAAM,SAAS,EAAC,yBAAyB,YAAE,KAAK,GAAQ,KAJhD,QAAQ,CAKZ,CACP,CAAC,GACE,KAXE,QAAQ,CAYZ,CACP,CAAC;QACJ,CAAC,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"sensory-profile.js","sourceRoot":"","sources":["../../src/offer/sensory-profile.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cellarnode/ui",
3
- "version": "0.8.18",
3
+ "version": "0.9.1",
4
4
  "type": "module",
5
5
  "private": false,
6
6
  "description": "Shared UI components, theme tokens, and chat/offer primitives for CellarNode dashboards.",