@medialane/ui 0.19.0 → 0.21.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/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @medialane/ui
2
2
 
3
- Shared UI component library for Medialane apps. Used by `medialane-dapp`, `medialane-io`, and `medialane-portal`.
3
+ Shared UI component library for Medialane apps. Used by `medialane-starknet`, `medialane-io`, and `medialane-portal`.
4
4
 
5
5
  [![npm version](https://img.shields.io/npm/v/@medialane/ui)](https://www.npmjs.com/package/@medialane/ui)
6
6
 
@@ -0,0 +1,122 @@
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 asset_card_exports = {};
31
+ __export(asset_card_exports, {
32
+ AssetCard: () => AssetCard,
33
+ AssetCardSkeleton: () => AssetCardSkeleton
34
+ });
35
+ module.exports = __toCommonJS(asset_card_exports);
36
+ var import_jsx_runtime = require("react/jsx-runtime");
37
+ var import_react = require("react");
38
+ var import_link = __toESM(require("next/link"), 1);
39
+ var import_image = __toESM(require("next/image"), 1);
40
+ var import_lucide_react = require("lucide-react");
41
+ var import_cn = require("../utils/cn.js");
42
+ var import_ipfs = require("../utils/ipfs.js");
43
+ var import_format = require("../utils/format.js");
44
+ var import_currency_icon = require("./currency-icon.js");
45
+ var import_ip_type_badge = require("./ip-type-badge.js");
46
+ function AssetCard({
47
+ href,
48
+ name,
49
+ image,
50
+ subtitle,
51
+ ipType,
52
+ price,
53
+ fallbackId,
54
+ indexing = false,
55
+ ipTypeBaseUrl = "",
56
+ className
57
+ }) {
58
+ const [imgError, setImgError] = (0, import_react.useState)(false);
59
+ const resolved = image ? (0, import_ipfs.ipfsToHttp)(image) : null;
60
+ const hasPrice = !!price?.formatted;
61
+ const showFooter = !!ipType || hasPrice;
62
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
63
+ "div",
64
+ {
65
+ className: (0, import_cn.cn)(
66
+ "card-base group relative flex flex-col w-full transition-colors hover:border-foreground/20",
67
+ className
68
+ ),
69
+ children: [
70
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href, className: "block", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "relative aspect-square bg-muted overflow-hidden", children: [
71
+ resolved && !imgError ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
72
+ import_image.default,
73
+ {
74
+ src: resolved,
75
+ alt: name,
76
+ fill: true,
77
+ unoptimized: true,
78
+ sizes: "(max-width: 640px) 50vw, (max-width: 1024px) 33vw, 22vw",
79
+ className: "object-cover transition-transform duration-500 group-hover:scale-105",
80
+ onError: () => setImgError(true)
81
+ }
82
+ ) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "absolute inset-0 flex items-center justify-center bg-gradient-to-br from-brand-purple/15 to-brand-blue/15", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "text-2xl font-mono text-muted-foreground", children: [
83
+ "#",
84
+ fallbackId ?? "?"
85
+ ] }) }),
86
+ indexing && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "absolute bottom-0 inset-x-0 flex items-center justify-center gap-1.5 bg-black/50 backdrop-blur-sm py-1.5", children: [
87
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Loader2, { className: "h-3 w-3 animate-spin text-white/70" }),
88
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-[10px] text-white/70", children: "Indexing\u2026" })
89
+ ] })
90
+ ] }) }),
91
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-col gap-1.5 px-3 py-3", children: [
92
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_link.default, { href, className: "block min-w-0", children: [
93
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm font-bold line-clamp-1 leading-snug", children: name }),
94
+ subtitle && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-xs text-muted-foreground line-clamp-1 leading-snug", children: subtitle })
95
+ ] }),
96
+ showFooter && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center justify-between gap-2", children: [
97
+ ipType ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ip_type_badge.IpTypeBadge, { ipType, size: "sm", baseUrl: ipTypeBaseUrl }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {}),
98
+ hasPrice && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "inline-flex shrink-0 items-center gap-1 text-sm font-bold leading-none", children: [
99
+ price.currency && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_currency_icon.CurrencyIcon, { symbol: price.currency, size: 12 }),
100
+ (0, import_format.formatDisplayPrice)(price.formatted)
101
+ ] })
102
+ ] })
103
+ ] })
104
+ ]
105
+ }
106
+ );
107
+ }
108
+ function AssetCardSkeleton() {
109
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "card-base flex flex-col w-full", children: [
110
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "aspect-square w-full animate-pulse bg-muted" }),
111
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "px-3 py-3 space-y-1.5", children: [
112
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "h-4 w-3/4 rounded-md animate-pulse bg-muted" }),
113
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "h-3.5 w-2/5 rounded-md animate-pulse bg-muted" })
114
+ ] })
115
+ ] });
116
+ }
117
+ // Annotate the CommonJS export names for ESM import in node:
118
+ 0 && (module.exports = {
119
+ AssetCard,
120
+ AssetCardSkeleton
121
+ });
122
+ //# sourceMappingURL=asset-card.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/asset-card.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport Link from \"next/link\";\nimport Image from \"next/image\";\nimport { Loader2 } from \"lucide-react\";\nimport { cn } from \"../utils/cn.js\";\nimport { ipfsToHttp } from \"../utils/ipfs.js\";\nimport { formatDisplayPrice } from \"../utils/format.js\";\nimport { CurrencyIcon } from \"./currency-icon.js\";\nimport { IpTypeBadge } from \"./ip-type-badge.js\";\n\nexport interface AssetCardPrice {\n formatted?: string | null;\n currency?: string | null;\n}\n\nexport interface AssetCardProps {\n /** Asset detail link. */\n href: string;\n /** Asset title. */\n name: string;\n /** Raw image (ipfs:// or http) — resolved internally. */\n image?: string | null;\n /** Secondary line under the title (collection or description). */\n subtitle?: string | null;\n /** IP type (apiValue or label) — renders the icon badge on the footer left. */\n ipType?: string | null;\n /** Listing price; omit/null shows no price. */\n price?: AssetCardPrice | null;\n /** Shown when the image is missing/errors (e.g. token id). */\n fallbackId?: string | null;\n /** Show the \"Indexing…\" overlay. */\n indexing?: boolean;\n /** Base URL for the ipType badge link. Default \"\" (relative). */\n ipTypeBaseUrl?: string;\n className?: string;\n}\n\n/**\n * The platform's shared asset card — lean and presentational.\n *\n * Intentionally has no action buttons, dropdowns or dialogs: the image and\n * text are the only interactive surface (a single asset link), which keeps\n * browse grids and carousels fast even when many cards render. Surfaces that\n * need owner/marketplace actions use the richer `TokenCard` / `ListingCard`.\n *\n * Layout: square image → title → optional subtitle → footer row with the\n * (optional) ipType icon on the left and the (optional) price on the right.\n */\nexport function AssetCard({\n href,\n name,\n image,\n subtitle,\n ipType,\n price,\n fallbackId,\n indexing = false,\n ipTypeBaseUrl = \"\",\n className,\n}: AssetCardProps) {\n const [imgError, setImgError] = useState(false);\n const resolved = image ? ipfsToHttp(image) : null;\n const hasPrice = !!price?.formatted;\n const showFooter = !!ipType || hasPrice;\n\n return (\n <div\n className={cn(\n \"card-base group relative flex flex-col w-full transition-colors hover:border-foreground/20\",\n className\n )}\n >\n {/* Image */}\n <Link href={href} className=\"block\">\n <div className=\"relative aspect-square bg-muted overflow-hidden\">\n {resolved && !imgError ? (\n <Image\n src={resolved}\n alt={name}\n fill\n unoptimized\n sizes=\"(max-width: 640px) 50vw, (max-width: 1024px) 33vw, 22vw\"\n className=\"object-cover transition-transform duration-500 group-hover:scale-105\"\n onError={() => setImgError(true)}\n />\n ) : (\n <div className=\"absolute inset-0 flex items-center justify-center bg-gradient-to-br from-brand-purple/15 to-brand-blue/15\">\n <span className=\"text-2xl font-mono text-muted-foreground\">\n #{fallbackId ?? \"?\"}\n </span>\n </div>\n )}\n\n {indexing && (\n <div className=\"absolute bottom-0 inset-x-0 flex items-center justify-center gap-1.5 bg-black/50 backdrop-blur-sm py-1.5\">\n <Loader2 className=\"h-3 w-3 animate-spin text-white/70\" />\n <span className=\"text-[10px] text-white/70\">Indexing…</span>\n </div>\n )}\n </div>\n </Link>\n\n {/* Body */}\n <div className=\"flex flex-col gap-1.5 px-3 py-3\">\n <Link href={href} className=\"block min-w-0\">\n <p className=\"text-sm font-bold line-clamp-1 leading-snug\">{name}</p>\n {subtitle && (\n <p className=\"text-xs text-muted-foreground line-clamp-1 leading-snug\">\n {subtitle}\n </p>\n )}\n </Link>\n\n {showFooter && (\n <div className=\"flex items-center justify-between gap-2\">\n {ipType ? (\n <IpTypeBadge ipType={ipType} size=\"sm\" baseUrl={ipTypeBaseUrl} />\n ) : (\n <span />\n )}\n {hasPrice && (\n <span className=\"inline-flex shrink-0 items-center gap-1 text-sm font-bold leading-none\">\n {price!.currency && <CurrencyIcon symbol={price!.currency} size={12} />}\n {formatDisplayPrice(price!.formatted!)}\n </span>\n )}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nexport function AssetCardSkeleton() {\n return (\n <div className=\"card-base flex flex-col w-full\">\n <div className=\"aspect-square w-full animate-pulse bg-muted\" />\n <div className=\"px-3 py-3 space-y-1.5\">\n <div className=\"h-4 w-3/4 rounded-md animate-pulse bg-muted\" />\n <div className=\"h-3.5 w-2/5 rounded-md animate-pulse bg-muted\" />\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8EY;AA5EZ,mBAAyB;AACzB,kBAAiB;AACjB,mBAAkB;AAClB,0BAAwB;AACxB,gBAAmB;AACnB,kBAA2B;AAC3B,oBAAmC;AACnC,2BAA6B;AAC7B,2BAA4B;AAwCrB,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB;AACF,GAAmB;AACjB,QAAM,CAAC,UAAU,WAAW,QAAI,uBAAS,KAAK;AAC9C,QAAM,WAAW,YAAQ,wBAAW,KAAK,IAAI;AAC7C,QAAM,WAAW,CAAC,CAAC,OAAO;AAC1B,QAAM,aAAa,CAAC,CAAC,UAAU;AAE/B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MAGA;AAAA,oDAAC,YAAAA,SAAA,EAAK,MAAY,WAAU,SAC1B,uDAAC,SAAI,WAAU,mDACZ;AAAA,sBAAY,CAAC,WACZ;AAAA,YAAC,aAAAC;AAAA,YAAA;AAAA,cACC,KAAK;AAAA,cACL,KAAK;AAAA,cACL,MAAI;AAAA,cACJ,aAAW;AAAA,cACX,OAAM;AAAA,cACN,WAAU;AAAA,cACV,SAAS,MAAM,YAAY,IAAI;AAAA;AAAA,UACjC,IAEA,4CAAC,SAAI,WAAU,6GACb,uDAAC,UAAK,WAAU,4CAA2C;AAAA;AAAA,YACvD,cAAc;AAAA,aAClB,GACF;AAAA,UAGD,YACC,6CAAC,SAAI,WAAU,4GACb;AAAA,wDAAC,+BAAQ,WAAU,sCAAqC;AAAA,YACxD,4CAAC,UAAK,WAAU,6BAA4B,4BAAS;AAAA,aACvD;AAAA,WAEJ,GACF;AAAA,QAGA,6CAAC,SAAI,WAAU,mCACb;AAAA,uDAAC,YAAAD,SAAA,EAAK,MAAY,WAAU,iBAC1B;AAAA,wDAAC,OAAE,WAAU,+CAA+C,gBAAK;AAAA,YAChE,YACC,4CAAC,OAAE,WAAU,2DACV,oBACH;AAAA,aAEJ;AAAA,UAEC,cACC,6CAAC,SAAI,WAAU,2CACZ;AAAA,qBACC,4CAAC,oCAAY,QAAgB,MAAK,MAAK,SAAS,eAAe,IAE/D,4CAAC,UAAK;AAAA,YAEP,YACC,6CAAC,UAAK,WAAU,0EACb;AAAA,oBAAO,YAAY,4CAAC,qCAAa,QAAQ,MAAO,UAAU,MAAM,IAAI;AAAA,kBACpE,kCAAmB,MAAO,SAAU;AAAA,eACvC;AAAA,aAEJ;AAAA,WAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;AAEO,SAAS,oBAAoB;AAClC,SACE,6CAAC,SAAI,WAAU,kCACb;AAAA,gDAAC,SAAI,WAAU,+CAA8C;AAAA,IAC7D,6CAAC,SAAI,WAAU,yBACb;AAAA,kDAAC,SAAI,WAAU,+CAA8C;AAAA,MAC7D,4CAAC,SAAI,WAAU,iDAAgD;AAAA,OACjE;AAAA,KACF;AAEJ;","names":["Link","Image"]}
@@ -0,0 +1,42 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ interface AssetCardPrice {
4
+ formatted?: string | null;
5
+ currency?: string | null;
6
+ }
7
+ interface AssetCardProps {
8
+ /** Asset detail link. */
9
+ href: string;
10
+ /** Asset title. */
11
+ name: string;
12
+ /** Raw image (ipfs:// or http) — resolved internally. */
13
+ image?: string | null;
14
+ /** Secondary line under the title (collection or description). */
15
+ subtitle?: string | null;
16
+ /** IP type (apiValue or label) — renders the icon badge on the footer left. */
17
+ ipType?: string | null;
18
+ /** Listing price; omit/null shows no price. */
19
+ price?: AssetCardPrice | null;
20
+ /** Shown when the image is missing/errors (e.g. token id). */
21
+ fallbackId?: string | null;
22
+ /** Show the "Indexing…" overlay. */
23
+ indexing?: boolean;
24
+ /** Base URL for the ipType badge link. Default "" (relative). */
25
+ ipTypeBaseUrl?: string;
26
+ className?: string;
27
+ }
28
+ /**
29
+ * The platform's shared asset card — lean and presentational.
30
+ *
31
+ * Intentionally has no action buttons, dropdowns or dialogs: the image and
32
+ * text are the only interactive surface (a single asset link), which keeps
33
+ * browse grids and carousels fast even when many cards render. Surfaces that
34
+ * need owner/marketplace actions use the richer `TokenCard` / `ListingCard`.
35
+ *
36
+ * Layout: square image → title → optional subtitle → footer row with the
37
+ * (optional) ipType icon on the left and the (optional) price on the right.
38
+ */
39
+ declare function AssetCard({ href, name, image, subtitle, ipType, price, fallbackId, indexing, ipTypeBaseUrl, className, }: AssetCardProps): react_jsx_runtime.JSX.Element;
40
+ declare function AssetCardSkeleton(): react_jsx_runtime.JSX.Element;
41
+
42
+ export { AssetCard, type AssetCardPrice, type AssetCardProps, AssetCardSkeleton };
@@ -0,0 +1,42 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ interface AssetCardPrice {
4
+ formatted?: string | null;
5
+ currency?: string | null;
6
+ }
7
+ interface AssetCardProps {
8
+ /** Asset detail link. */
9
+ href: string;
10
+ /** Asset title. */
11
+ name: string;
12
+ /** Raw image (ipfs:// or http) — resolved internally. */
13
+ image?: string | null;
14
+ /** Secondary line under the title (collection or description). */
15
+ subtitle?: string | null;
16
+ /** IP type (apiValue or label) — renders the icon badge on the footer left. */
17
+ ipType?: string | null;
18
+ /** Listing price; omit/null shows no price. */
19
+ price?: AssetCardPrice | null;
20
+ /** Shown when the image is missing/errors (e.g. token id). */
21
+ fallbackId?: string | null;
22
+ /** Show the "Indexing…" overlay. */
23
+ indexing?: boolean;
24
+ /** Base URL for the ipType badge link. Default "" (relative). */
25
+ ipTypeBaseUrl?: string;
26
+ className?: string;
27
+ }
28
+ /**
29
+ * The platform's shared asset card — lean and presentational.
30
+ *
31
+ * Intentionally has no action buttons, dropdowns or dialogs: the image and
32
+ * text are the only interactive surface (a single asset link), which keeps
33
+ * browse grids and carousels fast even when many cards render. Surfaces that
34
+ * need owner/marketplace actions use the richer `TokenCard` / `ListingCard`.
35
+ *
36
+ * Layout: square image → title → optional subtitle → footer row with the
37
+ * (optional) ipType icon on the left and the (optional) price on the right.
38
+ */
39
+ declare function AssetCard({ href, name, image, subtitle, ipType, price, fallbackId, indexing, ipTypeBaseUrl, className, }: AssetCardProps): react_jsx_runtime.JSX.Element;
40
+ declare function AssetCardSkeleton(): react_jsx_runtime.JSX.Element;
41
+
42
+ export { AssetCard, type AssetCardPrice, type AssetCardProps, AssetCardSkeleton };
@@ -0,0 +1,87 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { useState } from "react";
4
+ import Link from "next/link";
5
+ import Image from "next/image";
6
+ import { Loader2 } from "lucide-react";
7
+ import { cn } from "../utils/cn.js";
8
+ import { ipfsToHttp } from "../utils/ipfs.js";
9
+ import { formatDisplayPrice } from "../utils/format.js";
10
+ import { CurrencyIcon } from "./currency-icon.js";
11
+ import { IpTypeBadge } from "./ip-type-badge.js";
12
+ function AssetCard({
13
+ href,
14
+ name,
15
+ image,
16
+ subtitle,
17
+ ipType,
18
+ price,
19
+ fallbackId,
20
+ indexing = false,
21
+ ipTypeBaseUrl = "",
22
+ className
23
+ }) {
24
+ const [imgError, setImgError] = useState(false);
25
+ const resolved = image ? ipfsToHttp(image) : null;
26
+ const hasPrice = !!price?.formatted;
27
+ const showFooter = !!ipType || hasPrice;
28
+ return /* @__PURE__ */ jsxs(
29
+ "div",
30
+ {
31
+ className: cn(
32
+ "card-base group relative flex flex-col w-full transition-colors hover:border-foreground/20",
33
+ className
34
+ ),
35
+ children: [
36
+ /* @__PURE__ */ jsx(Link, { href, className: "block", children: /* @__PURE__ */ jsxs("div", { className: "relative aspect-square bg-muted overflow-hidden", children: [
37
+ resolved && !imgError ? /* @__PURE__ */ jsx(
38
+ Image,
39
+ {
40
+ src: resolved,
41
+ alt: name,
42
+ fill: true,
43
+ unoptimized: true,
44
+ sizes: "(max-width: 640px) 50vw, (max-width: 1024px) 33vw, 22vw",
45
+ className: "object-cover transition-transform duration-500 group-hover:scale-105",
46
+ onError: () => setImgError(true)
47
+ }
48
+ ) : /* @__PURE__ */ jsx("div", { className: "absolute inset-0 flex items-center justify-center bg-gradient-to-br from-brand-purple/15 to-brand-blue/15", children: /* @__PURE__ */ jsxs("span", { className: "text-2xl font-mono text-muted-foreground", children: [
49
+ "#",
50
+ fallbackId ?? "?"
51
+ ] }) }),
52
+ indexing && /* @__PURE__ */ jsxs("div", { className: "absolute bottom-0 inset-x-0 flex items-center justify-center gap-1.5 bg-black/50 backdrop-blur-sm py-1.5", children: [
53
+ /* @__PURE__ */ jsx(Loader2, { className: "h-3 w-3 animate-spin text-white/70" }),
54
+ /* @__PURE__ */ jsx("span", { className: "text-[10px] text-white/70", children: "Indexing\u2026" })
55
+ ] })
56
+ ] }) }),
57
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5 px-3 py-3", children: [
58
+ /* @__PURE__ */ jsxs(Link, { href, className: "block min-w-0", children: [
59
+ /* @__PURE__ */ jsx("p", { className: "text-sm font-bold line-clamp-1 leading-snug", children: name }),
60
+ subtitle && /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground line-clamp-1 leading-snug", children: subtitle })
61
+ ] }),
62
+ showFooter && /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2", children: [
63
+ ipType ? /* @__PURE__ */ jsx(IpTypeBadge, { ipType, size: "sm", baseUrl: ipTypeBaseUrl }) : /* @__PURE__ */ jsx("span", {}),
64
+ hasPrice && /* @__PURE__ */ jsxs("span", { className: "inline-flex shrink-0 items-center gap-1 text-sm font-bold leading-none", children: [
65
+ price.currency && /* @__PURE__ */ jsx(CurrencyIcon, { symbol: price.currency, size: 12 }),
66
+ formatDisplayPrice(price.formatted)
67
+ ] })
68
+ ] })
69
+ ] })
70
+ ]
71
+ }
72
+ );
73
+ }
74
+ function AssetCardSkeleton() {
75
+ return /* @__PURE__ */ jsxs("div", { className: "card-base flex flex-col w-full", children: [
76
+ /* @__PURE__ */ jsx("div", { className: "aspect-square w-full animate-pulse bg-muted" }),
77
+ /* @__PURE__ */ jsxs("div", { className: "px-3 py-3 space-y-1.5", children: [
78
+ /* @__PURE__ */ jsx("div", { className: "h-4 w-3/4 rounded-md animate-pulse bg-muted" }),
79
+ /* @__PURE__ */ jsx("div", { className: "h-3.5 w-2/5 rounded-md animate-pulse bg-muted" })
80
+ ] })
81
+ ] });
82
+ }
83
+ export {
84
+ AssetCard,
85
+ AssetCardSkeleton
86
+ };
87
+ //# sourceMappingURL=asset-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/asset-card.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport Link from \"next/link\";\nimport Image from \"next/image\";\nimport { Loader2 } from \"lucide-react\";\nimport { cn } from \"../utils/cn.js\";\nimport { ipfsToHttp } from \"../utils/ipfs.js\";\nimport { formatDisplayPrice } from \"../utils/format.js\";\nimport { CurrencyIcon } from \"./currency-icon.js\";\nimport { IpTypeBadge } from \"./ip-type-badge.js\";\n\nexport interface AssetCardPrice {\n formatted?: string | null;\n currency?: string | null;\n}\n\nexport interface AssetCardProps {\n /** Asset detail link. */\n href: string;\n /** Asset title. */\n name: string;\n /** Raw image (ipfs:// or http) — resolved internally. */\n image?: string | null;\n /** Secondary line under the title (collection or description). */\n subtitle?: string | null;\n /** IP type (apiValue or label) — renders the icon badge on the footer left. */\n ipType?: string | null;\n /** Listing price; omit/null shows no price. */\n price?: AssetCardPrice | null;\n /** Shown when the image is missing/errors (e.g. token id). */\n fallbackId?: string | null;\n /** Show the \"Indexing…\" overlay. */\n indexing?: boolean;\n /** Base URL for the ipType badge link. Default \"\" (relative). */\n ipTypeBaseUrl?: string;\n className?: string;\n}\n\n/**\n * The platform's shared asset card — lean and presentational.\n *\n * Intentionally has no action buttons, dropdowns or dialogs: the image and\n * text are the only interactive surface (a single asset link), which keeps\n * browse grids and carousels fast even when many cards render. Surfaces that\n * need owner/marketplace actions use the richer `TokenCard` / `ListingCard`.\n *\n * Layout: square image → title → optional subtitle → footer row with the\n * (optional) ipType icon on the left and the (optional) price on the right.\n */\nexport function AssetCard({\n href,\n name,\n image,\n subtitle,\n ipType,\n price,\n fallbackId,\n indexing = false,\n ipTypeBaseUrl = \"\",\n className,\n}: AssetCardProps) {\n const [imgError, setImgError] = useState(false);\n const resolved = image ? ipfsToHttp(image) : null;\n const hasPrice = !!price?.formatted;\n const showFooter = !!ipType || hasPrice;\n\n return (\n <div\n className={cn(\n \"card-base group relative flex flex-col w-full transition-colors hover:border-foreground/20\",\n className\n )}\n >\n {/* Image */}\n <Link href={href} className=\"block\">\n <div className=\"relative aspect-square bg-muted overflow-hidden\">\n {resolved && !imgError ? (\n <Image\n src={resolved}\n alt={name}\n fill\n unoptimized\n sizes=\"(max-width: 640px) 50vw, (max-width: 1024px) 33vw, 22vw\"\n className=\"object-cover transition-transform duration-500 group-hover:scale-105\"\n onError={() => setImgError(true)}\n />\n ) : (\n <div className=\"absolute inset-0 flex items-center justify-center bg-gradient-to-br from-brand-purple/15 to-brand-blue/15\">\n <span className=\"text-2xl font-mono text-muted-foreground\">\n #{fallbackId ?? \"?\"}\n </span>\n </div>\n )}\n\n {indexing && (\n <div className=\"absolute bottom-0 inset-x-0 flex items-center justify-center gap-1.5 bg-black/50 backdrop-blur-sm py-1.5\">\n <Loader2 className=\"h-3 w-3 animate-spin text-white/70\" />\n <span className=\"text-[10px] text-white/70\">Indexing…</span>\n </div>\n )}\n </div>\n </Link>\n\n {/* Body */}\n <div className=\"flex flex-col gap-1.5 px-3 py-3\">\n <Link href={href} className=\"block min-w-0\">\n <p className=\"text-sm font-bold line-clamp-1 leading-snug\">{name}</p>\n {subtitle && (\n <p className=\"text-xs text-muted-foreground line-clamp-1 leading-snug\">\n {subtitle}\n </p>\n )}\n </Link>\n\n {showFooter && (\n <div className=\"flex items-center justify-between gap-2\">\n {ipType ? (\n <IpTypeBadge ipType={ipType} size=\"sm\" baseUrl={ipTypeBaseUrl} />\n ) : (\n <span />\n )}\n {hasPrice && (\n <span className=\"inline-flex shrink-0 items-center gap-1 text-sm font-bold leading-none\">\n {price!.currency && <CurrencyIcon symbol={price!.currency} size={12} />}\n {formatDisplayPrice(price!.formatted!)}\n </span>\n )}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nexport function AssetCardSkeleton() {\n return (\n <div className=\"card-base flex flex-col w-full\">\n <div className=\"aspect-square w-full animate-pulse bg-muted\" />\n <div className=\"px-3 py-3 space-y-1.5\">\n <div className=\"h-4 w-3/4 rounded-md animate-pulse bg-muted\" />\n <div className=\"h-3.5 w-2/5 rounded-md animate-pulse bg-muted\" />\n </div>\n </div>\n );\n}\n"],"mappings":";AA8EY,cAWE,YAXF;AA5EZ,SAAS,gBAAgB;AACzB,OAAO,UAAU;AACjB,OAAO,WAAW;AAClB,SAAS,eAAe;AACxB,SAAS,UAAU;AACnB,SAAS,kBAAkB;AAC3B,SAAS,0BAA0B;AACnC,SAAS,oBAAoB;AAC7B,SAAS,mBAAmB;AAwCrB,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB;AACF,GAAmB;AACjB,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAC9C,QAAM,WAAW,QAAQ,WAAW,KAAK,IAAI;AAC7C,QAAM,WAAW,CAAC,CAAC,OAAO;AAC1B,QAAM,aAAa,CAAC,CAAC,UAAU;AAE/B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MAGA;AAAA,4BAAC,QAAK,MAAY,WAAU,SAC1B,+BAAC,SAAI,WAAU,mDACZ;AAAA,sBAAY,CAAC,WACZ;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,KAAK;AAAA,cACL,MAAI;AAAA,cACJ,aAAW;AAAA,cACX,OAAM;AAAA,cACN,WAAU;AAAA,cACV,SAAS,MAAM,YAAY,IAAI;AAAA;AAAA,UACjC,IAEA,oBAAC,SAAI,WAAU,6GACb,+BAAC,UAAK,WAAU,4CAA2C;AAAA;AAAA,YACvD,cAAc;AAAA,aAClB,GACF;AAAA,UAGD,YACC,qBAAC,SAAI,WAAU,4GACb;AAAA,gCAAC,WAAQ,WAAU,sCAAqC;AAAA,YACxD,oBAAC,UAAK,WAAU,6BAA4B,4BAAS;AAAA,aACvD;AAAA,WAEJ,GACF;AAAA,QAGA,qBAAC,SAAI,WAAU,mCACb;AAAA,+BAAC,QAAK,MAAY,WAAU,iBAC1B;AAAA,gCAAC,OAAE,WAAU,+CAA+C,gBAAK;AAAA,YAChE,YACC,oBAAC,OAAE,WAAU,2DACV,oBACH;AAAA,aAEJ;AAAA,UAEC,cACC,qBAAC,SAAI,WAAU,2CACZ;AAAA,qBACC,oBAAC,eAAY,QAAgB,MAAK,MAAK,SAAS,eAAe,IAE/D,oBAAC,UAAK;AAAA,YAEP,YACC,qBAAC,UAAK,WAAU,0EACb;AAAA,oBAAO,YAAY,oBAAC,gBAAa,QAAQ,MAAO,UAAU,MAAM,IAAI;AAAA,cACpE,mBAAmB,MAAO,SAAU;AAAA,eACvC;AAAA,aAEJ;AAAA,WAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;AAEO,SAAS,oBAAoB;AAClC,SACE,qBAAC,SAAI,WAAU,kCACb;AAAA,wBAAC,SAAI,WAAU,+CAA8C;AAAA,IAC7D,qBAAC,SAAI,WAAU,yBACb;AAAA,0BAAC,SAAI,WAAU,+CAA8C;AAAA,MAC7D,oBAAC,SAAI,WAAU,iDAAgD;AAAA,OACjE;AAAA,KACF;AAEJ;","names":[]}
@@ -28,14 +28,25 @@ var import_ip_type_display = require("./ip-type-display.js");
28
28
  var import_address_display = require("./address-display.js");
29
29
  var import_license_summary = require("../utils/license-summary.js");
30
30
  const isAddressLike = (v) => !!v && /^0x[0-9a-fA-F]{16,}$/.test(v.trim());
31
- function FactRow({ icon, label, value }) {
32
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center justify-between gap-4 py-2.5 border-b border-border/40", children: [
33
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "flex items-center gap-2 text-sm text-muted-foreground min-w-0", children: [
34
- icon ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-muted-foreground/60 shrink-0", children: icon }) : null,
35
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "truncate", children: label })
36
- ] }),
37
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-sm font-semibold text-foreground text-right truncate", children: value })
38
- ] });
31
+ function Cell({
32
+ icon,
33
+ label,
34
+ value,
35
+ wide
36
+ }) {
37
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
38
+ "div",
39
+ {
40
+ className: `flex flex-col justify-between gap-2 rounded-xl bg-muted/25 ring-1 ring-border/40 p-3.5 ${wide ? "col-span-2" : ""}`,
41
+ children: [
42
+ icon ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-primary/70", children: icon }) : null,
43
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-0.5", children: [
44
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-[10px] font-medium uppercase tracking-wider text-muted-foreground truncate", title: label, children: label }),
45
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "text-sm font-bold text-foreground truncate", children: value })
46
+ ] })
47
+ ]
48
+ }
49
+ );
39
50
  }
40
51
  function AssetOverviewContent({
41
52
  attributes,
@@ -60,7 +71,6 @@ function AssetOverviewContent({
60
71
  { icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.UserCheck, { className: "h-4 w-4" }), label: "Attribution", value: attribution },
61
72
  { icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Globe, { className: "h-4 w-4" }), label: "Territory", value: territory },
62
73
  { icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Bot, { className: "h-4 w-4" }), label: "AI & data mining", value: aiPolicy },
63
- { icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ShieldCheck, { className: "h-4 w-4" }), label: "License", value: licenseType },
64
74
  { icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Percent, { className: "h-4 w-4" }), label: "Royalty", value: royalty },
65
75
  { icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Calendar, { className: "h-4 w-4" }), label: "Registered", value: registration }
66
76
  ].filter((row) => !!row.value);
@@ -68,20 +78,33 @@ function AssetOverviewContent({
68
78
  hasTemplateData ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ip_type_display.IPTypeDisplay, { attributes }) : null,
69
79
  hasLicenseData ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { className: "space-y-3", children: [
70
80
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h3", { className: "text-xs font-semibold uppercase tracking-wider text-muted-foreground", children: "Rights" }),
71
- summary ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-[15px] font-medium leading-relaxed text-foreground/90", children: summary }) : null,
72
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "grid grid-cols-1 sm:grid-cols-2 sm:gap-x-10", children: facts.map(({ icon, label, value }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(FactRow, { icon, label, value }, label)) }),
73
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", { className: "flex items-center gap-1.5 pt-1 text-xs text-muted-foreground/70", children: [
74
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ShieldCheck, { className: "h-3.5 w-3.5 shrink-0" }),
75
- "Kept in permanent, tamper-proof storage \xB7 recognized under international copyright law"
76
- ] })
81
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "relative", children: [
82
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
83
+ "div",
84
+ {
85
+ "aria-hidden": true,
86
+ className: "aurora-purple pointer-events-none",
87
+ style: { position: "absolute", width: 260, height: 260, top: -40, left: "30%" }
88
+ }
89
+ ),
90
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "relative grid grid-cols-2 sm:grid-cols-4 gap-3 [grid-auto-flow:dense] auto-rows-[minmax(6rem,auto)]", children: [
91
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "col-span-2 sm:row-span-2 flex flex-col justify-between gap-4 rounded-2xl bg-gradient-to-br from-primary/10 via-primary/5 to-accent/10 ring-1 ring-primary/15 p-5", children: [
92
+ licenseType ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "pill-badge self-start text-[10px] uppercase tracking-wider", children: licenseType }) : null,
93
+ summary ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-base sm:text-lg font-semibold leading-snug text-foreground", children: summary }) : null
94
+ ] }),
95
+ facts.map(({ icon, label, value }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Cell, { icon, label, value }, label))
96
+ ] })
97
+ ] }),
98
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-xs text-muted-foreground/70", children: "Kept in permanent, tamper-proof storage \xB7 recognized under international copyright law" })
77
99
  ] }) : null,
78
- displayAttributes.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { className: "space-y-1", children: [
100
+ displayAttributes.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { className: "space-y-3", children: [
79
101
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h3", { className: "text-xs font-semibold uppercase tracking-wider text-muted-foreground", children: "Details" }),
80
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "grid grid-cols-1 sm:grid-cols-2 sm:gap-x-10", children: displayAttributes.map((attribute, index) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
81
- FactRow,
102
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "grid grid-cols-2 sm:grid-cols-4 gap-3 [grid-auto-flow:dense] auto-rows-[minmax(6rem,auto)]", children: displayAttributes.map((attribute, index) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
103
+ Cell,
82
104
  {
83
105
  label: attribute.trait_type ?? "Trait",
84
- value: isAddressLike(attribute.value) ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_address_display.AddressDisplay, { address: attribute.value, chars: 4, className: "text-sm font-semibold" }) : attribute.value ?? "\u2014"
106
+ wide: isAddressLike(attribute.value),
107
+ value: isAddressLike(attribute.value) ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_address_display.AddressDisplay, { address: attribute.value, chars: 4, className: "text-sm font-bold" }) : attribute.value ?? "\u2014"
85
108
  },
86
109
  index
87
110
  )) })
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/asset-overview-content.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { Bot, Calendar, DollarSign, GitBranch, Globe, Percent, ShieldCheck, UserCheck } from \"lucide-react\";\nimport { IPTypeDisplay } from \"./ip-type-display.js\";\nimport { AddressDisplay } from \"./address-display.js\";\nimport { licenseSummary } from \"../utils/license-summary.js\";\n\ninterface AssetAttribute {\n trait_type?: string;\n value?: string;\n}\n\ninterface AssetOverviewContentProps {\n attributes: AssetAttribute[];\n hasTemplateData: boolean;\n isDisplayAttr: (attribute: AssetAttribute) => boolean;\n}\n\nconst isAddressLike = (v?: string): boolean => !!v && /^0x[0-9a-fA-F]{16,}$/.test(v.trim());\n\n/** A tidy label value row: muted label on the left, bold value on the right,\n * hairline divider underneath. Used for both Rights and Details so the whole\n * tab reads like one calm sheet — no grey boxes. */\nfunction FactRow({ icon, label, value }: { icon?: ReactNode; label: string; value: ReactNode }) {\n return (\n <div className=\"flex items-center justify-between gap-4 py-2.5 border-b border-border/40\">\n <span className=\"flex items-center gap-2 text-sm text-muted-foreground min-w-0\">\n {icon ? <span className=\"text-muted-foreground/60 shrink-0\">{icon}</span> : null}\n <span className=\"truncate\">{label}</span>\n </span>\n <span className=\"text-sm font-semibold text-foreground text-right truncate\">{value}</span>\n </div>\n );\n}\n\n/**\n * Asset Overview tab. One calm sheet: an optional IP-type block, a single\n * \"Rights\" summary (plain-language lead line + a scannable fact list + a quiet\n * trust footnote), then a light \"Details\" list. No second license block in the\n * hero, no grey-box bento, no \"protected worldwide\" banner.\n */\nexport function AssetOverviewContent({\n attributes,\n hasTemplateData,\n isDisplayAttr,\n}: AssetOverviewContentProps) {\n const attr = (trait: string) => attributes.find((attribute) => attribute.trait_type === trait)?.value;\n const licenseType = attr(\"License\");\n const commercialUse = attr(\"Commercial Use\");\n const derivatives = attr(\"Derivatives\");\n const attribution = attr(\"Attribution\");\n const territory = attr(\"Territory\");\n const aiPolicy = attr(\"AI Policy\");\n const royalty = attr(\"Royalty\");\n const registration = attr(\"Registration\");\n const summary = licenseSummary(attributes);\n const hasLicenseData = !!(licenseType || commercialUse || derivatives || attribution);\n const displayAttributes = attributes.filter((attribute) => isDisplayAttr(attribute));\n\n const facts = [\n { icon: <DollarSign className=\"h-4 w-4\" />, label: \"Commercial use\", value: commercialUse },\n { icon: <GitBranch className=\"h-4 w-4\" />, label: \"Derivatives\", value: derivatives },\n { icon: <UserCheck className=\"h-4 w-4\" />, label: \"Attribution\", value: attribution },\n { icon: <Globe className=\"h-4 w-4\" />, label: \"Territory\", value: territory },\n { icon: <Bot className=\"h-4 w-4\" />, label: \"AI & data mining\", value: aiPolicy },\n { icon: <ShieldCheck className=\"h-4 w-4\" />, label: \"License\", value: licenseType },\n { icon: <Percent className=\"h-4 w-4\" />, label: \"Royalty\", value: royalty },\n { icon: <Calendar className=\"h-4 w-4\" />, label: \"Registered\", value: registration },\n ].filter((row) => !!row.value);\n\n return (\n <div className=\"mt-4 space-y-7\">\n {hasTemplateData ? <IPTypeDisplay attributes={attributes} /> : null}\n\n {hasLicenseData ? (\n <section className=\"space-y-3\">\n <h3 className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">Rights</h3>\n {summary ? (\n <p className=\"text-[15px] font-medium leading-relaxed text-foreground/90\">{summary}</p>\n ) : null}\n <div className=\"grid grid-cols-1 sm:grid-cols-2 sm:gap-x-10\">\n {facts.map(({ icon, label, value }) => (\n <FactRow key={label} icon={icon} label={label} value={value} />\n ))}\n </div>\n <p className=\"flex items-center gap-1.5 pt-1 text-xs text-muted-foreground/70\">\n <ShieldCheck className=\"h-3.5 w-3.5 shrink-0\" />\n Kept in permanent, tamper-proof storage · recognized under international copyright law\n </p>\n </section>\n ) : null}\n\n {displayAttributes.length > 0 ? (\n <section className=\"space-y-1\">\n <h3 className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">Details</h3>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 sm:gap-x-10\">\n {displayAttributes.map((attribute, index) => (\n <FactRow\n key={index}\n label={attribute.trait_type ?? \"Trait\"}\n value={\n isAddressLike(attribute.value) ? (\n <AddressDisplay address={attribute.value!} chars={4} className=\"text-sm font-semibold\" />\n ) : (\n attribute.value ?? \"—\"\n )\n }\n />\n ))}\n </div>\n </section>\n ) : null}\n\n {!hasTemplateData && !hasLicenseData && displayAttributes.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">No additional details available.</p>\n ) : null}\n </div>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/components/asset-overview-content.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { Bot, Calendar, DollarSign, GitBranch, Globe, Percent, UserCheck } from \"lucide-react\";\nimport { IPTypeDisplay } from \"./ip-type-display.js\";\nimport { AddressDisplay } from \"./address-display.js\";\nimport { licenseSummary } from \"../utils/license-summary.js\";\n\ninterface AssetAttribute {\n trait_type?: string;\n value?: string;\n}\n\ninterface AssetOverviewContentProps {\n attributes: AssetAttribute[];\n hasTemplateData: boolean;\n isDisplayAttr: (attribute: AssetAttribute) => boolean;\n}\n\nconst isAddressLike = (v?: string): boolean => !!v && /^0x[0-9a-fA-F]{16,}$/.test(v.trim());\n\n/** A standard bento square: a brand-tinted icon, an uppercase label, a bold value.\n * `wide` stretches it across two columns for an emphasized detail. */\nfunction Cell({\n icon,\n label,\n value,\n wide,\n}: {\n icon?: ReactNode;\n label: string;\n value: ReactNode;\n wide?: boolean;\n}) {\n return (\n <div\n className={`flex flex-col justify-between gap-2 rounded-xl bg-muted/25 ring-1 ring-border/40 p-3.5 ${\n wide ? \"col-span-2\" : \"\"\n }`}\n >\n {icon ? <span className=\"text-primary/70\">{icon}</span> : null}\n <div className=\"space-y-0.5\">\n <p className=\"text-[10px] font-medium uppercase tracking-wider text-muted-foreground truncate\" title={label}>\n {label}\n </p>\n <div className=\"text-sm font-bold text-foreground truncate\">{value}</div>\n </div>\n </div>\n );\n}\n\n/**\n * Asset Overview tab, as a Bento 2.0 grid: an asymmetrical lattice of rounded\n * compartments on a soft brand light-leak, uniform gaps throughout. The license\n * summary is the emphasized cell (stretched 2×2, brand-gradient wash + license\n * stamp + emerald trust seal); each right is a standard square; Details follow.\n * Uses only design-system tokens (brand-* / primary / aurora / emerald-for-trust).\n */\nexport function AssetOverviewContent({\n attributes,\n hasTemplateData,\n isDisplayAttr,\n}: AssetOverviewContentProps) {\n const attr = (trait: string) => attributes.find((attribute) => attribute.trait_type === trait)?.value;\n const licenseType = attr(\"License\");\n const commercialUse = attr(\"Commercial Use\");\n const derivatives = attr(\"Derivatives\");\n const attribution = attr(\"Attribution\");\n const territory = attr(\"Territory\");\n const aiPolicy = attr(\"AI Policy\");\n const royalty = attr(\"Royalty\");\n const registration = attr(\"Registration\");\n const summary = licenseSummary(attributes);\n const hasLicenseData = !!(licenseType || commercialUse || derivatives || attribution);\n const displayAttributes = attributes.filter((attribute) => isDisplayAttr(attribute));\n\n const facts = [\n { icon: <DollarSign className=\"h-4 w-4\" />, label: \"Commercial use\", value: commercialUse },\n { icon: <GitBranch className=\"h-4 w-4\" />, label: \"Derivatives\", value: derivatives },\n { icon: <UserCheck className=\"h-4 w-4\" />, label: \"Attribution\", value: attribution },\n { icon: <Globe className=\"h-4 w-4\" />, label: \"Territory\", value: territory },\n { icon: <Bot className=\"h-4 w-4\" />, label: \"AI & data mining\", value: aiPolicy },\n { icon: <Percent className=\"h-4 w-4\" />, label: \"Royalty\", value: royalty },\n { icon: <Calendar className=\"h-4 w-4\" />, label: \"Registered\", value: registration },\n ].filter((row) => !!row.value);\n\n return (\n <div className=\"mt-4 space-y-7\">\n {hasTemplateData ? <IPTypeDisplay attributes={attributes} /> : null}\n\n {hasLicenseData ? (\n <section className=\"space-y-3\">\n <h3 className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">Rights</h3>\n <div className=\"relative\">\n {/* soft brand light-leak behind the lattice */}\n <div\n aria-hidden\n className=\"aurora-purple pointer-events-none\"\n style={{ position: \"absolute\", width: 260, height: 260, top: -40, left: \"30%\" }}\n />\n <div className=\"relative grid grid-cols-2 sm:grid-cols-4 gap-3 [grid-auto-flow:dense] auto-rows-[minmax(6rem,auto)]\">\n {/* emphasized cell — the license summary, stretched 2×2 */}\n <div className=\"col-span-2 sm:row-span-2 flex flex-col justify-between gap-4 rounded-2xl bg-gradient-to-br from-primary/10 via-primary/5 to-accent/10 ring-1 ring-primary/15 p-5\">\n {licenseType ? (\n <span className=\"pill-badge self-start text-[10px] uppercase tracking-wider\">{licenseType}</span>\n ) : null}\n {summary ? (\n <p className=\"text-base sm:text-lg font-semibold leading-snug text-foreground\">{summary}</p>\n ) : null}\n </div>\n\n {facts.map(({ icon, label, value }) => (\n <Cell key={label} icon={icon} label={label} value={value} />\n ))}\n </div>\n </div>\n <p className=\"text-xs text-muted-foreground/70\">\n Kept in permanent, tamper-proof storage · recognized under international copyright law\n </p>\n </section>\n ) : null}\n\n {displayAttributes.length > 0 ? (\n <section className=\"space-y-3\">\n <h3 className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">Details</h3>\n <div className=\"grid grid-cols-2 sm:grid-cols-4 gap-3 [grid-auto-flow:dense] auto-rows-[minmax(6rem,auto)]\">\n {displayAttributes.map((attribute, index) => (\n <Cell\n key={index}\n label={attribute.trait_type ?? \"Trait\"}\n wide={isAddressLike(attribute.value)}\n value={\n isAddressLike(attribute.value) ? (\n <AddressDisplay address={attribute.value!} chars={4} className=\"text-sm font-bold\" />\n ) : (\n attribute.value ?? \"—\"\n )\n }\n />\n ))}\n </div>\n </section>\n ) : null}\n\n {!hasTemplateData && !hasLicenseData && displayAttributes.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">No additional details available.</p>\n ) : null}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAwCc;AArCd,0BAAgF;AAChF,6BAA8B;AAC9B,6BAA+B;AAC/B,6BAA+B;AAa/B,MAAM,gBAAgB,CAAC,MAAwB,CAAC,CAAC,KAAK,uBAAuB,KAAK,EAAE,KAAK,CAAC;AAI1F,SAAS,KAAK;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,0FACT,OAAO,eAAe,EACxB;AAAA,MAEC;AAAA,eAAO,4CAAC,UAAK,WAAU,mBAAmB,gBAAK,IAAU;AAAA,QAC1D,6CAAC,SAAI,WAAU,eACb;AAAA,sDAAC,OAAE,WAAU,mFAAkF,OAAO,OACnG,iBACH;AAAA,UACA,4CAAC,SAAI,WAAU,8CAA8C,iBAAM;AAAA,WACrE;AAAA;AAAA;AAAA,EACF;AAEJ;AASO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AACF,GAA8B;AAC5B,QAAM,OAAO,CAAC,UAAkB,WAAW,KAAK,CAAC,cAAc,UAAU,eAAe,KAAK,GAAG;AAChG,QAAM,cAAc,KAAK,SAAS;AAClC,QAAM,gBAAgB,KAAK,gBAAgB;AAC3C,QAAM,cAAc,KAAK,aAAa;AACtC,QAAM,cAAc,KAAK,aAAa;AACtC,QAAM,YAAY,KAAK,WAAW;AAClC,QAAM,WAAW,KAAK,WAAW;AACjC,QAAM,UAAU,KAAK,SAAS;AAC9B,QAAM,eAAe,KAAK,cAAc;AACxC,QAAM,cAAU,uCAAe,UAAU;AACzC,QAAM,iBAAiB,CAAC,EAAE,eAAe,iBAAiB,eAAe;AACzE,QAAM,oBAAoB,WAAW,OAAO,CAAC,cAAc,cAAc,SAAS,CAAC;AAEnF,QAAM,QAAQ;AAAA,IACZ,EAAE,MAAM,4CAAC,kCAAW,WAAU,WAAU,GAAI,OAAO,kBAAkB,OAAO,cAAc;AAAA,IAC1F,EAAE,MAAM,4CAAC,iCAAU,WAAU,WAAU,GAAI,OAAO,eAAe,OAAO,YAAY;AAAA,IACpF,EAAE,MAAM,4CAAC,iCAAU,WAAU,WAAU,GAAI,OAAO,eAAe,OAAO,YAAY;AAAA,IACpF,EAAE,MAAM,4CAAC,6BAAM,WAAU,WAAU,GAAI,OAAO,aAAa,OAAO,UAAU;AAAA,IAC5E,EAAE,MAAM,4CAAC,2BAAI,WAAU,WAAU,GAAI,OAAO,oBAAoB,OAAO,SAAS;AAAA,IAChF,EAAE,MAAM,4CAAC,+BAAQ,WAAU,WAAU,GAAI,OAAO,WAAW,OAAO,QAAQ;AAAA,IAC1E,EAAE,MAAM,4CAAC,gCAAS,WAAU,WAAU,GAAI,OAAO,cAAc,OAAO,aAAa;AAAA,EACrF,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK;AAE7B,SACE,6CAAC,SAAI,WAAU,kBACZ;AAAA,sBAAkB,4CAAC,wCAAc,YAAwB,IAAK;AAAA,IAE9D,iBACC,6CAAC,aAAQ,WAAU,aACjB;AAAA,kDAAC,QAAG,WAAU,wEAAuE,oBAAM;AAAA,MAC3F,6CAAC,SAAI,WAAU,YAEb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,eAAW;AAAA,YACX,WAAU;AAAA,YACV,OAAO,EAAE,UAAU,YAAY,OAAO,KAAK,QAAQ,KAAK,KAAK,KAAK,MAAM,MAAM;AAAA;AAAA,QAChF;AAAA,QACA,6CAAC,SAAI,WAAU,uGAEb;AAAA,uDAAC,SAAI,WAAU,oKACZ;AAAA,0BACC,4CAAC,UAAK,WAAU,8DAA8D,uBAAY,IACxF;AAAA,YACH,UACC,4CAAC,OAAE,WAAU,mEAAmE,mBAAQ,IACtF;AAAA,aACN;AAAA,UAEC,MAAM,IAAI,CAAC,EAAE,MAAM,OAAO,MAAM,MAC/B,4CAAC,QAAiB,MAAY,OAAc,SAAjC,KAA+C,CAC3D;AAAA,WACH;AAAA,SACF;AAAA,MACA,4CAAC,OAAE,WAAU,oCAAmC,uGAEhD;AAAA,OACF,IACE;AAAA,IAEH,kBAAkB,SAAS,IAC1B,6CAAC,aAAQ,WAAU,aACjB;AAAA,kDAAC,QAAG,WAAU,wEAAuE,qBAAO;AAAA,MAC5F,4CAAC,SAAI,WAAU,8FACZ,4BAAkB,IAAI,CAAC,WAAW,UACjC;AAAA,QAAC;AAAA;AAAA,UAEC,OAAO,UAAU,cAAc;AAAA,UAC/B,MAAM,cAAc,UAAU,KAAK;AAAA,UACnC,OACE,cAAc,UAAU,KAAK,IAC3B,4CAAC,yCAAe,SAAS,UAAU,OAAQ,OAAO,GAAG,WAAU,qBAAoB,IAEnF,UAAU,SAAS;AAAA;AAAA,QAPlB;AAAA,MAUP,CACD,GACH;AAAA,OACF,IACE;AAAA,IAEH,CAAC,mBAAmB,CAAC,kBAAkB,kBAAkB,WAAW,IACnE,4CAAC,OAAE,WAAU,iCAAgC,8CAAgC,IAC3E;AAAA,KACN;AAEJ;","names":[]}
@@ -10,10 +10,11 @@ interface AssetOverviewContentProps {
10
10
  isDisplayAttr: (attribute: AssetAttribute) => boolean;
11
11
  }
12
12
  /**
13
- * Asset Overview tab. One calm sheet: an optional IP-type block, a single
14
- * "Rights" summary (plain-language lead line + a scannable fact list + a quiet
15
- * trust footnote), then a light "Details" list. No second license block in the
16
- * hero, no grey-box bento, no "protected worldwide" banner.
13
+ * Asset Overview tab, as a Bento 2.0 grid: an asymmetrical lattice of rounded
14
+ * compartments on a soft brand light-leak, uniform gaps throughout. The license
15
+ * summary is the emphasized cell (stretched 2×2, brand-gradient wash + license
16
+ * stamp + emerald trust seal); each right is a standard square; Details follow.
17
+ * Uses only design-system tokens (brand-* / primary / aurora / emerald-for-trust).
17
18
  */
18
19
  declare function AssetOverviewContent({ attributes, hasTemplateData, isDisplayAttr, }: AssetOverviewContentProps): react_jsx_runtime.JSX.Element;
19
20
 
@@ -10,10 +10,11 @@ interface AssetOverviewContentProps {
10
10
  isDisplayAttr: (attribute: AssetAttribute) => boolean;
11
11
  }
12
12
  /**
13
- * Asset Overview tab. One calm sheet: an optional IP-type block, a single
14
- * "Rights" summary (plain-language lead line + a scannable fact list + a quiet
15
- * trust footnote), then a light "Details" list. No second license block in the
16
- * hero, no grey-box bento, no "protected worldwide" banner.
13
+ * Asset Overview tab, as a Bento 2.0 grid: an asymmetrical lattice of rounded
14
+ * compartments on a soft brand light-leak, uniform gaps throughout. The license
15
+ * summary is the emphasized cell (stretched 2×2, brand-gradient wash + license
16
+ * stamp + emerald trust seal); each right is a standard square; Details follow.
17
+ * Uses only design-system tokens (brand-* / primary / aurora / emerald-for-trust).
17
18
  */
18
19
  declare function AssetOverviewContent({ attributes, hasTemplateData, isDisplayAttr, }: AssetOverviewContentProps): react_jsx_runtime.JSX.Element;
19
20
 
@@ -1,18 +1,29 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
- import { Bot, Calendar, DollarSign, GitBranch, Globe, Percent, ShieldCheck, UserCheck } from "lucide-react";
3
+ import { Bot, Calendar, DollarSign, GitBranch, Globe, Percent, UserCheck } from "lucide-react";
4
4
  import { IPTypeDisplay } from "./ip-type-display.js";
5
5
  import { AddressDisplay } from "./address-display.js";
6
6
  import { licenseSummary } from "../utils/license-summary.js";
7
7
  const isAddressLike = (v) => !!v && /^0x[0-9a-fA-F]{16,}$/.test(v.trim());
8
- function FactRow({ icon, label, value }) {
9
- return /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-4 py-2.5 border-b border-border/40", children: [
10
- /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2 text-sm text-muted-foreground min-w-0", children: [
11
- icon ? /* @__PURE__ */ jsx("span", { className: "text-muted-foreground/60 shrink-0", children: icon }) : null,
12
- /* @__PURE__ */ jsx("span", { className: "truncate", children: label })
13
- ] }),
14
- /* @__PURE__ */ jsx("span", { className: "text-sm font-semibold text-foreground text-right truncate", children: value })
15
- ] });
8
+ function Cell({
9
+ icon,
10
+ label,
11
+ value,
12
+ wide
13
+ }) {
14
+ return /* @__PURE__ */ jsxs(
15
+ "div",
16
+ {
17
+ className: `flex flex-col justify-between gap-2 rounded-xl bg-muted/25 ring-1 ring-border/40 p-3.5 ${wide ? "col-span-2" : ""}`,
18
+ children: [
19
+ icon ? /* @__PURE__ */ jsx("span", { className: "text-primary/70", children: icon }) : null,
20
+ /* @__PURE__ */ jsxs("div", { className: "space-y-0.5", children: [
21
+ /* @__PURE__ */ jsx("p", { className: "text-[10px] font-medium uppercase tracking-wider text-muted-foreground truncate", title: label, children: label }),
22
+ /* @__PURE__ */ jsx("div", { className: "text-sm font-bold text-foreground truncate", children: value })
23
+ ] })
24
+ ]
25
+ }
26
+ );
16
27
  }
17
28
  function AssetOverviewContent({
18
29
  attributes,
@@ -37,7 +48,6 @@ function AssetOverviewContent({
37
48
  { icon: /* @__PURE__ */ jsx(UserCheck, { className: "h-4 w-4" }), label: "Attribution", value: attribution },
38
49
  { icon: /* @__PURE__ */ jsx(Globe, { className: "h-4 w-4" }), label: "Territory", value: territory },
39
50
  { icon: /* @__PURE__ */ jsx(Bot, { className: "h-4 w-4" }), label: "AI & data mining", value: aiPolicy },
40
- { icon: /* @__PURE__ */ jsx(ShieldCheck, { className: "h-4 w-4" }), label: "License", value: licenseType },
41
51
  { icon: /* @__PURE__ */ jsx(Percent, { className: "h-4 w-4" }), label: "Royalty", value: royalty },
42
52
  { icon: /* @__PURE__ */ jsx(Calendar, { className: "h-4 w-4" }), label: "Registered", value: registration }
43
53
  ].filter((row) => !!row.value);
@@ -45,20 +55,33 @@ function AssetOverviewContent({
45
55
  hasTemplateData ? /* @__PURE__ */ jsx(IPTypeDisplay, { attributes }) : null,
46
56
  hasLicenseData ? /* @__PURE__ */ jsxs("section", { className: "space-y-3", children: [
47
57
  /* @__PURE__ */ jsx("h3", { className: "text-xs font-semibold uppercase tracking-wider text-muted-foreground", children: "Rights" }),
48
- summary ? /* @__PURE__ */ jsx("p", { className: "text-[15px] font-medium leading-relaxed text-foreground/90", children: summary }) : null,
49
- /* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 sm:gap-x-10", children: facts.map(({ icon, label, value }) => /* @__PURE__ */ jsx(FactRow, { icon, label, value }, label)) }),
50
- /* @__PURE__ */ jsxs("p", { className: "flex items-center gap-1.5 pt-1 text-xs text-muted-foreground/70", children: [
51
- /* @__PURE__ */ jsx(ShieldCheck, { className: "h-3.5 w-3.5 shrink-0" }),
52
- "Kept in permanent, tamper-proof storage \xB7 recognized under international copyright law"
53
- ] })
58
+ /* @__PURE__ */ jsxs("div", { className: "relative", children: [
59
+ /* @__PURE__ */ jsx(
60
+ "div",
61
+ {
62
+ "aria-hidden": true,
63
+ className: "aurora-purple pointer-events-none",
64
+ style: { position: "absolute", width: 260, height: 260, top: -40, left: "30%" }
65
+ }
66
+ ),
67
+ /* @__PURE__ */ jsxs("div", { className: "relative grid grid-cols-2 sm:grid-cols-4 gap-3 [grid-auto-flow:dense] auto-rows-[minmax(6rem,auto)]", children: [
68
+ /* @__PURE__ */ jsxs("div", { className: "col-span-2 sm:row-span-2 flex flex-col justify-between gap-4 rounded-2xl bg-gradient-to-br from-primary/10 via-primary/5 to-accent/10 ring-1 ring-primary/15 p-5", children: [
69
+ licenseType ? /* @__PURE__ */ jsx("span", { className: "pill-badge self-start text-[10px] uppercase tracking-wider", children: licenseType }) : null,
70
+ summary ? /* @__PURE__ */ jsx("p", { className: "text-base sm:text-lg font-semibold leading-snug text-foreground", children: summary }) : null
71
+ ] }),
72
+ facts.map(({ icon, label, value }) => /* @__PURE__ */ jsx(Cell, { icon, label, value }, label))
73
+ ] })
74
+ ] }),
75
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground/70", children: "Kept in permanent, tamper-proof storage \xB7 recognized under international copyright law" })
54
76
  ] }) : null,
55
- displayAttributes.length > 0 ? /* @__PURE__ */ jsxs("section", { className: "space-y-1", children: [
77
+ displayAttributes.length > 0 ? /* @__PURE__ */ jsxs("section", { className: "space-y-3", children: [
56
78
  /* @__PURE__ */ jsx("h3", { className: "text-xs font-semibold uppercase tracking-wider text-muted-foreground", children: "Details" }),
57
- /* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 sm:gap-x-10", children: displayAttributes.map((attribute, index) => /* @__PURE__ */ jsx(
58
- FactRow,
79
+ /* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 sm:grid-cols-4 gap-3 [grid-auto-flow:dense] auto-rows-[minmax(6rem,auto)]", children: displayAttributes.map((attribute, index) => /* @__PURE__ */ jsx(
80
+ Cell,
59
81
  {
60
82
  label: attribute.trait_type ?? "Trait",
61
- value: isAddressLike(attribute.value) ? /* @__PURE__ */ jsx(AddressDisplay, { address: attribute.value, chars: 4, className: "text-sm font-semibold" }) : attribute.value ?? "\u2014"
83
+ wide: isAddressLike(attribute.value),
84
+ value: isAddressLike(attribute.value) ? /* @__PURE__ */ jsx(AddressDisplay, { address: attribute.value, chars: 4, className: "text-sm font-bold" }) : attribute.value ?? "\u2014"
62
85
  },
63
86
  index
64
87
  )) })
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/asset-overview-content.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { Bot, Calendar, DollarSign, GitBranch, Globe, Percent, ShieldCheck, UserCheck } from \"lucide-react\";\nimport { IPTypeDisplay } from \"./ip-type-display.js\";\nimport { AddressDisplay } from \"./address-display.js\";\nimport { licenseSummary } from \"../utils/license-summary.js\";\n\ninterface AssetAttribute {\n trait_type?: string;\n value?: string;\n}\n\ninterface AssetOverviewContentProps {\n attributes: AssetAttribute[];\n hasTemplateData: boolean;\n isDisplayAttr: (attribute: AssetAttribute) => boolean;\n}\n\nconst isAddressLike = (v?: string): boolean => !!v && /^0x[0-9a-fA-F]{16,}$/.test(v.trim());\n\n/** A tidy label value row: muted label on the left, bold value on the right,\n * hairline divider underneath. Used for both Rights and Details so the whole\n * tab reads like one calm sheet — no grey boxes. */\nfunction FactRow({ icon, label, value }: { icon?: ReactNode; label: string; value: ReactNode }) {\n return (\n <div className=\"flex items-center justify-between gap-4 py-2.5 border-b border-border/40\">\n <span className=\"flex items-center gap-2 text-sm text-muted-foreground min-w-0\">\n {icon ? <span className=\"text-muted-foreground/60 shrink-0\">{icon}</span> : null}\n <span className=\"truncate\">{label}</span>\n </span>\n <span className=\"text-sm font-semibold text-foreground text-right truncate\">{value}</span>\n </div>\n );\n}\n\n/**\n * Asset Overview tab. One calm sheet: an optional IP-type block, a single\n * \"Rights\" summary (plain-language lead line + a scannable fact list + a quiet\n * trust footnote), then a light \"Details\" list. No second license block in the\n * hero, no grey-box bento, no \"protected worldwide\" banner.\n */\nexport function AssetOverviewContent({\n attributes,\n hasTemplateData,\n isDisplayAttr,\n}: AssetOverviewContentProps) {\n const attr = (trait: string) => attributes.find((attribute) => attribute.trait_type === trait)?.value;\n const licenseType = attr(\"License\");\n const commercialUse = attr(\"Commercial Use\");\n const derivatives = attr(\"Derivatives\");\n const attribution = attr(\"Attribution\");\n const territory = attr(\"Territory\");\n const aiPolicy = attr(\"AI Policy\");\n const royalty = attr(\"Royalty\");\n const registration = attr(\"Registration\");\n const summary = licenseSummary(attributes);\n const hasLicenseData = !!(licenseType || commercialUse || derivatives || attribution);\n const displayAttributes = attributes.filter((attribute) => isDisplayAttr(attribute));\n\n const facts = [\n { icon: <DollarSign className=\"h-4 w-4\" />, label: \"Commercial use\", value: commercialUse },\n { icon: <GitBranch className=\"h-4 w-4\" />, label: \"Derivatives\", value: derivatives },\n { icon: <UserCheck className=\"h-4 w-4\" />, label: \"Attribution\", value: attribution },\n { icon: <Globe className=\"h-4 w-4\" />, label: \"Territory\", value: territory },\n { icon: <Bot className=\"h-4 w-4\" />, label: \"AI & data mining\", value: aiPolicy },\n { icon: <ShieldCheck className=\"h-4 w-4\" />, label: \"License\", value: licenseType },\n { icon: <Percent className=\"h-4 w-4\" />, label: \"Royalty\", value: royalty },\n { icon: <Calendar className=\"h-4 w-4\" />, label: \"Registered\", value: registration },\n ].filter((row) => !!row.value);\n\n return (\n <div className=\"mt-4 space-y-7\">\n {hasTemplateData ? <IPTypeDisplay attributes={attributes} /> : null}\n\n {hasLicenseData ? (\n <section className=\"space-y-3\">\n <h3 className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">Rights</h3>\n {summary ? (\n <p className=\"text-[15px] font-medium leading-relaxed text-foreground/90\">{summary}</p>\n ) : null}\n <div className=\"grid grid-cols-1 sm:grid-cols-2 sm:gap-x-10\">\n {facts.map(({ icon, label, value }) => (\n <FactRow key={label} icon={icon} label={label} value={value} />\n ))}\n </div>\n <p className=\"flex items-center gap-1.5 pt-1 text-xs text-muted-foreground/70\">\n <ShieldCheck className=\"h-3.5 w-3.5 shrink-0\" />\n Kept in permanent, tamper-proof storage · recognized under international copyright law\n </p>\n </section>\n ) : null}\n\n {displayAttributes.length > 0 ? (\n <section className=\"space-y-1\">\n <h3 className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">Details</h3>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 sm:gap-x-10\">\n {displayAttributes.map((attribute, index) => (\n <FactRow\n key={index}\n label={attribute.trait_type ?? \"Trait\"}\n value={\n isAddressLike(attribute.value) ? (\n <AddressDisplay address={attribute.value!} chars={4} className=\"text-sm font-semibold\" />\n ) : (\n attribute.value ?? \"—\"\n )\n }\n />\n ))}\n </div>\n </section>\n ) : null}\n\n {!hasTemplateData && !hasLicenseData && displayAttributes.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">No additional details available.</p>\n ) : null}\n </div>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/components/asset-overview-content.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { Bot, Calendar, DollarSign, GitBranch, Globe, Percent, UserCheck } from \"lucide-react\";\nimport { IPTypeDisplay } from \"./ip-type-display.js\";\nimport { AddressDisplay } from \"./address-display.js\";\nimport { licenseSummary } from \"../utils/license-summary.js\";\n\ninterface AssetAttribute {\n trait_type?: string;\n value?: string;\n}\n\ninterface AssetOverviewContentProps {\n attributes: AssetAttribute[];\n hasTemplateData: boolean;\n isDisplayAttr: (attribute: AssetAttribute) => boolean;\n}\n\nconst isAddressLike = (v?: string): boolean => !!v && /^0x[0-9a-fA-F]{16,}$/.test(v.trim());\n\n/** A standard bento square: a brand-tinted icon, an uppercase label, a bold value.\n * `wide` stretches it across two columns for an emphasized detail. */\nfunction Cell({\n icon,\n label,\n value,\n wide,\n}: {\n icon?: ReactNode;\n label: string;\n value: ReactNode;\n wide?: boolean;\n}) {\n return (\n <div\n className={`flex flex-col justify-between gap-2 rounded-xl bg-muted/25 ring-1 ring-border/40 p-3.5 ${\n wide ? \"col-span-2\" : \"\"\n }`}\n >\n {icon ? <span className=\"text-primary/70\">{icon}</span> : null}\n <div className=\"space-y-0.5\">\n <p className=\"text-[10px] font-medium uppercase tracking-wider text-muted-foreground truncate\" title={label}>\n {label}\n </p>\n <div className=\"text-sm font-bold text-foreground truncate\">{value}</div>\n </div>\n </div>\n );\n}\n\n/**\n * Asset Overview tab, as a Bento 2.0 grid: an asymmetrical lattice of rounded\n * compartments on a soft brand light-leak, uniform gaps throughout. The license\n * summary is the emphasized cell (stretched 2×2, brand-gradient wash + license\n * stamp + emerald trust seal); each right is a standard square; Details follow.\n * Uses only design-system tokens (brand-* / primary / aurora / emerald-for-trust).\n */\nexport function AssetOverviewContent({\n attributes,\n hasTemplateData,\n isDisplayAttr,\n}: AssetOverviewContentProps) {\n const attr = (trait: string) => attributes.find((attribute) => attribute.trait_type === trait)?.value;\n const licenseType = attr(\"License\");\n const commercialUse = attr(\"Commercial Use\");\n const derivatives = attr(\"Derivatives\");\n const attribution = attr(\"Attribution\");\n const territory = attr(\"Territory\");\n const aiPolicy = attr(\"AI Policy\");\n const royalty = attr(\"Royalty\");\n const registration = attr(\"Registration\");\n const summary = licenseSummary(attributes);\n const hasLicenseData = !!(licenseType || commercialUse || derivatives || attribution);\n const displayAttributes = attributes.filter((attribute) => isDisplayAttr(attribute));\n\n const facts = [\n { icon: <DollarSign className=\"h-4 w-4\" />, label: \"Commercial use\", value: commercialUse },\n { icon: <GitBranch className=\"h-4 w-4\" />, label: \"Derivatives\", value: derivatives },\n { icon: <UserCheck className=\"h-4 w-4\" />, label: \"Attribution\", value: attribution },\n { icon: <Globe className=\"h-4 w-4\" />, label: \"Territory\", value: territory },\n { icon: <Bot className=\"h-4 w-4\" />, label: \"AI & data mining\", value: aiPolicy },\n { icon: <Percent className=\"h-4 w-4\" />, label: \"Royalty\", value: royalty },\n { icon: <Calendar className=\"h-4 w-4\" />, label: \"Registered\", value: registration },\n ].filter((row) => !!row.value);\n\n return (\n <div className=\"mt-4 space-y-7\">\n {hasTemplateData ? <IPTypeDisplay attributes={attributes} /> : null}\n\n {hasLicenseData ? (\n <section className=\"space-y-3\">\n <h3 className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">Rights</h3>\n <div className=\"relative\">\n {/* soft brand light-leak behind the lattice */}\n <div\n aria-hidden\n className=\"aurora-purple pointer-events-none\"\n style={{ position: \"absolute\", width: 260, height: 260, top: -40, left: \"30%\" }}\n />\n <div className=\"relative grid grid-cols-2 sm:grid-cols-4 gap-3 [grid-auto-flow:dense] auto-rows-[minmax(6rem,auto)]\">\n {/* emphasized cell — the license summary, stretched 2×2 */}\n <div className=\"col-span-2 sm:row-span-2 flex flex-col justify-between gap-4 rounded-2xl bg-gradient-to-br from-primary/10 via-primary/5 to-accent/10 ring-1 ring-primary/15 p-5\">\n {licenseType ? (\n <span className=\"pill-badge self-start text-[10px] uppercase tracking-wider\">{licenseType}</span>\n ) : null}\n {summary ? (\n <p className=\"text-base sm:text-lg font-semibold leading-snug text-foreground\">{summary}</p>\n ) : null}\n </div>\n\n {facts.map(({ icon, label, value }) => (\n <Cell key={label} icon={icon} label={label} value={value} />\n ))}\n </div>\n </div>\n <p className=\"text-xs text-muted-foreground/70\">\n Kept in permanent, tamper-proof storage · recognized under international copyright law\n </p>\n </section>\n ) : null}\n\n {displayAttributes.length > 0 ? (\n <section className=\"space-y-3\">\n <h3 className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">Details</h3>\n <div className=\"grid grid-cols-2 sm:grid-cols-4 gap-3 [grid-auto-flow:dense] auto-rows-[minmax(6rem,auto)]\">\n {displayAttributes.map((attribute, index) => (\n <Cell\n key={index}\n label={attribute.trait_type ?? \"Trait\"}\n wide={isAddressLike(attribute.value)}\n value={\n isAddressLike(attribute.value) ? (\n <AddressDisplay address={attribute.value!} chars={4} className=\"text-sm font-bold\" />\n ) : (\n attribute.value ?? \"—\"\n )\n }\n />\n ))}\n </div>\n </section>\n ) : null}\n\n {!hasTemplateData && !hasLicenseData && displayAttributes.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">No additional details available.</p>\n ) : null}\n </div>\n );\n}\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/launchpad-services.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * Launchpad grouped services — the single source for the /launchpad page UI\n * in medialane-io and medialane-dapp.\n *\n * Card philosophy (creator-first redesign, 2026-06-10): the whole card is the\n * action. One title, one creator-language sentence (def.blurb), one unique hue\n * per service — no buttons repeating the title, no status badges, no tech\n * chips, no hover-only effects (mobile first: press states only).\n *\n * Apps own: hrefs + per-app rollout status flips. Everything else lives here.\n */\n\nimport Link from \"next/link\";\nimport { motion } from \"framer-motion\";\nimport { Lock, ArrowRight, Check } from \"lucide-react\";\nimport { cn } from \"../utils/cn.js\";\nimport {\n LAUNCHPAD_SERVICE_DEFINITIONS,\n LAUNCHPAD_SERVICE_GROUPS,\n type ServiceDefinition,\n type ServiceGroup,\n type ServiceGroupDefinition,\n type ServiceStatus,\n} from \"../data/launchpad-services.js\";\n\n// ── Per-app injection points ─────────────────────────────────────────────────\n\nexport interface ServiceOverride {\n /** Primary destination — the whole card links here (required for live services) */\n href?: string;\n /** Secondary browse link href (pairs with the def's browseLinkLabel) */\n browseHref?: string;\n /** Per-app rollout flips (e.g. coins live on one app first) */\n status?: ServiceStatus;\n /** Per-app one-liner override (rarely needed) */\n blurb?: string;\n}\n\nexport type ServiceOverrides = Record<string, ServiceOverride>;\n\n// ── One unique hue per service — never repeated inside a group ───────────────\n\ninterface ServiceHue {\n /** icon tint (600 for light surfaces, 400 for dark) */\n text: string;\n /** solid fill — icon glow */\n solid: string;\n /** thin card border tint */\n border: string;\n /** vivid two-stop gradient for the action pill (asset-page button language) */\n pill: string;\n}\n\nconst DEFAULT_HUE: ServiceHue = {\n text: \"text-sky-600 dark:text-sky-400\",\n solid: \"bg-sky-500\",\n border: \"border-sky-500/25\",\n pill: \"bg-gradient-to-r from-sky-500 to-blue-600\",\n};\n\nexport const SERVICE_HUES: Record<string, ServiceHue> = {\n // Single Editions — blue + green\n \"mint-ip-asset\": { text: \"text-blue-600 dark:text-blue-400\", solid: \"bg-blue-500\", border: \"border-blue-500/25\", pill: \"bg-gradient-to-r from-blue-500 to-sky-600\" },\n \"create-collection\": { text: \"text-green-600 dark:text-green-400\", solid: \"bg-green-500\", border: \"border-green-500/25\", pill: \"bg-gradient-to-r from-green-500 to-emerald-600\" },\n // Limited Editions — purple + red\n \"ip-collection-1155\": { text: \"text-purple-600 dark:text-purple-400\", solid: \"bg-purple-500\", border: \"border-purple-500/25\", pill: \"bg-gradient-to-r from-purple-500 to-violet-600\" },\n \"mint-editions\": { text: \"text-red-600 dark:text-red-400\", solid: \"bg-red-500\", border: \"border-red-500/25\", pill: \"bg-gradient-to-r from-red-500 to-rose-600\" },\n // Creator Coins & Memecoins — yellow + orange\n \"creator-coins\": { text: \"text-yellow-600 dark:text-yellow-400\", solid: \"bg-yellow-500\", border: \"border-yellow-500/25\", pill: \"bg-gradient-to-r from-yellow-500 to-amber-500\" },\n \"claim-memecoin\": { text: \"text-orange-600 dark:text-orange-400\", solid: \"bg-orange-500\", border: \"border-orange-500/25\", pill: \"bg-gradient-to-r from-orange-500 to-amber-600\" },\n \"collection-drop\": { text: \"text-orange-600 dark:text-orange-400\", solid: \"bg-orange-500\", border: \"border-orange-500/25\", pill: \"bg-gradient-to-r from-orange-500 to-red-500\" },\n \"pop-protocol\": { text: \"text-emerald-600 dark:text-emerald-400\", solid: \"bg-emerald-500\", border: \"border-emerald-500/25\", pill: \"bg-gradient-to-r from-emerald-500 to-green-600\" },\n \"remix-asset\": { text: \"text-indigo-600 dark:text-indigo-400\", solid: \"bg-indigo-500\", border: \"border-indigo-500/25\", pill: \"bg-gradient-to-r from-indigo-500 to-blue-600\" },\n \"claim-username\": { text: \"text-violet-600 dark:text-violet-400\", solid: \"bg-violet-500\", border: \"border-violet-500/25\", pill: \"bg-gradient-to-r from-violet-500 to-fuchsia-600\" },\n \"claim-collection\": { text: \"text-cyan-600 dark:text-cyan-400\", solid: \"bg-cyan-500\", border: \"border-cyan-500/25\", pill: \"bg-gradient-to-r from-cyan-500 to-sky-600\" },\n \"claim-collection-name\": { text: \"text-pink-600 dark:text-pink-400\", solid: \"bg-pink-500\", border: \"border-pink-500/25\", pill: \"bg-gradient-to-r from-pink-500 to-rose-600\" },\n};\n\n// ── Service card — the whole card is the action ─────────────────────────────\n\nexport interface LaunchpadServiceCardProps {\n def: ServiceDefinition;\n override?: ServiceOverride;\n /** Showcase layout — spans the full grid width (e.g. POP Protocol) */\n featured?: boolean;\n}\n\nexport function LaunchpadServiceCard({ def, override = {}, featured = false }: LaunchpadServiceCardProps) {\n const { key, icon: Icon, title, browseLinkLabel, features, example } = def;\n const status = override.status ?? def.status;\n const blurb = override.blurb ?? def.blurb;\n const { href, browseHref } = override;\n\n const live = status === \"live\";\n const hue = SERVICE_HUES[key] ?? DEFAULT_HUE;\n\n return (\n <div\n className={cn(\n // dark surfaces stay close to the canvas — the hue border does the talking\n \"relative rounded-2xl border bg-card dark:bg-white/[0.02] overflow-hidden flex flex-col flex-1 min-h-[210px]\",\n \"transition-transform\",\n live ? cn(hue.border, \"active:scale-[0.99]\") : \"border-border/30 opacity-70\",\n featured && \"sm:col-span-2\",\n )}\n >\n {/* Giant watermark icon, ghosted in the corner (Drop-Pages-panel language) */}\n <div aria-hidden className=\"absolute -right-8 -bottom-10 opacity-[0.04] select-none pointer-events-none\">\n <Icon className=\"h-44 w-44\" />\n </div>\n\n <div className=\"relative flex flex-col flex-1 p-6 sm:p-8 gap-4 sm:gap-5\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"relative\">\n {live && (\n <div aria-hidden className={cn(\"absolute -inset-3 rounded-full blur-2xl opacity-30\", hue.solid)} />\n )}\n <Icon className={cn(\"relative h-9 w-9 shrink-0\", live ? hue.text : \"text-muted-foreground/50\")} />\n </div>\n {!live && (\n <span className=\"flex items-center gap-1 text-[11px] font-medium text-muted-foreground/60 pt-1\">\n <Lock className=\"h-3 w-3\" />\n Coming soon\n </span>\n )}\n </div>\n\n <div className=\"space-y-2\">\n <h3 className=\"text-2xl sm:text-3xl font-black tracking-tight leading-snug\">{title}</h3>\n <p className={cn(\"text-[15px] leading-relaxed\", live ? \"text-muted-foreground\" : \"text-muted-foreground/60\", !featured && \"max-w-[36ch]\")}>\n {blurb}\n </p>\n {live && example && (\n <p className=\"text-[13px] leading-relaxed text-muted-foreground/70 italic\">\n e.g. {example}\n </p>\n )}\n </div>\n\n {/* Feature showcase — plain-language chips */}\n {live && features.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {features.map((feature) => (\n <span\n key={feature}\n className=\"inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full bg-muted/40 border border-border/30 text-xs font-medium text-muted-foreground\"\n >\n <Check className={cn(\"h-3 w-3 shrink-0\", hue.text)} />\n {feature}\n </span>\n ))}\n </div>\n )}\n\n {/* Stretched link — the whole card is the action; the pill is the visual cue */}\n {live && href && <Link href={href} aria-label={`${def.cta} — ${title}`} className=\"absolute inset-0 z-10\" />}\n\n <div className=\"mt-auto pt-1 flex items-end justify-between gap-3\">\n {live && browseHref && browseLinkLabel ? (\n <Link\n href={browseHref}\n className=\"relative z-20 inline-flex items-center gap-1 text-xs font-medium text-muted-foreground active:text-foreground\"\n >\n {browseLinkLabel}\n <ArrowRight className=\"h-3 w-3\" />\n </Link>\n ) : (\n <span />\n )}\n {live && (\n <span\n className={cn(\n \"inline-flex items-center gap-2 h-10 px-5 rounded-full\",\n \"text-sm font-semibold text-white shadow-lg shadow-black/25\",\n hue.pill,\n )}\n >\n {def.cta}\n <ArrowRight className=\"h-4 w-4\" />\n </span>\n )}\n </div>\n </div>\n </div>\n );\n}\n\n// ── Group sections ───────────────────────────────────────────────────────────\n\n/** Vivid gradient titles give special sections identity without boxing them in\n * (no panels inside panels — color carries the distinction, space does the rest). */\nconst GROUP_TITLE_ACCENTS: Partial<Record<ServiceGroup, string>> = {\n \"creator-coins\": \"bg-gradient-to-r from-yellow-500 via-amber-500 to-orange-500 bg-clip-text text-transparent\",\n \"pop-protocol\": \"bg-gradient-to-r from-emerald-500 to-green-600 bg-clip-text text-transparent\",\n};\n\nfunction GroupHeader({ group }: { group: ServiceGroupDefinition }) {\n return (\n <div className=\"space-y-2\">\n <h2 className={cn(\"text-3xl sm:text-4xl font-black tracking-tight\", GROUP_TITLE_ACCENTS[group.key])}>\n {group.title}\n </h2>\n <p className=\"text-base sm:text-lg text-muted-foreground leading-relaxed max-w-2xl\">{group.tagline}</p>\n </div>\n );\n}\n\n/** POP Protocol companion column — open how-it-works steps, no extra panel. */\nconst POP_STEPS = [\n { title: \"Create your event badge\", body: \"Name it, add your artwork, and set who can claim — ready in minutes.\" },\n { title: \"Share the claim link\", body: \"Your community claims for free — one badge per person, no faking.\" },\n { title: \"It stays with them forever\", body: \"Badges can't be sold or transferred — lasting proof they were there.\" },\n];\n\nfunction PopHowItWorks() {\n return (\n <div className=\"flex flex-col justify-center gap-5 sm:gap-6 px-2 py-4 sm:py-0 sm:pl-6\">\n {POP_STEPS.map((step, i) => (\n <div key={step.title} className=\"flex gap-4\">\n <span className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-emerald-500/10 text-emerald-600 dark:text-emerald-400 text-sm font-bold\">\n {i + 1}\n </span>\n <div className=\"space-y-0.5\">\n <p className=\"font-semibold\">{step.title}</p>\n <p className=\"text-sm text-muted-foreground leading-relaxed\">{step.body}</p>\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nfunction ComingSoonStrip({ group, defs }: { group: ServiceGroupDefinition; defs: ServiceDefinition[] }) {\n return (\n <div className=\"rounded-2xl border border-border/40 p-5\">\n <p className=\"font-semibold text-sm\">{group.title}</p>\n <p className=\"text-sm text-muted-foreground mt-0.5\">{group.tagline}</p>\n <div className=\"flex flex-wrap gap-2 mt-4\">\n {defs.map(({ key, icon: Icon, title }) => (\n <div key={key} className=\"flex items-center gap-2 px-3 py-2 rounded-full bg-muted/30 border border-border/25\">\n <Icon className=\"h-3.5 w-3.5 text-muted-foreground/60\" />\n <span className=\"text-xs font-medium text-muted-foreground\">{title}</span>\n </div>\n ))}\n </div>\n </div>\n );\n}\n\nexport interface LaunchpadGroupedSectionsProps {\n /** Per-app hrefs / rollout flips, keyed by service key. */\n overrides: ServiceOverrides;\n className?: string;\n}\n\n/** The full grouped launchpad services block — section order comes from\n * LAUNCHPAD_SERVICE_GROUPS; cards from LAUNCHPAD_SERVICE_DEFINITIONS. */\nexport function LaunchpadGroupedSections({ overrides, className }: LaunchpadGroupedSectionsProps) {\n return (\n <div className={cn(\"space-y-16 sm:space-y-24\", className)}>\n {LAUNCHPAD_SERVICE_GROUPS.map((group) => {\n const defs = LAUNCHPAD_SERVICE_DEFINITIONS.filter((d) => d.group === group.key);\n if (defs.length === 0) return null;\n if (group.key === \"coming-soon\") {\n return <ComingSoonStrip key={group.key} group={group} defs={defs} />;\n }\n return (\n <motion.div\n key={group.key}\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3, ease: [0.25, 0.46, 0.45, 0.94] }}\n className=\"space-y-6 sm:space-y-8\"\n >\n <GroupHeader group={group} />\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4 sm:gap-6\">\n {defs.map((def) => (\n <LaunchpadServiceCard key={def.key} def={def} override={overrides[def.key]} />\n ))}\n {group.key === \"pop-protocol\" && <PopHowItWorks />}\n </div>\n </motion.div>\n );\n })}\n </div>\n );\n}\n"],"mappings":"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","names":["Link"]}
1
+ {"version":3,"sources":["../../src/components/launchpad-services.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * Launchpad grouped services — the single source for the /launchpad page UI\n * in medialane-io and medialane-starknet.\n *\n * Card philosophy (creator-first redesign, 2026-06-10): the whole card is the\n * action. One title, one creator-language sentence (def.blurb), one unique hue\n * per service — no buttons repeating the title, no status badges, no tech\n * chips, no hover-only effects (mobile first: press states only).\n *\n * Apps own: hrefs + per-app rollout status flips. Everything else lives here.\n */\n\nimport Link from \"next/link\";\nimport { motion } from \"framer-motion\";\nimport { Lock, ArrowRight, Check } from \"lucide-react\";\nimport { cn } from \"../utils/cn.js\";\nimport {\n LAUNCHPAD_SERVICE_DEFINITIONS,\n LAUNCHPAD_SERVICE_GROUPS,\n type ServiceDefinition,\n type ServiceGroup,\n type ServiceGroupDefinition,\n type ServiceStatus,\n} from \"../data/launchpad-services.js\";\n\n// ── Per-app injection points ─────────────────────────────────────────────────\n\nexport interface ServiceOverride {\n /** Primary destination — the whole card links here (required for live services) */\n href?: string;\n /** Secondary browse link href (pairs with the def's browseLinkLabel) */\n browseHref?: string;\n /** Per-app rollout flips (e.g. coins live on one app first) */\n status?: ServiceStatus;\n /** Per-app one-liner override (rarely needed) */\n blurb?: string;\n}\n\nexport type ServiceOverrides = Record<string, ServiceOverride>;\n\n// ── One unique hue per service — never repeated inside a group ───────────────\n\ninterface ServiceHue {\n /** icon tint (600 for light surfaces, 400 for dark) */\n text: string;\n /** solid fill — icon glow */\n solid: string;\n /** thin card border tint */\n border: string;\n /** vivid two-stop gradient for the action pill (asset-page button language) */\n pill: string;\n}\n\nconst DEFAULT_HUE: ServiceHue = {\n text: \"text-sky-600 dark:text-sky-400\",\n solid: \"bg-sky-500\",\n border: \"border-sky-500/25\",\n pill: \"bg-gradient-to-r from-sky-500 to-blue-600\",\n};\n\nexport const SERVICE_HUES: Record<string, ServiceHue> = {\n // Single Editions — blue + green\n \"mint-ip-asset\": { text: \"text-blue-600 dark:text-blue-400\", solid: \"bg-blue-500\", border: \"border-blue-500/25\", pill: \"bg-gradient-to-r from-blue-500 to-sky-600\" },\n \"create-collection\": { text: \"text-green-600 dark:text-green-400\", solid: \"bg-green-500\", border: \"border-green-500/25\", pill: \"bg-gradient-to-r from-green-500 to-emerald-600\" },\n // Limited Editions — purple + red\n \"ip-collection-1155\": { text: \"text-purple-600 dark:text-purple-400\", solid: \"bg-purple-500\", border: \"border-purple-500/25\", pill: \"bg-gradient-to-r from-purple-500 to-violet-600\" },\n \"mint-editions\": { text: \"text-red-600 dark:text-red-400\", solid: \"bg-red-500\", border: \"border-red-500/25\", pill: \"bg-gradient-to-r from-red-500 to-rose-600\" },\n // Creator Coins & Memecoins — yellow + orange\n \"creator-coins\": { text: \"text-yellow-600 dark:text-yellow-400\", solid: \"bg-yellow-500\", border: \"border-yellow-500/25\", pill: \"bg-gradient-to-r from-yellow-500 to-amber-500\" },\n \"claim-memecoin\": { text: \"text-orange-600 dark:text-orange-400\", solid: \"bg-orange-500\", border: \"border-orange-500/25\", pill: \"bg-gradient-to-r from-orange-500 to-amber-600\" },\n \"collection-drop\": { text: \"text-orange-600 dark:text-orange-400\", solid: \"bg-orange-500\", border: \"border-orange-500/25\", pill: \"bg-gradient-to-r from-orange-500 to-red-500\" },\n \"pop-protocol\": { text: \"text-emerald-600 dark:text-emerald-400\", solid: \"bg-emerald-500\", border: \"border-emerald-500/25\", pill: \"bg-gradient-to-r from-emerald-500 to-green-600\" },\n \"remix-asset\": { text: \"text-indigo-600 dark:text-indigo-400\", solid: \"bg-indigo-500\", border: \"border-indigo-500/25\", pill: \"bg-gradient-to-r from-indigo-500 to-blue-600\" },\n \"claim-username\": { text: \"text-violet-600 dark:text-violet-400\", solid: \"bg-violet-500\", border: \"border-violet-500/25\", pill: \"bg-gradient-to-r from-violet-500 to-fuchsia-600\" },\n \"claim-collection\": { text: \"text-cyan-600 dark:text-cyan-400\", solid: \"bg-cyan-500\", border: \"border-cyan-500/25\", pill: \"bg-gradient-to-r from-cyan-500 to-sky-600\" },\n \"claim-collection-name\": { text: \"text-pink-600 dark:text-pink-400\", solid: \"bg-pink-500\", border: \"border-pink-500/25\", pill: \"bg-gradient-to-r from-pink-500 to-rose-600\" },\n};\n\n// ── Service card — the whole card is the action ─────────────────────────────\n\nexport interface LaunchpadServiceCardProps {\n def: ServiceDefinition;\n override?: ServiceOverride;\n /** Showcase layout — spans the full grid width (e.g. POP Protocol) */\n featured?: boolean;\n}\n\nexport function LaunchpadServiceCard({ def, override = {}, featured = false }: LaunchpadServiceCardProps) {\n const { key, icon: Icon, title, browseLinkLabel, features, example } = def;\n const status = override.status ?? def.status;\n const blurb = override.blurb ?? def.blurb;\n const { href, browseHref } = override;\n\n const live = status === \"live\";\n const hue = SERVICE_HUES[key] ?? DEFAULT_HUE;\n\n return (\n <div\n className={cn(\n // dark surfaces stay close to the canvas — the hue border does the talking\n \"relative rounded-2xl border bg-card dark:bg-white/[0.02] overflow-hidden flex flex-col flex-1 min-h-[210px]\",\n \"transition-transform\",\n live ? cn(hue.border, \"active:scale-[0.99]\") : \"border-border/30 opacity-70\",\n featured && \"sm:col-span-2\",\n )}\n >\n {/* Giant watermark icon, ghosted in the corner (Drop-Pages-panel language) */}\n <div aria-hidden className=\"absolute -right-8 -bottom-10 opacity-[0.04] select-none pointer-events-none\">\n <Icon className=\"h-44 w-44\" />\n </div>\n\n <div className=\"relative flex flex-col flex-1 p-6 sm:p-8 gap-4 sm:gap-5\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"relative\">\n {live && (\n <div aria-hidden className={cn(\"absolute -inset-3 rounded-full blur-2xl opacity-30\", hue.solid)} />\n )}\n <Icon className={cn(\"relative h-9 w-9 shrink-0\", live ? hue.text : \"text-muted-foreground/50\")} />\n </div>\n {!live && (\n <span className=\"flex items-center gap-1 text-[11px] font-medium text-muted-foreground/60 pt-1\">\n <Lock className=\"h-3 w-3\" />\n Coming soon\n </span>\n )}\n </div>\n\n <div className=\"space-y-2\">\n <h3 className=\"text-2xl sm:text-3xl font-black tracking-tight leading-snug\">{title}</h3>\n <p className={cn(\"text-[15px] leading-relaxed\", live ? \"text-muted-foreground\" : \"text-muted-foreground/60\", !featured && \"max-w-[36ch]\")}>\n {blurb}\n </p>\n {live && example && (\n <p className=\"text-[13px] leading-relaxed text-muted-foreground/70 italic\">\n e.g. {example}\n </p>\n )}\n </div>\n\n {/* Feature showcase — plain-language chips */}\n {live && features.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {features.map((feature) => (\n <span\n key={feature}\n className=\"inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full bg-muted/40 border border-border/30 text-xs font-medium text-muted-foreground\"\n >\n <Check className={cn(\"h-3 w-3 shrink-0\", hue.text)} />\n {feature}\n </span>\n ))}\n </div>\n )}\n\n {/* Stretched link — the whole card is the action; the pill is the visual cue */}\n {live && href && <Link href={href} aria-label={`${def.cta} — ${title}`} className=\"absolute inset-0 z-10\" />}\n\n <div className=\"mt-auto pt-1 flex items-end justify-between gap-3\">\n {live && browseHref && browseLinkLabel ? (\n <Link\n href={browseHref}\n className=\"relative z-20 inline-flex items-center gap-1 text-xs font-medium text-muted-foreground active:text-foreground\"\n >\n {browseLinkLabel}\n <ArrowRight className=\"h-3 w-3\" />\n </Link>\n ) : (\n <span />\n )}\n {live && (\n <span\n className={cn(\n \"inline-flex items-center gap-2 h-10 px-5 rounded-full\",\n \"text-sm font-semibold text-white shadow-lg shadow-black/25\",\n hue.pill,\n )}\n >\n {def.cta}\n <ArrowRight className=\"h-4 w-4\" />\n </span>\n )}\n </div>\n </div>\n </div>\n );\n}\n\n// ── Group sections ───────────────────────────────────────────────────────────\n\n/** Vivid gradient titles give special sections identity without boxing them in\n * (no panels inside panels — color carries the distinction, space does the rest). */\nconst GROUP_TITLE_ACCENTS: Partial<Record<ServiceGroup, string>> = {\n \"creator-coins\": \"bg-gradient-to-r from-yellow-500 via-amber-500 to-orange-500 bg-clip-text text-transparent\",\n \"pop-protocol\": \"bg-gradient-to-r from-emerald-500 to-green-600 bg-clip-text text-transparent\",\n};\n\nfunction GroupHeader({ group }: { group: ServiceGroupDefinition }) {\n return (\n <div className=\"space-y-2\">\n <h2 className={cn(\"text-3xl sm:text-4xl font-black tracking-tight\", GROUP_TITLE_ACCENTS[group.key])}>\n {group.title}\n </h2>\n <p className=\"text-base sm:text-lg text-muted-foreground leading-relaxed max-w-2xl\">{group.tagline}</p>\n </div>\n );\n}\n\n/** POP Protocol companion column — open how-it-works steps, no extra panel. */\nconst POP_STEPS = [\n { title: \"Create your event badge\", body: \"Name it, add your artwork, and set who can claim — ready in minutes.\" },\n { title: \"Share the claim link\", body: \"Your community claims for free — one badge per person, no faking.\" },\n { title: \"It stays with them forever\", body: \"Badges can't be sold or transferred — lasting proof they were there.\" },\n];\n\nfunction PopHowItWorks() {\n return (\n <div className=\"flex flex-col justify-center gap-5 sm:gap-6 px-2 py-4 sm:py-0 sm:pl-6\">\n {POP_STEPS.map((step, i) => (\n <div key={step.title} className=\"flex gap-4\">\n <span className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-emerald-500/10 text-emerald-600 dark:text-emerald-400 text-sm font-bold\">\n {i + 1}\n </span>\n <div className=\"space-y-0.5\">\n <p className=\"font-semibold\">{step.title}</p>\n <p className=\"text-sm text-muted-foreground leading-relaxed\">{step.body}</p>\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nfunction ComingSoonStrip({ group, defs }: { group: ServiceGroupDefinition; defs: ServiceDefinition[] }) {\n return (\n <div className=\"rounded-2xl border border-border/40 p-5\">\n <p className=\"font-semibold text-sm\">{group.title}</p>\n <p className=\"text-sm text-muted-foreground mt-0.5\">{group.tagline}</p>\n <div className=\"flex flex-wrap gap-2 mt-4\">\n {defs.map(({ key, icon: Icon, title }) => (\n <div key={key} className=\"flex items-center gap-2 px-3 py-2 rounded-full bg-muted/30 border border-border/25\">\n <Icon className=\"h-3.5 w-3.5 text-muted-foreground/60\" />\n <span className=\"text-xs font-medium text-muted-foreground\">{title}</span>\n </div>\n ))}\n </div>\n </div>\n );\n}\n\nexport interface LaunchpadGroupedSectionsProps {\n /** Per-app hrefs / rollout flips, keyed by service key. */\n overrides: ServiceOverrides;\n className?: string;\n}\n\n/** The full grouped launchpad services block — section order comes from\n * LAUNCHPAD_SERVICE_GROUPS; cards from LAUNCHPAD_SERVICE_DEFINITIONS. */\nexport function LaunchpadGroupedSections({ overrides, className }: LaunchpadGroupedSectionsProps) {\n return (\n <div className={cn(\"space-y-16 sm:space-y-24\", className)}>\n {LAUNCHPAD_SERVICE_GROUPS.map((group) => {\n const defs = LAUNCHPAD_SERVICE_DEFINITIONS.filter((d) => d.group === group.key);\n if (defs.length === 0) return null;\n if (group.key === \"coming-soon\") {\n return <ComingSoonStrip key={group.key} group={group} defs={defs} />;\n }\n return (\n <motion.div\n key={group.key}\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3, ease: [0.25, 0.46, 0.45, 0.94] }}\n className=\"space-y-6 sm:space-y-8\"\n >\n <GroupHeader group={group} />\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4 sm:gap-6\">\n {defs.map((def) => (\n <LaunchpadServiceCard key={def.key} def={def} override={overrides[def.key]} />\n ))}\n {group.key === \"pop-protocol\" && <PopHowItWorks />}\n </div>\n </motion.div>\n );\n })}\n </div>\n );\n}\n"],"mappings":"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","names":["Link"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/launchpad-services.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * Launchpad grouped services — the single source for the /launchpad page UI\n * in medialane-io and medialane-dapp.\n *\n * Card philosophy (creator-first redesign, 2026-06-10): the whole card is the\n * action. One title, one creator-language sentence (def.blurb), one unique hue\n * per service — no buttons repeating the title, no status badges, no tech\n * chips, no hover-only effects (mobile first: press states only).\n *\n * Apps own: hrefs + per-app rollout status flips. Everything else lives here.\n */\n\nimport Link from \"next/link\";\nimport { motion } from \"framer-motion\";\nimport { Lock, ArrowRight, Check } from \"lucide-react\";\nimport { cn } from \"../utils/cn.js\";\nimport {\n LAUNCHPAD_SERVICE_DEFINITIONS,\n LAUNCHPAD_SERVICE_GROUPS,\n type ServiceDefinition,\n type ServiceGroup,\n type ServiceGroupDefinition,\n type ServiceStatus,\n} from \"../data/launchpad-services.js\";\n\n// ── Per-app injection points ─────────────────────────────────────────────────\n\nexport interface ServiceOverride {\n /** Primary destination — the whole card links here (required for live services) */\n href?: string;\n /** Secondary browse link href (pairs with the def's browseLinkLabel) */\n browseHref?: string;\n /** Per-app rollout flips (e.g. coins live on one app first) */\n status?: ServiceStatus;\n /** Per-app one-liner override (rarely needed) */\n blurb?: string;\n}\n\nexport type ServiceOverrides = Record<string, ServiceOverride>;\n\n// ── One unique hue per service — never repeated inside a group ───────────────\n\ninterface ServiceHue {\n /** icon tint (600 for light surfaces, 400 for dark) */\n text: string;\n /** solid fill — icon glow */\n solid: string;\n /** thin card border tint */\n border: string;\n /** vivid two-stop gradient for the action pill (asset-page button language) */\n pill: string;\n}\n\nconst DEFAULT_HUE: ServiceHue = {\n text: \"text-sky-600 dark:text-sky-400\",\n solid: \"bg-sky-500\",\n border: \"border-sky-500/25\",\n pill: \"bg-gradient-to-r from-sky-500 to-blue-600\",\n};\n\nexport const SERVICE_HUES: Record<string, ServiceHue> = {\n // Single Editions — blue + green\n \"mint-ip-asset\": { text: \"text-blue-600 dark:text-blue-400\", solid: \"bg-blue-500\", border: \"border-blue-500/25\", pill: \"bg-gradient-to-r from-blue-500 to-sky-600\" },\n \"create-collection\": { text: \"text-green-600 dark:text-green-400\", solid: \"bg-green-500\", border: \"border-green-500/25\", pill: \"bg-gradient-to-r from-green-500 to-emerald-600\" },\n // Limited Editions — purple + red\n \"ip-collection-1155\": { text: \"text-purple-600 dark:text-purple-400\", solid: \"bg-purple-500\", border: \"border-purple-500/25\", pill: \"bg-gradient-to-r from-purple-500 to-violet-600\" },\n \"mint-editions\": { text: \"text-red-600 dark:text-red-400\", solid: \"bg-red-500\", border: \"border-red-500/25\", pill: \"bg-gradient-to-r from-red-500 to-rose-600\" },\n // Creator Coins & Memecoins — yellow + orange\n \"creator-coins\": { text: \"text-yellow-600 dark:text-yellow-400\", solid: \"bg-yellow-500\", border: \"border-yellow-500/25\", pill: \"bg-gradient-to-r from-yellow-500 to-amber-500\" },\n \"claim-memecoin\": { text: \"text-orange-600 dark:text-orange-400\", solid: \"bg-orange-500\", border: \"border-orange-500/25\", pill: \"bg-gradient-to-r from-orange-500 to-amber-600\" },\n \"collection-drop\": { text: \"text-orange-600 dark:text-orange-400\", solid: \"bg-orange-500\", border: \"border-orange-500/25\", pill: \"bg-gradient-to-r from-orange-500 to-red-500\" },\n \"pop-protocol\": { text: \"text-emerald-600 dark:text-emerald-400\", solid: \"bg-emerald-500\", border: \"border-emerald-500/25\", pill: \"bg-gradient-to-r from-emerald-500 to-green-600\" },\n \"remix-asset\": { text: \"text-indigo-600 dark:text-indigo-400\", solid: \"bg-indigo-500\", border: \"border-indigo-500/25\", pill: \"bg-gradient-to-r from-indigo-500 to-blue-600\" },\n \"claim-username\": { text: \"text-violet-600 dark:text-violet-400\", solid: \"bg-violet-500\", border: \"border-violet-500/25\", pill: \"bg-gradient-to-r from-violet-500 to-fuchsia-600\" },\n \"claim-collection\": { text: \"text-cyan-600 dark:text-cyan-400\", solid: \"bg-cyan-500\", border: \"border-cyan-500/25\", pill: \"bg-gradient-to-r from-cyan-500 to-sky-600\" },\n \"claim-collection-name\": { text: \"text-pink-600 dark:text-pink-400\", solid: \"bg-pink-500\", border: \"border-pink-500/25\", pill: \"bg-gradient-to-r from-pink-500 to-rose-600\" },\n};\n\n// ── Service card — the whole card is the action ─────────────────────────────\n\nexport interface LaunchpadServiceCardProps {\n def: ServiceDefinition;\n override?: ServiceOverride;\n /** Showcase layout — spans the full grid width (e.g. POP Protocol) */\n featured?: boolean;\n}\n\nexport function LaunchpadServiceCard({ def, override = {}, featured = false }: LaunchpadServiceCardProps) {\n const { key, icon: Icon, title, browseLinkLabel, features, example } = def;\n const status = override.status ?? def.status;\n const blurb = override.blurb ?? def.blurb;\n const { href, browseHref } = override;\n\n const live = status === \"live\";\n const hue = SERVICE_HUES[key] ?? DEFAULT_HUE;\n\n return (\n <div\n className={cn(\n // dark surfaces stay close to the canvas — the hue border does the talking\n \"relative rounded-2xl border bg-card dark:bg-white/[0.02] overflow-hidden flex flex-col flex-1 min-h-[210px]\",\n \"transition-transform\",\n live ? cn(hue.border, \"active:scale-[0.99]\") : \"border-border/30 opacity-70\",\n featured && \"sm:col-span-2\",\n )}\n >\n {/* Giant watermark icon, ghosted in the corner (Drop-Pages-panel language) */}\n <div aria-hidden className=\"absolute -right-8 -bottom-10 opacity-[0.04] select-none pointer-events-none\">\n <Icon className=\"h-44 w-44\" />\n </div>\n\n <div className=\"relative flex flex-col flex-1 p-6 sm:p-8 gap-4 sm:gap-5\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"relative\">\n {live && (\n <div aria-hidden className={cn(\"absolute -inset-3 rounded-full blur-2xl opacity-30\", hue.solid)} />\n )}\n <Icon className={cn(\"relative h-9 w-9 shrink-0\", live ? hue.text : \"text-muted-foreground/50\")} />\n </div>\n {!live && (\n <span className=\"flex items-center gap-1 text-[11px] font-medium text-muted-foreground/60 pt-1\">\n <Lock className=\"h-3 w-3\" />\n Coming soon\n </span>\n )}\n </div>\n\n <div className=\"space-y-2\">\n <h3 className=\"text-2xl sm:text-3xl font-black tracking-tight leading-snug\">{title}</h3>\n <p className={cn(\"text-[15px] leading-relaxed\", live ? \"text-muted-foreground\" : \"text-muted-foreground/60\", !featured && \"max-w-[36ch]\")}>\n {blurb}\n </p>\n {live && example && (\n <p className=\"text-[13px] leading-relaxed text-muted-foreground/70 italic\">\n e.g. {example}\n </p>\n )}\n </div>\n\n {/* Feature showcase — plain-language chips */}\n {live && features.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {features.map((feature) => (\n <span\n key={feature}\n className=\"inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full bg-muted/40 border border-border/30 text-xs font-medium text-muted-foreground\"\n >\n <Check className={cn(\"h-3 w-3 shrink-0\", hue.text)} />\n {feature}\n </span>\n ))}\n </div>\n )}\n\n {/* Stretched link — the whole card is the action; the pill is the visual cue */}\n {live && href && <Link href={href} aria-label={`${def.cta} — ${title}`} className=\"absolute inset-0 z-10\" />}\n\n <div className=\"mt-auto pt-1 flex items-end justify-between gap-3\">\n {live && browseHref && browseLinkLabel ? (\n <Link\n href={browseHref}\n className=\"relative z-20 inline-flex items-center gap-1 text-xs font-medium text-muted-foreground active:text-foreground\"\n >\n {browseLinkLabel}\n <ArrowRight className=\"h-3 w-3\" />\n </Link>\n ) : (\n <span />\n )}\n {live && (\n <span\n className={cn(\n \"inline-flex items-center gap-2 h-10 px-5 rounded-full\",\n \"text-sm font-semibold text-white shadow-lg shadow-black/25\",\n hue.pill,\n )}\n >\n {def.cta}\n <ArrowRight className=\"h-4 w-4\" />\n </span>\n )}\n </div>\n </div>\n </div>\n );\n}\n\n// ── Group sections ───────────────────────────────────────────────────────────\n\n/** Vivid gradient titles give special sections identity without boxing them in\n * (no panels inside panels — color carries the distinction, space does the rest). */\nconst GROUP_TITLE_ACCENTS: Partial<Record<ServiceGroup, string>> = {\n \"creator-coins\": \"bg-gradient-to-r from-yellow-500 via-amber-500 to-orange-500 bg-clip-text text-transparent\",\n \"pop-protocol\": \"bg-gradient-to-r from-emerald-500 to-green-600 bg-clip-text text-transparent\",\n};\n\nfunction GroupHeader({ group }: { group: ServiceGroupDefinition }) {\n return (\n <div className=\"space-y-2\">\n <h2 className={cn(\"text-3xl sm:text-4xl font-black tracking-tight\", GROUP_TITLE_ACCENTS[group.key])}>\n {group.title}\n </h2>\n <p className=\"text-base sm:text-lg text-muted-foreground leading-relaxed max-w-2xl\">{group.tagline}</p>\n </div>\n );\n}\n\n/** POP Protocol companion column — open how-it-works steps, no extra panel. */\nconst POP_STEPS = [\n { title: \"Create your event badge\", body: \"Name it, add your artwork, and set who can claim — ready in minutes.\" },\n { title: \"Share the claim link\", body: \"Your community claims for free — one badge per person, no faking.\" },\n { title: \"It stays with them forever\", body: \"Badges can't be sold or transferred — lasting proof they were there.\" },\n];\n\nfunction PopHowItWorks() {\n return (\n <div className=\"flex flex-col justify-center gap-5 sm:gap-6 px-2 py-4 sm:py-0 sm:pl-6\">\n {POP_STEPS.map((step, i) => (\n <div key={step.title} className=\"flex gap-4\">\n <span className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-emerald-500/10 text-emerald-600 dark:text-emerald-400 text-sm font-bold\">\n {i + 1}\n </span>\n <div className=\"space-y-0.5\">\n <p className=\"font-semibold\">{step.title}</p>\n <p className=\"text-sm text-muted-foreground leading-relaxed\">{step.body}</p>\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nfunction ComingSoonStrip({ group, defs }: { group: ServiceGroupDefinition; defs: ServiceDefinition[] }) {\n return (\n <div className=\"rounded-2xl border border-border/40 p-5\">\n <p className=\"font-semibold text-sm\">{group.title}</p>\n <p className=\"text-sm text-muted-foreground mt-0.5\">{group.tagline}</p>\n <div className=\"flex flex-wrap gap-2 mt-4\">\n {defs.map(({ key, icon: Icon, title }) => (\n <div key={key} className=\"flex items-center gap-2 px-3 py-2 rounded-full bg-muted/30 border border-border/25\">\n <Icon className=\"h-3.5 w-3.5 text-muted-foreground/60\" />\n <span className=\"text-xs font-medium text-muted-foreground\">{title}</span>\n </div>\n ))}\n </div>\n </div>\n );\n}\n\nexport interface LaunchpadGroupedSectionsProps {\n /** Per-app hrefs / rollout flips, keyed by service key. */\n overrides: ServiceOverrides;\n className?: string;\n}\n\n/** The full grouped launchpad services block — section order comes from\n * LAUNCHPAD_SERVICE_GROUPS; cards from LAUNCHPAD_SERVICE_DEFINITIONS. */\nexport function LaunchpadGroupedSections({ overrides, className }: LaunchpadGroupedSectionsProps) {\n return (\n <div className={cn(\"space-y-16 sm:space-y-24\", className)}>\n {LAUNCHPAD_SERVICE_GROUPS.map((group) => {\n const defs = LAUNCHPAD_SERVICE_DEFINITIONS.filter((d) => d.group === group.key);\n if (defs.length === 0) return null;\n if (group.key === \"coming-soon\") {\n return <ComingSoonStrip key={group.key} group={group} defs={defs} />;\n }\n return (\n <motion.div\n key={group.key}\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3, ease: [0.25, 0.46, 0.45, 0.94] }}\n className=\"space-y-6 sm:space-y-8\"\n >\n <GroupHeader group={group} />\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4 sm:gap-6\">\n {defs.map((def) => (\n <LaunchpadServiceCard key={def.key} def={def} override={overrides[def.key]} />\n ))}\n {group.key === \"pop-protocol\" && <PopHowItWorks />}\n </div>\n </motion.div>\n );\n })}\n </div>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/components/launchpad-services.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * Launchpad grouped services — the single source for the /launchpad page UI\n * in medialane-io and medialane-starknet.\n *\n * Card philosophy (creator-first redesign, 2026-06-10): the whole card is the\n * action. One title, one creator-language sentence (def.blurb), one unique hue\n * per service — no buttons repeating the title, no status badges, no tech\n * chips, no hover-only effects (mobile first: press states only).\n *\n * Apps own: hrefs + per-app rollout status flips. Everything else lives here.\n */\n\nimport Link from \"next/link\";\nimport { motion } from \"framer-motion\";\nimport { Lock, ArrowRight, Check } from \"lucide-react\";\nimport { cn } from \"../utils/cn.js\";\nimport {\n LAUNCHPAD_SERVICE_DEFINITIONS,\n LAUNCHPAD_SERVICE_GROUPS,\n type ServiceDefinition,\n type ServiceGroup,\n type ServiceGroupDefinition,\n type ServiceStatus,\n} from \"../data/launchpad-services.js\";\n\n// ── Per-app injection points ─────────────────────────────────────────────────\n\nexport interface ServiceOverride {\n /** Primary destination — the whole card links here (required for live services) */\n href?: string;\n /** Secondary browse link href (pairs with the def's browseLinkLabel) */\n browseHref?: string;\n /** Per-app rollout flips (e.g. coins live on one app first) */\n status?: ServiceStatus;\n /** Per-app one-liner override (rarely needed) */\n blurb?: string;\n}\n\nexport type ServiceOverrides = Record<string, ServiceOverride>;\n\n// ── One unique hue per service — never repeated inside a group ───────────────\n\ninterface ServiceHue {\n /** icon tint (600 for light surfaces, 400 for dark) */\n text: string;\n /** solid fill — icon glow */\n solid: string;\n /** thin card border tint */\n border: string;\n /** vivid two-stop gradient for the action pill (asset-page button language) */\n pill: string;\n}\n\nconst DEFAULT_HUE: ServiceHue = {\n text: \"text-sky-600 dark:text-sky-400\",\n solid: \"bg-sky-500\",\n border: \"border-sky-500/25\",\n pill: \"bg-gradient-to-r from-sky-500 to-blue-600\",\n};\n\nexport const SERVICE_HUES: Record<string, ServiceHue> = {\n // Single Editions — blue + green\n \"mint-ip-asset\": { text: \"text-blue-600 dark:text-blue-400\", solid: \"bg-blue-500\", border: \"border-blue-500/25\", pill: \"bg-gradient-to-r from-blue-500 to-sky-600\" },\n \"create-collection\": { text: \"text-green-600 dark:text-green-400\", solid: \"bg-green-500\", border: \"border-green-500/25\", pill: \"bg-gradient-to-r from-green-500 to-emerald-600\" },\n // Limited Editions — purple + red\n \"ip-collection-1155\": { text: \"text-purple-600 dark:text-purple-400\", solid: \"bg-purple-500\", border: \"border-purple-500/25\", pill: \"bg-gradient-to-r from-purple-500 to-violet-600\" },\n \"mint-editions\": { text: \"text-red-600 dark:text-red-400\", solid: \"bg-red-500\", border: \"border-red-500/25\", pill: \"bg-gradient-to-r from-red-500 to-rose-600\" },\n // Creator Coins & Memecoins — yellow + orange\n \"creator-coins\": { text: \"text-yellow-600 dark:text-yellow-400\", solid: \"bg-yellow-500\", border: \"border-yellow-500/25\", pill: \"bg-gradient-to-r from-yellow-500 to-amber-500\" },\n \"claim-memecoin\": { text: \"text-orange-600 dark:text-orange-400\", solid: \"bg-orange-500\", border: \"border-orange-500/25\", pill: \"bg-gradient-to-r from-orange-500 to-amber-600\" },\n \"collection-drop\": { text: \"text-orange-600 dark:text-orange-400\", solid: \"bg-orange-500\", border: \"border-orange-500/25\", pill: \"bg-gradient-to-r from-orange-500 to-red-500\" },\n \"pop-protocol\": { text: \"text-emerald-600 dark:text-emerald-400\", solid: \"bg-emerald-500\", border: \"border-emerald-500/25\", pill: \"bg-gradient-to-r from-emerald-500 to-green-600\" },\n \"remix-asset\": { text: \"text-indigo-600 dark:text-indigo-400\", solid: \"bg-indigo-500\", border: \"border-indigo-500/25\", pill: \"bg-gradient-to-r from-indigo-500 to-blue-600\" },\n \"claim-username\": { text: \"text-violet-600 dark:text-violet-400\", solid: \"bg-violet-500\", border: \"border-violet-500/25\", pill: \"bg-gradient-to-r from-violet-500 to-fuchsia-600\" },\n \"claim-collection\": { text: \"text-cyan-600 dark:text-cyan-400\", solid: \"bg-cyan-500\", border: \"border-cyan-500/25\", pill: \"bg-gradient-to-r from-cyan-500 to-sky-600\" },\n \"claim-collection-name\": { text: \"text-pink-600 dark:text-pink-400\", solid: \"bg-pink-500\", border: \"border-pink-500/25\", pill: \"bg-gradient-to-r from-pink-500 to-rose-600\" },\n};\n\n// ── Service card — the whole card is the action ─────────────────────────────\n\nexport interface LaunchpadServiceCardProps {\n def: ServiceDefinition;\n override?: ServiceOverride;\n /** Showcase layout — spans the full grid width (e.g. POP Protocol) */\n featured?: boolean;\n}\n\nexport function LaunchpadServiceCard({ def, override = {}, featured = false }: LaunchpadServiceCardProps) {\n const { key, icon: Icon, title, browseLinkLabel, features, example } = def;\n const status = override.status ?? def.status;\n const blurb = override.blurb ?? def.blurb;\n const { href, browseHref } = override;\n\n const live = status === \"live\";\n const hue = SERVICE_HUES[key] ?? DEFAULT_HUE;\n\n return (\n <div\n className={cn(\n // dark surfaces stay close to the canvas — the hue border does the talking\n \"relative rounded-2xl border bg-card dark:bg-white/[0.02] overflow-hidden flex flex-col flex-1 min-h-[210px]\",\n \"transition-transform\",\n live ? cn(hue.border, \"active:scale-[0.99]\") : \"border-border/30 opacity-70\",\n featured && \"sm:col-span-2\",\n )}\n >\n {/* Giant watermark icon, ghosted in the corner (Drop-Pages-panel language) */}\n <div aria-hidden className=\"absolute -right-8 -bottom-10 opacity-[0.04] select-none pointer-events-none\">\n <Icon className=\"h-44 w-44\" />\n </div>\n\n <div className=\"relative flex flex-col flex-1 p-6 sm:p-8 gap-4 sm:gap-5\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"relative\">\n {live && (\n <div aria-hidden className={cn(\"absolute -inset-3 rounded-full blur-2xl opacity-30\", hue.solid)} />\n )}\n <Icon className={cn(\"relative h-9 w-9 shrink-0\", live ? hue.text : \"text-muted-foreground/50\")} />\n </div>\n {!live && (\n <span className=\"flex items-center gap-1 text-[11px] font-medium text-muted-foreground/60 pt-1\">\n <Lock className=\"h-3 w-3\" />\n Coming soon\n </span>\n )}\n </div>\n\n <div className=\"space-y-2\">\n <h3 className=\"text-2xl sm:text-3xl font-black tracking-tight leading-snug\">{title}</h3>\n <p className={cn(\"text-[15px] leading-relaxed\", live ? \"text-muted-foreground\" : \"text-muted-foreground/60\", !featured && \"max-w-[36ch]\")}>\n {blurb}\n </p>\n {live && example && (\n <p className=\"text-[13px] leading-relaxed text-muted-foreground/70 italic\">\n e.g. {example}\n </p>\n )}\n </div>\n\n {/* Feature showcase — plain-language chips */}\n {live && features.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {features.map((feature) => (\n <span\n key={feature}\n className=\"inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full bg-muted/40 border border-border/30 text-xs font-medium text-muted-foreground\"\n >\n <Check className={cn(\"h-3 w-3 shrink-0\", hue.text)} />\n {feature}\n </span>\n ))}\n </div>\n )}\n\n {/* Stretched link — the whole card is the action; the pill is the visual cue */}\n {live && href && <Link href={href} aria-label={`${def.cta} — ${title}`} className=\"absolute inset-0 z-10\" />}\n\n <div className=\"mt-auto pt-1 flex items-end justify-between gap-3\">\n {live && browseHref && browseLinkLabel ? (\n <Link\n href={browseHref}\n className=\"relative z-20 inline-flex items-center gap-1 text-xs font-medium text-muted-foreground active:text-foreground\"\n >\n {browseLinkLabel}\n <ArrowRight className=\"h-3 w-3\" />\n </Link>\n ) : (\n <span />\n )}\n {live && (\n <span\n className={cn(\n \"inline-flex items-center gap-2 h-10 px-5 rounded-full\",\n \"text-sm font-semibold text-white shadow-lg shadow-black/25\",\n hue.pill,\n )}\n >\n {def.cta}\n <ArrowRight className=\"h-4 w-4\" />\n </span>\n )}\n </div>\n </div>\n </div>\n );\n}\n\n// ── Group sections ───────────────────────────────────────────────────────────\n\n/** Vivid gradient titles give special sections identity without boxing them in\n * (no panels inside panels — color carries the distinction, space does the rest). */\nconst GROUP_TITLE_ACCENTS: Partial<Record<ServiceGroup, string>> = {\n \"creator-coins\": \"bg-gradient-to-r from-yellow-500 via-amber-500 to-orange-500 bg-clip-text text-transparent\",\n \"pop-protocol\": \"bg-gradient-to-r from-emerald-500 to-green-600 bg-clip-text text-transparent\",\n};\n\nfunction GroupHeader({ group }: { group: ServiceGroupDefinition }) {\n return (\n <div className=\"space-y-2\">\n <h2 className={cn(\"text-3xl sm:text-4xl font-black tracking-tight\", GROUP_TITLE_ACCENTS[group.key])}>\n {group.title}\n </h2>\n <p className=\"text-base sm:text-lg text-muted-foreground leading-relaxed max-w-2xl\">{group.tagline}</p>\n </div>\n );\n}\n\n/** POP Protocol companion column — open how-it-works steps, no extra panel. */\nconst POP_STEPS = [\n { title: \"Create your event badge\", body: \"Name it, add your artwork, and set who can claim — ready in minutes.\" },\n { title: \"Share the claim link\", body: \"Your community claims for free — one badge per person, no faking.\" },\n { title: \"It stays with them forever\", body: \"Badges can't be sold or transferred — lasting proof they were there.\" },\n];\n\nfunction PopHowItWorks() {\n return (\n <div className=\"flex flex-col justify-center gap-5 sm:gap-6 px-2 py-4 sm:py-0 sm:pl-6\">\n {POP_STEPS.map((step, i) => (\n <div key={step.title} className=\"flex gap-4\">\n <span className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-emerald-500/10 text-emerald-600 dark:text-emerald-400 text-sm font-bold\">\n {i + 1}\n </span>\n <div className=\"space-y-0.5\">\n <p className=\"font-semibold\">{step.title}</p>\n <p className=\"text-sm text-muted-foreground leading-relaxed\">{step.body}</p>\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nfunction ComingSoonStrip({ group, defs }: { group: ServiceGroupDefinition; defs: ServiceDefinition[] }) {\n return (\n <div className=\"rounded-2xl border border-border/40 p-5\">\n <p className=\"font-semibold text-sm\">{group.title}</p>\n <p className=\"text-sm text-muted-foreground mt-0.5\">{group.tagline}</p>\n <div className=\"flex flex-wrap gap-2 mt-4\">\n {defs.map(({ key, icon: Icon, title }) => (\n <div key={key} className=\"flex items-center gap-2 px-3 py-2 rounded-full bg-muted/30 border border-border/25\">\n <Icon className=\"h-3.5 w-3.5 text-muted-foreground/60\" />\n <span className=\"text-xs font-medium text-muted-foreground\">{title}</span>\n </div>\n ))}\n </div>\n </div>\n );\n}\n\nexport interface LaunchpadGroupedSectionsProps {\n /** Per-app hrefs / rollout flips, keyed by service key. */\n overrides: ServiceOverrides;\n className?: string;\n}\n\n/** The full grouped launchpad services block — section order comes from\n * LAUNCHPAD_SERVICE_GROUPS; cards from LAUNCHPAD_SERVICE_DEFINITIONS. */\nexport function LaunchpadGroupedSections({ overrides, className }: LaunchpadGroupedSectionsProps) {\n return (\n <div className={cn(\"space-y-16 sm:space-y-24\", className)}>\n {LAUNCHPAD_SERVICE_GROUPS.map((group) => {\n const defs = LAUNCHPAD_SERVICE_DEFINITIONS.filter((d) => d.group === group.key);\n if (defs.length === 0) return null;\n if (group.key === \"coming-soon\") {\n return <ComingSoonStrip key={group.key} group={group} defs={defs} />;\n }\n return (\n <motion.div\n key={group.key}\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3, ease: [0.25, 0.46, 0.45, 0.94] }}\n className=\"space-y-6 sm:space-y-8\"\n >\n <GroupHeader group={group} />\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4 sm:gap-6\">\n {defs.map((def) => (\n <LaunchpadServiceCard key={def.key} def={def} override={overrides[def.key]} />\n ))}\n {group.key === \"pop-protocol\" && <PopHowItWorks />}\n </div>\n </motion.div>\n );\n })}\n </div>\n );\n}\n"],"mappings":"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","names":[]}
package/dist/index.cjs CHANGED
@@ -27,6 +27,8 @@ __export(index_exports, {
27
27
  ActivityRow: () => import_activity_row.ActivityRow,
28
28
  ActivityTicker: () => import_activity_ticker.ActivityTicker,
29
29
  AddressDisplay: () => import_address_display.AddressDisplay,
30
+ AssetCard: () => import_asset_card.AssetCard,
31
+ AssetCardSkeleton: () => import_asset_card.AssetCardSkeleton,
30
32
  AssetHeaderBlock: () => import_asset_top_sections.AssetHeaderBlock,
31
33
  AssetLicenseSummary: () => import_asset_license_summary.AssetLicenseSummary,
32
34
  AssetMarketsTab: () => import_asset_markets_tab.AssetMarketsTab,
@@ -133,6 +135,7 @@ var import_scroll_section = require("./components/scroll-section.js");
133
135
  var import_share_button = require("./components/share-button.js");
134
136
  var import_collection_card = require("./components/collection-card.js");
135
137
  var import_token_card = require("./components/token-card.js");
138
+ var import_asset_card = require("./components/asset-card.js");
136
139
  var import_coins = require("./data/coins.js");
137
140
  var import_coin_card = require("./components/coin-card.js");
138
141
  var import_coins_explorer = require("./components/coins-explorer.js");
@@ -167,6 +170,8 @@ var import_portfolio_counts = require("./utils/portfolio-counts.js");
167
170
  ActivityRow,
168
171
  ActivityTicker,
169
172
  AddressDisplay,
173
+ AssetCard,
174
+ AssetCardSkeleton,
170
175
  AssetHeaderBlock,
171
176
  AssetLicenseSummary,
172
177
  AssetMarketsTab,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// ── Utils ─────────────────────────────────────────────────────────────────────\nexport { cn } from \"./utils/cn.js\";\nexport { formatDisplayPrice } from \"./utils/format.js\";\nexport { shortenAddress } from \"./utils/address.js\";\nexport { ipfsToHttp } from \"./utils/ipfs.js\";\nexport { licenseSummary } from \"./utils/license-summary.js\";\n\n// ── Data (server-safe — no React, safe in Server Components) ──────────────────\nexport { IP_TYPE_DATA, IP_TYPE_DATA_MAP } from \"./data/ip-types.js\";\nexport type { IpTypeData } from \"./data/ip-types.js\";\nexport {\n IP_TYPES, LICENSE_TYPES, GEOGRAPHIC_SCOPES, AI_POLICIES,\n DERIVATIVES_OPTIONS, LICENSE_TRAIT_TYPES,\n} from \"./data/ip.js\";\nexport type { IPType, LicenseType } from \"./data/ip.js\";\nexport {\n IP_TEMPLATES, EMBED_PLATFORM_META, SOCIAL_PLATFORM_META, TEMPLATE_TRAIT_TYPES, DOC_UPLOAD,\n} from \"./data/ip-templates.js\";\nexport type { EmbedPlatform, SocialPlatform, TraitSuggestion, IPTemplate, DocUploadConfig } from \"./data/ip-templates.js\";\nexport { IPTypeDisplay } from \"./components/ip-type-display.js\";\nexport { AssetOverviewContent } from \"./components/asset-overview-content.js\";\nexport { AssetLicenseSummary } from \"./components/asset-license-summary.js\";\nexport { AssetMarketsTab } from \"./components/asset-markets-tab.js\";\nexport { ParentAttributionBanner } from \"./components/parent-attribution-banner.js\";\nexport type { ParentBannerProps } from \"./components/parent-attribution-banner.js\";\nexport { AssetMediaColumn, AssetHeaderBlock, buildEditionStats } from \"./components/asset-top-sections.js\";\nexport { BRAND } from \"./data/brand.js\";\n\n// ── Components (client-only — all have \"use client\") ─────────────────────────\nexport { CurrencyIcon, CurrencyAmount } from \"./components/currency-icon.js\";\nexport type { CurrencyIconProps, CurrencyAmountProps } from \"./components/currency-icon.js\";\n\nexport { IpTypeBadge, IP_TYPE_CONFIG, IP_TYPE_MAP } from \"./components/ip-type-badge.js\";\nexport type { IpTypeBadgeProps, IpTypeConfig } from \"./components/ip-type-badge.js\";\n\nexport { AddressDisplay } from \"./components/address-display.js\";\nexport type { AddressDisplayProps } from \"./components/address-display.js\";\n\nexport { MedialaneIcon } from \"./components/brand-icon.js\";\nexport type { MedialaneIconProps } from \"./components/brand-icon.js\";\nexport { MedialaneLogoFull } from \"./components/brand-logo.js\";\nexport type { MedialaneLogoFullProps } from \"./components/brand-logo.js\";\n\n// ── v0.2 additions ────────────────────────────────────────────────────────────\nexport { MotionCard, FadeIn, Stagger, StaggerItem, KineticWords, SPRING, EASE_OUT } from \"./components/motion-primitives.js\";\nexport { PageContainer } from \"./components/page-container.js\";\nexport type { PageContainerProps } from \"./components/page-container.js\";\nexport { ScrollSection } from \"./components/scroll-section.js\";\nexport type { ScrollSectionProps } from \"./components/scroll-section.js\";\nexport { ShareButton } from \"./components/share-button.js\";\nexport type { ShareButtonProps } from \"./components/share-button.js\";\nexport { CollectionCard, CollectionCardSkeleton } from \"./components/collection-card.js\";\nexport type { CollectionCardProps } from \"./components/collection-card.js\";\nexport { TokenCard, TokenCardSkeleton } from \"./components/token-card.js\";\nexport type { TokenCardProps, RarityTier } from \"./components/token-card.js\";\n// ── Coin discovery (chain-agnostic; price/data/href injected by the app) ─────\nexport {\n coinKind, formatCoinPrice, formatFdv,\n type CoinKind, type CoinCollectionLike, type CoinPriceLike,\n} from \"./data/coins.js\";\nexport { CoinCard, CoinRow, CoinCardSkeleton, type UseCoinPrice, type CoinTileProps } from \"./components/coin-card.js\";\nexport {\n CoinsExplorer,\n type CoinsExplorerProps, type CoinFilter, type CoinSort, type UseCoins,\n} from \"./components/coins-explorer.js\";\n\n// ── v0.3 additions ────────────────────────────────────────────────────────────\nexport { timeAgo, timeUntil } from \"./utils/time.js\";\nexport { ACTIVITY_TYPE_CONFIG, TYPE_FILTERS } from \"./data/activity.js\";\nexport type { ActivityTypeConfig } from \"./data/activity.js\";\nexport { HeroSlider, HeroSliderSkeleton } from \"./components/hero-slider.js\";\nexport type { HeroSliderProps } from \"./components/hero-slider.js\";\nexport { ActivityTicker } from \"./components/activity-ticker.js\";\nexport type { ActivityTickerProps } from \"./components/activity-ticker.js\";\nexport { ListingCard, ListingCardSkeleton } from \"./components/listing-card.js\";\nexport type { ListingCardProps } from \"./components/listing-card.js\";\nexport { ActivityRow } from \"./components/activity-row.js\";\nexport type { ActivityRowProps } from \"./components/activity-row.js\";\nexport { ActivityFeedShell } from \"./components/activity-feed-shell.js\";\nexport type { ActivityFeedShellProps } from \"./components/activity-feed-shell.js\";\nexport { CtaCardGrid } from \"./components/cta-card-grid.js\";\nexport type { CtaCardGridProps, CtaCardItem } from \"./components/cta-card-grid.js\";\n\n// ── v0.3.2 additions ─────────────────────────────────────────────────────────\nexport { DiscoverHero } from \"./components/discover-hero.js\";\nexport type { DiscoverHeroProps } from \"./components/discover-hero.js\";\nexport { FeaturedCarousel, FeaturedCarouselSkeleton } from \"./components/featured-carousel.js\";\nexport type { FeaturedCarouselProps } from \"./components/featured-carousel.js\";\nexport { DiscoverCollectionsStrip } from \"./components/discover-collections-strip.js\";\nexport type { DiscoverCollectionsStripProps } from \"./components/discover-collections-strip.js\";\nexport { DiscoverCreatorsStrip } from \"./components/discover-creators-strip.js\";\nexport type { DiscoverCreatorsStripProps } from \"./components/discover-creators-strip.js\";\nexport { DiscoverFeedSection } from \"./components/discover-feed-section.js\";\nexport type { DiscoverFeedSectionProps } from \"./components/discover-feed-section.js\";\nexport { ActivityCard, ActivityCardSkeleton, ACTIVITY_MESSAGES } from \"./components/activity-card.js\";\nexport type { ActivityCardProps } from \"./components/activity-card.js\";\n\n// ── Launchpad (grouped sections — single page-UI source since 0.8.0) ─────────\nexport { LaunchpadGroupedSections, LaunchpadServiceCard, SERVICE_HUES } from \"./components/launchpad-services.js\";\nexport { LaunchpadStrip } from \"./components/launchpad-strip.js\";\nexport type { LaunchpadStripProps } from \"./components/launchpad-strip.js\";\nexport type { LaunchpadGroupedSectionsProps, LaunchpadServiceCardProps, ServiceOverride, ServiceOverrides } from \"./components/launchpad-services.js\";\nexport { LAUNCHPAD_SERVICE_DEFINITIONS, LAUNCHPAD_SERVICE_GROUPS } from \"./data/launchpad-services.js\";\nexport type { ServiceDefinition, ServiceStatus, ServiceCategory, ServiceGroup, ServiceGroupDefinition } from \"./data/launchpad-services.js\";\n\n// ── v0.5.0 additions ─────────────────────────────────────────────────────────\nexport { NavCommandMenu, useNavCommandMenu } from \"./components/nav-command-menu.js\";\nexport type { NavCommand, NavCommandGroup, NavCommandMenuProps } from \"./components/nav-command-menu.js\";\n\n// ── v0.6.0 additions — portfolio subnav + counts ────────────────────────────\nexport { PortfolioSubnav } from \"./components/portfolio-subnav.js\";\nexport type {\n PortfolioSubnavProps,\n PortfolioNavItem,\n PortfolioNavGroup,\n PortfolioBadgeVariant,\n} from \"./components/portfolio-subnav.js\";\nexport { derivePortfolioCounts } from \"./utils/portfolio-counts.js\";\nexport type { PortfolioCounts, CountableOrder } from \"./utils/portfolio-counts.js\";\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,gBAAmB;AACnB,oBAAmC;AACnC,qBAA+B;AAC/B,kBAA2B;AAC3B,6BAA+B;AAG/B,sBAA+C;AAE/C,gBAGO;AAEP,0BAEO;AAEP,6BAA8B;AAC9B,oCAAqC;AACrC,mCAAoC;AACpC,+BAAgC;AAChC,uCAAwC;AAExC,gCAAsE;AACtE,mBAAsB;AAGtB,2BAA6C;AAG7C,2BAAyD;AAGzD,6BAA+B;AAG/B,wBAA8B;AAE9B,wBAAkC;AAIlC,+BAAyF;AACzF,4BAA8B;AAE9B,4BAA8B;AAE9B,0BAA4B;AAE5B,6BAAuD;AAEvD,wBAA6C;AAG7C,mBAGO;AACP,uBAA2F;AAC3F,4BAGO;AAGP,kBAAmC;AACnC,sBAAmD;AAEnD,yBAA+C;AAE/C,6BAA+B;AAE/B,0BAAiD;AAEjD,0BAA4B;AAE5B,iCAAkC;AAElC,2BAA4B;AAI5B,2BAA6B;AAE7B,+BAA2D;AAE3D,wCAAyC;AAEzC,qCAAsC;AAEtC,mCAAoC;AAEpC,2BAAsE;AAItE,gCAA6E;AAC7E,6BAA+B;AAG/B,IAAAA,6BAAwE;AAIxE,8BAAkD;AAIlD,8BAAgC;AAOhC,8BAAsC;","names":["import_launchpad_services"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// ── Utils ─────────────────────────────────────────────────────────────────────\nexport { cn } from \"./utils/cn.js\";\nexport { formatDisplayPrice } from \"./utils/format.js\";\nexport { shortenAddress } from \"./utils/address.js\";\nexport { ipfsToHttp } from \"./utils/ipfs.js\";\nexport { licenseSummary } from \"./utils/license-summary.js\";\n\n// ── Data (server-safe — no React, safe in Server Components) ──────────────────\nexport { IP_TYPE_DATA, IP_TYPE_DATA_MAP } from \"./data/ip-types.js\";\nexport type { IpTypeData } from \"./data/ip-types.js\";\nexport {\n IP_TYPES, LICENSE_TYPES, GEOGRAPHIC_SCOPES, AI_POLICIES,\n DERIVATIVES_OPTIONS, LICENSE_TRAIT_TYPES,\n} from \"./data/ip.js\";\nexport type { IPType, LicenseType } from \"./data/ip.js\";\nexport {\n IP_TEMPLATES, EMBED_PLATFORM_META, SOCIAL_PLATFORM_META, TEMPLATE_TRAIT_TYPES, DOC_UPLOAD,\n} from \"./data/ip-templates.js\";\nexport type { EmbedPlatform, SocialPlatform, TraitSuggestion, IPTemplate, DocUploadConfig } from \"./data/ip-templates.js\";\nexport { IPTypeDisplay } from \"./components/ip-type-display.js\";\nexport { AssetOverviewContent } from \"./components/asset-overview-content.js\";\nexport { AssetLicenseSummary } from \"./components/asset-license-summary.js\";\nexport { AssetMarketsTab } from \"./components/asset-markets-tab.js\";\nexport { ParentAttributionBanner } from \"./components/parent-attribution-banner.js\";\nexport type { ParentBannerProps } from \"./components/parent-attribution-banner.js\";\nexport { AssetMediaColumn, AssetHeaderBlock, buildEditionStats } from \"./components/asset-top-sections.js\";\nexport { BRAND } from \"./data/brand.js\";\n\n// ── Components (client-only — all have \"use client\") ─────────────────────────\nexport { CurrencyIcon, CurrencyAmount } from \"./components/currency-icon.js\";\nexport type { CurrencyIconProps, CurrencyAmountProps } from \"./components/currency-icon.js\";\n\nexport { IpTypeBadge, IP_TYPE_CONFIG, IP_TYPE_MAP } from \"./components/ip-type-badge.js\";\nexport type { IpTypeBadgeProps, IpTypeConfig } from \"./components/ip-type-badge.js\";\n\nexport { AddressDisplay } from \"./components/address-display.js\";\nexport type { AddressDisplayProps } from \"./components/address-display.js\";\n\nexport { MedialaneIcon } from \"./components/brand-icon.js\";\nexport type { MedialaneIconProps } from \"./components/brand-icon.js\";\nexport { MedialaneLogoFull } from \"./components/brand-logo.js\";\nexport type { MedialaneLogoFullProps } from \"./components/brand-logo.js\";\n\n// ── v0.2 additions ────────────────────────────────────────────────────────────\nexport { MotionCard, FadeIn, Stagger, StaggerItem, KineticWords, SPRING, EASE_OUT } from \"./components/motion-primitives.js\";\nexport { PageContainer } from \"./components/page-container.js\";\nexport type { PageContainerProps } from \"./components/page-container.js\";\nexport { ScrollSection } from \"./components/scroll-section.js\";\nexport type { ScrollSectionProps } from \"./components/scroll-section.js\";\nexport { ShareButton } from \"./components/share-button.js\";\nexport type { ShareButtonProps } from \"./components/share-button.js\";\nexport { CollectionCard, CollectionCardSkeleton } from \"./components/collection-card.js\";\nexport type { CollectionCardProps } from \"./components/collection-card.js\";\nexport { TokenCard, TokenCardSkeleton } from \"./components/token-card.js\";\nexport type { TokenCardProps, RarityTier } from \"./components/token-card.js\";\nexport { AssetCard, AssetCardSkeleton } from \"./components/asset-card.js\";\nexport type { AssetCardProps, AssetCardPrice } from \"./components/asset-card.js\";\n// ── Coin discovery (chain-agnostic; price/data/href injected by the app) ─────\nexport {\n coinKind, formatCoinPrice, formatFdv,\n type CoinKind, type CoinCollectionLike, type CoinPriceLike,\n} from \"./data/coins.js\";\nexport { CoinCard, CoinRow, CoinCardSkeleton, type UseCoinPrice, type CoinTileProps } from \"./components/coin-card.js\";\nexport {\n CoinsExplorer,\n type CoinsExplorerProps, type CoinFilter, type CoinSort, type UseCoins,\n} from \"./components/coins-explorer.js\";\n\n// ── v0.3 additions ────────────────────────────────────────────────────────────\nexport { timeAgo, timeUntil } from \"./utils/time.js\";\nexport { ACTIVITY_TYPE_CONFIG, TYPE_FILTERS } from \"./data/activity.js\";\nexport type { ActivityTypeConfig } from \"./data/activity.js\";\nexport { HeroSlider, HeroSliderSkeleton } from \"./components/hero-slider.js\";\nexport type { HeroSliderProps } from \"./components/hero-slider.js\";\nexport { ActivityTicker } from \"./components/activity-ticker.js\";\nexport type { ActivityTickerProps } from \"./components/activity-ticker.js\";\nexport { ListingCard, ListingCardSkeleton } from \"./components/listing-card.js\";\nexport type { ListingCardProps } from \"./components/listing-card.js\";\nexport { ActivityRow } from \"./components/activity-row.js\";\nexport type { ActivityRowProps } from \"./components/activity-row.js\";\nexport { ActivityFeedShell } from \"./components/activity-feed-shell.js\";\nexport type { ActivityFeedShellProps } from \"./components/activity-feed-shell.js\";\nexport { CtaCardGrid } from \"./components/cta-card-grid.js\";\nexport type { CtaCardGridProps, CtaCardItem } from \"./components/cta-card-grid.js\";\n\n// ── v0.3.2 additions ─────────────────────────────────────────────────────────\nexport { DiscoverHero } from \"./components/discover-hero.js\";\nexport type { DiscoverHeroProps } from \"./components/discover-hero.js\";\nexport { FeaturedCarousel, FeaturedCarouselSkeleton } from \"./components/featured-carousel.js\";\nexport type { FeaturedCarouselProps } from \"./components/featured-carousel.js\";\nexport { DiscoverCollectionsStrip } from \"./components/discover-collections-strip.js\";\nexport type { DiscoverCollectionsStripProps } from \"./components/discover-collections-strip.js\";\nexport { DiscoverCreatorsStrip } from \"./components/discover-creators-strip.js\";\nexport type { DiscoverCreatorsStripProps } from \"./components/discover-creators-strip.js\";\nexport { DiscoverFeedSection } from \"./components/discover-feed-section.js\";\nexport type { DiscoverFeedSectionProps } from \"./components/discover-feed-section.js\";\nexport { ActivityCard, ActivityCardSkeleton, ACTIVITY_MESSAGES } from \"./components/activity-card.js\";\nexport type { ActivityCardProps } from \"./components/activity-card.js\";\n\n// ── Launchpad (grouped sections — single page-UI source since 0.8.0) ─────────\nexport { LaunchpadGroupedSections, LaunchpadServiceCard, SERVICE_HUES } from \"./components/launchpad-services.js\";\nexport { LaunchpadStrip } from \"./components/launchpad-strip.js\";\nexport type { LaunchpadStripProps } from \"./components/launchpad-strip.js\";\nexport type { LaunchpadGroupedSectionsProps, LaunchpadServiceCardProps, ServiceOverride, ServiceOverrides } from \"./components/launchpad-services.js\";\nexport { LAUNCHPAD_SERVICE_DEFINITIONS, LAUNCHPAD_SERVICE_GROUPS } from \"./data/launchpad-services.js\";\nexport type { ServiceDefinition, ServiceStatus, ServiceCategory, ServiceGroup, ServiceGroupDefinition } from \"./data/launchpad-services.js\";\n\n// ── v0.5.0 additions ─────────────────────────────────────────────────────────\nexport { NavCommandMenu, useNavCommandMenu } from \"./components/nav-command-menu.js\";\nexport type { NavCommand, NavCommandGroup, NavCommandMenuProps } from \"./components/nav-command-menu.js\";\n\n// ── v0.6.0 additions — portfolio subnav + counts ────────────────────────────\nexport { PortfolioSubnav } from \"./components/portfolio-subnav.js\";\nexport type {\n PortfolioSubnavProps,\n PortfolioNavItem,\n PortfolioNavGroup,\n PortfolioBadgeVariant,\n} from \"./components/portfolio-subnav.js\";\nexport { derivePortfolioCounts } from \"./utils/portfolio-counts.js\";\nexport type { PortfolioCounts, CountableOrder } from \"./utils/portfolio-counts.js\";\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,gBAAmB;AACnB,oBAAmC;AACnC,qBAA+B;AAC/B,kBAA2B;AAC3B,6BAA+B;AAG/B,sBAA+C;AAE/C,gBAGO;AAEP,0BAEO;AAEP,6BAA8B;AAC9B,oCAAqC;AACrC,mCAAoC;AACpC,+BAAgC;AAChC,uCAAwC;AAExC,gCAAsE;AACtE,mBAAsB;AAGtB,2BAA6C;AAG7C,2BAAyD;AAGzD,6BAA+B;AAG/B,wBAA8B;AAE9B,wBAAkC;AAIlC,+BAAyF;AACzF,4BAA8B;AAE9B,4BAA8B;AAE9B,0BAA4B;AAE5B,6BAAuD;AAEvD,wBAA6C;AAE7C,wBAA6C;AAG7C,mBAGO;AACP,uBAA2F;AAC3F,4BAGO;AAGP,kBAAmC;AACnC,sBAAmD;AAEnD,yBAA+C;AAE/C,6BAA+B;AAE/B,0BAAiD;AAEjD,0BAA4B;AAE5B,iCAAkC;AAElC,2BAA4B;AAI5B,2BAA6B;AAE7B,+BAA2D;AAE3D,wCAAyC;AAEzC,qCAAsC;AAEtC,mCAAoC;AAEpC,2BAAsE;AAItE,gCAA6E;AAC7E,6BAA+B;AAG/B,IAAAA,6BAAwE;AAIxE,8BAAkD;AAIlD,8BAAgC;AAOhC,8BAAsC;","names":["import_launchpad_services"]}
package/dist/index.d.cts CHANGED
@@ -24,6 +24,7 @@ export { ScrollSection, ScrollSectionProps } from './components/scroll-section.c
24
24
  export { ShareButton, ShareButtonProps } from './components/share-button.cjs';
25
25
  export { CollectionCard, CollectionCardProps, CollectionCardSkeleton } from './components/collection-card.cjs';
26
26
  export { RarityTier, TokenCard, TokenCardProps, TokenCardSkeleton } from './components/token-card.cjs';
27
+ export { AssetCard, AssetCardPrice, AssetCardProps, AssetCardSkeleton } from './components/asset-card.cjs';
27
28
  export { CoinCollectionLike, CoinKind, CoinPriceLike, coinKind, formatCoinPrice, formatFdv } from './data/coins.cjs';
28
29
  export { CoinCard, CoinCardSkeleton, CoinRow, CoinTileProps, UseCoinPrice } from './components/coin-card.cjs';
29
30
  export { CoinFilter, CoinSort, CoinsExplorer, CoinsExplorerProps, UseCoins } from './components/coins-explorer.cjs';
package/dist/index.d.ts CHANGED
@@ -24,6 +24,7 @@ export { ScrollSection, ScrollSectionProps } from './components/scroll-section.j
24
24
  export { ShareButton, ShareButtonProps } from './components/share-button.js';
25
25
  export { CollectionCard, CollectionCardProps, CollectionCardSkeleton } from './components/collection-card.js';
26
26
  export { RarityTier, TokenCard, TokenCardProps, TokenCardSkeleton } from './components/token-card.js';
27
+ export { AssetCard, AssetCardPrice, AssetCardProps, AssetCardSkeleton } from './components/asset-card.js';
27
28
  export { CoinCollectionLike, CoinKind, CoinPriceLike, coinKind, formatCoinPrice, formatFdv } from './data/coins.js';
28
29
  export { CoinCard, CoinCardSkeleton, CoinRow, CoinTileProps, UseCoinPrice } from './components/coin-card.js';
29
30
  export { CoinFilter, CoinSort, CoinsExplorer, CoinsExplorerProps, UseCoins } from './components/coins-explorer.js';
package/dist/index.js CHANGED
@@ -37,6 +37,7 @@ import { ScrollSection } from "./components/scroll-section.js";
37
37
  import { ShareButton } from "./components/share-button.js";
38
38
  import { CollectionCard, CollectionCardSkeleton } from "./components/collection-card.js";
39
39
  import { TokenCard, TokenCardSkeleton } from "./components/token-card.js";
40
+ import { AssetCard, AssetCardSkeleton } from "./components/asset-card.js";
40
41
  import {
41
42
  coinKind,
42
43
  formatCoinPrice,
@@ -76,6 +77,8 @@ export {
76
77
  ActivityRow,
77
78
  ActivityTicker,
78
79
  AddressDisplay,
80
+ AssetCard,
81
+ AssetCardSkeleton,
79
82
  AssetHeaderBlock,
80
83
  AssetLicenseSummary,
81
84
  AssetMarketsTab,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// ── Utils ─────────────────────────────────────────────────────────────────────\nexport { cn } from \"./utils/cn.js\";\nexport { formatDisplayPrice } from \"./utils/format.js\";\nexport { shortenAddress } from \"./utils/address.js\";\nexport { ipfsToHttp } from \"./utils/ipfs.js\";\nexport { licenseSummary } from \"./utils/license-summary.js\";\n\n// ── Data (server-safe — no React, safe in Server Components) ──────────────────\nexport { IP_TYPE_DATA, IP_TYPE_DATA_MAP } from \"./data/ip-types.js\";\nexport type { IpTypeData } from \"./data/ip-types.js\";\nexport {\n IP_TYPES, LICENSE_TYPES, GEOGRAPHIC_SCOPES, AI_POLICIES,\n DERIVATIVES_OPTIONS, LICENSE_TRAIT_TYPES,\n} from \"./data/ip.js\";\nexport type { IPType, LicenseType } from \"./data/ip.js\";\nexport {\n IP_TEMPLATES, EMBED_PLATFORM_META, SOCIAL_PLATFORM_META, TEMPLATE_TRAIT_TYPES, DOC_UPLOAD,\n} from \"./data/ip-templates.js\";\nexport type { EmbedPlatform, SocialPlatform, TraitSuggestion, IPTemplate, DocUploadConfig } from \"./data/ip-templates.js\";\nexport { IPTypeDisplay } from \"./components/ip-type-display.js\";\nexport { AssetOverviewContent } from \"./components/asset-overview-content.js\";\nexport { AssetLicenseSummary } from \"./components/asset-license-summary.js\";\nexport { AssetMarketsTab } from \"./components/asset-markets-tab.js\";\nexport { ParentAttributionBanner } from \"./components/parent-attribution-banner.js\";\nexport type { ParentBannerProps } from \"./components/parent-attribution-banner.js\";\nexport { AssetMediaColumn, AssetHeaderBlock, buildEditionStats } from \"./components/asset-top-sections.js\";\nexport { BRAND } from \"./data/brand.js\";\n\n// ── Components (client-only — all have \"use client\") ─────────────────────────\nexport { CurrencyIcon, CurrencyAmount } from \"./components/currency-icon.js\";\nexport type { CurrencyIconProps, CurrencyAmountProps } from \"./components/currency-icon.js\";\n\nexport { IpTypeBadge, IP_TYPE_CONFIG, IP_TYPE_MAP } from \"./components/ip-type-badge.js\";\nexport type { IpTypeBadgeProps, IpTypeConfig } from \"./components/ip-type-badge.js\";\n\nexport { AddressDisplay } from \"./components/address-display.js\";\nexport type { AddressDisplayProps } from \"./components/address-display.js\";\n\nexport { MedialaneIcon } from \"./components/brand-icon.js\";\nexport type { MedialaneIconProps } from \"./components/brand-icon.js\";\nexport { MedialaneLogoFull } from \"./components/brand-logo.js\";\nexport type { MedialaneLogoFullProps } from \"./components/brand-logo.js\";\n\n// ── v0.2 additions ────────────────────────────────────────────────────────────\nexport { MotionCard, FadeIn, Stagger, StaggerItem, KineticWords, SPRING, EASE_OUT } from \"./components/motion-primitives.js\";\nexport { PageContainer } from \"./components/page-container.js\";\nexport type { PageContainerProps } from \"./components/page-container.js\";\nexport { ScrollSection } from \"./components/scroll-section.js\";\nexport type { ScrollSectionProps } from \"./components/scroll-section.js\";\nexport { ShareButton } from \"./components/share-button.js\";\nexport type { ShareButtonProps } from \"./components/share-button.js\";\nexport { CollectionCard, CollectionCardSkeleton } from \"./components/collection-card.js\";\nexport type { CollectionCardProps } from \"./components/collection-card.js\";\nexport { TokenCard, TokenCardSkeleton } from \"./components/token-card.js\";\nexport type { TokenCardProps, RarityTier } from \"./components/token-card.js\";\n// ── Coin discovery (chain-agnostic; price/data/href injected by the app) ─────\nexport {\n coinKind, formatCoinPrice, formatFdv,\n type CoinKind, type CoinCollectionLike, type CoinPriceLike,\n} from \"./data/coins.js\";\nexport { CoinCard, CoinRow, CoinCardSkeleton, type UseCoinPrice, type CoinTileProps } from \"./components/coin-card.js\";\nexport {\n CoinsExplorer,\n type CoinsExplorerProps, type CoinFilter, type CoinSort, type UseCoins,\n} from \"./components/coins-explorer.js\";\n\n// ── v0.3 additions ────────────────────────────────────────────────────────────\nexport { timeAgo, timeUntil } from \"./utils/time.js\";\nexport { ACTIVITY_TYPE_CONFIG, TYPE_FILTERS } from \"./data/activity.js\";\nexport type { ActivityTypeConfig } from \"./data/activity.js\";\nexport { HeroSlider, HeroSliderSkeleton } from \"./components/hero-slider.js\";\nexport type { HeroSliderProps } from \"./components/hero-slider.js\";\nexport { ActivityTicker } from \"./components/activity-ticker.js\";\nexport type { ActivityTickerProps } from \"./components/activity-ticker.js\";\nexport { ListingCard, ListingCardSkeleton } from \"./components/listing-card.js\";\nexport type { ListingCardProps } from \"./components/listing-card.js\";\nexport { ActivityRow } from \"./components/activity-row.js\";\nexport type { ActivityRowProps } from \"./components/activity-row.js\";\nexport { ActivityFeedShell } from \"./components/activity-feed-shell.js\";\nexport type { ActivityFeedShellProps } from \"./components/activity-feed-shell.js\";\nexport { CtaCardGrid } from \"./components/cta-card-grid.js\";\nexport type { CtaCardGridProps, CtaCardItem } from \"./components/cta-card-grid.js\";\n\n// ── v0.3.2 additions ─────────────────────────────────────────────────────────\nexport { DiscoverHero } from \"./components/discover-hero.js\";\nexport type { DiscoverHeroProps } from \"./components/discover-hero.js\";\nexport { FeaturedCarousel, FeaturedCarouselSkeleton } from \"./components/featured-carousel.js\";\nexport type { FeaturedCarouselProps } from \"./components/featured-carousel.js\";\nexport { DiscoverCollectionsStrip } from \"./components/discover-collections-strip.js\";\nexport type { DiscoverCollectionsStripProps } from \"./components/discover-collections-strip.js\";\nexport { DiscoverCreatorsStrip } from \"./components/discover-creators-strip.js\";\nexport type { DiscoverCreatorsStripProps } from \"./components/discover-creators-strip.js\";\nexport { DiscoverFeedSection } from \"./components/discover-feed-section.js\";\nexport type { DiscoverFeedSectionProps } from \"./components/discover-feed-section.js\";\nexport { ActivityCard, ActivityCardSkeleton, ACTIVITY_MESSAGES } from \"./components/activity-card.js\";\nexport type { ActivityCardProps } from \"./components/activity-card.js\";\n\n// ── Launchpad (grouped sections — single page-UI source since 0.8.0) ─────────\nexport { LaunchpadGroupedSections, LaunchpadServiceCard, SERVICE_HUES } from \"./components/launchpad-services.js\";\nexport { LaunchpadStrip } from \"./components/launchpad-strip.js\";\nexport type { LaunchpadStripProps } from \"./components/launchpad-strip.js\";\nexport type { LaunchpadGroupedSectionsProps, LaunchpadServiceCardProps, ServiceOverride, ServiceOverrides } from \"./components/launchpad-services.js\";\nexport { LAUNCHPAD_SERVICE_DEFINITIONS, LAUNCHPAD_SERVICE_GROUPS } from \"./data/launchpad-services.js\";\nexport type { ServiceDefinition, ServiceStatus, ServiceCategory, ServiceGroup, ServiceGroupDefinition } from \"./data/launchpad-services.js\";\n\n// ── v0.5.0 additions ─────────────────────────────────────────────────────────\nexport { NavCommandMenu, useNavCommandMenu } from \"./components/nav-command-menu.js\";\nexport type { NavCommand, NavCommandGroup, NavCommandMenuProps } from \"./components/nav-command-menu.js\";\n\n// ── v0.6.0 additions — portfolio subnav + counts ────────────────────────────\nexport { PortfolioSubnav } from \"./components/portfolio-subnav.js\";\nexport type {\n PortfolioSubnavProps,\n PortfolioNavItem,\n PortfolioNavGroup,\n PortfolioBadgeVariant,\n} from \"./components/portfolio-subnav.js\";\nexport { derivePortfolioCounts } from \"./utils/portfolio-counts.js\";\nexport type { PortfolioCounts, CountableOrder } from \"./utils/portfolio-counts.js\";\n"],"mappings":"AACA,SAAS,UAAU;AACnB,SAAS,0BAA0B;AACnC,SAAS,sBAAsB;AAC/B,SAAS,kBAAkB;AAC3B,SAAS,sBAAsB;AAG/B,SAAS,cAAc,wBAAwB;AAE/C;AAAA,EACE;AAAA,EAAU;AAAA,EAAe;AAAA,EAAmB;AAAA,EAC5C;AAAA,EAAqB;AAAA,OAChB;AAEP;AAAA,EACE;AAAA,EAAc;AAAA,EAAqB;AAAA,EAAsB;AAAA,EAAsB;AAAA,OAC1E;AAEP,SAAS,qBAAqB;AAC9B,SAAS,4BAA4B;AACrC,SAAS,2BAA2B;AACpC,SAAS,uBAAuB;AAChC,SAAS,+BAA+B;AAExC,SAAS,kBAAkB,kBAAkB,yBAAyB;AACtE,SAAS,aAAa;AAGtB,SAAS,cAAc,sBAAsB;AAG7C,SAAS,aAAa,gBAAgB,mBAAmB;AAGzD,SAAS,sBAAsB;AAG/B,SAAS,qBAAqB;AAE9B,SAAS,yBAAyB;AAIlC,SAAS,YAAY,QAAQ,SAAS,aAAa,cAAc,QAAQ,gBAAgB;AACzF,SAAS,qBAAqB;AAE9B,SAAS,qBAAqB;AAE9B,SAAS,mBAAmB;AAE5B,SAAS,gBAAgB,8BAA8B;AAEvD,SAAS,WAAW,yBAAyB;AAG7C;AAAA,EACE;AAAA,EAAU;AAAA,EAAiB;AAAA,OAEtB;AACP,SAAS,UAAU,SAAS,wBAA+D;AAC3F;AAAA,EACE;AAAA,OAEK;AAGP,SAAS,SAAS,iBAAiB;AACnC,SAAS,sBAAsB,oBAAoB;AAEnD,SAAS,YAAY,0BAA0B;AAE/C,SAAS,sBAAsB;AAE/B,SAAS,aAAa,2BAA2B;AAEjD,SAAS,mBAAmB;AAE5B,SAAS,yBAAyB;AAElC,SAAS,mBAAmB;AAI5B,SAAS,oBAAoB;AAE7B,SAAS,kBAAkB,gCAAgC;AAE3D,SAAS,gCAAgC;AAEzC,SAAS,6BAA6B;AAEtC,SAAS,2BAA2B;AAEpC,SAAS,cAAc,sBAAsB,yBAAyB;AAItE,SAAS,0BAA0B,sBAAsB,oBAAoB;AAC7E,SAAS,sBAAsB;AAG/B,SAAS,+BAA+B,gCAAgC;AAIxE,SAAS,gBAAgB,yBAAyB;AAIlD,SAAS,uBAAuB;AAOhC,SAAS,6BAA6B;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// ── Utils ─────────────────────────────────────────────────────────────────────\nexport { cn } from \"./utils/cn.js\";\nexport { formatDisplayPrice } from \"./utils/format.js\";\nexport { shortenAddress } from \"./utils/address.js\";\nexport { ipfsToHttp } from \"./utils/ipfs.js\";\nexport { licenseSummary } from \"./utils/license-summary.js\";\n\n// ── Data (server-safe — no React, safe in Server Components) ──────────────────\nexport { IP_TYPE_DATA, IP_TYPE_DATA_MAP } from \"./data/ip-types.js\";\nexport type { IpTypeData } from \"./data/ip-types.js\";\nexport {\n IP_TYPES, LICENSE_TYPES, GEOGRAPHIC_SCOPES, AI_POLICIES,\n DERIVATIVES_OPTIONS, LICENSE_TRAIT_TYPES,\n} from \"./data/ip.js\";\nexport type { IPType, LicenseType } from \"./data/ip.js\";\nexport {\n IP_TEMPLATES, EMBED_PLATFORM_META, SOCIAL_PLATFORM_META, TEMPLATE_TRAIT_TYPES, DOC_UPLOAD,\n} from \"./data/ip-templates.js\";\nexport type { EmbedPlatform, SocialPlatform, TraitSuggestion, IPTemplate, DocUploadConfig } from \"./data/ip-templates.js\";\nexport { IPTypeDisplay } from \"./components/ip-type-display.js\";\nexport { AssetOverviewContent } from \"./components/asset-overview-content.js\";\nexport { AssetLicenseSummary } from \"./components/asset-license-summary.js\";\nexport { AssetMarketsTab } from \"./components/asset-markets-tab.js\";\nexport { ParentAttributionBanner } from \"./components/parent-attribution-banner.js\";\nexport type { ParentBannerProps } from \"./components/parent-attribution-banner.js\";\nexport { AssetMediaColumn, AssetHeaderBlock, buildEditionStats } from \"./components/asset-top-sections.js\";\nexport { BRAND } from \"./data/brand.js\";\n\n// ── Components (client-only — all have \"use client\") ─────────────────────────\nexport { CurrencyIcon, CurrencyAmount } from \"./components/currency-icon.js\";\nexport type { CurrencyIconProps, CurrencyAmountProps } from \"./components/currency-icon.js\";\n\nexport { IpTypeBadge, IP_TYPE_CONFIG, IP_TYPE_MAP } from \"./components/ip-type-badge.js\";\nexport type { IpTypeBadgeProps, IpTypeConfig } from \"./components/ip-type-badge.js\";\n\nexport { AddressDisplay } from \"./components/address-display.js\";\nexport type { AddressDisplayProps } from \"./components/address-display.js\";\n\nexport { MedialaneIcon } from \"./components/brand-icon.js\";\nexport type { MedialaneIconProps } from \"./components/brand-icon.js\";\nexport { MedialaneLogoFull } from \"./components/brand-logo.js\";\nexport type { MedialaneLogoFullProps } from \"./components/brand-logo.js\";\n\n// ── v0.2 additions ────────────────────────────────────────────────────────────\nexport { MotionCard, FadeIn, Stagger, StaggerItem, KineticWords, SPRING, EASE_OUT } from \"./components/motion-primitives.js\";\nexport { PageContainer } from \"./components/page-container.js\";\nexport type { PageContainerProps } from \"./components/page-container.js\";\nexport { ScrollSection } from \"./components/scroll-section.js\";\nexport type { ScrollSectionProps } from \"./components/scroll-section.js\";\nexport { ShareButton } from \"./components/share-button.js\";\nexport type { ShareButtonProps } from \"./components/share-button.js\";\nexport { CollectionCard, CollectionCardSkeleton } from \"./components/collection-card.js\";\nexport type { CollectionCardProps } from \"./components/collection-card.js\";\nexport { TokenCard, TokenCardSkeleton } from \"./components/token-card.js\";\nexport type { TokenCardProps, RarityTier } from \"./components/token-card.js\";\nexport { AssetCard, AssetCardSkeleton } from \"./components/asset-card.js\";\nexport type { AssetCardProps, AssetCardPrice } from \"./components/asset-card.js\";\n// ── Coin discovery (chain-agnostic; price/data/href injected by the app) ─────\nexport {\n coinKind, formatCoinPrice, formatFdv,\n type CoinKind, type CoinCollectionLike, type CoinPriceLike,\n} from \"./data/coins.js\";\nexport { CoinCard, CoinRow, CoinCardSkeleton, type UseCoinPrice, type CoinTileProps } from \"./components/coin-card.js\";\nexport {\n CoinsExplorer,\n type CoinsExplorerProps, type CoinFilter, type CoinSort, type UseCoins,\n} from \"./components/coins-explorer.js\";\n\n// ── v0.3 additions ────────────────────────────────────────────────────────────\nexport { timeAgo, timeUntil } from \"./utils/time.js\";\nexport { ACTIVITY_TYPE_CONFIG, TYPE_FILTERS } from \"./data/activity.js\";\nexport type { ActivityTypeConfig } from \"./data/activity.js\";\nexport { HeroSlider, HeroSliderSkeleton } from \"./components/hero-slider.js\";\nexport type { HeroSliderProps } from \"./components/hero-slider.js\";\nexport { ActivityTicker } from \"./components/activity-ticker.js\";\nexport type { ActivityTickerProps } from \"./components/activity-ticker.js\";\nexport { ListingCard, ListingCardSkeleton } from \"./components/listing-card.js\";\nexport type { ListingCardProps } from \"./components/listing-card.js\";\nexport { ActivityRow } from \"./components/activity-row.js\";\nexport type { ActivityRowProps } from \"./components/activity-row.js\";\nexport { ActivityFeedShell } from \"./components/activity-feed-shell.js\";\nexport type { ActivityFeedShellProps } from \"./components/activity-feed-shell.js\";\nexport { CtaCardGrid } from \"./components/cta-card-grid.js\";\nexport type { CtaCardGridProps, CtaCardItem } from \"./components/cta-card-grid.js\";\n\n// ── v0.3.2 additions ─────────────────────────────────────────────────────────\nexport { DiscoverHero } from \"./components/discover-hero.js\";\nexport type { DiscoverHeroProps } from \"./components/discover-hero.js\";\nexport { FeaturedCarousel, FeaturedCarouselSkeleton } from \"./components/featured-carousel.js\";\nexport type { FeaturedCarouselProps } from \"./components/featured-carousel.js\";\nexport { DiscoverCollectionsStrip } from \"./components/discover-collections-strip.js\";\nexport type { DiscoverCollectionsStripProps } from \"./components/discover-collections-strip.js\";\nexport { DiscoverCreatorsStrip } from \"./components/discover-creators-strip.js\";\nexport type { DiscoverCreatorsStripProps } from \"./components/discover-creators-strip.js\";\nexport { DiscoverFeedSection } from \"./components/discover-feed-section.js\";\nexport type { DiscoverFeedSectionProps } from \"./components/discover-feed-section.js\";\nexport { ActivityCard, ActivityCardSkeleton, ACTIVITY_MESSAGES } from \"./components/activity-card.js\";\nexport type { ActivityCardProps } from \"./components/activity-card.js\";\n\n// ── Launchpad (grouped sections — single page-UI source since 0.8.0) ─────────\nexport { LaunchpadGroupedSections, LaunchpadServiceCard, SERVICE_HUES } from \"./components/launchpad-services.js\";\nexport { LaunchpadStrip } from \"./components/launchpad-strip.js\";\nexport type { LaunchpadStripProps } from \"./components/launchpad-strip.js\";\nexport type { LaunchpadGroupedSectionsProps, LaunchpadServiceCardProps, ServiceOverride, ServiceOverrides } from \"./components/launchpad-services.js\";\nexport { LAUNCHPAD_SERVICE_DEFINITIONS, LAUNCHPAD_SERVICE_GROUPS } from \"./data/launchpad-services.js\";\nexport type { ServiceDefinition, ServiceStatus, ServiceCategory, ServiceGroup, ServiceGroupDefinition } from \"./data/launchpad-services.js\";\n\n// ── v0.5.0 additions ─────────────────────────────────────────────────────────\nexport { NavCommandMenu, useNavCommandMenu } from \"./components/nav-command-menu.js\";\nexport type { NavCommand, NavCommandGroup, NavCommandMenuProps } from \"./components/nav-command-menu.js\";\n\n// ── v0.6.0 additions — portfolio subnav + counts ────────────────────────────\nexport { PortfolioSubnav } from \"./components/portfolio-subnav.js\";\nexport type {\n PortfolioSubnavProps,\n PortfolioNavItem,\n PortfolioNavGroup,\n PortfolioBadgeVariant,\n} from \"./components/portfolio-subnav.js\";\nexport { derivePortfolioCounts } from \"./utils/portfolio-counts.js\";\nexport type { PortfolioCounts, CountableOrder } from \"./utils/portfolio-counts.js\";\n"],"mappings":"AACA,SAAS,UAAU;AACnB,SAAS,0BAA0B;AACnC,SAAS,sBAAsB;AAC/B,SAAS,kBAAkB;AAC3B,SAAS,sBAAsB;AAG/B,SAAS,cAAc,wBAAwB;AAE/C;AAAA,EACE;AAAA,EAAU;AAAA,EAAe;AAAA,EAAmB;AAAA,EAC5C;AAAA,EAAqB;AAAA,OAChB;AAEP;AAAA,EACE;AAAA,EAAc;AAAA,EAAqB;AAAA,EAAsB;AAAA,EAAsB;AAAA,OAC1E;AAEP,SAAS,qBAAqB;AAC9B,SAAS,4BAA4B;AACrC,SAAS,2BAA2B;AACpC,SAAS,uBAAuB;AAChC,SAAS,+BAA+B;AAExC,SAAS,kBAAkB,kBAAkB,yBAAyB;AACtE,SAAS,aAAa;AAGtB,SAAS,cAAc,sBAAsB;AAG7C,SAAS,aAAa,gBAAgB,mBAAmB;AAGzD,SAAS,sBAAsB;AAG/B,SAAS,qBAAqB;AAE9B,SAAS,yBAAyB;AAIlC,SAAS,YAAY,QAAQ,SAAS,aAAa,cAAc,QAAQ,gBAAgB;AACzF,SAAS,qBAAqB;AAE9B,SAAS,qBAAqB;AAE9B,SAAS,mBAAmB;AAE5B,SAAS,gBAAgB,8BAA8B;AAEvD,SAAS,WAAW,yBAAyB;AAE7C,SAAS,WAAW,yBAAyB;AAG7C;AAAA,EACE;AAAA,EAAU;AAAA,EAAiB;AAAA,OAEtB;AACP,SAAS,UAAU,SAAS,wBAA+D;AAC3F;AAAA,EACE;AAAA,OAEK;AAGP,SAAS,SAAS,iBAAiB;AACnC,SAAS,sBAAsB,oBAAoB;AAEnD,SAAS,YAAY,0BAA0B;AAE/C,SAAS,sBAAsB;AAE/B,SAAS,aAAa,2BAA2B;AAEjD,SAAS,mBAAmB;AAE5B,SAAS,yBAAyB;AAElC,SAAS,mBAAmB;AAI5B,SAAS,oBAAoB;AAE7B,SAAS,kBAAkB,gCAAgC;AAE3D,SAAS,gCAAgC;AAEzC,SAAS,6BAA6B;AAEtC,SAAS,2BAA2B;AAEpC,SAAS,cAAc,sBAAsB,yBAAyB;AAItE,SAAS,0BAA0B,sBAAsB,oBAAoB;AAC7E,SAAS,sBAAsB;AAG/B,SAAS,+BAA+B,gCAAgC;AAIxE,SAAS,gBAAgB,yBAAyB;AAIlD,SAAS,uBAAuB;AAOhC,SAAS,6BAA6B;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@medialane/ui",
3
- "version": "0.19.0",
3
+ "version": "0.21.0",
4
4
  "description": "Shared UI components for Medialane apps",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",