@medialane/ui 0.127.1 → 0.127.2

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 (169) hide show
  1. package/dist/components/activity-card.cjs +1 -1
  2. package/dist/components/activity-card.cjs.map +1 -1
  3. package/dist/components/activity-card.js +1 -1
  4. package/dist/components/activity-card.js.map +1 -1
  5. package/dist/components/activity-feed-shell.cjs +1 -1
  6. package/dist/components/activity-feed-shell.cjs.map +1 -1
  7. package/dist/components/activity-feed-shell.js +1 -1
  8. package/dist/components/activity-feed-shell.js.map +1 -1
  9. package/dist/components/activity-row.cjs +2 -2
  10. package/dist/components/activity-row.cjs.map +1 -1
  11. package/dist/components/activity-row.js +2 -2
  12. package/dist/components/activity-row.js.map +1 -1
  13. package/dist/components/activity-ticker.cjs +1 -1
  14. package/dist/components/activity-ticker.cjs.map +1 -1
  15. package/dist/components/activity-ticker.js +1 -1
  16. package/dist/components/activity-ticker.js.map +1 -1
  17. package/dist/components/animated-token-media.cjs +1 -1
  18. package/dist/components/animated-token-media.cjs.map +1 -1
  19. package/dist/components/animated-token-media.js +1 -1
  20. package/dist/components/animated-token-media.js.map +1 -1
  21. package/dist/components/asset-card.cjs +1 -1
  22. package/dist/components/asset-card.cjs.map +1 -1
  23. package/dist/components/asset-card.js +1 -1
  24. package/dist/components/asset-card.js.map +1 -1
  25. package/dist/components/asset-collection-bar.cjs +2 -2
  26. package/dist/components/asset-collection-bar.cjs.map +1 -1
  27. package/dist/components/asset-collection-bar.js +2 -2
  28. package/dist/components/asset-collection-bar.js.map +1 -1
  29. package/dist/components/asset-picker-cell.cjs +1 -1
  30. package/dist/components/asset-picker-cell.cjs.map +1 -1
  31. package/dist/components/asset-picker-cell.js +1 -1
  32. package/dist/components/asset-picker-cell.js.map +1 -1
  33. package/dist/components/asset-top-sections.cjs +1 -1
  34. package/dist/components/asset-top-sections.cjs.map +1 -1
  35. package/dist/components/asset-top-sections.js +1 -1
  36. package/dist/components/asset-top-sections.js.map +1 -1
  37. package/dist/components/brand-logo.cjs +2 -2
  38. package/dist/components/brand-logo.cjs.map +1 -1
  39. package/dist/components/brand-logo.js +2 -2
  40. package/dist/components/brand-logo.js.map +1 -1
  41. package/dist/components/club-owner-actions.cjs +1 -1
  42. package/dist/components/club-owner-actions.cjs.map +1 -1
  43. package/dist/components/club-owner-actions.js +1 -1
  44. package/dist/components/club-owner-actions.js.map +1 -1
  45. package/dist/components/coin-card.cjs +2 -2
  46. package/dist/components/coin-card.cjs.map +1 -1
  47. package/dist/components/coin-card.js +2 -2
  48. package/dist/components/coin-card.js.map +1 -1
  49. package/dist/components/coin-launch-preview.cjs +1 -1
  50. package/dist/components/coin-launch-preview.cjs.map +1 -1
  51. package/dist/components/coin-launch-preview.js +1 -1
  52. package/dist/components/coin-launch-preview.js.map +1 -1
  53. package/dist/components/collection-card.cjs +2 -2
  54. package/dist/components/collection-card.cjs.map +1 -1
  55. package/dist/components/collection-card.js +2 -2
  56. package/dist/components/collection-card.js.map +1 -1
  57. package/dist/components/creation-record.cjs +3 -3
  58. package/dist/components/creation-record.cjs.map +1 -1
  59. package/dist/components/creation-record.js +2 -2
  60. package/dist/components/creation-record.js.map +1 -1
  61. package/dist/components/creator-chip.cjs +1 -1
  62. package/dist/components/creator-chip.cjs.map +1 -1
  63. package/dist/components/creator-chip.js +1 -1
  64. package/dist/components/creator-chip.js.map +1 -1
  65. package/dist/components/creator-score-inline.cjs +1 -1
  66. package/dist/components/creator-score-inline.cjs.map +1 -1
  67. package/dist/components/creator-score-inline.js +1 -1
  68. package/dist/components/creator-score-inline.js.map +1 -1
  69. package/dist/components/cta-card-grid.cjs +1 -1
  70. package/dist/components/cta-card-grid.cjs.map +1 -1
  71. package/dist/components/cta-card-grid.js +1 -1
  72. package/dist/components/cta-card-grid.js.map +1 -1
  73. package/dist/components/currency-icon.cjs +1 -1
  74. package/dist/components/currency-icon.cjs.map +1 -1
  75. package/dist/components/currency-icon.js +1 -1
  76. package/dist/components/currency-icon.js.map +1 -1
  77. package/dist/components/empty-or-error.cjs +1 -1
  78. package/dist/components/empty-or-error.cjs.map +1 -1
  79. package/dist/components/empty-or-error.js +1 -1
  80. package/dist/components/empty-or-error.js.map +1 -1
  81. package/dist/components/hero-slider.cjs +2 -2
  82. package/dist/components/hero-slider.cjs.map +1 -1
  83. package/dist/components/hero-slider.js +2 -2
  84. package/dist/components/hero-slider.js.map +1 -1
  85. package/dist/components/image.cjs +35 -0
  86. package/dist/components/image.cjs.map +1 -0
  87. package/dist/components/image.d.cts +1 -0
  88. package/dist/components/image.d.ts +1 -0
  89. package/dist/components/image.js +5 -0
  90. package/dist/components/image.js.map +1 -0
  91. package/dist/components/launchpad-services.cjs +1 -1
  92. package/dist/components/launchpad-services.cjs.map +1 -1
  93. package/dist/components/launchpad-services.js +1 -1
  94. package/dist/components/launchpad-services.js.map +1 -1
  95. package/dist/components/launchpad-strip.cjs +1 -1
  96. package/dist/components/launchpad-strip.cjs.map +1 -1
  97. package/dist/components/launchpad-strip.js +1 -1
  98. package/dist/components/launchpad-strip.js.map +1 -1
  99. package/dist/components/link.cjs +35 -0
  100. package/dist/components/link.cjs.map +1 -0
  101. package/dist/components/link.d.cts +3 -0
  102. package/dist/components/link.d.ts +3 -0
  103. package/dist/components/link.js +5 -0
  104. package/dist/components/link.js.map +1 -0
  105. package/dist/components/listing-card.cjs +1 -1
  106. package/dist/components/listing-card.cjs.map +1 -1
  107. package/dist/components/listing-card.js +1 -1
  108. package/dist/components/listing-card.js.map +1 -1
  109. package/dist/components/marketplace-dialog-primitives.cjs +1 -1
  110. package/dist/components/marketplace-dialog-primitives.cjs.map +1 -1
  111. package/dist/components/marketplace-dialog-primitives.js +1 -1
  112. package/dist/components/marketplace-dialog-primitives.js.map +1 -1
  113. package/dist/components/nav-command-menu.cjs +2 -2
  114. package/dist/components/nav-command-menu.cjs.map +1 -1
  115. package/dist/components/nav-command-menu.js +1 -1
  116. package/dist/components/nav-command-menu.js.map +1 -1
  117. package/dist/components/owner-setup-panel.cjs +1 -1
  118. package/dist/components/owner-setup-panel.cjs.map +1 -1
  119. package/dist/components/owner-setup-panel.js +1 -1
  120. package/dist/components/owner-setup-panel.js.map +1 -1
  121. package/dist/components/parent-attribution-banner.cjs +1 -1
  122. package/dist/components/parent-attribution-banner.cjs.map +1 -1
  123. package/dist/components/parent-attribution-banner.js +1 -1
  124. package/dist/components/parent-attribution-banner.js.map +1 -1
  125. package/dist/components/portfolio-activity.cjs +2 -2
  126. package/dist/components/portfolio-activity.cjs.map +1 -1
  127. package/dist/components/portfolio-activity.js +1 -1
  128. package/dist/components/portfolio-activity.js.map +1 -1
  129. package/dist/components/portfolio-chip-filter.cjs +1 -1
  130. package/dist/components/portfolio-chip-filter.cjs.map +1 -1
  131. package/dist/components/portfolio-chip-filter.js +1 -1
  132. package/dist/components/portfolio-chip-filter.js.map +1 -1
  133. package/dist/components/portfolio-header.cjs +1 -1
  134. package/dist/components/portfolio-header.cjs.map +1 -1
  135. package/dist/components/portfolio-header.js +1 -1
  136. package/dist/components/portfolio-header.js.map +1 -1
  137. package/dist/components/portfolio-section.cjs +1 -1
  138. package/dist/components/portfolio-section.cjs.map +1 -1
  139. package/dist/components/portfolio-section.js +1 -1
  140. package/dist/components/portfolio-section.js.map +1 -1
  141. package/dist/components/remixes-tab.cjs +1 -1
  142. package/dist/components/remixes-tab.cjs.map +1 -1
  143. package/dist/components/remixes-tab.js +1 -1
  144. package/dist/components/remixes-tab.js.map +1 -1
  145. package/dist/components/rewards-section.cjs +1 -1
  146. package/dist/components/rewards-section.cjs.map +1 -1
  147. package/dist/components/rewards-section.js +1 -1
  148. package/dist/components/rewards-section.js.map +1 -1
  149. package/dist/components/router.cjs +29 -0
  150. package/dist/components/router.cjs.map +1 -0
  151. package/dist/components/router.d.cts +1 -0
  152. package/dist/components/router.d.ts +1 -0
  153. package/dist/components/router.js +5 -0
  154. package/dist/components/router.js.map +1 -0
  155. package/dist/components/scroll-section.cjs +1 -1
  156. package/dist/components/scroll-section.cjs.map +1 -1
  157. package/dist/components/scroll-section.js +1 -1
  158. package/dist/components/scroll-section.js.map +1 -1
  159. package/dist/components/token-card.cjs +1 -1
  160. package/dist/components/token-card.cjs.map +1 -1
  161. package/dist/components/token-card.js +1 -1
  162. package/dist/components/token-card.js.map +1 -1
  163. package/dist/utils/explorer-url.cjs +29 -0
  164. package/dist/utils/explorer-url.cjs.map +1 -0
  165. package/dist/utils/explorer-url.d.cts +3 -0
  166. package/dist/utils/explorer-url.d.ts +3 -0
  167. package/dist/utils/explorer-url.js +5 -0
  168. package/dist/utils/explorer-url.js.map +1 -0
  169. package/package.json +1 -1
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { useState } from "react";
4
- import Link from "next/link";
5
- import Image from "next/image";
4
+ import Link from "./link.js";
5
+ import Image from "./image.js";
6
6
  import { Loader2, Settings2 } from "lucide-react";
7
7
  import { cn } from "../utils/cn.js";
8
8
  import { ipfsToHttp } from "../utils/ipfs.js";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/collection-card.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport Link from \"next/link\";\nimport Image from \"next/image\";\nimport { Loader2, Settings2 } from \"lucide-react\";\nimport { cn } from \"../utils/cn.js\";\nimport { ipfsToHttp } from \"../utils/ipfs.js\";\nimport { formatDisplayPrice } from \"../utils/format.js\";\nimport { MotionCard } from \"./motion-primitives.js\";\nimport { CurrencyIcon } from \"./currency-icon.js\";\nimport type { ApiCollection } from \"@medialane/sdk\";\n\nfunction parseFloorPrice(floor: string | null | undefined): { amount: string; symbol: string } | null {\n if (!floor) return null;\n const formatted = formatDisplayPrice(floor);\n const parts = formatted.trim().split(/\\s+/);\n if (parts.length < 2) return null;\n const symbol = parts[parts.length - 1];\n const amount = parts.slice(0, -1).join(\" \");\n return { amount, symbol };\n}\n\ntype CollectionWithProfile = ApiCollection & {\n profile?: { hasGatedContent?: boolean } | null;\n};\n\nexport interface CollectionCardProps {\n collection: ApiCollection;\n\n href?: string;\n\n settingsHref?: string;\n className?: string;\n}\n\nexport function CollectionCard({ collection, href, settingsHref, className }: CollectionCardProps) {\n const [imgError, setImgError] = useState(false);\n const imageUrl = collection.image ? ipfsToHttp(collection.image) : null;\n const showImage = imageUrl && !imgError;\n const initial = (collection.name ?? collection.contractAddress).charAt(0).toUpperCase();\n const floor = parseFloorPrice(collection.floorPrice);\n const hasExclusiveContent = !!(collection as CollectionWithProfile).profile?.hasGatedContent;\n\n return (\n <div className={cn(hasExclusiveContent && \"card-exclusive-wrapper btn-border-animated\")}>\n <MotionCard className={cn(\"card-base group relative\", className)}>\n {settingsHref && (\n <Link\n href={settingsHref}\n onClick={(e) => e.stopPropagation()}\n className=\"absolute top-2 right-2 z-10 min-h-11 min-w-11 rounded-full flex items-center justify-center\"\n aria-label=\"Collection settings\"\n >\n <span className=\"flex h-7 w-7 items-center justify-center rounded-full bg-black/40 backdrop-blur-sm text-white/70 hover:text-white hover:bg-black/60 transition-colors\">\n <Settings2 className=\"h-3.5 w-3.5\" />\n </span>\n </Link>\n )}\n\n <Link href={href ?? `/collections/${collection.contractAddress}`} className=\"block relative h-full\">\n <div className=\"relative aspect-[3/4] w-full overflow-hidden bg-muted\">\n {showImage ? (\n <Image\n src={imageUrl}\n alt={collection.name ?? \"Collection\"}\n fill\n className=\"object-cover transition-transform duration-500 group-hover:scale-105\"\n onError={() => setImgError(true)}\n unoptimized\n />\n ) : (\n <div className=\"absolute inset-0 bg-gradient-to-br from-brand-purple/30 via-brand-blue/20 to-brand-navy/40 flex items-center justify-center\">\n <span className=\"text-8xl font-black text-white/10 select-none tracking-tighter\">\n {initial}\n </span>\n </div>\n )}\n\n <div className=\"absolute bottom-0 left-0 right-0 px-3 pb-3 flex flex-col gap-1.5 items-start\">\n {!collection.name && collection.metadataStatus === \"PENDING\" ? (\n <span className=\"flex items-center gap-1 text-2xs text-white/60 backdrop-blur-md bg-black/30 rounded-full px-2 py-0.5\">\n <Loader2 className=\"h-2.5 w-2.5 animate-spin\" />\n Indexing…\n </span>\n ) : (\n <p\n className=\"font-bold text-sm text-white leading-tight backdrop-blur-md bg-black/30 rounded-lg px-2.5 py-1 max-w-full truncate\"\n style={{ textShadow: \"0 1px 6px rgba(0,0,0,0.5)\" }}\n >\n {collection.name ?? \"Unnamed Collection\"}\n </p>\n )}\n\n <div className=\"flex items-center gap-1.5 flex-wrap\">\n {collection.totalSupply != null && (\n <span className=\"text-2xs font-medium text-white/80 backdrop-blur-md bg-black/30 rounded-full px-2 py-0.5\">\n {collection.totalSupply.toLocaleString()} items\n </span>\n )}\n {floor && (\n <span className=\"inline-flex items-center gap-1 text-2xs font-bold text-white/90 backdrop-blur-md bg-black/30 rounded-full px-2 py-0.5\">\n Floor\n <CurrencyIcon symbol={floor.symbol} size={10} />\n {floor.amount}\n </span>\n )}\n {hasExclusiveContent && (\n <span className=\"inline-flex items-center gap-1 text-2xs font-bold text-white backdrop-blur-md bg-black/50 rounded-full px-2 py-0.5\">\n ✦ Exclusive\n </span>\n )}\n </div>\n </div>\n </div>\n </Link>\n </MotionCard>\n </div>\n );\n}\n\nexport function CollectionCardSkeleton() {\n return (\n <div className=\"card-base overflow-hidden\">\n <div className=\"relative aspect-[3/4] w-full overflow-hidden bg-muted\">\n <div className=\"absolute inset-0 animate-pulse bg-muted\" />\n <div className=\"absolute bottom-3 left-3 right-3 space-y-1.5\">\n <div className=\"h-4 w-2/3 rounded-md bg-muted-foreground/20 animate-pulse\" />\n <div className=\"h-3 w-1/3 rounded-md bg-muted-foreground/20 animate-pulse\" />\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/components/collection-card.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport Link from \"./link.js\";\nimport Image from \"./image.js\";\nimport { Loader2, Settings2 } from \"lucide-react\";\nimport { cn } from \"../utils/cn.js\";\nimport { ipfsToHttp } from \"../utils/ipfs.js\";\nimport { formatDisplayPrice } from \"../utils/format.js\";\nimport { MotionCard } from \"./motion-primitives.js\";\nimport { CurrencyIcon } from \"./currency-icon.js\";\nimport type { ApiCollection } from \"@medialane/sdk\";\n\nfunction parseFloorPrice(floor: string | null | undefined): { amount: string; symbol: string } | null {\n if (!floor) return null;\n const formatted = formatDisplayPrice(floor);\n const parts = formatted.trim().split(/\\s+/);\n if (parts.length < 2) return null;\n const symbol = parts[parts.length - 1];\n const amount = parts.slice(0, -1).join(\" \");\n return { amount, symbol };\n}\n\ntype CollectionWithProfile = ApiCollection & {\n profile?: { hasGatedContent?: boolean } | null;\n};\n\nexport interface CollectionCardProps {\n collection: ApiCollection;\n\n href?: string;\n\n settingsHref?: string;\n className?: string;\n}\n\nexport function CollectionCard({ collection, href, settingsHref, className }: CollectionCardProps) {\n const [imgError, setImgError] = useState(false);\n const imageUrl = collection.image ? ipfsToHttp(collection.image) : null;\n const showImage = imageUrl && !imgError;\n const initial = (collection.name ?? collection.contractAddress).charAt(0).toUpperCase();\n const floor = parseFloorPrice(collection.floorPrice);\n const hasExclusiveContent = !!(collection as CollectionWithProfile).profile?.hasGatedContent;\n\n return (\n <div className={cn(hasExclusiveContent && \"card-exclusive-wrapper btn-border-animated\")}>\n <MotionCard className={cn(\"card-base group relative\", className)}>\n {settingsHref && (\n <Link\n href={settingsHref}\n onClick={(e) => e.stopPropagation()}\n className=\"absolute top-2 right-2 z-10 min-h-11 min-w-11 rounded-full flex items-center justify-center\"\n aria-label=\"Collection settings\"\n >\n <span className=\"flex h-7 w-7 items-center justify-center rounded-full bg-black/40 backdrop-blur-sm text-white/70 hover:text-white hover:bg-black/60 transition-colors\">\n <Settings2 className=\"h-3.5 w-3.5\" />\n </span>\n </Link>\n )}\n\n <Link href={href ?? `/collections/${collection.contractAddress}`} className=\"block relative h-full\">\n <div className=\"relative aspect-[3/4] w-full overflow-hidden bg-muted\">\n {showImage ? (\n <Image\n src={imageUrl}\n alt={collection.name ?? \"Collection\"}\n fill\n className=\"object-cover transition-transform duration-500 group-hover:scale-105\"\n onError={() => setImgError(true)}\n unoptimized\n />\n ) : (\n <div className=\"absolute inset-0 bg-gradient-to-br from-brand-purple/30 via-brand-blue/20 to-brand-navy/40 flex items-center justify-center\">\n <span className=\"text-8xl font-black text-white/10 select-none tracking-tighter\">\n {initial}\n </span>\n </div>\n )}\n\n <div className=\"absolute bottom-0 left-0 right-0 px-3 pb-3 flex flex-col gap-1.5 items-start\">\n {!collection.name && collection.metadataStatus === \"PENDING\" ? (\n <span className=\"flex items-center gap-1 text-2xs text-white/60 backdrop-blur-md bg-black/30 rounded-full px-2 py-0.5\">\n <Loader2 className=\"h-2.5 w-2.5 animate-spin\" />\n Indexing…\n </span>\n ) : (\n <p\n className=\"font-bold text-sm text-white leading-tight backdrop-blur-md bg-black/30 rounded-lg px-2.5 py-1 max-w-full truncate\"\n style={{ textShadow: \"0 1px 6px rgba(0,0,0,0.5)\" }}\n >\n {collection.name ?? \"Unnamed Collection\"}\n </p>\n )}\n\n <div className=\"flex items-center gap-1.5 flex-wrap\">\n {collection.totalSupply != null && (\n <span className=\"text-2xs font-medium text-white/80 backdrop-blur-md bg-black/30 rounded-full px-2 py-0.5\">\n {collection.totalSupply.toLocaleString()} items\n </span>\n )}\n {floor && (\n <span className=\"inline-flex items-center gap-1 text-2xs font-bold text-white/90 backdrop-blur-md bg-black/30 rounded-full px-2 py-0.5\">\n Floor\n <CurrencyIcon symbol={floor.symbol} size={10} />\n {floor.amount}\n </span>\n )}\n {hasExclusiveContent && (\n <span className=\"inline-flex items-center gap-1 text-2xs font-bold text-white backdrop-blur-md bg-black/50 rounded-full px-2 py-0.5\">\n ✦ Exclusive\n </span>\n )}\n </div>\n </div>\n </div>\n </Link>\n </MotionCard>\n </div>\n );\n}\n\nexport function CollectionCardSkeleton() {\n return (\n <div className=\"card-base overflow-hidden\">\n <div className=\"relative aspect-[3/4] w-full overflow-hidden bg-muted\">\n <div className=\"absolute inset-0 animate-pulse bg-muted\" />\n <div className=\"absolute bottom-3 left-3 right-3 space-y-1.5\">\n <div className=\"h-4 w-2/3 rounded-md bg-muted-foreground/20 animate-pulse\" />\n <div className=\"h-3 w-1/3 rounded-md bg-muted-foreground/20 animate-pulse\" />\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":";AAuDc,cA0BE,YA1BF;AArDd,SAAS,gBAAgB;AACzB,OAAO,UAAU;AACjB,OAAO,WAAW;AAClB,SAAS,SAAS,iBAAiB;AACnC,SAAS,UAAU;AACnB,SAAS,kBAAkB;AAC3B,SAAS,0BAA0B;AACnC,SAAS,kBAAkB;AAC3B,SAAS,oBAAoB;AAG7B,SAAS,gBAAgB,OAA6E;AACpG,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,YAAY,mBAAmB,KAAK;AAC1C,QAAM,QAAQ,UAAU,KAAK,EAAE,MAAM,KAAK;AAC1C,MAAI,MAAM,SAAS,EAAG,QAAO;AAC7B,QAAM,SAAS,MAAM,MAAM,SAAS,CAAC;AACrC,QAAM,SAAS,MAAM,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG;AAC1C,SAAO,EAAE,QAAQ,OAAO;AAC1B;AAeO,SAAS,eAAe,EAAE,YAAY,MAAM,cAAc,UAAU,GAAwB;AACjG,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAC9C,QAAM,WAAW,WAAW,QAAQ,WAAW,WAAW,KAAK,IAAI;AACnE,QAAM,YAAY,YAAY,CAAC;AAC/B,QAAM,WAAW,WAAW,QAAQ,WAAW,iBAAiB,OAAO,CAAC,EAAE,YAAY;AACtF,QAAM,QAAQ,gBAAgB,WAAW,UAAU;AACnD,QAAM,sBAAsB,CAAC,CAAE,WAAqC,SAAS;AAE7E,SACE,oBAAC,SAAI,WAAW,GAAG,uBAAuB,4CAA4C,GACpF,+BAAC,cAAW,WAAW,GAAG,4BAA4B,SAAS,GAC5D;AAAA,oBACC;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,QAClC,WAAU;AAAA,QACV,cAAW;AAAA,QAEX,8BAAC,UAAK,WAAU,yJACd,8BAAC,aAAU,WAAU,eAAc,GACrC;AAAA;AAAA,IACF;AAAA,IAGF,oBAAC,QAAK,MAAM,QAAQ,gBAAgB,WAAW,eAAe,IAAI,WAAU,yBAC1E,+BAAC,SAAI,WAAU,yDACZ;AAAA,kBACC;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,KAAK,WAAW,QAAQ;AAAA,UACxB,MAAI;AAAA,UACJ,WAAU;AAAA,UACV,SAAS,MAAM,YAAY,IAAI;AAAA,UAC/B,aAAW;AAAA;AAAA,MACb,IAEA,oBAAC,SAAI,WAAU,+HACb,8BAAC,UAAK,WAAU,kEACb,mBACH,GACF;AAAA,MAGF,qBAAC,SAAI,WAAU,gFACZ;AAAA,SAAC,WAAW,QAAQ,WAAW,mBAAmB,YACjD,qBAAC,UAAK,WAAU,wGACd;AAAA,8BAAC,WAAQ,WAAU,4BAA2B;AAAA,UAAE;AAAA,WAElD,IAEA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,YAAY,4BAA4B;AAAA,YAEhD,qBAAW,QAAQ;AAAA;AAAA,QACtB;AAAA,QAGF,qBAAC,SAAI,WAAU,uCACZ;AAAA,qBAAW,eAAe,QACzB,qBAAC,UAAK,WAAU,4FACb;AAAA,uBAAW,YAAY,eAAe;AAAA,YAAE;AAAA,aAC3C;AAAA,UAED,SACC,qBAAC,UAAK,WAAU,yHAAwH;AAAA;AAAA,YAEtI,oBAAC,gBAAa,QAAQ,MAAM,QAAQ,MAAM,IAAI;AAAA,YAC7C,MAAM;AAAA,aACT;AAAA,UAED,uBACC,oBAAC,UAAK,WAAU,sHAAqH,8BAErI;AAAA,WAEJ;AAAA,SACF;AAAA,OACF,GACF;AAAA,KACF,GACF;AAEJ;AAEO,SAAS,yBAAyB;AACvC,SACE,oBAAC,SAAI,WAAU,6BACb,+BAAC,SAAI,WAAU,yDACb;AAAA,wBAAC,SAAI,WAAU,2CAA0C;AAAA,IACzD,qBAAC,SAAI,WAAU,gDACb;AAAA,0BAAC,SAAI,WAAU,6DAA4D;AAAA,MAC3E,oBAAC,SAAI,WAAU,6DAA4D;AAAA,OAC7E;AAAA,KACF,GACF;AAEJ;","names":[]}
@@ -34,9 +34,9 @@ __export(creation_record_exports, {
34
34
  module.exports = __toCommonJS(creation_record_exports);
35
35
  var import_jsx_runtime = require("react/jsx-runtime");
36
36
  var import_lucide_react = require("lucide-react");
37
- var import_link = __toESM(require("next/link"), 1);
37
+ var import_link = __toESM(require("./link.js"), 1);
38
38
  var import_sdk = require("@medialane/sdk");
39
- const EXPLORER_URL = (typeof process !== "undefined" ? process.env.NEXT_PUBLIC_EXPLORER_URL : void 0) || "https://voyager.online";
39
+ var import_explorer_url = require("../utils/explorer-url.js");
40
40
  function CreationRecord({ originalCreator, registeredAt }) {
41
41
  const creator = originalCreator ? (0, import_sdk.normalizeAddress)("STARKNET", originalCreator) : "";
42
42
  const date = new Date(registeredAt * 1e3);
@@ -65,7 +65,7 @@ function CreationRecord({ originalCreator, registeredAt }) {
65
65
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("dd", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
66
66
  "a",
67
67
  {
68
- href: `${EXPLORER_URL}/contract/${creator}`,
68
+ href: `${import_explorer_url.EXPLORER_URL}/contract/${creator}`,
69
69
  target: "_blank",
70
70
  rel: "noreferrer",
71
71
  className: "inline-flex items-center gap-1 hover:underline",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/creation-record.tsx"],"sourcesContent":["\"use client\";\n\nimport { Award, ExternalLink } from \"lucide-react\";\nimport Link from \"next/link\";\nimport { normalizeAddress } from \"@medialane/sdk\";\n\nconst EXPLORER_URL =\n (typeof process !== \"undefined\" ? process.env.NEXT_PUBLIC_EXPLORER_URL : undefined) ||\n \"https://voyager.online\";\n\nexport interface CreationRecordProps {\n originalCreator: string;\n registeredAt: number;\n}\n\nexport function CreationRecord({ originalCreator, registeredAt }: CreationRecordProps) {\n const creator = originalCreator ? normalizeAddress(\"STARKNET\", originalCreator) : \"\";\n const date = new Date(registeredAt * 1000);\n const formatted = date.toLocaleDateString(undefined, {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n });\n\n return (\n <div className=\"rounded-lg bg-amber-500/5 p-4\">\n <div className=\"flex items-center gap-2 mb-3\">\n <Award className=\"h-4 w-4 text-amber-500\" />\n <p className=\"text-sm font-semibold text-amber-500\">Creation Record</p>\n </div>\n <p className=\"text-xs text-muted-foreground mb-3\">\n Immutable on-chain authorship record set at mint and stored permanently\n for legal evidence of creation (Berne Convention).\n </p>\n <dl className=\"space-y-2 text-sm\">\n <div className=\"flex items-center justify-between\">\n <dt className=\"text-muted-foreground\">Original creator</dt>\n <dd className=\"tabular-nums\">\n <Link href={`/creator/${creator}`} className=\"hover:underline\">\n {creator.slice(0, 6)}…{creator.slice(-4)}\n </Link>\n </dd>\n </div>\n <div className=\"flex items-center justify-between\">\n <dt className=\"text-muted-foreground\">Registered at</dt>\n <dd>\n <a\n href={`${EXPLORER_URL}/contract/${creator}`}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"inline-flex items-center gap-1 hover:underline\"\n >\n {formatted}\n <ExternalLink className=\"h-3 w-3\" />\n </a>\n </dd>\n </div>\n </dl>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA0BM;AAxBN,0BAAoC;AACpC,kBAAiB;AACjB,iBAAiC;AAEjC,MAAM,gBACH,OAAO,YAAY,cAAc,QAAQ,IAAI,2BAA2B,WACzE;AAOK,SAAS,eAAe,EAAE,iBAAiB,aAAa,GAAwB;AACrF,QAAM,UAAU,sBAAkB,6BAAiB,YAAY,eAAe,IAAI;AAClF,QAAM,OAAO,IAAI,KAAK,eAAe,GAAI;AACzC,QAAM,YAAY,KAAK,mBAAmB,QAAW;AAAA,IACnD,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,EACP,CAAC;AAED,SACE,6CAAC,SAAI,WAAU,iCACb;AAAA,iDAAC,SAAI,WAAU,gCACb;AAAA,kDAAC,6BAAM,WAAU,0BAAyB;AAAA,MAC1C,4CAAC,OAAE,WAAU,wCAAuC,6BAAe;AAAA,OACrE;AAAA,IACA,4CAAC,OAAE,WAAU,sCAAqC,wIAGlD;AAAA,IACA,6CAAC,QAAG,WAAU,qBACZ;AAAA,mDAAC,SAAI,WAAU,qCACb;AAAA,oDAAC,QAAG,WAAU,yBAAwB,8BAAgB;AAAA,QACtD,4CAAC,QAAG,WAAU,gBACZ,uDAAC,YAAAA,SAAA,EAAK,MAAM,YAAY,OAAO,IAAI,WAAU,mBAC1C;AAAA,kBAAQ,MAAM,GAAG,CAAC;AAAA,UAAE;AAAA,UAAE,QAAQ,MAAM,EAAE;AAAA,WACzC,GACF;AAAA,SACF;AAAA,MACA,6CAAC,SAAI,WAAU,qCACb;AAAA,oDAAC,QAAG,WAAU,yBAAwB,2BAAa;AAAA,QACnD,4CAAC,QACC;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,GAAG,YAAY,aAAa,OAAO;AAAA,YACzC,QAAO;AAAA,YACP,KAAI;AAAA,YACJ,WAAU;AAAA,YAET;AAAA;AAAA,cACD,4CAAC,oCAAa,WAAU,WAAU;AAAA;AAAA;AAAA,QACpC,GACF;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAEJ;","names":["Link"]}
1
+ {"version":3,"sources":["../../src/components/creation-record.tsx"],"sourcesContent":["\"use client\";\n\nimport { Award, ExternalLink } from \"lucide-react\";\nimport Link from \"./link.js\";\nimport { normalizeAddress } from \"@medialane/sdk\";\nimport { EXPLORER_URL } from \"../utils/explorer-url.js\";\n\nexport interface CreationRecordProps {\n originalCreator: string;\n registeredAt: number;\n}\n\nexport function CreationRecord({ originalCreator, registeredAt }: CreationRecordProps) {\n const creator = originalCreator ? normalizeAddress(\"STARKNET\", originalCreator) : \"\";\n const date = new Date(registeredAt * 1000);\n const formatted = date.toLocaleDateString(undefined, {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n });\n\n return (\n <div className=\"rounded-lg bg-amber-500/5 p-4\">\n <div className=\"flex items-center gap-2 mb-3\">\n <Award className=\"h-4 w-4 text-amber-500\" />\n <p className=\"text-sm font-semibold text-amber-500\">Creation Record</p>\n </div>\n <p className=\"text-xs text-muted-foreground mb-3\">\n Immutable on-chain authorship record set at mint and stored permanently\n for legal evidence of creation (Berne Convention).\n </p>\n <dl className=\"space-y-2 text-sm\">\n <div className=\"flex items-center justify-between\">\n <dt className=\"text-muted-foreground\">Original creator</dt>\n <dd className=\"tabular-nums\">\n <Link href={`/creator/${creator}`} className=\"hover:underline\">\n {creator.slice(0, 6)}…{creator.slice(-4)}\n </Link>\n </dd>\n </div>\n <div className=\"flex items-center justify-between\">\n <dt className=\"text-muted-foreground\">Registered at</dt>\n <dd>\n <a\n href={`${EXPLORER_URL}/contract/${creator}`}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"inline-flex items-center gap-1 hover:underline\"\n >\n {formatted}\n <ExternalLink className=\"h-3 w-3\" />\n </a>\n </dd>\n </div>\n </dl>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBM;AArBN,0BAAoC;AACpC,kBAAiB;AACjB,iBAAiC;AACjC,0BAA6B;AAOtB,SAAS,eAAe,EAAE,iBAAiB,aAAa,GAAwB;AACrF,QAAM,UAAU,sBAAkB,6BAAiB,YAAY,eAAe,IAAI;AAClF,QAAM,OAAO,IAAI,KAAK,eAAe,GAAI;AACzC,QAAM,YAAY,KAAK,mBAAmB,QAAW;AAAA,IACnD,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,EACP,CAAC;AAED,SACE,6CAAC,SAAI,WAAU,iCACb;AAAA,iDAAC,SAAI,WAAU,gCACb;AAAA,kDAAC,6BAAM,WAAU,0BAAyB;AAAA,MAC1C,4CAAC,OAAE,WAAU,wCAAuC,6BAAe;AAAA,OACrE;AAAA,IACA,4CAAC,OAAE,WAAU,sCAAqC,wIAGlD;AAAA,IACA,6CAAC,QAAG,WAAU,qBACZ;AAAA,mDAAC,SAAI,WAAU,qCACb;AAAA,oDAAC,QAAG,WAAU,yBAAwB,8BAAgB;AAAA,QACtD,4CAAC,QAAG,WAAU,gBACZ,uDAAC,YAAAA,SAAA,EAAK,MAAM,YAAY,OAAO,IAAI,WAAU,mBAC1C;AAAA,kBAAQ,MAAM,GAAG,CAAC;AAAA,UAAE;AAAA,UAAE,QAAQ,MAAM,EAAE;AAAA,WACzC,GACF;AAAA,SACF;AAAA,MACA,6CAAC,SAAI,WAAU,qCACb;AAAA,oDAAC,QAAG,WAAU,yBAAwB,2BAAa;AAAA,QACnD,4CAAC,QACC;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,GAAG,gCAAY,aAAa,OAAO;AAAA,YACzC,QAAO;AAAA,YACP,KAAI;AAAA,YACJ,WAAU;AAAA,YAET;AAAA;AAAA,cACD,4CAAC,oCAAa,WAAU,WAAU;AAAA;AAAA;AAAA,QACpC,GACF;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAEJ;","names":["Link"]}
@@ -1,9 +1,9 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { Award, ExternalLink } from "lucide-react";
4
- import Link from "next/link";
4
+ import Link from "./link.js";
5
5
  import { normalizeAddress } from "@medialane/sdk";
6
- const EXPLORER_URL = (typeof process !== "undefined" ? process.env.NEXT_PUBLIC_EXPLORER_URL : void 0) || "https://voyager.online";
6
+ import { EXPLORER_URL } from "../utils/explorer-url.js";
7
7
  function CreationRecord({ originalCreator, registeredAt }) {
8
8
  const creator = originalCreator ? normalizeAddress("STARKNET", originalCreator) : "";
9
9
  const date = new Date(registeredAt * 1e3);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/creation-record.tsx"],"sourcesContent":["\"use client\";\n\nimport { Award, ExternalLink } from \"lucide-react\";\nimport Link from \"next/link\";\nimport { normalizeAddress } from \"@medialane/sdk\";\n\nconst EXPLORER_URL =\n (typeof process !== \"undefined\" ? process.env.NEXT_PUBLIC_EXPLORER_URL : undefined) ||\n \"https://voyager.online\";\n\nexport interface CreationRecordProps {\n originalCreator: string;\n registeredAt: number;\n}\n\nexport function CreationRecord({ originalCreator, registeredAt }: CreationRecordProps) {\n const creator = originalCreator ? normalizeAddress(\"STARKNET\", originalCreator) : \"\";\n const date = new Date(registeredAt * 1000);\n const formatted = date.toLocaleDateString(undefined, {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n });\n\n return (\n <div className=\"rounded-lg bg-amber-500/5 p-4\">\n <div className=\"flex items-center gap-2 mb-3\">\n <Award className=\"h-4 w-4 text-amber-500\" />\n <p className=\"text-sm font-semibold text-amber-500\">Creation Record</p>\n </div>\n <p className=\"text-xs text-muted-foreground mb-3\">\n Immutable on-chain authorship record set at mint and stored permanently\n for legal evidence of creation (Berne Convention).\n </p>\n <dl className=\"space-y-2 text-sm\">\n <div className=\"flex items-center justify-between\">\n <dt className=\"text-muted-foreground\">Original creator</dt>\n <dd className=\"tabular-nums\">\n <Link href={`/creator/${creator}`} className=\"hover:underline\">\n {creator.slice(0, 6)}…{creator.slice(-4)}\n </Link>\n </dd>\n </div>\n <div className=\"flex items-center justify-between\">\n <dt className=\"text-muted-foreground\">Registered at</dt>\n <dd>\n <a\n href={`${EXPLORER_URL}/contract/${creator}`}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"inline-flex items-center gap-1 hover:underline\"\n >\n {formatted}\n <ExternalLink className=\"h-3 w-3\" />\n </a>\n </dd>\n </div>\n </dl>\n </div>\n );\n}\n"],"mappings":";AA0BM,SACE,KADF;AAxBN,SAAS,OAAO,oBAAoB;AACpC,OAAO,UAAU;AACjB,SAAS,wBAAwB;AAEjC,MAAM,gBACH,OAAO,YAAY,cAAc,QAAQ,IAAI,2BAA2B,WACzE;AAOK,SAAS,eAAe,EAAE,iBAAiB,aAAa,GAAwB;AACrF,QAAM,UAAU,kBAAkB,iBAAiB,YAAY,eAAe,IAAI;AAClF,QAAM,OAAO,IAAI,KAAK,eAAe,GAAI;AACzC,QAAM,YAAY,KAAK,mBAAmB,QAAW;AAAA,IACnD,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,EACP,CAAC;AAED,SACE,qBAAC,SAAI,WAAU,iCACb;AAAA,yBAAC,SAAI,WAAU,gCACb;AAAA,0BAAC,SAAM,WAAU,0BAAyB;AAAA,MAC1C,oBAAC,OAAE,WAAU,wCAAuC,6BAAe;AAAA,OACrE;AAAA,IACA,oBAAC,OAAE,WAAU,sCAAqC,wIAGlD;AAAA,IACA,qBAAC,QAAG,WAAU,qBACZ;AAAA,2BAAC,SAAI,WAAU,qCACb;AAAA,4BAAC,QAAG,WAAU,yBAAwB,8BAAgB;AAAA,QACtD,oBAAC,QAAG,WAAU,gBACZ,+BAAC,QAAK,MAAM,YAAY,OAAO,IAAI,WAAU,mBAC1C;AAAA,kBAAQ,MAAM,GAAG,CAAC;AAAA,UAAE;AAAA,UAAE,QAAQ,MAAM,EAAE;AAAA,WACzC,GACF;AAAA,SACF;AAAA,MACA,qBAAC,SAAI,WAAU,qCACb;AAAA,4BAAC,QAAG,WAAU,yBAAwB,2BAAa;AAAA,QACnD,oBAAC,QACC;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,GAAG,YAAY,aAAa,OAAO;AAAA,YACzC,QAAO;AAAA,YACP,KAAI;AAAA,YACJ,WAAU;AAAA,YAET;AAAA;AAAA,cACD,oBAAC,gBAAa,WAAU,WAAU;AAAA;AAAA;AAAA,QACpC,GACF;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/components/creation-record.tsx"],"sourcesContent":["\"use client\";\n\nimport { Award, ExternalLink } from \"lucide-react\";\nimport Link from \"./link.js\";\nimport { normalizeAddress } from \"@medialane/sdk\";\nimport { EXPLORER_URL } from \"../utils/explorer-url.js\";\n\nexport interface CreationRecordProps {\n originalCreator: string;\n registeredAt: number;\n}\n\nexport function CreationRecord({ originalCreator, registeredAt }: CreationRecordProps) {\n const creator = originalCreator ? normalizeAddress(\"STARKNET\", originalCreator) : \"\";\n const date = new Date(registeredAt * 1000);\n const formatted = date.toLocaleDateString(undefined, {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n });\n\n return (\n <div className=\"rounded-lg bg-amber-500/5 p-4\">\n <div className=\"flex items-center gap-2 mb-3\">\n <Award className=\"h-4 w-4 text-amber-500\" />\n <p className=\"text-sm font-semibold text-amber-500\">Creation Record</p>\n </div>\n <p className=\"text-xs text-muted-foreground mb-3\">\n Immutable on-chain authorship record set at mint and stored permanently\n for legal evidence of creation (Berne Convention).\n </p>\n <dl className=\"space-y-2 text-sm\">\n <div className=\"flex items-center justify-between\">\n <dt className=\"text-muted-foreground\">Original creator</dt>\n <dd className=\"tabular-nums\">\n <Link href={`/creator/${creator}`} className=\"hover:underline\">\n {creator.slice(0, 6)}…{creator.slice(-4)}\n </Link>\n </dd>\n </div>\n <div className=\"flex items-center justify-between\">\n <dt className=\"text-muted-foreground\">Registered at</dt>\n <dd>\n <a\n href={`${EXPLORER_URL}/contract/${creator}`}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"inline-flex items-center gap-1 hover:underline\"\n >\n {formatted}\n <ExternalLink className=\"h-3 w-3\" />\n </a>\n </dd>\n </div>\n </dl>\n </div>\n );\n}\n"],"mappings":";AAuBM,SACE,KADF;AArBN,SAAS,OAAO,oBAAoB;AACpC,OAAO,UAAU;AACjB,SAAS,wBAAwB;AACjC,SAAS,oBAAoB;AAOtB,SAAS,eAAe,EAAE,iBAAiB,aAAa,GAAwB;AACrF,QAAM,UAAU,kBAAkB,iBAAiB,YAAY,eAAe,IAAI;AAClF,QAAM,OAAO,IAAI,KAAK,eAAe,GAAI;AACzC,QAAM,YAAY,KAAK,mBAAmB,QAAW;AAAA,IACnD,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,EACP,CAAC;AAED,SACE,qBAAC,SAAI,WAAU,iCACb;AAAA,yBAAC,SAAI,WAAU,gCACb;AAAA,0BAAC,SAAM,WAAU,0BAAyB;AAAA,MAC1C,oBAAC,OAAE,WAAU,wCAAuC,6BAAe;AAAA,OACrE;AAAA,IACA,oBAAC,OAAE,WAAU,sCAAqC,wIAGlD;AAAA,IACA,qBAAC,QAAG,WAAU,qBACZ;AAAA,2BAAC,SAAI,WAAU,qCACb;AAAA,4BAAC,QAAG,WAAU,yBAAwB,8BAAgB;AAAA,QACtD,oBAAC,QAAG,WAAU,gBACZ,+BAAC,QAAK,MAAM,YAAY,OAAO,IAAI,WAAU,mBAC1C;AAAA,kBAAQ,MAAM,GAAG,CAAC;AAAA,UAAE;AAAA,UAAE,QAAQ,MAAM,EAAE;AAAA,WACzC,GACF;AAAA,SACF;AAAA,MACA,qBAAC,SAAI,WAAU,qCACb;AAAA,4BAAC,QAAG,WAAU,yBAAwB,2BAAa;AAAA,QACnD,oBAAC,QACC;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,GAAG,YAAY,aAAa,OAAO;AAAA,YACzC,QAAO;AAAA,YACP,KAAI;AAAA,YACJ,WAAU;AAAA,YAET;AAAA;AAAA,cACD,oBAAC,gBAAa,WAAU,WAAU;AAAA;AAAA;AAAA,QACpC,GACF;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAEJ;","names":[]}
@@ -33,7 +33,7 @@ __export(creator_chip_exports, {
33
33
  });
34
34
  module.exports = __toCommonJS(creator_chip_exports);
35
35
  var import_jsx_runtime = require("react/jsx-runtime");
36
- var import_link = __toESM(require("next/link"), 1);
36
+ var import_link = __toESM(require("./link.js"), 1);
37
37
  var import_use_profiles = require("../utils/use-profiles.js");
38
38
  var import_address_display = require("./address-display.js");
39
39
  function CreatorChip({ getClient, address }) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/creator-chip.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport type { MedialaneClient } from \"@medialane/sdk/starknet\";\nimport { useCreatorProfile } from \"../utils/use-profiles.js\";\nimport { AddressDisplay } from \"./address-display.js\";\n\nexport interface CreatorChipProps {\n getClient: () => MedialaneClient;\n address: string;\n}\n\nexport function CreatorChip({ getClient, address }: CreatorChipProps) {\n const { profile } = useCreatorProfile(getClient, address);\n const label = profile?.displayName || profile?.username || null;\n\n return (\n <Link\n href={`/account/${address}`}\n className=\"inline-flex items-center gap-1.5 text-sm rounded-full px-2 py-1 hover:bg-muted/60 active:scale-[0.98] transition\"\n >\n <span className=\"text-muted-foreground shrink-0\">by</span>\n {label ? (\n <span className=\"font-semibold text-foreground truncate\">{label}</span>\n ) : (\n <AddressDisplay address={address} chars={6} showCopy={false} className=\"font-semibold text-foreground\" />\n )}\n </Link>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBI;AAfJ,kBAAiB;AAEjB,0BAAkC;AAClC,6BAA+B;AAOxB,SAAS,YAAY,EAAE,WAAW,QAAQ,GAAqB;AACpE,QAAM,EAAE,QAAQ,QAAI,uCAAkB,WAAW,OAAO;AACxD,QAAM,QAAQ,SAAS,eAAe,SAAS,YAAY;AAE3D,SACE;AAAA,IAAC,YAAAA;AAAA,IAAA;AAAA,MACC,MAAM,YAAY,OAAO;AAAA,MACzB,WAAU;AAAA,MAEV;AAAA,oDAAC,UAAK,WAAU,kCAAiC,gBAAE;AAAA,QAClD,QACC,4CAAC,UAAK,WAAU,0CAA0C,iBAAM,IAEhE,4CAAC,yCAAe,SAAkB,OAAO,GAAG,UAAU,OAAO,WAAU,iCAAgC;AAAA;AAAA;AAAA,EAE3G;AAEJ;","names":["Link"]}
1
+ {"version":3,"sources":["../../src/components/creator-chip.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"./link.js\";\nimport type { MedialaneClient } from \"@medialane/sdk/starknet\";\nimport { useCreatorProfile } from \"../utils/use-profiles.js\";\nimport { AddressDisplay } from \"./address-display.js\";\n\nexport interface CreatorChipProps {\n getClient: () => MedialaneClient;\n address: string;\n}\n\nexport function CreatorChip({ getClient, address }: CreatorChipProps) {\n const { profile } = useCreatorProfile(getClient, address);\n const label = profile?.displayName || profile?.username || null;\n\n return (\n <Link\n href={`/account/${address}`}\n className=\"inline-flex items-center gap-1.5 text-sm rounded-full px-2 py-1 hover:bg-muted/60 active:scale-[0.98] transition\"\n >\n <span className=\"text-muted-foreground shrink-0\">by</span>\n {label ? (\n <span className=\"font-semibold text-foreground truncate\">{label}</span>\n ) : (\n <AddressDisplay address={address} chars={6} showCopy={false} className=\"font-semibold text-foreground\" />\n )}\n </Link>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBI;AAfJ,kBAAiB;AAEjB,0BAAkC;AAClC,6BAA+B;AAOxB,SAAS,YAAY,EAAE,WAAW,QAAQ,GAAqB;AACpE,QAAM,EAAE,QAAQ,QAAI,uCAAkB,WAAW,OAAO;AACxD,QAAM,QAAQ,SAAS,eAAe,SAAS,YAAY;AAE3D,SACE;AAAA,IAAC,YAAAA;AAAA,IAAA;AAAA,MACC,MAAM,YAAY,OAAO;AAAA,MACzB,WAAU;AAAA,MAEV;AAAA,oDAAC,UAAK,WAAU,kCAAiC,gBAAE;AAAA,QAClD,QACC,4CAAC,UAAK,WAAU,0CAA0C,iBAAM,IAEhE,4CAAC,yCAAe,SAAkB,OAAO,GAAG,UAAU,OAAO,WAAU,iCAAgC;AAAA;AAAA;AAAA,EAE3G;AAEJ;","names":["Link"]}
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
- import Link from "next/link";
3
+ import Link from "./link.js";
4
4
  import { useCreatorProfile } from "../utils/use-profiles.js";
5
5
  import { AddressDisplay } from "./address-display.js";
6
6
  function CreatorChip({ getClient, address }) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/creator-chip.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport type { MedialaneClient } from \"@medialane/sdk/starknet\";\nimport { useCreatorProfile } from \"../utils/use-profiles.js\";\nimport { AddressDisplay } from \"./address-display.js\";\n\nexport interface CreatorChipProps {\n getClient: () => MedialaneClient;\n address: string;\n}\n\nexport function CreatorChip({ getClient, address }: CreatorChipProps) {\n const { profile } = useCreatorProfile(getClient, address);\n const label = profile?.displayName || profile?.username || null;\n\n return (\n <Link\n href={`/account/${address}`}\n className=\"inline-flex items-center gap-1.5 text-sm rounded-full px-2 py-1 hover:bg-muted/60 active:scale-[0.98] transition\"\n >\n <span className=\"text-muted-foreground shrink-0\">by</span>\n {label ? (\n <span className=\"font-semibold text-foreground truncate\">{label}</span>\n ) : (\n <AddressDisplay address={address} chars={6} showCopy={false} className=\"font-semibold text-foreground\" />\n )}\n </Link>\n );\n}\n"],"mappings":";AAiBI,SAIE,KAJF;AAfJ,OAAO,UAAU;AAEjB,SAAS,yBAAyB;AAClC,SAAS,sBAAsB;AAOxB,SAAS,YAAY,EAAE,WAAW,QAAQ,GAAqB;AACpE,QAAM,EAAE,QAAQ,IAAI,kBAAkB,WAAW,OAAO;AACxD,QAAM,QAAQ,SAAS,eAAe,SAAS,YAAY;AAE3D,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAM,YAAY,OAAO;AAAA,MACzB,WAAU;AAAA,MAEV;AAAA,4BAAC,UAAK,WAAU,kCAAiC,gBAAE;AAAA,QAClD,QACC,oBAAC,UAAK,WAAU,0CAA0C,iBAAM,IAEhE,oBAAC,kBAAe,SAAkB,OAAO,GAAG,UAAU,OAAO,WAAU,iCAAgC;AAAA;AAAA;AAAA,EAE3G;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/components/creator-chip.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"./link.js\";\nimport type { MedialaneClient } from \"@medialane/sdk/starknet\";\nimport { useCreatorProfile } from \"../utils/use-profiles.js\";\nimport { AddressDisplay } from \"./address-display.js\";\n\nexport interface CreatorChipProps {\n getClient: () => MedialaneClient;\n address: string;\n}\n\nexport function CreatorChip({ getClient, address }: CreatorChipProps) {\n const { profile } = useCreatorProfile(getClient, address);\n const label = profile?.displayName || profile?.username || null;\n\n return (\n <Link\n href={`/account/${address}`}\n className=\"inline-flex items-center gap-1.5 text-sm rounded-full px-2 py-1 hover:bg-muted/60 active:scale-[0.98] transition\"\n >\n <span className=\"text-muted-foreground shrink-0\">by</span>\n {label ? (\n <span className=\"font-semibold text-foreground truncate\">{label}</span>\n ) : (\n <AddressDisplay address={address} chars={6} showCopy={false} className=\"font-semibold text-foreground\" />\n )}\n </Link>\n );\n}\n"],"mappings":";AAiBI,SAIE,KAJF;AAfJ,OAAO,UAAU;AAEjB,SAAS,yBAAyB;AAClC,SAAS,sBAAsB;AAOxB,SAAS,YAAY,EAAE,WAAW,QAAQ,GAAqB;AACpE,QAAM,EAAE,QAAQ,IAAI,kBAAkB,WAAW,OAAO;AACxD,QAAM,QAAQ,SAAS,eAAe,SAAS,YAAY;AAE3D,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAM,YAAY,OAAO;AAAA,MACzB,WAAU;AAAA,MAEV;AAAA,4BAAC,UAAK,WAAU,kCAAiC,gBAAE;AAAA,QAClD,QACC,oBAAC,UAAK,WAAU,0CAA0C,iBAAM,IAEhE,oBAAC,kBAAe,SAAkB,OAAO,GAAG,UAAU,OAAO,WAAU,iCAAgC;AAAA;AAAA;AAAA,EAE3G;AAEJ;","names":[]}
@@ -33,7 +33,7 @@ __export(creator_score_inline_exports, {
33
33
  });
34
34
  module.exports = __toCommonJS(creator_score_inline_exports);
35
35
  var import_jsx_runtime = require("react/jsx-runtime");
36
- var import_link = __toESM(require("next/link"), 1);
36
+ var import_link = __toESM(require("./link.js"), 1);
37
37
  var import_level_badge = require("./rewards/level-badge.js");
38
38
  var import_badge_shelf = require("./rewards/badge-shelf.js");
39
39
  var import_use_rewards = require("../utils/use-rewards.js");
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/creator-score-inline.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport type { MedialaneClient } from \"@medialane/sdk/starknet\";\nimport { LevelBadge } from \"./rewards/level-badge.js\";\nimport { BadgeShelf } from \"./rewards/badge-shelf.js\";\nimport { useRewards } from \"../utils/use-rewards.js\";\n\nexport interface CreatorScoreInlineProps {\n getClient: () => MedialaneClient;\n address: string | null | undefined;\n size?: \"sm\" | \"md\" | \"lg\";\n\n showBadges?: boolean;\n\n maxBadges?: number;\n className?: string;\n}\n\nexport function CreatorScoreInline({ getClient, address, size = \"sm\", showBadges = false, maxBadges = 6, className }: CreatorScoreInlineProps) {\n const { data } = useRewards(getClient, address);\n if (!data || data.totalXp <= 0) return null;\n\n return (\n <div className={className}>\n <Link href=\"/rewards\" className=\"inline-flex active:opacity-80\">\n <LevelBadge level={data.currentLevel} name={data.currentLevelName} badgeColor={data.badgeColor} size={size} />\n </Link>\n {showBadges && data.badges.length > 0 && (\n <BadgeShelf badges={data.badges.slice(0, maxBadges)} className=\"mt-2\" />\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBI;AAtBJ,kBAAiB;AAEjB,yBAA2B;AAC3B,yBAA2B;AAC3B,yBAA2B;AAapB,SAAS,mBAAmB,EAAE,WAAW,SAAS,OAAO,MAAM,aAAa,OAAO,YAAY,GAAG,UAAU,GAA4B;AAC7I,QAAM,EAAE,KAAK,QAAI,+BAAW,WAAW,OAAO;AAC9C,MAAI,CAAC,QAAQ,KAAK,WAAW,EAAG,QAAO;AAEvC,SACE,6CAAC,SAAI,WACH;AAAA,gDAAC,YAAAA,SAAA,EAAK,MAAK,YAAW,WAAU,iCAC9B,sDAAC,iCAAW,OAAO,KAAK,cAAc,MAAM,KAAK,kBAAkB,YAAY,KAAK,YAAY,MAAY,GAC9G;AAAA,IACC,cAAc,KAAK,OAAO,SAAS,KAClC,4CAAC,iCAAW,QAAQ,KAAK,OAAO,MAAM,GAAG,SAAS,GAAG,WAAU,QAAO;AAAA,KAE1E;AAEJ;","names":["Link"]}
1
+ {"version":3,"sources":["../../src/components/creator-score-inline.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"./link.js\";\nimport type { MedialaneClient } from \"@medialane/sdk/starknet\";\nimport { LevelBadge } from \"./rewards/level-badge.js\";\nimport { BadgeShelf } from \"./rewards/badge-shelf.js\";\nimport { useRewards } from \"../utils/use-rewards.js\";\n\nexport interface CreatorScoreInlineProps {\n getClient: () => MedialaneClient;\n address: string | null | undefined;\n size?: \"sm\" | \"md\" | \"lg\";\n\n showBadges?: boolean;\n\n maxBadges?: number;\n className?: string;\n}\n\nexport function CreatorScoreInline({ getClient, address, size = \"sm\", showBadges = false, maxBadges = 6, className }: CreatorScoreInlineProps) {\n const { data } = useRewards(getClient, address);\n if (!data || data.totalXp <= 0) return null;\n\n return (\n <div className={className}>\n <Link href=\"/rewards\" className=\"inline-flex active:opacity-80\">\n <LevelBadge level={data.currentLevel} name={data.currentLevelName} badgeColor={data.badgeColor} size={size} />\n </Link>\n {showBadges && data.badges.length > 0 && (\n <BadgeShelf badges={data.badges.slice(0, maxBadges)} className=\"mt-2\" />\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBI;AAtBJ,kBAAiB;AAEjB,yBAA2B;AAC3B,yBAA2B;AAC3B,yBAA2B;AAapB,SAAS,mBAAmB,EAAE,WAAW,SAAS,OAAO,MAAM,aAAa,OAAO,YAAY,GAAG,UAAU,GAA4B;AAC7I,QAAM,EAAE,KAAK,QAAI,+BAAW,WAAW,OAAO;AAC9C,MAAI,CAAC,QAAQ,KAAK,WAAW,EAAG,QAAO;AAEvC,SACE,6CAAC,SAAI,WACH;AAAA,gDAAC,YAAAA,SAAA,EAAK,MAAK,YAAW,WAAU,iCAC9B,sDAAC,iCAAW,OAAO,KAAK,cAAc,MAAM,KAAK,kBAAkB,YAAY,KAAK,YAAY,MAAY,GAC9G;AAAA,IACC,cAAc,KAAK,OAAO,SAAS,KAClC,4CAAC,iCAAW,QAAQ,KAAK,OAAO,MAAM,GAAG,SAAS,GAAG,WAAU,QAAO;AAAA,KAE1E;AAEJ;","names":["Link"]}
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
- import Link from "next/link";
3
+ import Link from "./link.js";
4
4
  import { LevelBadge } from "./rewards/level-badge.js";
5
5
  import { BadgeShelf } from "./rewards/badge-shelf.js";
6
6
  import { useRewards } from "../utils/use-rewards.js";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/creator-score-inline.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport type { MedialaneClient } from \"@medialane/sdk/starknet\";\nimport { LevelBadge } from \"./rewards/level-badge.js\";\nimport { BadgeShelf } from \"./rewards/badge-shelf.js\";\nimport { useRewards } from \"../utils/use-rewards.js\";\n\nexport interface CreatorScoreInlineProps {\n getClient: () => MedialaneClient;\n address: string | null | undefined;\n size?: \"sm\" | \"md\" | \"lg\";\n\n showBadges?: boolean;\n\n maxBadges?: number;\n className?: string;\n}\n\nexport function CreatorScoreInline({ getClient, address, size = \"sm\", showBadges = false, maxBadges = 6, className }: CreatorScoreInlineProps) {\n const { data } = useRewards(getClient, address);\n if (!data || data.totalXp <= 0) return null;\n\n return (\n <div className={className}>\n <Link href=\"/rewards\" className=\"inline-flex active:opacity-80\">\n <LevelBadge level={data.currentLevel} name={data.currentLevelName} badgeColor={data.badgeColor} size={size} />\n </Link>\n {showBadges && data.badges.length > 0 && (\n <BadgeShelf badges={data.badges.slice(0, maxBadges)} className=\"mt-2\" />\n )}\n </div>\n );\n}\n"],"mappings":";AAwBI,SAEI,KAFJ;AAtBJ,OAAO,UAAU;AAEjB,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB;AAapB,SAAS,mBAAmB,EAAE,WAAW,SAAS,OAAO,MAAM,aAAa,OAAO,YAAY,GAAG,UAAU,GAA4B;AAC7I,QAAM,EAAE,KAAK,IAAI,WAAW,WAAW,OAAO;AAC9C,MAAI,CAAC,QAAQ,KAAK,WAAW,EAAG,QAAO;AAEvC,SACE,qBAAC,SAAI,WACH;AAAA,wBAAC,QAAK,MAAK,YAAW,WAAU,iCAC9B,8BAAC,cAAW,OAAO,KAAK,cAAc,MAAM,KAAK,kBAAkB,YAAY,KAAK,YAAY,MAAY,GAC9G;AAAA,IACC,cAAc,KAAK,OAAO,SAAS,KAClC,oBAAC,cAAW,QAAQ,KAAK,OAAO,MAAM,GAAG,SAAS,GAAG,WAAU,QAAO;AAAA,KAE1E;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/components/creator-score-inline.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"./link.js\";\nimport type { MedialaneClient } from \"@medialane/sdk/starknet\";\nimport { LevelBadge } from \"./rewards/level-badge.js\";\nimport { BadgeShelf } from \"./rewards/badge-shelf.js\";\nimport { useRewards } from \"../utils/use-rewards.js\";\n\nexport interface CreatorScoreInlineProps {\n getClient: () => MedialaneClient;\n address: string | null | undefined;\n size?: \"sm\" | \"md\" | \"lg\";\n\n showBadges?: boolean;\n\n maxBadges?: number;\n className?: string;\n}\n\nexport function CreatorScoreInline({ getClient, address, size = \"sm\", showBadges = false, maxBadges = 6, className }: CreatorScoreInlineProps) {\n const { data } = useRewards(getClient, address);\n if (!data || data.totalXp <= 0) return null;\n\n return (\n <div className={className}>\n <Link href=\"/rewards\" className=\"inline-flex active:opacity-80\">\n <LevelBadge level={data.currentLevel} name={data.currentLevelName} badgeColor={data.badgeColor} size={size} />\n </Link>\n {showBadges && data.badges.length > 0 && (\n <BadgeShelf badges={data.badges.slice(0, maxBadges)} className=\"mt-2\" />\n )}\n </div>\n );\n}\n"],"mappings":";AAwBI,SAEI,KAFJ;AAtBJ,OAAO,UAAU;AAEjB,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB;AAapB,SAAS,mBAAmB,EAAE,WAAW,SAAS,OAAO,MAAM,aAAa,OAAO,YAAY,GAAG,UAAU,GAA4B;AAC7I,QAAM,EAAE,KAAK,IAAI,WAAW,WAAW,OAAO;AAC9C,MAAI,CAAC,QAAQ,KAAK,WAAW,EAAG,QAAO;AAEvC,SACE,qBAAC,SAAI,WACH;AAAA,wBAAC,QAAK,MAAK,YAAW,WAAU,iCAC9B,8BAAC,cAAW,OAAO,KAAK,cAAc,MAAM,KAAK,kBAAkB,YAAY,KAAK,YAAY,MAAY,GAC9G;AAAA,IACC,cAAc,KAAK,OAAO,SAAS,KAClC,oBAAC,cAAW,QAAQ,KAAK,OAAO,MAAM,GAAG,SAAS,GAAG,WAAU,QAAO;AAAA,KAE1E;AAEJ;","names":[]}
@@ -32,7 +32,7 @@ __export(cta_card_grid_exports, {
32
32
  });
33
33
  module.exports = __toCommonJS(cta_card_grid_exports);
34
34
  var import_jsx_runtime = require("react/jsx-runtime");
35
- var import_link = __toESM(require("next/link"), 1);
35
+ var import_link = __toESM(require("./link.js"), 1);
36
36
  var import_lucide_react = require("lucide-react");
37
37
  var import_cn = require("../utils/cn.js");
38
38
  function CtaCard({ icon: Icon, title, description, links, href, gradient, iconGradient }) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/cta-card-grid.tsx"],"sourcesContent":["import type { ElementType } from \"react\";\nimport Link from \"next/link\";\nimport { ArrowRight } from \"lucide-react\";\nimport { cn } from \"../utils/cn.js\";\n\nexport interface CtaCardItem {\n icon: ElementType;\n title: string;\n description: string;\n links: { label: string; href: string }[];\n href: string;\n\n gradient: string;\n\n iconGradient: string;\n}\n\nexport interface CtaCardGridProps {\n cards: CtaCardItem[];\n}\n\nfunction CtaCard({ icon: Icon, title, description, links, href, gradient, iconGradient }: CtaCardItem) {\n return (\n <div className=\"bento-cell p-6 sm:p-8 flex flex-col gap-6 relative overflow-hidden group hover:border-border/80 transition-colors\">\n <div className={`absolute inset-0 opacity-[0.03] group-hover:opacity-[0.06] transition-opacity ${gradient} pointer-events-none`} />\n\n <div className=\"relative z-10 space-y-3\">\n <div className={cn(\"h-11 w-11 rounded-2xl flex items-center justify-center shadow-lg\", iconGradient)}>\n <Icon className=\"h-5 w-5 text-white\" />\n </div>\n <div>\n <h3 className=\"text-xl font-black\">{title}</h3>\n <p className=\"text-sm text-muted-foreground leading-relaxed mt-1\">{description}</p>\n </div>\n </div>\n\n <ul className=\"relative z-10 space-y-2\">\n {links.map((link) => (\n <li key={link.href}>\n <Link href={link.href} className=\"flex items-center gap-2.5 text-sm text-muted-foreground hover:text-foreground transition-colors group/link\">\n <ArrowRight className=\"h-3.5 w-3.5 text-primary opacity-0 group-hover/link:opacity-100 transition-opacity shrink-0 -ml-0.5\" />\n {link.label}\n </Link>\n </li>\n ))}\n </ul>\n\n <div className=\"relative z-10 mt-auto\">\n <Link href={href} className=\"inline-flex items-center gap-1.5 text-sm border border-border rounded-md px-3 py-1.5 hover:border-primary/40 transition-colors group-hover:border-primary/40\">\n Explore {title} <ArrowRight className=\"h-3.5 w-3.5 ml-1.5\" />\n </Link>\n </div>\n </div>\n );\n}\n\nexport function CtaCardGrid({ cards }: CtaCardGridProps) {\n return (\n <section className=\"space-y-5\">\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n {cards.map((card) => (\n <CtaCard key={card.title} {...card} />\n ))}\n </div>\n </section>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBM;AAvBN,kBAAiB;AACjB,0BAA2B;AAC3B,gBAAmB;AAkBnB,SAAS,QAAQ,EAAE,MAAM,MAAM,OAAO,aAAa,OAAO,MAAM,UAAU,aAAa,GAAgB;AACrG,SACE,6CAAC,SAAI,WAAU,qHACb;AAAA,gDAAC,SAAI,WAAW,iFAAiF,QAAQ,wBAAwB;AAAA,IAEjI,6CAAC,SAAI,WAAU,2BACb;AAAA,kDAAC,SAAI,eAAW,cAAG,oEAAoE,YAAY,GACjG,sDAAC,QAAK,WAAU,sBAAqB,GACvC;AAAA,MACA,6CAAC,SACC;AAAA,oDAAC,QAAG,WAAU,sBAAsB,iBAAM;AAAA,QAC1C,4CAAC,OAAE,WAAU,sDAAsD,uBAAY;AAAA,SACjF;AAAA,OACF;AAAA,IAEA,4CAAC,QAAG,WAAU,2BACX,gBAAM,IAAI,CAAC,SACV,4CAAC,QACC,uDAAC,YAAAA,SAAA,EAAK,MAAM,KAAK,MAAM,WAAU,8GAC/B;AAAA,kDAAC,kCAAW,WAAU,uGAAsG;AAAA,MAC3H,KAAK;AAAA,OACR,KAJO,KAAK,IAKd,CACD,GACH;AAAA,IAEA,4CAAC,SAAI,WAAU,yBACb,uDAAC,YAAAA,SAAA,EAAK,MAAY,WAAU,gKAA+J;AAAA;AAAA,MAChL;AAAA,MAAM;AAAA,MAAC,4CAAC,kCAAW,WAAU,sBAAqB;AAAA,OAC7D,GACF;AAAA,KACF;AAEJ;AAEO,SAAS,YAAY,EAAE,MAAM,GAAqB;AACvD,SACE,4CAAC,aAAQ,WAAU,aACjB,sDAAC,SAAI,WAAU,yCACZ,gBAAM,IAAI,CAAC,SACV,4CAAC,WAA0B,GAAG,QAAhB,KAAK,KAAiB,CACrC,GACH,GACF;AAEJ;","names":["Link"]}
1
+ {"version":3,"sources":["../../src/components/cta-card-grid.tsx"],"sourcesContent":["import type { ElementType } from \"react\";\nimport Link from \"./link.js\";\nimport { ArrowRight } from \"lucide-react\";\nimport { cn } from \"../utils/cn.js\";\n\nexport interface CtaCardItem {\n icon: ElementType;\n title: string;\n description: string;\n links: { label: string; href: string }[];\n href: string;\n\n gradient: string;\n\n iconGradient: string;\n}\n\nexport interface CtaCardGridProps {\n cards: CtaCardItem[];\n}\n\nfunction CtaCard({ icon: Icon, title, description, links, href, gradient, iconGradient }: CtaCardItem) {\n return (\n <div className=\"bento-cell p-6 sm:p-8 flex flex-col gap-6 relative overflow-hidden group hover:border-border/80 transition-colors\">\n <div className={`absolute inset-0 opacity-[0.03] group-hover:opacity-[0.06] transition-opacity ${gradient} pointer-events-none`} />\n\n <div className=\"relative z-10 space-y-3\">\n <div className={cn(\"h-11 w-11 rounded-2xl flex items-center justify-center shadow-lg\", iconGradient)}>\n <Icon className=\"h-5 w-5 text-white\" />\n </div>\n <div>\n <h3 className=\"text-xl font-black\">{title}</h3>\n <p className=\"text-sm text-muted-foreground leading-relaxed mt-1\">{description}</p>\n </div>\n </div>\n\n <ul className=\"relative z-10 space-y-2\">\n {links.map((link) => (\n <li key={link.href}>\n <Link href={link.href} className=\"flex items-center gap-2.5 text-sm text-muted-foreground hover:text-foreground transition-colors group/link\">\n <ArrowRight className=\"h-3.5 w-3.5 text-primary opacity-0 group-hover/link:opacity-100 transition-opacity shrink-0 -ml-0.5\" />\n {link.label}\n </Link>\n </li>\n ))}\n </ul>\n\n <div className=\"relative z-10 mt-auto\">\n <Link href={href} className=\"inline-flex items-center gap-1.5 text-sm border border-border rounded-md px-3 py-1.5 hover:border-primary/40 transition-colors group-hover:border-primary/40\">\n Explore {title} <ArrowRight className=\"h-3.5 w-3.5 ml-1.5\" />\n </Link>\n </div>\n </div>\n );\n}\n\nexport function CtaCardGrid({ cards }: CtaCardGridProps) {\n return (\n <section className=\"space-y-5\">\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n {cards.map((card) => (\n <CtaCard key={card.title} {...card} />\n ))}\n </div>\n </section>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBM;AAvBN,kBAAiB;AACjB,0BAA2B;AAC3B,gBAAmB;AAkBnB,SAAS,QAAQ,EAAE,MAAM,MAAM,OAAO,aAAa,OAAO,MAAM,UAAU,aAAa,GAAgB;AACrG,SACE,6CAAC,SAAI,WAAU,qHACb;AAAA,gDAAC,SAAI,WAAW,iFAAiF,QAAQ,wBAAwB;AAAA,IAEjI,6CAAC,SAAI,WAAU,2BACb;AAAA,kDAAC,SAAI,eAAW,cAAG,oEAAoE,YAAY,GACjG,sDAAC,QAAK,WAAU,sBAAqB,GACvC;AAAA,MACA,6CAAC,SACC;AAAA,oDAAC,QAAG,WAAU,sBAAsB,iBAAM;AAAA,QAC1C,4CAAC,OAAE,WAAU,sDAAsD,uBAAY;AAAA,SACjF;AAAA,OACF;AAAA,IAEA,4CAAC,QAAG,WAAU,2BACX,gBAAM,IAAI,CAAC,SACV,4CAAC,QACC,uDAAC,YAAAA,SAAA,EAAK,MAAM,KAAK,MAAM,WAAU,8GAC/B;AAAA,kDAAC,kCAAW,WAAU,uGAAsG;AAAA,MAC3H,KAAK;AAAA,OACR,KAJO,KAAK,IAKd,CACD,GACH;AAAA,IAEA,4CAAC,SAAI,WAAU,yBACb,uDAAC,YAAAA,SAAA,EAAK,MAAY,WAAU,gKAA+J;AAAA;AAAA,MAChL;AAAA,MAAM;AAAA,MAAC,4CAAC,kCAAW,WAAU,sBAAqB;AAAA,OAC7D,GACF;AAAA,KACF;AAEJ;AAEO,SAAS,YAAY,EAAE,MAAM,GAAqB;AACvD,SACE,4CAAC,aAAQ,WAAU,aACjB,sDAAC,SAAI,WAAU,yCACZ,gBAAM,IAAI,CAAC,SACV,4CAAC,WAA0B,GAAG,QAAhB,KAAK,KAAiB,CACrC,GACH,GACF;AAEJ;","names":["Link"]}
@@ -1,5 +1,5 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
- import Link from "next/link";
2
+ import Link from "./link.js";
3
3
  import { ArrowRight } from "lucide-react";
4
4
  import { cn } from "../utils/cn.js";
5
5
  function CtaCard({ icon: Icon, title, description, links, href, gradient, iconGradient }) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/cta-card-grid.tsx"],"sourcesContent":["import type { ElementType } from \"react\";\nimport Link from \"next/link\";\nimport { ArrowRight } from \"lucide-react\";\nimport { cn } from \"../utils/cn.js\";\n\nexport interface CtaCardItem {\n icon: ElementType;\n title: string;\n description: string;\n links: { label: string; href: string }[];\n href: string;\n\n gradient: string;\n\n iconGradient: string;\n}\n\nexport interface CtaCardGridProps {\n cards: CtaCardItem[];\n}\n\nfunction CtaCard({ icon: Icon, title, description, links, href, gradient, iconGradient }: CtaCardItem) {\n return (\n <div className=\"bento-cell p-6 sm:p-8 flex flex-col gap-6 relative overflow-hidden group hover:border-border/80 transition-colors\">\n <div className={`absolute inset-0 opacity-[0.03] group-hover:opacity-[0.06] transition-opacity ${gradient} pointer-events-none`} />\n\n <div className=\"relative z-10 space-y-3\">\n <div className={cn(\"h-11 w-11 rounded-2xl flex items-center justify-center shadow-lg\", iconGradient)}>\n <Icon className=\"h-5 w-5 text-white\" />\n </div>\n <div>\n <h3 className=\"text-xl font-black\">{title}</h3>\n <p className=\"text-sm text-muted-foreground leading-relaxed mt-1\">{description}</p>\n </div>\n </div>\n\n <ul className=\"relative z-10 space-y-2\">\n {links.map((link) => (\n <li key={link.href}>\n <Link href={link.href} className=\"flex items-center gap-2.5 text-sm text-muted-foreground hover:text-foreground transition-colors group/link\">\n <ArrowRight className=\"h-3.5 w-3.5 text-primary opacity-0 group-hover/link:opacity-100 transition-opacity shrink-0 -ml-0.5\" />\n {link.label}\n </Link>\n </li>\n ))}\n </ul>\n\n <div className=\"relative z-10 mt-auto\">\n <Link href={href} className=\"inline-flex items-center gap-1.5 text-sm border border-border rounded-md px-3 py-1.5 hover:border-primary/40 transition-colors group-hover:border-primary/40\">\n Explore {title} <ArrowRight className=\"h-3.5 w-3.5 ml-1.5\" />\n </Link>\n </div>\n </div>\n );\n}\n\nexport function CtaCardGrid({ cards }: CtaCardGridProps) {\n return (\n <section className=\"space-y-5\">\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n {cards.map((card) => (\n <CtaCard key={card.title} {...card} />\n ))}\n </div>\n </section>\n );\n}\n"],"mappings":"AAwBM,cAME,YANF;AAvBN,OAAO,UAAU;AACjB,SAAS,kBAAkB;AAC3B,SAAS,UAAU;AAkBnB,SAAS,QAAQ,EAAE,MAAM,MAAM,OAAO,aAAa,OAAO,MAAM,UAAU,aAAa,GAAgB;AACrG,SACE,qBAAC,SAAI,WAAU,qHACb;AAAA,wBAAC,SAAI,WAAW,iFAAiF,QAAQ,wBAAwB;AAAA,IAEjI,qBAAC,SAAI,WAAU,2BACb;AAAA,0BAAC,SAAI,WAAW,GAAG,oEAAoE,YAAY,GACjG,8BAAC,QAAK,WAAU,sBAAqB,GACvC;AAAA,MACA,qBAAC,SACC;AAAA,4BAAC,QAAG,WAAU,sBAAsB,iBAAM;AAAA,QAC1C,oBAAC,OAAE,WAAU,sDAAsD,uBAAY;AAAA,SACjF;AAAA,OACF;AAAA,IAEA,oBAAC,QAAG,WAAU,2BACX,gBAAM,IAAI,CAAC,SACV,oBAAC,QACC,+BAAC,QAAK,MAAM,KAAK,MAAM,WAAU,8GAC/B;AAAA,0BAAC,cAAW,WAAU,uGAAsG;AAAA,MAC3H,KAAK;AAAA,OACR,KAJO,KAAK,IAKd,CACD,GACH;AAAA,IAEA,oBAAC,SAAI,WAAU,yBACb,+BAAC,QAAK,MAAY,WAAU,gKAA+J;AAAA;AAAA,MAChL;AAAA,MAAM;AAAA,MAAC,oBAAC,cAAW,WAAU,sBAAqB;AAAA,OAC7D,GACF;AAAA,KACF;AAEJ;AAEO,SAAS,YAAY,EAAE,MAAM,GAAqB;AACvD,SACE,oBAAC,aAAQ,WAAU,aACjB,8BAAC,SAAI,WAAU,yCACZ,gBAAM,IAAI,CAAC,SACV,oBAAC,WAA0B,GAAG,QAAhB,KAAK,KAAiB,CACrC,GACH,GACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/components/cta-card-grid.tsx"],"sourcesContent":["import type { ElementType } from \"react\";\nimport Link from \"./link.js\";\nimport { ArrowRight } from \"lucide-react\";\nimport { cn } from \"../utils/cn.js\";\n\nexport interface CtaCardItem {\n icon: ElementType;\n title: string;\n description: string;\n links: { label: string; href: string }[];\n href: string;\n\n gradient: string;\n\n iconGradient: string;\n}\n\nexport interface CtaCardGridProps {\n cards: CtaCardItem[];\n}\n\nfunction CtaCard({ icon: Icon, title, description, links, href, gradient, iconGradient }: CtaCardItem) {\n return (\n <div className=\"bento-cell p-6 sm:p-8 flex flex-col gap-6 relative overflow-hidden group hover:border-border/80 transition-colors\">\n <div className={`absolute inset-0 opacity-[0.03] group-hover:opacity-[0.06] transition-opacity ${gradient} pointer-events-none`} />\n\n <div className=\"relative z-10 space-y-3\">\n <div className={cn(\"h-11 w-11 rounded-2xl flex items-center justify-center shadow-lg\", iconGradient)}>\n <Icon className=\"h-5 w-5 text-white\" />\n </div>\n <div>\n <h3 className=\"text-xl font-black\">{title}</h3>\n <p className=\"text-sm text-muted-foreground leading-relaxed mt-1\">{description}</p>\n </div>\n </div>\n\n <ul className=\"relative z-10 space-y-2\">\n {links.map((link) => (\n <li key={link.href}>\n <Link href={link.href} className=\"flex items-center gap-2.5 text-sm text-muted-foreground hover:text-foreground transition-colors group/link\">\n <ArrowRight className=\"h-3.5 w-3.5 text-primary opacity-0 group-hover/link:opacity-100 transition-opacity shrink-0 -ml-0.5\" />\n {link.label}\n </Link>\n </li>\n ))}\n </ul>\n\n <div className=\"relative z-10 mt-auto\">\n <Link href={href} className=\"inline-flex items-center gap-1.5 text-sm border border-border rounded-md px-3 py-1.5 hover:border-primary/40 transition-colors group-hover:border-primary/40\">\n Explore {title} <ArrowRight className=\"h-3.5 w-3.5 ml-1.5\" />\n </Link>\n </div>\n </div>\n );\n}\n\nexport function CtaCardGrid({ cards }: CtaCardGridProps) {\n return (\n <section className=\"space-y-5\">\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n {cards.map((card) => (\n <CtaCard key={card.title} {...card} />\n ))}\n </div>\n </section>\n );\n}\n"],"mappings":"AAwBM,cAME,YANF;AAvBN,OAAO,UAAU;AACjB,SAAS,kBAAkB;AAC3B,SAAS,UAAU;AAkBnB,SAAS,QAAQ,EAAE,MAAM,MAAM,OAAO,aAAa,OAAO,MAAM,UAAU,aAAa,GAAgB;AACrG,SACE,qBAAC,SAAI,WAAU,qHACb;AAAA,wBAAC,SAAI,WAAW,iFAAiF,QAAQ,wBAAwB;AAAA,IAEjI,qBAAC,SAAI,WAAU,2BACb;AAAA,0BAAC,SAAI,WAAW,GAAG,oEAAoE,YAAY,GACjG,8BAAC,QAAK,WAAU,sBAAqB,GACvC;AAAA,MACA,qBAAC,SACC;AAAA,4BAAC,QAAG,WAAU,sBAAsB,iBAAM;AAAA,QAC1C,oBAAC,OAAE,WAAU,sDAAsD,uBAAY;AAAA,SACjF;AAAA,OACF;AAAA,IAEA,oBAAC,QAAG,WAAU,2BACX,gBAAM,IAAI,CAAC,SACV,oBAAC,QACC,+BAAC,QAAK,MAAM,KAAK,MAAM,WAAU,8GAC/B;AAAA,0BAAC,cAAW,WAAU,uGAAsG;AAAA,MAC3H,KAAK;AAAA,OACR,KAJO,KAAK,IAKd,CACD,GACH;AAAA,IAEA,oBAAC,SAAI,WAAU,yBACb,+BAAC,QAAK,MAAY,WAAU,gKAA+J;AAAA;AAAA,MAChL;AAAA,MAAM;AAAA,MAAC,oBAAC,cAAW,WAAU,sBAAqB;AAAA,OAC7D,GACF;AAAA,KACF;AAEJ;AAEO,SAAS,YAAY,EAAE,MAAM,GAAqB;AACvD,SACE,oBAAC,aAAQ,WAAU,aACjB,8BAAC,SAAI,WAAU,yCACZ,gBAAM,IAAI,CAAC,SACV,oBAAC,WAA0B,GAAG,QAAhB,KAAK,KAAiB,CACrC,GACH,GACF;AAEJ;","names":[]}
@@ -34,7 +34,7 @@ __export(currency_icon_exports, {
34
34
  });
35
35
  module.exports = __toCommonJS(currency_icon_exports);
36
36
  var import_jsx_runtime = require("react/jsx-runtime");
37
- var import_image = __toESM(require("next/image"), 1);
37
+ var import_image = __toESM(require("./image.js"), 1);
38
38
  var import_cn = require("../utils/cn.js");
39
39
  const CURRENCY_ICON_PATHS = {
40
40
  USDC: "/usdc.svg",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/currency-icon.tsx"],"sourcesContent":["\"use client\";\n\nimport Image from \"next/image\";\nimport { cn } from \"../utils/cn.js\";\n\nconst CURRENCY_ICON_PATHS: Record<string, string> = {\n USDC: \"/usdc.svg\",\n USDT: \"/usdt.svg\",\n ETH: \"/eth.svg\",\n STRK: \"/strk.svg\",\n WBTC: \"/btc.svg\",\n};\n\nexport interface CurrencyIconProps {\n symbol: string | null | undefined;\n size?: number;\n className?: string;\n\n iconsBasePath?: string;\n}\n\nexport function CurrencyIcon({ symbol, size = 16, className, iconsBasePath = \"\" }: CurrencyIconProps) {\n const path = symbol ? CURRENCY_ICON_PATHS[symbol] : undefined;\n if (!path) return null;\n return (\n <Image\n src={`${iconsBasePath}${path}`}\n alt={symbol ?? \"\"}\n width={size}\n height={size}\n className={cn(\"inline-block shrink-0\", className)}\n unoptimized\n />\n );\n}\n\nexport interface CurrencyAmountProps {\n amount: string;\n symbol: string | null | undefined;\n amountClassName?: string;\n iconSize?: number;\n className?: string;\n\n iconsBasePath?: string;\n}\n\nexport function CurrencyAmount({\n amount,\n symbol,\n amountClassName,\n iconSize = 14,\n className,\n iconsBasePath,\n}: CurrencyAmountProps) {\n return (\n <span className={cn(\"inline-flex items-center gap-1\", className)}>\n <CurrencyIcon symbol={symbol} size={iconSize} iconsBasePath={iconsBasePath} />\n <span className={amountClassName}>{amount}</span>\n </span>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBI;AAvBJ,mBAAkB;AAClB,gBAAmB;AAEnB,MAAM,sBAA8C;AAAA,EAClD,MAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AACR;AAUO,SAAS,aAAa,EAAE,QAAQ,OAAO,IAAI,WAAW,gBAAgB,GAAG,GAAsB;AACpG,QAAM,OAAO,SAAS,oBAAoB,MAAM,IAAI;AACpD,MAAI,CAAC,KAAM,QAAO;AAClB,SACE;AAAA,IAAC,aAAAA;AAAA,IAAA;AAAA,MACC,KAAK,GAAG,aAAa,GAAG,IAAI;AAAA,MAC5B,KAAK,UAAU;AAAA,MACf,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,eAAW,cAAG,yBAAyB,SAAS;AAAA,MAChD,aAAW;AAAA;AAAA,EACb;AAEJ;AAYO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AACF,GAAwB;AACtB,SACE,6CAAC,UAAK,eAAW,cAAG,kCAAkC,SAAS,GAC7D;AAAA,gDAAC,gBAAa,QAAgB,MAAM,UAAU,eAA8B;AAAA,IAC5E,4CAAC,UAAK,WAAW,iBAAkB,kBAAO;AAAA,KAC5C;AAEJ;","names":["Image"]}
1
+ {"version":3,"sources":["../../src/components/currency-icon.tsx"],"sourcesContent":["\"use client\";\n\nimport Image from \"./image.js\";\nimport { cn } from \"../utils/cn.js\";\n\nconst CURRENCY_ICON_PATHS: Record<string, string> = {\n USDC: \"/usdc.svg\",\n USDT: \"/usdt.svg\",\n ETH: \"/eth.svg\",\n STRK: \"/strk.svg\",\n WBTC: \"/btc.svg\",\n};\n\nexport interface CurrencyIconProps {\n symbol: string | null | undefined;\n size?: number;\n className?: string;\n\n iconsBasePath?: string;\n}\n\nexport function CurrencyIcon({ symbol, size = 16, className, iconsBasePath = \"\" }: CurrencyIconProps) {\n const path = symbol ? CURRENCY_ICON_PATHS[symbol] : undefined;\n if (!path) return null;\n return (\n <Image\n src={`${iconsBasePath}${path}`}\n alt={symbol ?? \"\"}\n width={size}\n height={size}\n className={cn(\"inline-block shrink-0\", className)}\n unoptimized\n />\n );\n}\n\nexport interface CurrencyAmountProps {\n amount: string;\n symbol: string | null | undefined;\n amountClassName?: string;\n iconSize?: number;\n className?: string;\n\n iconsBasePath?: string;\n}\n\nexport function CurrencyAmount({\n amount,\n symbol,\n amountClassName,\n iconSize = 14,\n className,\n iconsBasePath,\n}: CurrencyAmountProps) {\n return (\n <span className={cn(\"inline-flex items-center gap-1\", className)}>\n <CurrencyIcon symbol={symbol} size={iconSize} iconsBasePath={iconsBasePath} />\n <span className={amountClassName}>{amount}</span>\n </span>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBI;AAvBJ,mBAAkB;AAClB,gBAAmB;AAEnB,MAAM,sBAA8C;AAAA,EAClD,MAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AACR;AAUO,SAAS,aAAa,EAAE,QAAQ,OAAO,IAAI,WAAW,gBAAgB,GAAG,GAAsB;AACpG,QAAM,OAAO,SAAS,oBAAoB,MAAM,IAAI;AACpD,MAAI,CAAC,KAAM,QAAO;AAClB,SACE;AAAA,IAAC,aAAAA;AAAA,IAAA;AAAA,MACC,KAAK,GAAG,aAAa,GAAG,IAAI;AAAA,MAC5B,KAAK,UAAU;AAAA,MACf,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,eAAW,cAAG,yBAAyB,SAAS;AAAA,MAChD,aAAW;AAAA;AAAA,EACb;AAEJ;AAYO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AACF,GAAwB;AACtB,SACE,6CAAC,UAAK,eAAW,cAAG,kCAAkC,SAAS,GAC7D;AAAA,gDAAC,gBAAa,QAAgB,MAAM,UAAU,eAA8B;AAAA,IAC5E,4CAAC,UAAK,WAAW,iBAAkB,kBAAO;AAAA,KAC5C;AAEJ;","names":["Image"]}
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
- import Image from "next/image";
3
+ import Image from "./image.js";
4
4
  import { cn } from "../utils/cn.js";
5
5
  const CURRENCY_ICON_PATHS = {
6
6
  USDC: "/usdc.svg",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/currency-icon.tsx"],"sourcesContent":["\"use client\";\n\nimport Image from \"next/image\";\nimport { cn } from \"../utils/cn.js\";\n\nconst CURRENCY_ICON_PATHS: Record<string, string> = {\n USDC: \"/usdc.svg\",\n USDT: \"/usdt.svg\",\n ETH: \"/eth.svg\",\n STRK: \"/strk.svg\",\n WBTC: \"/btc.svg\",\n};\n\nexport interface CurrencyIconProps {\n symbol: string | null | undefined;\n size?: number;\n className?: string;\n\n iconsBasePath?: string;\n}\n\nexport function CurrencyIcon({ symbol, size = 16, className, iconsBasePath = \"\" }: CurrencyIconProps) {\n const path = symbol ? CURRENCY_ICON_PATHS[symbol] : undefined;\n if (!path) return null;\n return (\n <Image\n src={`${iconsBasePath}${path}`}\n alt={symbol ?? \"\"}\n width={size}\n height={size}\n className={cn(\"inline-block shrink-0\", className)}\n unoptimized\n />\n );\n}\n\nexport interface CurrencyAmountProps {\n amount: string;\n symbol: string | null | undefined;\n amountClassName?: string;\n iconSize?: number;\n className?: string;\n\n iconsBasePath?: string;\n}\n\nexport function CurrencyAmount({\n amount,\n symbol,\n amountClassName,\n iconSize = 14,\n className,\n iconsBasePath,\n}: CurrencyAmountProps) {\n return (\n <span className={cn(\"inline-flex items-center gap-1\", className)}>\n <CurrencyIcon symbol={symbol} size={iconSize} iconsBasePath={iconsBasePath} />\n <span className={amountClassName}>{amount}</span>\n </span>\n );\n}\n"],"mappings":";AAyBI,cA8BA,YA9BA;AAvBJ,OAAO,WAAW;AAClB,SAAS,UAAU;AAEnB,MAAM,sBAA8C;AAAA,EAClD,MAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AACR;AAUO,SAAS,aAAa,EAAE,QAAQ,OAAO,IAAI,WAAW,gBAAgB,GAAG,GAAsB;AACpG,QAAM,OAAO,SAAS,oBAAoB,MAAM,IAAI;AACpD,MAAI,CAAC,KAAM,QAAO;AAClB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK,GAAG,aAAa,GAAG,IAAI;AAAA,MAC5B,KAAK,UAAU;AAAA,MACf,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,WAAW,GAAG,yBAAyB,SAAS;AAAA,MAChD,aAAW;AAAA;AAAA,EACb;AAEJ;AAYO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AACF,GAAwB;AACtB,SACE,qBAAC,UAAK,WAAW,GAAG,kCAAkC,SAAS,GAC7D;AAAA,wBAAC,gBAAa,QAAgB,MAAM,UAAU,eAA8B;AAAA,IAC5E,oBAAC,UAAK,WAAW,iBAAkB,kBAAO;AAAA,KAC5C;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/components/currency-icon.tsx"],"sourcesContent":["\"use client\";\n\nimport Image from \"./image.js\";\nimport { cn } from \"../utils/cn.js\";\n\nconst CURRENCY_ICON_PATHS: Record<string, string> = {\n USDC: \"/usdc.svg\",\n USDT: \"/usdt.svg\",\n ETH: \"/eth.svg\",\n STRK: \"/strk.svg\",\n WBTC: \"/btc.svg\",\n};\n\nexport interface CurrencyIconProps {\n symbol: string | null | undefined;\n size?: number;\n className?: string;\n\n iconsBasePath?: string;\n}\n\nexport function CurrencyIcon({ symbol, size = 16, className, iconsBasePath = \"\" }: CurrencyIconProps) {\n const path = symbol ? CURRENCY_ICON_PATHS[symbol] : undefined;\n if (!path) return null;\n return (\n <Image\n src={`${iconsBasePath}${path}`}\n alt={symbol ?? \"\"}\n width={size}\n height={size}\n className={cn(\"inline-block shrink-0\", className)}\n unoptimized\n />\n );\n}\n\nexport interface CurrencyAmountProps {\n amount: string;\n symbol: string | null | undefined;\n amountClassName?: string;\n iconSize?: number;\n className?: string;\n\n iconsBasePath?: string;\n}\n\nexport function CurrencyAmount({\n amount,\n symbol,\n amountClassName,\n iconSize = 14,\n className,\n iconsBasePath,\n}: CurrencyAmountProps) {\n return (\n <span className={cn(\"inline-flex items-center gap-1\", className)}>\n <CurrencyIcon symbol={symbol} size={iconSize} iconsBasePath={iconsBasePath} />\n <span className={amountClassName}>{amount}</span>\n </span>\n );\n}\n"],"mappings":";AAyBI,cA8BA,YA9BA;AAvBJ,OAAO,WAAW;AAClB,SAAS,UAAU;AAEnB,MAAM,sBAA8C;AAAA,EAClD,MAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AACR;AAUO,SAAS,aAAa,EAAE,QAAQ,OAAO,IAAI,WAAW,gBAAgB,GAAG,GAAsB;AACpG,QAAM,OAAO,SAAS,oBAAoB,MAAM,IAAI;AACpD,MAAI,CAAC,KAAM,QAAO;AAClB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK,GAAG,aAAa,GAAG,IAAI;AAAA,MAC5B,KAAK,UAAU;AAAA,MACf,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,WAAW,GAAG,yBAAyB,SAAS;AAAA,MAChD,aAAW;AAAA;AAAA,EACb;AAEJ;AAYO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AACF,GAAwB;AACtB,SACE,qBAAC,UAAK,WAAW,GAAG,kCAAkC,SAAS,GAC7D;AAAA,wBAAC,gBAAa,QAAgB,MAAM,UAAU,eAA8B;AAAA,IAC5E,oBAAC,UAAK,WAAW,iBAAkB,kBAAO;AAAA,KAC5C;AAEJ;","names":[]}
@@ -35,7 +35,7 @@ module.exports = __toCommonJS(empty_or_error_exports);
35
35
  var import_jsx_runtime = require("react/jsx-runtime");
36
36
  var import_skeleton = require("./skeleton.js");
37
37
  var import_button = require("./button.js");
38
- var import_link = __toESM(require("next/link"), 1);
38
+ var import_link = __toESM(require("./link.js"), 1);
39
39
  var import_lucide_react = require("lucide-react");
40
40
  function EmptyOrError({
41
41
  isLoading,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/empty-or-error.tsx"],"sourcesContent":["\"use client\";\n\nimport { Skeleton } from \"./skeleton.js\";\nimport { Button } from \"./button.js\";\nimport Link from \"next/link\";\nimport { RefreshCw, AlertCircle } from \"lucide-react\";\nimport { ReactNode } from \"react\";\n\ninterface EmptyOrErrorProps {\n isLoading: boolean;\n error?: unknown;\n isEmpty: boolean;\n onRetry?: () => void;\n emptyTitle: string;\n emptyDescription?: string;\n emptyCta?: { label: string; href: string };\n emptyIcon?: ReactNode;\n skeletonCount?: number;\n\n skeletonNode?: ReactNode;\n children?: ReactNode;\n}\n\nexport function EmptyOrError({\n isLoading,\n error,\n isEmpty,\n onRetry,\n emptyTitle,\n emptyDescription,\n emptyCta,\n emptyIcon,\n skeletonCount = 4,\n skeletonNode,\n children,\n}: EmptyOrErrorProps) {\n if (isLoading) {\n if (skeletonNode) return <>{skeletonNode}</>;\n return (\n <div className=\"space-y-3\">\n {Array.from({ length: skeletonCount }).map((_, i) => (\n <Skeleton key={i} className=\"h-20 w-full rounded-xl\" />\n ))}\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"py-16 text-center space-y-4\">\n <div className=\"h-14 w-14 rounded-xl bg-destructive/10 flex items-center justify-center mx-auto\">\n <AlertCircle className=\"h-7 w-7 text-destructive\" />\n </div>\n <p className=\"font-semibold text-lg\">Something went wrong</p>\n <p className=\"text-sm text-muted-foreground max-w-xs mx-auto\">\n {error instanceof Error ? error.message : \"Failed to load data. Please try again.\"}\n </p>\n {onRetry && (\n <Button variant=\"outline\" size=\"sm\" onClick={onRetry}>\n <RefreshCw className=\"h-3.5 w-3.5 mr-1.5\" />\n Try again\n </Button>\n )}\n </div>\n );\n }\n\n if (isEmpty) {\n return (\n <div className=\"py-16 text-center space-y-4\">\n {emptyIcon && (\n <div className=\"h-14 w-14 rounded-xl bg-muted flex items-center justify-center mx-auto\">\n {emptyIcon}\n </div>\n )}\n <p className=\"font-semibold text-lg\">{emptyTitle}</p>\n {emptyDescription && (\n <p className=\"text-sm text-muted-foreground max-w-xs mx-auto\">{emptyDescription}</p>\n )}\n <div className=\"flex items-center justify-center gap-3\">\n {onRetry && (\n <Button variant=\"outline\" size=\"sm\" onClick={onRetry}>\n <RefreshCw className=\"h-3.5 w-3.5 mr-1.5\" />\n Refresh\n </Button>\n )}\n {emptyCta && (\n <Button size=\"sm\" asChild>\n <Link href={emptyCta.href}>{emptyCta.label}</Link>\n </Button>\n )}\n </div>\n </div>\n );\n }\n\n return <>{children}</>;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAqC6B;AAnC7B,sBAAyB;AACzB,oBAAuB;AACvB,kBAAiB;AACjB,0BAAuC;AAkBhC,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB;AAAA,EACA;AACF,GAAsB;AACpB,MAAI,WAAW;AACb,QAAI,aAAc,QAAO,2EAAG,wBAAa;AACzC,WACE,4CAAC,SAAI,WAAU,aACZ,gBAAM,KAAK,EAAE,QAAQ,cAAc,CAAC,EAAE,IAAI,CAAC,GAAG,MAC7C,4CAAC,4BAAiB,WAAU,4BAAb,CAAsC,CACtD,GACH;AAAA,EAEJ;AAEA,MAAI,OAAO;AACT,WACE,6CAAC,SAAI,WAAU,+BACb;AAAA,kDAAC,SAAI,WAAU,mFACb,sDAAC,mCAAY,WAAU,4BAA2B,GACpD;AAAA,MACA,4CAAC,OAAE,WAAU,yBAAwB,kCAAoB;AAAA,MACzD,4CAAC,OAAE,WAAU,kDACV,2BAAiB,QAAQ,MAAM,UAAU,0CAC5C;AAAA,MACC,WACC,6CAAC,wBAAO,SAAQ,WAAU,MAAK,MAAK,SAAS,SAC3C;AAAA,oDAAC,iCAAU,WAAU,sBAAqB;AAAA,QAAE;AAAA,SAE9C;AAAA,OAEJ;AAAA,EAEJ;AAEA,MAAI,SAAS;AACX,WACE,6CAAC,SAAI,WAAU,+BACZ;AAAA,mBACC,4CAAC,SAAI,WAAU,0EACZ,qBACH;AAAA,MAEF,4CAAC,OAAE,WAAU,yBAAyB,sBAAW;AAAA,MAChD,oBACC,4CAAC,OAAE,WAAU,kDAAkD,4BAAiB;AAAA,MAElF,6CAAC,SAAI,WAAU,0CACZ;AAAA,mBACC,6CAAC,wBAAO,SAAQ,WAAU,MAAK,MAAK,SAAS,SAC3C;AAAA,sDAAC,iCAAU,WAAU,sBAAqB;AAAA,UAAE;AAAA,WAE9C;AAAA,QAED,YACC,4CAAC,wBAAO,MAAK,MAAK,SAAO,MACvB,sDAAC,YAAAA,SAAA,EAAK,MAAM,SAAS,MAAO,mBAAS,OAAM,GAC7C;AAAA,SAEJ;AAAA,OACF;AAAA,EAEJ;AAEA,SAAO,2EAAG,UAAS;AACrB;","names":["Link"]}
1
+ {"version":3,"sources":["../../src/components/empty-or-error.tsx"],"sourcesContent":["\"use client\";\n\nimport { Skeleton } from \"./skeleton.js\";\nimport { Button } from \"./button.js\";\nimport Link from \"./link.js\";\nimport { RefreshCw, AlertCircle } from \"lucide-react\";\nimport { ReactNode } from \"react\";\n\ninterface EmptyOrErrorProps {\n isLoading: boolean;\n error?: unknown;\n isEmpty: boolean;\n onRetry?: () => void;\n emptyTitle: string;\n emptyDescription?: string;\n emptyCta?: { label: string; href: string };\n emptyIcon?: ReactNode;\n skeletonCount?: number;\n\n skeletonNode?: ReactNode;\n children?: ReactNode;\n}\n\nexport function EmptyOrError({\n isLoading,\n error,\n isEmpty,\n onRetry,\n emptyTitle,\n emptyDescription,\n emptyCta,\n emptyIcon,\n skeletonCount = 4,\n skeletonNode,\n children,\n}: EmptyOrErrorProps) {\n if (isLoading) {\n if (skeletonNode) return <>{skeletonNode}</>;\n return (\n <div className=\"space-y-3\">\n {Array.from({ length: skeletonCount }).map((_, i) => (\n <Skeleton key={i} className=\"h-20 w-full rounded-xl\" />\n ))}\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"py-16 text-center space-y-4\">\n <div className=\"h-14 w-14 rounded-xl bg-destructive/10 flex items-center justify-center mx-auto\">\n <AlertCircle className=\"h-7 w-7 text-destructive\" />\n </div>\n <p className=\"font-semibold text-lg\">Something went wrong</p>\n <p className=\"text-sm text-muted-foreground max-w-xs mx-auto\">\n {error instanceof Error ? error.message : \"Failed to load data. Please try again.\"}\n </p>\n {onRetry && (\n <Button variant=\"outline\" size=\"sm\" onClick={onRetry}>\n <RefreshCw className=\"h-3.5 w-3.5 mr-1.5\" />\n Try again\n </Button>\n )}\n </div>\n );\n }\n\n if (isEmpty) {\n return (\n <div className=\"py-16 text-center space-y-4\">\n {emptyIcon && (\n <div className=\"h-14 w-14 rounded-xl bg-muted flex items-center justify-center mx-auto\">\n {emptyIcon}\n </div>\n )}\n <p className=\"font-semibold text-lg\">{emptyTitle}</p>\n {emptyDescription && (\n <p className=\"text-sm text-muted-foreground max-w-xs mx-auto\">{emptyDescription}</p>\n )}\n <div className=\"flex items-center justify-center gap-3\">\n {onRetry && (\n <Button variant=\"outline\" size=\"sm\" onClick={onRetry}>\n <RefreshCw className=\"h-3.5 w-3.5 mr-1.5\" />\n Refresh\n </Button>\n )}\n {emptyCta && (\n <Button size=\"sm\" asChild>\n <Link href={emptyCta.href}>{emptyCta.label}</Link>\n </Button>\n )}\n </div>\n </div>\n );\n }\n\n return <>{children}</>;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAqC6B;AAnC7B,sBAAyB;AACzB,oBAAuB;AACvB,kBAAiB;AACjB,0BAAuC;AAkBhC,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB;AAAA,EACA;AACF,GAAsB;AACpB,MAAI,WAAW;AACb,QAAI,aAAc,QAAO,2EAAG,wBAAa;AACzC,WACE,4CAAC,SAAI,WAAU,aACZ,gBAAM,KAAK,EAAE,QAAQ,cAAc,CAAC,EAAE,IAAI,CAAC,GAAG,MAC7C,4CAAC,4BAAiB,WAAU,4BAAb,CAAsC,CACtD,GACH;AAAA,EAEJ;AAEA,MAAI,OAAO;AACT,WACE,6CAAC,SAAI,WAAU,+BACb;AAAA,kDAAC,SAAI,WAAU,mFACb,sDAAC,mCAAY,WAAU,4BAA2B,GACpD;AAAA,MACA,4CAAC,OAAE,WAAU,yBAAwB,kCAAoB;AAAA,MACzD,4CAAC,OAAE,WAAU,kDACV,2BAAiB,QAAQ,MAAM,UAAU,0CAC5C;AAAA,MACC,WACC,6CAAC,wBAAO,SAAQ,WAAU,MAAK,MAAK,SAAS,SAC3C;AAAA,oDAAC,iCAAU,WAAU,sBAAqB;AAAA,QAAE;AAAA,SAE9C;AAAA,OAEJ;AAAA,EAEJ;AAEA,MAAI,SAAS;AACX,WACE,6CAAC,SAAI,WAAU,+BACZ;AAAA,mBACC,4CAAC,SAAI,WAAU,0EACZ,qBACH;AAAA,MAEF,4CAAC,OAAE,WAAU,yBAAyB,sBAAW;AAAA,MAChD,oBACC,4CAAC,OAAE,WAAU,kDAAkD,4BAAiB;AAAA,MAElF,6CAAC,SAAI,WAAU,0CACZ;AAAA,mBACC,6CAAC,wBAAO,SAAQ,WAAU,MAAK,MAAK,SAAS,SAC3C;AAAA,sDAAC,iCAAU,WAAU,sBAAqB;AAAA,UAAE;AAAA,WAE9C;AAAA,QAED,YACC,4CAAC,wBAAO,MAAK,MAAK,SAAO,MACvB,sDAAC,YAAAA,SAAA,EAAK,MAAM,SAAS,MAAO,mBAAS,OAAM,GAC7C;AAAA,SAEJ;AAAA,OACF;AAAA,EAEJ;AAEA,SAAO,2EAAG,UAAS;AACrB;","names":["Link"]}
@@ -2,7 +2,7 @@
2
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
3
  import { Skeleton } from "./skeleton.js";
4
4
  import { Button } from "./button.js";
5
- import Link from "next/link";
5
+ import Link from "./link.js";
6
6
  import { RefreshCw, AlertCircle } from "lucide-react";
7
7
  function EmptyOrError({
8
8
  isLoading,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/empty-or-error.tsx"],"sourcesContent":["\"use client\";\n\nimport { Skeleton } from \"./skeleton.js\";\nimport { Button } from \"./button.js\";\nimport Link from \"next/link\";\nimport { RefreshCw, AlertCircle } from \"lucide-react\";\nimport { ReactNode } from \"react\";\n\ninterface EmptyOrErrorProps {\n isLoading: boolean;\n error?: unknown;\n isEmpty: boolean;\n onRetry?: () => void;\n emptyTitle: string;\n emptyDescription?: string;\n emptyCta?: { label: string; href: string };\n emptyIcon?: ReactNode;\n skeletonCount?: number;\n\n skeletonNode?: ReactNode;\n children?: ReactNode;\n}\n\nexport function EmptyOrError({\n isLoading,\n error,\n isEmpty,\n onRetry,\n emptyTitle,\n emptyDescription,\n emptyCta,\n emptyIcon,\n skeletonCount = 4,\n skeletonNode,\n children,\n}: EmptyOrErrorProps) {\n if (isLoading) {\n if (skeletonNode) return <>{skeletonNode}</>;\n return (\n <div className=\"space-y-3\">\n {Array.from({ length: skeletonCount }).map((_, i) => (\n <Skeleton key={i} className=\"h-20 w-full rounded-xl\" />\n ))}\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"py-16 text-center space-y-4\">\n <div className=\"h-14 w-14 rounded-xl bg-destructive/10 flex items-center justify-center mx-auto\">\n <AlertCircle className=\"h-7 w-7 text-destructive\" />\n </div>\n <p className=\"font-semibold text-lg\">Something went wrong</p>\n <p className=\"text-sm text-muted-foreground max-w-xs mx-auto\">\n {error instanceof Error ? error.message : \"Failed to load data. Please try again.\"}\n </p>\n {onRetry && (\n <Button variant=\"outline\" size=\"sm\" onClick={onRetry}>\n <RefreshCw className=\"h-3.5 w-3.5 mr-1.5\" />\n Try again\n </Button>\n )}\n </div>\n );\n }\n\n if (isEmpty) {\n return (\n <div className=\"py-16 text-center space-y-4\">\n {emptyIcon && (\n <div className=\"h-14 w-14 rounded-xl bg-muted flex items-center justify-center mx-auto\">\n {emptyIcon}\n </div>\n )}\n <p className=\"font-semibold text-lg\">{emptyTitle}</p>\n {emptyDescription && (\n <p className=\"text-sm text-muted-foreground max-w-xs mx-auto\">{emptyDescription}</p>\n )}\n <div className=\"flex items-center justify-center gap-3\">\n {onRetry && (\n <Button variant=\"outline\" size=\"sm\" onClick={onRetry}>\n <RefreshCw className=\"h-3.5 w-3.5 mr-1.5\" />\n Refresh\n </Button>\n )}\n {emptyCta && (\n <Button size=\"sm\" asChild>\n <Link href={emptyCta.href}>{emptyCta.label}</Link>\n </Button>\n )}\n </div>\n </div>\n );\n }\n\n return <>{children}</>;\n}\n"],"mappings":";AAqC6B,wBAqBnB,YArBmB;AAnC7B,SAAS,gBAAgB;AACzB,SAAS,cAAc;AACvB,OAAO,UAAU;AACjB,SAAS,WAAW,mBAAmB;AAkBhC,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB;AAAA,EACA;AACF,GAAsB;AACpB,MAAI,WAAW;AACb,QAAI,aAAc,QAAO,gCAAG,wBAAa;AACzC,WACE,oBAAC,SAAI,WAAU,aACZ,gBAAM,KAAK,EAAE,QAAQ,cAAc,CAAC,EAAE,IAAI,CAAC,GAAG,MAC7C,oBAAC,YAAiB,WAAU,4BAAb,CAAsC,CACtD,GACH;AAAA,EAEJ;AAEA,MAAI,OAAO;AACT,WACE,qBAAC,SAAI,WAAU,+BACb;AAAA,0BAAC,SAAI,WAAU,mFACb,8BAAC,eAAY,WAAU,4BAA2B,GACpD;AAAA,MACA,oBAAC,OAAE,WAAU,yBAAwB,kCAAoB;AAAA,MACzD,oBAAC,OAAE,WAAU,kDACV,2BAAiB,QAAQ,MAAM,UAAU,0CAC5C;AAAA,MACC,WACC,qBAAC,UAAO,SAAQ,WAAU,MAAK,MAAK,SAAS,SAC3C;AAAA,4BAAC,aAAU,WAAU,sBAAqB;AAAA,QAAE;AAAA,SAE9C;AAAA,OAEJ;AAAA,EAEJ;AAEA,MAAI,SAAS;AACX,WACE,qBAAC,SAAI,WAAU,+BACZ;AAAA,mBACC,oBAAC,SAAI,WAAU,0EACZ,qBACH;AAAA,MAEF,oBAAC,OAAE,WAAU,yBAAyB,sBAAW;AAAA,MAChD,oBACC,oBAAC,OAAE,WAAU,kDAAkD,4BAAiB;AAAA,MAElF,qBAAC,SAAI,WAAU,0CACZ;AAAA,mBACC,qBAAC,UAAO,SAAQ,WAAU,MAAK,MAAK,SAAS,SAC3C;AAAA,8BAAC,aAAU,WAAU,sBAAqB;AAAA,UAAE;AAAA,WAE9C;AAAA,QAED,YACC,oBAAC,UAAO,MAAK,MAAK,SAAO,MACvB,8BAAC,QAAK,MAAM,SAAS,MAAO,mBAAS,OAAM,GAC7C;AAAA,SAEJ;AAAA,OACF;AAAA,EAEJ;AAEA,SAAO,gCAAG,UAAS;AACrB;","names":[]}
1
+ {"version":3,"sources":["../../src/components/empty-or-error.tsx"],"sourcesContent":["\"use client\";\n\nimport { Skeleton } from \"./skeleton.js\";\nimport { Button } from \"./button.js\";\nimport Link from \"./link.js\";\nimport { RefreshCw, AlertCircle } from \"lucide-react\";\nimport { ReactNode } from \"react\";\n\ninterface EmptyOrErrorProps {\n isLoading: boolean;\n error?: unknown;\n isEmpty: boolean;\n onRetry?: () => void;\n emptyTitle: string;\n emptyDescription?: string;\n emptyCta?: { label: string; href: string };\n emptyIcon?: ReactNode;\n skeletonCount?: number;\n\n skeletonNode?: ReactNode;\n children?: ReactNode;\n}\n\nexport function EmptyOrError({\n isLoading,\n error,\n isEmpty,\n onRetry,\n emptyTitle,\n emptyDescription,\n emptyCta,\n emptyIcon,\n skeletonCount = 4,\n skeletonNode,\n children,\n}: EmptyOrErrorProps) {\n if (isLoading) {\n if (skeletonNode) return <>{skeletonNode}</>;\n return (\n <div className=\"space-y-3\">\n {Array.from({ length: skeletonCount }).map((_, i) => (\n <Skeleton key={i} className=\"h-20 w-full rounded-xl\" />\n ))}\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"py-16 text-center space-y-4\">\n <div className=\"h-14 w-14 rounded-xl bg-destructive/10 flex items-center justify-center mx-auto\">\n <AlertCircle className=\"h-7 w-7 text-destructive\" />\n </div>\n <p className=\"font-semibold text-lg\">Something went wrong</p>\n <p className=\"text-sm text-muted-foreground max-w-xs mx-auto\">\n {error instanceof Error ? error.message : \"Failed to load data. Please try again.\"}\n </p>\n {onRetry && (\n <Button variant=\"outline\" size=\"sm\" onClick={onRetry}>\n <RefreshCw className=\"h-3.5 w-3.5 mr-1.5\" />\n Try again\n </Button>\n )}\n </div>\n );\n }\n\n if (isEmpty) {\n return (\n <div className=\"py-16 text-center space-y-4\">\n {emptyIcon && (\n <div className=\"h-14 w-14 rounded-xl bg-muted flex items-center justify-center mx-auto\">\n {emptyIcon}\n </div>\n )}\n <p className=\"font-semibold text-lg\">{emptyTitle}</p>\n {emptyDescription && (\n <p className=\"text-sm text-muted-foreground max-w-xs mx-auto\">{emptyDescription}</p>\n )}\n <div className=\"flex items-center justify-center gap-3\">\n {onRetry && (\n <Button variant=\"outline\" size=\"sm\" onClick={onRetry}>\n <RefreshCw className=\"h-3.5 w-3.5 mr-1.5\" />\n Refresh\n </Button>\n )}\n {emptyCta && (\n <Button size=\"sm\" asChild>\n <Link href={emptyCta.href}>{emptyCta.label}</Link>\n </Button>\n )}\n </div>\n </div>\n );\n }\n\n return <>{children}</>;\n}\n"],"mappings":";AAqC6B,wBAqBnB,YArBmB;AAnC7B,SAAS,gBAAgB;AACzB,SAAS,cAAc;AACvB,OAAO,UAAU;AACjB,SAAS,WAAW,mBAAmB;AAkBhC,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB;AAAA,EACA;AACF,GAAsB;AACpB,MAAI,WAAW;AACb,QAAI,aAAc,QAAO,gCAAG,wBAAa;AACzC,WACE,oBAAC,SAAI,WAAU,aACZ,gBAAM,KAAK,EAAE,QAAQ,cAAc,CAAC,EAAE,IAAI,CAAC,GAAG,MAC7C,oBAAC,YAAiB,WAAU,4BAAb,CAAsC,CACtD,GACH;AAAA,EAEJ;AAEA,MAAI,OAAO;AACT,WACE,qBAAC,SAAI,WAAU,+BACb;AAAA,0BAAC,SAAI,WAAU,mFACb,8BAAC,eAAY,WAAU,4BAA2B,GACpD;AAAA,MACA,oBAAC,OAAE,WAAU,yBAAwB,kCAAoB;AAAA,MACzD,oBAAC,OAAE,WAAU,kDACV,2BAAiB,QAAQ,MAAM,UAAU,0CAC5C;AAAA,MACC,WACC,qBAAC,UAAO,SAAQ,WAAU,MAAK,MAAK,SAAS,SAC3C;AAAA,4BAAC,aAAU,WAAU,sBAAqB;AAAA,QAAE;AAAA,SAE9C;AAAA,OAEJ;AAAA,EAEJ;AAEA,MAAI,SAAS;AACX,WACE,qBAAC,SAAI,WAAU,+BACZ;AAAA,mBACC,oBAAC,SAAI,WAAU,0EACZ,qBACH;AAAA,MAEF,oBAAC,OAAE,WAAU,yBAAyB,sBAAW;AAAA,MAChD,oBACC,oBAAC,OAAE,WAAU,kDAAkD,4BAAiB;AAAA,MAElF,qBAAC,SAAI,WAAU,0CACZ;AAAA,mBACC,qBAAC,UAAO,SAAQ,WAAU,MAAK,MAAK,SAAS,SAC3C;AAAA,8BAAC,aAAU,WAAU,sBAAqB;AAAA,UAAE;AAAA,WAE9C;AAAA,QAED,YACC,oBAAC,UAAO,MAAK,MAAK,SAAO,MACvB,8BAAC,QAAK,MAAM,SAAS,MAAO,mBAAS,OAAM,GAC7C;AAAA,SAEJ;AAAA,OACF;AAAA,EAEJ;AAEA,SAAO,gCAAG,UAAS;AACrB;","names":[]}
@@ -35,8 +35,8 @@ __export(hero_slider_exports, {
35
35
  module.exports = __toCommonJS(hero_slider_exports);
36
36
  var import_jsx_runtime = require("react/jsx-runtime");
37
37
  var import_react = require("react");
38
- var import_link = __toESM(require("next/link"), 1);
39
- var import_image = __toESM(require("next/image"), 1);
38
+ var import_link = __toESM(require("./link.js"), 1);
39
+ var import_image = __toESM(require("./image.js"), 1);
40
40
  var import_lucide_react = require("lucide-react");
41
41
  var import_cn = require("../utils/cn.js");
42
42
  var import_ipfs = require("../utils/ipfs.js");
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/hero-slider.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport Link from \"next/link\";\nimport Image from \"next/image\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\nimport { cn } from \"../utils/cn.js\";\nimport { ipfsToHttp } from \"../utils/ipfs.js\";\nimport type { ApiCollection } from \"@medialane/sdk\";\n\nexport interface HeroSliderProps {\n collections: ApiCollection[];\n isLoading: boolean;\n getHref: (collection: ApiCollection) => string;\n\n placeholderHrefs?: { markets?: string; create?: string };\n}\n\nfunction formatFloorPrice(price: string | null | undefined): string {\n if (!price) return \"\";\n const n = parseFloat(price);\n if (isNaN(n)) return price;\n if (n >= 1000) return `${(n / 1000).toFixed(1)}K`;\n if (n >= 1) return n.toFixed(2);\n return n.toPrecision(3);\n}\n\nfunction HeroPlaceholder({ hrefs }: { hrefs: Required<HeroSliderProps>[\"placeholderHrefs\"] }) {\n return (\n <div className=\"absolute inset-0 bg-gradient-to-br from-brand-purple/30 via-brand-blue/20 to-brand-navy/50 flex flex-col items-center justify-center gap-4 text-center px-6 overflow-hidden\">\n\n <h2 className=\"text-4xl sm:text-6xl font-black gradient-text relative z-10\">Medialane</h2>\n <p className=\"text-muted-foreground text-lg relative z-10 max-w-md\">\n New monetization revenues for creative works\n </p>\n <div className=\"flex gap-3 relative z-10\">\n <Link href={hrefs.markets!} className=\"inline-flex items-center justify-center rounded-[11px] bg-brand-blue px-4 py-2 text-sm font-semibold text-white hover:brightness-110 active:scale-[0.98] transition-all\">\n Markets\n </Link>\n <Link href={hrefs.create!} className=\"inline-flex items-center justify-center rounded-[11px] border border-white/20 bg-background/20 backdrop-blur-sm px-4 py-2 text-sm font-semibold text-white hover:bg-white/10 transition-all\">\n Create\n </Link>\n </div>\n </div>\n );\n}\n\nfunction HeroSlide({ collection, active, getHref }: { collection: ApiCollection; active: boolean; getHref: (col: ApiCollection) => string }) {\n const imageUrl = collection.image ? ipfsToHttp(collection.image) : null;\n const name = collection.name ?? \"Collection\";\n const floor = collection.floorPrice;\n const supply = collection.totalSupply;\n\n return (\n <div className={cn(\"absolute inset-0 transition-opacity duration-700\", active ? \"opacity-100\" : \"opacity-0 pointer-events-none\")}>\n {imageUrl ? (\n <div className=\"absolute inset-0 overflow-hidden\">\n <div className=\"animate-kenburns absolute inset-0\">\n <Image src={imageUrl} alt={name} fill className=\"object-cover\" priority={active} unoptimized />\n </div>\n </div>\n ) : (\n <div className=\"absolute inset-0 bg-gradient-to-br from-brand-purple/40 via-brand-blue/20 to-brand-navy/60\" />\n )}\n <div className=\"absolute bottom-0 left-0 right-0 p-6 sm:p-10 flex flex-col gap-3\">\n <Link href={getHref(collection)} className=\"hover:opacity-90 transition-opacity\">\n <h2 className=\"text-4xl lg:text-5xl font-semibold text-white leading-tight\">{name}</h2>\n </Link>\n <div className=\"flex items-center gap-4 text-sm text-white/70\">\n {supply != null && <span>{supply.toLocaleString()} items</span>}\n {floor && <span className=\"text-white font-semibold\">Floor {formatFloorPrice(floor)}</span>}\n </div>\n </div>\n </div>\n );\n}\n\nexport function HeroSliderSkeleton() {\n return <section className=\"relative w-full h-[78vw] min-h-[420px] max-h-[768px] sm:h-[72vh] sm:max-h-[816px] bg-muted animate-pulse\" />;\n}\n\nexport function HeroSlider({ collections, isLoading, getHref, placeholderHrefs = {} }: HeroSliderProps) {\n const hrefs = { markets: \"/marketplace\", create: \"/create/asset\", ...placeholderHrefs };\n const [current, setCurrent] = useState(0);\n const count = collections.length;\n\n const next = useCallback(() => { if (count > 1) setCurrent((c) => (c + 1) % count); }, [count]);\n const prev = useCallback(() => { if (count > 1) setCurrent((c) => (c - 1 + count) % count); }, [count]);\n\n useEffect(() => {\n if (count <= 1) return;\n const id = setInterval(next, 7000);\n return () => clearInterval(id);\n }, [count, next]);\n\n if (isLoading) return <HeroSliderSkeleton />;\n\n return (\n <section className=\"relative w-full h-[78vw] min-h-[420px] max-h-[768px] sm:h-[72vh] sm:max-h-[816px] overflow-hidden bg-muted\">\n {count === 0 ? (\n <HeroPlaceholder hrefs={hrefs} />\n ) : (\n <>\n {collections.map((col, i) => (\n <HeroSlide key={col.contractAddress} collection={col} active={i === current} getHref={getHref} />\n ))}\n {count > 1 && (\n <>\n <button onClick={prev} aria-label=\"Previous slide\" className=\"absolute left-3 top-1/2 -translate-y-1/2 z-10 min-h-11 min-w-11 rounded-full flex items-center justify-center transition-colors\">\n <span className=\"flex h-9 w-9 items-center justify-center rounded-full bg-white/10 backdrop-blur-md hover:bg-white/20\">\n <ChevronLeft className=\"h-5 w-5 text-white\" />\n </span>\n </button>\n <button onClick={next} aria-label=\"Next slide\" className=\"absolute right-3 top-1/2 -translate-y-1/2 z-10 min-h-11 min-w-11 rounded-full flex items-center justify-center transition-colors\">\n <span className=\"flex h-9 w-9 items-center justify-center rounded-full bg-white/10 backdrop-blur-md hover:bg-white/20\">\n <ChevronRight className=\"h-5 w-5 text-white\" />\n </span>\n </button>\n <div className=\"absolute bottom-4 left-1/2 -translate-x-1/2 flex gap-1.5 z-10\">\n {collections.map((_, i) => (\n <button key={i} onClick={() => setCurrent(i)} aria-label={`Go to slide ${i + 1}`} className={cn(\"h-1.5 rounded-full transition-all\", i === current ? \"w-6 bg-white\" : \"w-1.5 bg-white/40\")} />\n ))}\n </div>\n </>\n )}\n </>\n )}\n </section>\n );\n}\n"],"mappings":"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","names":["Link","Image"]}
1
+ {"version":3,"sources":["../../src/components/hero-slider.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport Link from \"./link.js\";\nimport Image from \"./image.js\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\nimport { cn } from \"../utils/cn.js\";\nimport { ipfsToHttp } from \"../utils/ipfs.js\";\nimport type { ApiCollection } from \"@medialane/sdk\";\n\nexport interface HeroSliderProps {\n collections: ApiCollection[];\n isLoading: boolean;\n getHref: (collection: ApiCollection) => string;\n\n placeholderHrefs?: { markets?: string; create?: string };\n}\n\nfunction formatFloorPrice(price: string | null | undefined): string {\n if (!price) return \"\";\n const n = parseFloat(price);\n if (isNaN(n)) return price;\n if (n >= 1000) return `${(n / 1000).toFixed(1)}K`;\n if (n >= 1) return n.toFixed(2);\n return n.toPrecision(3);\n}\n\nfunction HeroPlaceholder({ hrefs }: { hrefs: Required<HeroSliderProps>[\"placeholderHrefs\"] }) {\n return (\n <div className=\"absolute inset-0 bg-gradient-to-br from-brand-purple/30 via-brand-blue/20 to-brand-navy/50 flex flex-col items-center justify-center gap-4 text-center px-6 overflow-hidden\">\n\n <h2 className=\"text-4xl sm:text-6xl font-black gradient-text relative z-10\">Medialane</h2>\n <p className=\"text-muted-foreground text-lg relative z-10 max-w-md\">\n New monetization revenues for creative works\n </p>\n <div className=\"flex gap-3 relative z-10\">\n <Link href={hrefs.markets!} className=\"inline-flex items-center justify-center rounded-[11px] bg-brand-blue px-4 py-2 text-sm font-semibold text-white hover:brightness-110 active:scale-[0.98] transition-all\">\n Markets\n </Link>\n <Link href={hrefs.create!} className=\"inline-flex items-center justify-center rounded-[11px] border border-white/20 bg-background/20 backdrop-blur-sm px-4 py-2 text-sm font-semibold text-white hover:bg-white/10 transition-all\">\n Create\n </Link>\n </div>\n </div>\n );\n}\n\nfunction HeroSlide({ collection, active, getHref }: { collection: ApiCollection; active: boolean; getHref: (col: ApiCollection) => string }) {\n const imageUrl = collection.image ? ipfsToHttp(collection.image) : null;\n const name = collection.name ?? \"Collection\";\n const floor = collection.floorPrice;\n const supply = collection.totalSupply;\n\n return (\n <div className={cn(\"absolute inset-0 transition-opacity duration-700\", active ? \"opacity-100\" : \"opacity-0 pointer-events-none\")}>\n {imageUrl ? (\n <div className=\"absolute inset-0 overflow-hidden\">\n <div className=\"animate-kenburns absolute inset-0\">\n <Image src={imageUrl} alt={name} fill className=\"object-cover\" priority={active} unoptimized />\n </div>\n </div>\n ) : (\n <div className=\"absolute inset-0 bg-gradient-to-br from-brand-purple/40 via-brand-blue/20 to-brand-navy/60\" />\n )}\n <div className=\"absolute bottom-0 left-0 right-0 p-6 sm:p-10 flex flex-col gap-3\">\n <Link href={getHref(collection)} className=\"hover:opacity-90 transition-opacity\">\n <h2 className=\"text-4xl lg:text-5xl font-semibold text-white leading-tight\">{name}</h2>\n </Link>\n <div className=\"flex items-center gap-4 text-sm text-white/70\">\n {supply != null && <span>{supply.toLocaleString()} items</span>}\n {floor && <span className=\"text-white font-semibold\">Floor {formatFloorPrice(floor)}</span>}\n </div>\n </div>\n </div>\n );\n}\n\nexport function HeroSliderSkeleton() {\n return <section className=\"relative w-full h-[78vw] min-h-[420px] max-h-[768px] sm:h-[72vh] sm:max-h-[816px] bg-muted animate-pulse\" />;\n}\n\nexport function HeroSlider({ collections, isLoading, getHref, placeholderHrefs = {} }: HeroSliderProps) {\n const hrefs = { markets: \"/marketplace\", create: \"/create/asset\", ...placeholderHrefs };\n const [current, setCurrent] = useState(0);\n const count = collections.length;\n\n const next = useCallback(() => { if (count > 1) setCurrent((c) => (c + 1) % count); }, [count]);\n const prev = useCallback(() => { if (count > 1) setCurrent((c) => (c - 1 + count) % count); }, [count]);\n\n useEffect(() => {\n if (count <= 1) return;\n const id = setInterval(next, 7000);\n return () => clearInterval(id);\n }, [count, next]);\n\n if (isLoading) return <HeroSliderSkeleton />;\n\n return (\n <section className=\"relative w-full h-[78vw] min-h-[420px] max-h-[768px] sm:h-[72vh] sm:max-h-[816px] overflow-hidden bg-muted\">\n {count === 0 ? (\n <HeroPlaceholder hrefs={hrefs} />\n ) : (\n <>\n {collections.map((col, i) => (\n <HeroSlide key={col.contractAddress} collection={col} active={i === current} getHref={getHref} />\n ))}\n {count > 1 && (\n <>\n <button onClick={prev} aria-label=\"Previous slide\" className=\"absolute left-3 top-1/2 -translate-y-1/2 z-10 min-h-11 min-w-11 rounded-full flex items-center justify-center transition-colors\">\n <span className=\"flex h-9 w-9 items-center justify-center rounded-full bg-white/10 backdrop-blur-md hover:bg-white/20\">\n <ChevronLeft className=\"h-5 w-5 text-white\" />\n </span>\n </button>\n <button onClick={next} aria-label=\"Next slide\" className=\"absolute right-3 top-1/2 -translate-y-1/2 z-10 min-h-11 min-w-11 rounded-full flex items-center justify-center transition-colors\">\n <span className=\"flex h-9 w-9 items-center justify-center rounded-full bg-white/10 backdrop-blur-md hover:bg-white/20\">\n <ChevronRight className=\"h-5 w-5 text-white\" />\n </span>\n </button>\n <div className=\"absolute bottom-4 left-1/2 -translate-x-1/2 flex gap-1.5 z-10\">\n {collections.map((_, i) => (\n <button key={i} onClick={() => setCurrent(i)} aria-label={`Go to slide ${i + 1}`} className={cn(\"h-1.5 rounded-full transition-all\", i === current ? \"w-6 bg-white\" : \"w-1.5 bg-white/40\")} />\n ))}\n </div>\n </>\n )}\n </>\n )}\n </section>\n );\n}\n"],"mappings":"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","names":["Link","Image"]}
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
3
  import { useState, useEffect, useCallback } from "react";
4
- import Link from "next/link";
5
- import Image from "next/image";
4
+ import Link from "./link.js";
5
+ import Image from "./image.js";
6
6
  import { ChevronLeft, ChevronRight } from "lucide-react";
7
7
  import { cn } from "../utils/cn.js";
8
8
  import { ipfsToHttp } from "../utils/ipfs.js";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/hero-slider.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport Link from \"next/link\";\nimport Image from \"next/image\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\nimport { cn } from \"../utils/cn.js\";\nimport { ipfsToHttp } from \"../utils/ipfs.js\";\nimport type { ApiCollection } from \"@medialane/sdk\";\n\nexport interface HeroSliderProps {\n collections: ApiCollection[];\n isLoading: boolean;\n getHref: (collection: ApiCollection) => string;\n\n placeholderHrefs?: { markets?: string; create?: string };\n}\n\nfunction formatFloorPrice(price: string | null | undefined): string {\n if (!price) return \"\";\n const n = parseFloat(price);\n if (isNaN(n)) return price;\n if (n >= 1000) return `${(n / 1000).toFixed(1)}K`;\n if (n >= 1) return n.toFixed(2);\n return n.toPrecision(3);\n}\n\nfunction HeroPlaceholder({ hrefs }: { hrefs: Required<HeroSliderProps>[\"placeholderHrefs\"] }) {\n return (\n <div className=\"absolute inset-0 bg-gradient-to-br from-brand-purple/30 via-brand-blue/20 to-brand-navy/50 flex flex-col items-center justify-center gap-4 text-center px-6 overflow-hidden\">\n\n <h2 className=\"text-4xl sm:text-6xl font-black gradient-text relative z-10\">Medialane</h2>\n <p className=\"text-muted-foreground text-lg relative z-10 max-w-md\">\n New monetization revenues for creative works\n </p>\n <div className=\"flex gap-3 relative z-10\">\n <Link href={hrefs.markets!} className=\"inline-flex items-center justify-center rounded-[11px] bg-brand-blue px-4 py-2 text-sm font-semibold text-white hover:brightness-110 active:scale-[0.98] transition-all\">\n Markets\n </Link>\n <Link href={hrefs.create!} className=\"inline-flex items-center justify-center rounded-[11px] border border-white/20 bg-background/20 backdrop-blur-sm px-4 py-2 text-sm font-semibold text-white hover:bg-white/10 transition-all\">\n Create\n </Link>\n </div>\n </div>\n );\n}\n\nfunction HeroSlide({ collection, active, getHref }: { collection: ApiCollection; active: boolean; getHref: (col: ApiCollection) => string }) {\n const imageUrl = collection.image ? ipfsToHttp(collection.image) : null;\n const name = collection.name ?? \"Collection\";\n const floor = collection.floorPrice;\n const supply = collection.totalSupply;\n\n return (\n <div className={cn(\"absolute inset-0 transition-opacity duration-700\", active ? \"opacity-100\" : \"opacity-0 pointer-events-none\")}>\n {imageUrl ? (\n <div className=\"absolute inset-0 overflow-hidden\">\n <div className=\"animate-kenburns absolute inset-0\">\n <Image src={imageUrl} alt={name} fill className=\"object-cover\" priority={active} unoptimized />\n </div>\n </div>\n ) : (\n <div className=\"absolute inset-0 bg-gradient-to-br from-brand-purple/40 via-brand-blue/20 to-brand-navy/60\" />\n )}\n <div className=\"absolute bottom-0 left-0 right-0 p-6 sm:p-10 flex flex-col gap-3\">\n <Link href={getHref(collection)} className=\"hover:opacity-90 transition-opacity\">\n <h2 className=\"text-4xl lg:text-5xl font-semibold text-white leading-tight\">{name}</h2>\n </Link>\n <div className=\"flex items-center gap-4 text-sm text-white/70\">\n {supply != null && <span>{supply.toLocaleString()} items</span>}\n {floor && <span className=\"text-white font-semibold\">Floor {formatFloorPrice(floor)}</span>}\n </div>\n </div>\n </div>\n );\n}\n\nexport function HeroSliderSkeleton() {\n return <section className=\"relative w-full h-[78vw] min-h-[420px] max-h-[768px] sm:h-[72vh] sm:max-h-[816px] bg-muted animate-pulse\" />;\n}\n\nexport function HeroSlider({ collections, isLoading, getHref, placeholderHrefs = {} }: HeroSliderProps) {\n const hrefs = { markets: \"/marketplace\", create: \"/create/asset\", ...placeholderHrefs };\n const [current, setCurrent] = useState(0);\n const count = collections.length;\n\n const next = useCallback(() => { if (count > 1) setCurrent((c) => (c + 1) % count); }, [count]);\n const prev = useCallback(() => { if (count > 1) setCurrent((c) => (c - 1 + count) % count); }, [count]);\n\n useEffect(() => {\n if (count <= 1) return;\n const id = setInterval(next, 7000);\n return () => clearInterval(id);\n }, [count, next]);\n\n if (isLoading) return <HeroSliderSkeleton />;\n\n return (\n <section className=\"relative w-full h-[78vw] min-h-[420px] max-h-[768px] sm:h-[72vh] sm:max-h-[816px] overflow-hidden bg-muted\">\n {count === 0 ? (\n <HeroPlaceholder hrefs={hrefs} />\n ) : (\n <>\n {collections.map((col, i) => (\n <HeroSlide key={col.contractAddress} collection={col} active={i === current} getHref={getHref} />\n ))}\n {count > 1 && (\n <>\n <button onClick={prev} aria-label=\"Previous slide\" className=\"absolute left-3 top-1/2 -translate-y-1/2 z-10 min-h-11 min-w-11 rounded-full flex items-center justify-center transition-colors\">\n <span className=\"flex h-9 w-9 items-center justify-center rounded-full bg-white/10 backdrop-blur-md hover:bg-white/20\">\n <ChevronLeft className=\"h-5 w-5 text-white\" />\n </span>\n </button>\n <button onClick={next} aria-label=\"Next slide\" className=\"absolute right-3 top-1/2 -translate-y-1/2 z-10 min-h-11 min-w-11 rounded-full flex items-center justify-center transition-colors\">\n <span className=\"flex h-9 w-9 items-center justify-center rounded-full bg-white/10 backdrop-blur-md hover:bg-white/20\">\n <ChevronRight className=\"h-5 w-5 text-white\" />\n </span>\n </button>\n <div className=\"absolute bottom-4 left-1/2 -translate-x-1/2 flex gap-1.5 z-10\">\n {collections.map((_, i) => (\n <button key={i} onClick={() => setCurrent(i)} aria-label={`Go to slide ${i + 1}`} className={cn(\"h-1.5 rounded-full transition-all\", i === current ? \"w-6 bg-white\" : \"w-1.5 bg-white/40\")} />\n ))}\n </div>\n </>\n )}\n </>\n )}\n </section>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/components/hero-slider.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport Link from \"./link.js\";\nimport Image from \"./image.js\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\nimport { cn } from \"../utils/cn.js\";\nimport { ipfsToHttp } from \"../utils/ipfs.js\";\nimport type { ApiCollection } from \"@medialane/sdk\";\n\nexport interface HeroSliderProps {\n collections: ApiCollection[];\n isLoading: boolean;\n getHref: (collection: ApiCollection) => string;\n\n placeholderHrefs?: { markets?: string; create?: string };\n}\n\nfunction formatFloorPrice(price: string | null | undefined): string {\n if (!price) return \"\";\n const n = parseFloat(price);\n if (isNaN(n)) return price;\n if (n >= 1000) return `${(n / 1000).toFixed(1)}K`;\n if (n >= 1) return n.toFixed(2);\n return n.toPrecision(3);\n}\n\nfunction HeroPlaceholder({ hrefs }: { hrefs: Required<HeroSliderProps>[\"placeholderHrefs\"] }) {\n return (\n <div className=\"absolute inset-0 bg-gradient-to-br from-brand-purple/30 via-brand-blue/20 to-brand-navy/50 flex flex-col items-center justify-center gap-4 text-center px-6 overflow-hidden\">\n\n <h2 className=\"text-4xl sm:text-6xl font-black gradient-text relative z-10\">Medialane</h2>\n <p className=\"text-muted-foreground text-lg relative z-10 max-w-md\">\n New monetization revenues for creative works\n </p>\n <div className=\"flex gap-3 relative z-10\">\n <Link href={hrefs.markets!} className=\"inline-flex items-center justify-center rounded-[11px] bg-brand-blue px-4 py-2 text-sm font-semibold text-white hover:brightness-110 active:scale-[0.98] transition-all\">\n Markets\n </Link>\n <Link href={hrefs.create!} className=\"inline-flex items-center justify-center rounded-[11px] border border-white/20 bg-background/20 backdrop-blur-sm px-4 py-2 text-sm font-semibold text-white hover:bg-white/10 transition-all\">\n Create\n </Link>\n </div>\n </div>\n );\n}\n\nfunction HeroSlide({ collection, active, getHref }: { collection: ApiCollection; active: boolean; getHref: (col: ApiCollection) => string }) {\n const imageUrl = collection.image ? ipfsToHttp(collection.image) : null;\n const name = collection.name ?? \"Collection\";\n const floor = collection.floorPrice;\n const supply = collection.totalSupply;\n\n return (\n <div className={cn(\"absolute inset-0 transition-opacity duration-700\", active ? \"opacity-100\" : \"opacity-0 pointer-events-none\")}>\n {imageUrl ? (\n <div className=\"absolute inset-0 overflow-hidden\">\n <div className=\"animate-kenburns absolute inset-0\">\n <Image src={imageUrl} alt={name} fill className=\"object-cover\" priority={active} unoptimized />\n </div>\n </div>\n ) : (\n <div className=\"absolute inset-0 bg-gradient-to-br from-brand-purple/40 via-brand-blue/20 to-brand-navy/60\" />\n )}\n <div className=\"absolute bottom-0 left-0 right-0 p-6 sm:p-10 flex flex-col gap-3\">\n <Link href={getHref(collection)} className=\"hover:opacity-90 transition-opacity\">\n <h2 className=\"text-4xl lg:text-5xl font-semibold text-white leading-tight\">{name}</h2>\n </Link>\n <div className=\"flex items-center gap-4 text-sm text-white/70\">\n {supply != null && <span>{supply.toLocaleString()} items</span>}\n {floor && <span className=\"text-white font-semibold\">Floor {formatFloorPrice(floor)}</span>}\n </div>\n </div>\n </div>\n );\n}\n\nexport function HeroSliderSkeleton() {\n return <section className=\"relative w-full h-[78vw] min-h-[420px] max-h-[768px] sm:h-[72vh] sm:max-h-[816px] bg-muted animate-pulse\" />;\n}\n\nexport function HeroSlider({ collections, isLoading, getHref, placeholderHrefs = {} }: HeroSliderProps) {\n const hrefs = { markets: \"/marketplace\", create: \"/create/asset\", ...placeholderHrefs };\n const [current, setCurrent] = useState(0);\n const count = collections.length;\n\n const next = useCallback(() => { if (count > 1) setCurrent((c) => (c + 1) % count); }, [count]);\n const prev = useCallback(() => { if (count > 1) setCurrent((c) => (c - 1 + count) % count); }, [count]);\n\n useEffect(() => {\n if (count <= 1) return;\n const id = setInterval(next, 7000);\n return () => clearInterval(id);\n }, [count, next]);\n\n if (isLoading) return <HeroSliderSkeleton />;\n\n return (\n <section className=\"relative w-full h-[78vw] min-h-[420px] max-h-[768px] sm:h-[72vh] sm:max-h-[816px] overflow-hidden bg-muted\">\n {count === 0 ? (\n <HeroPlaceholder hrefs={hrefs} />\n ) : (\n <>\n {collections.map((col, i) => (\n <HeroSlide key={col.contractAddress} collection={col} active={i === current} getHref={getHref} />\n ))}\n {count > 1 && (\n <>\n <button onClick={prev} aria-label=\"Previous slide\" className=\"absolute left-3 top-1/2 -translate-y-1/2 z-10 min-h-11 min-w-11 rounded-full flex items-center justify-center transition-colors\">\n <span className=\"flex h-9 w-9 items-center justify-center rounded-full bg-white/10 backdrop-blur-md hover:bg-white/20\">\n <ChevronLeft className=\"h-5 w-5 text-white\" />\n </span>\n </button>\n <button onClick={next} aria-label=\"Next slide\" className=\"absolute right-3 top-1/2 -translate-y-1/2 z-10 min-h-11 min-w-11 rounded-full flex items-center justify-center transition-colors\">\n <span className=\"flex h-9 w-9 items-center justify-center rounded-full bg-white/10 backdrop-blur-md hover:bg-white/20\">\n <ChevronRight className=\"h-5 w-5 text-white\" />\n </span>\n </button>\n <div className=\"absolute bottom-4 left-1/2 -translate-x-1/2 flex gap-1.5 z-10\">\n {collections.map((_, i) => (\n <button key={i} onClick={() => setCurrent(i)} aria-label={`Go to slide ${i + 1}`} className={cn(\"h-1.5 rounded-full transition-all\", i === current ? \"w-6 bg-white\" : \"w-1.5 bg-white/40\")} />\n ))}\n </div>\n </>\n )}\n </>\n )}\n </section>\n );\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var image_exports = {};
30
+ __export(image_exports, {
31
+ default: () => import_image.default
32
+ });
33
+ module.exports = __toCommonJS(image_exports);
34
+ var import_image = __toESM(require("next/image"), 1);
35
+ //# sourceMappingURL=image.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/image.tsx"],"sourcesContent":["// Internal indirection over next/image — see link.tsx for why.\nexport { default } from \"next/image\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAAwB;","names":[]}
@@ -0,0 +1 @@
1
+ export { default } from 'next/image';
@@ -0,0 +1 @@
1
+ export { default } from 'next/image';