@cellarnode/ui 0.5.4 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/globe/electron-arc.d.ts.map +1 -1
- package/dist/globe/electron-arc.js +17 -14
- package/dist/globe/electron-arc.js.map +1 -1
- package/dist/globe/globe-halo.js +2 -2
- package/dist/globe/globe-scene.d.ts.map +1 -1
- package/dist/globe/globe-scene.js +30 -23
- package/dist/globe/globe-scene.js.map +1 -1
- package/dist/globe/globe-theme.d.ts +9 -0
- package/dist/globe/globe-theme.d.ts.map +1 -1
- package/dist/globe/globe-theme.js +54 -9
- package/dist/globe/globe-theme.js.map +1 -1
- package/dist/globe/globe-types.d.ts +2 -2
- package/dist/globe/globe-types.d.ts.map +1 -1
- package/dist/globe/globe-view.d.ts.map +1 -1
- package/dist/globe/globe-view.js +51 -3
- package/dist/globe/globe-view.js.map +1 -1
- package/dist/globe/globe-view.stories.d.ts +1 -0
- package/dist/globe/globe-view.stories.d.ts.map +1 -1
- package/dist/globe/globe-view.stories.js +12 -0
- package/dist/globe/globe-view.stories.js.map +1 -1
- package/dist/profile/about-section.d.ts +8 -0
- package/dist/profile/about-section.d.ts.map +1 -0
- package/dist/profile/about-section.js +11 -0
- package/dist/profile/about-section.js.map +1 -0
- package/dist/profile/about-section.stories.d.ts +16 -0
- package/dist/profile/about-section.stories.d.ts.map +1 -0
- package/dist/profile/about-section.stories.js +22 -0
- package/dist/profile/about-section.stories.js.map +1 -0
- package/dist/profile/beverage-expertise.d.ts +9 -0
- package/dist/profile/beverage-expertise.d.ts.map +1 -0
- package/dist/profile/beverage-expertise.js +11 -0
- package/dist/profile/beverage-expertise.js.map +1 -0
- package/dist/profile/beverage-expertise.stories.d.ts +15 -0
- package/dist/profile/beverage-expertise.stories.d.ts.map +1 -0
- package/dist/profile/beverage-expertise.stories.js +18 -0
- package/dist/profile/beverage-expertise.stories.js.map +1 -0
- package/dist/profile/business-details.d.ts +14 -0
- package/dist/profile/business-details.d.ts.map +1 -0
- package/dist/profile/business-details.js +8 -0
- package/dist/profile/business-details.js.map +1 -0
- package/dist/profile/business-details.stories.d.ts +14 -0
- package/dist/profile/business-details.stories.d.ts.map +1 -0
- package/dist/profile/business-details.stories.js +18 -0
- package/dist/profile/business-details.stories.js.map +1 -0
- package/dist/profile/certifications-card.d.ts +12 -0
- package/dist/profile/certifications-card.d.ts.map +1 -0
- package/dist/profile/certifications-card.js +6 -0
- package/dist/profile/certifications-card.js.map +1 -0
- package/dist/profile/certifications-card.stories.d.ts +15 -0
- package/dist/profile/certifications-card.stories.d.ts.map +1 -0
- package/dist/profile/certifications-card.stories.js +19 -0
- package/dist/profile/certifications-card.stories.js.map +1 -0
- package/dist/profile/index.d.ts +10 -0
- package/dist/profile/index.d.ts.map +1 -1
- package/dist/profile/index.js +10 -0
- package/dist/profile/index.js.map +1 -1
- package/dist/profile/market-reach.d.ts +7 -0
- package/dist/profile/market-reach.d.ts.map +1 -0
- package/dist/profile/market-reach.js +25 -0
- package/dist/profile/market-reach.js.map +1 -0
- package/dist/profile/market-reach.stories.d.ts +16 -0
- package/dist/profile/market-reach.stories.d.ts.map +1 -0
- package/dist/profile/market-reach.stories.js +18 -0
- package/dist/profile/market-reach.stories.js.map +1 -0
- package/dist/profile/org-profile-page.stories.d.ts +13 -0
- package/dist/profile/org-profile-page.stories.d.ts.map +1 -0
- package/dist/profile/org-profile-page.stories.js +52 -0
- package/dist/profile/org-profile-page.stories.js.map +1 -0
- package/dist/profile/portfolio-showcase.d.ts +27 -0
- package/dist/profile/portfolio-showcase.d.ts.map +1 -0
- package/dist/profile/portfolio-showcase.js +17 -0
- package/dist/profile/portfolio-showcase.js.map +1 -0
- package/dist/profile/portfolio-showcase.stories.d.ts +16 -0
- package/dist/profile/portfolio-showcase.stories.d.ts.map +1 -0
- package/dist/profile/portfolio-showcase.stories.js +24 -0
- package/dist/profile/portfolio-showcase.stories.js.map +1 -0
- package/dist/profile/profile-bento-grid.d.ts +12 -0
- package/dist/profile/profile-bento-grid.d.ts.map +1 -0
- package/dist/profile/profile-bento-grid.js +9 -0
- package/dist/profile/profile-bento-grid.js.map +1 -0
- package/dist/profile/profile-cta.d.ts +12 -0
- package/dist/profile/profile-cta.d.ts.map +1 -0
- package/dist/profile/profile-cta.js +24 -0
- package/dist/profile/profile-cta.js.map +1 -0
- package/dist/profile/profile-cta.stories.d.ts +17 -0
- package/dist/profile/profile-cta.stories.d.ts.map +1 -0
- package/dist/profile/profile-cta.stories.js +21 -0
- package/dist/profile/profile-cta.stories.js.map +1 -0
- package/dist/profile/profile-hero.d.ts +16 -0
- package/dist/profile/profile-hero.d.ts.map +1 -0
- package/dist/profile/profile-hero.js +19 -0
- package/dist/profile/profile-hero.js.map +1 -0
- package/dist/profile/profile-hero.stories.d.ts +16 -0
- package/dist/profile/profile-hero.stories.d.ts.map +1 -0
- package/dist/profile/profile-hero.stories.js +33 -0
- package/dist/profile/profile-hero.stories.js.map +1 -0
- package/dist/profile/stats-ribbon.d.ts +11 -0
- package/dist/profile/stats-ribbon.d.ts.map +1 -0
- package/dist/profile/stats-ribbon.js +16 -0
- package/dist/profile/stats-ribbon.js.map +1 -0
- package/dist/profile/stats-ribbon.stories.d.ts +15 -0
- package/dist/profile/stats-ribbon.stories.d.ts.map +1 -0
- package/dist/profile/stats-ribbon.stories.js +28 -0
- package/dist/profile/stats-ribbon.stories.js.map +1 -0
- package/package.json +37 -9
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
interface Award {
|
|
2
|
+
name: string;
|
|
3
|
+
level?: string;
|
|
4
|
+
}
|
|
5
|
+
interface Variant {
|
|
6
|
+
id: string;
|
|
7
|
+
vintage?: number | null;
|
|
8
|
+
imageUrl?: string | null;
|
|
9
|
+
awards?: Award[];
|
|
10
|
+
}
|
|
11
|
+
interface Beverage {
|
|
12
|
+
id: string;
|
|
13
|
+
name: string;
|
|
14
|
+
category?: string;
|
|
15
|
+
subtype?: string;
|
|
16
|
+
variants: Variant[];
|
|
17
|
+
}
|
|
18
|
+
interface PortfolioShowcaseProps {
|
|
19
|
+
beverages: Beverage[];
|
|
20
|
+
maxVisible?: number;
|
|
21
|
+
onViewAll?: () => void;
|
|
22
|
+
onProductClick?: (beverageId: string) => void;
|
|
23
|
+
className?: string;
|
|
24
|
+
}
|
|
25
|
+
export declare function PortfolioShowcase({ beverages, maxVisible, onViewAll, onProductClick, className }: PortfolioShowcaseProps): import("react/jsx-runtime").JSX.Element | null;
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=portfolio-showcase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portfolio-showcase.d.ts","sourceRoot":"","sources":["../../src/profile/portfolio-showcase.tsx"],"names":[],"mappings":"AAGA,UAAU,KAAK;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,OAAO;IACf,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;CAClB;AAED,UAAU,QAAQ;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAED,UAAU,sBAAsB;IAC9B,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,cAAc,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA6CD,wBAAgB,iBAAiB,CAAC,EAAE,SAAS,EAAE,UAAc,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,EAAE,sBAAsB,kDA0B5H"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from "../lib/utils";
|
|
3
|
+
function ProductCard({ beverage, onClick }) {
|
|
4
|
+
const firstVariant = beverage.variants[0];
|
|
5
|
+
const imageUrl = firstVariant?.imageUrl;
|
|
6
|
+
const vintage = firstVariant?.vintage;
|
|
7
|
+
const awards = firstVariant?.awards ?? [];
|
|
8
|
+
return (_jsxs("button", { type: "button", onClick: onClick, className: "group overflow-hidden rounded-xl border border-border/60 bg-card text-left transition-colors hover:bg-accent/5", children: [_jsx("div", { className: "relative aspect-[4/3] overflow-hidden bg-muted/30", children: imageUrl ? (_jsx("img", { src: imageUrl, alt: beverage.name, className: "size-full object-cover transition-transform group-hover:scale-105" })) : (_jsx("div", { className: "flex size-full items-center justify-center bg-linear-to-br from-muted/20 to-muted/40", children: _jsxs("svg", { className: "size-8 text-muted-foreground/25", fill: "none", viewBox: "0 0 24 24", strokeWidth: 1.5, stroke: "currentColor", children: [_jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M6.827 6.175A2.31 2.31 0 015.186 7.23c-.38.054-.757.112-1.134.175C2.999 7.58 2.25 8.507 2.25 9.574V18a2.25 2.25 0 002.25 2.25h15A2.25 2.25 0 0021.75 18V9.574c0-1.067-.75-1.994-1.802-2.169a47.865 47.865 0 00-1.134-.175 2.31 2.31 0 01-1.64-1.055l-.822-1.316a2.192 2.192 0 00-1.736-1.039 48.774 48.774 0 00-5.232 0 2.192 2.192 0 00-1.736 1.039l-.821 1.316z" }), _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M16.5 12.75a4.5 4.5 0 11-9 0 4.5 4.5 0 019 0z" })] }) })) }), _jsxs("div", { className: "px-3 py-2.5", children: [_jsx("div", { className: "truncate text-[13px] font-semibold text-foreground", children: beverage.name }), _jsx("div", { className: "mt-0.5 truncate text-[11px] text-muted-foreground", children: [beverage.subtype ?? beverage.category, vintage].filter(Boolean).join(" · ") }), awards.length > 0 && (_jsx("div", { className: "mt-1.5 flex flex-wrap gap-1", children: awards.slice(0, 2).map((a) => (_jsx("span", { className: "rounded-full bg-amber-500/10 px-1.5 py-px text-[9px] font-medium text-amber-700", children: a.level ? `🏆 ${a.level}` : `🏆 ${a.name}` }, a.name))) }))] })] }));
|
|
9
|
+
}
|
|
10
|
+
export function PortfolioShowcase({ beverages, maxVisible = 6, onViewAll, onProductClick, className }) {
|
|
11
|
+
if (beverages.length === 0)
|
|
12
|
+
return null;
|
|
13
|
+
const visible = beverages.slice(0, maxVisible);
|
|
14
|
+
const hasMore = beverages.length > maxVisible;
|
|
15
|
+
return (_jsxs("div", { className: cn("rounded-xl border border-border/60 bg-card px-5 py-4", className), children: [_jsxs("div", { className: "mb-3 flex items-center justify-between", children: [_jsx("h3", { className: "text-[11px] font-bold uppercase tracking-wider text-muted-foreground", children: "Product Portfolio" }), _jsxs("span", { className: "text-[10px] text-muted-foreground", children: [beverages.length, " product", beverages.length !== 1 ? "s" : ""] })] }), _jsx("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-2 md:grid-cols-3", children: visible.map((bev) => (_jsx(ProductCard, { beverage: bev, onClick: onProductClick ? () => onProductClick(bev.id) : undefined }, bev.id))) }), hasMore && onViewAll && (_jsx("div", { className: "mt-3 text-center", children: _jsxs("button", { type: "button", onClick: onViewAll, className: "text-xs font-semibold text-primary hover:opacity-80", children: ["View all ", beverages.length, " products \u2192"] }) }))] }));
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=portfolio-showcase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portfolio-showcase.js","sourceRoot":"","sources":["../../src/profile/portfolio-showcase.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { StoryObj } from "@storybook/react-vite";
|
|
2
|
+
import { PortfolioShowcase } from "./portfolio-showcase";
|
|
3
|
+
declare const meta: {
|
|
4
|
+
title: string;
|
|
5
|
+
component: typeof PortfolioShowcase;
|
|
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 WithViewAll: Story;
|
|
15
|
+
export declare const SingleProduct: Story;
|
|
16
|
+
//# sourceMappingURL=portfolio-showcase.stories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portfolio-showcase.stories.d.ts","sourceRoot":"","sources":["../../src/profile/portfolio-showcase.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,QAAA,MAAM,IAAI;;;;;;;CAKgC,CAAC;AAE3C,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AASnC,eAAO,MAAM,OAAO,EAAE,KAAgD,CAAC;AAEvE,eAAO,MAAM,WAAW,EAAE,KAMzB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAAqD,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { PortfolioShowcase } from "./portfolio-showcase";
|
|
2
|
+
const meta = {
|
|
3
|
+
title: "Profile/PortfolioShowcase",
|
|
4
|
+
component: PortfolioShowcase,
|
|
5
|
+
tags: ["autodocs"],
|
|
6
|
+
parameters: { layout: "padded" },
|
|
7
|
+
};
|
|
8
|
+
export default meta;
|
|
9
|
+
const sampleBeverages = [
|
|
10
|
+
{ id: "1", name: "Lua Reserve Tawny", category: "Fortified Wine", subtype: "Port", variants: [{ id: "v1", vintage: 2018, imageUrl: null, awards: [{ name: "IWC", level: "Gold" }] }] },
|
|
11
|
+
{ id: "2", name: "Douro Rosé Sparkling", subtype: "Rosé Sparkling", variants: [{ id: "v2", vintage: 2022, imageUrl: null }] },
|
|
12
|
+
{ id: "3", name: "Quinta Branco", subtype: "White Wine", variants: [{ id: "v3", vintage: 2023, imageUrl: null }] },
|
|
13
|
+
{ id: "4", name: "Reserva Tinto", subtype: "Red Wine", variants: [{ id: "v4", vintage: 2019, imageUrl: null }] },
|
|
14
|
+
];
|
|
15
|
+
export const Default = { args: { beverages: sampleBeverages } };
|
|
16
|
+
export const WithViewAll = {
|
|
17
|
+
args: {
|
|
18
|
+
beverages: [...sampleBeverages, ...sampleBeverages.map((b) => ({ ...b, id: `dup-${b.id}` }))],
|
|
19
|
+
maxVisible: 3,
|
|
20
|
+
onViewAll: () => alert("View all"),
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
export const SingleProduct = { args: { beverages: [sampleBeverages[0]] } };
|
|
24
|
+
//# sourceMappingURL=portfolio-showcase.stories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portfolio-showcase.stories.js","sourceRoot":"","sources":["../../src/profile/portfolio-showcase.stories.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,MAAM,IAAI,GAAG;IACX,KAAK,EAAE,2BAA2B;IAClC,SAAS,EAAE,iBAAiB;IAC5B,IAAI,EAAE,CAAC,UAAU,CAAC;IAClB,UAAU,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;CACQ,CAAC;AAE3C,eAAe,IAAI,CAAC;AAGpB,MAAM,eAAe,GAAG;IACtB,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE;IACtL,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE;IAC7H,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE;IAClH,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE;CACjH,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAU,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,EAAE,CAAC;AAEvE,MAAM,CAAC,MAAM,WAAW,GAAU;IAChC,IAAI,EAAE;QACJ,SAAS,EAAE,CAAC,GAAG,eAAe,EAAE,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAC7F,UAAU,EAAE,CAAC;QACb,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC;KACnC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAU,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
interface ProfileBentoGridProps {
|
|
3
|
+
children: React.ReactNode;
|
|
4
|
+
className?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function ProfileBentoGrid({ children, className }: ProfileBentoGridProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export declare function BentoFullWidth({ children, className, }: {
|
|
8
|
+
children: React.ReactNode;
|
|
9
|
+
className?: string;
|
|
10
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=profile-bento-grid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-bento-grid.d.ts","sourceRoot":"","sources":["../../src/profile/profile-bento-grid.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,UAAU,qBAAqB;IAC7B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,qBAAqB,2CAM9E;AAED,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,EACR,SAAS,GACV,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,2CAEA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from "../lib/utils";
|
|
3
|
+
export function ProfileBentoGrid({ children, className }) {
|
|
4
|
+
return (_jsx("div", { className: cn("grid grid-cols-1 gap-3 md:grid-cols-2", className), children: children }));
|
|
5
|
+
}
|
|
6
|
+
export function BentoFullWidth({ children, className, }) {
|
|
7
|
+
return _jsx("div", { className: cn("md:col-span-2", className), children: children });
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=profile-bento-grid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-bento-grid.js","sourceRoot":"","sources":["../../src/profile/profile-bento-grid.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAOlC,MAAM,UAAU,gBAAgB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAyB;IAC7E,OAAO,CACL,cAAK,SAAS,EAAE,EAAE,CAAC,uCAAuC,EAAE,SAAS,CAAC,YACnE,QAAQ,GACL,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,EAC7B,QAAQ,EACR,SAAS,GAIV;IACC,OAAO,cAAK,SAAS,EAAE,EAAE,CAAC,eAAe,EAAE,SAAS,CAAC,YAAG,QAAQ,GAAO,CAAC;AAC1E,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
interface ProfileCTAProps {
|
|
2
|
+
heading: string;
|
|
3
|
+
description?: string;
|
|
4
|
+
buttonLabel: string;
|
|
5
|
+
onAction: () => void;
|
|
6
|
+
disabled?: boolean;
|
|
7
|
+
variant?: "primary" | "success" | "muted";
|
|
8
|
+
className?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function ProfileCTA({ heading, description, buttonLabel, onAction, disabled, variant, className }: ProfileCTAProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=profile-cta.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-cta.d.ts","sourceRoot":"","sources":["../../src/profile/profile-cta.tsx"],"names":[],"mappings":"AAGA,UAAU,eAAe;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAoBD,wBAAgB,UAAU,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAmB,EAAE,SAAS,EAAE,EAAE,eAAe,2CAmBpI"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from "../lib/utils";
|
|
3
|
+
const variantStyles = {
|
|
4
|
+
primary: {
|
|
5
|
+
bg: "bg-linear-to-r from-primary to-primary/80",
|
|
6
|
+
text: "text-white",
|
|
7
|
+
button: "bg-white text-primary hover:bg-white/90",
|
|
8
|
+
},
|
|
9
|
+
success: {
|
|
10
|
+
bg: "bg-linear-to-r from-emerald-700 to-emerald-600",
|
|
11
|
+
text: "text-white",
|
|
12
|
+
button: "bg-white text-emerald-700 hover:bg-white/90",
|
|
13
|
+
},
|
|
14
|
+
muted: {
|
|
15
|
+
bg: "bg-muted/50 border border-border/60",
|
|
16
|
+
text: "text-foreground",
|
|
17
|
+
button: "bg-muted text-muted-foreground cursor-not-allowed",
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
export function ProfileCTA({ heading, description, buttonLabel, onAction, disabled, variant = "primary", className }) {
|
|
21
|
+
const styles = variantStyles[variant];
|
|
22
|
+
return (_jsxs("div", { className: cn("flex flex-col items-start justify-between gap-3 rounded-xl px-5 py-4 sm:flex-row sm:items-center", styles.bg, className), children: [_jsxs("div", { children: [_jsx("div", { className: cn("text-sm font-bold", styles.text), children: heading }), description && _jsx("div", { className: cn("mt-0.5 text-xs opacity-70", styles.text), children: description })] }), _jsx("button", { type: "button", onClick: onAction, disabled: disabled || variant === "muted", className: cn("shrink-0 rounded-lg px-5 py-2 text-xs font-bold transition-opacity", styles.button, (disabled || variant === "muted") && "opacity-60"), children: buttonLabel })] }));
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=profile-cta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-cta.js","sourceRoot":"","sources":["../../src/profile/profile-cta.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAYlC,MAAM,aAAa,GAAkG;IACnH,OAAO,EAAE;QACP,EAAE,EAAE,2CAA2C;QAC/C,IAAI,EAAE,YAAY;QAClB,MAAM,EAAE,yCAAyC;KAClD;IACD,OAAO,EAAE;QACP,EAAE,EAAE,gDAAgD;QACpD,IAAI,EAAE,YAAY;QAClB,MAAM,EAAE,6CAA6C;KACtD;IACD,KAAK,EAAE;QACL,EAAE,EAAE,qCAAqC;QACzC,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE,mDAAmD;KAC5D;CACF,CAAC;AAEF,MAAM,UAAU,UAAU,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,GAAG,SAAS,EAAE,SAAS,EAAmB;IACnI,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAEtC,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,kGAAkG,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,CAAC,aAC1I,0BACE,cAAK,SAAS,EAAE,EAAE,CAAC,mBAAmB,EAAE,MAAM,CAAC,IAAI,CAAC,YAAG,OAAO,GAAO,EACpE,WAAW,IAAI,cAAK,SAAS,EAAE,EAAE,CAAC,2BAA2B,EAAE,MAAM,CAAC,IAAI,CAAC,YAAG,WAAW,GAAO,IAC7F,EACN,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,QAAQ,EACjB,QAAQ,EAAE,QAAQ,IAAI,OAAO,KAAK,OAAO,EACzC,SAAS,EAAE,EAAE,CAAC,oEAAoE,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,IAAI,OAAO,KAAK,OAAO,CAAC,IAAI,YAAY,CAAC,YAEpJ,WAAW,GACL,IACL,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { StoryObj } from "@storybook/react-vite";
|
|
2
|
+
import { ProfileCTA } from "./profile-cta";
|
|
3
|
+
declare const meta: {
|
|
4
|
+
title: string;
|
|
5
|
+
component: typeof ProfileCTA;
|
|
6
|
+
tags: string[];
|
|
7
|
+
parameters: {
|
|
8
|
+
layout: string;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
export default meta;
|
|
12
|
+
type Story = StoryObj<typeof meta>;
|
|
13
|
+
export declare const RequestPartnership: Story;
|
|
14
|
+
export declare const ActivePartner: Story;
|
|
15
|
+
export declare const Pending: Story;
|
|
16
|
+
export declare const SendOffer: Story;
|
|
17
|
+
//# sourceMappingURL=profile-cta.stories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-cta.stories.d.ts","sourceRoot":"","sources":["../../src/profile/profile-cta.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,kBAAkB,EAAE,KAEhC,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAE3B,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAEvB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ProfileCTA } from "./profile-cta";
|
|
2
|
+
const meta = {
|
|
3
|
+
title: "Profile/ProfileCTA",
|
|
4
|
+
component: ProfileCTA,
|
|
5
|
+
tags: ["autodocs"],
|
|
6
|
+
parameters: { layout: "padded" },
|
|
7
|
+
};
|
|
8
|
+
export default meta;
|
|
9
|
+
export const RequestPartnership = {
|
|
10
|
+
args: { heading: "Interested in partnering?", description: "Send a request to start the conversation", buttonLabel: "Request Partnership", onAction: () => alert("Request") },
|
|
11
|
+
};
|
|
12
|
+
export const ActivePartner = {
|
|
13
|
+
args: { heading: "Active partnership", description: "You are already partnered with this importer", buttonLabel: "Active Partner", onAction: () => { }, variant: "success" },
|
|
14
|
+
};
|
|
15
|
+
export const Pending = {
|
|
16
|
+
args: { heading: "Partnership requested", description: "Waiting for response", buttonLabel: "Request Pending", onAction: () => { }, variant: "muted" },
|
|
17
|
+
};
|
|
18
|
+
export const SendOffer = {
|
|
19
|
+
args: { heading: "Interested in their products?", description: "Send an offer to start a conversation", buttonLabel: "Send Offer", onAction: () => alert("Send") },
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=profile-cta.stories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-cta.stories.js","sourceRoot":"","sources":["../../src/profile/profile-cta.stories.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,MAAM,IAAI,GAAG;IACX,KAAK,EAAE,oBAAoB;IAC3B,SAAS,EAAE,UAAU;IACrB,IAAI,EAAE,CAAC,UAAU,CAAC;IAClB,UAAU,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;CACC,CAAC;AAEpC,eAAe,IAAI,CAAC;AAGpB,MAAM,CAAC,MAAM,kBAAkB,GAAU;IACvC,IAAI,EAAE,EAAE,OAAO,EAAE,2BAA2B,EAAE,WAAW,EAAE,0CAA0C,EAAE,WAAW,EAAE,qBAAqB,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;CAC9K,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAU;IAClC,IAAI,EAAE,EAAE,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,8CAA8C,EAAE,WAAW,EAAE,gBAAgB,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE;CAC5K,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAU;IAC5B,IAAI,EAAE,EAAE,OAAO,EAAE,uBAAuB,EAAE,WAAW,EAAE,sBAAsB,EAAE,WAAW,EAAE,iBAAiB,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE;CACtJ,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAU;IAC9B,IAAI,EAAE,EAAE,OAAO,EAAE,+BAA+B,EAAE,WAAW,EAAE,uCAAuC,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;CACnK,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
interface ProfileHeroBadge {
|
|
2
|
+
label: string;
|
|
3
|
+
variant: "recommended" | "partner" | "default";
|
|
4
|
+
}
|
|
5
|
+
interface ProfileHeroProps {
|
|
6
|
+
bannerUrl?: string;
|
|
7
|
+
avatarUrl?: string;
|
|
8
|
+
name: string;
|
|
9
|
+
subtitle?: string;
|
|
10
|
+
verified?: boolean;
|
|
11
|
+
badges?: ProfileHeroBadge[];
|
|
12
|
+
className?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function ProfileHero({ bannerUrl, avatarUrl, name, subtitle, verified, badges, className, }: ProfileHeroProps): import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=profile-hero.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-hero.d.ts","sourceRoot":"","sources":["../../src/profile/profile-hero.tsx"],"names":[],"mappings":"AAGA,UAAU,gBAAgB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,aAAa,GAAG,SAAS,GAAG,SAAS,CAAC;CAChD;AAED,UAAU,gBAAgB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAiBD,wBAAgB,WAAW,CAAC,EAC1B,SAAS,EACT,SAAS,EACT,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,SAAS,GACV,EAAE,gBAAgB,2CAoElB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from "../lib/utils";
|
|
3
|
+
const badgeStyles = {
|
|
4
|
+
recommended: "bg-amber-500/20 text-amber-100 border-amber-400/30",
|
|
5
|
+
partner: "bg-emerald-500/20 text-emerald-100 border-emerald-400/30",
|
|
6
|
+
default: "bg-white/15 text-white border-white/20",
|
|
7
|
+
};
|
|
8
|
+
function getInitials(name) {
|
|
9
|
+
return name
|
|
10
|
+
.split(/\s+/)
|
|
11
|
+
.slice(0, 2)
|
|
12
|
+
.map((w) => w[0])
|
|
13
|
+
.join("")
|
|
14
|
+
.toUpperCase();
|
|
15
|
+
}
|
|
16
|
+
export function ProfileHero({ bannerUrl, avatarUrl, name, subtitle, verified, badges, className, }) {
|
|
17
|
+
return (_jsxs("div", { className: cn("relative", className), children: [_jsxs("div", { className: "relative h-[120px] overflow-hidden rounded-t-2xl sm:h-[160px] md:h-[200px]", children: [bannerUrl ? (_jsx("img", { src: bannerUrl, alt: "", className: "size-full object-cover" })) : (_jsx("div", { className: "size-full bg-linear-to-br from-primary/80 via-primary to-primary/60" })), badges && badges.length > 0 && (_jsx("div", { className: "absolute right-3 top-3 flex gap-2", children: badges.map((badge) => (_jsx("span", { className: cn("rounded-full border px-2.5 py-0.5 text-[11px] font-semibold backdrop-blur-xs", badgeStyles[badge.variant]), children: badge.label }, badge.label))) }))] }), _jsx("div", { className: "relative px-5 pb-2 sm:px-6", children: _jsxs("div", { className: "-mt-7 flex items-end gap-3.5 sm:-mt-9", children: [_jsx("div", { className: "size-14 shrink-0 overflow-hidden rounded-xl border-[3px] border-background bg-background shadow-xs sm:size-[72px]", children: avatarUrl ? (_jsx("img", { src: avatarUrl, alt: name, className: "size-full object-cover" })) : (_jsx("div", { className: "flex size-full items-center justify-center bg-muted text-base font-bold text-muted-foreground sm:text-lg", children: getInitials(name) })) }), _jsxs("div", { className: "min-w-0 pb-1", children: [_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx("h1", { className: "truncate text-lg font-bold text-foreground sm:text-xl", children: name }), verified && (_jsx("svg", { className: "size-4 shrink-0 text-blue-500 sm:size-5", viewBox: "0 0 20 20", fill: "currentColor", children: _jsx("path", { fillRule: "evenodd", d: "M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z", clipRule: "evenodd" }) }))] }), subtitle && (_jsx("p", { className: "truncate text-xs text-muted-foreground sm:text-sm/6", children: subtitle }))] })] }) })] }));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=profile-hero.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-hero.js","sourceRoot":"","sources":["../../src/profile/profile-hero.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAiBlC,MAAM,WAAW,GAAgD;IAC/D,WAAW,EAAE,oDAAoD;IACjE,OAAO,EAAE,0DAA0D;IACnE,OAAO,EAAE,wCAAwC;CAClD,CAAC;AAEF,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,IAAI;SACR,KAAK,CAAC,KAAK,CAAC;SACZ,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAChB,IAAI,CAAC,EAAE,CAAC;SACR,WAAW,EAAE,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAC1B,SAAS,EACT,SAAS,EACT,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,SAAS,GACQ;IACjB,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,UAAU,EAAE,SAAS,CAAC,aAEvC,eAAK,SAAS,EAAC,4EAA4E,aACxF,SAAS,CAAC,CAAC,CAAC,CACX,cAAK,GAAG,EAAE,SAAS,EAAE,GAAG,EAAC,EAAE,EAAC,SAAS,EAAC,wBAAwB,GAAG,CAClE,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,qEAAqE,GAAG,CACxF,EACA,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAC9B,cAAK,SAAS,EAAC,mCAAmC,YAC/C,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CACrB,eAEE,SAAS,EAAE,EAAE,CACX,8EAA8E,EAC9E,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAC3B,YAEA,KAAK,CAAC,KAAK,IANP,KAAK,CAAC,KAAK,CAOX,CACR,CAAC,GACE,CACP,IACG,EAGN,cAAK,SAAS,EAAC,4BAA4B,YACzC,eAAK,SAAS,EAAC,uCAAuC,aACpD,cAAK,SAAS,EAAC,mHAAmH,YAC/H,SAAS,CAAC,CAAC,CAAC,CACX,cAAK,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAC,wBAAwB,GAAG,CACtE,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,0GAA0G,YACtH,WAAW,CAAC,IAAI,CAAC,GACd,CACP,GACG,EACN,eAAK,SAAS,EAAC,cAAc,aAC3B,eAAK,SAAS,EAAC,2BAA2B,aACxC,aAAI,SAAS,EAAC,uDAAuD,YAClE,IAAI,GACF,EACJ,QAAQ,IAAI,CACX,cACE,SAAS,EAAC,yCAAyC,EACnD,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,cAAc,YAEnB,eACE,QAAQ,EAAC,SAAS,EAClB,CAAC,EAAC,wJAAwJ,EAC1J,QAAQ,EAAC,SAAS,GAClB,GACE,CACP,IACG,EACL,QAAQ,IAAI,CACX,YAAG,SAAS,EAAC,qDAAqD,YAC/D,QAAQ,GACP,CACL,IACG,IACF,GACF,IACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { StoryObj } from "@storybook/react-vite";
|
|
2
|
+
import { ProfileHero } from "./profile-hero";
|
|
3
|
+
declare const meta: {
|
|
4
|
+
title: string;
|
|
5
|
+
component: typeof ProfileHero;
|
|
6
|
+
tags: string[];
|
|
7
|
+
parameters: {
|
|
8
|
+
layout: string;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
export default meta;
|
|
12
|
+
type Story = StoryObj<typeof meta>;
|
|
13
|
+
export declare const WithBanner: Story;
|
|
14
|
+
export declare const NoBanner: Story;
|
|
15
|
+
export declare const NoAvatar: Story;
|
|
16
|
+
//# sourceMappingURL=profile-hero.stories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-hero.stories.d.ts","sourceRoot":"","sources":["../../src/profile/profile-hero.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,QAAA,MAAM,IAAI;;;;;;;CAK0B,CAAC;AAErC,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,UAAU,EAAE,KAQxB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAMtB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAOtB,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { ProfileHero } from "./profile-hero";
|
|
2
|
+
const meta = {
|
|
3
|
+
title: "Profile/ProfileHero",
|
|
4
|
+
component: ProfileHero,
|
|
5
|
+
tags: ["autodocs"],
|
|
6
|
+
parameters: { layout: "padded" },
|
|
7
|
+
};
|
|
8
|
+
export default meta;
|
|
9
|
+
export const WithBanner = {
|
|
10
|
+
args: {
|
|
11
|
+
bannerUrl: "https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=1200&h=400&fit=crop",
|
|
12
|
+
name: "Tuscany Imports SRL",
|
|
13
|
+
subtitle: "Florence, Tuscany · Italy",
|
|
14
|
+
verified: true,
|
|
15
|
+
badges: [{ label: "Recommended", variant: "recommended" }],
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
export const NoBanner = {
|
|
19
|
+
args: {
|
|
20
|
+
name: "Nordic Spirits Import",
|
|
21
|
+
subtitle: "Stockholm · Sweden",
|
|
22
|
+
verified: true,
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
export const NoAvatar = {
|
|
26
|
+
args: {
|
|
27
|
+
name: "Atlantic Wine Traders",
|
|
28
|
+
subtitle: "Bordeaux · France",
|
|
29
|
+
verified: false,
|
|
30
|
+
badges: [{ label: "Active Partner", variant: "partner" }],
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=profile-hero.stories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-hero.stories.js","sourceRoot":"","sources":["../../src/profile/profile-hero.stories.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,IAAI,GAAG;IACX,KAAK,EAAE,qBAAqB;IAC5B,SAAS,EAAE,WAAW;IACtB,IAAI,EAAE,CAAC,UAAU,CAAC;IAClB,UAAU,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;CACE,CAAC;AAErC,eAAe,IAAI,CAAC;AAGpB,MAAM,CAAC,MAAM,UAAU,GAAU;IAC/B,IAAI,EAAE;QACJ,SAAS,EAAE,oFAAoF;QAC/F,IAAI,EAAE,qBAAqB;QAC3B,QAAQ,EAAE,2BAA2B;QACrC,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;KAC3D;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAU;IAC7B,IAAI,EAAE;QACJ,IAAI,EAAE,uBAAuB;QAC7B,QAAQ,EAAE,oBAAoB;QAC9B,QAAQ,EAAE,IAAI;KACf;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAU;IAC7B,IAAI,EAAE;QACJ,IAAI,EAAE,uBAAuB;QAC7B,QAAQ,EAAE,mBAAmB;QAC7B,QAAQ,EAAE,KAAK;QACf,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;KAC1D;CACF,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
interface Stat {
|
|
2
|
+
value: string | number;
|
|
3
|
+
label: string;
|
|
4
|
+
}
|
|
5
|
+
interface StatsRibbonProps {
|
|
6
|
+
stats: Stat[];
|
|
7
|
+
className?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function StatsRibbon({ stats, className }: StatsRibbonProps): import("react/jsx-runtime").JSX.Element | null;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=stats-ribbon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats-ribbon.d.ts","sourceRoot":"","sources":["../../src/profile/stats-ribbon.tsx"],"names":[],"mappings":"AAGA,UAAU,IAAI;IACZ,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,gBAAgB;IACxB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAWD,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,gBAAgB,kDA8BjE"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from "../lib/utils";
|
|
3
|
+
// IMPORTANT: Tailwind does not support dynamic class generation like grid-cols-${n}
|
|
4
|
+
// Use a static map instead
|
|
5
|
+
const gridColsMap = {
|
|
6
|
+
2: "grid-cols-2",
|
|
7
|
+
3: "grid-cols-2 sm:grid-cols-3",
|
|
8
|
+
4: "grid-cols-2 sm:grid-cols-4",
|
|
9
|
+
5: "grid-cols-2 sm:grid-cols-3 md:grid-cols-5",
|
|
10
|
+
};
|
|
11
|
+
export function StatsRibbon({ stats, className }) {
|
|
12
|
+
if (stats.length === 0)
|
|
13
|
+
return null;
|
|
14
|
+
return (_jsx("div", { className: cn("grid overflow-hidden rounded-xl border border-border/60 bg-card", gridColsMap[stats.length] ?? "grid-cols-2 sm:grid-cols-4", className), children: stats.map((stat, i) => (_jsxs("div", { className: cn("px-3 py-3 text-center sm:py-4", i < stats.length - 1 && "border-r border-border/60 max-sm:[&:nth-child(2n)]:border-r-0", i < stats.length - 2 && "max-sm:border-b max-sm:border-border/60"), children: [_jsx("div", { className: "text-lg font-extrabold text-foreground sm:text-xl", children: stat.value }), _jsx("div", { className: "mt-0.5 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground", children: stat.label })] }, stat.label))) }));
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=stats-ribbon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats-ribbon.js","sourceRoot":"","sources":["../../src/profile/stats-ribbon.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAYlC,oFAAoF;AACpF,2BAA2B;AAC3B,MAAM,WAAW,GAA2B;IAC1C,CAAC,EAAE,aAAa;IAChB,CAAC,EAAE,4BAA4B;IAC/B,CAAC,EAAE,4BAA4B;IAC/B,CAAC,EAAE,2CAA2C;CAC/C,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,EAAE,KAAK,EAAE,SAAS,EAAoB;IAChE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEpC,OAAO,CACL,cACE,SAAS,EAAE,EAAE,CACX,iEAAiE,EACjE,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,4BAA4B,EACzD,SAAS,CACV,YAEA,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CACtB,eAEE,SAAS,EAAE,EAAE,CACX,+BAA+B,EAC/B,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,+DAA+D,EACvF,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,yCAAyC,CAClE,aAED,cAAK,SAAS,EAAC,mDAAmD,YAC/D,IAAI,CAAC,KAAK,GACP,EACN,cAAK,SAAS,EAAC,iFAAiF,YAC7F,IAAI,CAAC,KAAK,GACP,KAZD,IAAI,CAAC,KAAK,CAaX,CACP,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { StoryObj } from "@storybook/react-vite";
|
|
2
|
+
import { StatsRibbon } from "./stats-ribbon";
|
|
3
|
+
declare const meta: {
|
|
4
|
+
title: string;
|
|
5
|
+
component: typeof StatsRibbon;
|
|
6
|
+
tags: string[];
|
|
7
|
+
parameters: {
|
|
8
|
+
layout: string;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
export default meta;
|
|
12
|
+
type Story = StoryObj<typeof meta>;
|
|
13
|
+
export declare const ImporterStats: Story;
|
|
14
|
+
export declare const ProducerStats: Story;
|
|
15
|
+
//# sourceMappingURL=stats-ribbon.stories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats-ribbon.stories.d.ts","sourceRoot":"","sources":["../../src/profile/stats-ribbon.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,QAAA,MAAM,IAAI;;;;;;;CAK0B,CAAC;AAErC,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,aAAa,EAAE,KAS3B,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAQ3B,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { StatsRibbon } from "./stats-ribbon";
|
|
2
|
+
const meta = {
|
|
3
|
+
title: "Profile/StatsRibbon",
|
|
4
|
+
component: StatsRibbon,
|
|
5
|
+
tags: ["autodocs"],
|
|
6
|
+
parameters: { layout: "padded" },
|
|
7
|
+
};
|
|
8
|
+
export default meta;
|
|
9
|
+
export const ImporterStats = {
|
|
10
|
+
args: {
|
|
11
|
+
stats: [
|
|
12
|
+
{ value: 4, label: "Categories" },
|
|
13
|
+
{ value: 6, label: "Markets" },
|
|
14
|
+
{ value: 3, label: "Certificates" },
|
|
15
|
+
{ value: "2019", label: "Since" },
|
|
16
|
+
],
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
export const ProducerStats = {
|
|
20
|
+
args: {
|
|
21
|
+
stats: [
|
|
22
|
+
{ value: 12, label: "Products" },
|
|
23
|
+
{ value: 3, label: "Awards" },
|
|
24
|
+
{ value: "2019", label: "Since" },
|
|
25
|
+
],
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=stats-ribbon.stories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats-ribbon.stories.js","sourceRoot":"","sources":["../../src/profile/stats-ribbon.stories.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,IAAI,GAAG;IACX,KAAK,EAAE,qBAAqB;IAC5B,SAAS,EAAE,WAAW;IACtB,IAAI,EAAE,CAAC,UAAU,CAAC;IAClB,UAAU,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;CACE,CAAC;AAErC,eAAe,IAAI,CAAC;AAGpB,MAAM,CAAC,MAAM,aAAa,GAAU;IAClC,IAAI,EAAE;QACJ,KAAK,EAAE;YACL,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE;YACjC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE;YAC9B,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE;YACnC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE;SAClC;KACF;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAU;IAClC,IAAI,EAAE;QACJ,KAAK,EAAE;YACL,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE;YAChC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE;YAC7B,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE;SAClC;KACF;CACF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cellarnode/ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"private": false,
|
|
6
6
|
"description": "Shared UI components, theme tokens, and chat/offer primitives for CellarNode dashboards.",
|
|
@@ -85,7 +85,14 @@
|
|
|
85
85
|
"i18n-iso-countries": ">=7.0.0",
|
|
86
86
|
"motion": "^12.0.0",
|
|
87
87
|
"react": "^19.0.0",
|
|
88
|
-
"react-dom": "^19.0.0"
|
|
88
|
+
"react-dom": "^19.0.0",
|
|
89
|
+
"three": ">=0.170.0",
|
|
90
|
+
"@react-three/fiber": "^9.0.0",
|
|
91
|
+
"@react-three/drei": "^10.0.0",
|
|
92
|
+
"@react-three/offscreen": ">=0.0.8",
|
|
93
|
+
"@react-three/postprocessing": "^3.0.0",
|
|
94
|
+
"postprocessing": "^6.30.0",
|
|
95
|
+
"r3f-globe": "^1.6.0"
|
|
89
96
|
},
|
|
90
97
|
"peerDependenciesMeta": {
|
|
91
98
|
"@dnd-kit/dom": {
|
|
@@ -108,16 +115,30 @@
|
|
|
108
115
|
},
|
|
109
116
|
"i18n-iso-countries": {
|
|
110
117
|
"optional": true
|
|
118
|
+
},
|
|
119
|
+
"three": {
|
|
120
|
+
"optional": true
|
|
121
|
+
},
|
|
122
|
+
"@react-three/fiber": {
|
|
123
|
+
"optional": true
|
|
124
|
+
},
|
|
125
|
+
"@react-three/drei": {
|
|
126
|
+
"optional": true
|
|
127
|
+
},
|
|
128
|
+
"@react-three/offscreen": {
|
|
129
|
+
"optional": true
|
|
130
|
+
},
|
|
131
|
+
"@react-three/postprocessing": {
|
|
132
|
+
"optional": true
|
|
133
|
+
},
|
|
134
|
+
"postprocessing": {
|
|
135
|
+
"optional": true
|
|
136
|
+
},
|
|
137
|
+
"r3f-globe": {
|
|
138
|
+
"optional": true
|
|
111
139
|
}
|
|
112
140
|
},
|
|
113
141
|
"dependencies": {
|
|
114
|
-
"@react-three/drei": "^10.7.7",
|
|
115
|
-
"@react-three/fiber": "^9.5.0",
|
|
116
|
-
"@react-three/offscreen": "^0.0.8",
|
|
117
|
-
"@react-three/postprocessing": "^3.0.4",
|
|
118
|
-
"postprocessing": "^6.39.0",
|
|
119
|
-
"r3f-globe": "^1.6.0",
|
|
120
|
-
"three": "^0.182.0",
|
|
121
142
|
"topojson-client": "^3.1.0",
|
|
122
143
|
"world-atlas": "^2.0.2",
|
|
123
144
|
"@headlessui/react": "^2.2.9",
|
|
@@ -152,6 +173,13 @@
|
|
|
152
173
|
"devDependencies": {
|
|
153
174
|
"@dnd-kit/dom": "^0.3.2",
|
|
154
175
|
"@dnd-kit/react": "^0.3.2",
|
|
176
|
+
"@react-three/drei": "^10.7.7",
|
|
177
|
+
"@react-three/fiber": "^9.5.0",
|
|
178
|
+
"@react-three/offscreen": "^0.0.8",
|
|
179
|
+
"@react-three/postprocessing": "^3.0.4",
|
|
180
|
+
"postprocessing": "^6.39.0",
|
|
181
|
+
"r3f-globe": "^1.6.0",
|
|
182
|
+
"three": "^0.183.0",
|
|
155
183
|
"@eslint-react/eslint-plugin": "^3.0.0",
|
|
156
184
|
"@eslint/js": "^10.0.1",
|
|
157
185
|
"@storybook/addon-a11y": "^10.3.3",
|