@medialane/ui 0.1.6 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/dist/components/activity-feed-shell.cjs +90 -0
  2. package/dist/components/activity-feed-shell.cjs.map +1 -0
  3. package/dist/components/activity-feed-shell.d.cts +13 -0
  4. package/dist/components/activity-feed-shell.d.ts +13 -0
  5. package/dist/components/activity-feed-shell.js +56 -0
  6. package/dist/components/activity-feed-shell.js.map +1 -0
  7. package/dist/components/activity-row.cjs +95 -0
  8. package/dist/components/activity-row.cjs.map +1 -0
  9. package/dist/components/activity-row.d.cts +20 -0
  10. package/dist/components/activity-row.d.ts +20 -0
  11. package/dist/components/activity-row.js +61 -0
  12. package/dist/components/activity-row.js.map +1 -0
  13. package/dist/components/activity-ticker.cjs +92 -0
  14. package/dist/components/activity-ticker.cjs.map +1 -0
  15. package/dist/components/activity-ticker.d.cts +12 -0
  16. package/dist/components/activity-ticker.d.ts +12 -0
  17. package/dist/components/activity-ticker.js +58 -0
  18. package/dist/components/activity-ticker.js.map +1 -0
  19. package/dist/components/collection-card.cjs +124 -0
  20. package/dist/components/collection-card.cjs.map +1 -0
  21. package/dist/components/collection-card.d.cts +13 -0
  22. package/dist/components/collection-card.d.ts +13 -0
  23. package/dist/components/collection-card.js +89 -0
  24. package/dist/components/collection-card.js.map +1 -0
  25. package/dist/components/cta-card-grid.cjs +67 -0
  26. package/dist/components/cta-card-grid.cjs.map +1 -0
  27. package/dist/components/cta-card-grid.d.cts +23 -0
  28. package/dist/components/cta-card-grid.d.ts +23 -0
  29. package/dist/components/cta-card-grid.js +33 -0
  30. package/dist/components/cta-card-grid.js.map +1 -0
  31. package/dist/components/hero-slider.cjs +133 -0
  32. package/dist/components/hero-slider.cjs.map +1 -0
  33. package/dist/components/hero-slider.d.cts +12 -0
  34. package/dist/components/hero-slider.d.ts +12 -0
  35. package/dist/components/hero-slider.js +98 -0
  36. package/dist/components/hero-slider.js.map +1 -0
  37. package/dist/components/launchpad-grid.cjs +77 -0
  38. package/dist/components/launchpad-grid.cjs.map +1 -0
  39. package/dist/components/launchpad-grid.d.cts +20 -0
  40. package/dist/components/launchpad-grid.d.ts +20 -0
  41. package/dist/components/launchpad-grid.js +43 -0
  42. package/dist/components/launchpad-grid.js.map +1 -0
  43. package/dist/components/listing-card.cjs +146 -0
  44. package/dist/components/listing-card.cjs.map +1 -0
  45. package/dist/components/listing-card.d.cts +16 -0
  46. package/dist/components/listing-card.d.ts +16 -0
  47. package/dist/components/listing-card.js +111 -0
  48. package/dist/components/listing-card.js.map +1 -0
  49. package/dist/components/motion-primitives.cjs +126 -0
  50. package/dist/components/motion-primitives.cjs.map +1 -0
  51. package/dist/components/motion-primitives.d.cts +36 -0
  52. package/dist/components/motion-primitives.d.ts +36 -0
  53. package/dist/components/motion-primitives.js +96 -0
  54. package/dist/components/motion-primitives.js.map +1 -0
  55. package/dist/components/scroll-section.cjs +72 -0
  56. package/dist/components/scroll-section.cjs.map +1 -0
  57. package/dist/components/scroll-section.d.cts +18 -0
  58. package/dist/components/scroll-section.d.ts +18 -0
  59. package/dist/components/scroll-section.js +38 -0
  60. package/dist/components/scroll-section.js.map +1 -0
  61. package/dist/components/share-button.cjs +86 -0
  62. package/dist/components/share-button.cjs.map +1 -0
  63. package/dist/components/share-button.d.cts +12 -0
  64. package/dist/components/share-button.d.ts +12 -0
  65. package/dist/components/share-button.js +62 -0
  66. package/dist/components/share-button.js.map +1 -0
  67. package/dist/components/token-card.cjs +281 -0
  68. package/dist/components/token-card.cjs.map +1 -0
  69. package/dist/components/token-card.d.cts +31 -0
  70. package/dist/components/token-card.d.ts +31 -0
  71. package/dist/components/token-card.js +256 -0
  72. package/dist/components/token-card.js.map +1 -0
  73. package/dist/data/activity.cjs +48 -0
  74. package/dist/data/activity.cjs.map +1 -0
  75. package/dist/data/activity.d.cts +16 -0
  76. package/dist/data/activity.d.ts +16 -0
  77. package/dist/data/activity.js +23 -0
  78. package/dist/data/activity.js.map +1 -0
  79. package/dist/index.cjs +66 -2
  80. package/dist/index.cjs.map +1 -1
  81. package/dist/index.d.cts +18 -0
  82. package/dist/index.d.ts +18 -0
  83. package/dist/index.js +40 -1
  84. package/dist/index.js.map +1 -1
  85. package/dist/medialane.css +184 -0
  86. package/dist/utils/time.cjs +42 -0
  87. package/dist/utils/time.cjs.map +1 -0
  88. package/dist/utils/time.d.cts +7 -0
  89. package/dist/utils/time.d.ts +7 -0
  90. package/dist/utils/time.js +18 -0
  91. package/dist/utils/time.js.map +1 -0
  92. package/package.json +17 -10
@@ -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":[]}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var activity_exports = {};
20
+ __export(activity_exports, {
21
+ ACTIVITY_TYPE_CONFIG: () => ACTIVITY_TYPE_CONFIG,
22
+ TYPE_FILTERS: () => TYPE_FILTERS
23
+ });
24
+ module.exports = __toCommonJS(activity_exports);
25
+ var import_lucide_react = require("lucide-react");
26
+ const ACTIVITY_TYPE_CONFIG = {
27
+ mint: { label: "Mint", variant: "default", icon: import_lucide_react.Sparkles, colorClass: "text-emerald-400", bgClass: "bg-emerald-500/10" },
28
+ transfer: { label: "Transfer", variant: "secondary", icon: import_lucide_react.ArrowRightLeft, colorClass: "text-slate-400", bgClass: "bg-slate-500/10" },
29
+ listing: { label: "Listed", variant: "default", icon: import_lucide_react.Tag, colorClass: "text-sky-400", bgClass: "bg-sky-500/10" },
30
+ sale: { label: "Sale", variant: "default", icon: import_lucide_react.ShoppingCart, colorClass: "text-violet-400", bgClass: "bg-violet-500/10" },
31
+ offer: { label: "Offer", variant: "outline", icon: import_lucide_react.HandCoins, colorClass: "text-amber-400", bgClass: "bg-amber-500/10" },
32
+ cancelled: { label: "Cancelled", variant: "outline", icon: import_lucide_react.X, colorClass: "text-rose-400", bgClass: "bg-rose-500/10" }
33
+ };
34
+ const TYPE_FILTERS = [
35
+ { label: "All", value: "" },
36
+ { label: "Mints", value: "mint" },
37
+ { label: "Sales", value: "sale" },
38
+ { label: "Listings", value: "listing" },
39
+ { label: "Offers", value: "offer" },
40
+ { label: "Transfers", value: "transfer" },
41
+ { label: "Cancelled", value: "cancelled" }
42
+ ];
43
+ // Annotate the CommonJS export names for ESM import in node:
44
+ 0 && (module.exports = {
45
+ ACTIVITY_TYPE_CONFIG,
46
+ TYPE_FILTERS
47
+ });
48
+ //# sourceMappingURL=activity.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/data/activity.ts"],"sourcesContent":["import { ArrowRightLeft, Tag, ShoppingCart, HandCoins, X, Sparkles } from \"lucide-react\";\nimport type { ElementType } from \"react\";\n\nexport interface ActivityTypeConfig {\n label: string;\n variant: \"default\" | \"secondary\" | \"outline\";\n icon: ElementType;\n colorClass: string;\n bgClass: string;\n}\n\nexport const ACTIVITY_TYPE_CONFIG: Record<string, ActivityTypeConfig> = {\n mint: { label: \"Mint\", variant: \"default\", icon: Sparkles, colorClass: \"text-emerald-400\", bgClass: \"bg-emerald-500/10\" },\n transfer: { label: \"Transfer\", variant: \"secondary\", icon: ArrowRightLeft, colorClass: \"text-slate-400\", bgClass: \"bg-slate-500/10\" },\n listing: { label: \"Listed\", variant: \"default\", icon: Tag, colorClass: \"text-sky-400\", bgClass: \"bg-sky-500/10\" },\n sale: { label: \"Sale\", variant: \"default\", icon: ShoppingCart, colorClass: \"text-violet-400\", bgClass: \"bg-violet-500/10\" },\n offer: { label: \"Offer\", variant: \"outline\", icon: HandCoins, colorClass: \"text-amber-400\", bgClass: \"bg-amber-500/10\" },\n cancelled: { label: \"Cancelled\", variant: \"outline\", icon: X, colorClass: \"text-rose-400\", bgClass: \"bg-rose-500/10\" },\n};\n\nexport const TYPE_FILTERS = [\n { label: \"All\", value: \"\" },\n { label: \"Mints\", value: \"mint\" },\n { label: \"Sales\", value: \"sale\" },\n { label: \"Listings\", value: \"listing\" },\n { label: \"Offers\", value: \"offer\" },\n { label: \"Transfers\", value: \"transfer\" },\n { label: \"Cancelled\", value: \"cancelled\" },\n];\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAA0E;AAWnE,MAAM,uBAA2D;AAAA,EACtE,MAAW,EAAE,OAAO,QAAa,SAAS,WAAa,MAAM,8BAAgB,YAAY,oBAAoB,SAAS,oBAAoB;AAAA,EAC1I,UAAW,EAAE,OAAO,YAAa,SAAS,aAAa,MAAM,oCAAgB,YAAY,kBAAoB,SAAS,kBAAkB;AAAA,EACxI,SAAW,EAAE,OAAO,UAAa,SAAS,WAAa,MAAM,yBAAgB,YAAY,gBAAoB,SAAS,gBAAgB;AAAA,EACtI,MAAW,EAAE,OAAO,QAAa,SAAS,WAAa,MAAM,kCAAgB,YAAY,mBAAoB,SAAS,mBAAmB;AAAA,EACzI,OAAW,EAAE,OAAO,SAAa,SAAS,WAAa,MAAM,+BAAgB,YAAY,kBAAoB,SAAS,kBAAkB;AAAA,EACxI,WAAW,EAAE,OAAO,aAAa,SAAS,WAAa,MAAM,uBAAgB,YAAY,iBAAoB,SAAS,iBAAiB;AACzI;AAEO,MAAM,eAAe;AAAA,EAC1B,EAAE,OAAO,OAAa,OAAO,GAAG;AAAA,EAChC,EAAE,OAAO,SAAa,OAAO,OAAO;AAAA,EACpC,EAAE,OAAO,SAAa,OAAO,OAAO;AAAA,EACpC,EAAE,OAAO,YAAa,OAAO,UAAU;AAAA,EACvC,EAAE,OAAO,UAAa,OAAO,QAAQ;AAAA,EACrC,EAAE,OAAO,aAAa,OAAO,WAAW;AAAA,EACxC,EAAE,OAAO,aAAa,OAAO,YAAY;AAC3C;","names":[]}
@@ -0,0 +1,16 @@
1
+ import { ElementType } from 'react';
2
+
3
+ interface ActivityTypeConfig {
4
+ label: string;
5
+ variant: "default" | "secondary" | "outline";
6
+ icon: ElementType;
7
+ colorClass: string;
8
+ bgClass: string;
9
+ }
10
+ declare const ACTIVITY_TYPE_CONFIG: Record<string, ActivityTypeConfig>;
11
+ declare const TYPE_FILTERS: {
12
+ label: string;
13
+ value: string;
14
+ }[];
15
+
16
+ export { ACTIVITY_TYPE_CONFIG, type ActivityTypeConfig, TYPE_FILTERS };
@@ -0,0 +1,16 @@
1
+ import { ElementType } from 'react';
2
+
3
+ interface ActivityTypeConfig {
4
+ label: string;
5
+ variant: "default" | "secondary" | "outline";
6
+ icon: ElementType;
7
+ colorClass: string;
8
+ bgClass: string;
9
+ }
10
+ declare const ACTIVITY_TYPE_CONFIG: Record<string, ActivityTypeConfig>;
11
+ declare const TYPE_FILTERS: {
12
+ label: string;
13
+ value: string;
14
+ }[];
15
+
16
+ export { ACTIVITY_TYPE_CONFIG, type ActivityTypeConfig, TYPE_FILTERS };
@@ -0,0 +1,23 @@
1
+ import { ArrowRightLeft, Tag, ShoppingCart, HandCoins, X, Sparkles } from "lucide-react";
2
+ const ACTIVITY_TYPE_CONFIG = {
3
+ mint: { label: "Mint", variant: "default", icon: Sparkles, colorClass: "text-emerald-400", bgClass: "bg-emerald-500/10" },
4
+ transfer: { label: "Transfer", variant: "secondary", icon: ArrowRightLeft, colorClass: "text-slate-400", bgClass: "bg-slate-500/10" },
5
+ listing: { label: "Listed", variant: "default", icon: Tag, colorClass: "text-sky-400", bgClass: "bg-sky-500/10" },
6
+ sale: { label: "Sale", variant: "default", icon: ShoppingCart, colorClass: "text-violet-400", bgClass: "bg-violet-500/10" },
7
+ offer: { label: "Offer", variant: "outline", icon: HandCoins, colorClass: "text-amber-400", bgClass: "bg-amber-500/10" },
8
+ cancelled: { label: "Cancelled", variant: "outline", icon: X, colorClass: "text-rose-400", bgClass: "bg-rose-500/10" }
9
+ };
10
+ const TYPE_FILTERS = [
11
+ { label: "All", value: "" },
12
+ { label: "Mints", value: "mint" },
13
+ { label: "Sales", value: "sale" },
14
+ { label: "Listings", value: "listing" },
15
+ { label: "Offers", value: "offer" },
16
+ { label: "Transfers", value: "transfer" },
17
+ { label: "Cancelled", value: "cancelled" }
18
+ ];
19
+ export {
20
+ ACTIVITY_TYPE_CONFIG,
21
+ TYPE_FILTERS
22
+ };
23
+ //# sourceMappingURL=activity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/data/activity.ts"],"sourcesContent":["import { ArrowRightLeft, Tag, ShoppingCart, HandCoins, X, Sparkles } from \"lucide-react\";\nimport type { ElementType } from \"react\";\n\nexport interface ActivityTypeConfig {\n label: string;\n variant: \"default\" | \"secondary\" | \"outline\";\n icon: ElementType;\n colorClass: string;\n bgClass: string;\n}\n\nexport const ACTIVITY_TYPE_CONFIG: Record<string, ActivityTypeConfig> = {\n mint: { label: \"Mint\", variant: \"default\", icon: Sparkles, colorClass: \"text-emerald-400\", bgClass: \"bg-emerald-500/10\" },\n transfer: { label: \"Transfer\", variant: \"secondary\", icon: ArrowRightLeft, colorClass: \"text-slate-400\", bgClass: \"bg-slate-500/10\" },\n listing: { label: \"Listed\", variant: \"default\", icon: Tag, colorClass: \"text-sky-400\", bgClass: \"bg-sky-500/10\" },\n sale: { label: \"Sale\", variant: \"default\", icon: ShoppingCart, colorClass: \"text-violet-400\", bgClass: \"bg-violet-500/10\" },\n offer: { label: \"Offer\", variant: \"outline\", icon: HandCoins, colorClass: \"text-amber-400\", bgClass: \"bg-amber-500/10\" },\n cancelled: { label: \"Cancelled\", variant: \"outline\", icon: X, colorClass: \"text-rose-400\", bgClass: \"bg-rose-500/10\" },\n};\n\nexport const TYPE_FILTERS = [\n { label: \"All\", value: \"\" },\n { label: \"Mints\", value: \"mint\" },\n { label: \"Sales\", value: \"sale\" },\n { label: \"Listings\", value: \"listing\" },\n { label: \"Offers\", value: \"offer\" },\n { label: \"Transfers\", value: \"transfer\" },\n { label: \"Cancelled\", value: \"cancelled\" },\n];\n"],"mappings":"AAAA,SAAS,gBAAgB,KAAK,cAAc,WAAW,GAAG,gBAAgB;AAWnE,MAAM,uBAA2D;AAAA,EACtE,MAAW,EAAE,OAAO,QAAa,SAAS,WAAa,MAAM,UAAgB,YAAY,oBAAoB,SAAS,oBAAoB;AAAA,EAC1I,UAAW,EAAE,OAAO,YAAa,SAAS,aAAa,MAAM,gBAAgB,YAAY,kBAAoB,SAAS,kBAAkB;AAAA,EACxI,SAAW,EAAE,OAAO,UAAa,SAAS,WAAa,MAAM,KAAgB,YAAY,gBAAoB,SAAS,gBAAgB;AAAA,EACtI,MAAW,EAAE,OAAO,QAAa,SAAS,WAAa,MAAM,cAAgB,YAAY,mBAAoB,SAAS,mBAAmB;AAAA,EACzI,OAAW,EAAE,OAAO,SAAa,SAAS,WAAa,MAAM,WAAgB,YAAY,kBAAoB,SAAS,kBAAkB;AAAA,EACxI,WAAW,EAAE,OAAO,aAAa,SAAS,WAAa,MAAM,GAAgB,YAAY,iBAAoB,SAAS,iBAAiB;AACzI;AAEO,MAAM,eAAe;AAAA,EAC1B,EAAE,OAAO,OAAa,OAAO,GAAG;AAAA,EAChC,EAAE,OAAO,SAAa,OAAO,OAAO;AAAA,EACpC,EAAE,OAAO,SAAa,OAAO,OAAO;AAAA,EACpC,EAAE,OAAO,YAAa,OAAO,UAAU;AAAA,EACvC,EAAE,OAAO,UAAa,OAAO,QAAQ;AAAA,EACrC,EAAE,OAAO,aAAa,OAAO,WAAW;AAAA,EACxC,EAAE,OAAO,aAAa,OAAO,YAAY;AAC3C;","names":[]}
package/dist/index.cjs CHANGED
@@ -18,21 +18,46 @@ 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_TYPE_CONFIG: () => import_activity.ACTIVITY_TYPE_CONFIG,
22
+ ActivityFeedShell: () => import_activity_feed_shell.ActivityFeedShell,
23
+ ActivityRow: () => import_activity_row.ActivityRow,
24
+ ActivityTicker: () => import_activity_ticker.ActivityTicker,
21
25
  AddressDisplay: () => import_address_display.AddressDisplay,
22
26
  BRAND: () => import_brand.BRAND,
27
+ CollectionCard: () => import_collection_card.CollectionCard,
28
+ CollectionCardSkeleton: () => import_collection_card.CollectionCardSkeleton,
29
+ CtaCardGrid: () => import_cta_card_grid.CtaCardGrid,
23
30
  CurrencyAmount: () => import_currency_icon.CurrencyAmount,
24
31
  CurrencyIcon: () => import_currency_icon.CurrencyIcon,
32
+ EASE_OUT: () => import_motion_primitives.EASE_OUT,
33
+ FadeIn: () => import_motion_primitives.FadeIn,
34
+ HeroSlider: () => import_hero_slider.HeroSlider,
35
+ HeroSliderSkeleton: () => import_hero_slider.HeroSliderSkeleton,
25
36
  IP_TYPE_CONFIG: () => import_ip_type_badge.IP_TYPE_CONFIG,
26
37
  IP_TYPE_DATA: () => import_ip_types.IP_TYPE_DATA,
27
38
  IP_TYPE_DATA_MAP: () => import_ip_types.IP_TYPE_DATA_MAP,
28
39
  IP_TYPE_MAP: () => import_ip_type_badge.IP_TYPE_MAP,
29
40
  IpTypeBadge: () => import_ip_type_badge.IpTypeBadge,
41
+ KineticWords: () => import_motion_primitives.KineticWords,
42
+ LaunchpadGrid: () => import_launchpad_grid.LaunchpadGrid,
43
+ ListingCard: () => import_listing_card.ListingCard,
44
+ ListingCardSkeleton: () => import_listing_card.ListingCardSkeleton,
30
45
  MedialaneIcon: () => import_brand_icon.MedialaneIcon,
31
46
  MedialaneLogoFull: () => import_brand_logo.MedialaneLogoFull,
47
+ MotionCard: () => import_motion_primitives.MotionCard,
48
+ SPRING: () => import_motion_primitives.SPRING,
49
+ ScrollSection: () => import_scroll_section.ScrollSection,
50
+ ShareButton: () => import_share_button.ShareButton,
51
+ Stagger: () => import_motion_primitives.Stagger,
52
+ StaggerItem: () => import_motion_primitives.StaggerItem,
53
+ TYPE_FILTERS: () => import_activity.TYPE_FILTERS,
54
+ TokenCard: () => import_token_card.TokenCard,
55
+ TokenCardSkeleton: () => import_token_card.TokenCardSkeleton,
32
56
  cn: () => import_cn.cn,
33
57
  formatDisplayPrice: () => import_format.formatDisplayPrice,
34
58
  ipfsToHttp: () => import_ipfs.ipfsToHttp,
35
- shortenAddress: () => import_address.shortenAddress
59
+ shortenAddress: () => import_address.shortenAddress,
60
+ timeAgo: () => import_time.timeAgo
36
61
  });
37
62
  module.exports = __toCommonJS(index_exports);
38
63
  var import_cn = require("./utils/cn.js");
@@ -46,22 +71,61 @@ var import_ip_type_badge = require("./components/ip-type-badge.js");
46
71
  var import_address_display = require("./components/address-display.js");
47
72
  var import_brand_icon = require("./components/brand-icon.js");
48
73
  var import_brand_logo = require("./components/brand-logo.js");
74
+ var import_motion_primitives = require("./components/motion-primitives.js");
75
+ var import_scroll_section = require("./components/scroll-section.js");
76
+ var import_share_button = require("./components/share-button.js");
77
+ var import_collection_card = require("./components/collection-card.js");
78
+ var import_token_card = require("./components/token-card.js");
79
+ var import_time = require("./utils/time.js");
80
+ var import_activity = require("./data/activity.js");
81
+ var import_hero_slider = require("./components/hero-slider.js");
82
+ var import_activity_ticker = require("./components/activity-ticker.js");
83
+ var import_listing_card = require("./components/listing-card.js");
84
+ var import_activity_row = require("./components/activity-row.js");
85
+ var import_activity_feed_shell = require("./components/activity-feed-shell.js");
86
+ var import_launchpad_grid = require("./components/launchpad-grid.js");
87
+ var import_cta_card_grid = require("./components/cta-card-grid.js");
49
88
  // Annotate the CommonJS export names for ESM import in node:
50
89
  0 && (module.exports = {
90
+ ACTIVITY_TYPE_CONFIG,
91
+ ActivityFeedShell,
92
+ ActivityRow,
93
+ ActivityTicker,
51
94
  AddressDisplay,
52
95
  BRAND,
96
+ CollectionCard,
97
+ CollectionCardSkeleton,
98
+ CtaCardGrid,
53
99
  CurrencyAmount,
54
100
  CurrencyIcon,
101
+ EASE_OUT,
102
+ FadeIn,
103
+ HeroSlider,
104
+ HeroSliderSkeleton,
55
105
  IP_TYPE_CONFIG,
56
106
  IP_TYPE_DATA,
57
107
  IP_TYPE_DATA_MAP,
58
108
  IP_TYPE_MAP,
59
109
  IpTypeBadge,
110
+ KineticWords,
111
+ LaunchpadGrid,
112
+ ListingCard,
113
+ ListingCardSkeleton,
60
114
  MedialaneIcon,
61
115
  MedialaneLogoFull,
116
+ MotionCard,
117
+ SPRING,
118
+ ScrollSection,
119
+ ShareButton,
120
+ Stagger,
121
+ StaggerItem,
122
+ TYPE_FILTERS,
123
+ TokenCard,
124
+ TokenCardSkeleton,
62
125
  cn,
63
126
  formatDisplayPrice,
64
127
  ipfsToHttp,
65
- shortenAddress
128
+ shortenAddress,
129
+ timeAgo
66
130
  });
67
131
  //# sourceMappingURL=index.cjs.map
@@ -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\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 { LaunchpadGrid } from \"./components/launchpad-grid.js\";\nexport type { LaunchpadGridProps, FeatureItem } from \"./components/launchpad-grid.js\";\nexport { CtaCardGrid } from \"./components/cta-card-grid.js\";\nexport type { CtaCardGridProps, CtaCardItem } from \"./components/cta-card-grid.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;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;AAI7C,kBAAwB;AACxB,sBAAmD;AAEnD,yBAA+C;AAE/C,6BAA+B;AAE/B,0BAAiD;AAEjD,0BAA4B;AAE5B,iCAAkC;AAElC,4BAA8B;AAE9B,2BAA4B;","names":[]}
package/dist/index.d.cts CHANGED
@@ -9,5 +9,23 @@ 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';
17
+ export { timeAgo } from './utils/time.cjs';
18
+ export { ACTIVITY_TYPE_CONFIG, ActivityTypeConfig, TYPE_FILTERS } from './data/activity.cjs';
19
+ export { HeroSlider, HeroSliderProps, HeroSliderSkeleton } from './components/hero-slider.cjs';
20
+ export { ActivityTicker, ActivityTickerProps } from './components/activity-ticker.cjs';
21
+ export { ListingCard, ListingCardProps, ListingCardSkeleton } from './components/listing-card.cjs';
22
+ export { ActivityRow, ActivityRowProps } from './components/activity-row.cjs';
23
+ export { ActivityFeedShell, ActivityFeedShellProps } from './components/activity-feed-shell.cjs';
24
+ export { FeatureItem, LaunchpadGrid, LaunchpadGridProps } from './components/launchpad-grid.cjs';
25
+ export { CtaCardGrid, CtaCardGridProps, CtaCardItem } from './components/cta-card-grid.cjs';
12
26
  import 'clsx';
13
27
  import 'react/jsx-runtime';
28
+ import 'framer-motion';
29
+ import '@medialane/sdk';
30
+ import 'react';
31
+ import 'lucide-react';
package/dist/index.d.ts CHANGED
@@ -9,5 +9,23 @@ 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';
17
+ export { timeAgo } from './utils/time.js';
18
+ export { ACTIVITY_TYPE_CONFIG, ActivityTypeConfig, TYPE_FILTERS } from './data/activity.js';
19
+ export { HeroSlider, HeroSliderProps, HeroSliderSkeleton } from './components/hero-slider.js';
20
+ export { ActivityTicker, ActivityTickerProps } from './components/activity-ticker.js';
21
+ export { ListingCard, ListingCardProps, ListingCardSkeleton } from './components/listing-card.js';
22
+ export { ActivityRow, ActivityRowProps } from './components/activity-row.js';
23
+ export { ActivityFeedShell, ActivityFeedShellProps } from './components/activity-feed-shell.js';
24
+ export { FeatureItem, LaunchpadGrid, LaunchpadGridProps } from './components/launchpad-grid.js';
25
+ export { CtaCardGrid, CtaCardGridProps, CtaCardItem } from './components/cta-card-grid.js';
12
26
  import 'clsx';
13
27
  import 'react/jsx-runtime';
28
+ import 'framer-motion';
29
+ import '@medialane/sdk';
30
+ import 'react';
31
+ import 'lucide-react';
package/dist/index.js CHANGED
@@ -9,21 +9,60 @@ 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";
17
+ import { timeAgo } from "./utils/time.js";
18
+ import { ACTIVITY_TYPE_CONFIG, TYPE_FILTERS } from "./data/activity.js";
19
+ import { HeroSlider, HeroSliderSkeleton } from "./components/hero-slider.js";
20
+ import { ActivityTicker } from "./components/activity-ticker.js";
21
+ import { ListingCard, ListingCardSkeleton } from "./components/listing-card.js";
22
+ import { ActivityRow } from "./components/activity-row.js";
23
+ import { ActivityFeedShell } from "./components/activity-feed-shell.js";
24
+ import { LaunchpadGrid } from "./components/launchpad-grid.js";
25
+ import { CtaCardGrid } from "./components/cta-card-grid.js";
12
26
  export {
27
+ ACTIVITY_TYPE_CONFIG,
28
+ ActivityFeedShell,
29
+ ActivityRow,
30
+ ActivityTicker,
13
31
  AddressDisplay,
14
32
  BRAND,
33
+ CollectionCard,
34
+ CollectionCardSkeleton,
35
+ CtaCardGrid,
15
36
  CurrencyAmount,
16
37
  CurrencyIcon,
38
+ EASE_OUT,
39
+ FadeIn,
40
+ HeroSlider,
41
+ HeroSliderSkeleton,
17
42
  IP_TYPE_CONFIG,
18
43
  IP_TYPE_DATA,
19
44
  IP_TYPE_DATA_MAP,
20
45
  IP_TYPE_MAP,
21
46
  IpTypeBadge,
47
+ KineticWords,
48
+ LaunchpadGrid,
49
+ ListingCard,
50
+ ListingCardSkeleton,
22
51
  MedialaneIcon,
23
52
  MedialaneLogoFull,
53
+ MotionCard,
54
+ SPRING,
55
+ ScrollSection,
56
+ ShareButton,
57
+ Stagger,
58
+ StaggerItem,
59
+ TYPE_FILTERS,
60
+ TokenCard,
61
+ TokenCardSkeleton,
24
62
  cn,
25
63
  formatDisplayPrice,
26
64
  ipfsToHttp,
27
- shortenAddress
65
+ shortenAddress,
66
+ timeAgo
28
67
  };
29
68
  //# sourceMappingURL=index.js.map
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\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 { LaunchpadGrid } from \"./components/launchpad-grid.js\";\nexport type { LaunchpadGridProps, FeatureItem } from \"./components/launchpad-grid.js\";\nexport { CtaCardGrid } from \"./components/cta-card-grid.js\";\nexport type { CtaCardGridProps, CtaCardItem } from \"./components/cta-card-grid.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;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,qBAAqB;AAE9B,SAAS,mBAAmB;","names":[]}
@@ -0,0 +1,184 @@
1
+ /* Medialane Design System — shared CSS
2
+ Imported by apps via: import "@medialane/ui/styles"
3
+ Do NOT import @tailwind directives here — apps handle that.
4
+ All classes here are pure CSS, no @apply. */
5
+
6
+ /* ── Scrollbars ───────────────────────────────────────────────────────── */
7
+ ::-webkit-scrollbar { width: 4px; height: 4px; }
8
+ ::-webkit-scrollbar-track { background: transparent; }
9
+ ::-webkit-scrollbar-thumb { background: hsl(var(--border)); border-radius: 4px; }
10
+ .scrollbar-none { scrollbar-width: none; }
11
+ .scrollbar-none::-webkit-scrollbar { display: none; }
12
+ .scrollbar-hide { scrollbar-width: none; }
13
+ .scrollbar-hide::-webkit-scrollbar { display: none; }
14
+
15
+ /* ── Glass ────────────────────────────────────────────────────────────── */
16
+ .glass {
17
+ background: rgba(10, 14, 30, 0.60);
18
+ backdrop-filter: blur(16px);
19
+ -webkit-backdrop-filter: blur(16px);
20
+ border: 1px solid rgba(255, 255, 255, 0.06);
21
+ }
22
+ .glass-light {
23
+ background: rgba(255, 255, 255, 0.80);
24
+ backdrop-filter: blur(16px);
25
+ -webkit-backdrop-filter: blur(16px);
26
+ border: 1px solid rgba(255, 255, 255, 0.5);
27
+ }
28
+
29
+ /* ── Typography gradients ─────────────────────────────────────────────── */
30
+ .gradient-text {
31
+ background: linear-gradient(135deg, #a855f7 0%, #6366f1 40%, #2563eb 100%);
32
+ -webkit-background-clip: text;
33
+ -webkit-text-fill-color: transparent;
34
+ background-clip: text;
35
+ }
36
+ .gradient-text-warm {
37
+ background: linear-gradient(135deg, #f43f5e 0%, #ea580c 60%, #f59e0b 100%);
38
+ -webkit-background-clip: text;
39
+ -webkit-text-fill-color: transparent;
40
+ background-clip: text;
41
+ }
42
+ .gradient-text-gold {
43
+ background: linear-gradient(135deg, #fbbf24 0%, #f59e0b 50%, #ea580c 100%);
44
+ -webkit-background-clip: text;
45
+ -webkit-text-fill-color: transparent;
46
+ background-clip: text;
47
+ }
48
+
49
+ /* ── Price ────────────────────────────────────────────────────────────── */
50
+ .price-value {
51
+ color: hsl(var(--price));
52
+ font-weight: 700;
53
+ font-variant-numeric: tabular-nums;
54
+ }
55
+
56
+ /* ── Section label ────────────────────────────────────────────────────── */
57
+ .section-label {
58
+ font-size: 0.625rem;
59
+ font-weight: 700;
60
+ letter-spacing: 0.14em;
61
+ text-transform: uppercase;
62
+ color: hsl(var(--muted-foreground));
63
+ }
64
+
65
+ /* ── Pill badge ───────────────────────────────────────────────────────── */
66
+ .pill-badge {
67
+ display: inline-flex;
68
+ align-items: center;
69
+ gap: 0.375rem;
70
+ border-radius: 9999px;
71
+ border: 1px solid hsl(var(--primary) / 0.25);
72
+ background: hsl(var(--primary) / 0.08);
73
+ padding: 0.25rem 0.875rem;
74
+ font-size: 0.6875rem;
75
+ font-weight: 700;
76
+ letter-spacing: 0.1em;
77
+ text-transform: uppercase;
78
+ color: hsl(var(--primary));
79
+ }
80
+
81
+ /* ── Aurora blobs ─────────────────────────────────────────────────────── */
82
+ .aurora-purple { position: absolute; border-radius: 9999px; background: #9333ea; filter: blur(100px); opacity: 0.07; }
83
+ .aurora-blue { position: absolute; border-radius: 9999px; background: #2563eb; filter: blur(120px); opacity: 0.06; }
84
+ .aurora-rose { position: absolute; border-radius: 9999px; background: #f43f5e; filter: blur(100px); opacity: 0.05; }
85
+ .aurora-orange { position: absolute; border-radius: 9999px; background: #ea580c; filter: blur(110px); opacity: 0.04; }
86
+ .dark .aurora-purple { opacity: 0.15; }
87
+ .dark .aurora-blue { opacity: 0.11; }
88
+ .dark .aurora-rose { opacity: 0.09; }
89
+ .dark .aurora-orange { opacity: 0.07; }
90
+
91
+ /* ── Card primitives ──────────────────────────────────────────────────── */
92
+ .card-base {
93
+ border-radius: calc(var(--radius) * 1.25);
94
+ border: 1px solid hsl(var(--border));
95
+ background: hsl(var(--card));
96
+ overflow: hidden;
97
+ will-change: transform;
98
+ }
99
+ .bento-cell {
100
+ border-radius: calc(var(--radius) * 1.25);
101
+ border: 1px solid hsl(var(--border));
102
+ background: hsl(var(--card));
103
+ overflow: hidden;
104
+ position: relative;
105
+ }
106
+
107
+ /* ── Background grid ──────────────────────────────────────────────────── */
108
+ .bg-grid {
109
+ background-image:
110
+ linear-gradient(hsl(var(--border) / 0.4) 1px, transparent 1px),
111
+ linear-gradient(90deg, hsl(var(--border) / 0.4) 1px, transparent 1px);
112
+ background-size: 48px 48px;
113
+ }
114
+
115
+ /* ── Snap scroll ──────────────────────────────────────────────────────── */
116
+ .snap-x-mandatory { scroll-snap-type: x mandatory; -webkit-overflow-scrolling: touch; }
117
+ .snap-start { scroll-snap-align: start; }
118
+
119
+ /* ── Keyframes ────────────────────────────────────────────────────────── */
120
+ @keyframes float {
121
+ 0%, 100% { transform: translateY(0px); }
122
+ 50% { transform: translateY(-10px); }
123
+ }
124
+ @keyframes blob-pulse {
125
+ 0%, 100% { transform: scale(1) rotate(0deg); opacity: 0.07; }
126
+ 50% { transform: scale(1.15) rotate(10deg); opacity: 0.14; }
127
+ }
128
+ @keyframes blob-pulse-slow {
129
+ 0%, 100% { transform: scale(1) rotate(0deg); opacity: 0.05; }
130
+ 50% { transform: scale(1.2) rotate(-8deg); opacity: 0.11; }
131
+ }
132
+ @keyframes shimmer {
133
+ 0% { background-position: -200% 0; }
134
+ 100% { background-position: 200% 0; }
135
+ }
136
+ @keyframes pulse-glow {
137
+ 0%, 100% { opacity: 0.6; }
138
+ 50% { opacity: 1; }
139
+ }
140
+ @keyframes spin-slow { to { transform: rotate(360deg); } }
141
+ @keyframes digit-in {
142
+ from { transform: translateY(-14px); opacity: 0; }
143
+ to { transform: translateY(0); opacity: 1; }
144
+ }
145
+ @keyframes scroll-strip {
146
+ 0% { transform: translateX(0); }
147
+ 100% { transform: translateX(-50%); }
148
+ }
149
+ @keyframes kenburns {
150
+ 0% { transform: scale(1.0) translate(0%, 0%); }
151
+ 100% { transform: scale(1.08) translate(-1.5%, -1%); }
152
+ }
153
+ @keyframes border-flow {
154
+ 0%, 100% { background-position: 0% 50%; }
155
+ 50% { background-position: 100% 50%; }
156
+ }
157
+
158
+ /* ── Animation utilities ──────────────────────────────────────────────── */
159
+ .animate-float { animation: float 5s ease-in-out infinite; }
160
+ .animate-blob { animation: blob-pulse 7s ease-in-out infinite; }
161
+ .animate-blob-slow { animation: blob-pulse-slow 9s ease-in-out infinite 2s; }
162
+ .animate-pulse-glow { animation: pulse-glow 2s ease-in-out infinite; }
163
+ .animate-spin-slow { animation: spin-slow 24s linear infinite; }
164
+ .animate-sparkle { animation: pulse-glow 2.5s ease-in-out infinite; }
165
+ .animate-kenburns { animation: kenburns 8s ease-in-out infinite alternate; transform-origin: center center; }
166
+
167
+ /* ── Reduced motion ───────────────────────────────────────────────────── */
168
+ @media (prefers-reduced-motion: reduce) {
169
+ .animate-float, .animate-blob, .animate-blob-slow,
170
+ .animate-pulse-glow, .animate-spin-slow, .animate-sparkle,
171
+ .animate-kenburns { animation: none; }
172
+ }
173
+
174
+ /* ── Input spinners (price inputs use custom suffix) ──────────────────── */
175
+ input[type="number"]::-webkit-outer-spin-button,
176
+ input[type="number"]::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
177
+ input[type="number"] { -moz-appearance: textfield; }
178
+
179
+ /* ── Animated gradient border (marketplace buy button) ────────────────── */
180
+ .btn-border-animated {
181
+ background: linear-gradient(270deg, #2563eb, #9333ea, #f43f5e, #ea580c, #2563eb);
182
+ background-size: 300% 300%;
183
+ animation: border-flow 5s ease infinite;
184
+ }