@medialane/ui 0.103.0 → 0.105.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.
Files changed (34) hide show
  1. package/dist/components/asset-collection-bar.cjs +1 -1
  2. package/dist/components/asset-collection-bar.cjs.map +1 -1
  3. package/dist/components/asset-collection-bar.js +1 -1
  4. package/dist/components/asset-collection-bar.js.map +1 -1
  5. package/dist/components/asset-marketplace-panel.cjs +19 -9
  6. package/dist/components/asset-marketplace-panel.cjs.map +1 -1
  7. package/dist/components/asset-marketplace-panel.js +19 -9
  8. package/dist/components/asset-marketplace-panel.js.map +1 -1
  9. package/dist/components/collection-hero-banner.cjs +114 -0
  10. package/dist/components/collection-hero-banner.cjs.map +1 -0
  11. package/dist/components/collection-hero-banner.d.cts +26 -0
  12. package/dist/components/collection-hero-banner.d.ts +26 -0
  13. package/dist/components/collection-hero-banner.js +90 -0
  14. package/dist/components/collection-hero-banner.js.map +1 -0
  15. package/dist/components/dialog.cjs +128 -0
  16. package/dist/components/dialog.cjs.map +1 -0
  17. package/dist/components/dialog.d.cts +25 -0
  18. package/dist/components/dialog.d.ts +25 -0
  19. package/dist/components/dialog.js +85 -0
  20. package/dist/components/dialog.js.map +1 -0
  21. package/dist/components/portfolio-header.cjs +1 -1
  22. package/dist/components/portfolio-header.cjs.map +1 -1
  23. package/dist/components/portfolio-header.d.cts +4 -1
  24. package/dist/components/portfolio-header.d.ts +4 -1
  25. package/dist/components/portfolio-header.js +1 -1
  26. package/dist/components/portfolio-header.js.map +1 -1
  27. package/dist/index.cjs +24 -0
  28. package/dist/index.cjs.map +1 -1
  29. package/dist/index.d.cts +3 -0
  30. package/dist/index.d.ts +3 -0
  31. package/dist/index.js +24 -0
  32. package/dist/index.js.map +1 -1
  33. package/dist/medialane.css +16 -0
  34. package/package.json +3 -1
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ "use client";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+ var collection_hero_banner_exports = {};
21
+ __export(collection_hero_banner_exports, {
22
+ CollectionHeroBanner: () => CollectionHeroBanner
23
+ });
24
+ module.exports = __toCommonJS(collection_hero_banner_exports);
25
+ var import_jsx_runtime = require("react/jsx-runtime");
26
+ var import_framer_motion = require("framer-motion");
27
+ var import_cn = require("../utils/cn.js");
28
+ var import_currency_icon = require("./currency-icon.js");
29
+ var import_skeleton = require("./skeleton.js");
30
+ function CollectionHeroBanner({
31
+ bannerUrl,
32
+ loading = false,
33
+ standard,
34
+ symbol,
35
+ name,
36
+ stats,
37
+ className
38
+ }) {
39
+ const { scrollY } = (0, import_framer_motion.useScroll)();
40
+ const shouldReduce = (0, import_framer_motion.useReducedMotion)();
41
+ const y = (0, import_framer_motion.useTransform)(scrollY, [0, 500], [0, shouldReduce ? 0 : 150]);
42
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
43
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "fixed inset-0 -z-10 overflow-hidden pointer-events-none", children: bannerUrl && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
44
+ "img",
45
+ {
46
+ src: bannerUrl,
47
+ alt: "",
48
+ "aria-hidden": true,
49
+ className: "absolute inset-0 w-full h-full object-cover opacity-20 scale-110",
50
+ style: { filter: "blur(60px) saturate(1.5)" }
51
+ }
52
+ ) }),
53
+ loading ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_skeleton.Skeleton, { className: (0, import_cn.cn)("w-full h-[50svh]", className) }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: (0, import_cn.cn)("relative w-full overflow-hidden h-[50svh]", className), children: [
54
+ bannerUrl ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
55
+ import_framer_motion.motion.img,
56
+ {
57
+ src: bannerUrl,
58
+ alt: "",
59
+ "aria-hidden": true,
60
+ style: { y },
61
+ className: "absolute inset-0 w-full h-full object-cover scale-110"
62
+ }
63
+ ) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "absolute inset-0 w-full h-full bg-muted" }),
64
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "absolute bottom-0 left-0 right-0 px-4 sm:px-6 pb-4 sm:pb-6 space-y-3 z-10", children: [
65
+ (standard || symbol) && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2 flex-wrap", children: [
66
+ standard === "ERC1155" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Eyebrow, { children: "Multi-edition NFT" }) : standard === "ERC721" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Eyebrow, { children: "Single NFT" }) : null,
67
+ symbol && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Eyebrow, { className: "tabular-nums", children: symbol })
68
+ ] }),
69
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
70
+ "h1",
71
+ {
72
+ className: "text-3xl sm:text-5xl lg:text-7xl font-bold text-white leading-tight",
73
+ style: { textShadow: "0 1px 12px rgba(0,0,0,0.4)" },
74
+ children: name
75
+ }
76
+ ),
77
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex gap-2 flex-wrap", children: stats.map(({ label, display, symbol: statSymbol }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
78
+ "div",
79
+ {
80
+ className: (0, import_cn.cn)(
81
+ "bg-white/15 backdrop-blur-md rounded-xl px-3 py-2 flex flex-col justify-center shrink-0",
82
+ statSymbol ? "min-w-[80px]" : "min-w-[60px] items-center text-center"
83
+ ),
84
+ children: [
85
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-[9px] text-white/70 mb-1", children: label }),
86
+ statSymbol ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-1.5", children: [
87
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_currency_icon.CurrencyIcon, { symbol: statSymbol, size: 15 }),
88
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm sm:text-base font-bold text-white tabular-nums leading-tight truncate", children: display })
89
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-base sm:text-lg font-bold text-white tabular-nums leading-tight", children: display })
90
+ ]
91
+ },
92
+ label
93
+ )) })
94
+ ] })
95
+ ] })
96
+ ] });
97
+ }
98
+ function Eyebrow({ children, className }) {
99
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
100
+ "span",
101
+ {
102
+ className: (0, import_cn.cn)(
103
+ "text-[11px] font-semibold text-white/90 bg-white/15 backdrop-blur-md rounded-full px-2.5 py-0.5",
104
+ className
105
+ ),
106
+ children
107
+ }
108
+ );
109
+ }
110
+ // Annotate the CommonJS export names for ESM import in node:
111
+ 0 && (module.exports = {
112
+ CollectionHeroBanner
113
+ });
114
+ //# sourceMappingURL=collection-hero-banner.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/collection-hero-banner.tsx"],"sourcesContent":["\"use client\";\n\nimport { motion, useScroll, useTransform, useReducedMotion } from \"framer-motion\";\nimport { cn } from \"../utils/cn.js\";\nimport { CurrencyIcon } from \"./currency-icon.js\";\nimport { Skeleton } from \"./skeleton.js\";\n\nexport interface CollectionHeroStat {\n label: string;\n display: string;\n /** Currency symbol (STRK, ETH, ...) — renders CurrencyIcon next to the value. Omit for plain counts. */\n symbol?: string | null;\n}\n\nexport interface CollectionHeroBannerProps {\n bannerUrl: string | null;\n loading?: boolean;\n standard?: string | null;\n symbol?: string | null;\n name: string;\n stats: CollectionHeroStat[];\n className?: string;\n}\n\n/**\n * Full-bleed collection hero: page-wide atmospheric blur, a parallax banner\n * image, and a bottom overlay (type/symbol eyebrows, title, stat chips).\n * Deduplicated from io + starknet, which had drifted into two independent\n * copies of the same block.\n */\nexport function CollectionHeroBanner({\n bannerUrl,\n loading = false,\n standard,\n symbol,\n name,\n stats,\n className,\n}: CollectionHeroBannerProps) {\n const { scrollY } = useScroll();\n const shouldReduce = useReducedMotion();\n const y = useTransform(scrollY, [0, 500], [0, shouldReduce ? 0 : 150]);\n\n return (\n <>\n {/* Atmospheric blur background, fixed behind the whole page */}\n <div className=\"fixed inset-0 -z-10 overflow-hidden pointer-events-none\">\n {bannerUrl && (\n <img\n src={bannerUrl}\n alt=\"\"\n aria-hidden\n className=\"absolute inset-0 w-full h-full object-cover opacity-20 scale-110\"\n style={{ filter: \"blur(60px) saturate(1.5)\" }}\n />\n )}\n </div>\n\n {loading ? (\n <Skeleton className={cn(\"w-full h-[50svh]\", className)} />\n ) : (\n <div className={cn(\"relative w-full overflow-hidden h-[50svh]\", className)}>\n {bannerUrl ? (\n <motion.img\n src={bannerUrl}\n alt=\"\"\n aria-hidden\n style={{ y }}\n className=\"absolute inset-0 w-full h-full object-cover scale-110\"\n />\n ) : (\n <div className=\"absolute inset-0 w-full h-full bg-muted\" />\n )}\n\n {/* Bottom overlay: eyebrows + title + stat chips — frosted glass so\n they hold up over any artwork, regardless of site theme. */}\n <div className=\"absolute bottom-0 left-0 right-0 px-4 sm:px-6 pb-4 sm:pb-6 space-y-3 z-10\">\n {(standard || symbol) && (\n <div className=\"flex items-center gap-2 flex-wrap\">\n {standard === \"ERC1155\" ? (\n <Eyebrow>Multi-edition NFT</Eyebrow>\n ) : standard === \"ERC721\" ? (\n <Eyebrow>Single NFT</Eyebrow>\n ) : null}\n {symbol && <Eyebrow className=\"tabular-nums\">{symbol}</Eyebrow>}\n </div>\n )}\n\n <h1\n className=\"text-3xl sm:text-5xl lg:text-7xl font-bold text-white leading-tight\"\n style={{ textShadow: \"0 1px 12px rgba(0,0,0,0.4)\" }}\n >\n {name}\n </h1>\n\n <div className=\"flex gap-2 flex-wrap\">\n {stats.map(({ label, display, symbol: statSymbol }) => (\n <div\n key={label}\n className={cn(\n \"bg-white/15 backdrop-blur-md rounded-xl px-3 py-2 flex flex-col justify-center shrink-0\",\n statSymbol ? \"min-w-[80px]\" : \"min-w-[60px] items-center text-center\"\n )}\n >\n <p className=\"text-[9px] text-white/70 mb-1\">{label}</p>\n {statSymbol ? (\n <div className=\"flex items-center gap-1.5\">\n <CurrencyIcon symbol={statSymbol} size={15} />\n <p className=\"text-sm sm:text-base font-bold text-white tabular-nums leading-tight truncate\">\n {display}\n </p>\n </div>\n ) : (\n <p className=\"text-base sm:text-lg font-bold text-white tabular-nums leading-tight\">{display}</p>\n )}\n </div>\n ))}\n </div>\n </div>\n </div>\n )}\n </>\n );\n}\n\nfunction Eyebrow({ children, className }: { children: React.ReactNode; className?: string }) {\n return (\n <span\n className={cn(\n \"text-[11px] font-semibold text-white/90 bg-white/15 backdrop-blur-md rounded-full px-2.5 py-0.5\",\n className\n )}\n >\n {children}\n </span>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA4CI;AA1CJ,2BAAkE;AAClE,gBAAmB;AACnB,2BAA6B;AAC7B,sBAAyB;AAyBlB,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA8B;AAC5B,QAAM,EAAE,QAAQ,QAAI,gCAAU;AAC9B,QAAM,mBAAe,uCAAiB;AACtC,QAAM,QAAI,mCAAa,SAAS,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,eAAe,IAAI,GAAG,CAAC;AAErE,SACE,4EAEE;AAAA,gDAAC,SAAI,WAAU,2DACZ,uBACC;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,KAAI;AAAA,QACJ,eAAW;AAAA,QACX,WAAU;AAAA,QACV,OAAO,EAAE,QAAQ,2BAA2B;AAAA;AAAA,IAC9C,GAEJ;AAAA,IAEC,UACC,4CAAC,4BAAS,eAAW,cAAG,oBAAoB,SAAS,GAAG,IAExD,6CAAC,SAAI,eAAW,cAAG,6CAA6C,SAAS,GACtE;AAAA,kBACC;AAAA,QAAC,4BAAO;AAAA,QAAP;AAAA,UACC,KAAK;AAAA,UACL,KAAI;AAAA,UACJ,eAAW;AAAA,UACX,OAAO,EAAE,EAAE;AAAA,UACX,WAAU;AAAA;AAAA,MACZ,IAEA,4CAAC,SAAI,WAAU,2CAA0C;AAAA,MAK3D,6CAAC,SAAI,WAAU,6EACX;AAAA,qBAAY,WACZ,6CAAC,SAAI,WAAU,qCACZ;AAAA,uBAAa,YACZ,4CAAC,WAAQ,+BAAiB,IACxB,aAAa,WACf,4CAAC,WAAQ,wBAAU,IACjB;AAAA,UACH,UAAU,4CAAC,WAAQ,WAAU,gBAAgB,kBAAO;AAAA,WACvD;AAAA,QAGF;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,YAAY,6BAA6B;AAAA,YAEjD;AAAA;AAAA,QACH;AAAA,QAEA,4CAAC,SAAI,WAAU,wBACZ,gBAAM,IAAI,CAAC,EAAE,OAAO,SAAS,QAAQ,WAAW,MAC/C;AAAA,UAAC;AAAA;AAAA,YAEC,eAAW;AAAA,cACT;AAAA,cACA,aAAa,iBAAiB;AAAA,YAChC;AAAA,YAEA;AAAA,0DAAC,OAAE,WAAU,iCAAiC,iBAAM;AAAA,cACnD,aACC,6CAAC,SAAI,WAAU,6BACb;AAAA,4DAAC,qCAAa,QAAQ,YAAY,MAAM,IAAI;AAAA,gBAC5C,4CAAC,OAAE,WAAU,iFACV,mBACH;AAAA,iBACF,IAEA,4CAAC,OAAE,WAAU,wEAAwE,mBAAQ;AAAA;AAAA;AAAA,UAf1F;AAAA,QAiBP,CACD,GACH;AAAA,SACF;AAAA,OACF;AAAA,KAEJ;AAEJ;AAEA,SAAS,QAAQ,EAAE,UAAU,UAAU,GAAsD;AAC3F,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;","names":[]}
@@ -0,0 +1,26 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ interface CollectionHeroStat {
4
+ label: string;
5
+ display: string;
6
+ /** Currency symbol (STRK, ETH, ...) — renders CurrencyIcon next to the value. Omit for plain counts. */
7
+ symbol?: string | null;
8
+ }
9
+ interface CollectionHeroBannerProps {
10
+ bannerUrl: string | null;
11
+ loading?: boolean;
12
+ standard?: string | null;
13
+ symbol?: string | null;
14
+ name: string;
15
+ stats: CollectionHeroStat[];
16
+ className?: string;
17
+ }
18
+ /**
19
+ * Full-bleed collection hero: page-wide atmospheric blur, a parallax banner
20
+ * image, and a bottom overlay (type/symbol eyebrows, title, stat chips).
21
+ * Deduplicated from io + starknet, which had drifted into two independent
22
+ * copies of the same block.
23
+ */
24
+ declare function CollectionHeroBanner({ bannerUrl, loading, standard, symbol, name, stats, className, }: CollectionHeroBannerProps): react_jsx_runtime.JSX.Element;
25
+
26
+ export { CollectionHeroBanner, type CollectionHeroBannerProps, type CollectionHeroStat };
@@ -0,0 +1,26 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ interface CollectionHeroStat {
4
+ label: string;
5
+ display: string;
6
+ /** Currency symbol (STRK, ETH, ...) — renders CurrencyIcon next to the value. Omit for plain counts. */
7
+ symbol?: string | null;
8
+ }
9
+ interface CollectionHeroBannerProps {
10
+ bannerUrl: string | null;
11
+ loading?: boolean;
12
+ standard?: string | null;
13
+ symbol?: string | null;
14
+ name: string;
15
+ stats: CollectionHeroStat[];
16
+ className?: string;
17
+ }
18
+ /**
19
+ * Full-bleed collection hero: page-wide atmospheric blur, a parallax banner
20
+ * image, and a bottom overlay (type/symbol eyebrows, title, stat chips).
21
+ * Deduplicated from io + starknet, which had drifted into two independent
22
+ * copies of the same block.
23
+ */
24
+ declare function CollectionHeroBanner({ bannerUrl, loading, standard, symbol, name, stats, className, }: CollectionHeroBannerProps): react_jsx_runtime.JSX.Element;
25
+
26
+ export { CollectionHeroBanner, type CollectionHeroBannerProps, type CollectionHeroStat };
@@ -0,0 +1,90 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import { motion, useScroll, useTransform, useReducedMotion } from "framer-motion";
4
+ import { cn } from "../utils/cn.js";
5
+ import { CurrencyIcon } from "./currency-icon.js";
6
+ import { Skeleton } from "./skeleton.js";
7
+ function CollectionHeroBanner({
8
+ bannerUrl,
9
+ loading = false,
10
+ standard,
11
+ symbol,
12
+ name,
13
+ stats,
14
+ className
15
+ }) {
16
+ const { scrollY } = useScroll();
17
+ const shouldReduce = useReducedMotion();
18
+ const y = useTransform(scrollY, [0, 500], [0, shouldReduce ? 0 : 150]);
19
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
20
+ /* @__PURE__ */ jsx("div", { className: "fixed inset-0 -z-10 overflow-hidden pointer-events-none", children: bannerUrl && /* @__PURE__ */ jsx(
21
+ "img",
22
+ {
23
+ src: bannerUrl,
24
+ alt: "",
25
+ "aria-hidden": true,
26
+ className: "absolute inset-0 w-full h-full object-cover opacity-20 scale-110",
27
+ style: { filter: "blur(60px) saturate(1.5)" }
28
+ }
29
+ ) }),
30
+ loading ? /* @__PURE__ */ jsx(Skeleton, { className: cn("w-full h-[50svh]", className) }) : /* @__PURE__ */ jsxs("div", { className: cn("relative w-full overflow-hidden h-[50svh]", className), children: [
31
+ bannerUrl ? /* @__PURE__ */ jsx(
32
+ motion.img,
33
+ {
34
+ src: bannerUrl,
35
+ alt: "",
36
+ "aria-hidden": true,
37
+ style: { y },
38
+ className: "absolute inset-0 w-full h-full object-cover scale-110"
39
+ }
40
+ ) : /* @__PURE__ */ jsx("div", { className: "absolute inset-0 w-full h-full bg-muted" }),
41
+ /* @__PURE__ */ jsxs("div", { className: "absolute bottom-0 left-0 right-0 px-4 sm:px-6 pb-4 sm:pb-6 space-y-3 z-10", children: [
42
+ (standard || symbol) && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 flex-wrap", children: [
43
+ standard === "ERC1155" ? /* @__PURE__ */ jsx(Eyebrow, { children: "Multi-edition NFT" }) : standard === "ERC721" ? /* @__PURE__ */ jsx(Eyebrow, { children: "Single NFT" }) : null,
44
+ symbol && /* @__PURE__ */ jsx(Eyebrow, { className: "tabular-nums", children: symbol })
45
+ ] }),
46
+ /* @__PURE__ */ jsx(
47
+ "h1",
48
+ {
49
+ className: "text-3xl sm:text-5xl lg:text-7xl font-bold text-white leading-tight",
50
+ style: { textShadow: "0 1px 12px rgba(0,0,0,0.4)" },
51
+ children: name
52
+ }
53
+ ),
54
+ /* @__PURE__ */ jsx("div", { className: "flex gap-2 flex-wrap", children: stats.map(({ label, display, symbol: statSymbol }) => /* @__PURE__ */ jsxs(
55
+ "div",
56
+ {
57
+ className: cn(
58
+ "bg-white/15 backdrop-blur-md rounded-xl px-3 py-2 flex flex-col justify-center shrink-0",
59
+ statSymbol ? "min-w-[80px]" : "min-w-[60px] items-center text-center"
60
+ ),
61
+ children: [
62
+ /* @__PURE__ */ jsx("p", { className: "text-[9px] text-white/70 mb-1", children: label }),
63
+ statSymbol ? /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5", children: [
64
+ /* @__PURE__ */ jsx(CurrencyIcon, { symbol: statSymbol, size: 15 }),
65
+ /* @__PURE__ */ jsx("p", { className: "text-sm sm:text-base font-bold text-white tabular-nums leading-tight truncate", children: display })
66
+ ] }) : /* @__PURE__ */ jsx("p", { className: "text-base sm:text-lg font-bold text-white tabular-nums leading-tight", children: display })
67
+ ]
68
+ },
69
+ label
70
+ )) })
71
+ ] })
72
+ ] })
73
+ ] });
74
+ }
75
+ function Eyebrow({ children, className }) {
76
+ return /* @__PURE__ */ jsx(
77
+ "span",
78
+ {
79
+ className: cn(
80
+ "text-[11px] font-semibold text-white/90 bg-white/15 backdrop-blur-md rounded-full px-2.5 py-0.5",
81
+ className
82
+ ),
83
+ children
84
+ }
85
+ );
86
+ }
87
+ export {
88
+ CollectionHeroBanner
89
+ };
90
+ //# sourceMappingURL=collection-hero-banner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/collection-hero-banner.tsx"],"sourcesContent":["\"use client\";\n\nimport { motion, useScroll, useTransform, useReducedMotion } from \"framer-motion\";\nimport { cn } from \"../utils/cn.js\";\nimport { CurrencyIcon } from \"./currency-icon.js\";\nimport { Skeleton } from \"./skeleton.js\";\n\nexport interface CollectionHeroStat {\n label: string;\n display: string;\n /** Currency symbol (STRK, ETH, ...) — renders CurrencyIcon next to the value. Omit for plain counts. */\n symbol?: string | null;\n}\n\nexport interface CollectionHeroBannerProps {\n bannerUrl: string | null;\n loading?: boolean;\n standard?: string | null;\n symbol?: string | null;\n name: string;\n stats: CollectionHeroStat[];\n className?: string;\n}\n\n/**\n * Full-bleed collection hero: page-wide atmospheric blur, a parallax banner\n * image, and a bottom overlay (type/symbol eyebrows, title, stat chips).\n * Deduplicated from io + starknet, which had drifted into two independent\n * copies of the same block.\n */\nexport function CollectionHeroBanner({\n bannerUrl,\n loading = false,\n standard,\n symbol,\n name,\n stats,\n className,\n}: CollectionHeroBannerProps) {\n const { scrollY } = useScroll();\n const shouldReduce = useReducedMotion();\n const y = useTransform(scrollY, [0, 500], [0, shouldReduce ? 0 : 150]);\n\n return (\n <>\n {/* Atmospheric blur background, fixed behind the whole page */}\n <div className=\"fixed inset-0 -z-10 overflow-hidden pointer-events-none\">\n {bannerUrl && (\n <img\n src={bannerUrl}\n alt=\"\"\n aria-hidden\n className=\"absolute inset-0 w-full h-full object-cover opacity-20 scale-110\"\n style={{ filter: \"blur(60px) saturate(1.5)\" }}\n />\n )}\n </div>\n\n {loading ? (\n <Skeleton className={cn(\"w-full h-[50svh]\", className)} />\n ) : (\n <div className={cn(\"relative w-full overflow-hidden h-[50svh]\", className)}>\n {bannerUrl ? (\n <motion.img\n src={bannerUrl}\n alt=\"\"\n aria-hidden\n style={{ y }}\n className=\"absolute inset-0 w-full h-full object-cover scale-110\"\n />\n ) : (\n <div className=\"absolute inset-0 w-full h-full bg-muted\" />\n )}\n\n {/* Bottom overlay: eyebrows + title + stat chips — frosted glass so\n they hold up over any artwork, regardless of site theme. */}\n <div className=\"absolute bottom-0 left-0 right-0 px-4 sm:px-6 pb-4 sm:pb-6 space-y-3 z-10\">\n {(standard || symbol) && (\n <div className=\"flex items-center gap-2 flex-wrap\">\n {standard === \"ERC1155\" ? (\n <Eyebrow>Multi-edition NFT</Eyebrow>\n ) : standard === \"ERC721\" ? (\n <Eyebrow>Single NFT</Eyebrow>\n ) : null}\n {symbol && <Eyebrow className=\"tabular-nums\">{symbol}</Eyebrow>}\n </div>\n )}\n\n <h1\n className=\"text-3xl sm:text-5xl lg:text-7xl font-bold text-white leading-tight\"\n style={{ textShadow: \"0 1px 12px rgba(0,0,0,0.4)\" }}\n >\n {name}\n </h1>\n\n <div className=\"flex gap-2 flex-wrap\">\n {stats.map(({ label, display, symbol: statSymbol }) => (\n <div\n key={label}\n className={cn(\n \"bg-white/15 backdrop-blur-md rounded-xl px-3 py-2 flex flex-col justify-center shrink-0\",\n statSymbol ? \"min-w-[80px]\" : \"min-w-[60px] items-center text-center\"\n )}\n >\n <p className=\"text-[9px] text-white/70 mb-1\">{label}</p>\n {statSymbol ? (\n <div className=\"flex items-center gap-1.5\">\n <CurrencyIcon symbol={statSymbol} size={15} />\n <p className=\"text-sm sm:text-base font-bold text-white tabular-nums leading-tight truncate\">\n {display}\n </p>\n </div>\n ) : (\n <p className=\"text-base sm:text-lg font-bold text-white tabular-nums leading-tight\">{display}</p>\n )}\n </div>\n ))}\n </div>\n </div>\n </div>\n )}\n </>\n );\n}\n\nfunction Eyebrow({ children, className }: { children: React.ReactNode; className?: string }) {\n return (\n <span\n className={cn(\n \"text-[11px] font-semibold text-white/90 bg-white/15 backdrop-blur-md rounded-full px-2.5 py-0.5\",\n className\n )}\n >\n {children}\n </span>\n );\n}\n"],"mappings":";AA4CI,mBAIM,KA8BI,YAlCV;AA1CJ,SAAS,QAAQ,WAAW,cAAc,wBAAwB;AAClE,SAAS,UAAU;AACnB,SAAS,oBAAoB;AAC7B,SAAS,gBAAgB;AAyBlB,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA8B;AAC5B,QAAM,EAAE,QAAQ,IAAI,UAAU;AAC9B,QAAM,eAAe,iBAAiB;AACtC,QAAM,IAAI,aAAa,SAAS,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,eAAe,IAAI,GAAG,CAAC;AAErE,SACE,iCAEE;AAAA,wBAAC,SAAI,WAAU,2DACZ,uBACC;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,KAAI;AAAA,QACJ,eAAW;AAAA,QACX,WAAU;AAAA,QACV,OAAO,EAAE,QAAQ,2BAA2B;AAAA;AAAA,IAC9C,GAEJ;AAAA,IAEC,UACC,oBAAC,YAAS,WAAW,GAAG,oBAAoB,SAAS,GAAG,IAExD,qBAAC,SAAI,WAAW,GAAG,6CAA6C,SAAS,GACtE;AAAA,kBACC;AAAA,QAAC,OAAO;AAAA,QAAP;AAAA,UACC,KAAK;AAAA,UACL,KAAI;AAAA,UACJ,eAAW;AAAA,UACX,OAAO,EAAE,EAAE;AAAA,UACX,WAAU;AAAA;AAAA,MACZ,IAEA,oBAAC,SAAI,WAAU,2CAA0C;AAAA,MAK3D,qBAAC,SAAI,WAAU,6EACX;AAAA,qBAAY,WACZ,qBAAC,SAAI,WAAU,qCACZ;AAAA,uBAAa,YACZ,oBAAC,WAAQ,+BAAiB,IACxB,aAAa,WACf,oBAAC,WAAQ,wBAAU,IACjB;AAAA,UACH,UAAU,oBAAC,WAAQ,WAAU,gBAAgB,kBAAO;AAAA,WACvD;AAAA,QAGF;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,YAAY,6BAA6B;AAAA,YAEjD;AAAA;AAAA,QACH;AAAA,QAEA,oBAAC,SAAI,WAAU,wBACZ,gBAAM,IAAI,CAAC,EAAE,OAAO,SAAS,QAAQ,WAAW,MAC/C;AAAA,UAAC;AAAA;AAAA,YAEC,WAAW;AAAA,cACT;AAAA,cACA,aAAa,iBAAiB;AAAA,YAChC;AAAA,YAEA;AAAA,kCAAC,OAAE,WAAU,iCAAiC,iBAAM;AAAA,cACnD,aACC,qBAAC,SAAI,WAAU,6BACb;AAAA,oCAAC,gBAAa,QAAQ,YAAY,MAAM,IAAI;AAAA,gBAC5C,oBAAC,OAAE,WAAU,iFACV,mBACH;AAAA,iBACF,IAEA,oBAAC,OAAE,WAAU,wEAAwE,mBAAQ;AAAA;AAAA;AAAA,UAf1F;AAAA,QAiBP,CACD,GACH;AAAA,SACF;AAAA,OACF;AAAA,KAEJ;AAEJ;AAEA,SAAS,QAAQ,EAAE,UAAU,UAAU,GAAsD;AAC3F,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;","names":[]}
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ "use client";
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __export = (target, all) => {
10
+ for (var name in all)
11
+ __defProp(target, name, { get: all[name], enumerable: true });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from))
16
+ if (!__hasOwnProp.call(to, key) && key !== except)
17
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
18
+ }
19
+ return to;
20
+ };
21
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
22
+ // If the importer is in node compatibility mode or this is not an ESM
23
+ // file that has been converted to a CommonJS file using a Babel-
24
+ // compatible transform (i.e. "__esModule" has not been set), then set
25
+ // "default" to the CommonJS "module.exports" for node compatibility.
26
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
27
+ mod
28
+ ));
29
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
+ var dialog_exports = {};
31
+ __export(dialog_exports, {
32
+ Dialog: () => Dialog,
33
+ DialogClose: () => DialogClose,
34
+ DialogContent: () => DialogContent,
35
+ DialogDescription: () => DialogDescription,
36
+ DialogFooter: () => DialogFooter,
37
+ DialogHeader: () => DialogHeader,
38
+ DialogOverlay: () => DialogOverlay,
39
+ DialogPortal: () => DialogPortal,
40
+ DialogTitle: () => DialogTitle,
41
+ DialogTrigger: () => DialogTrigger
42
+ });
43
+ module.exports = __toCommonJS(dialog_exports);
44
+ var import_jsx_runtime = require("react/jsx-runtime");
45
+ var React = __toESM(require("react"), 1);
46
+ var DialogPrimitive = __toESM(require("@radix-ui/react-dialog"), 1);
47
+ var import_lucide_react = require("lucide-react");
48
+ var import_cn = require("../utils/cn.js");
49
+ const Dialog = DialogPrimitive.Root;
50
+ const DialogTrigger = DialogPrimitive.Trigger;
51
+ const DialogPortal = DialogPrimitive.Portal;
52
+ const DialogClose = DialogPrimitive.Close;
53
+ const DialogOverlay = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
54
+ DialogPrimitive.Overlay,
55
+ {
56
+ ref,
57
+ className: (0, import_cn.cn)(
58
+ "fixed inset-0 z-50 bg-transparent backdrop-blur-[48px] backdrop-saturate-150 backdrop-brightness-100 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
59
+ className
60
+ ),
61
+ ...props
62
+ }
63
+ ));
64
+ DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
65
+ const DialogContent = React.forwardRef(({ className, children, hideClose, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(DialogPortal, { children: [
66
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DialogOverlay, {}),
67
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
68
+ DialogPrimitive.Content,
69
+ {
70
+ ref,
71
+ className: (0, import_cn.cn)(
72
+ "fixed left-[50%] top-[50%] z-50 grid w-full max-w-[calc(100%-6px)] sm:max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 bg-background p-6 shadow-lg duration-200 rounded-2xl focus:outline-none max-h-[92svh] overflow-y-auto data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%]",
73
+ className
74
+ ),
75
+ ...props,
76
+ children: [
77
+ children,
78
+ !hideClose && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(DialogPrimitive.Close, { className: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground", children: [
79
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.X, { className: "h-4 w-4" }),
80
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "sr-only", children: "Close" })
81
+ ] })
82
+ ]
83
+ }
84
+ )
85
+ ] }));
86
+ DialogContent.displayName = DialogPrimitive.Content.displayName;
87
+ const DialogHeader = ({ className, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: (0, import_cn.cn)("flex flex-col space-y-1.5 text-center sm:text-left", className), ...props });
88
+ DialogHeader.displayName = "DialogHeader";
89
+ const DialogFooter = ({ className, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
90
+ "div",
91
+ {
92
+ className: (0, import_cn.cn)("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2", className),
93
+ ...props
94
+ }
95
+ );
96
+ DialogFooter.displayName = "DialogFooter";
97
+ const DialogTitle = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
98
+ DialogPrimitive.Title,
99
+ {
100
+ ref,
101
+ className: (0, import_cn.cn)("text-lg font-semibold leading-none tracking-tight", className),
102
+ ...props
103
+ }
104
+ ));
105
+ DialogTitle.displayName = DialogPrimitive.Title.displayName;
106
+ const DialogDescription = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
107
+ DialogPrimitive.Description,
108
+ {
109
+ ref,
110
+ className: (0, import_cn.cn)("text-sm text-muted-foreground", className),
111
+ ...props
112
+ }
113
+ ));
114
+ DialogDescription.displayName = DialogPrimitive.Description.displayName;
115
+ // Annotate the CommonJS export names for ESM import in node:
116
+ 0 && (module.exports = {
117
+ Dialog,
118
+ DialogClose,
119
+ DialogContent,
120
+ DialogDescription,
121
+ DialogFooter,
122
+ DialogHeader,
123
+ DialogOverlay,
124
+ DialogPortal,
125
+ DialogTitle,
126
+ DialogTrigger
127
+ });
128
+ //# sourceMappingURL=dialog.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { X } from \"lucide-react\";\nimport { cn } from \"../utils/cn.js\";\n\nconst Dialog = DialogPrimitive.Root;\nconst DialogTrigger = DialogPrimitive.Trigger;\nconst DialogPortal = DialogPrimitive.Portal;\nconst DialogClose = DialogPrimitive.Close;\n\nconst DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n \"fixed inset-0 z-50 bg-transparent backdrop-blur-[48px] backdrop-saturate-150 backdrop-brightness-100 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\ninterface DialogContentProps extends React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> {\n hideClose?: boolean;\n}\n\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n DialogContentProps\n>(({ className, children, hideClose, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-[calc(100%-6px)] sm:max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 bg-background p-6 shadow-lg duration-200 rounded-2xl focus:outline-none max-h-[92svh] overflow-y-auto data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%]\",\n className\n )}\n {...props}\n >\n {children}\n {!hideClose && (\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n));\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nconst DialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn(\"flex flex-col space-y-1.5 text-center sm:text-left\", className)} {...props} />\n);\nDialogHeader.displayName = \"DialogHeader\";\n\nconst DialogFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\", className)}\n {...props}\n />\n);\nDialogFooter.displayName = \"DialogFooter\";\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\"text-lg font-semibold leading-none tracking-tight\", className)}\n {...props}\n />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogClose,\n DialogTrigger,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBE;AAdF,YAAuB;AACvB,sBAAiC;AACjC,0BAAkB;AAClB,gBAAmB;AAEnB,MAAM,SAAS,gBAAgB;AAC/B,MAAM,gBAAgB,gBAAgB;AACtC,MAAM,eAAe,gBAAgB;AACrC,MAAM,cAAc,gBAAgB;AAEpC,MAAM,gBAAgB,MAAM,WAG1B,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC,gBAAgB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,eAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,cAAc,cAAc,gBAAgB,QAAQ;AAMpD,MAAM,gBAAgB,MAAM,WAG1B,CAAC,EAAE,WAAW,UAAU,WAAW,GAAG,MAAM,GAAG,QAC/C,6CAAC,gBACC;AAAA,8CAAC,iBAAc;AAAA,EACf;AAAA,IAAC,gBAAgB;AAAA,IAAhB;AAAA,MACC;AAAA,MACA,eAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,QACA,CAAC,aACA,6CAAC,gBAAgB,OAAhB,EAAsB,WAAU,iRAC/B;AAAA,sDAAC,yBAAE,WAAU,WAAU;AAAA,UACvB,4CAAC,UAAK,WAAU,WAAU,mBAAK;AAAA,WACjC;AAAA;AAAA;AAAA,EAEJ;AAAA,GACF,CACD;AACD,cAAc,cAAc,gBAAgB,QAAQ;AAEpD,MAAM,eAAe,CAAC,EAAE,WAAW,GAAG,MAAM,MAC1C,4CAAC,SAAI,eAAW,cAAG,sDAAsD,SAAS,GAAI,GAAG,OAAO;AAElG,aAAa,cAAc;AAE3B,MAAM,eAAe,CAAC,EAAE,WAAW,GAAG,MAAM,MAC1C;AAAA,EAAC;AAAA;AAAA,IACC,eAAW,cAAG,iEAAiE,SAAS;AAAA,IACvF,GAAG;AAAA;AACN;AAEF,aAAa,cAAc;AAE3B,MAAM,cAAc,MAAM,WAGxB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC,gBAAgB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,eAAW,cAAG,qDAAqD,SAAS;AAAA,IAC3E,GAAG;AAAA;AACN,CACD;AACD,YAAY,cAAc,gBAAgB,MAAM;AAEhD,MAAM,oBAAoB,MAAM,WAG9B,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC,gBAAgB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,eAAW,cAAG,iCAAiC,SAAS;AAAA,IACvD,GAAG;AAAA;AACN,CACD;AACD,kBAAkB,cAAc,gBAAgB,YAAY;","names":[]}
@@ -0,0 +1,25 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+ import * as DialogPrimitive from '@radix-ui/react-dialog';
4
+
5
+ declare const Dialog: React.FC<DialogPrimitive.DialogProps>;
6
+ declare const DialogTrigger: React.ForwardRefExoticComponent<DialogPrimitive.DialogTriggerProps & React.RefAttributes<HTMLButtonElement>>;
7
+ declare const DialogPortal: React.FC<DialogPrimitive.DialogPortalProps>;
8
+ declare const DialogClose: React.ForwardRefExoticComponent<DialogPrimitive.DialogCloseProps & React.RefAttributes<HTMLButtonElement>>;
9
+ declare const DialogOverlay: React.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogOverlayProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
10
+ interface DialogContentProps extends React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> {
11
+ hideClose?: boolean;
12
+ }
13
+ declare const DialogContent: React.ForwardRefExoticComponent<DialogContentProps & React.RefAttributes<HTMLDivElement>>;
14
+ declare const DialogHeader: {
15
+ ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): react_jsx_runtime.JSX.Element;
16
+ displayName: string;
17
+ };
18
+ declare const DialogFooter: {
19
+ ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): react_jsx_runtime.JSX.Element;
20
+ displayName: string;
21
+ };
22
+ declare const DialogTitle: React.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogTitleProps & React.RefAttributes<HTMLHeadingElement>, "ref"> & React.RefAttributes<HTMLHeadingElement>>;
23
+ declare const DialogDescription: React.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogDescriptionProps & React.RefAttributes<HTMLParagraphElement>, "ref"> & React.RefAttributes<HTMLParagraphElement>>;
24
+
25
+ export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger };
@@ -0,0 +1,25 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+ import * as DialogPrimitive from '@radix-ui/react-dialog';
4
+
5
+ declare const Dialog: React.FC<DialogPrimitive.DialogProps>;
6
+ declare const DialogTrigger: React.ForwardRefExoticComponent<DialogPrimitive.DialogTriggerProps & React.RefAttributes<HTMLButtonElement>>;
7
+ declare const DialogPortal: React.FC<DialogPrimitive.DialogPortalProps>;
8
+ declare const DialogClose: React.ForwardRefExoticComponent<DialogPrimitive.DialogCloseProps & React.RefAttributes<HTMLButtonElement>>;
9
+ declare const DialogOverlay: React.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogOverlayProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
10
+ interface DialogContentProps extends React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> {
11
+ hideClose?: boolean;
12
+ }
13
+ declare const DialogContent: React.ForwardRefExoticComponent<DialogContentProps & React.RefAttributes<HTMLDivElement>>;
14
+ declare const DialogHeader: {
15
+ ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): react_jsx_runtime.JSX.Element;
16
+ displayName: string;
17
+ };
18
+ declare const DialogFooter: {
19
+ ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): react_jsx_runtime.JSX.Element;
20
+ displayName: string;
21
+ };
22
+ declare const DialogTitle: React.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogTitleProps & React.RefAttributes<HTMLHeadingElement>, "ref"> & React.RefAttributes<HTMLHeadingElement>>;
23
+ declare const DialogDescription: React.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogDescriptionProps & React.RefAttributes<HTMLParagraphElement>, "ref"> & React.RefAttributes<HTMLParagraphElement>>;
24
+
25
+ export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger };
@@ -0,0 +1,85 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import * as DialogPrimitive from "@radix-ui/react-dialog";
5
+ import { X } from "lucide-react";
6
+ import { cn } from "../utils/cn.js";
7
+ const Dialog = DialogPrimitive.Root;
8
+ const DialogTrigger = DialogPrimitive.Trigger;
9
+ const DialogPortal = DialogPrimitive.Portal;
10
+ const DialogClose = DialogPrimitive.Close;
11
+ const DialogOverlay = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
12
+ DialogPrimitive.Overlay,
13
+ {
14
+ ref,
15
+ className: cn(
16
+ "fixed inset-0 z-50 bg-transparent backdrop-blur-[48px] backdrop-saturate-150 backdrop-brightness-100 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
17
+ className
18
+ ),
19
+ ...props
20
+ }
21
+ ));
22
+ DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
23
+ const DialogContent = React.forwardRef(({ className, children, hideClose, ...props }, ref) => /* @__PURE__ */ jsxs(DialogPortal, { children: [
24
+ /* @__PURE__ */ jsx(DialogOverlay, {}),
25
+ /* @__PURE__ */ jsxs(
26
+ DialogPrimitive.Content,
27
+ {
28
+ ref,
29
+ className: cn(
30
+ "fixed left-[50%] top-[50%] z-50 grid w-full max-w-[calc(100%-6px)] sm:max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 bg-background p-6 shadow-lg duration-200 rounded-2xl focus:outline-none max-h-[92svh] overflow-y-auto data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%]",
31
+ className
32
+ ),
33
+ ...props,
34
+ children: [
35
+ children,
36
+ !hideClose && /* @__PURE__ */ jsxs(DialogPrimitive.Close, { className: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground", children: [
37
+ /* @__PURE__ */ jsx(X, { className: "h-4 w-4" }),
38
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Close" })
39
+ ] })
40
+ ]
41
+ }
42
+ )
43
+ ] }));
44
+ DialogContent.displayName = DialogPrimitive.Content.displayName;
45
+ const DialogHeader = ({ className, ...props }) => /* @__PURE__ */ jsx("div", { className: cn("flex flex-col space-y-1.5 text-center sm:text-left", className), ...props });
46
+ DialogHeader.displayName = "DialogHeader";
47
+ const DialogFooter = ({ className, ...props }) => /* @__PURE__ */ jsx(
48
+ "div",
49
+ {
50
+ className: cn("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2", className),
51
+ ...props
52
+ }
53
+ );
54
+ DialogFooter.displayName = "DialogFooter";
55
+ const DialogTitle = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
56
+ DialogPrimitive.Title,
57
+ {
58
+ ref,
59
+ className: cn("text-lg font-semibold leading-none tracking-tight", className),
60
+ ...props
61
+ }
62
+ ));
63
+ DialogTitle.displayName = DialogPrimitive.Title.displayName;
64
+ const DialogDescription = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
65
+ DialogPrimitive.Description,
66
+ {
67
+ ref,
68
+ className: cn("text-sm text-muted-foreground", className),
69
+ ...props
70
+ }
71
+ ));
72
+ DialogDescription.displayName = DialogPrimitive.Description.displayName;
73
+ export {
74
+ Dialog,
75
+ DialogClose,
76
+ DialogContent,
77
+ DialogDescription,
78
+ DialogFooter,
79
+ DialogHeader,
80
+ DialogOverlay,
81
+ DialogPortal,
82
+ DialogTitle,
83
+ DialogTrigger
84
+ };
85
+ //# sourceMappingURL=dialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { X } from \"lucide-react\";\nimport { cn } from \"../utils/cn.js\";\n\nconst Dialog = DialogPrimitive.Root;\nconst DialogTrigger = DialogPrimitive.Trigger;\nconst DialogPortal = DialogPrimitive.Portal;\nconst DialogClose = DialogPrimitive.Close;\n\nconst DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n \"fixed inset-0 z-50 bg-transparent backdrop-blur-[48px] backdrop-saturate-150 backdrop-brightness-100 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\ninterface DialogContentProps extends React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> {\n hideClose?: boolean;\n}\n\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n DialogContentProps\n>(({ className, children, hideClose, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-[calc(100%-6px)] sm:max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 bg-background p-6 shadow-lg duration-200 rounded-2xl focus:outline-none max-h-[92svh] overflow-y-auto data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%]\",\n className\n )}\n {...props}\n >\n {children}\n {!hideClose && (\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n));\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nconst DialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn(\"flex flex-col space-y-1.5 text-center sm:text-left\", className)} {...props} />\n);\nDialogHeader.displayName = \"DialogHeader\";\n\nconst DialogFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\", className)}\n {...props}\n />\n);\nDialogFooter.displayName = \"DialogFooter\";\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\"text-lg font-semibold leading-none tracking-tight\", className)}\n {...props}\n />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogClose,\n DialogTrigger,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n};\n"],"mappings":";AAgBE,cA+BM,YA/BN;AAdF,YAAY,WAAW;AACvB,YAAY,qBAAqB;AACjC,SAAS,SAAS;AAClB,SAAS,UAAU;AAEnB,MAAM,SAAS,gBAAgB;AAC/B,MAAM,gBAAgB,gBAAgB;AACtC,MAAM,eAAe,gBAAgB;AACrC,MAAM,cAAc,gBAAgB;AAEpC,MAAM,gBAAgB,MAAM,WAG1B,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC,gBAAgB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,cAAc,cAAc,gBAAgB,QAAQ;AAMpD,MAAM,gBAAgB,MAAM,WAG1B,CAAC,EAAE,WAAW,UAAU,WAAW,GAAG,MAAM,GAAG,QAC/C,qBAAC,gBACC;AAAA,sBAAC,iBAAc;AAAA,EACf;AAAA,IAAC,gBAAgB;AAAA,IAAhB;AAAA,MACC;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,QACA,CAAC,aACA,qBAAC,gBAAgB,OAAhB,EAAsB,WAAU,iRAC/B;AAAA,8BAAC,KAAE,WAAU,WAAU;AAAA,UACvB,oBAAC,UAAK,WAAU,WAAU,mBAAK;AAAA,WACjC;AAAA;AAAA;AAAA,EAEJ;AAAA,GACF,CACD;AACD,cAAc,cAAc,gBAAgB,QAAQ;AAEpD,MAAM,eAAe,CAAC,EAAE,WAAW,GAAG,MAAM,MAC1C,oBAAC,SAAI,WAAW,GAAG,sDAAsD,SAAS,GAAI,GAAG,OAAO;AAElG,aAAa,cAAc;AAE3B,MAAM,eAAe,CAAC,EAAE,WAAW,GAAG,MAAM,MAC1C;AAAA,EAAC;AAAA;AAAA,IACC,WAAW,GAAG,iEAAiE,SAAS;AAAA,IACvF,GAAG;AAAA;AACN;AAEF,aAAa,cAAc;AAE3B,MAAM,cAAc,MAAM,WAGxB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC,gBAAgB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAW,GAAG,qDAAqD,SAAS;AAAA,IAC3E,GAAG;AAAA;AACN,CACD;AACD,YAAY,cAAc,gBAAgB,MAAM;AAEhD,MAAM,oBAAoB,MAAM,WAG9B,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC,gBAAgB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAW,GAAG,iCAAiC,SAAS;AAAA,IACvD,GAAG;AAAA;AACN,CACD;AACD,kBAAkB,cAAc,gBAAgB,YAAY;","names":[]}
@@ -41,7 +41,7 @@ function PortfolioHeader({
41
41
  score,
42
42
  className
43
43
  }) {
44
- const scoreChip = score && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "rounded-full bg-gradient-to-r from-brand-purple to-brand-orange px-3.5 py-1.5 flex items-baseline gap-2 whitespace-nowrap text-white", children: [
44
+ const scoreChip = score && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "rounded-full bg-gradient-to-r from-brand-orange to-brand-maeve px-3.5 py-1.5 flex items-baseline gap-2 whitespace-nowrap text-white", children: [
45
45
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-sm font-bold", children: score.levelName }),
46
46
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "text-xs font-medium text-white/80 tabular-nums", children: [
47
47
  score.totalXp.toLocaleString(),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/portfolio-header.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { cn } from \"../utils/cn.js\";\nimport { AddressDisplay } from \"./address-display.js\";\n\nexport interface PortfolioHeaderScore {\n /** Journey level name (\"Starter\", \"Explorer\", …) — no numeric level shown. */\n levelName: string;\n totalXp: number;\n /** Where the score chip links (\"/rewards\"). */\n href?: string;\n}\n\nexport interface PortfolioHeaderProps {\n address: string;\n score?: PortfolioHeaderScore | null;\n className?: string;\n}\n\n/**\n * Portfolio identity header: the address as a real page title (no generic\n * gradient/avatar element — there's no profile data to lead with, and a\n * placeholder gradient mark isn't the answer), with the rewards journey\n * chip alongside it.\n */\nexport function PortfolioHeader({\n address,\n score,\n className,\n}: PortfolioHeaderProps) {\n const scoreChip = score && (\n <div className=\"rounded-full bg-gradient-to-r from-brand-purple to-brand-orange px-3.5 py-1.5 flex items-baseline gap-2 whitespace-nowrap text-white\">\n <span className=\"text-sm font-bold\">\n {score.levelName}\n </span>\n <span className=\"text-xs font-medium text-white/80 tabular-nums\">\n {score.totalXp.toLocaleString()} XP\n </span>\n </div>\n );\n\n return (\n <div className={cn(\"flex items-center justify-between gap-4\", className)}>\n <div className=\"min-w-0\">\n <p className=\"text-xs font-medium text-muted-foreground\">\n Portfolio\n </p>\n <AddressDisplay\n address={address}\n chars={6}\n className=\"text-2xl sm:text-3xl font-black tracking-tight text-foreground\"\n />\n </div>\n {score?.href ? (\n <Link href={score.href} className=\"shrink-0 active:opacity-80\">\n {scoreChip}\n </Link>\n ) : (\n <div className=\"shrink-0\">{scoreChip}</div>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAiCM;AA/BN,kBAAiB;AACjB,gBAAmB;AACnB,6BAA+B;AAsBxB,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AACF,GAAyB;AACvB,QAAM,YAAY,SAChB,6CAAC,SAAI,WAAU,wIACb;AAAA,gDAAC,UAAK,WAAU,qBACb,gBAAM,WACT;AAAA,IACA,6CAAC,UAAK,WAAU,kDACb;AAAA,YAAM,QAAQ,eAAe;AAAA,MAAE;AAAA,OAClC;AAAA,KACF;AAGF,SACE,6CAAC,SAAI,eAAW,cAAG,2CAA2C,SAAS,GACrE;AAAA,iDAAC,SAAI,WAAU,WACb;AAAA,kDAAC,OAAE,WAAU,6CAA4C,uBAEzD;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,OAAO;AAAA,UACP,WAAU;AAAA;AAAA,MACZ;AAAA,OACF;AAAA,IACC,OAAO,OACN,4CAAC,YAAAA,SAAA,EAAK,MAAM,MAAM,MAAM,WAAU,8BAC/B,qBACH,IAEA,4CAAC,SAAI,WAAU,YAAY,qBAAU;AAAA,KAEzC;AAEJ;","names":["Link"]}
1
+ {"version":3,"sources":["../../src/components/portfolio-header.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { cn } from \"../utils/cn.js\";\nimport { AddressDisplay } from \"./address-display.js\";\n\nexport interface PortfolioHeaderScore {\n /** Journey level name (\"Starter\", \"Explorer\", …) — no numeric level shown. */\n levelName: string;\n totalXp: number;\n /** Where the score chip links (\"/rewards\"). */\n href?: string;\n}\n\nexport interface PortfolioHeaderProps {\n address: string;\n score?: PortfolioHeaderScore | null;\n className?: string;\n}\n\n/**\n * Portfolio identity header: the address as a real page title (no generic\n * gradient/avatar element — there's no profile data to lead with, and a\n * placeholder gradient mark isn't the answer), with the rewards journey\n * chip alongside it. The chip stays orange->maeve (the platform-wide XP/\n * Rewards identity, matching LevelBadge) rather than Portfolio's own\n * purple->orange theme — a rewards badge keeps its own aesthetic wherever\n * it's embedded, it doesn't inherit the surrounding page's section theme.\n */\nexport function PortfolioHeader({\n address,\n score,\n className,\n}: PortfolioHeaderProps) {\n const scoreChip = score && (\n <div className=\"rounded-full bg-gradient-to-r from-brand-orange to-brand-maeve px-3.5 py-1.5 flex items-baseline gap-2 whitespace-nowrap text-white\">\n <span className=\"text-sm font-bold\">\n {score.levelName}\n </span>\n <span className=\"text-xs font-medium text-white/80 tabular-nums\">\n {score.totalXp.toLocaleString()} XP\n </span>\n </div>\n );\n\n return (\n <div className={cn(\"flex items-center justify-between gap-4\", className)}>\n <div className=\"min-w-0\">\n <p className=\"text-xs font-medium text-muted-foreground\">\n Portfolio\n </p>\n <AddressDisplay\n address={address}\n chars={6}\n className=\"text-2xl sm:text-3xl font-black tracking-tight text-foreground\"\n />\n </div>\n {score?.href ? (\n <Link href={score.href} className=\"shrink-0 active:opacity-80\">\n {scoreChip}\n </Link>\n ) : (\n <div className=\"shrink-0\">{scoreChip}</div>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAoCM;AAlCN,kBAAiB;AACjB,gBAAmB;AACnB,6BAA+B;AAyBxB,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AACF,GAAyB;AACvB,QAAM,YAAY,SAChB,6CAAC,SAAI,WAAU,uIACb;AAAA,gDAAC,UAAK,WAAU,qBACb,gBAAM,WACT;AAAA,IACA,6CAAC,UAAK,WAAU,kDACb;AAAA,YAAM,QAAQ,eAAe;AAAA,MAAE;AAAA,OAClC;AAAA,KACF;AAGF,SACE,6CAAC,SAAI,eAAW,cAAG,2CAA2C,SAAS,GACrE;AAAA,iDAAC,SAAI,WAAU,WACb;AAAA,kDAAC,OAAE,WAAU,6CAA4C,uBAEzD;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,OAAO;AAAA,UACP,WAAU;AAAA;AAAA,MACZ;AAAA,OACF;AAAA,IACC,OAAO,OACN,4CAAC,YAAAA,SAAA,EAAK,MAAM,MAAM,MAAM,WAAU,8BAC/B,qBACH,IAEA,4CAAC,SAAI,WAAU,YAAY,qBAAU;AAAA,KAEzC;AAEJ;","names":["Link"]}
@@ -16,7 +16,10 @@ interface PortfolioHeaderProps {
16
16
  * Portfolio identity header: the address as a real page title (no generic
17
17
  * gradient/avatar element — there's no profile data to lead with, and a
18
18
  * placeholder gradient mark isn't the answer), with the rewards journey
19
- * chip alongside it.
19
+ * chip alongside it. The chip stays orange->maeve (the platform-wide XP/
20
+ * Rewards identity, matching LevelBadge) rather than Portfolio's own
21
+ * purple->orange theme — a rewards badge keeps its own aesthetic wherever
22
+ * it's embedded, it doesn't inherit the surrounding page's section theme.
20
23
  */
21
24
  declare function PortfolioHeader({ address, score, className, }: PortfolioHeaderProps): react_jsx_runtime.JSX.Element;
22
25