@medialane/ui 0.10.2 → 0.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/activity-card.cjs +137 -0
- package/dist/components/activity-card.cjs.map +1 -0
- package/dist/components/activity-card.d.cts +15 -0
- package/dist/components/activity-card.d.ts +15 -0
- package/dist/components/activity-card.js +101 -0
- package/dist/components/activity-card.js.map +1 -0
- package/dist/components/discover-feed-section.cjs +72 -44
- package/dist/components/discover-feed-section.cjs.map +1 -1
- package/dist/components/discover-feed-section.d.cts +7 -1
- package/dist/components/discover-feed-section.d.ts +7 -1
- package/dist/components/discover-feed-section.js +73 -45
- package/dist/components/discover-feed-section.js.map +1 -1
- package/dist/index.cjs +7 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,137 @@
|
|
|
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 activity_card_exports = {};
|
|
31
|
+
__export(activity_card_exports, {
|
|
32
|
+
ACTIVITY_MESSAGES: () => ACTIVITY_MESSAGES,
|
|
33
|
+
ActivityCard: () => ActivityCard,
|
|
34
|
+
ActivityCardSkeleton: () => ActivityCardSkeleton
|
|
35
|
+
});
|
|
36
|
+
module.exports = __toCommonJS(activity_card_exports);
|
|
37
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
38
|
+
var import_image = __toESM(require("next/image"), 1);
|
|
39
|
+
var import_link = __toESM(require("next/link"), 1);
|
|
40
|
+
var import_lucide_react = require("lucide-react");
|
|
41
|
+
var import_currency_icon = require("./currency-icon.js");
|
|
42
|
+
var import_activity = require("../data/activity.js");
|
|
43
|
+
var import_ipfs = require("../utils/ipfs.js");
|
|
44
|
+
var import_time = require("../utils/time.js");
|
|
45
|
+
var import_format = require("../utils/format.js");
|
|
46
|
+
var import_cn = require("../utils/cn.js");
|
|
47
|
+
const ACTIVITY_MESSAGES = {
|
|
48
|
+
mint: (actor) => actor ? `Minted by ${actor}` : "Newly minted",
|
|
49
|
+
listing: (actor) => actor ? `Listed by ${actor}` : "Listed for sale",
|
|
50
|
+
sale: (actor) => actor ? `Purchased by ${actor}` : "Sold",
|
|
51
|
+
offer: (actor) => actor ? `Offer by ${actor}` : "Offer placed",
|
|
52
|
+
transfer: (actor) => actor ? `Transferred by ${actor}` : "Transferred",
|
|
53
|
+
cancelled: (actor) => actor ? `Cancelled by ${actor}` : "Listing cancelled"
|
|
54
|
+
};
|
|
55
|
+
function ActivityCardSkeleton() {
|
|
56
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "card-base", children: [
|
|
57
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "aspect-square w-full bg-muted animate-pulse" }),
|
|
58
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "p-4 space-y-2", children: [
|
|
59
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "h-4 w-32 bg-muted animate-pulse rounded" }),
|
|
60
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "h-3 w-24 bg-muted animate-pulse rounded" })
|
|
61
|
+
] })
|
|
62
|
+
] });
|
|
63
|
+
}
|
|
64
|
+
function ActivityCard({
|
|
65
|
+
activity: rawActivity,
|
|
66
|
+
getAssetHref = (c, t) => `/asset/${c}/${t}`
|
|
67
|
+
}) {
|
|
68
|
+
const activity = rawActivity;
|
|
69
|
+
const config = import_activity.ACTIVITY_TYPE_CONFIG[activity.type] ?? {
|
|
70
|
+
label: activity.type,
|
|
71
|
+
variant: "outline",
|
|
72
|
+
icon: import_lucide_react.ExternalLink,
|
|
73
|
+
colorClass: "text-muted-foreground",
|
|
74
|
+
bgClass: "bg-muted"
|
|
75
|
+
};
|
|
76
|
+
const Icon = config.icon;
|
|
77
|
+
const contract = activity.nftContract ?? activity.contractAddress ?? null;
|
|
78
|
+
const tokenId = activity.nftTokenId ?? activity.tokenId ?? null;
|
|
79
|
+
const actor = activity.offerer ?? activity.fulfiller ?? (activity.type === "mint" ? activity.to : activity.from) ?? null;
|
|
80
|
+
const tokenName = activity.token?.name ?? (tokenId ? `#${tokenId}` : "\u2014");
|
|
81
|
+
const rawImage = activity.token?.image ?? null;
|
|
82
|
+
const tokenImage = rawImage ? (0, import_ipfs.ipfsToHttp)(rawImage) : null;
|
|
83
|
+
const amount = activity.amount && Number(activity.amount) > 1 ? activity.amount : null;
|
|
84
|
+
const shortActor = actor ? actor.length > 10 ? `${actor.slice(0, 6)}\u2026${actor.slice(-4)}` : actor : null;
|
|
85
|
+
const message = ACTIVITY_MESSAGES[activity.type]?.(shortActor) ?? config.label;
|
|
86
|
+
const body = /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
87
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "aspect-square relative bg-muted", children: [
|
|
88
|
+
tokenImage ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
89
|
+
import_image.default,
|
|
90
|
+
{
|
|
91
|
+
src: tokenImage,
|
|
92
|
+
alt: tokenName,
|
|
93
|
+
fill: true,
|
|
94
|
+
sizes: "256px",
|
|
95
|
+
className: "object-cover",
|
|
96
|
+
unoptimized: true
|
|
97
|
+
}
|
|
98
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "absolute inset-0 bg-gradient-to-br from-muted-foreground/10 to-muted-foreground/5", "aria-hidden": true }),
|
|
99
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "absolute top-2.5 left-2.5 inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full text-[11px] font-semibold bg-background/75 backdrop-blur-md border border-border/40", children: [
|
|
100
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Icon, { className: (0, import_cn.cn)("h-3 w-3", config.colorClass), "aria-hidden": true }),
|
|
101
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: config.colorClass, children: config.label })
|
|
102
|
+
] }),
|
|
103
|
+
amount && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "absolute bottom-2.5 right-2.5 px-2 py-0.5 rounded-full text-[10px] font-bold bg-violet-500 text-white", children: [
|
|
104
|
+
"\xD7",
|
|
105
|
+
amount
|
|
106
|
+
] })
|
|
107
|
+
] }),
|
|
108
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "p-4 space-y-1.5", children: [
|
|
109
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-[15px] font-semibold truncate", children: tokenName }),
|
|
110
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
111
|
+
"p",
|
|
112
|
+
{
|
|
113
|
+
className: "text-xs text-muted-foreground truncate",
|
|
114
|
+
title: new Date(activity.timestamp).toLocaleString(),
|
|
115
|
+
children: [
|
|
116
|
+
message,
|
|
117
|
+
" \xB7 ",
|
|
118
|
+
(0, import_time.timeAgo)(activity.timestamp)
|
|
119
|
+
]
|
|
120
|
+
}
|
|
121
|
+
),
|
|
122
|
+
activity.price?.formatted && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", { className: "text-sm font-bold tabular-nums flex items-center gap-1.5 pt-0.5", children: [
|
|
123
|
+
activity.price.currency && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_currency_icon.CurrencyIcon, { symbol: activity.price.currency, size: 13, "aria-hidden": true }),
|
|
124
|
+
(0, import_format.formatDisplayPrice)(activity.price.formatted)
|
|
125
|
+
] })
|
|
126
|
+
] })
|
|
127
|
+
] });
|
|
128
|
+
const className = "card-base block active:scale-[0.99] transition-all";
|
|
129
|
+
return contract && tokenId ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: getAssetHref(contract, tokenId), className, children: body }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className, children: body });
|
|
130
|
+
}
|
|
131
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
132
|
+
0 && (module.exports = {
|
|
133
|
+
ACTIVITY_MESSAGES,
|
|
134
|
+
ActivityCard,
|
|
135
|
+
ActivityCardSkeleton
|
|
136
|
+
});
|
|
137
|
+
//# sourceMappingURL=activity-card.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/activity-card.tsx"],"sourcesContent":["\"use client\";\n\nimport Image from \"next/image\";\nimport Link from \"next/link\";\nimport { ExternalLink } from \"lucide-react\";\nimport { CurrencyIcon } from \"./currency-icon.js\";\nimport { ACTIVITY_TYPE_CONFIG } from \"../data/activity.js\";\nimport { ipfsToHttp } from \"../utils/ipfs.js\";\nimport { timeAgo } from \"../utils/time.js\";\nimport { formatDisplayPrice } from \"../utils/format.js\";\nimport { cn } from \"../utils/cn.js\";\nimport type { ApiActivity } from \"@medialane/sdk\";\n\n/** ui's pinned SDK lags the apps — extend structurally for fields newer SDKs carry. */\ntype ActivityWithEnrichment = ApiActivity & {\n token?: { name: string | null; image: string | null } | null;\n amount?: string;\n};\n\nexport const ACTIVITY_MESSAGES: Record<string, (actor: string | null) => string> = {\n mint: (actor) => actor ? `Minted by ${actor}` : \"Newly minted\",\n listing: (actor) => actor ? `Listed by ${actor}` : \"Listed for sale\",\n sale: (actor) => actor ? `Purchased by ${actor}` : \"Sold\",\n offer: (actor) => actor ? `Offer by ${actor}` : \"Offer placed\",\n transfer: (actor) => actor ? `Transferred by ${actor}` : \"Transferred\",\n cancelled: (actor) => actor ? `Cancelled by ${actor}` : \"Listing cancelled\",\n};\n\nexport function ActivityCardSkeleton() {\n return (\n <div className=\"card-base\">\n <div className=\"aspect-square w-full bg-muted animate-pulse\" />\n <div className=\"p-4 space-y-2\">\n <div className=\"h-4 w-32 bg-muted animate-pulse rounded\" />\n <div className=\"h-3 w-24 bg-muted animate-pulse rounded\" />\n </div>\n </div>\n );\n}\n\nexport interface ActivityCardProps {\n activity: ApiActivity;\n /** Builds the asset link; card is unlinked when the activity has no token ref */\n getAssetHref?: (contract: string, tokenId: string) => string;\n}\n\n/** Card-shaped activity item for horizontal carousels (Discover Community strip).\n * Same data as ActivityRow, presented like a collection/listing card. */\nexport function ActivityCard({\n activity: rawActivity,\n getAssetHref = (c, t) => `/asset/${c}/${t}`,\n}: ActivityCardProps) {\n const activity = rawActivity as ActivityWithEnrichment;\n const config = ACTIVITY_TYPE_CONFIG[activity.type] ?? {\n label: activity.type,\n variant: \"outline\" as const,\n icon: ExternalLink,\n colorClass: \"text-muted-foreground\",\n bgClass: \"bg-muted\",\n };\n const Icon = config.icon;\n\n const contract = activity.nftContract ?? activity.contractAddress ?? null;\n const tokenId = activity.nftTokenId ?? activity.tokenId ?? null;\n const actor =\n activity.offerer ??\n activity.fulfiller ??\n ((activity.type as string) === \"mint\" ? activity.to : activity.from) ??\n null;\n\n const tokenName = activity.token?.name ?? (tokenId ? `#${tokenId}` : \"—\");\n const rawImage = activity.token?.image ?? null;\n const tokenImage = rawImage ? ipfsToHttp(rawImage) : null;\n const amount = activity.amount && Number(activity.amount) > 1 ? activity.amount : null;\n\n const shortActor = actor\n ? actor.length > 10\n ? `${actor.slice(0, 6)}…${actor.slice(-4)}`\n : actor\n : null;\n const message = ACTIVITY_MESSAGES[activity.type]?.(shortActor) ?? config.label;\n\n const body = (\n <>\n <div className=\"aspect-square relative bg-muted\">\n {tokenImage ? (\n <Image\n src={tokenImage}\n alt={tokenName}\n fill\n sizes=\"256px\"\n className=\"object-cover\"\n unoptimized\n />\n ) : (\n <div className=\"absolute inset-0 bg-gradient-to-br from-muted-foreground/10 to-muted-foreground/5\" aria-hidden />\n )}\n {/* Activity type chip — vivid label on glass */}\n <span className=\"absolute top-2.5 left-2.5 inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full text-[11px] font-semibold bg-background/75 backdrop-blur-md border border-border/40\">\n <Icon className={cn(\"h-3 w-3\", config.colorClass)} aria-hidden />\n <span className={config.colorClass}>{config.label}</span>\n </span>\n {amount && (\n <span className=\"absolute bottom-2.5 right-2.5 px-2 py-0.5 rounded-full text-[10px] font-bold bg-violet-500 text-white\">\n ×{amount}\n </span>\n )}\n </div>\n <div className=\"p-4 space-y-1.5\">\n <p className=\"text-[15px] font-semibold truncate\">{tokenName}</p>\n <p\n className=\"text-xs text-muted-foreground truncate\"\n title={new Date(activity.timestamp).toLocaleString()}\n >\n {message} · {timeAgo(activity.timestamp)}\n </p>\n {activity.price?.formatted && (\n <p className=\"text-sm font-bold tabular-nums flex items-center gap-1.5 pt-0.5\">\n {activity.price.currency && <CurrencyIcon symbol={activity.price.currency} size={13} aria-hidden />}\n {formatDisplayPrice(activity.price.formatted)}\n </p>\n )}\n </div>\n </>\n );\n\n const className = \"card-base block active:scale-[0.99] transition-all\";\n\n return contract && tokenId ? (\n <Link href={getAssetHref(contract, tokenId)} className={className}>\n {body}\n </Link>\n ) : (\n <div className={className}>{body}</div>\n );\n}\n"],"mappings":"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","names":["Image","Link"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { ApiActivity } from '@medialane/sdk';
|
|
3
|
+
|
|
4
|
+
declare const ACTIVITY_MESSAGES: Record<string, (actor: string | null) => string>;
|
|
5
|
+
declare function ActivityCardSkeleton(): react_jsx_runtime.JSX.Element;
|
|
6
|
+
interface ActivityCardProps {
|
|
7
|
+
activity: ApiActivity;
|
|
8
|
+
/** Builds the asset link; card is unlinked when the activity has no token ref */
|
|
9
|
+
getAssetHref?: (contract: string, tokenId: string) => string;
|
|
10
|
+
}
|
|
11
|
+
/** Card-shaped activity item for horizontal carousels (Discover Community strip).
|
|
12
|
+
* Same data as ActivityRow, presented like a collection/listing card. */
|
|
13
|
+
declare function ActivityCard({ activity: rawActivity, getAssetHref, }: ActivityCardProps): react_jsx_runtime.JSX.Element;
|
|
14
|
+
|
|
15
|
+
export { ACTIVITY_MESSAGES, ActivityCard, type ActivityCardProps, ActivityCardSkeleton };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { ApiActivity } from '@medialane/sdk';
|
|
3
|
+
|
|
4
|
+
declare const ACTIVITY_MESSAGES: Record<string, (actor: string | null) => string>;
|
|
5
|
+
declare function ActivityCardSkeleton(): react_jsx_runtime.JSX.Element;
|
|
6
|
+
interface ActivityCardProps {
|
|
7
|
+
activity: ApiActivity;
|
|
8
|
+
/** Builds the asset link; card is unlinked when the activity has no token ref */
|
|
9
|
+
getAssetHref?: (contract: string, tokenId: string) => string;
|
|
10
|
+
}
|
|
11
|
+
/** Card-shaped activity item for horizontal carousels (Discover Community strip).
|
|
12
|
+
* Same data as ActivityRow, presented like a collection/listing card. */
|
|
13
|
+
declare function ActivityCard({ activity: rawActivity, getAssetHref, }: ActivityCardProps): react_jsx_runtime.JSX.Element;
|
|
14
|
+
|
|
15
|
+
export { ACTIVITY_MESSAGES, ActivityCard, type ActivityCardProps, ActivityCardSkeleton };
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import Image from "next/image";
|
|
4
|
+
import Link from "next/link";
|
|
5
|
+
import { ExternalLink } from "lucide-react";
|
|
6
|
+
import { CurrencyIcon } from "./currency-icon.js";
|
|
7
|
+
import { ACTIVITY_TYPE_CONFIG } from "../data/activity.js";
|
|
8
|
+
import { ipfsToHttp } from "../utils/ipfs.js";
|
|
9
|
+
import { timeAgo } from "../utils/time.js";
|
|
10
|
+
import { formatDisplayPrice } from "../utils/format.js";
|
|
11
|
+
import { cn } from "../utils/cn.js";
|
|
12
|
+
const ACTIVITY_MESSAGES = {
|
|
13
|
+
mint: (actor) => actor ? `Minted by ${actor}` : "Newly minted",
|
|
14
|
+
listing: (actor) => actor ? `Listed by ${actor}` : "Listed for sale",
|
|
15
|
+
sale: (actor) => actor ? `Purchased by ${actor}` : "Sold",
|
|
16
|
+
offer: (actor) => actor ? `Offer by ${actor}` : "Offer placed",
|
|
17
|
+
transfer: (actor) => actor ? `Transferred by ${actor}` : "Transferred",
|
|
18
|
+
cancelled: (actor) => actor ? `Cancelled by ${actor}` : "Listing cancelled"
|
|
19
|
+
};
|
|
20
|
+
function ActivityCardSkeleton() {
|
|
21
|
+
return /* @__PURE__ */ jsxs("div", { className: "card-base", children: [
|
|
22
|
+
/* @__PURE__ */ jsx("div", { className: "aspect-square w-full bg-muted animate-pulse" }),
|
|
23
|
+
/* @__PURE__ */ jsxs("div", { className: "p-4 space-y-2", children: [
|
|
24
|
+
/* @__PURE__ */ jsx("div", { className: "h-4 w-32 bg-muted animate-pulse rounded" }),
|
|
25
|
+
/* @__PURE__ */ jsx("div", { className: "h-3 w-24 bg-muted animate-pulse rounded" })
|
|
26
|
+
] })
|
|
27
|
+
] });
|
|
28
|
+
}
|
|
29
|
+
function ActivityCard({
|
|
30
|
+
activity: rawActivity,
|
|
31
|
+
getAssetHref = (c, t) => `/asset/${c}/${t}`
|
|
32
|
+
}) {
|
|
33
|
+
const activity = rawActivity;
|
|
34
|
+
const config = ACTIVITY_TYPE_CONFIG[activity.type] ?? {
|
|
35
|
+
label: activity.type,
|
|
36
|
+
variant: "outline",
|
|
37
|
+
icon: ExternalLink,
|
|
38
|
+
colorClass: "text-muted-foreground",
|
|
39
|
+
bgClass: "bg-muted"
|
|
40
|
+
};
|
|
41
|
+
const Icon = config.icon;
|
|
42
|
+
const contract = activity.nftContract ?? activity.contractAddress ?? null;
|
|
43
|
+
const tokenId = activity.nftTokenId ?? activity.tokenId ?? null;
|
|
44
|
+
const actor = activity.offerer ?? activity.fulfiller ?? (activity.type === "mint" ? activity.to : activity.from) ?? null;
|
|
45
|
+
const tokenName = activity.token?.name ?? (tokenId ? `#${tokenId}` : "\u2014");
|
|
46
|
+
const rawImage = activity.token?.image ?? null;
|
|
47
|
+
const tokenImage = rawImage ? ipfsToHttp(rawImage) : null;
|
|
48
|
+
const amount = activity.amount && Number(activity.amount) > 1 ? activity.amount : null;
|
|
49
|
+
const shortActor = actor ? actor.length > 10 ? `${actor.slice(0, 6)}\u2026${actor.slice(-4)}` : actor : null;
|
|
50
|
+
const message = ACTIVITY_MESSAGES[activity.type]?.(shortActor) ?? config.label;
|
|
51
|
+
const body = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
52
|
+
/* @__PURE__ */ jsxs("div", { className: "aspect-square relative bg-muted", children: [
|
|
53
|
+
tokenImage ? /* @__PURE__ */ jsx(
|
|
54
|
+
Image,
|
|
55
|
+
{
|
|
56
|
+
src: tokenImage,
|
|
57
|
+
alt: tokenName,
|
|
58
|
+
fill: true,
|
|
59
|
+
sizes: "256px",
|
|
60
|
+
className: "object-cover",
|
|
61
|
+
unoptimized: true
|
|
62
|
+
}
|
|
63
|
+
) : /* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-gradient-to-br from-muted-foreground/10 to-muted-foreground/5", "aria-hidden": true }),
|
|
64
|
+
/* @__PURE__ */ jsxs("span", { className: "absolute top-2.5 left-2.5 inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full text-[11px] font-semibold bg-background/75 backdrop-blur-md border border-border/40", children: [
|
|
65
|
+
/* @__PURE__ */ jsx(Icon, { className: cn("h-3 w-3", config.colorClass), "aria-hidden": true }),
|
|
66
|
+
/* @__PURE__ */ jsx("span", { className: config.colorClass, children: config.label })
|
|
67
|
+
] }),
|
|
68
|
+
amount && /* @__PURE__ */ jsxs("span", { className: "absolute bottom-2.5 right-2.5 px-2 py-0.5 rounded-full text-[10px] font-bold bg-violet-500 text-white", children: [
|
|
69
|
+
"\xD7",
|
|
70
|
+
amount
|
|
71
|
+
] })
|
|
72
|
+
] }),
|
|
73
|
+
/* @__PURE__ */ jsxs("div", { className: "p-4 space-y-1.5", children: [
|
|
74
|
+
/* @__PURE__ */ jsx("p", { className: "text-[15px] font-semibold truncate", children: tokenName }),
|
|
75
|
+
/* @__PURE__ */ jsxs(
|
|
76
|
+
"p",
|
|
77
|
+
{
|
|
78
|
+
className: "text-xs text-muted-foreground truncate",
|
|
79
|
+
title: new Date(activity.timestamp).toLocaleString(),
|
|
80
|
+
children: [
|
|
81
|
+
message,
|
|
82
|
+
" \xB7 ",
|
|
83
|
+
timeAgo(activity.timestamp)
|
|
84
|
+
]
|
|
85
|
+
}
|
|
86
|
+
),
|
|
87
|
+
activity.price?.formatted && /* @__PURE__ */ jsxs("p", { className: "text-sm font-bold tabular-nums flex items-center gap-1.5 pt-0.5", children: [
|
|
88
|
+
activity.price.currency && /* @__PURE__ */ jsx(CurrencyIcon, { symbol: activity.price.currency, size: 13, "aria-hidden": true }),
|
|
89
|
+
formatDisplayPrice(activity.price.formatted)
|
|
90
|
+
] })
|
|
91
|
+
] })
|
|
92
|
+
] });
|
|
93
|
+
const className = "card-base block active:scale-[0.99] transition-all";
|
|
94
|
+
return contract && tokenId ? /* @__PURE__ */ jsx(Link, { href: getAssetHref(contract, tokenId), className, children: body }) : /* @__PURE__ */ jsx("div", { className, children: body });
|
|
95
|
+
}
|
|
96
|
+
export {
|
|
97
|
+
ACTIVITY_MESSAGES,
|
|
98
|
+
ActivityCard,
|
|
99
|
+
ActivityCardSkeleton
|
|
100
|
+
};
|
|
101
|
+
//# sourceMappingURL=activity-card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/activity-card.tsx"],"sourcesContent":["\"use client\";\n\nimport Image from \"next/image\";\nimport Link from \"next/link\";\nimport { ExternalLink } from \"lucide-react\";\nimport { CurrencyIcon } from \"./currency-icon.js\";\nimport { ACTIVITY_TYPE_CONFIG } from \"../data/activity.js\";\nimport { ipfsToHttp } from \"../utils/ipfs.js\";\nimport { timeAgo } from \"../utils/time.js\";\nimport { formatDisplayPrice } from \"../utils/format.js\";\nimport { cn } from \"../utils/cn.js\";\nimport type { ApiActivity } from \"@medialane/sdk\";\n\n/** ui's pinned SDK lags the apps — extend structurally for fields newer SDKs carry. */\ntype ActivityWithEnrichment = ApiActivity & {\n token?: { name: string | null; image: string | null } | null;\n amount?: string;\n};\n\nexport const ACTIVITY_MESSAGES: Record<string, (actor: string | null) => string> = {\n mint: (actor) => actor ? `Minted by ${actor}` : \"Newly minted\",\n listing: (actor) => actor ? `Listed by ${actor}` : \"Listed for sale\",\n sale: (actor) => actor ? `Purchased by ${actor}` : \"Sold\",\n offer: (actor) => actor ? `Offer by ${actor}` : \"Offer placed\",\n transfer: (actor) => actor ? `Transferred by ${actor}` : \"Transferred\",\n cancelled: (actor) => actor ? `Cancelled by ${actor}` : \"Listing cancelled\",\n};\n\nexport function ActivityCardSkeleton() {\n return (\n <div className=\"card-base\">\n <div className=\"aspect-square w-full bg-muted animate-pulse\" />\n <div className=\"p-4 space-y-2\">\n <div className=\"h-4 w-32 bg-muted animate-pulse rounded\" />\n <div className=\"h-3 w-24 bg-muted animate-pulse rounded\" />\n </div>\n </div>\n );\n}\n\nexport interface ActivityCardProps {\n activity: ApiActivity;\n /** Builds the asset link; card is unlinked when the activity has no token ref */\n getAssetHref?: (contract: string, tokenId: string) => string;\n}\n\n/** Card-shaped activity item for horizontal carousels (Discover Community strip).\n * Same data as ActivityRow, presented like a collection/listing card. */\nexport function ActivityCard({\n activity: rawActivity,\n getAssetHref = (c, t) => `/asset/${c}/${t}`,\n}: ActivityCardProps) {\n const activity = rawActivity as ActivityWithEnrichment;\n const config = ACTIVITY_TYPE_CONFIG[activity.type] ?? {\n label: activity.type,\n variant: \"outline\" as const,\n icon: ExternalLink,\n colorClass: \"text-muted-foreground\",\n bgClass: \"bg-muted\",\n };\n const Icon = config.icon;\n\n const contract = activity.nftContract ?? activity.contractAddress ?? null;\n const tokenId = activity.nftTokenId ?? activity.tokenId ?? null;\n const actor =\n activity.offerer ??\n activity.fulfiller ??\n ((activity.type as string) === \"mint\" ? activity.to : activity.from) ??\n null;\n\n const tokenName = activity.token?.name ?? (tokenId ? `#${tokenId}` : \"—\");\n const rawImage = activity.token?.image ?? null;\n const tokenImage = rawImage ? ipfsToHttp(rawImage) : null;\n const amount = activity.amount && Number(activity.amount) > 1 ? activity.amount : null;\n\n const shortActor = actor\n ? actor.length > 10\n ? `${actor.slice(0, 6)}…${actor.slice(-4)}`\n : actor\n : null;\n const message = ACTIVITY_MESSAGES[activity.type]?.(shortActor) ?? config.label;\n\n const body = (\n <>\n <div className=\"aspect-square relative bg-muted\">\n {tokenImage ? (\n <Image\n src={tokenImage}\n alt={tokenName}\n fill\n sizes=\"256px\"\n className=\"object-cover\"\n unoptimized\n />\n ) : (\n <div className=\"absolute inset-0 bg-gradient-to-br from-muted-foreground/10 to-muted-foreground/5\" aria-hidden />\n )}\n {/* Activity type chip — vivid label on glass */}\n <span className=\"absolute top-2.5 left-2.5 inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full text-[11px] font-semibold bg-background/75 backdrop-blur-md border border-border/40\">\n <Icon className={cn(\"h-3 w-3\", config.colorClass)} aria-hidden />\n <span className={config.colorClass}>{config.label}</span>\n </span>\n {amount && (\n <span className=\"absolute bottom-2.5 right-2.5 px-2 py-0.5 rounded-full text-[10px] font-bold bg-violet-500 text-white\">\n ×{amount}\n </span>\n )}\n </div>\n <div className=\"p-4 space-y-1.5\">\n <p className=\"text-[15px] font-semibold truncate\">{tokenName}</p>\n <p\n className=\"text-xs text-muted-foreground truncate\"\n title={new Date(activity.timestamp).toLocaleString()}\n >\n {message} · {timeAgo(activity.timestamp)}\n </p>\n {activity.price?.formatted && (\n <p className=\"text-sm font-bold tabular-nums flex items-center gap-1.5 pt-0.5\">\n {activity.price.currency && <CurrencyIcon symbol={activity.price.currency} size={13} aria-hidden />}\n {formatDisplayPrice(activity.price.formatted)}\n </p>\n )}\n </div>\n </>\n );\n\n const className = \"card-base block active:scale-[0.99] transition-all\";\n\n return contract && tokenId ? (\n <Link href={getAssetHref(contract, tokenId)} className={className}>\n {body}\n </Link>\n ) : (\n <div className={className}>{body}</div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -26,8 +26,43 @@ var import_jsx_runtime = require("react/jsx-runtime");
|
|
|
26
26
|
var import_lucide_react = require("lucide-react");
|
|
27
27
|
var import_motion_primitives = require("./motion-primitives.js");
|
|
28
28
|
var import_listing_card = require("./listing-card.js");
|
|
29
|
-
var
|
|
30
|
-
var
|
|
29
|
+
var import_activity_card = require("./activity-card.js");
|
|
30
|
+
var import_time = require("../utils/time.js");
|
|
31
|
+
var import_cn = require("../utils/cn.js");
|
|
32
|
+
function StripShell({
|
|
33
|
+
icon,
|
|
34
|
+
iconBg,
|
|
35
|
+
title,
|
|
36
|
+
subtitle,
|
|
37
|
+
href,
|
|
38
|
+
linkLabel,
|
|
39
|
+
children
|
|
40
|
+
}) {
|
|
41
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { className: "space-y-4", children: [
|
|
42
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
43
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2.5", children: [
|
|
44
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: (0, import_cn.cn)("h-7 w-7 rounded-lg flex items-center justify-center", iconBg), children: icon }),
|
|
45
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
|
|
46
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", { className: "text-lg sm:text-xl font-semibold leading-none", children: title }),
|
|
47
|
+
subtitle && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-[10px] text-muted-foreground mt-1", children: subtitle })
|
|
48
|
+
] })
|
|
49
|
+
] }),
|
|
50
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
51
|
+
"a",
|
|
52
|
+
{
|
|
53
|
+
href,
|
|
54
|
+
className: "inline-flex items-center gap-1 text-sm text-muted-foreground hover:text-foreground px-3 py-1.5 rounded-md hover:bg-accent transition-colors",
|
|
55
|
+
children: [
|
|
56
|
+
linkLabel,
|
|
57
|
+
" ",
|
|
58
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ArrowRight, { className: "h-3.5 w-3.5" })
|
|
59
|
+
]
|
|
60
|
+
}
|
|
61
|
+
)
|
|
62
|
+
] }),
|
|
63
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "w-full overflow-x-auto scrollbar-hide", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex gap-5 sm:gap-6 snap-x snap-mandatory pb-2", style: { width: "max-content" }, children }) })
|
|
64
|
+
] });
|
|
65
|
+
}
|
|
31
66
|
function DiscoverFeedSection({
|
|
32
67
|
orders,
|
|
33
68
|
isLoading,
|
|
@@ -35,55 +70,48 @@ function DiscoverFeedSection({
|
|
|
35
70
|
activitiesLoading,
|
|
36
71
|
lastUpdated,
|
|
37
72
|
getAssetHref = (c, t) => `/asset/${c}/${t}`,
|
|
38
|
-
getActorHref = (a) => `/creator/${a}`,
|
|
39
|
-
explorerUrl = "https://voyager.online",
|
|
40
73
|
marketplaceHref = "/marketplace",
|
|
41
|
-
activitiesHref = "/activities"
|
|
74
|
+
activitiesHref = "/activities",
|
|
75
|
+
onBuyOrder,
|
|
76
|
+
isOwnOrder
|
|
42
77
|
}) {
|
|
43
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "
|
|
44
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_motion_primitives.FadeIn, { children: /* @__PURE__ */ (0, import_jsx_runtime.
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
"
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
78
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-14 sm:space-y-20", children: [
|
|
79
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_motion_primitives.FadeIn, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
80
|
+
StripShell,
|
|
81
|
+
{
|
|
82
|
+
icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Tag, { className: "h-3.5 w-3.5 text-white" }),
|
|
83
|
+
iconBg: "bg-gradient-to-br from-rose-500 to-pink-600 shadow-md shadow-rose-500/20",
|
|
84
|
+
title: "Activity",
|
|
85
|
+
href: marketplaceHref,
|
|
86
|
+
linkLabel: "View all",
|
|
87
|
+
children: isLoading ? Array.from({ length: 8 }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "w-72 snap-start shrink-0", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_listing_card.ListingCardSkeleton, {}) }, i)) : orders.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm text-muted-foreground py-4", children: "No active listings yet." }) : orders.map((order) => {
|
|
88
|
+
const own = isOwnOrder?.(order) ?? false;
|
|
89
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "w-72 snap-start shrink-0", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
90
|
+
import_listing_card.ListingCard,
|
|
91
|
+
{
|
|
92
|
+
order,
|
|
93
|
+
onBuy: onBuyOrder && !own ? () => onBuyOrder(order) : void 0
|
|
94
|
+
}
|
|
95
|
+
) }, order.orderHash);
|
|
96
|
+
})
|
|
97
|
+
}
|
|
98
|
+
) }),
|
|
64
99
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_motion_primitives.FadeIn, { delay: 0.08, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
65
|
-
|
|
100
|
+
StripShell,
|
|
66
101
|
{
|
|
102
|
+
icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Activity, { className: "h-3.5 w-3.5 text-white" }),
|
|
103
|
+
iconBg: "bg-gradient-to-br from-indigo-500 to-blue-600 shadow-md shadow-indigo-500/20",
|
|
67
104
|
title: "Community",
|
|
105
|
+
subtitle: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "flex items-center gap-1", children: [
|
|
106
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.RefreshCw, { className: "h-2.5 w-2.5" }),
|
|
107
|
+
"Updated ",
|
|
108
|
+
(0, import_time.timeAgo)(lastUpdated)
|
|
109
|
+
] }),
|
|
68
110
|
href: activitiesHref,
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
isLoading: activitiesLoading,
|
|
72
|
-
children: activities.map((act, i) => {
|
|
111
|
+
linkLabel: "Activities",
|
|
112
|
+
children: activitiesLoading ? Array.from({ length: 8 }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "w-56 sm:w-64 snap-start shrink-0", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_activity_card.ActivityCardSkeleton, {}) }, i)) : activities.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm text-muted-foreground py-4", children: "No activity yet. Be the first to trade on Medialane!" }) : activities.map((act, i) => {
|
|
73
113
|
const key = act.txHash ? `${act.txHash}-${act.type}-${act.nftTokenId ?? ""}` : `activity-${i}`;
|
|
74
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
75
|
-
import_activity_row.ActivityRow,
|
|
76
|
-
{
|
|
77
|
-
activity: act,
|
|
78
|
-
showActor: true,
|
|
79
|
-
showExplorer: false,
|
|
80
|
-
compact: true,
|
|
81
|
-
getAssetHref,
|
|
82
|
-
getActorHref,
|
|
83
|
-
explorerUrl
|
|
84
|
-
},
|
|
85
|
-
key
|
|
86
|
-
);
|
|
114
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "w-56 sm:w-64 snap-start shrink-0", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_activity_card.ActivityCard, { activity: act, getAssetHref }) }, key);
|
|
87
115
|
})
|
|
88
116
|
}
|
|
89
117
|
) })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/discover-feed-section.tsx"],"sourcesContent":["\"use client\";\n\nimport { Tag } from \"lucide-react\";\nimport { FadeIn } from \"./motion-primitives.js\";\nimport { ListingCard, ListingCardSkeleton } from \"./listing-card.js\";\nimport {
|
|
1
|
+
{"version":3,"sources":["../../src/components/discover-feed-section.tsx"],"sourcesContent":["\"use client\";\n\nimport { Tag, Activity, RefreshCw, ArrowRight } from \"lucide-react\";\nimport { FadeIn } from \"./motion-primitives.js\";\nimport { ListingCard, ListingCardSkeleton } from \"./listing-card.js\";\nimport { ActivityCard, ActivityCardSkeleton } from \"./activity-card.js\";\nimport { timeAgo } from \"../utils/time.js\";\nimport { cn } from \"../utils/cn.js\";\nimport type { ApiOrder, ApiActivity } from \"@medialane/sdk\";\n\nexport interface DiscoverFeedSectionProps {\n orders: ApiOrder[];\n isLoading: boolean;\n activities: ApiActivity[];\n activitiesLoading: boolean;\n lastUpdated: string;\n getAssetHref?: (contract: string, tokenId: string) => string;\n getActorHref?: (address: string) => string;\n explorerUrl?: string;\n marketplaceHref?: string;\n activitiesHref?: string;\n /** Optional buy hook — when provided, listing cards show their Buy action */\n onBuyOrder?: (order: ApiOrder) => void;\n /** Hide the buy action for orders the viewer owns */\n isOwnOrder?: (order: ApiOrder) => boolean;\n}\n\n// ── Shared strip shell: icon-badge header + snap-scroll row ─────────────────\nfunction StripShell({\n icon,\n iconBg,\n title,\n subtitle,\n href,\n linkLabel,\n children,\n}: {\n icon: React.ReactNode;\n iconBg: string;\n title: string;\n subtitle?: React.ReactNode;\n href: string;\n linkLabel: string;\n children: React.ReactNode;\n}) {\n return (\n <section className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2.5\">\n <div className={cn(\"h-7 w-7 rounded-lg flex items-center justify-center\", iconBg)}>\n {icon}\n </div>\n <div>\n <h2 className=\"text-lg sm:text-xl font-semibold leading-none\">{title}</h2>\n {subtitle && <p className=\"text-[10px] text-muted-foreground mt-1\">{subtitle}</p>}\n </div>\n </div>\n <a\n href={href}\n className=\"inline-flex items-center gap-1 text-sm text-muted-foreground hover:text-foreground px-3 py-1.5 rounded-md hover:bg-accent transition-colors\"\n >\n {linkLabel} <ArrowRight className=\"h-3.5 w-3.5\" />\n </a>\n </div>\n\n <div className=\"w-full overflow-x-auto scrollbar-hide\">\n <div className=\"flex gap-5 sm:gap-6 snap-x snap-mandatory pb-2\" style={{ width: \"max-content\" }}>\n {children}\n </div>\n </div>\n </section>\n );\n}\n\n/** Discover feed — Markets activity + Community as horizontal carousels,\n * matching the Collections/Creators explore-by-scrolling model. */\nexport function DiscoverFeedSection({\n orders,\n isLoading,\n activities,\n activitiesLoading,\n lastUpdated,\n getAssetHref = (c, t) => `/asset/${c}/${t}`,\n marketplaceHref = \"/marketplace\",\n activitiesHref = \"/activities\",\n onBuyOrder,\n isOwnOrder,\n}: DiscoverFeedSectionProps) {\n return (\n <div className=\"space-y-14 sm:space-y-20\">\n {/* Markets — recent listings carousel */}\n <FadeIn>\n <StripShell\n icon={<Tag className=\"h-3.5 w-3.5 text-white\" />}\n iconBg=\"bg-gradient-to-br from-rose-500 to-pink-600 shadow-md shadow-rose-500/20\"\n title=\"Activity\"\n href={marketplaceHref}\n linkLabel=\"View all\"\n >\n {isLoading\n ? Array.from({ length: 8 }).map((_, i) => (\n <div key={i} className=\"w-72 snap-start shrink-0\">\n <ListingCardSkeleton />\n </div>\n ))\n : orders.length === 0\n ? (\n <p className=\"text-sm text-muted-foreground py-4\">No active listings yet.</p>\n )\n : orders.map((order) => {\n const own = isOwnOrder?.(order) ?? false;\n return (\n <div key={order.orderHash} className=\"w-72 snap-start shrink-0\">\n <ListingCard\n order={order}\n onBuy={onBuyOrder && !own ? () => onBuyOrder(order) : undefined}\n />\n </div>\n );\n })}\n </StripShell>\n </FadeIn>\n\n {/* Community — recent on-chain activity carousel */}\n <FadeIn delay={0.08}>\n <StripShell\n icon={<Activity className=\"h-3.5 w-3.5 text-white\" />}\n iconBg=\"bg-gradient-to-br from-indigo-500 to-blue-600 shadow-md shadow-indigo-500/20\"\n title=\"Community\"\n subtitle={\n <span className=\"flex items-center gap-1\">\n <RefreshCw className=\"h-2.5 w-2.5\" />\n Updated {timeAgo(lastUpdated)}\n </span>\n }\n href={activitiesHref}\n linkLabel=\"Activities\"\n >\n {activitiesLoading\n ? Array.from({ length: 8 }).map((_, i) => (\n <div key={i} className=\"w-56 sm:w-64 snap-start shrink-0\">\n <ActivityCardSkeleton />\n </div>\n ))\n : activities.length === 0\n ? (\n <p className=\"text-sm text-muted-foreground py-4\">\n No activity yet. Be the first to trade on Medialane!\n </p>\n )\n : activities.map((act, i) => {\n const key = act.txHash\n ? `${act.txHash}-${act.type}-${act.nftTokenId ?? \"\"}`\n : `activity-${i}`;\n return (\n <div key={key} className=\"w-56 sm:w-64 snap-start shrink-0\">\n <ActivityCard activity={act} getAssetHref={getAssetHref} />\n </div>\n );\n })}\n </StripShell>\n </FadeIn>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -12,7 +12,13 @@ interface DiscoverFeedSectionProps {
|
|
|
12
12
|
explorerUrl?: string;
|
|
13
13
|
marketplaceHref?: string;
|
|
14
14
|
activitiesHref?: string;
|
|
15
|
+
/** Optional buy hook — when provided, listing cards show their Buy action */
|
|
16
|
+
onBuyOrder?: (order: ApiOrder) => void;
|
|
17
|
+
/** Hide the buy action for orders the viewer owns */
|
|
18
|
+
isOwnOrder?: (order: ApiOrder) => boolean;
|
|
15
19
|
}
|
|
16
|
-
|
|
20
|
+
/** Discover feed — Markets activity + Community as horizontal carousels,
|
|
21
|
+
* matching the Collections/Creators explore-by-scrolling model. */
|
|
22
|
+
declare function DiscoverFeedSection({ orders, isLoading, activities, activitiesLoading, lastUpdated, getAssetHref, marketplaceHref, activitiesHref, onBuyOrder, isOwnOrder, }: DiscoverFeedSectionProps): react_jsx_runtime.JSX.Element;
|
|
17
23
|
|
|
18
24
|
export { DiscoverFeedSection, type DiscoverFeedSectionProps };
|
|
@@ -12,7 +12,13 @@ interface DiscoverFeedSectionProps {
|
|
|
12
12
|
explorerUrl?: string;
|
|
13
13
|
marketplaceHref?: string;
|
|
14
14
|
activitiesHref?: string;
|
|
15
|
+
/** Optional buy hook — when provided, listing cards show their Buy action */
|
|
16
|
+
onBuyOrder?: (order: ApiOrder) => void;
|
|
17
|
+
/** Hide the buy action for orders the viewer owns */
|
|
18
|
+
isOwnOrder?: (order: ApiOrder) => boolean;
|
|
15
19
|
}
|
|
16
|
-
|
|
20
|
+
/** Discover feed — Markets activity + Community as horizontal carousels,
|
|
21
|
+
* matching the Collections/Creators explore-by-scrolling model. */
|
|
22
|
+
declare function DiscoverFeedSection({ orders, isLoading, activities, activitiesLoading, lastUpdated, getAssetHref, marketplaceHref, activitiesHref, onBuyOrder, isOwnOrder, }: DiscoverFeedSectionProps): react_jsx_runtime.JSX.Element;
|
|
17
23
|
|
|
18
24
|
export { DiscoverFeedSection, type DiscoverFeedSectionProps };
|
|
@@ -1,10 +1,45 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { Tag } from "lucide-react";
|
|
3
|
+
import { Tag, Activity, RefreshCw, ArrowRight } from "lucide-react";
|
|
4
4
|
import { FadeIn } from "./motion-primitives.js";
|
|
5
5
|
import { ListingCard, ListingCardSkeleton } from "./listing-card.js";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
6
|
+
import { ActivityCard, ActivityCardSkeleton } from "./activity-card.js";
|
|
7
|
+
import { timeAgo } from "../utils/time.js";
|
|
8
|
+
import { cn } from "../utils/cn.js";
|
|
9
|
+
function StripShell({
|
|
10
|
+
icon,
|
|
11
|
+
iconBg,
|
|
12
|
+
title,
|
|
13
|
+
subtitle,
|
|
14
|
+
href,
|
|
15
|
+
linkLabel,
|
|
16
|
+
children
|
|
17
|
+
}) {
|
|
18
|
+
return /* @__PURE__ */ jsxs("section", { className: "space-y-4", children: [
|
|
19
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
|
|
20
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2.5", children: [
|
|
21
|
+
/* @__PURE__ */ jsx("div", { className: cn("h-7 w-7 rounded-lg flex items-center justify-center", iconBg), children: icon }),
|
|
22
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
23
|
+
/* @__PURE__ */ jsx("h2", { className: "text-lg sm:text-xl font-semibold leading-none", children: title }),
|
|
24
|
+
subtitle && /* @__PURE__ */ jsx("p", { className: "text-[10px] text-muted-foreground mt-1", children: subtitle })
|
|
25
|
+
] })
|
|
26
|
+
] }),
|
|
27
|
+
/* @__PURE__ */ jsxs(
|
|
28
|
+
"a",
|
|
29
|
+
{
|
|
30
|
+
href,
|
|
31
|
+
className: "inline-flex items-center gap-1 text-sm text-muted-foreground hover:text-foreground px-3 py-1.5 rounded-md hover:bg-accent transition-colors",
|
|
32
|
+
children: [
|
|
33
|
+
linkLabel,
|
|
34
|
+
" ",
|
|
35
|
+
/* @__PURE__ */ jsx(ArrowRight, { className: "h-3.5 w-3.5" })
|
|
36
|
+
]
|
|
37
|
+
}
|
|
38
|
+
)
|
|
39
|
+
] }),
|
|
40
|
+
/* @__PURE__ */ jsx("div", { className: "w-full overflow-x-auto scrollbar-hide", children: /* @__PURE__ */ jsx("div", { className: "flex gap-5 sm:gap-6 snap-x snap-mandatory pb-2", style: { width: "max-content" }, children }) })
|
|
41
|
+
] });
|
|
42
|
+
}
|
|
8
43
|
function DiscoverFeedSection({
|
|
9
44
|
orders,
|
|
10
45
|
isLoading,
|
|
@@ -12,55 +47,48 @@ function DiscoverFeedSection({
|
|
|
12
47
|
activitiesLoading,
|
|
13
48
|
lastUpdated,
|
|
14
49
|
getAssetHref = (c, t) => `/asset/${c}/${t}`,
|
|
15
|
-
getActorHref = (a) => `/creator/${a}`,
|
|
16
|
-
explorerUrl = "https://voyager.online",
|
|
17
50
|
marketplaceHref = "/marketplace",
|
|
18
|
-
activitiesHref = "/activities"
|
|
51
|
+
activitiesHref = "/activities",
|
|
52
|
+
onBuyOrder,
|
|
53
|
+
isOwnOrder
|
|
19
54
|
}) {
|
|
20
|
-
return /* @__PURE__ */ jsxs("div", { className: "
|
|
21
|
-
/* @__PURE__ */ jsx(FadeIn, { children: /* @__PURE__ */
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
"
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
55
|
+
return /* @__PURE__ */ jsxs("div", { className: "space-y-14 sm:space-y-20", children: [
|
|
56
|
+
/* @__PURE__ */ jsx(FadeIn, { children: /* @__PURE__ */ jsx(
|
|
57
|
+
StripShell,
|
|
58
|
+
{
|
|
59
|
+
icon: /* @__PURE__ */ jsx(Tag, { className: "h-3.5 w-3.5 text-white" }),
|
|
60
|
+
iconBg: "bg-gradient-to-br from-rose-500 to-pink-600 shadow-md shadow-rose-500/20",
|
|
61
|
+
title: "Activity",
|
|
62
|
+
href: marketplaceHref,
|
|
63
|
+
linkLabel: "View all",
|
|
64
|
+
children: isLoading ? Array.from({ length: 8 }).map((_, i) => /* @__PURE__ */ jsx("div", { className: "w-72 snap-start shrink-0", children: /* @__PURE__ */ jsx(ListingCardSkeleton, {}) }, i)) : orders.length === 0 ? /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground py-4", children: "No active listings yet." }) : orders.map((order) => {
|
|
65
|
+
const own = isOwnOrder?.(order) ?? false;
|
|
66
|
+
return /* @__PURE__ */ jsx("div", { className: "w-72 snap-start shrink-0", children: /* @__PURE__ */ jsx(
|
|
67
|
+
ListingCard,
|
|
68
|
+
{
|
|
69
|
+
order,
|
|
70
|
+
onBuy: onBuyOrder && !own ? () => onBuyOrder(order) : void 0
|
|
71
|
+
}
|
|
72
|
+
) }, order.orderHash);
|
|
73
|
+
})
|
|
74
|
+
}
|
|
75
|
+
) }),
|
|
41
76
|
/* @__PURE__ */ jsx(FadeIn, { delay: 0.08, children: /* @__PURE__ */ jsx(
|
|
42
|
-
|
|
77
|
+
StripShell,
|
|
43
78
|
{
|
|
79
|
+
icon: /* @__PURE__ */ jsx(Activity, { className: "h-3.5 w-3.5 text-white" }),
|
|
80
|
+
iconBg: "bg-gradient-to-br from-indigo-500 to-blue-600 shadow-md shadow-indigo-500/20",
|
|
44
81
|
title: "Community",
|
|
82
|
+
subtitle: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1", children: [
|
|
83
|
+
/* @__PURE__ */ jsx(RefreshCw, { className: "h-2.5 w-2.5" }),
|
|
84
|
+
"Updated ",
|
|
85
|
+
timeAgo(lastUpdated)
|
|
86
|
+
] }),
|
|
45
87
|
href: activitiesHref,
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
isLoading: activitiesLoading,
|
|
49
|
-
children: activities.map((act, i) => {
|
|
88
|
+
linkLabel: "Activities",
|
|
89
|
+
children: activitiesLoading ? Array.from({ length: 8 }).map((_, i) => /* @__PURE__ */ jsx("div", { className: "w-56 sm:w-64 snap-start shrink-0", children: /* @__PURE__ */ jsx(ActivityCardSkeleton, {}) }, i)) : activities.length === 0 ? /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground py-4", children: "No activity yet. Be the first to trade on Medialane!" }) : activities.map((act, i) => {
|
|
50
90
|
const key = act.txHash ? `${act.txHash}-${act.type}-${act.nftTokenId ?? ""}` : `activity-${i}`;
|
|
51
|
-
return /* @__PURE__ */ jsx(
|
|
52
|
-
ActivityRow,
|
|
53
|
-
{
|
|
54
|
-
activity: act,
|
|
55
|
-
showActor: true,
|
|
56
|
-
showExplorer: false,
|
|
57
|
-
compact: true,
|
|
58
|
-
getAssetHref,
|
|
59
|
-
getActorHref,
|
|
60
|
-
explorerUrl
|
|
61
|
-
},
|
|
62
|
-
key
|
|
63
|
-
);
|
|
91
|
+
return /* @__PURE__ */ jsx("div", { className: "w-56 sm:w-64 snap-start shrink-0", children: /* @__PURE__ */ jsx(ActivityCard, { activity: act, getAssetHref }) }, key);
|
|
64
92
|
})
|
|
65
93
|
}
|
|
66
94
|
) })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/discover-feed-section.tsx"],"sourcesContent":["\"use client\";\n\nimport { Tag } from \"lucide-react\";\nimport { FadeIn } from \"./motion-primitives.js\";\nimport { ListingCard, ListingCardSkeleton } from \"./listing-card.js\";\nimport {
|
|
1
|
+
{"version":3,"sources":["../../src/components/discover-feed-section.tsx"],"sourcesContent":["\"use client\";\n\nimport { Tag, Activity, RefreshCw, ArrowRight } from \"lucide-react\";\nimport { FadeIn } from \"./motion-primitives.js\";\nimport { ListingCard, ListingCardSkeleton } from \"./listing-card.js\";\nimport { ActivityCard, ActivityCardSkeleton } from \"./activity-card.js\";\nimport { timeAgo } from \"../utils/time.js\";\nimport { cn } from \"../utils/cn.js\";\nimport type { ApiOrder, ApiActivity } from \"@medialane/sdk\";\n\nexport interface DiscoverFeedSectionProps {\n orders: ApiOrder[];\n isLoading: boolean;\n activities: ApiActivity[];\n activitiesLoading: boolean;\n lastUpdated: string;\n getAssetHref?: (contract: string, tokenId: string) => string;\n getActorHref?: (address: string) => string;\n explorerUrl?: string;\n marketplaceHref?: string;\n activitiesHref?: string;\n /** Optional buy hook — when provided, listing cards show their Buy action */\n onBuyOrder?: (order: ApiOrder) => void;\n /** Hide the buy action for orders the viewer owns */\n isOwnOrder?: (order: ApiOrder) => boolean;\n}\n\n// ── Shared strip shell: icon-badge header + snap-scroll row ─────────────────\nfunction StripShell({\n icon,\n iconBg,\n title,\n subtitle,\n href,\n linkLabel,\n children,\n}: {\n icon: React.ReactNode;\n iconBg: string;\n title: string;\n subtitle?: React.ReactNode;\n href: string;\n linkLabel: string;\n children: React.ReactNode;\n}) {\n return (\n <section className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2.5\">\n <div className={cn(\"h-7 w-7 rounded-lg flex items-center justify-center\", iconBg)}>\n {icon}\n </div>\n <div>\n <h2 className=\"text-lg sm:text-xl font-semibold leading-none\">{title}</h2>\n {subtitle && <p className=\"text-[10px] text-muted-foreground mt-1\">{subtitle}</p>}\n </div>\n </div>\n <a\n href={href}\n className=\"inline-flex items-center gap-1 text-sm text-muted-foreground hover:text-foreground px-3 py-1.5 rounded-md hover:bg-accent transition-colors\"\n >\n {linkLabel} <ArrowRight className=\"h-3.5 w-3.5\" />\n </a>\n </div>\n\n <div className=\"w-full overflow-x-auto scrollbar-hide\">\n <div className=\"flex gap-5 sm:gap-6 snap-x snap-mandatory pb-2\" style={{ width: \"max-content\" }}>\n {children}\n </div>\n </div>\n </section>\n );\n}\n\n/** Discover feed — Markets activity + Community as horizontal carousels,\n * matching the Collections/Creators explore-by-scrolling model. */\nexport function DiscoverFeedSection({\n orders,\n isLoading,\n activities,\n activitiesLoading,\n lastUpdated,\n getAssetHref = (c, t) => `/asset/${c}/${t}`,\n marketplaceHref = \"/marketplace\",\n activitiesHref = \"/activities\",\n onBuyOrder,\n isOwnOrder,\n}: DiscoverFeedSectionProps) {\n return (\n <div className=\"space-y-14 sm:space-y-20\">\n {/* Markets — recent listings carousel */}\n <FadeIn>\n <StripShell\n icon={<Tag className=\"h-3.5 w-3.5 text-white\" />}\n iconBg=\"bg-gradient-to-br from-rose-500 to-pink-600 shadow-md shadow-rose-500/20\"\n title=\"Activity\"\n href={marketplaceHref}\n linkLabel=\"View all\"\n >\n {isLoading\n ? Array.from({ length: 8 }).map((_, i) => (\n <div key={i} className=\"w-72 snap-start shrink-0\">\n <ListingCardSkeleton />\n </div>\n ))\n : orders.length === 0\n ? (\n <p className=\"text-sm text-muted-foreground py-4\">No active listings yet.</p>\n )\n : orders.map((order) => {\n const own = isOwnOrder?.(order) ?? false;\n return (\n <div key={order.orderHash} className=\"w-72 snap-start shrink-0\">\n <ListingCard\n order={order}\n onBuy={onBuyOrder && !own ? () => onBuyOrder(order) : undefined}\n />\n </div>\n );\n })}\n </StripShell>\n </FadeIn>\n\n {/* Community — recent on-chain activity carousel */}\n <FadeIn delay={0.08}>\n <StripShell\n icon={<Activity className=\"h-3.5 w-3.5 text-white\" />}\n iconBg=\"bg-gradient-to-br from-indigo-500 to-blue-600 shadow-md shadow-indigo-500/20\"\n title=\"Community\"\n subtitle={\n <span className=\"flex items-center gap-1\">\n <RefreshCw className=\"h-2.5 w-2.5\" />\n Updated {timeAgo(lastUpdated)}\n </span>\n }\n href={activitiesHref}\n linkLabel=\"Activities\"\n >\n {activitiesLoading\n ? Array.from({ length: 8 }).map((_, i) => (\n <div key={i} className=\"w-56 sm:w-64 snap-start shrink-0\">\n <ActivityCardSkeleton />\n </div>\n ))\n : activities.length === 0\n ? (\n <p className=\"text-sm text-muted-foreground py-4\">\n No activity yet. Be the first to trade on Medialane!\n </p>\n )\n : activities.map((act, i) => {\n const key = act.txHash\n ? `${act.txHash}-${act.type}-${act.nftTokenId ?? \"\"}`\n : `activity-${i}`;\n return (\n <div key={key} className=\"w-56 sm:w-64 snap-start shrink-0\">\n <ActivityCard activity={act} getAssetHref={getAssetHref} />\n </div>\n );\n })}\n </StripShell>\n </FadeIn>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.cjs
CHANGED
|
@@ -18,7 +18,10 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
19
|
var index_exports = {};
|
|
20
20
|
__export(index_exports, {
|
|
21
|
+
ACTIVITY_MESSAGES: () => import_activity_card.ACTIVITY_MESSAGES,
|
|
21
22
|
ACTIVITY_TYPE_CONFIG: () => import_activity.ACTIVITY_TYPE_CONFIG,
|
|
23
|
+
ActivityCard: () => import_activity_card.ActivityCard,
|
|
24
|
+
ActivityCardSkeleton: () => import_activity_card.ActivityCardSkeleton,
|
|
22
25
|
ActivityFeedShell: () => import_activity_feed_shell.ActivityFeedShell,
|
|
23
26
|
ActivityRow: () => import_activity_row.ActivityRow,
|
|
24
27
|
ActivityTicker: () => import_activity_ticker.ActivityTicker,
|
|
@@ -105,6 +108,7 @@ var import_featured_carousel = require("./components/featured-carousel.js");
|
|
|
105
108
|
var import_discover_collections_strip = require("./components/discover-collections-strip.js");
|
|
106
109
|
var import_discover_creators_strip = require("./components/discover-creators-strip.js");
|
|
107
110
|
var import_discover_feed_section = require("./components/discover-feed-section.js");
|
|
111
|
+
var import_activity_card = require("./components/activity-card.js");
|
|
108
112
|
var import_launchpad_services = require("./components/launchpad-services.js");
|
|
109
113
|
var import_launchpad_services2 = require("./data/launchpad-services.js");
|
|
110
114
|
var import_nav_command_menu = require("./components/nav-command-menu.js");
|
|
@@ -112,7 +116,10 @@ var import_portfolio_subnav = require("./components/portfolio-subnav.js");
|
|
|
112
116
|
var import_portfolio_counts = require("./utils/portfolio-counts.js");
|
|
113
117
|
// Annotate the CommonJS export names for ESM import in node:
|
|
114
118
|
0 && (module.exports = {
|
|
119
|
+
ACTIVITY_MESSAGES,
|
|
115
120
|
ACTIVITY_TYPE_CONFIG,
|
|
121
|
+
ActivityCard,
|
|
122
|
+
ActivityCardSkeleton,
|
|
116
123
|
ActivityFeedShell,
|
|
117
124
|
ActivityRow,
|
|
118
125
|
ActivityTicker,
|
package/dist/index.cjs.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\";\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 { 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\n// ── v0.3 additions ────────────────────────────────────────────────────────────\nexport { timeAgo } 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\";\n\n// ── Launchpad (grouped sections — single page-UI source since 0.8.0) ─────────\nexport { LaunchpadGroupedSections, LaunchpadServiceCard, SERVICE_HUES } from \"./components/launchpad-services.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;AACA,gBAAmB;AACnB,oBAAmC;AACnC,qBAA+B;AAC/B,kBAA2B;AAG3B,sBAA+C;AAE/C,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;AAI7C,kBAAwB;AACxB,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;
|
|
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\";\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 { 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\n// ── v0.3 additions ────────────────────────────────────────────────────────────\nexport { timeAgo } 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 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;AACA,gBAAmB;AACnB,oBAAmC;AACnC,qBAA+B;AAC/B,kBAA2B;AAG3B,sBAA+C;AAE/C,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;AAI7C,kBAAwB;AACxB,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;AAE7E,IAAAA,6BAAwE;AAIxE,8BAAkD;AAIlD,8BAAgC;AAOhC,8BAAsC;","names":["import_launchpad_services"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -28,6 +28,7 @@ export { FeaturedCarousel, FeaturedCarouselProps, FeaturedCarouselSkeleton } fro
|
|
|
28
28
|
export { DiscoverCollectionsStrip, DiscoverCollectionsStripProps } from './components/discover-collections-strip.cjs';
|
|
29
29
|
export { DiscoverCreatorsStrip, DiscoverCreatorsStripProps } from './components/discover-creators-strip.cjs';
|
|
30
30
|
export { DiscoverFeedSection, DiscoverFeedSectionProps } from './components/discover-feed-section.cjs';
|
|
31
|
+
export { ACTIVITY_MESSAGES, ActivityCard, ActivityCardProps, ActivityCardSkeleton } from './components/activity-card.cjs';
|
|
31
32
|
export { LaunchpadGroupedSections, LaunchpadGroupedSectionsProps, LaunchpadServiceCard, LaunchpadServiceCardProps, SERVICE_HUES, ServiceOverride, ServiceOverrides } from './components/launchpad-services.cjs';
|
|
32
33
|
export { LAUNCHPAD_SERVICE_DEFINITIONS, LAUNCHPAD_SERVICE_GROUPS, ServiceCategory, ServiceDefinition, ServiceGroup, ServiceGroupDefinition, ServiceStatus } from './data/launchpad-services.cjs';
|
|
33
34
|
export { NavCommand, NavCommandGroup, NavCommandMenu, NavCommandMenuProps, useNavCommandMenu } from './components/nav-command-menu.cjs';
|
package/dist/index.d.ts
CHANGED
|
@@ -28,6 +28,7 @@ export { FeaturedCarousel, FeaturedCarouselProps, FeaturedCarouselSkeleton } fro
|
|
|
28
28
|
export { DiscoverCollectionsStrip, DiscoverCollectionsStripProps } from './components/discover-collections-strip.js';
|
|
29
29
|
export { DiscoverCreatorsStrip, DiscoverCreatorsStripProps } from './components/discover-creators-strip.js';
|
|
30
30
|
export { DiscoverFeedSection, DiscoverFeedSectionProps } from './components/discover-feed-section.js';
|
|
31
|
+
export { ACTIVITY_MESSAGES, ActivityCard, ActivityCardProps, ActivityCardSkeleton } from './components/activity-card.js';
|
|
31
32
|
export { LaunchpadGroupedSections, LaunchpadGroupedSectionsProps, LaunchpadServiceCard, LaunchpadServiceCardProps, SERVICE_HUES, ServiceOverride, ServiceOverrides } from './components/launchpad-services.js';
|
|
32
33
|
export { LAUNCHPAD_SERVICE_DEFINITIONS, LAUNCHPAD_SERVICE_GROUPS, ServiceCategory, ServiceDefinition, ServiceGroup, ServiceGroupDefinition, ServiceStatus } from './data/launchpad-services.js';
|
|
33
34
|
export { NavCommand, NavCommandGroup, NavCommandMenu, NavCommandMenuProps, useNavCommandMenu } from './components/nav-command-menu.js';
|
package/dist/index.js
CHANGED
|
@@ -28,13 +28,17 @@ import { FeaturedCarousel, FeaturedCarouselSkeleton } from "./components/feature
|
|
|
28
28
|
import { DiscoverCollectionsStrip } from "./components/discover-collections-strip.js";
|
|
29
29
|
import { DiscoverCreatorsStrip } from "./components/discover-creators-strip.js";
|
|
30
30
|
import { DiscoverFeedSection } from "./components/discover-feed-section.js";
|
|
31
|
+
import { ActivityCard, ActivityCardSkeleton, ACTIVITY_MESSAGES } from "./components/activity-card.js";
|
|
31
32
|
import { LaunchpadGroupedSections, LaunchpadServiceCard, SERVICE_HUES } from "./components/launchpad-services.js";
|
|
32
33
|
import { LAUNCHPAD_SERVICE_DEFINITIONS, LAUNCHPAD_SERVICE_GROUPS } from "./data/launchpad-services.js";
|
|
33
34
|
import { NavCommandMenu, useNavCommandMenu } from "./components/nav-command-menu.js";
|
|
34
35
|
import { PortfolioSubnav } from "./components/portfolio-subnav.js";
|
|
35
36
|
import { derivePortfolioCounts } from "./utils/portfolio-counts.js";
|
|
36
37
|
export {
|
|
38
|
+
ACTIVITY_MESSAGES,
|
|
37
39
|
ACTIVITY_TYPE_CONFIG,
|
|
40
|
+
ActivityCard,
|
|
41
|
+
ActivityCardSkeleton,
|
|
38
42
|
ActivityFeedShell,
|
|
39
43
|
ActivityRow,
|
|
40
44
|
ActivityTicker,
|
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\";\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 { 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\n// ── v0.3 additions ────────────────────────────────────────────────────────────\nexport { timeAgo } 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\";\n\n// ── Launchpad (grouped sections — single page-UI source since 0.8.0) ─────────\nexport { LaunchpadGroupedSections, LaunchpadServiceCard, SERVICE_HUES } from \"./components/launchpad-services.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;AAG3B,SAAS,cAAc,wBAAwB;AAE/C,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;AAI7C,SAAS,eAAe;AACxB,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;
|
|
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\";\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 { 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\n// ── v0.3 additions ────────────────────────────────────────────────────────────\nexport { timeAgo } 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 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;AAG3B,SAAS,cAAc,wBAAwB;AAE/C,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;AAI7C,SAAS,eAAe;AACxB,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;AAE7E,SAAS,+BAA+B,gCAAgC;AAIxE,SAAS,gBAAgB,yBAAyB;AAIlD,SAAS,uBAAuB;AAOhC,SAAS,6BAA6B;","names":[]}
|