@cellarnode/ui 0.8.19 → 0.9.2

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 (103) hide show
  1. package/dist/components/branch-overview-panel.d.ts +51 -0
  2. package/dist/components/branch-overview-panel.d.ts.map +1 -0
  3. package/dist/components/branch-overview-panel.js +48 -0
  4. package/dist/components/branch-overview-panel.js.map +1 -0
  5. package/dist/components/branch-overview-panel.stories.d.ts +16 -0
  6. package/dist/components/branch-overview-panel.stories.d.ts.map +1 -0
  7. package/dist/components/branch-overview-panel.stories.js +96 -0
  8. package/dist/components/branch-overview-panel.stories.js.map +1 -0
  9. package/dist/components/branch-resolution-modal.d.ts +31 -0
  10. package/dist/components/branch-resolution-modal.d.ts.map +1 -0
  11. package/dist/components/branch-resolution-modal.js +35 -0
  12. package/dist/components/branch-resolution-modal.js.map +1 -0
  13. package/dist/components/branch-resolution-modal.stories.d.ts +16 -0
  14. package/dist/components/branch-resolution-modal.stories.d.ts.map +1 -0
  15. package/dist/components/branch-resolution-modal.stories.js +66 -0
  16. package/dist/components/branch-resolution-modal.stories.js.map +1 -0
  17. package/dist/components/branch-resolution-modal.test.d.ts +2 -0
  18. package/dist/components/branch-resolution-modal.test.d.ts.map +1 -0
  19. package/dist/components/branch-resolution-modal.test.js +52 -0
  20. package/dist/components/branch-resolution-modal.test.js.map +1 -0
  21. package/dist/components/celebration-pulse.d.ts +21 -0
  22. package/dist/components/celebration-pulse.d.ts.map +1 -0
  23. package/dist/components/celebration-pulse.js +16 -0
  24. package/dist/components/celebration-pulse.js.map +1 -0
  25. package/dist/components/celebration-pulse.stories.d.ts +16 -0
  26. package/dist/components/celebration-pulse.stories.d.ts.map +1 -0
  27. package/dist/components/celebration-pulse.stories.js +29 -0
  28. package/dist/components/celebration-pulse.stories.js.map +1 -0
  29. package/dist/components/completed-offer-card.d.ts +34 -0
  30. package/dist/components/completed-offer-card.d.ts.map +1 -0
  31. package/dist/components/completed-offer-card.js +20 -0
  32. package/dist/components/completed-offer-card.js.map +1 -0
  33. package/dist/components/completed-offer-card.stories.d.ts +17 -0
  34. package/dist/components/completed-offer-card.stories.d.ts.map +1 -0
  35. package/dist/components/completed-offer-card.stories.js +75 -0
  36. package/dist/components/completed-offer-card.stories.js.map +1 -0
  37. package/dist/components/importer-picker-modal.d.ts +50 -0
  38. package/dist/components/importer-picker-modal.d.ts.map +1 -0
  39. package/dist/components/importer-picker-modal.js +82 -0
  40. package/dist/components/importer-picker-modal.js.map +1 -0
  41. package/dist/components/importer-picker-modal.stories.d.ts +17 -0
  42. package/dist/components/importer-picker-modal.stories.d.ts.map +1 -0
  43. package/dist/components/importer-picker-modal.stories.js +62 -0
  44. package/dist/components/importer-picker-modal.stories.js.map +1 -0
  45. package/dist/components/importer-picker-modal.test.d.ts +2 -0
  46. package/dist/components/importer-picker-modal.test.d.ts.map +1 -0
  47. package/dist/components/importer-picker-modal.test.js +51 -0
  48. package/dist/components/importer-picker-modal.test.js.map +1 -0
  49. package/dist/components/kanban-board.d.ts +19 -0
  50. package/dist/components/kanban-board.d.ts.map +1 -1
  51. package/dist/components/kanban-board.js.map +1 -1
  52. package/dist/components/kanban-dnd-board.d.ts +1 -1
  53. package/dist/components/kanban-dnd-board.d.ts.map +1 -1
  54. package/dist/components/kanban-dnd-board.js +52 -7
  55. package/dist/components/kanban-dnd-board.js.map +1 -1
  56. package/dist/components/kanban-dnd-board.stories.d.ts +1 -0
  57. package/dist/components/kanban-dnd-board.stories.d.ts.map +1 -1
  58. package/dist/components/kanban-dnd-board.stories.js +66 -0
  59. package/dist/components/kanban-dnd-board.stories.js.map +1 -1
  60. package/dist/components/kanban-dnd-board.test.d.ts +2 -0
  61. package/dist/components/kanban-dnd-board.test.d.ts.map +1 -0
  62. package/dist/components/kanban-dnd-board.test.js +34 -0
  63. package/dist/components/kanban-dnd-board.test.js.map +1 -0
  64. package/dist/components/offer-status-dots.d.ts +23 -0
  65. package/dist/components/offer-status-dots.d.ts.map +1 -0
  66. package/dist/components/offer-status-dots.js +34 -0
  67. package/dist/components/offer-status-dots.js.map +1 -0
  68. package/dist/components/offer-status-dots.stories.d.ts +19 -0
  69. package/dist/components/offer-status-dots.stories.d.ts.map +1 -0
  70. package/dist/components/offer-status-dots.stories.js +49 -0
  71. package/dist/components/offer-status-dots.stories.js.map +1 -0
  72. package/dist/components/sent-offer-card.d.ts +31 -0
  73. package/dist/components/sent-offer-card.d.ts.map +1 -0
  74. package/dist/components/sent-offer-card.js +23 -0
  75. package/dist/components/sent-offer-card.js.map +1 -0
  76. package/dist/components/sent-offer-card.stories.d.ts +17 -0
  77. package/dist/components/sent-offer-card.stories.d.ts.map +1 -0
  78. package/dist/components/sent-offer-card.stories.js +51 -0
  79. package/dist/components/sent-offer-card.stories.js.map +1 -0
  80. package/dist/hooks/use-celebration-pulse.d.ts +12 -0
  81. package/dist/hooks/use-celebration-pulse.d.ts.map +1 -0
  82. package/dist/hooks/use-celebration-pulse.js +28 -0
  83. package/dist/hooks/use-celebration-pulse.js.map +1 -0
  84. package/dist/index.d.ts +6 -1
  85. package/dist/index.d.ts.map +1 -1
  86. package/dist/index.js +7 -1
  87. package/dist/index.js.map +1 -1
  88. package/dist/lib/kanban-transitions.d.ts +62 -0
  89. package/dist/lib/kanban-transitions.d.ts.map +1 -1
  90. package/dist/lib/kanban-transitions.js +32 -0
  91. package/dist/lib/kanban-transitions.js.map +1 -1
  92. package/dist/lib/kanban-transitions.test.d.ts +2 -0
  93. package/dist/lib/kanban-transitions.test.d.ts.map +1 -0
  94. package/dist/lib/kanban-transitions.test.js +75 -0
  95. package/dist/lib/kanban-transitions.test.js.map +1 -0
  96. package/dist/offer/index.d.ts +3 -0
  97. package/dist/offer/index.d.ts.map +1 -1
  98. package/dist/offer/index.js +7 -0
  99. package/dist/offer/index.js.map +1 -1
  100. package/dist/offer/sensory-profile.d.ts.map +1 -1
  101. package/dist/offer/sensory-profile.js +1 -1
  102. package/dist/offer/sensory-profile.js.map +1 -1
  103. package/package.json +1 -1
@@ -0,0 +1,34 @@
1
+ import type { ReactNode } from "react";
2
+ export interface CompletedOfferStat {
3
+ label: string;
4
+ value: string;
5
+ }
6
+ export interface CompletedOfferCardProps {
7
+ title: string;
8
+ subtitle?: string;
9
+ sourceIcon?: ReactNode;
10
+ winnerName: string;
11
+ winnerPrice: string;
12
+ /** Winner volume — optional, omitted from layout when undefined. */
13
+ winnerVolume?: string;
14
+ /** 1–3 stats shown in the bottom row. */
15
+ stats: CompletedOfferStat[];
16
+ /** Click handler for the "View offer" link. */
17
+ onView?: () => void;
18
+ /** Click handler for the "Archive" link. */
19
+ onArchive?: () => void;
20
+ /** Disable the entrance pulse (e.g. when re-rendering an existing card). */
21
+ noPulse?: boolean;
22
+ className?: string;
23
+ }
24
+ /**
25
+ * Card representing a finalized deal in the producer Completed column.
26
+ * Shows: meta row, title, "Finalized" pill badge, winner sub-card with
27
+ * trophy icon and final terms, and a stat row.
28
+ *
29
+ * On first mount, the card emits a brief celebration pulse via
30
+ * `CelebrationPulse`. Pass `noPulse` to suppress it (e.g. when an existing
31
+ * card is being re-rendered after a state refresh, not a new arrival).
32
+ */
33
+ export declare function CompletedOfferCard({ title, subtitle, sourceIcon, winnerName, winnerPrice, winnerVolume, stats, onView, onArchive, noPulse, className, }: CompletedOfferCardProps): import("react/jsx-runtime").JSX.Element;
34
+ //# sourceMappingURL=completed-offer-card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completed-offer-card.d.ts","sourceRoot":"","sources":["../../src/components/completed-offer-card.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yCAAyC;IACzC,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,+CAA+C;IAC/C,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,KAAK,EACL,QAAQ,EACR,UAAU,EACV,UAAU,EACV,WAAW,EACX,YAAY,EACZ,KAAK,EACL,MAAM,EACN,SAAS,EACT,OAAe,EACf,SAAS,GACV,EAAE,uBAAuB,2CAgFzB"}
@@ -0,0 +1,20 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Archive, ArrowRight, CheckCircle2, Trophy } from "lucide-react";
3
+ import { cn } from "../lib/utils";
4
+ import { CelebrationPulse } from "./celebration-pulse";
5
+ /**
6
+ * Card representing a finalized deal in the producer Completed column.
7
+ * Shows: meta row, title, "Finalized" pill badge, winner sub-card with
8
+ * trophy icon and final terms, and a stat row.
9
+ *
10
+ * On first mount, the card emits a brief celebration pulse via
11
+ * `CelebrationPulse`. Pass `noPulse` to suppress it (e.g. when an existing
12
+ * card is being re-rendered after a state refresh, not a new arrival).
13
+ */
14
+ export function CompletedOfferCard({ title, subtitle, sourceIcon, winnerName, winnerPrice, winnerVolume, stats, onView, onArchive, noPulse = false, className, }) {
15
+ const card = (_jsxs("div", { className: cn("flex flex-col gap-3 rounded-lg border border-l-4 border-border border-l-emerald-500 bg-card p-3 shadow-xs", className), children: [_jsxs("div", { className: "flex items-start justify-between gap-2", children: [(sourceIcon || subtitle) && (_jsxs("div", { className: "flex items-center gap-1.5 text-xs text-muted-foreground", children: [sourceIcon, subtitle && _jsx("span", { children: subtitle })] })), _jsxs("span", { className: "inline-flex items-center gap-1 rounded-full bg-emerald-100 px-2 py-0.5 text-[10px] font-semibold text-emerald-700 dark:bg-emerald-500/10 dark:text-emerald-300", children: [_jsx(CheckCircle2, { className: "size-3", "aria-hidden": true }), "Finalized"] })] }), _jsx("h4", { className: "text-sm/5 font-semibold text-foreground", children: title }), _jsxs("div", { className: "flex items-center gap-2 rounded-md border border-emerald-200/40 bg-emerald-500/5 p-2 dark:border-emerald-400/20", children: [_jsx(Trophy, { className: "size-4 shrink-0 text-emerald-600 dark:text-emerald-400", "aria-hidden": true }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("p", { className: "truncate text-xs font-semibold text-foreground", children: winnerName }), _jsxs("p", { className: "text-xs text-muted-foreground", children: [winnerPrice, winnerVolume && _jsxs("span", { children: [" \u00B7 ", winnerVolume] })] })] })] }), stats.length > 0 && (_jsx("div", { className: "flex items-center justify-around border-t border-border pt-2", children: stats.map((stat) => (_jsxs("div", { className: "text-center", children: [_jsx("div", { className: "text-sm font-bold text-foreground", children: stat.value }), _jsx("div", { className: "text-[10px] uppercase tracking-wide text-muted-foreground", children: stat.label })] }, stat.label))) })), _jsxs("div", { className: "flex items-center justify-between text-xs", children: [onView && (_jsxs("button", { type: "button", onClick: onView, className: "inline-flex items-center gap-1 font-medium text-primary hover:text-primary/80", children: ["View offer", _jsx(ArrowRight, { className: "size-3", "aria-hidden": true })] })), onArchive && (_jsxs("button", { type: "button", onClick: onArchive, className: "inline-flex items-center gap-1 font-medium text-muted-foreground hover:text-foreground", children: [_jsx(Archive, { className: "size-3", "aria-hidden": true }), "Archive"] }))] })] }));
16
+ if (noPulse)
17
+ return card;
18
+ return _jsx(CelebrationPulse, { children: card });
19
+ }
20
+ //# sourceMappingURL=completed-offer-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completed-offer-card.js","sourceRoot":"","sources":["../../src/components/completed-offer-card.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEzE,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AA0BvD;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,EACjC,KAAK,EACL,QAAQ,EACR,UAAU,EACV,UAAU,EACV,WAAW,EACX,YAAY,EACZ,KAAK,EACL,MAAM,EACN,SAAS,EACT,OAAO,GAAG,KAAK,EACf,SAAS,GACe;IACxB,MAAM,IAAI,GAAG,CACX,eACE,SAAS,EAAE,EAAE,CACX,2GAA2G,EAC3G,SAAS,CACV,aAGD,eAAK,SAAS,EAAC,wCAAwC,aACpD,CAAC,UAAU,IAAI,QAAQ,CAAC,IAAI,CAC3B,eAAK,SAAS,EAAC,yDAAyD,aACrE,UAAU,EACV,QAAQ,IAAI,yBAAO,QAAQ,GAAQ,IAChC,CACP,EACD,gBAAM,SAAS,EAAC,gKAAgK,aAC9K,KAAC,YAAY,IAAC,SAAS,EAAC,QAAQ,wBAAe,iBAE1C,IACH,EAGN,aAAI,SAAS,EAAC,yCAAyC,YAAE,KAAK,GAAM,EAGpE,eAAK,SAAS,EAAC,iHAAiH,aAC9H,KAAC,MAAM,IAAC,SAAS,EAAC,wDAAwD,wBAAe,EACzF,eAAK,SAAS,EAAC,gBAAgB,aAC7B,YAAG,SAAS,EAAC,gDAAgD,YAAE,UAAU,GAAK,EAC9E,aAAG,SAAS,EAAC,+BAA+B,aACzC,WAAW,EACX,YAAY,IAAI,uCAAU,YAAY,IAAQ,IAC7C,IACA,IACF,EAGL,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CACnB,cAAK,SAAS,EAAC,8DAA8D,YAC1E,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACnB,eAAsB,SAAS,EAAC,aAAa,aAC3C,cAAK,SAAS,EAAC,mCAAmC,YAAE,IAAI,CAAC,KAAK,GAAO,EACrE,cAAK,SAAS,EAAC,2DAA2D,YACvE,IAAI,CAAC,KAAK,GACP,KAJE,IAAI,CAAC,KAAK,CAKd,CACP,CAAC,GACE,CACP,EAGD,eAAK,SAAS,EAAC,2CAA2C,aACvD,MAAM,IAAI,CACT,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,MAAM,EACf,SAAS,EAAC,+EAA+E,2BAGzF,KAAC,UAAU,IAAC,SAAS,EAAC,QAAQ,wBAAe,IACtC,CACV,EACA,SAAS,IAAI,CACZ,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,SAAS,EAClB,SAAS,EAAC,wFAAwF,aAElG,KAAC,OAAO,IAAC,SAAS,EAAC,QAAQ,wBAAe,eAEnC,CACV,IACG,IACF,CACP,CAAC;IAEF,IAAI,OAAO;QAAE,OAAO,IAAI,CAAC;IAEzB,OAAO,KAAC,gBAAgB,cAAE,IAAI,GAAoB,CAAC;AACrD,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { StoryObj } from "@storybook/react-vite";
2
+ import { CompletedOfferCard } from "./completed-offer-card";
3
+ declare const meta: {
4
+ title: string;
5
+ component: typeof CompletedOfferCard;
6
+ tags: string[];
7
+ parameters: {
8
+ layout: string;
9
+ };
10
+ };
11
+ export default meta;
12
+ type Story = StoryObj<typeof meta>;
13
+ export declare const Default: Story;
14
+ export declare const SingleStat: Story;
15
+ export declare const NoVolume: Story;
16
+ export declare const NoPulse: Story;
17
+ //# sourceMappingURL=completed-offer-card.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completed-offer-card.stories.d.ts","sourceRoot":"","sources":["../../src/components/completed-offer-card.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,QAAA,MAAM,IAAI;;;;;;;CAKiC,CAAC;AAE5C,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAgBrB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAYxB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAetB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAiBrB,CAAC"}
@@ -0,0 +1,75 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Sparkles } from "lucide-react";
3
+ import { CompletedOfferCard } from "./completed-offer-card";
4
+ const meta = {
5
+ title: "Components/CompletedOfferCard",
6
+ component: CompletedOfferCard,
7
+ tags: ["autodocs"],
8
+ parameters: { layout: "padded" },
9
+ };
10
+ export default meta;
11
+ export const Default = {
12
+ args: {
13
+ title: "Cabernet Sauvignon 2023",
14
+ subtitle: "Match · 5 days ago",
15
+ sourceIcon: _jsx(Sparkles, { className: "size-3", "aria-hidden": true }),
16
+ winnerName: "Berlin Spirits GmbH",
17
+ winnerPrice: "€48 / unit",
18
+ winnerVolume: "5,000 L",
19
+ stats: [
20
+ { label: "Offers sent", value: "3" },
21
+ { label: "Responded", value: "2" },
22
+ { label: "To close", value: "4d" },
23
+ ],
24
+ onView: () => alert("View offer"),
25
+ onArchive: () => alert("Archive"),
26
+ },
27
+ };
28
+ export const SingleStat = {
29
+ args: {
30
+ title: "Pinot Noir 2022",
31
+ subtitle: "Match · 1d ago",
32
+ sourceIcon: _jsx(Sparkles, { className: "size-3", "aria-hidden": true }),
33
+ winnerName: "Nordic Wine Partners",
34
+ winnerPrice: "€42 / unit",
35
+ winnerVolume: "2,000 L",
36
+ stats: [{ label: "Closed in", value: "6h" }],
37
+ onView: () => alert("View offer"),
38
+ onArchive: () => alert("Archive"),
39
+ },
40
+ };
41
+ export const NoVolume = {
42
+ args: {
43
+ title: "Riesling 2021",
44
+ subtitle: "Importer-direct · 2d ago",
45
+ sourceIcon: _jsx(Sparkles, { className: "size-3", "aria-hidden": true }),
46
+ winnerName: "Iberian Imports Co",
47
+ winnerPrice: "€35 / unit",
48
+ stats: [
49
+ { label: "Offers sent", value: "1" },
50
+ { label: "Responded", value: "1" },
51
+ { label: "To close", value: "18m" },
52
+ ],
53
+ onView: () => alert("View offer"),
54
+ onArchive: () => alert("Archive"),
55
+ },
56
+ };
57
+ export const NoPulse = {
58
+ args: {
59
+ title: "Gewürztraminer 2023",
60
+ subtitle: "Match · 1 week ago",
61
+ sourceIcon: _jsx(Sparkles, { className: "size-3", "aria-hidden": true }),
62
+ winnerName: "Tokyo Beverage Corp",
63
+ winnerPrice: "€55 / unit",
64
+ winnerVolume: "1,200 L",
65
+ stats: [
66
+ { label: "Offers sent", value: "2" },
67
+ { label: "Responded", value: "2" },
68
+ { label: "To close", value: "1d" },
69
+ ],
70
+ noPulse: true,
71
+ onView: () => alert("View offer"),
72
+ onArchive: () => alert("Archive"),
73
+ },
74
+ };
75
+ //# sourceMappingURL=completed-offer-card.stories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completed-offer-card.stories.js","sourceRoot":"","sources":["../../src/components/completed-offer-card.stories.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Modes that drive the importer picker's UX:
3
+ *
4
+ * - "monopoly": curated list (recommended importers only); multi-select up to cap
5
+ * - "locked": single importer locked by the tender's creatorOrgId; no choice
6
+ * - "open": multi-select with tabs (recommended / partnerships / search); up to cap
7
+ */
8
+ export type ImporterPickerMode = "monopoly" | "locked" | "open";
9
+ export interface ImporterPickerImporter {
10
+ id: string;
11
+ name: string;
12
+ /** Country code as a plain string, e.g. "SE", "DE". No flag emoji. */
13
+ country?: string;
14
+ /** Short specialty tags shown under the name. */
15
+ specialties?: string[];
16
+ /** Whether this importer is in an active partnership with the producer. */
17
+ isPartnership?: boolean;
18
+ /** Optional logo URL. */
19
+ logoUrl?: string;
20
+ }
21
+ export interface ImporterPickerModalProps {
22
+ open: boolean;
23
+ onOpenChange: (open: boolean) => void;
24
+ mode: ImporterPickerMode;
25
+ /** All importers visible in the picker (already filtered to the mode's pool). */
26
+ importers: ImporterPickerImporter[];
27
+ /** Required when mode === "locked" — the only importer that can be selected. */
28
+ lockedImporterId?: string;
29
+ /** Max number of importers a user can select. Use Infinity for unlimited (enterprise). */
30
+ maxSelectable: number;
31
+ /** Called when the user confirms with one or more importer IDs. */
32
+ onConfirm: (importerOrgIds: string[]) => void;
33
+ /** Override default copy. */
34
+ copy?: Partial<ImporterPickerCopy>;
35
+ }
36
+ interface ImporterPickerCopy {
37
+ monopolyTitle: string;
38
+ monopolySubtitle: string;
39
+ lockedTitle: string;
40
+ lockedSubtitle: string;
41
+ openTitle: string;
42
+ openSubtitle: string;
43
+ cancel: string;
44
+ confirm: (count: number) => string;
45
+ capWarning: (max: number) => string;
46
+ emptyState: string;
47
+ }
48
+ export declare function ImporterPickerModal({ open, onOpenChange, mode, importers, lockedImporterId, maxSelectable, onConfirm, copy: copyOverride, }: ImporterPickerModalProps): import("react/jsx-runtime").JSX.Element;
49
+ export {};
50
+ //# sourceMappingURL=importer-picker-modal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"importer-picker-modal.d.ts","sourceRoot":"","sources":["../../src/components/importer-picker-modal.tsx"],"names":[],"mappings":"AAKA;;;;;;GAMG;AACH,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEhE,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,2EAA2E;IAC3E,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,yBAAyB;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,IAAI,EAAE,kBAAkB,CAAC;IACzB,iFAAiF;IACjF,SAAS,EAAE,sBAAsB,EAAE,CAAC;IACpC,gFAAgF;IAChF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,0FAA0F;IAC1F,aAAa,EAAE,MAAM,CAAC;IACtB,mEAAmE;IACnE,SAAS,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC9C,6BAA6B;IAC7B,IAAI,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACpC;AAED,UAAU,kBAAkB;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACnC,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC;CACpB;AAoBD,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,YAAY,EACZ,IAAI,EACJ,SAAS,EACT,gBAAgB,EAChB,aAAa,EACb,SAAS,EACT,IAAI,EAAE,YAAY,GACnB,EAAE,wBAAwB,2CAqL1B"}
@@ -0,0 +1,82 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import * as Dialog from "@radix-ui/react-dialog";
3
+ import { Check, X } from "lucide-react";
4
+ import { useMemo, useState } from "react";
5
+ import { cn } from "../lib/utils";
6
+ const DEFAULT_COPY = {
7
+ monopolyTitle: "State monopoly tender",
8
+ monopolySubtitle: "Pick from recommended importers vetted by CellarNode for this market.",
9
+ lockedTitle: "Direct from importer",
10
+ lockedSubtitle: "This tender was posted by the importer below. Your offer will go to them.",
11
+ openTitle: "Send offer to importers",
12
+ openSubtitle: "Choose one or more importers to send this offer to.",
13
+ cancel: "Cancel",
14
+ confirm: (count) => count === 0
15
+ ? "Select at least one importer"
16
+ : count === 1
17
+ ? "Send to 1 importer"
18
+ : `Send to ${count} importers`,
19
+ capWarning: (max) => `Your plan allows up to ${max} importers per offer.`,
20
+ emptyState: "No recommended importers for this market yet. Contact support.",
21
+ };
22
+ export function ImporterPickerModal({ open, onOpenChange, mode, importers, lockedImporterId, maxSelectable, onConfirm, copy: copyOverride, }) {
23
+ const copy = { ...DEFAULT_COPY, ...copyOverride };
24
+ // For "locked" mode, the single locked importer is always selected and immutable.
25
+ // For other modes, selection is mutable.
26
+ const initialSelection = useMemo(() => {
27
+ if (mode === "locked" && lockedImporterId)
28
+ return [lockedImporterId];
29
+ return [];
30
+ }, [mode, lockedImporterId]);
31
+ const [selected, setSelected] = useState(initialSelection);
32
+ // Reset selection when the modal closes (so reopening starts fresh).
33
+ const handleOpenChange = (next) => {
34
+ if (!next) {
35
+ setSelected(initialSelection);
36
+ }
37
+ onOpenChange(next);
38
+ };
39
+ const toggle = (id) => {
40
+ if (mode === "locked")
41
+ return; // immutable
42
+ setSelected((prev) => {
43
+ if (prev.includes(id))
44
+ return prev.filter((x) => x !== id);
45
+ if (prev.length >= maxSelectable)
46
+ return prev; // cap
47
+ return [...prev, id];
48
+ });
49
+ };
50
+ const handleConfirm = () => {
51
+ if (selected.length === 0)
52
+ return;
53
+ onConfirm(selected);
54
+ };
55
+ const isAtCap = selected.length >= maxSelectable;
56
+ const showCapWarning = isAtCap && maxSelectable !== Infinity;
57
+ // Mode-driven header copy
58
+ const title = mode === "monopoly"
59
+ ? copy.monopolyTitle
60
+ : mode === "locked"
61
+ ? copy.lockedTitle
62
+ : copy.openTitle;
63
+ const subtitle = mode === "monopoly"
64
+ ? copy.monopolySubtitle
65
+ : mode === "locked"
66
+ ? copy.lockedSubtitle
67
+ : copy.openSubtitle;
68
+ // For locked mode, show only the locked importer
69
+ const visibleImporters = mode === "locked"
70
+ ? importers.filter((i) => i.id === lockedImporterId)
71
+ : importers;
72
+ return (_jsx(Dialog.Root, { open: open, onOpenChange: handleOpenChange, children: _jsxs(Dialog.Portal, { children: [_jsx(Dialog.Overlay, { className: "fixed inset-0 z-50 bg-black/40 backdrop-blur-sm" }), _jsxs(Dialog.Content, { className: "fixed left-1/2 top-1/2 z-50 w-full max-w-md -translate-x-1/2 -translate-y-1/2 rounded-xl border border-border bg-card p-6 shadow-xl", children: [_jsxs("div", { className: "mb-4 flex items-start justify-between", children: [_jsxs("div", { children: [_jsx(Dialog.Title, { className: "text-base font-semibold text-foreground", children: title }), _jsx(Dialog.Description, { className: "mt-1 text-xs text-muted-foreground", children: subtitle })] }), _jsx(Dialog.Close, { className: "rounded-md p-1 text-muted-foreground hover:bg-muted/50 hover:text-foreground", "aria-label": "Close", children: _jsx(X, { className: "size-4" }) })] }), visibleImporters.length === 0 ? (_jsx("p", { className: "py-8 text-center text-xs text-muted-foreground", children: copy.emptyState })) : (_jsx("div", { className: "max-h-72 space-y-2 overflow-y-auto", children: visibleImporters.map((imp) => {
73
+ const isSelected = selected.includes(imp.id);
74
+ const disabled = mode === "locked" || (!isSelected && isAtCap);
75
+ return (_jsxs("button", { type: "button", onClick: () => toggle(imp.id), disabled: mode === "locked", "aria-pressed": isSelected, className: cn("flex w-full items-center gap-3 rounded-md border p-3 text-left transition-colors", isSelected
76
+ ? "border-primary bg-primary/5"
77
+ : "border-border bg-background hover:bg-muted/30", disabled && !isSelected && "cursor-not-allowed opacity-50"), children: [mode !== "locked" && (_jsx("div", { className: cn("flex size-5 shrink-0 items-center justify-center rounded border", isSelected
78
+ ? "border-primary bg-primary text-primary-foreground"
79
+ : "border-border"), children: isSelected && _jsx(Check, { className: "size-3", "aria-hidden": true }) })), imp.logoUrl ? (_jsx("img", { src: imp.logoUrl, alt: "", className: "size-8 shrink-0 rounded-md object-cover" })) : (_jsx("div", { className: "size-8 shrink-0 rounded-md bg-muted", "aria-hidden": true })), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("p", { className: "truncate text-sm font-medium text-foreground", children: imp.name }), imp.country && (_jsx("p", { className: "text-xs text-muted-foreground", children: imp.country })), imp.specialties && imp.specialties.length > 0 && (_jsx("div", { className: "mt-1 flex flex-wrap gap-1", children: imp.specialties.map((sp) => (_jsx("span", { className: "rounded-sm bg-muted px-1.5 py-0.5 text-[10px] text-muted-foreground", children: sp }, sp))) }))] }), imp.isPartnership && (_jsx("span", { className: "rounded-full bg-emerald-100 px-2 py-0.5 text-[10px] font-semibold text-emerald-700 dark:bg-emerald-500/10 dark:text-emerald-300", children: "Partner" }))] }, imp.id));
80
+ }) })), showCapWarning && (_jsx("p", { className: "mt-3 text-xs text-amber-600 dark:text-amber-400", children: copy.capWarning(maxSelectable) })), _jsxs("div", { className: "mt-4 flex items-center justify-end gap-2 border-t border-border pt-4", children: [_jsx("button", { type: "button", onClick: () => handleOpenChange(false), className: "rounded-md px-3 py-1.5 text-xs font-medium text-foreground hover:bg-muted/50", children: copy.cancel }), _jsx("button", { type: "button", onClick: handleConfirm, disabled: selected.length === 0, className: "rounded-md bg-primary px-3 py-1.5 text-xs font-semibold text-primary-foreground hover:bg-primary/90 disabled:cursor-not-allowed disabled:opacity-50", children: copy.confirm(selected.length) })] })] })] }) }));
81
+ }
82
+ //# sourceMappingURL=importer-picker-modal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"importer-picker-modal.js","sourceRoot":"","sources":["../../src/components/importer-picker-modal.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { StoryObj } from "@storybook/react-vite";
2
+ import { ImporterPickerModal } from "./importer-picker-modal";
3
+ declare const meta: {
4
+ title: string;
5
+ component: typeof ImporterPickerModal;
6
+ tags: string[];
7
+ parameters: {
8
+ layout: string;
9
+ };
10
+ };
11
+ export default meta;
12
+ type Story = StoryObj<typeof meta>;
13
+ export declare const MonopolyMode: Story;
14
+ export declare const LockedMode: Story;
15
+ export declare const OpenMode: Story;
16
+ export declare const EmptyState: Story;
17
+ //# sourceMappingURL=importer-picker-modal.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"importer-picker-modal.stories.d.ts","sourceRoot":"","sources":["../../src/components/importer-picker-modal.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE5D,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;AA4DnC,eAAO,MAAM,YAAY,EAAE,KAG1B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAGxB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAGtB,CAAC;AAgBF,eAAO,MAAM,UAAU,EAAE,KAGxB,CAAC"}
@@ -0,0 +1,62 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { ImporterPickerModal, } from "./importer-picker-modal";
4
+ const meta = {
5
+ title: "Components/ImporterPickerModal",
6
+ component: ImporterPickerModal,
7
+ tags: ["autodocs"],
8
+ parameters: { layout: "fullscreen" },
9
+ };
10
+ export default meta;
11
+ const sampleImporters = [
12
+ {
13
+ id: "imp-1",
14
+ name: "Nordic Wine Partners AB",
15
+ country: "SE",
16
+ specialties: ["Premium wines", "Boutique"],
17
+ isPartnership: false,
18
+ },
19
+ {
20
+ id: "imp-2",
21
+ name: "Berlin Spirits GmbH",
22
+ country: "DE",
23
+ specialties: ["Spirits", "Craft"],
24
+ isPartnership: true,
25
+ },
26
+ {
27
+ id: "imp-3",
28
+ name: "Iberian Imports Co",
29
+ country: "ES",
30
+ specialties: ["Old World wines"],
31
+ isPartnership: false,
32
+ },
33
+ ];
34
+ function ModeStory({ mode }) {
35
+ const [open, setOpen] = useState(true);
36
+ const [submitted, setSubmitted] = useState(null);
37
+ return (_jsxs("div", { className: "p-6", children: [_jsx("button", { type: "button", onClick: () => setOpen(true), className: "rounded-md border border-border bg-background px-3 py-1.5 text-xs", children: "Open picker" }), submitted && (_jsxs("pre", { className: "mt-4 rounded-md bg-muted/50 p-3 text-xs", children: ["Submitted: ", JSON.stringify(submitted, null, 2)] })), _jsx(ImporterPickerModal, { open: open, onOpenChange: setOpen, mode: mode, importers: sampleImporters, lockedImporterId: mode === "locked" ? "imp-2" : undefined, maxSelectable: 3, onConfirm: (ids) => {
38
+ setSubmitted(ids);
39
+ setOpen(false);
40
+ } })] }));
41
+ }
42
+ export const MonopolyMode = {
43
+ args: { open: true, onOpenChange: () => undefined, mode: "monopoly", importers: [], maxSelectable: 3, onConfirm: () => undefined },
44
+ render: () => _jsx(ModeStory, { mode: "monopoly" }),
45
+ };
46
+ export const LockedMode = {
47
+ args: { open: true, onOpenChange: () => undefined, mode: "locked", importers: [], maxSelectable: 1, onConfirm: () => undefined },
48
+ render: () => _jsx(ModeStory, { mode: "locked" }),
49
+ };
50
+ export const OpenMode = {
51
+ args: { open: true, onOpenChange: () => undefined, mode: "open", importers: [], maxSelectable: 3, onConfirm: () => undefined },
52
+ render: () => _jsx(ModeStory, { mode: "open" }),
53
+ };
54
+ function EmptyStateStory() {
55
+ const [open, setOpen] = useState(true);
56
+ return (_jsx(ImporterPickerModal, { open: open, onOpenChange: setOpen, mode: "monopoly", importers: [], maxSelectable: 3, onConfirm: () => setOpen(false) }));
57
+ }
58
+ export const EmptyState = {
59
+ args: { open: true, onOpenChange: () => undefined, mode: "monopoly", importers: [], maxSelectable: 3, onConfirm: () => undefined },
60
+ render: () => _jsx(EmptyStateStory, {}),
61
+ };
62
+ //# sourceMappingURL=importer-picker-modal.stories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"importer-picker-modal.stories.js","sourceRoot":"","sources":["../../src/components/importer-picker-modal.stories.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=importer-picker-modal.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"importer-picker-modal.test.d.ts","sourceRoot":"","sources":["../../src/components/importer-picker-modal.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,51 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { describe, expect, test, vi } from "vitest";
3
+ import { fireEvent, render, screen } from "@testing-library/react";
4
+ import { ImporterPickerModal } from "./importer-picker-modal";
5
+ const importers = [
6
+ { id: "a", name: "Importer A" },
7
+ { id: "b", name: "Importer B" },
8
+ { id: "c", name: "Importer C" },
9
+ { id: "d", name: "Importer D" },
10
+ ];
11
+ describe("ImporterPickerModal", () => {
12
+ test("monopoly mode: multi-select up to maxSelectable", () => {
13
+ const onConfirm = vi.fn();
14
+ render(_jsx(ImporterPickerModal, { open: true, onOpenChange: () => undefined, mode: "monopoly", importers: importers, maxSelectable: 3, onConfirm: onConfirm }));
15
+ fireEvent.click(screen.getByText("Importer A"));
16
+ fireEvent.click(screen.getByText("Importer B"));
17
+ fireEvent.click(screen.getByText("Importer C"));
18
+ fireEvent.click(screen.getByRole("button", { name: /send to 3 importers/i }));
19
+ expect(onConfirm).toHaveBeenCalledWith(["a", "b", "c"]);
20
+ });
21
+ test("monopoly mode: respects cap", () => {
22
+ const onConfirm = vi.fn();
23
+ render(_jsx(ImporterPickerModal, { open: true, onOpenChange: () => undefined, mode: "monopoly", importers: importers, maxSelectable: 2, onConfirm: onConfirm }));
24
+ fireEvent.click(screen.getByText("Importer A"));
25
+ fireEvent.click(screen.getByText("Importer B"));
26
+ fireEvent.click(screen.getByText("Importer C")); // should NOT be selectable past cap
27
+ expect(screen.getByText(/up to 2 importers/i)).toBeInTheDocument();
28
+ fireEvent.click(screen.getByRole("button", { name: /send to 2 importers/i }));
29
+ expect(onConfirm).toHaveBeenCalledWith(["a", "b"]);
30
+ });
31
+ test("locked mode: pre-selects the locked importer and disables toggling", () => {
32
+ const onConfirm = vi.fn();
33
+ render(_jsx(ImporterPickerModal, { open: true, onOpenChange: () => undefined, mode: "locked", importers: importers, lockedImporterId: "b", maxSelectable: 1, onConfirm: onConfirm }));
34
+ // Only the locked importer should be visible
35
+ expect(screen.getByText("Importer B")).toBeInTheDocument();
36
+ expect(screen.queryByText("Importer A")).not.toBeInTheDocument();
37
+ expect(screen.queryByText("Importer C")).not.toBeInTheDocument();
38
+ fireEvent.click(screen.getByRole("button", { name: /send to 1 importer/i }));
39
+ expect(onConfirm).toHaveBeenCalledWith(["b"]);
40
+ });
41
+ test("confirm button is disabled when no importers selected", () => {
42
+ render(_jsx(ImporterPickerModal, { open: true, onOpenChange: () => undefined, mode: "monopoly", importers: importers, maxSelectable: 3, onConfirm: () => undefined }));
43
+ const confirmBtn = screen.getByRole("button", { name: /select at least one/i });
44
+ expect(confirmBtn).toBeDisabled();
45
+ });
46
+ test("empty state copy renders when no importers provided", () => {
47
+ render(_jsx(ImporterPickerModal, { open: true, onOpenChange: () => undefined, mode: "monopoly", importers: [], maxSelectable: 3, onConfirm: () => undefined }));
48
+ expect(screen.getByText(/no recommended importers/i)).toBeInTheDocument();
49
+ });
50
+ });
51
+ //# sourceMappingURL=importer-picker-modal.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"importer-picker-modal.test.js","sourceRoot":"","sources":["../../src/components/importer-picker-modal.test.tsx"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { type ReactNode } from "react";
2
+ import type { GateResult, GateRules } from "../lib/kanban-transitions";
2
3
  export interface KanbanColumn {
3
4
  id: string;
4
5
  title: string;
@@ -38,6 +39,24 @@ export interface KanbanBoardProps<TItem = unknown> {
38
39
  onReorder?: (itemId: string, columnId: string, targetItemId: string | null) => void | Promise<void>;
39
40
  /** Return true if moving from one column to another is allowed */
40
41
  isValidTransition?: (fromColumn: string, toColumn: string) => boolean;
42
+ /**
43
+ * Gate rules for transitions. When provided, takes precedence over
44
+ * `isValidTransition`. The consumer must also provide `onGateResult`
45
+ * to handle each gate kind (the board does NOT call `onDragEnd` from
46
+ * the gate path — the consumer dispatches the move themselves).
47
+ */
48
+ gateRules?: GateRules<TItem>;
49
+ /**
50
+ * Called instead of `onDragEnd` when `gateRules` is provided.
51
+ * The consumer inspects `result.kind` and dispatches:
52
+ * - "allowed": call your move handler
53
+ * - "blocked": no-op (or log)
54
+ * - "hard-gate": run result.check(item); on pass, call your move handler;
55
+ * on fail, fire a shake animation + toast with result.failMessage
56
+ * - "modal-gate": open the modal keyed by result.openModalKey; on confirm,
57
+ * call your move handler
58
+ */
59
+ onGateResult?: (result: GateResult<TItem>, fromColumn: string, toColumn: string, itemId: string) => void;
41
60
  /** Render a custom overlay while dragging */
42
61
  renderDragOverlay?: (item: TItem) => ReactNode;
43
62
  /** Raw onDragStart from DragDropProvider (for consumers that need low-level access) */
@@ -1 +1 @@
1
- {"version":3,"file":"kanban-board.d.ts","sourceRoot":"","sources":["../../src/components/kanban-board.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"kanban-board.d.ts","sourceRoot":"","sources":["../../src/components/kanban-board.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"kanban-board.js","sourceRoot":"","sources":["../../src/components/kanban-board.tsx"],"names":[],"mappings":";AAGA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AA+FlC,gFAAgF;AAChF,iFAAiF;AACjF,iFAAiF;AACjF,4CAA4C;AAE5C,iFAAiF;AAEjF,MAAM,UAAU,WAAW,CAAkB,KAA8B;IACzE,OAAO,KAAC,iBAAiB,OAAK,KAAK,GAAI,CAAC;AAC1C,CAAC;AAED,gFAAgF;AAEhF,SAAS,iBAAiB,CAAQ,EAChC,OAAO,EACP,iBAAiB,EACjB,SAAS,GACe;IACxB,OAAO,CACL,cACE,SAAS,EAAE,EAAE,CACX,sDAAsD,EACtD,SAAS,CACV,YAEA,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CACpB,KAAC,iBAAiB,IAAc,MAAM,EAAE,GAAG,EAAE,aAAa,EAAE,SAAS,YAClE,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,IADJ,GAAG,CAAC,EAAE,CAEV,CACrB,CAAC,GACE,CACP,CAAC;AACJ,CAAC;AAWD,MAAM,UAAU,iBAAiB,CAAC,EAChC,MAAM,EACN,QAAQ,EACR,SAAS,EACT,aAAa,GACU;IACvB,OAAO,CACL,eACE,SAAS,EAAE,EAAE,CACX,gGAAgG,EAChG,MAAM,CAAC,qBAAqB,EAC5B,SAAS,CACV,aAGD,eACE,SAAS,EAAE,EAAE,CACX,0DAA0D,EAC1D,MAAM,CAAC,eAAe,CACvB,aAGA,MAAM,CAAC,IAAI,IAAI,CACd,cACE,SAAS,EAAE,EAAE,CACX,oDAAoD,EACpD,MAAM,CAAC,aAAa,CACrB,YAEA,MAAM,CAAC,IAAI,GACR,CACP,EAGA,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,WAAW,IAAI,CACrC,cAAK,SAAS,EAAE,EAAE,CAAC,8BAA8B,EAAE,MAAM,CAAC,WAAW,CAAC,GAAI,CAC3E,EAED,eAAK,SAAS,EAAC,gBAAgB,aAC7B,aAAI,SAAS,EAAC,yCAAyC,YACpD,MAAM,CAAC,KAAK,GACV,EACJ,MAAM,CAAC,QAAQ,IAAI,CAClB,YAAG,SAAS,EAAC,+BAA+B,YAAE,MAAM,CAAC,QAAQ,GAAK,CACnE,IACG,EAEN,eACE,SAAS,EAAE,EAAE,CACX,6FAA6F,EAC7F,MAAM,CAAC,cAAc,CACtB,YAEA,MAAM,CAAC,KAAK,GACR,IACH,EAGN,cAAK,SAAS,EAAE,EAAE,CAAC,wDAAwD,EAAE,aAAa,CAAC,YACxF,MAAM,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CACpB,YAAG,SAAS,EAAC,gDAAgD,YAC1D,MAAM,CAAC,SAAS,IAAI,UAAU,GAC7B,CACL,CAAC,CAAC,CAAC,CACF,QAAQ,CACT,GACG,IACF,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"kanban-board.js","sourceRoot":"","sources":["../../src/components/kanban-board.tsx"],"names":[],"mappings":";AAGA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAwHlC,gFAAgF;AAChF,iFAAiF;AACjF,iFAAiF;AACjF,4CAA4C;AAE5C,iFAAiF;AAEjF,MAAM,UAAU,WAAW,CAAkB,KAA8B;IACzE,OAAO,KAAC,iBAAiB,OAAK,KAAK,GAAI,CAAC;AAC1C,CAAC;AAED,gFAAgF;AAEhF,SAAS,iBAAiB,CAAQ,EAChC,OAAO,EACP,iBAAiB,EACjB,SAAS,GACe;IACxB,OAAO,CACL,cACE,SAAS,EAAE,EAAE,CACX,sDAAsD,EACtD,SAAS,CACV,YAEA,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CACpB,KAAC,iBAAiB,IAAc,MAAM,EAAE,GAAG,EAAE,aAAa,EAAE,SAAS,YAClE,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,IADJ,GAAG,CAAC,EAAE,CAEV,CACrB,CAAC,GACE,CACP,CAAC;AACJ,CAAC;AAWD,MAAM,UAAU,iBAAiB,CAAC,EAChC,MAAM,EACN,QAAQ,EACR,SAAS,EACT,aAAa,GACU;IACvB,OAAO,CACL,eACE,SAAS,EAAE,EAAE,CACX,gGAAgG,EAChG,MAAM,CAAC,qBAAqB,EAC5B,SAAS,CACV,aAGD,eACE,SAAS,EAAE,EAAE,CACX,0DAA0D,EAC1D,MAAM,CAAC,eAAe,CACvB,aAGA,MAAM,CAAC,IAAI,IAAI,CACd,cACE,SAAS,EAAE,EAAE,CACX,oDAAoD,EACpD,MAAM,CAAC,aAAa,CACrB,YAEA,MAAM,CAAC,IAAI,GACR,CACP,EAGA,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,WAAW,IAAI,CACrC,cAAK,SAAS,EAAE,EAAE,CAAC,8BAA8B,EAAE,MAAM,CAAC,WAAW,CAAC,GAAI,CAC3E,EAED,eAAK,SAAS,EAAC,gBAAgB,aAC7B,aAAI,SAAS,EAAC,yCAAyC,YACpD,MAAM,CAAC,KAAK,GACV,EACJ,MAAM,CAAC,QAAQ,IAAI,CAClB,YAAG,SAAS,EAAC,+BAA+B,YAAE,MAAM,CAAC,QAAQ,GAAK,CACnE,IACG,EAEN,eACE,SAAS,EAAE,EAAE,CACX,6FAA6F,EAC7F,MAAM,CAAC,cAAc,CACtB,YAEA,MAAM,CAAC,KAAK,GACR,IACH,EAGN,cAAK,SAAS,EAAE,EAAE,CAAC,wDAAwD,EAAE,aAAa,CAAC,YACxF,MAAM,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CACpB,YAAG,SAAS,EAAC,gDAAgD,YAC1D,MAAM,CAAC,SAAS,IAAI,UAAU,GAC7B,CACL,CAAC,CAAC,CAAC,CACF,QAAQ,CACT,GACG,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -3,6 +3,6 @@
3
3
  * to avoid bundling @dnd-kit when DnD is not needed.
4
4
  */
5
5
  import { type KanbanBoardProps } from "./kanban-board";
6
- declare function KanbanDndBoard<TItem = unknown>({ columns, renderColumnCards, className, items, getItemId, getItemColumn, onDragEnd, onReorder, onDragStartRaw, onDragEndRaw, isValidTransition, renderDragOverlay, renderColumn, columnClassName, columnBodyClassName, }: KanbanBoardProps<TItem>): import("react/jsx-runtime").JSX.Element;
6
+ declare function KanbanDndBoard<TItem = unknown>({ columns, renderColumnCards, className, items, getItemId, getItemColumn, onDragEnd, onReorder, onDragStartRaw, onDragEndRaw, isValidTransition, renderDragOverlay, renderColumn, columnClassName, columnBodyClassName, gateRules, onGateResult, }: KanbanBoardProps<TItem>): import("react/jsx-runtime").JSX.Element;
7
7
  export default KanbanDndBoard;
8
8
  //# sourceMappingURL=kanban-dnd-board.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"kanban-dnd-board.d.ts","sourceRoot":"","sources":["../../src/components/kanban-dnd-board.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,OAAO,EAAqB,KAAK,gBAAgB,EAAuB,MAAM,gBAAgB,CAAC;AAI/F,iBAAS,cAAc,CAAC,KAAK,GAAG,OAAO,EAAE,EACvC,OAAO,EACP,iBAAiB,EACjB,SAAS,EACT,KAAK,EACL,SAAS,EACT,aAAa,EACb,SAAS,EACT,SAAS,EACT,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,mBAAmB,GACpB,EAAE,gBAAgB,CAAC,KAAK,CAAC,2CAoHzB;AAsFD,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"kanban-dnd-board.d.ts","sourceRoot":"","sources":["../../src/components/kanban-dnd-board.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,OAAO,EAAqB,KAAK,gBAAgB,EAAuB,MAAM,gBAAgB,CAAC;AAI/F,iBAAS,cAAc,CAAC,KAAK,GAAG,OAAO,EAAE,EACvC,OAAO,EACP,iBAAiB,EACjB,SAAS,EACT,KAAK,EACL,SAAS,EACT,aAAa,EACb,SAAS,EACT,SAAS,EACT,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,SAAS,EACT,YAAY,GACb,EAAE,gBAAgB,CAAC,KAAK,CAAC,2CAmKzB;AAsFD,eAAe,cAAc,CAAC"}