@medialane/ui 0.1.6 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/collection-card.cjs +124 -0
- package/dist/components/collection-card.cjs.map +1 -0
- package/dist/components/collection-card.d.cts +13 -0
- package/dist/components/collection-card.d.ts +13 -0
- package/dist/components/collection-card.js +89 -0
- package/dist/components/collection-card.js.map +1 -0
- package/dist/components/motion-primitives.cjs +126 -0
- package/dist/components/motion-primitives.cjs.map +1 -0
- package/dist/components/motion-primitives.d.cts +36 -0
- package/dist/components/motion-primitives.d.ts +36 -0
- package/dist/components/motion-primitives.js +96 -0
- package/dist/components/motion-primitives.js.map +1 -0
- package/dist/components/scroll-section.cjs +72 -0
- package/dist/components/scroll-section.cjs.map +1 -0
- package/dist/components/scroll-section.d.cts +18 -0
- package/dist/components/scroll-section.d.ts +18 -0
- package/dist/components/scroll-section.js +38 -0
- package/dist/components/scroll-section.js.map +1 -0
- package/dist/components/share-button.cjs +86 -0
- package/dist/components/share-button.cjs.map +1 -0
- package/dist/components/share-button.d.cts +12 -0
- package/dist/components/share-button.d.ts +12 -0
- package/dist/components/share-button.js +62 -0
- package/dist/components/share-button.js.map +1 -0
- package/dist/components/token-card.cjs +281 -0
- package/dist/components/token-card.cjs.map +1 -0
- package/dist/components/token-card.d.cts +31 -0
- package/dist/components/token-card.d.ts +31 -0
- package/dist/components/token-card.js +256 -0
- package/dist/components/token-card.js.map +1 -0
- package/dist/index.cjs +31 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -1
- package/package.json +15 -9
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/token-card.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport Link from \"next/link\";\nimport Image from \"next/image\";\nimport {\n ShoppingCart, Tag, ArrowRightLeft, X, Loader2, HandCoins,\n Check, ArrowUpRight, Zap,\n} 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\";\nimport { MotionCard } from \"./motion-primitives.js\";\nimport type { ApiToken } from \"@medialane/sdk\";\n\nexport type RarityTier = \"legendary\" | \"epic\" | \"rare\" | \"uncommon\" | \"common\";\n\nconst RARITY_STYLE: Record<RarityTier, { label: string; className: string } | null> = {\n legendary: { label: \"Legendary\", className: \"bg-yellow-400/90 text-yellow-900\" },\n epic: { label: \"Epic\", className: \"bg-purple-500/85 text-white\" },\n rare: { label: \"Rare\", className: \"bg-blue-500/85 text-white\" },\n uncommon: { label: \"Uncommon\", className: \"bg-emerald-500/85 text-white\" },\n common: null,\n};\n\nconst BTN_BASE = \"h-8 rounded-[11px] flex items-center justify-center gap-1.5 text-xs font-semibold transition-all active:scale-[0.98] shadow-none border-0\";\nconst BTN_SOLID = cn(BTN_BASE, \"text-white hover:brightness-110\");\nconst BTN_OUTLINE = cn(BTN_BASE, \"border border-border/60 text-foreground hover:bg-muted/60\");\n\nexport interface TokenCardProps {\n token: ApiToken;\n /** Whether the current user owns this token. Default: false */\n isOwner?: boolean;\n /** Whether this token's listing is already in the cart. Default: false */\n inCart?: boolean;\n /** Show the Buy button for listed tokens. Default: true */\n showBuyButton?: boolean;\n /** Optional rarity label shown as an overlay badge */\n rarityTier?: RarityTier;\n className?: string;\n /** Callbacks — omit any to hide that button */\n onBuy?: (token: ApiToken) => void;\n onCart?: (token: ApiToken) => void;\n onOffer?: (token: ApiToken) => void;\n onList?: (token: ApiToken) => void;\n onCancel?: (token: ApiToken) => void;\n onTransfer?: (token: ApiToken) => void;\n onRemix?: (token: ApiToken) => void;\n onReport?: (token: ApiToken) => void;\n /** Slot for a DropdownMenu trigger — rendered after primary buttons */\n overflowMenu?: React.ReactNode;\n}\n\nexport function TokenCard({\n token,\n isOwner = false,\n inCart = false,\n showBuyButton = true,\n rarityTier,\n className,\n onBuy,\n onCart,\n onOffer,\n onList,\n onCancel,\n onTransfer,\n overflowMenu,\n}: TokenCardProps) {\n const [imgError, setImgError] = useState(false);\n\n const name = token.metadata?.name || `Token #${token.tokenId}`;\n const image = ipfsToHttp(token.metadata?.image);\n const activeOrder = token.activeOrders?.[0];\n const assetHref = `/asset/${token.contractAddress}/${token.tokenId}`;\n\n const renderActions = () => {\n // Non-owner + listed + showBuyButton\n if (!isOwner && activeOrder && showBuyButton) {\n return (\n <>\n {onBuy && (\n <button\n className={cn(BTN_SOLID, \"flex-1 bg-brand-purple\")}\n onClick={(e) => { e.preventDefault(); e.stopPropagation(); onBuy(token); }}\n >\n <Zap className=\"h-3.5 w-3.5 shrink-0\" />\n Buy\n </button>\n )}\n {onCart && (\n <button\n className={cn(\n BTN_OUTLINE, \"w-8 shrink-0\",\n inCart && \"border-brand-orange/50 bg-brand-orange/10 text-brand-orange\"\n )}\n onClick={(e) => { e.preventDefault(); e.stopPropagation(); onCart(token); }}\n disabled={inCart}\n aria-label={inCart ? \"In cart\" : \"Add to cart\"}\n >\n {inCart ? <Check className=\"h-3.5 w-3.5\" /> : <ShoppingCart className=\"h-3.5 w-3.5\" />}\n </button>\n )}\n {onOffer && (\n <button\n className={cn(BTN_OUTLINE, \"w-8 shrink-0 text-brand-orange border-brand-orange/40 hover:bg-brand-orange/10\")}\n onClick={(e) => { e.preventDefault(); e.stopPropagation(); onOffer(token); }}\n aria-label=\"Make an offer\"\n >\n <HandCoins className=\"h-3.5 w-3.5\" />\n </button>\n )}\n </>\n );\n }\n\n // Non-owner + no listing (or showBuyButton=false)\n if (!isOwner) {\n if (!onOffer) return null;\n return (\n <>\n <Link href={assetHref} className={cn(BTN_OUTLINE, \"flex-1\")}>\n <ArrowUpRight className=\"h-3.5 w-3.5 shrink-0\" />\n View\n </Link>\n <button\n className={cn(BTN_OUTLINE, \"w-8 shrink-0 text-brand-orange border-brand-orange/40 hover:bg-brand-orange/10\")}\n onClick={(e) => { e.preventDefault(); e.stopPropagation(); onOffer(token); }}\n aria-label=\"Make an offer\"\n >\n <HandCoins className=\"h-3.5 w-3.5\" />\n </button>\n </>\n );\n }\n\n // Owner + listed\n if (isOwner && activeOrder) {\n if (!onCancel) return null;\n return (\n <>\n <button\n className={cn(BTN_SOLID, \"flex-1 bg-brand-rose\")}\n onClick={(e) => { e.preventDefault(); e.stopPropagation(); onCancel(token); }}\n >\n <X className=\"h-3.5 w-3.5 shrink-0\" />\n Cancel listing\n </button>\n {onTransfer && (\n <button\n className={cn(BTN_OUTLINE, \"w-8 shrink-0\")}\n onClick={(e) => { e.preventDefault(); e.stopPropagation(); onTransfer(token); }}\n aria-label=\"Transfer\"\n >\n <ArrowRightLeft className=\"h-3.5 w-3.5\" />\n </button>\n )}\n </>\n );\n }\n\n // Owner + unlisted\n if (isOwner && !activeOrder) {\n if (!onList) return null;\n return (\n <>\n <button\n className={cn(BTN_SOLID, \"flex-1 bg-brand-blue\")}\n onClick={(e) => { e.preventDefault(); e.stopPropagation(); onList(token); }}\n >\n <Tag className=\"h-3.5 w-3.5 shrink-0\" />\n List for sale\n </button>\n {onTransfer && (\n <button\n className={cn(BTN_OUTLINE, \"w-8 shrink-0\")}\n onClick={(e) => { e.preventDefault(); e.stopPropagation(); onTransfer(token); }}\n aria-label=\"Transfer\"\n >\n <ArrowRightLeft className=\"h-3.5 w-3.5\" />\n </button>\n )}\n </>\n );\n }\n\n return null;\n };\n\n const actionContent = renderActions();\n const showActionBar = actionContent != null || !!overflowMenu;\n\n return (\n <MotionCard className={cn(\"card-base group relative overflow-hidden flex flex-col\", className)}>\n <Link href={assetHref} className=\"block relative shrink-0\">\n <div className=\"relative aspect-square bg-muted overflow-hidden\">\n {!imgError ? (\n <Image\n src={image}\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\">#{token.tokenId}</span>\n </div>\n )}\n\n {token.metadata?.ipType && (\n <div className=\"absolute top-2 left-2\">\n <IpTypeBadge ipType={token.metadata.ipType as any} size=\"sm\" />\n </div>\n )}\n\n {rarityTier && RARITY_STYLE[rarityTier] && (\n <div className=\"absolute top-2 right-2 z-10\">\n <span className={cn(\n \"inline-flex items-center px-1.5 py-0.5 rounded-md backdrop-blur-sm text-[10px] font-bold leading-none\",\n RARITY_STYLE[rarityTier]!.className\n )}>\n {RARITY_STYLE[rarityTier]!.label}\n </span>\n </div>\n )}\n\n {(token.metadataStatus === \"PENDING\" || token.metadataStatus === \"FETCHING\") && (\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 <div className=\"px-3 pt-2.5 pb-1 flex-1\">\n <Link href={assetHref} className=\"block space-y-0.5 mb-2\">\n <p className=\"text-xl font-bold line-clamp-2 leading-tight\">{name}</p>\n {activeOrder && (\n <p className=\"flex items-center gap-1 text-[11px] font-semibold text-foreground/80\">\n <CurrencyIcon symbol={activeOrder.price.currency} size={11} />\n {formatDisplayPrice(activeOrder.price.formatted)}\n <span className=\"font-normal text-muted-foreground\">{activeOrder.price.currency}</span>\n </p>\n )}\n {token.metadata?.description ? (\n <p className=\"text-[10px] text-muted-foreground truncate leading-snug\">\n {token.metadata.description}\n </p>\n ) : token.metadata?.ipType ? (\n <p className=\"text-[10px] text-muted-foreground opacity-70\">{token.metadata.ipType}</p>\n ) : null}\n </Link>\n </div>\n\n {showActionBar && (\n <div className=\"flex items-center gap-1.5 px-2 pb-2\">\n {actionContent}\n {overflowMenu}\n </div>\n )}\n </MotionCard>\n );\n}\n\nexport function TokenCardSkeleton() {\n return (\n <div className=\"card-base overflow-hidden\">\n <div className=\"aspect-square w-full animate-pulse bg-muted\" />\n <div className=\"px-3 pt-2.5 pb-2 space-y-1.5\">\n <div className=\"h-5 w-3/4 rounded-md animate-pulse bg-muted\" />\n <div className=\"h-2.5 w-2/5 rounded-md animate-pulse bg-muted\" />\n </div>\n <div className=\"px-2 pb-2 flex gap-1.5\">\n <div className=\"h-8 flex-1 rounded-[11px] animate-pulse bg-muted\" />\n <div className=\"h-8 w-8 rounded-[11px] animate-pulse bg-muted shrink-0\" />\n <div className=\"h-8 w-8 rounded-[11px] animate-pulse bg-muted shrink-0\" />\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["Link","Image"]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { ApiToken } from '@medialane/sdk';
|
|
3
|
+
|
|
4
|
+
type RarityTier = "legendary" | "epic" | "rare" | "uncommon" | "common";
|
|
5
|
+
interface TokenCardProps {
|
|
6
|
+
token: ApiToken;
|
|
7
|
+
/** Whether the current user owns this token. Default: false */
|
|
8
|
+
isOwner?: boolean;
|
|
9
|
+
/** Whether this token's listing is already in the cart. Default: false */
|
|
10
|
+
inCart?: boolean;
|
|
11
|
+
/** Show the Buy button for listed tokens. Default: true */
|
|
12
|
+
showBuyButton?: boolean;
|
|
13
|
+
/** Optional rarity label shown as an overlay badge */
|
|
14
|
+
rarityTier?: RarityTier;
|
|
15
|
+
className?: string;
|
|
16
|
+
/** Callbacks — omit any to hide that button */
|
|
17
|
+
onBuy?: (token: ApiToken) => void;
|
|
18
|
+
onCart?: (token: ApiToken) => void;
|
|
19
|
+
onOffer?: (token: ApiToken) => void;
|
|
20
|
+
onList?: (token: ApiToken) => void;
|
|
21
|
+
onCancel?: (token: ApiToken) => void;
|
|
22
|
+
onTransfer?: (token: ApiToken) => void;
|
|
23
|
+
onRemix?: (token: ApiToken) => void;
|
|
24
|
+
onReport?: (token: ApiToken) => void;
|
|
25
|
+
/** Slot for a DropdownMenu trigger — rendered after primary buttons */
|
|
26
|
+
overflowMenu?: React.ReactNode;
|
|
27
|
+
}
|
|
28
|
+
declare function TokenCard({ token, isOwner, inCart, showBuyButton, rarityTier, className, onBuy, onCart, onOffer, onList, onCancel, onTransfer, overflowMenu, }: TokenCardProps): react_jsx_runtime.JSX.Element;
|
|
29
|
+
declare function TokenCardSkeleton(): react_jsx_runtime.JSX.Element;
|
|
30
|
+
|
|
31
|
+
export { type RarityTier, TokenCard, type TokenCardProps, TokenCardSkeleton };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { ApiToken } from '@medialane/sdk';
|
|
3
|
+
|
|
4
|
+
type RarityTier = "legendary" | "epic" | "rare" | "uncommon" | "common";
|
|
5
|
+
interface TokenCardProps {
|
|
6
|
+
token: ApiToken;
|
|
7
|
+
/** Whether the current user owns this token. Default: false */
|
|
8
|
+
isOwner?: boolean;
|
|
9
|
+
/** Whether this token's listing is already in the cart. Default: false */
|
|
10
|
+
inCart?: boolean;
|
|
11
|
+
/** Show the Buy button for listed tokens. Default: true */
|
|
12
|
+
showBuyButton?: boolean;
|
|
13
|
+
/** Optional rarity label shown as an overlay badge */
|
|
14
|
+
rarityTier?: RarityTier;
|
|
15
|
+
className?: string;
|
|
16
|
+
/** Callbacks — omit any to hide that button */
|
|
17
|
+
onBuy?: (token: ApiToken) => void;
|
|
18
|
+
onCart?: (token: ApiToken) => void;
|
|
19
|
+
onOffer?: (token: ApiToken) => void;
|
|
20
|
+
onList?: (token: ApiToken) => void;
|
|
21
|
+
onCancel?: (token: ApiToken) => void;
|
|
22
|
+
onTransfer?: (token: ApiToken) => void;
|
|
23
|
+
onRemix?: (token: ApiToken) => void;
|
|
24
|
+
onReport?: (token: ApiToken) => void;
|
|
25
|
+
/** Slot for a DropdownMenu trigger — rendered after primary buttons */
|
|
26
|
+
overflowMenu?: React.ReactNode;
|
|
27
|
+
}
|
|
28
|
+
declare function TokenCard({ token, isOwner, inCart, showBuyButton, rarityTier, className, onBuy, onCart, onOffer, onList, onCancel, onTransfer, overflowMenu, }: TokenCardProps): react_jsx_runtime.JSX.Element;
|
|
29
|
+
declare function TokenCardSkeleton(): react_jsx_runtime.JSX.Element;
|
|
30
|
+
|
|
31
|
+
export { type RarityTier, TokenCard, type TokenCardProps, TokenCardSkeleton };
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { Fragment, 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 {
|
|
7
|
+
ShoppingCart,
|
|
8
|
+
Tag,
|
|
9
|
+
ArrowRightLeft,
|
|
10
|
+
X,
|
|
11
|
+
Loader2,
|
|
12
|
+
HandCoins,
|
|
13
|
+
Check,
|
|
14
|
+
ArrowUpRight,
|
|
15
|
+
Zap
|
|
16
|
+
} from "lucide-react";
|
|
17
|
+
import { cn } from "../utils/cn.js";
|
|
18
|
+
import { ipfsToHttp } from "../utils/ipfs.js";
|
|
19
|
+
import { formatDisplayPrice } from "../utils/format.js";
|
|
20
|
+
import { CurrencyIcon } from "./currency-icon.js";
|
|
21
|
+
import { IpTypeBadge } from "./ip-type-badge.js";
|
|
22
|
+
import { MotionCard } from "./motion-primitives.js";
|
|
23
|
+
const RARITY_STYLE = {
|
|
24
|
+
legendary: { label: "Legendary", className: "bg-yellow-400/90 text-yellow-900" },
|
|
25
|
+
epic: { label: "Epic", className: "bg-purple-500/85 text-white" },
|
|
26
|
+
rare: { label: "Rare", className: "bg-blue-500/85 text-white" },
|
|
27
|
+
uncommon: { label: "Uncommon", className: "bg-emerald-500/85 text-white" },
|
|
28
|
+
common: null
|
|
29
|
+
};
|
|
30
|
+
const BTN_BASE = "h-8 rounded-[11px] flex items-center justify-center gap-1.5 text-xs font-semibold transition-all active:scale-[0.98] shadow-none border-0";
|
|
31
|
+
const BTN_SOLID = cn(BTN_BASE, "text-white hover:brightness-110");
|
|
32
|
+
const BTN_OUTLINE = cn(BTN_BASE, "border border-border/60 text-foreground hover:bg-muted/60");
|
|
33
|
+
function TokenCard({
|
|
34
|
+
token,
|
|
35
|
+
isOwner = false,
|
|
36
|
+
inCart = false,
|
|
37
|
+
showBuyButton = true,
|
|
38
|
+
rarityTier,
|
|
39
|
+
className,
|
|
40
|
+
onBuy,
|
|
41
|
+
onCart,
|
|
42
|
+
onOffer,
|
|
43
|
+
onList,
|
|
44
|
+
onCancel,
|
|
45
|
+
onTransfer,
|
|
46
|
+
overflowMenu
|
|
47
|
+
}) {
|
|
48
|
+
const [imgError, setImgError] = useState(false);
|
|
49
|
+
const name = token.metadata?.name || `Token #${token.tokenId}`;
|
|
50
|
+
const image = ipfsToHttp(token.metadata?.image);
|
|
51
|
+
const activeOrder = token.activeOrders?.[0];
|
|
52
|
+
const assetHref = `/asset/${token.contractAddress}/${token.tokenId}`;
|
|
53
|
+
const renderActions = () => {
|
|
54
|
+
if (!isOwner && activeOrder && showBuyButton) {
|
|
55
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
56
|
+
onBuy && /* @__PURE__ */ jsxs(
|
|
57
|
+
"button",
|
|
58
|
+
{
|
|
59
|
+
className: cn(BTN_SOLID, "flex-1 bg-brand-purple"),
|
|
60
|
+
onClick: (e) => {
|
|
61
|
+
e.preventDefault();
|
|
62
|
+
e.stopPropagation();
|
|
63
|
+
onBuy(token);
|
|
64
|
+
},
|
|
65
|
+
children: [
|
|
66
|
+
/* @__PURE__ */ jsx(Zap, { className: "h-3.5 w-3.5 shrink-0" }),
|
|
67
|
+
"Buy"
|
|
68
|
+
]
|
|
69
|
+
}
|
|
70
|
+
),
|
|
71
|
+
onCart && /* @__PURE__ */ jsx(
|
|
72
|
+
"button",
|
|
73
|
+
{
|
|
74
|
+
className: cn(
|
|
75
|
+
BTN_OUTLINE,
|
|
76
|
+
"w-8 shrink-0",
|
|
77
|
+
inCart && "border-brand-orange/50 bg-brand-orange/10 text-brand-orange"
|
|
78
|
+
),
|
|
79
|
+
onClick: (e) => {
|
|
80
|
+
e.preventDefault();
|
|
81
|
+
e.stopPropagation();
|
|
82
|
+
onCart(token);
|
|
83
|
+
},
|
|
84
|
+
disabled: inCart,
|
|
85
|
+
"aria-label": inCart ? "In cart" : "Add to cart",
|
|
86
|
+
children: inCart ? /* @__PURE__ */ jsx(Check, { className: "h-3.5 w-3.5" }) : /* @__PURE__ */ jsx(ShoppingCart, { className: "h-3.5 w-3.5" })
|
|
87
|
+
}
|
|
88
|
+
),
|
|
89
|
+
onOffer && /* @__PURE__ */ jsx(
|
|
90
|
+
"button",
|
|
91
|
+
{
|
|
92
|
+
className: cn(BTN_OUTLINE, "w-8 shrink-0 text-brand-orange border-brand-orange/40 hover:bg-brand-orange/10"),
|
|
93
|
+
onClick: (e) => {
|
|
94
|
+
e.preventDefault();
|
|
95
|
+
e.stopPropagation();
|
|
96
|
+
onOffer(token);
|
|
97
|
+
},
|
|
98
|
+
"aria-label": "Make an offer",
|
|
99
|
+
children: /* @__PURE__ */ jsx(HandCoins, { className: "h-3.5 w-3.5" })
|
|
100
|
+
}
|
|
101
|
+
)
|
|
102
|
+
] });
|
|
103
|
+
}
|
|
104
|
+
if (!isOwner) {
|
|
105
|
+
if (!onOffer) return null;
|
|
106
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
107
|
+
/* @__PURE__ */ jsxs(Link, { href: assetHref, className: cn(BTN_OUTLINE, "flex-1"), children: [
|
|
108
|
+
/* @__PURE__ */ jsx(ArrowUpRight, { className: "h-3.5 w-3.5 shrink-0" }),
|
|
109
|
+
"View"
|
|
110
|
+
] }),
|
|
111
|
+
/* @__PURE__ */ jsx(
|
|
112
|
+
"button",
|
|
113
|
+
{
|
|
114
|
+
className: cn(BTN_OUTLINE, "w-8 shrink-0 text-brand-orange border-brand-orange/40 hover:bg-brand-orange/10"),
|
|
115
|
+
onClick: (e) => {
|
|
116
|
+
e.preventDefault();
|
|
117
|
+
e.stopPropagation();
|
|
118
|
+
onOffer(token);
|
|
119
|
+
},
|
|
120
|
+
"aria-label": "Make an offer",
|
|
121
|
+
children: /* @__PURE__ */ jsx(HandCoins, { className: "h-3.5 w-3.5" })
|
|
122
|
+
}
|
|
123
|
+
)
|
|
124
|
+
] });
|
|
125
|
+
}
|
|
126
|
+
if (isOwner && activeOrder) {
|
|
127
|
+
if (!onCancel) return null;
|
|
128
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
129
|
+
/* @__PURE__ */ jsxs(
|
|
130
|
+
"button",
|
|
131
|
+
{
|
|
132
|
+
className: cn(BTN_SOLID, "flex-1 bg-brand-rose"),
|
|
133
|
+
onClick: (e) => {
|
|
134
|
+
e.preventDefault();
|
|
135
|
+
e.stopPropagation();
|
|
136
|
+
onCancel(token);
|
|
137
|
+
},
|
|
138
|
+
children: [
|
|
139
|
+
/* @__PURE__ */ jsx(X, { className: "h-3.5 w-3.5 shrink-0" }),
|
|
140
|
+
"Cancel listing"
|
|
141
|
+
]
|
|
142
|
+
}
|
|
143
|
+
),
|
|
144
|
+
onTransfer && /* @__PURE__ */ jsx(
|
|
145
|
+
"button",
|
|
146
|
+
{
|
|
147
|
+
className: cn(BTN_OUTLINE, "w-8 shrink-0"),
|
|
148
|
+
onClick: (e) => {
|
|
149
|
+
e.preventDefault();
|
|
150
|
+
e.stopPropagation();
|
|
151
|
+
onTransfer(token);
|
|
152
|
+
},
|
|
153
|
+
"aria-label": "Transfer",
|
|
154
|
+
children: /* @__PURE__ */ jsx(ArrowRightLeft, { className: "h-3.5 w-3.5" })
|
|
155
|
+
}
|
|
156
|
+
)
|
|
157
|
+
] });
|
|
158
|
+
}
|
|
159
|
+
if (isOwner && !activeOrder) {
|
|
160
|
+
if (!onList) return null;
|
|
161
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
162
|
+
/* @__PURE__ */ jsxs(
|
|
163
|
+
"button",
|
|
164
|
+
{
|
|
165
|
+
className: cn(BTN_SOLID, "flex-1 bg-brand-blue"),
|
|
166
|
+
onClick: (e) => {
|
|
167
|
+
e.preventDefault();
|
|
168
|
+
e.stopPropagation();
|
|
169
|
+
onList(token);
|
|
170
|
+
},
|
|
171
|
+
children: [
|
|
172
|
+
/* @__PURE__ */ jsx(Tag, { className: "h-3.5 w-3.5 shrink-0" }),
|
|
173
|
+
"List for sale"
|
|
174
|
+
]
|
|
175
|
+
}
|
|
176
|
+
),
|
|
177
|
+
onTransfer && /* @__PURE__ */ jsx(
|
|
178
|
+
"button",
|
|
179
|
+
{
|
|
180
|
+
className: cn(BTN_OUTLINE, "w-8 shrink-0"),
|
|
181
|
+
onClick: (e) => {
|
|
182
|
+
e.preventDefault();
|
|
183
|
+
e.stopPropagation();
|
|
184
|
+
onTransfer(token);
|
|
185
|
+
},
|
|
186
|
+
"aria-label": "Transfer",
|
|
187
|
+
children: /* @__PURE__ */ jsx(ArrowRightLeft, { className: "h-3.5 w-3.5" })
|
|
188
|
+
}
|
|
189
|
+
)
|
|
190
|
+
] });
|
|
191
|
+
}
|
|
192
|
+
return null;
|
|
193
|
+
};
|
|
194
|
+
const actionContent = renderActions();
|
|
195
|
+
const showActionBar = actionContent != null || !!overflowMenu;
|
|
196
|
+
return /* @__PURE__ */ jsxs(MotionCard, { className: cn("card-base group relative overflow-hidden flex flex-col", className), children: [
|
|
197
|
+
/* @__PURE__ */ jsx(Link, { href: assetHref, className: "block relative shrink-0", children: /* @__PURE__ */ jsxs("div", { className: "relative aspect-square bg-muted overflow-hidden", children: [
|
|
198
|
+
!imgError ? /* @__PURE__ */ jsx(
|
|
199
|
+
Image,
|
|
200
|
+
{
|
|
201
|
+
src: image,
|
|
202
|
+
alt: name,
|
|
203
|
+
fill: true,
|
|
204
|
+
unoptimized: true,
|
|
205
|
+
sizes: "(max-width: 640px) 50vw, (max-width: 1024px) 33vw, 22vw",
|
|
206
|
+
className: "object-cover transition-transform duration-500 group-hover:scale-105",
|
|
207
|
+
onError: () => setImgError(true)
|
|
208
|
+
}
|
|
209
|
+
) : /* @__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: [
|
|
210
|
+
"#",
|
|
211
|
+
token.tokenId
|
|
212
|
+
] }) }),
|
|
213
|
+
token.metadata?.ipType && /* @__PURE__ */ jsx("div", { className: "absolute top-2 left-2", children: /* @__PURE__ */ jsx(IpTypeBadge, { ipType: token.metadata.ipType, size: "sm" }) }),
|
|
214
|
+
rarityTier && RARITY_STYLE[rarityTier] && /* @__PURE__ */ jsx("div", { className: "absolute top-2 right-2 z-10", children: /* @__PURE__ */ jsx("span", { className: cn(
|
|
215
|
+
"inline-flex items-center px-1.5 py-0.5 rounded-md backdrop-blur-sm text-[10px] font-bold leading-none",
|
|
216
|
+
RARITY_STYLE[rarityTier].className
|
|
217
|
+
), children: RARITY_STYLE[rarityTier].label }) }),
|
|
218
|
+
(token.metadataStatus === "PENDING" || token.metadataStatus === "FETCHING") && /* @__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: [
|
|
219
|
+
/* @__PURE__ */ jsx(Loader2, { className: "h-3 w-3 animate-spin text-white/70" }),
|
|
220
|
+
/* @__PURE__ */ jsx("span", { className: "text-[10px] text-white/70", children: "Indexing\u2026" })
|
|
221
|
+
] })
|
|
222
|
+
] }) }),
|
|
223
|
+
/* @__PURE__ */ jsx("div", { className: "px-3 pt-2.5 pb-1 flex-1", children: /* @__PURE__ */ jsxs(Link, { href: assetHref, className: "block space-y-0.5 mb-2", children: [
|
|
224
|
+
/* @__PURE__ */ jsx("p", { className: "text-xl font-bold line-clamp-2 leading-tight", children: name }),
|
|
225
|
+
activeOrder && /* @__PURE__ */ jsxs("p", { className: "flex items-center gap-1 text-[11px] font-semibold text-foreground/80", children: [
|
|
226
|
+
/* @__PURE__ */ jsx(CurrencyIcon, { symbol: activeOrder.price.currency, size: 11 }),
|
|
227
|
+
formatDisplayPrice(activeOrder.price.formatted),
|
|
228
|
+
/* @__PURE__ */ jsx("span", { className: "font-normal text-muted-foreground", children: activeOrder.price.currency })
|
|
229
|
+
] }),
|
|
230
|
+
token.metadata?.description ? /* @__PURE__ */ jsx("p", { className: "text-[10px] text-muted-foreground truncate leading-snug", children: token.metadata.description }) : token.metadata?.ipType ? /* @__PURE__ */ jsx("p", { className: "text-[10px] text-muted-foreground opacity-70", children: token.metadata.ipType }) : null
|
|
231
|
+
] }) }),
|
|
232
|
+
showActionBar && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5 px-2 pb-2", children: [
|
|
233
|
+
actionContent,
|
|
234
|
+
overflowMenu
|
|
235
|
+
] })
|
|
236
|
+
] });
|
|
237
|
+
}
|
|
238
|
+
function TokenCardSkeleton() {
|
|
239
|
+
return /* @__PURE__ */ jsxs("div", { className: "card-base overflow-hidden", children: [
|
|
240
|
+
/* @__PURE__ */ jsx("div", { className: "aspect-square w-full animate-pulse bg-muted" }),
|
|
241
|
+
/* @__PURE__ */ jsxs("div", { className: "px-3 pt-2.5 pb-2 space-y-1.5", children: [
|
|
242
|
+
/* @__PURE__ */ jsx("div", { className: "h-5 w-3/4 rounded-md animate-pulse bg-muted" }),
|
|
243
|
+
/* @__PURE__ */ jsx("div", { className: "h-2.5 w-2/5 rounded-md animate-pulse bg-muted" })
|
|
244
|
+
] }),
|
|
245
|
+
/* @__PURE__ */ jsxs("div", { className: "px-2 pb-2 flex gap-1.5", children: [
|
|
246
|
+
/* @__PURE__ */ jsx("div", { className: "h-8 flex-1 rounded-[11px] animate-pulse bg-muted" }),
|
|
247
|
+
/* @__PURE__ */ jsx("div", { className: "h-8 w-8 rounded-[11px] animate-pulse bg-muted shrink-0" }),
|
|
248
|
+
/* @__PURE__ */ jsx("div", { className: "h-8 w-8 rounded-[11px] animate-pulse bg-muted shrink-0" })
|
|
249
|
+
] })
|
|
250
|
+
] });
|
|
251
|
+
}
|
|
252
|
+
export {
|
|
253
|
+
TokenCard,
|
|
254
|
+
TokenCardSkeleton
|
|
255
|
+
};
|
|
256
|
+
//# sourceMappingURL=token-card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/token-card.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport Link from \"next/link\";\nimport Image from \"next/image\";\nimport {\n ShoppingCart, Tag, ArrowRightLeft, X, Loader2, HandCoins,\n Check, ArrowUpRight, Zap,\n} 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\";\nimport { MotionCard } from \"./motion-primitives.js\";\nimport type { ApiToken } from \"@medialane/sdk\";\n\nexport type RarityTier = \"legendary\" | \"epic\" | \"rare\" | \"uncommon\" | \"common\";\n\nconst RARITY_STYLE: Record<RarityTier, { label: string; className: string } | null> = {\n legendary: { label: \"Legendary\", className: \"bg-yellow-400/90 text-yellow-900\" },\n epic: { label: \"Epic\", className: \"bg-purple-500/85 text-white\" },\n rare: { label: \"Rare\", className: \"bg-blue-500/85 text-white\" },\n uncommon: { label: \"Uncommon\", className: \"bg-emerald-500/85 text-white\" },\n common: null,\n};\n\nconst BTN_BASE = \"h-8 rounded-[11px] flex items-center justify-center gap-1.5 text-xs font-semibold transition-all active:scale-[0.98] shadow-none border-0\";\nconst BTN_SOLID = cn(BTN_BASE, \"text-white hover:brightness-110\");\nconst BTN_OUTLINE = cn(BTN_BASE, \"border border-border/60 text-foreground hover:bg-muted/60\");\n\nexport interface TokenCardProps {\n token: ApiToken;\n /** Whether the current user owns this token. Default: false */\n isOwner?: boolean;\n /** Whether this token's listing is already in the cart. Default: false */\n inCart?: boolean;\n /** Show the Buy button for listed tokens. Default: true */\n showBuyButton?: boolean;\n /** Optional rarity label shown as an overlay badge */\n rarityTier?: RarityTier;\n className?: string;\n /** Callbacks — omit any to hide that button */\n onBuy?: (token: ApiToken) => void;\n onCart?: (token: ApiToken) => void;\n onOffer?: (token: ApiToken) => void;\n onList?: (token: ApiToken) => void;\n onCancel?: (token: ApiToken) => void;\n onTransfer?: (token: ApiToken) => void;\n onRemix?: (token: ApiToken) => void;\n onReport?: (token: ApiToken) => void;\n /** Slot for a DropdownMenu trigger — rendered after primary buttons */\n overflowMenu?: React.ReactNode;\n}\n\nexport function TokenCard({\n token,\n isOwner = false,\n inCart = false,\n showBuyButton = true,\n rarityTier,\n className,\n onBuy,\n onCart,\n onOffer,\n onList,\n onCancel,\n onTransfer,\n overflowMenu,\n}: TokenCardProps) {\n const [imgError, setImgError] = useState(false);\n\n const name = token.metadata?.name || `Token #${token.tokenId}`;\n const image = ipfsToHttp(token.metadata?.image);\n const activeOrder = token.activeOrders?.[0];\n const assetHref = `/asset/${token.contractAddress}/${token.tokenId}`;\n\n const renderActions = () => {\n // Non-owner + listed + showBuyButton\n if (!isOwner && activeOrder && showBuyButton) {\n return (\n <>\n {onBuy && (\n <button\n className={cn(BTN_SOLID, \"flex-1 bg-brand-purple\")}\n onClick={(e) => { e.preventDefault(); e.stopPropagation(); onBuy(token); }}\n >\n <Zap className=\"h-3.5 w-3.5 shrink-0\" />\n Buy\n </button>\n )}\n {onCart && (\n <button\n className={cn(\n BTN_OUTLINE, \"w-8 shrink-0\",\n inCart && \"border-brand-orange/50 bg-brand-orange/10 text-brand-orange\"\n )}\n onClick={(e) => { e.preventDefault(); e.stopPropagation(); onCart(token); }}\n disabled={inCart}\n aria-label={inCart ? \"In cart\" : \"Add to cart\"}\n >\n {inCart ? <Check className=\"h-3.5 w-3.5\" /> : <ShoppingCart className=\"h-3.5 w-3.5\" />}\n </button>\n )}\n {onOffer && (\n <button\n className={cn(BTN_OUTLINE, \"w-8 shrink-0 text-brand-orange border-brand-orange/40 hover:bg-brand-orange/10\")}\n onClick={(e) => { e.preventDefault(); e.stopPropagation(); onOffer(token); }}\n aria-label=\"Make an offer\"\n >\n <HandCoins className=\"h-3.5 w-3.5\" />\n </button>\n )}\n </>\n );\n }\n\n // Non-owner + no listing (or showBuyButton=false)\n if (!isOwner) {\n if (!onOffer) return null;\n return (\n <>\n <Link href={assetHref} className={cn(BTN_OUTLINE, \"flex-1\")}>\n <ArrowUpRight className=\"h-3.5 w-3.5 shrink-0\" />\n View\n </Link>\n <button\n className={cn(BTN_OUTLINE, \"w-8 shrink-0 text-brand-orange border-brand-orange/40 hover:bg-brand-orange/10\")}\n onClick={(e) => { e.preventDefault(); e.stopPropagation(); onOffer(token); }}\n aria-label=\"Make an offer\"\n >\n <HandCoins className=\"h-3.5 w-3.5\" />\n </button>\n </>\n );\n }\n\n // Owner + listed\n if (isOwner && activeOrder) {\n if (!onCancel) return null;\n return (\n <>\n <button\n className={cn(BTN_SOLID, \"flex-1 bg-brand-rose\")}\n onClick={(e) => { e.preventDefault(); e.stopPropagation(); onCancel(token); }}\n >\n <X className=\"h-3.5 w-3.5 shrink-0\" />\n Cancel listing\n </button>\n {onTransfer && (\n <button\n className={cn(BTN_OUTLINE, \"w-8 shrink-0\")}\n onClick={(e) => { e.preventDefault(); e.stopPropagation(); onTransfer(token); }}\n aria-label=\"Transfer\"\n >\n <ArrowRightLeft className=\"h-3.5 w-3.5\" />\n </button>\n )}\n </>\n );\n }\n\n // Owner + unlisted\n if (isOwner && !activeOrder) {\n if (!onList) return null;\n return (\n <>\n <button\n className={cn(BTN_SOLID, \"flex-1 bg-brand-blue\")}\n onClick={(e) => { e.preventDefault(); e.stopPropagation(); onList(token); }}\n >\n <Tag className=\"h-3.5 w-3.5 shrink-0\" />\n List for sale\n </button>\n {onTransfer && (\n <button\n className={cn(BTN_OUTLINE, \"w-8 shrink-0\")}\n onClick={(e) => { e.preventDefault(); e.stopPropagation(); onTransfer(token); }}\n aria-label=\"Transfer\"\n >\n <ArrowRightLeft className=\"h-3.5 w-3.5\" />\n </button>\n )}\n </>\n );\n }\n\n return null;\n };\n\n const actionContent = renderActions();\n const showActionBar = actionContent != null || !!overflowMenu;\n\n return (\n <MotionCard className={cn(\"card-base group relative overflow-hidden flex flex-col\", className)}>\n <Link href={assetHref} className=\"block relative shrink-0\">\n <div className=\"relative aspect-square bg-muted overflow-hidden\">\n {!imgError ? (\n <Image\n src={image}\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\">#{token.tokenId}</span>\n </div>\n )}\n\n {token.metadata?.ipType && (\n <div className=\"absolute top-2 left-2\">\n <IpTypeBadge ipType={token.metadata.ipType as any} size=\"sm\" />\n </div>\n )}\n\n {rarityTier && RARITY_STYLE[rarityTier] && (\n <div className=\"absolute top-2 right-2 z-10\">\n <span className={cn(\n \"inline-flex items-center px-1.5 py-0.5 rounded-md backdrop-blur-sm text-[10px] font-bold leading-none\",\n RARITY_STYLE[rarityTier]!.className\n )}>\n {RARITY_STYLE[rarityTier]!.label}\n </span>\n </div>\n )}\n\n {(token.metadataStatus === \"PENDING\" || token.metadataStatus === \"FETCHING\") && (\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 <div className=\"px-3 pt-2.5 pb-1 flex-1\">\n <Link href={assetHref} className=\"block space-y-0.5 mb-2\">\n <p className=\"text-xl font-bold line-clamp-2 leading-tight\">{name}</p>\n {activeOrder && (\n <p className=\"flex items-center gap-1 text-[11px] font-semibold text-foreground/80\">\n <CurrencyIcon symbol={activeOrder.price.currency} size={11} />\n {formatDisplayPrice(activeOrder.price.formatted)}\n <span className=\"font-normal text-muted-foreground\">{activeOrder.price.currency}</span>\n </p>\n )}\n {token.metadata?.description ? (\n <p className=\"text-[10px] text-muted-foreground truncate leading-snug\">\n {token.metadata.description}\n </p>\n ) : token.metadata?.ipType ? (\n <p className=\"text-[10px] text-muted-foreground opacity-70\">{token.metadata.ipType}</p>\n ) : null}\n </Link>\n </div>\n\n {showActionBar && (\n <div className=\"flex items-center gap-1.5 px-2 pb-2\">\n {actionContent}\n {overflowMenu}\n </div>\n )}\n </MotionCard>\n );\n}\n\nexport function TokenCardSkeleton() {\n return (\n <div className=\"card-base overflow-hidden\">\n <div className=\"aspect-square w-full animate-pulse bg-muted\" />\n <div className=\"px-3 pt-2.5 pb-2 space-y-1.5\">\n <div className=\"h-5 w-3/4 rounded-md animate-pulse bg-muted\" />\n <div className=\"h-2.5 w-2/5 rounded-md animate-pulse bg-muted\" />\n </div>\n <div className=\"px-2 pb-2 flex gap-1.5\">\n <div className=\"h-8 flex-1 rounded-[11px] animate-pulse bg-muted\" />\n <div className=\"h-8 w-8 rounded-[11px] animate-pulse bg-muted shrink-0\" />\n <div className=\"h-8 w-8 rounded-[11px] animate-pulse bg-muted shrink-0\" />\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.cjs
CHANGED
|
@@ -20,15 +20,28 @@ var index_exports = {};
|
|
|
20
20
|
__export(index_exports, {
|
|
21
21
|
AddressDisplay: () => import_address_display.AddressDisplay,
|
|
22
22
|
BRAND: () => import_brand.BRAND,
|
|
23
|
+
CollectionCard: () => import_collection_card.CollectionCard,
|
|
24
|
+
CollectionCardSkeleton: () => import_collection_card.CollectionCardSkeleton,
|
|
23
25
|
CurrencyAmount: () => import_currency_icon.CurrencyAmount,
|
|
24
26
|
CurrencyIcon: () => import_currency_icon.CurrencyIcon,
|
|
27
|
+
EASE_OUT: () => import_motion_primitives.EASE_OUT,
|
|
28
|
+
FadeIn: () => import_motion_primitives.FadeIn,
|
|
25
29
|
IP_TYPE_CONFIG: () => import_ip_type_badge.IP_TYPE_CONFIG,
|
|
26
30
|
IP_TYPE_DATA: () => import_ip_types.IP_TYPE_DATA,
|
|
27
31
|
IP_TYPE_DATA_MAP: () => import_ip_types.IP_TYPE_DATA_MAP,
|
|
28
32
|
IP_TYPE_MAP: () => import_ip_type_badge.IP_TYPE_MAP,
|
|
29
33
|
IpTypeBadge: () => import_ip_type_badge.IpTypeBadge,
|
|
34
|
+
KineticWords: () => import_motion_primitives.KineticWords,
|
|
30
35
|
MedialaneIcon: () => import_brand_icon.MedialaneIcon,
|
|
31
36
|
MedialaneLogoFull: () => import_brand_logo.MedialaneLogoFull,
|
|
37
|
+
MotionCard: () => import_motion_primitives.MotionCard,
|
|
38
|
+
SPRING: () => import_motion_primitives.SPRING,
|
|
39
|
+
ScrollSection: () => import_scroll_section.ScrollSection,
|
|
40
|
+
ShareButton: () => import_share_button.ShareButton,
|
|
41
|
+
Stagger: () => import_motion_primitives.Stagger,
|
|
42
|
+
StaggerItem: () => import_motion_primitives.StaggerItem,
|
|
43
|
+
TokenCard: () => import_token_card.TokenCard,
|
|
44
|
+
TokenCardSkeleton: () => import_token_card.TokenCardSkeleton,
|
|
32
45
|
cn: () => import_cn.cn,
|
|
33
46
|
formatDisplayPrice: () => import_format.formatDisplayPrice,
|
|
34
47
|
ipfsToHttp: () => import_ipfs.ipfsToHttp,
|
|
@@ -46,19 +59,37 @@ var import_ip_type_badge = require("./components/ip-type-badge.js");
|
|
|
46
59
|
var import_address_display = require("./components/address-display.js");
|
|
47
60
|
var import_brand_icon = require("./components/brand-icon.js");
|
|
48
61
|
var import_brand_logo = require("./components/brand-logo.js");
|
|
62
|
+
var import_motion_primitives = require("./components/motion-primitives.js");
|
|
63
|
+
var import_scroll_section = require("./components/scroll-section.js");
|
|
64
|
+
var import_share_button = require("./components/share-button.js");
|
|
65
|
+
var import_collection_card = require("./components/collection-card.js");
|
|
66
|
+
var import_token_card = require("./components/token-card.js");
|
|
49
67
|
// Annotate the CommonJS export names for ESM import in node:
|
|
50
68
|
0 && (module.exports = {
|
|
51
69
|
AddressDisplay,
|
|
52
70
|
BRAND,
|
|
71
|
+
CollectionCard,
|
|
72
|
+
CollectionCardSkeleton,
|
|
53
73
|
CurrencyAmount,
|
|
54
74
|
CurrencyIcon,
|
|
75
|
+
EASE_OUT,
|
|
76
|
+
FadeIn,
|
|
55
77
|
IP_TYPE_CONFIG,
|
|
56
78
|
IP_TYPE_DATA,
|
|
57
79
|
IP_TYPE_DATA_MAP,
|
|
58
80
|
IP_TYPE_MAP,
|
|
59
81
|
IpTypeBadge,
|
|
82
|
+
KineticWords,
|
|
60
83
|
MedialaneIcon,
|
|
61
84
|
MedialaneLogoFull,
|
|
85
|
+
MotionCard,
|
|
86
|
+
SPRING,
|
|
87
|
+
ScrollSection,
|
|
88
|
+
ShareButton,
|
|
89
|
+
Stagger,
|
|
90
|
+
StaggerItem,
|
|
91
|
+
TokenCard,
|
|
92
|
+
TokenCardSkeleton,
|
|
62
93
|
cn,
|
|
63
94
|
formatDisplayPrice,
|
|
64
95
|
ipfsToHttp,
|
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"],"mappings":";;;;;;;;;;;;;;;;;;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;","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\";\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 { 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"],"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;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,0BAA4B;AAE5B,6BAAuD;AAEvD,wBAA6C;","names":[]}
|
package/dist/index.d.cts
CHANGED
|
@@ -9,5 +9,12 @@ export { IP_TYPE_CONFIG, IP_TYPE_MAP, IpTypeBadge, IpTypeBadgeProps, IpTypeConfi
|
|
|
9
9
|
export { AddressDisplay, AddressDisplayProps } from './components/address-display.cjs';
|
|
10
10
|
export { MedialaneIcon, MedialaneIconProps } from './components/brand-icon.cjs';
|
|
11
11
|
export { MedialaneLogoFull, MedialaneLogoFullProps } from './components/brand-logo.cjs';
|
|
12
|
+
export { EASE_OUT, FadeIn, KineticWords, MotionCard, SPRING, Stagger, StaggerItem } from './components/motion-primitives.cjs';
|
|
13
|
+
export { ScrollSection, ScrollSectionProps } from './components/scroll-section.cjs';
|
|
14
|
+
export { ShareButton, ShareButtonProps } from './components/share-button.cjs';
|
|
15
|
+
export { CollectionCard, CollectionCardProps, CollectionCardSkeleton } from './components/collection-card.cjs';
|
|
16
|
+
export { RarityTier, TokenCard, TokenCardProps, TokenCardSkeleton } from './components/token-card.cjs';
|
|
12
17
|
import 'clsx';
|
|
13
18
|
import 'react/jsx-runtime';
|
|
19
|
+
import 'framer-motion';
|
|
20
|
+
import '@medialane/sdk';
|
package/dist/index.d.ts
CHANGED
|
@@ -9,5 +9,12 @@ export { IP_TYPE_CONFIG, IP_TYPE_MAP, IpTypeBadge, IpTypeBadgeProps, IpTypeConfi
|
|
|
9
9
|
export { AddressDisplay, AddressDisplayProps } from './components/address-display.js';
|
|
10
10
|
export { MedialaneIcon, MedialaneIconProps } from './components/brand-icon.js';
|
|
11
11
|
export { MedialaneLogoFull, MedialaneLogoFullProps } from './components/brand-logo.js';
|
|
12
|
+
export { EASE_OUT, FadeIn, KineticWords, MotionCard, SPRING, Stagger, StaggerItem } from './components/motion-primitives.js';
|
|
13
|
+
export { ScrollSection, ScrollSectionProps } from './components/scroll-section.js';
|
|
14
|
+
export { ShareButton, ShareButtonProps } from './components/share-button.js';
|
|
15
|
+
export { CollectionCard, CollectionCardProps, CollectionCardSkeleton } from './components/collection-card.js';
|
|
16
|
+
export { RarityTier, TokenCard, TokenCardProps, TokenCardSkeleton } from './components/token-card.js';
|
|
12
17
|
import 'clsx';
|
|
13
18
|
import 'react/jsx-runtime';
|
|
19
|
+
import 'framer-motion';
|
|
20
|
+
import '@medialane/sdk';
|
package/dist/index.js
CHANGED
|
@@ -9,18 +9,36 @@ import { IpTypeBadge, IP_TYPE_CONFIG, IP_TYPE_MAP } from "./components/ip-type-b
|
|
|
9
9
|
import { AddressDisplay } from "./components/address-display.js";
|
|
10
10
|
import { MedialaneIcon } from "./components/brand-icon.js";
|
|
11
11
|
import { MedialaneLogoFull } from "./components/brand-logo.js";
|
|
12
|
+
import { MotionCard, FadeIn, Stagger, StaggerItem, KineticWords, SPRING, EASE_OUT } from "./components/motion-primitives.js";
|
|
13
|
+
import { ScrollSection } from "./components/scroll-section.js";
|
|
14
|
+
import { ShareButton } from "./components/share-button.js";
|
|
15
|
+
import { CollectionCard, CollectionCardSkeleton } from "./components/collection-card.js";
|
|
16
|
+
import { TokenCard, TokenCardSkeleton } from "./components/token-card.js";
|
|
12
17
|
export {
|
|
13
18
|
AddressDisplay,
|
|
14
19
|
BRAND,
|
|
20
|
+
CollectionCard,
|
|
21
|
+
CollectionCardSkeleton,
|
|
15
22
|
CurrencyAmount,
|
|
16
23
|
CurrencyIcon,
|
|
24
|
+
EASE_OUT,
|
|
25
|
+
FadeIn,
|
|
17
26
|
IP_TYPE_CONFIG,
|
|
18
27
|
IP_TYPE_DATA,
|
|
19
28
|
IP_TYPE_DATA_MAP,
|
|
20
29
|
IP_TYPE_MAP,
|
|
21
30
|
IpTypeBadge,
|
|
31
|
+
KineticWords,
|
|
22
32
|
MedialaneIcon,
|
|
23
33
|
MedialaneLogoFull,
|
|
34
|
+
MotionCard,
|
|
35
|
+
SPRING,
|
|
36
|
+
ScrollSection,
|
|
37
|
+
ShareButton,
|
|
38
|
+
Stagger,
|
|
39
|
+
StaggerItem,
|
|
40
|
+
TokenCard,
|
|
41
|
+
TokenCardSkeleton,
|
|
24
42
|
cn,
|
|
25
43
|
formatDisplayPrice,
|
|
26
44
|
ipfsToHttp,
|
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"],"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;","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\";\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 { 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"],"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,mBAAmB;AAE5B,SAAS,gBAAgB,8BAA8B;AAEvD,SAAS,WAAW,yBAAyB;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@medialane/ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Shared UI components for Medialane apps",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -35,20 +35,26 @@
|
|
|
35
35
|
"next-themes": ">=0.3.0",
|
|
36
36
|
"lucide-react": ">=0.400.0",
|
|
37
37
|
"tailwind-merge": ">=2.0.0",
|
|
38
|
-
"clsx": ">=2.0.0"
|
|
38
|
+
"clsx": ">=2.0.0",
|
|
39
|
+
"framer-motion": ">=10.0.0",
|
|
40
|
+
"sonner": ">=1.0.0",
|
|
41
|
+
"@medialane/sdk": ">=0.6.0"
|
|
39
42
|
},
|
|
40
43
|
"devDependencies": {
|
|
41
|
-
"
|
|
42
|
-
"react
|
|
44
|
+
"@medialane/sdk": "^0.6.7",
|
|
45
|
+
"@types/react": "^19.0.0",
|
|
46
|
+
"@types/react-dom": "^19.0.0",
|
|
47
|
+
"clsx": "^2.0.0",
|
|
48
|
+
"framer-motion": "^11.0.0",
|
|
49
|
+
"lucide-react": "^0.400.0",
|
|
43
50
|
"next": "^15.0.0",
|
|
44
51
|
"next-themes": "^0.4.0",
|
|
45
|
-
"
|
|
52
|
+
"react": "^19.0.0",
|
|
53
|
+
"react-dom": "^19.0.0",
|
|
54
|
+
"sonner": "^1.5.0",
|
|
46
55
|
"tailwind-merge": "^2.0.0",
|
|
47
|
-
"clsx": "^2.0.0",
|
|
48
56
|
"tailwindcss": "^3.0.0",
|
|
49
57
|
"tsup": "^8.0.0",
|
|
50
|
-
"typescript": "^5.6.0"
|
|
51
|
-
"@types/react": "^19.0.0",
|
|
52
|
-
"@types/react-dom": "^19.0.0"
|
|
58
|
+
"typescript": "^5.6.0"
|
|
53
59
|
}
|
|
54
60
|
}
|