@cellarnode/ui 0.12.15 → 0.14.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.
Files changed (65) hide show
  1. package/dist/components/bottle-extract-dialog.d.ts +25 -0
  2. package/dist/components/bottle-extract-dialog.d.ts.map +1 -0
  3. package/dist/components/bottle-extract-dialog.js +87 -0
  4. package/dist/components/bottle-extract-dialog.js.map +1 -0
  5. package/dist/components/bottle-extract-dialog.stories.d.ts +17 -0
  6. package/dist/components/bottle-extract-dialog.stories.d.ts.map +1 -0
  7. package/dist/components/bottle-extract-dialog.stories.js +54 -0
  8. package/dist/components/bottle-extract-dialog.stories.js.map +1 -0
  9. package/dist/components/bottle-extraction-inline-progress.d.ts +14 -0
  10. package/dist/components/bottle-extraction-inline-progress.d.ts.map +1 -0
  11. package/dist/components/bottle-extraction-inline-progress.js +28 -0
  12. package/dist/components/bottle-extraction-inline-progress.js.map +1 -0
  13. package/dist/components/bottle-extraction-inline-progress.stories.d.ts +17 -0
  14. package/dist/components/bottle-extraction-inline-progress.stories.d.ts.map +1 -0
  15. package/dist/components/bottle-extraction-inline-progress.stories.js +35 -0
  16. package/dist/components/bottle-extraction-inline-progress.stories.js.map +1 -0
  17. package/dist/components/opportunity-brief.d.ts +23 -0
  18. package/dist/components/opportunity-brief.d.ts.map +1 -0
  19. package/dist/components/opportunity-brief.js +13 -0
  20. package/dist/components/opportunity-brief.js.map +1 -0
  21. package/dist/components/opportunity-brief.stories.d.ts +17 -0
  22. package/dist/components/opportunity-brief.stories.d.ts.map +1 -0
  23. package/dist/components/opportunity-brief.stories.js +38 -0
  24. package/dist/components/opportunity-brief.stories.js.map +1 -0
  25. package/dist/components/picker-empty-guidance.d.ts +20 -0
  26. package/dist/components/picker-empty-guidance.d.ts.map +1 -0
  27. package/dist/components/picker-empty-guidance.js +14 -0
  28. package/dist/components/picker-empty-guidance.js.map +1 -0
  29. package/dist/components/picker-empty-guidance.stories.d.ts +20 -0
  30. package/dist/components/picker-empty-guidance.stories.d.ts.map +1 -0
  31. package/dist/components/picker-empty-guidance.stories.js +33 -0
  32. package/dist/components/picker-empty-guidance.stories.js.map +1 -0
  33. package/dist/components/reason-pill.d.ts +17 -0
  34. package/dist/components/reason-pill.d.ts.map +1 -0
  35. package/dist/components/reason-pill.js +23 -0
  36. package/dist/components/reason-pill.js.map +1 -0
  37. package/dist/components/reason-pill.stories.d.ts +18 -0
  38. package/dist/components/reason-pill.stories.d.ts.map +1 -0
  39. package/dist/components/reason-pill.stories.js +18 -0
  40. package/dist/components/reason-pill.stories.js.map +1 -0
  41. package/dist/components/score-chip.d.ts +16 -0
  42. package/dist/components/score-chip.d.ts.map +1 -0
  43. package/dist/components/score-chip.js +26 -0
  44. package/dist/components/score-chip.js.map +1 -0
  45. package/dist/components/score-chip.stories.d.ts +18 -0
  46. package/dist/components/score-chip.stories.d.ts.map +1 -0
  47. package/dist/components/score-chip.stories.js +18 -0
  48. package/dist/components/score-chip.stories.js.map +1 -0
  49. package/dist/components/variant-picker-dialog.d.ts +66 -32
  50. package/dist/components/variant-picker-dialog.d.ts.map +1 -1
  51. package/dist/components/variant-picker-dialog.js +72 -81
  52. package/dist/components/variant-picker-dialog.js.map +1 -1
  53. package/dist/components/variant-picker-dialog.stories.d.ts +3 -3
  54. package/dist/components/variant-picker-dialog.stories.d.ts.map +1 -1
  55. package/dist/components/variant-picker-dialog.stories.js +133 -92
  56. package/dist/components/variant-picker-dialog.stories.js.map +1 -1
  57. package/dist/components/variant-picker-dialog.test.d.ts +2 -0
  58. package/dist/components/variant-picker-dialog.test.d.ts.map +1 -0
  59. package/dist/components/variant-picker-dialog.test.js +140 -0
  60. package/dist/components/variant-picker-dialog.test.js.map +1 -0
  61. package/dist/index.d.ts +7 -1
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +9 -1
  64. package/dist/index.js.map +1 -1
  65. package/package.json +1 -1
@@ -0,0 +1,18 @@
1
+ import type { StoryObj } from "@storybook/react-vite";
2
+ import { ReasonPill } from "./reason-pill";
3
+ declare const meta: {
4
+ title: string;
5
+ component: typeof ReasonPill;
6
+ tags: string[];
7
+ parameters: {
8
+ layout: string;
9
+ };
10
+ };
11
+ export default meta;
12
+ type Story = StoryObj<typeof meta>;
13
+ export declare const OkSubtype: Story;
14
+ export declare const OkCountry: Story;
15
+ export declare const WarnAlias: Story;
16
+ export declare const MissCountry: Story;
17
+ export declare const Row: Story;
18
+ //# sourceMappingURL=reason-pill.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reason-pill.stories.d.ts","sourceRoot":"","sources":["../../src/components/reason-pill.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,QAAA,MAAM,IAAI;;;;;;;CAKyB,CAAC;AAEpC,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,SAAS,EAAE,KAAoE,CAAC;AAC7F,eAAO,MAAM,SAAS,EAAE,KAAmE,CAAC;AAC5F,eAAO,MAAM,SAAS,EAAE,KAA2E,CAAC;AACpG,eAAO,MAAM,WAAW,EAAE,KAAqE,CAAC;AAEhG,eAAO,MAAM,GAAG,EAAE,KAYjB,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { ReasonPill } from "./reason-pill";
3
+ const meta = {
4
+ title: "Picker/ReasonPill",
5
+ component: ReasonPill,
6
+ tags: ["autodocs"],
7
+ parameters: { layout: "centered" },
8
+ };
9
+ export default meta;
10
+ export const OkSubtype = { args: { kind: "ok", signal: "subtype", label: "Brandy" } };
11
+ export const OkCountry = { args: { kind: "ok", signal: "country", label: "Spain" } };
12
+ export const WarnAlias = { args: { kind: "warn", signal: "subtype", label: "Aguardiente" } };
13
+ export const MissCountry = { args: { kind: "miss", signal: "country", label: "Spain" } };
14
+ export const Row = {
15
+ args: { kind: "ok", signal: "subtype", label: "Brandy" },
16
+ render: () => (_jsxs("div", { className: "flex flex-wrap gap-1.5 p-4", children: [_jsx(ReasonPill, { kind: "ok", signal: "subtype", label: "Brandy" }), _jsx(ReasonPill, { kind: "ok", signal: "country", label: "Spain" }), _jsx(ReasonPill, { kind: "warn", signal: "subtype", label: "Aguardiente" }), _jsx(ReasonPill, { kind: "ok", signal: "region", label: "Rioja" }), _jsx(ReasonPill, { kind: "miss", signal: "capacity", label: "low capacity" }), _jsx(ReasonPill, { kind: "miss", signal: "price", label: "below price band" })] })),
17
+ };
18
+ //# sourceMappingURL=reason-pill.stories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reason-pill.stories.js","sourceRoot":"","sources":["../../src/components/reason-pill.stories.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,MAAM,IAAI,GAAG;IACX,KAAK,EAAE,mBAAmB;IAC1B,SAAS,EAAE,UAAU;IACrB,IAAI,EAAE,CAAC,UAAU,CAAC;IAClB,UAAU,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE;CACD,CAAC;AAEpC,eAAe,IAAI,CAAC;AAGpB,MAAM,CAAC,MAAM,SAAS,GAAU,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC;AAC7F,MAAM,CAAC,MAAM,SAAS,GAAU,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC;AAC5F,MAAM,CAAC,MAAM,SAAS,GAAU,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,CAAC;AACpG,MAAM,CAAC,MAAM,WAAW,GAAU,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC;AAEhG,MAAM,CAAC,MAAM,GAAG,GAAU;IACxB,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE;IACxD,MAAM,EAAE,GAAG,EAAE,CAAC,CACZ,eAAK,SAAS,EAAC,4BAA4B,aACzC,KAAC,UAAU,IAAC,IAAI,EAAC,IAAI,EAAC,MAAM,EAAC,SAAS,EAAC,KAAK,EAAC,QAAQ,GAAG,EACxD,KAAC,UAAU,IAAC,IAAI,EAAC,IAAI,EAAC,MAAM,EAAC,SAAS,EAAC,KAAK,EAAC,OAAO,GAAG,EACvD,KAAC,UAAU,IAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,SAAS,EAAC,KAAK,EAAC,aAAa,GAAG,EAC/D,KAAC,UAAU,IAAC,IAAI,EAAC,IAAI,EAAC,MAAM,EAAC,QAAQ,EAAC,KAAK,EAAC,OAAO,GAAG,EACtD,KAAC,UAAU,IAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,UAAU,EAAC,KAAK,EAAC,cAAc,GAAG,EACjE,KAAC,UAAU,IAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,KAAK,EAAC,kBAAkB,GAAG,IAC9D,CACP;CACF,CAAC"}
@@ -0,0 +1,16 @@
1
+ export type ScoreBand = "top" | "good" | "weak";
2
+ export interface ScoreChipProps {
3
+ /** 0–100 score. Rounded for display. */
4
+ score: number;
5
+ /** Explicit band override. When omitted, derived from the score. */
6
+ band?: ScoreBand;
7
+ className?: string;
8
+ }
9
+ /**
10
+ * Compact 0–100 match-score pill, band-colored by quality.
11
+ *
12
+ * Reused by the producer journey picker and the importer AI-matches view
13
+ * — anywhere we need to surface a numeric "fit" score next to a row.
14
+ */
15
+ export declare function ScoreChip({ score, band, className }: ScoreChipProps): import("react/jsx-runtime").JSX.Element;
16
+ //# sourceMappingURL=score-chip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"score-chip.d.ts","sourceRoot":"","sources":["../../src/components/score-chip.tsx"],"names":[],"mappings":"AAEA,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAEhD,MAAM,WAAW,cAAc;IAC7B,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAcD;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,cAAc,2CAenE"}
@@ -0,0 +1,26 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cn } from "../lib/utils";
3
+ function deriveBand(score) {
4
+ if (score >= 80)
5
+ return "top";
6
+ if (score >= 50)
7
+ return "good";
8
+ return "weak";
9
+ }
10
+ const bandClasses = {
11
+ top: "bg-primary text-primary-foreground",
12
+ good: "bg-amber-500/20 text-amber-900 dark:bg-amber-400/20 dark:text-amber-200",
13
+ weak: "bg-muted text-muted-foreground",
14
+ };
15
+ /**
16
+ * Compact 0–100 match-score pill, band-colored by quality.
17
+ *
18
+ * Reused by the producer journey picker and the importer AI-matches view
19
+ * — anywhere we need to surface a numeric "fit" score next to a row.
20
+ */
21
+ export function ScoreChip({ score, band, className }) {
22
+ const b = band ?? deriveBand(score);
23
+ const display = Math.max(0, Math.min(100, Math.round(score)));
24
+ return (_jsx("span", { className: cn("inline-flex shrink-0 items-center justify-center rounded-full px-2 py-0.5 text-[10px] font-bold leading-none tabular-nums", bandClasses[b], className), "aria-label": `Match score ${display} of 100`, children: display }));
25
+ }
26
+ //# sourceMappingURL=score-chip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"score-chip.js","sourceRoot":"","sources":["../../src/components/score-chip.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAYlC,SAAS,UAAU,CAAC,KAAa;IAC/B,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,KAAK,CAAC;IAC9B,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,MAAM,CAAC;IAC/B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,WAAW,GAA8B;IAC7C,GAAG,EAAE,oCAAoC;IACzC,IAAI,EAAE,yEAAyE;IAC/E,IAAI,EAAE,gCAAgC;CACvC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAkB;IAClE,MAAM,CAAC,GAAG,IAAI,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9D,OAAO,CACL,eACE,SAAS,EAAE,EAAE,CACX,2HAA2H,EAC3H,WAAW,CAAC,CAAC,CAAC,EACd,SAAS,CACV,gBACW,eAAe,OAAO,SAAS,YAE1C,OAAO,GACH,CACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { StoryObj } from "@storybook/react-vite";
2
+ import { ScoreChip } from "./score-chip";
3
+ declare const meta: {
4
+ title: string;
5
+ component: typeof ScoreChip;
6
+ tags: string[];
7
+ parameters: {
8
+ layout: string;
9
+ };
10
+ };
11
+ export default meta;
12
+ type Story = StoryObj<typeof meta>;
13
+ export declare const Top: Story;
14
+ export declare const Good: Story;
15
+ export declare const Weak: Story;
16
+ export declare const ExplicitBand: Story;
17
+ export declare const Range: Story;
18
+ //# sourceMappingURL=score-chip.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"score-chip.stories.d.ts","sourceRoot":"","sources":["../../src/components/score-chip.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,QAAA,MAAM,IAAI;;;;;;;CAKwB,CAAC;AAEnC,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,GAAG,EAAE,KAA+B,CAAC;AAClD,eAAO,MAAM,IAAI,EAAE,KAA+B,CAAC;AACnD,eAAO,MAAM,IAAI,EAAE,KAA+B,CAAC;AACnD,eAAO,MAAM,YAAY,EAAE,KAA4C,CAAC;AAExE,eAAO,MAAM,KAAK,EAAE,KAYnB,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { ScoreChip } from "./score-chip";
3
+ const meta = {
4
+ title: "Picker/ScoreChip",
5
+ component: ScoreChip,
6
+ tags: ["autodocs"],
7
+ parameters: { layout: "centered" },
8
+ };
9
+ export default meta;
10
+ export const Top = { args: { score: 92 } };
11
+ export const Good = { args: { score: 68 } };
12
+ export const Weak = { args: { score: 22 } };
13
+ export const ExplicitBand = { args: { score: 50, band: "top" } };
14
+ export const Range = {
15
+ args: { score: 0 },
16
+ render: () => (_jsx("div", { className: "flex items-center gap-2 p-4", children: [100, 92, 80, 79, 60, 50, 49, 22, 0].map((s) => (_jsxs("div", { className: "flex flex-col items-center gap-1", children: [_jsx(ScoreChip, { score: s }), _jsx("span", { className: "text-[10px] text-muted-foreground", children: s })] }, s))) })),
17
+ };
18
+ //# sourceMappingURL=score-chip.stories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"score-chip.stories.js","sourceRoot":"","sources":["../../src/components/score-chip.stories.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,IAAI,GAAG;IACX,KAAK,EAAE,kBAAkB;IACzB,SAAS,EAAE,SAAS;IACpB,IAAI,EAAE,CAAC,UAAU,CAAC;IAClB,UAAU,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE;CACF,CAAC;AAEnC,eAAe,IAAI,CAAC;AAGpB,MAAM,CAAC,MAAM,GAAG,GAAU,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC;AAClD,MAAM,CAAC,MAAM,IAAI,GAAU,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC;AACnD,MAAM,CAAC,MAAM,IAAI,GAAU,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC;AACnD,MAAM,CAAC,MAAM,YAAY,GAAU,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;AAExE,MAAM,CAAC,MAAM,KAAK,GAAU;IAC1B,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;IAClB,MAAM,EAAE,GAAG,EAAE,CAAC,CACZ,cAAK,SAAS,EAAC,6BAA6B,YACzC,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAC/C,eAAa,SAAS,EAAC,kCAAkC,aACvD,KAAC,SAAS,IAAC,KAAK,EAAE,CAAC,GAAI,EACvB,eAAM,SAAS,EAAC,mCAAmC,YAAE,CAAC,GAAQ,KAFtD,CAAC,CAGL,CACP,CAAC,GACE,CACP;CACF,CAAC"}
@@ -1,49 +1,83 @@
1
- import * as React from "react";
2
- export interface VariantPickerItem {
1
+ import { type OpportunityBriefChip } from "./opportunity-brief";
2
+ import { type ReasonPillKind, type ReasonPillSignal } from "./reason-pill";
3
+ import { type ScoreBand } from "./score-chip";
4
+ /** A pre-ranked variant row. Host builds this from server response. */
5
+ export interface ScoredVariantDisplay {
3
6
  id: string;
4
- name: string;
5
- vintage?: string | number | null;
7
+ beverageId: string;
8
+ beverageName: string;
9
+ vintage?: number | null;
10
+ packaging?: string | null;
11
+ containerVolume?: string | number | null;
6
12
  category?: string | null;
7
13
  subtype?: string | null;
8
- beverageName?: string | null;
14
+ countryOfOrigin?: string | null;
15
+ region?: string | null;
16
+ score: number;
17
+ band: ScoreBand;
18
+ reasons: {
19
+ kind: ReasonPillKind;
20
+ signal: ReasonPillSignal;
21
+ label: string;
22
+ }[];
9
23
  }
10
- /** Opportunity context shown as a banner inside the picker. */
11
24
  export interface VariantPickerOpportunityContext {
12
25
  name: string;
13
- buyer?: string;
14
- category?: string;
15
- deadline?: string;
16
- volume?: string;
26
+ buyerName?: string | null;
27
+ chips: OpportunityBriefChip[];
28
+ }
29
+ export interface VariantPickerEmptyGuidance {
30
+ categoryLabel: string;
31
+ createLabel: string;
32
+ }
33
+ /**
34
+ * Copy/i18n overrides for the VariantPickerDialog. Pass a partial object via
35
+ * the `copy` prop; missing keys fall back to defaults. Host apps typically
36
+ * feed translated strings from their i18n layer.
37
+ */
38
+ export interface VariantPickerDialogCopy {
39
+ title: string;
40
+ description: string;
41
+ searchPlaceholder: string;
42
+ goodFitsLabel: (count: number) => string;
43
+ otherProductsLabel: string;
44
+ crossCategoryLabel: string;
45
+ loadingLabel: string;
46
+ selectButton: string;
47
+ skipButton: string;
48
+ cancelButton: string;
49
+ closestFitTag: string;
50
+ differentCategoryTag: string;
17
51
  }
18
52
  export interface VariantPickerDialogProps {
19
- /** Whether the dialog is open. */
20
53
  open: boolean;
21
- /** Called when the dialog should close. */
22
54
  onClose: () => void;
23
- /** Called when the user confirms a variant selection. */
24
- onSelect: (variant: VariantPickerItem) => void;
25
- /** Called when the user clicks "Skip — empty draft". Falls back to onClose if not provided. */
55
+ onSelect: (variantId: string) => void;
56
+ /** When provided + goodFits empty, renders PickerEmptyGuidance with this callback on the primary CTA. */
57
+ onCreateNew?: () => void;
58
+ /** Skip to empty draft. Defaults to onClose when omitted. */
26
59
  onSkip?: () => void;
27
- /** List of variants to choose from. */
28
- variants: VariantPickerItem[];
29
- /** Show a loading spinner instead of the list. */
30
- isLoading?: boolean;
31
- /** Current search input value (controlled). */
60
+ goodFits: ScoredVariantDisplay[];
61
+ crossCategory: ScoredVariantDisplay[];
62
+ opportunityContext: VariantPickerOpportunityContext;
32
63
  searchValue: string;
33
- /** Called when the search input changes. */
34
64
  onSearchChange: (value: string) => void;
35
- /** Dialog heading. @default "Select a product" */
65
+ isLoading?: boolean;
66
+ /** When provided AND goodFits.length === 0 AND onCreateNew is set, renders the empty-state CTAs. */
67
+ emptyGuidance?: VariantPickerEmptyGuidance;
68
+ /** Pre-select a variant on mount (used for the add-product round-trip). */
69
+ initialSelectedId?: string | null;
70
+ /**
71
+ * @deprecated Prefer `copy.title`. If provided, takes priority over `copy.title` for
72
+ * backward compatibility.
73
+ */
36
74
  title?: string;
37
- /** Descriptive text below the heading. */
75
+ /**
76
+ * @deprecated Prefer `copy.description`. If provided, takes priority over `copy.description`.
77
+ */
38
78
  description?: string;
39
- /** Optional custom renderer for each variant row. */
40
- renderVariant?: (variant: VariantPickerItem, isSelected: boolean) => React.ReactNode;
41
- /** Pre-filter: show matching variants first (same category). */
42
- filterCategory?: string | null;
43
- /** Pre-filter: show matching variants first (same subtype). */
44
- filterSubtype?: string | null;
45
- /** Opportunity context banner shown at the top of the dialog. */
46
- opportunityContext?: VariantPickerOpportunityContext | null;
79
+ /** Copy overrides for i18n. Missing keys fall back to English defaults. */
80
+ copy?: Partial<VariantPickerDialogCopy>;
47
81
  }
48
- export declare function VariantPickerDialog({ open, onClose, onSelect, onSkip, variants, isLoading, searchValue, onSearchChange, title, description, renderVariant, filterCategory, filterSubtype, opportunityContext, }: VariantPickerDialogProps): import("react/jsx-runtime").JSX.Element | null;
82
+ export declare function VariantPickerDialog(props: VariantPickerDialogProps): import("react/jsx-runtime").JSX.Element;
49
83
  //# sourceMappingURL=variant-picker-dialog.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"variant-picker-dialog.d.ts","sourceRoot":"","sources":["../../src/components/variant-picker-dialog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,+DAA+D;AAC/D,MAAM,WAAW,+BAA+B;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,wBAAwB;IACvC,kCAAkC;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,2CAA2C;IAC3C,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,yDAAyD;IACzD,QAAQ,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC/C,+FAA+F;IAC/F,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,uCAAuC;IACvC,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,kDAAkD;IAClD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,+CAA+C;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,4CAA4C;IAC5C,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,OAAO,KAAK,KAAK,CAAC,SAAS,CAAC;IACrF,gEAAgE;IAChE,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,+DAA+D;IAC/D,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,iEAAiE;IACjE,kBAAkB,CAAC,EAAE,+BAA+B,GAAG,IAAI,CAAC;CAC7D;AAwDD,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,SAAiB,EACjB,WAAW,EACX,cAAc,EACd,KAA0B,EAC1B,WAAW,EACX,aAAa,EACb,cAAc,EACd,aAAa,EACb,kBAAkB,GACnB,EAAE,wBAAwB,kDAsB1B"}
1
+ {"version":3,"file":"variant-picker-dialog.d.ts","sourceRoot":"","sources":["../../src/components/variant-picker-dialog.tsx"],"names":[],"mappings":"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"}
@@ -1,97 +1,88 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import * as Dialog from "@radix-ui/react-dialog";
2
3
  import * as React from "react";
4
+ import { ChevronRight, Search } from "lucide-react";
3
5
  import { cn } from "../lib/utils";
4
- // ---------------------------------------------------------------------------
5
- // Inline SVGs (no external icon dep required)
6
- // ---------------------------------------------------------------------------
7
- function SearchIcon(props) {
8
- return (_jsx("svg", { xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", strokeWidth: 1.5, stroke: "currentColor", "aria-hidden": "true", ...props, children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "m21 21-5.197-5.197m0 0A7.5 7.5 0 1 0 5.196 5.196a7.5 7.5 0 0 0 10.607 10.607Z" }) }));
9
- }
10
- function SpinnerIcon(props) {
11
- return (_jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", "aria-hidden": "true", ...props, children: [_jsx("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), _jsx("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" })] }));
12
- }
6
+ import { OpportunityBrief } from "./opportunity-brief";
7
+ import { PickerEmptyGuidance } from "./picker-empty-guidance";
8
+ import { ReasonPill } from "./reason-pill";
9
+ import { ScoreChip } from "./score-chip";
10
+ const DEFAULT_COPY = {
11
+ title: "Pick a product for this tender",
12
+ description: "Ranked by how well each fits the opportunity",
13
+ searchPlaceholder: "Search your portfolio...",
14
+ goodFitsLabel: (n) => `Good fits · ${n}`,
15
+ otherProductsLabel: "Other portfolio products",
16
+ crossCategoryLabel: "Cross-category",
17
+ loadingLabel: "Ranking your portfolio…",
18
+ selectButton: "Select & pre-fill",
19
+ skipButton: "Skip — empty draft",
20
+ cancelButton: "Cancel",
21
+ closestFitTag: "· closest fit",
22
+ differentCategoryTag: "· different category",
23
+ };
13
24
  // ---------------------------------------------------------------------------
14
25
  // Component
15
26
  // ---------------------------------------------------------------------------
16
- export function VariantPickerDialog({ open, onClose, onSelect, onSkip, variants, isLoading = false, searchValue, onSearchChange, title = "Select a product", description, renderVariant, filterCategory, filterSubtype, opportunityContext, }) {
17
- if (!open)
18
- return null;
19
- // VariantPickerContent unmounts when open becomes false, so its state
20
- // (selectedId, showOtherProducts) resets automatically on each open.
21
- return (_jsx(VariantPickerContent, { variants: variants, onSelect: onSelect, onClose: onClose, onSkip: onSkip, searchValue: searchValue, onSearchChange: onSearchChange, isLoading: isLoading, title: title, description: description, renderVariant: renderVariant, filterCategory: filterCategory, filterSubtype: filterSubtype, opportunityContext: opportunityContext }));
27
+ export function VariantPickerDialog(props) {
28
+ // Radix manages mount/unmount via `open`; we still gate the inner content so
29
+ // its local state resets on each open.
30
+ return (_jsx(Dialog.Root, { open: props.open, onOpenChange: (next) => {
31
+ if (!next)
32
+ props.onClose();
33
+ }, children: props.open ? _jsx(VariantPickerContent, { ...props }) : null }));
22
34
  }
23
- function VariantPickerContent({ variants, onSelect, onClose, onSkip, searchValue, onSearchChange, isLoading, title, description, renderVariant, filterCategory, filterSubtype, opportunityContext, }) {
24
- const [selectedId, setSelectedId] = React.useState(null);
25
- const [showOtherProducts, setShowOtherProducts] = React.useState(false);
26
- // Split variants into matching/other groups when filterCategory is set
27
- const hasFilter = !!filterCategory;
28
- const matchingVariants = hasFilter
29
- ? variants.filter((v) => {
30
- const catMatch = v.category?.toLowerCase() === filterCategory?.toLowerCase();
31
- if (!filterSubtype)
32
- return catMatch;
33
- return catMatch && v.subtype?.toLowerCase() === filterSubtype?.toLowerCase();
34
- })
35
- : variants;
36
- const otherVariants = hasFilter
37
- ? variants.filter((v) => !matchingVariants.includes(v))
38
- : [];
39
- const selectedVariant = variants.find((v) => v.id === selectedId) ?? null;
40
- const handleSelect = () => {
41
- if (selectedVariant) {
42
- onSelect(selectedVariant);
43
- onClose();
44
- }
45
- };
46
- const handleSkip = () => {
47
- if (onSkip) {
48
- onSkip();
35
+ function VariantPickerContent({ onClose, onSelect, onCreateNew, onSkip, goodFits, crossCategory, opportunityContext, searchValue, onSearchChange, isLoading, emptyGuidance, initialSelectedId, title, description, copy, }) {
36
+ // Merge copy overrides with defaults. Legacy `title`/`description` props
37
+ // take priority for backward compatibility with existing call sites.
38
+ const c = { ...DEFAULT_COPY, ...copy };
39
+ const resolvedTitle = title ?? c.title;
40
+ const resolvedDescription = description ?? c.description;
41
+ const [selectedId, setSelectedId] = React.useState(initialSelectedId ?? null);
42
+ // Cross-category starts expanded when there are no good fits, so producers
43
+ // see their portfolio without extra clicks in the empty case.
44
+ const [showCross, setShowCross] = React.useState(goodFits.length === 0);
45
+ // Round-trip auto-select: producer returned from add-product → updates
46
+ // initialSelectedId. Re-sync during render (not in an effect) per React's
47
+ // "storing information from previous renders" pattern.
48
+ const [prevInitialSelectedId, setPrevInitialSelectedId] = React.useState(initialSelectedId);
49
+ if (initialSelectedId !== prevInitialSelectedId) {
50
+ setPrevInitialSelectedId(initialSelectedId);
51
+ if (initialSelectedId) {
52
+ setSelectedId(initialSelectedId);
49
53
  }
50
- else {
54
+ }
55
+ const confirm = () => {
56
+ if (selectedId) {
57
+ onSelect(selectedId);
51
58
  onClose();
52
59
  }
53
60
  };
54
- const handleBackdropClick = (e) => {
55
- if (e.target === e.currentTarget) {
56
- onClose();
57
- }
58
- };
59
- const handleKeyDown = (e) => {
60
- if (e.key === "Escape") {
61
- onClose();
62
- }
63
- };
64
- return (_jsxs("div", { className: "fixed inset-0 z-50 flex items-center justify-center p-4", onKeyDown: handleKeyDown, children: [_jsx("div", { className: "absolute inset-0 bg-foreground/20 backdrop-blur-xs", onClick: handleBackdropClick, "aria-hidden": "true" }), _jsxs("div", { role: "dialog", "aria-modal": "true", "aria-label": title, className: cn("glass-panel relative z-10 flex max-h-[min(32rem,80dvh)] w-full max-w-md flex-col", "rounded-2xl border border-primary/6 p-0", "animate-fade-in"), children: [_jsxs("div", { className: "shrink-0 px-5 pt-5 pb-3", children: [_jsx("h2", { className: "text-base/6 font-semibold text-foreground", children: title }), description && (_jsx("p", { className: "mt-1 text-sm/5 text-muted-foreground", children: description })), _jsxs("div", { className: "relative mt-3", children: [_jsx(SearchIcon, { className: "pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground" }), _jsx("input", { type: "text", value: searchValue, onChange: (e) => onSearchChange(e.target.value), placeholder: "Search variants...", autoFocus: true, className: cn("w-full rounded-xl border border-primary/6 bg-muted/30 py-2 pl-9 pr-3", "text-sm/5 text-foreground placeholder:text-muted-foreground/60", "outline-hidden focus:border-primary/20 focus:ring-1 focus:ring-primary/20", "transition-colors") })] })] }), opportunityContext && (_jsxs("div", { className: "mx-3 mb-2 rounded-xl border border-primary/10 bg-primary/4 px-4 py-3", children: [_jsx("p", { className: "text-xs font-medium uppercase tracking-wider text-primary/70", children: "Opportunity" }), _jsx("p", { className: "mt-0.5 text-sm/5 font-medium text-foreground", children: opportunityContext.name }), _jsxs("div", { className: "mt-1.5 flex flex-wrap gap-x-4 gap-y-0.5 text-xs text-muted-foreground", children: [opportunityContext.buyer && _jsxs("span", { children: ["Buyer: ", opportunityContext.buyer] }), opportunityContext.category && _jsxs("span", { children: ["Category: ", opportunityContext.category] }), opportunityContext.volume && _jsxs("span", { children: ["Volume: ", opportunityContext.volume] }), opportunityContext.deadline && _jsxs("span", { children: ["Deadline: ", opportunityContext.deadline] })] })] })), _jsx("div", { className: "min-h-0 flex-1 overflow-y-auto px-3 pb-1", children: isLoading ? (_jsxs("div", { className: "flex flex-col items-center justify-center py-12", children: [_jsx(SpinnerIcon, { className: "size-6 animate-spin text-primary" }), _jsx("p", { className: "mt-3 text-sm/5 text-muted-foreground", children: "Loading variants..." })] })) : variants.length === 0 ? (_jsxs("div", { className: "flex flex-col items-center justify-center py-12 text-center", children: [_jsx("p", { className: "text-sm/5 font-medium text-foreground", children: "No variants found" }), _jsx("p", { className: "mt-1 text-xs/4 text-muted-foreground", children: searchValue
65
- ? "Try a different search term"
66
- : "No beverage variants are available yet" })] })) : (_jsxs("div", { className: "flex flex-col gap-1.5", children: [matchingVariants.map((variant) => {
67
- const isSelected = variant.id === selectedId;
68
- return (_jsx("button", { type: "button", onClick: () => setSelectedId(variant.id), className: cn("w-full rounded-xl border px-3.5 py-2.5 text-left transition-colors", isSelected
69
- ? "border-primary/20 bg-primary/5"
70
- : "border-transparent hover:bg-muted/40"), children: renderVariant ? (renderVariant(variant, isSelected)) : (_jsx(DefaultVariantRow, { variant: variant, isSelected: isSelected })) }, variant.id));
71
- }), hasFilter && otherVariants.length > 0 && (_jsxs(_Fragment, { children: [_jsxs("button", { type: "button", onClick: () => setShowOtherProducts((prev) => !prev), className: "mt-2 flex w-full items-center gap-2 rounded-lg px-3 py-2 text-left text-xs font-medium text-muted-foreground transition-colors hover:text-foreground", children: [_jsx("svg", { xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", strokeWidth: 2, stroke: "currentColor", className: cn("size-3 transition-transform", showOtherProducts && "rotate-90"), children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "m8.25 4.5 7.5 7.5-7.5 7.5" }) }), "Other products (", otherVariants.length, ")"] }), showOtherProducts &&
72
- otherVariants.map((variant) => {
73
- const isSelected = variant.id === selectedId;
74
- return (_jsx("button", { type: "button", onClick: () => setSelectedId(variant.id), className: cn("w-full rounded-xl border px-3.5 py-2.5 text-left transition-colors", isSelected
75
- ? "border-primary/20 bg-primary/5"
76
- : "border-transparent hover:bg-muted/40"), children: renderVariant ? (renderVariant(variant, isSelected)) : (_jsx(DefaultVariantRow, { variant: variant, isSelected: isSelected })) }, variant.id));
77
- })] }))] })) }), _jsx("div", { className: "shrink-0 border-t border-primary/6 px-5 py-3", children: _jsxs("div", { className: "flex items-center justify-end gap-2.5", children: [_jsx("button", { type: "button", onClick: handleSkip, className: cn("rounded-xl px-4 py-2 text-sm/5 font-medium text-muted-foreground", "transition-colors hover:bg-muted/40 hover:text-foreground"), children: "Skip \u2014 empty draft" }), _jsx("button", { type: "button", onClick: handleSelect, disabled: !selectedVariant, className: cn("rounded-xl px-4 py-2 text-sm/5 font-medium text-primary-foreground", "bg-[var(--color-brand-primary,oklch(0.35_0.062_178))]", "transition-colors", selectedVariant
78
- ? "hover:brightness-110"
79
- : "cursor-not-allowed opacity-50"), children: "Select & pre-fill" })] }) })] })] }));
61
+ const skip = () => (onSkip ? onSkip() : onClose());
62
+ const showEmptyGuidance = goodFits.length === 0 && emptyGuidance != null && onCreateNew != null;
63
+ return (_jsxs(Dialog.Portal, { children: [_jsx(Dialog.Overlay, { className: "fixed inset-0 z-50 bg-foreground/20 backdrop-blur-xs" }), _jsxs(Dialog.Content, { className: cn("glass-panel fixed left-1/2 top-1/2 z-50 flex max-h-[min(36rem,85dvh)] w-[calc(100%-2rem)] max-w-lg -translate-x-1/2 -translate-y-1/2 flex-col", "rounded-2xl border border-border bg-card p-0 shadow-xl"), children: [_jsxs("div", { className: "shrink-0 px-5 pt-5 pb-3", children: [_jsx(Dialog.Title, { className: "text-base/6 font-semibold text-foreground", children: resolvedTitle }), _jsx(Dialog.Description, { className: "mt-1 text-sm/5 text-muted-foreground", children: resolvedDescription })] }), _jsx("div", { className: "px-3", children: _jsx(OpportunityBrief, { name: opportunityContext.name, buyerName: opportunityContext.buyerName ?? null, chips: opportunityContext.chips }) }), _jsx("div", { className: "px-3 pt-2", children: _jsxs("div", { className: "relative", children: [_jsx(Search, { className: "pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground", "aria-hidden": true }), _jsx("input", { type: "text", value: searchValue, onChange: (e) => onSearchChange(e.target.value), placeholder: c.searchPlaceholder, autoFocus: true, className: "w-full rounded-xl border border-border bg-muted/30 py-2 pl-9 pr-3 text-sm/5 text-foreground placeholder:text-muted-foreground/60 outline-none transition-colors focus:border-primary/40 focus:ring-2 focus:ring-primary/20" })] }) }), _jsx("div", { className: "min-h-0 flex-1 overflow-y-auto px-3 pt-3 pb-1", children: isLoading ? (_jsx("div", { className: "flex flex-col items-center justify-center py-12", children: _jsx("p", { className: "text-sm/5 text-muted-foreground", children: c.loadingLabel }) })) : (_jsxs(_Fragment, { children: [_jsx(SectionLabel, { label: c.goodFitsLabel(goodFits.length), emphasis: goodFits.length > 0 }), showEmptyGuidance ? (_jsx(PickerEmptyGuidance, { categoryLabel: emptyGuidance.categoryLabel, createLabel: emptyGuidance.createLabel, onCreate: onCreateNew, onSkip: skip, className: "mt-2" })) : (_jsx("div", { className: "mt-2 flex flex-col gap-1.5", children: goodFits.map((v, i) => (_jsx(VariantRow, { variant: v, isSelected: v.id === selectedId, isTop: i === 0, onSelect: () => setSelectedId(v.id), closestFitTag: c.closestFitTag, differentCategoryTag: c.differentCategoryTag }, v.id))) })), crossCategory.length > 0 && (_jsxs(_Fragment, { children: [_jsxs("button", { type: "button", onClick: () => setShowCross((s) => !s), className: "mt-3 flex w-full items-center gap-1.5 rounded-md px-2 py-1.5 text-left text-[11px] font-semibold text-muted-foreground transition-colors hover:text-foreground focus:outline-none focus-visible:ring-2 focus-visible:ring-primary/50 focus-visible:ring-offset-2 focus-visible:ring-offset-card", children: [_jsx(ChevronRight, { className: cn("size-3 transition-transform", showCross && "rotate-90"), "aria-hidden": true }), goodFits.length === 0 ? c.crossCategoryLabel : c.otherProductsLabel, _jsxs("span", { className: "ml-1", children: ["(", crossCategory.length, ")"] })] }), showCross && (_jsx("div", { className: "mt-1.5 flex flex-col gap-1.5 rounded-xl bg-muted/20 p-1.5", children: crossCategory.map((v) => (_jsx(VariantRow, { variant: v, isSelected: v.id === selectedId, isCrossCategory: true, onSelect: () => setSelectedId(v.id), closestFitTag: c.closestFitTag, differentCategoryTag: c.differentCategoryTag }, v.id))) }))] }))] })) }), _jsx("div", { className: "shrink-0 border-t border-border px-5 py-3", children: _jsxs("div", { className: "flex items-center justify-end gap-2.5", children: [showEmptyGuidance ? (_jsx("button", { type: "button", onClick: onClose, className: "rounded-xl px-4 py-2 text-sm/5 font-medium text-muted-foreground transition-colors hover:bg-muted/40 hover:text-foreground focus:outline-none focus-visible:ring-2 focus-visible:ring-primary/50 focus-visible:ring-offset-2 focus-visible:ring-offset-card", children: c.cancelButton })) : (_jsx("button", { type: "button", onClick: skip, className: "rounded-xl px-4 py-2 text-sm/5 font-medium text-muted-foreground transition-colors hover:bg-muted/40 hover:text-foreground focus:outline-none focus-visible:ring-2 focus-visible:ring-primary/50 focus-visible:ring-offset-2 focus-visible:ring-offset-card", children: c.skipButton })), _jsx("button", { type: "button", onClick: confirm, disabled: !selectedId, className: cn("rounded-xl bg-primary px-4 py-2 text-sm/5 font-medium text-primary-foreground transition-[filter] focus:outline-none focus-visible:ring-2 focus-visible:ring-primary/50 focus-visible:ring-offset-2 focus-visible:ring-offset-card", selectedId ? "hover:brightness-110" : "cursor-not-allowed opacity-50"), children: c.selectButton })] }) })] })] }));
80
64
  }
81
65
  // ---------------------------------------------------------------------------
82
- // Default variant row renderer
66
+ // Helpers
83
67
  // ---------------------------------------------------------------------------
84
- function DefaultVariantRow({ variant, isSelected, }) {
85
- const displayName = variant.beverageName
86
- ? `${variant.beverageName} — ${variant.name}`
87
- : variant.name;
88
- const pills = [];
89
- if (variant.category)
90
- pills.push(variant.category);
91
- if (variant.subtype)
92
- pills.push(variant.subtype);
93
- return (_jsxs("div", { className: "flex items-start gap-3", children: [_jsx("span", { className: cn("mt-0.5 flex size-4 shrink-0 items-center justify-center rounded-full border-2 transition-colors", isSelected
94
- ? "border-primary bg-primary"
95
- : "border-muted-foreground/30"), children: isSelected && _jsx("span", { className: "size-1.5 rounded-full bg-primary-foreground" }) }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("p", { className: "truncate text-sm/5 font-medium text-foreground", children: [displayName, variant.vintage != null && (_jsx("span", { className: "ml-1.5 text-muted-foreground", children: variant.vintage }))] }), pills.length > 0 && (_jsx("div", { className: "mt-1 flex flex-wrap gap-1", children: pills.map((pill) => (_jsx("span", { className: "rounded-full bg-muted/50 px-2 py-0.5 text-[10px] font-medium text-muted-foreground", children: pill }, pill))) }))] })] }));
68
+ function SectionLabel({ label, emphasis }) {
69
+ return (_jsx("p", { className: cn("text-[10px] font-bold uppercase tracking-[0.06em]", emphasis ? "text-primary" : "text-muted-foreground"), children: label }));
70
+ }
71
+ function VariantRow({ variant, isSelected, isTop, isCrossCategory, onSelect, closestFitTag, differentCategoryTag, }) {
72
+ const meta = [
73
+ variant.countryOfOrigin,
74
+ variant.containerVolume ? `${variant.containerVolume}` : null,
75
+ variant.vintage != null ? `${variant.vintage}` : null,
76
+ variant.packaging,
77
+ ]
78
+ .filter(Boolean)
79
+ .join(" · ");
80
+ return (_jsxs("button", { type: "button", onClick: onSelect, "aria-pressed": isSelected, className: cn("flex w-full items-center gap-2.5 rounded-xl border px-3 py-2.5 text-left transition-colors", "focus:outline-none focus-visible:ring-2 focus-visible:ring-primary/50 focus-visible:ring-offset-2 focus-visible:ring-offset-card", isSelected
81
+ ? "border-primary bg-primary/5"
82
+ : isTop
83
+ ? "border-primary/60 shadow-[0_0_0_2px] shadow-primary/10 hover:bg-muted/30"
84
+ : "border-border hover:bg-muted/30"), children: [_jsx("span", { className: cn("size-3.5 shrink-0 rounded-full border-2 transition-colors", isSelected
85
+ ? "border-primary bg-primary shadow-[inset_0_0_0_2.5px] shadow-background"
86
+ : "border-muted-foreground/40"), "aria-hidden": true }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("p", { className: "truncate text-[12px] font-semibold text-foreground", children: [variant.beverageName, isTop && !isCrossCategory && (_jsx("span", { className: "ml-1.5 text-[10px] font-medium text-primary", children: closestFitTag })), isCrossCategory && (_jsx("span", { className: "ml-1.5 text-[10px] font-medium text-warning-foreground", children: differentCategoryTag }))] }), meta && _jsx("p", { className: "text-[10px] text-muted-foreground", children: meta }), variant.reasons.length > 0 && (_jsx("div", { className: "mt-1 flex flex-wrap gap-1", children: variant.reasons.map((r) => (_jsx(ReasonPill, { kind: r.kind, signal: r.signal, label: r.label }, `${r.kind}-${r.signal}-${r.label}`))) }))] }), _jsx(ScoreChip, { score: variant.score, band: variant.band })] }));
96
87
  }
97
88
  //# sourceMappingURL=variant-picker-dialog.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"variant-picker-dialog.js","sourceRoot":"","sources":["../../src/components/variant-picker-dialog.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"variant-picker-dialog.js","sourceRoot":"","sources":["../../src/components/variant-picker-dialog.tsx"],"names":[],"mappings":"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"}
@@ -10,8 +10,8 @@ declare const meta: {
10
10
  };
11
11
  export default meta;
12
12
  type Story = StoryObj<typeof meta>;
13
- export declare const Default: Story;
13
+ export declare const WithMatches: Story;
14
+ export declare const NoMatches: Story;
14
15
  export declare const Loading: Story;
15
- export declare const Empty: Story;
16
- export declare const CustomTitle: Story;
16
+ export declare const NoMatchesNoCross: Story;
17
17
  //# sourceMappingURL=variant-picker-dialog.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"variant-picker-dialog.stories.d.ts","sourceRoot":"","sources":["../../src/components/variant-picker-dialog.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAAE,mBAAmB,EAA0B,MAAM,yBAAyB,CAAC;AA6CtF,QAAA,MAAM,IAAI;;;;;;;CAKkC,CAAC;AAE7C,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AA6CnC,eAAO,MAAM,OAAO,EAAE,KAUrB,CAAC;AAsBF,eAAO,MAAM,OAAO,EAAE,KAWrB,CAAC;AAsBF,eAAO,MAAM,KAAK,EAAE,KAUnB,CAAC;AAsBF,eAAO,MAAM,WAAW,EAAE,KAYzB,CAAC"}
1
+ {"version":3,"file":"variant-picker-dialog.stories.d.ts","sourceRoot":"","sources":["../../src/components/variant-picker-dialog.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAG5D,OAAO,EACL,mBAAmB,EAGpB,MAAM,yBAAyB,CAAC;AAEjC,QAAA,MAAM,IAAI;;;;;;;CAKkC,CAAC;AAE7C,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAqFnC,eAAO,MAAM,WAAW,EAAE,KAsBzB,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KA2BvB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAcrB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAsB9B,CAAC"}