@medialane/ui 0.127.1 → 0.128.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) 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-cta-banner.cjs +85 -0
  92. package/dist/components/launchpad-cta-banner.cjs.map +1 -0
  93. package/dist/components/launchpad-cta-banner.d.cts +19 -0
  94. package/dist/components/launchpad-cta-banner.d.ts +19 -0
  95. package/dist/components/launchpad-cta-banner.js +51 -0
  96. package/dist/components/launchpad-cta-banner.js.map +1 -0
  97. package/dist/components/launchpad-services.cjs +18 -1
  98. package/dist/components/launchpad-services.cjs.map +1 -1
  99. package/dist/components/launchpad-services.d.cts +5 -1
  100. package/dist/components/launchpad-services.d.ts +5 -1
  101. package/dist/components/launchpad-services.js +17 -1
  102. package/dist/components/launchpad-services.js.map +1 -1
  103. package/dist/components/launchpad-strip.cjs +1 -1
  104. package/dist/components/launchpad-strip.cjs.map +1 -1
  105. package/dist/components/launchpad-strip.js +1 -1
  106. package/dist/components/launchpad-strip.js.map +1 -1
  107. package/dist/components/link.cjs +35 -0
  108. package/dist/components/link.cjs.map +1 -0
  109. package/dist/components/link.d.cts +3 -0
  110. package/dist/components/link.d.ts +3 -0
  111. package/dist/components/link.js +5 -0
  112. package/dist/components/link.js.map +1 -0
  113. package/dist/components/listing-card.cjs +1 -1
  114. package/dist/components/listing-card.cjs.map +1 -1
  115. package/dist/components/listing-card.js +1 -1
  116. package/dist/components/listing-card.js.map +1 -1
  117. package/dist/components/marketplace-dialog-primitives.cjs +1 -1
  118. package/dist/components/marketplace-dialog-primitives.cjs.map +1 -1
  119. package/dist/components/marketplace-dialog-primitives.js +1 -1
  120. package/dist/components/marketplace-dialog-primitives.js.map +1 -1
  121. package/dist/components/nav-command-menu.cjs +2 -2
  122. package/dist/components/nav-command-menu.cjs.map +1 -1
  123. package/dist/components/nav-command-menu.js +1 -1
  124. package/dist/components/nav-command-menu.js.map +1 -1
  125. package/dist/components/owner-setup-panel.cjs +1 -1
  126. package/dist/components/owner-setup-panel.cjs.map +1 -1
  127. package/dist/components/owner-setup-panel.js +1 -1
  128. package/dist/components/owner-setup-panel.js.map +1 -1
  129. package/dist/components/parent-attribution-banner.cjs +1 -1
  130. package/dist/components/parent-attribution-banner.cjs.map +1 -1
  131. package/dist/components/parent-attribution-banner.js +1 -1
  132. package/dist/components/parent-attribution-banner.js.map +1 -1
  133. package/dist/components/portfolio-activity.cjs +2 -2
  134. package/dist/components/portfolio-activity.cjs.map +1 -1
  135. package/dist/components/portfolio-activity.js +1 -1
  136. package/dist/components/portfolio-activity.js.map +1 -1
  137. package/dist/components/portfolio-chip-filter.cjs +1 -1
  138. package/dist/components/portfolio-chip-filter.cjs.map +1 -1
  139. package/dist/components/portfolio-chip-filter.js +1 -1
  140. package/dist/components/portfolio-chip-filter.js.map +1 -1
  141. package/dist/components/portfolio-header.cjs +1 -1
  142. package/dist/components/portfolio-header.cjs.map +1 -1
  143. package/dist/components/portfolio-header.js +1 -1
  144. package/dist/components/portfolio-header.js.map +1 -1
  145. package/dist/components/portfolio-section.cjs +1 -1
  146. package/dist/components/portfolio-section.cjs.map +1 -1
  147. package/dist/components/portfolio-section.js +1 -1
  148. package/dist/components/portfolio-section.js.map +1 -1
  149. package/dist/components/remixes-tab.cjs +1 -1
  150. package/dist/components/remixes-tab.cjs.map +1 -1
  151. package/dist/components/remixes-tab.js +1 -1
  152. package/dist/components/remixes-tab.js.map +1 -1
  153. package/dist/components/rewards-section.cjs +1 -1
  154. package/dist/components/rewards-section.cjs.map +1 -1
  155. package/dist/components/rewards-section.js +1 -1
  156. package/dist/components/rewards-section.js.map +1 -1
  157. package/dist/components/router.cjs +29 -0
  158. package/dist/components/router.cjs.map +1 -0
  159. package/dist/components/router.d.cts +1 -0
  160. package/dist/components/router.d.ts +1 -0
  161. package/dist/components/router.js +5 -0
  162. package/dist/components/router.js.map +1 -0
  163. package/dist/components/scroll-section.cjs +1 -1
  164. package/dist/components/scroll-section.cjs.map +1 -1
  165. package/dist/components/scroll-section.js +1 -1
  166. package/dist/components/scroll-section.js.map +1 -1
  167. package/dist/components/token-card.cjs +1 -1
  168. package/dist/components/token-card.cjs.map +1 -1
  169. package/dist/components/token-card.js +1 -1
  170. package/dist/components/token-card.js.map +1 -1
  171. package/dist/index.cjs +9 -3
  172. package/dist/index.cjs.map +1 -1
  173. package/dist/index.d.cts +2 -1
  174. package/dist/index.d.ts +2 -1
  175. package/dist/index.js +4 -0
  176. package/dist/index.js.map +1 -1
  177. package/dist/utils/explorer-url.cjs +29 -0
  178. package/dist/utils/explorer-url.cjs.map +1 -0
  179. package/dist/utils/explorer-url.d.cts +3 -0
  180. package/dist/utils/explorer-url.d.ts +3 -0
  181. package/dist/utils/explorer-url.js +5 -0
  182. package/dist/utils/explorer-url.js.map +1 -0
  183. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/nav-command-menu.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { Command } from \"cmdk\";\nimport { useRouter } from \"next/navigation\";\nimport { Search, X, ArrowRight } from \"lucide-react\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { cn } from \"../utils/cn.js\";\n\nexport interface NavCommand {\n id: string;\n label: string;\n icon: React.ComponentType<{ className?: string }>;\n href?: string;\n action?: () => void;\n\n keywords?: string[];\n\n description?: string;\n}\n\nexport interface NavCommandGroup {\n\n heading?: string;\n items: NavCommand[];\n}\n\nexport interface NavCommandMenuProps {\n commands: NavCommandGroup[];\n\n trigger?: React.ReactNode;\n\n accountSlot?: React.ReactNode;\n\n footerSlot?: React.ReactNode;\n\n showKeyboardHints?: boolean;\n\n brandSlot?: React.ReactNode;\n}\n\nconst ML_NAV_OPEN = \"ml:nav-open\";\nconst ML_NAV_CLOSE = \"ml:nav-close\";\n\nexport function useNavCommandMenu() {\n return {\n open: () => document.dispatchEvent(new CustomEvent(ML_NAV_OPEN)),\n close: () => document.dispatchEvent(new CustomEvent(ML_NAV_CLOSE)),\n };\n}\n\nfunction Kbd({ children, className }: { children: React.ReactNode; className?: string }) {\n return (\n <kbd\n className={cn(\n \"inline-flex min-w-[18px] items-center justify-center rounded-md bg-muted/60 px-1.5 py-0.5\",\n \"font-sans text-2xs leading-none text-muted-foreground\",\n className\n )}\n >\n {children}\n </kbd>\n );\n}\n\nfunction CommandRow({ item, primary, onSelect }: { item: NavCommand; primary: boolean; onSelect: () => void }) {\n return (\n <Command.Item\n value={[item.label, ...(item.keywords ?? [])].join(\" \")}\n onSelect={onSelect}\n className={cn(\n \"group/item flex cursor-pointer items-center gap-3 rounded-xl\",\n \"transition-colors duration-150 aria-selected:bg-primary/10\",\n primary ? \"px-2.5 py-2.5\" : \"px-2.5 py-2\"\n )}\n >\n <span\n className={cn(\n \"flex shrink-0 items-center justify-center rounded-lg transition-colors\",\n \"bg-muted/50 group-aria-selected/item:bg-primary/15\",\n primary ? \"h-9 w-9\" : \"h-8 w-8\"\n )}\n >\n <item.icon\n className={cn(\n \"text-foreground/80 transition-colors group-aria-selected/item:text-primary\",\n primary ? \"h-[18px] w-[18px]\" : \"h-4 w-4\"\n )}\n />\n </span>\n <span className=\"min-w-0 flex-1\">\n <span\n className={cn(\n \"block truncate leading-tight\",\n primary ? \"text-base font-medium\" : \"text-sm\"\n )}\n >\n {item.label}\n </span>\n {item.description && (\n <span className=\"mt-0.5 block truncate text-[11.5px] leading-tight text-muted-foreground\">\n {item.description}\n </span>\n )}\n </span>\n <ArrowRight className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground/30 transition-colors group-aria-selected/item:text-primary/70\" />\n </Command.Item>\n );\n}\n\nconst GROUP_HEADING_CLASSES = cn(\n \"[&_[cmdk-group-heading]]:px-2.5\",\n \"[&_[cmdk-group-heading]]:pt-2\",\n \"[&_[cmdk-group-heading]]:pb-1\",\n \"[&_[cmdk-group-heading]]:text-[10.5px]\",\n \"[&_[cmdk-group-heading]]:font-semibold\",\n \"[&_[cmdk-group-heading]]:uppercase\",\n \"[&_[cmdk-group-heading]]:tracking-[0.08em]\",\n \"[&_[cmdk-group-heading]]:text-muted-foreground/60\"\n);\n\nexport function NavCommandMenu({\n commands,\n trigger,\n accountSlot,\n footerSlot,\n showKeyboardHints = true,\n brandSlot,\n}: NavCommandMenuProps) {\n const [open, setOpen] = React.useState(false);\n const [query, setQuery] = React.useState(\"\");\n const router = useRouter();\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n React.useEffect(() => {\n if (!open) return;\n setQuery(\"\");\n const t = setTimeout(() => inputRef.current?.focus(), 60);\n return () => clearTimeout(t);\n }, [open]);\n\n React.useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"k\" && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n setOpen((prev) => !prev);\n }\n if (e.key === \"Escape\") setOpen(false);\n };\n const onOpen = () => setOpen(true);\n const onClose = () => setOpen(false);\n\n document.addEventListener(\"keydown\", onKey);\n document.addEventListener(ML_NAV_OPEN, onOpen);\n document.addEventListener(ML_NAV_CLOSE, onClose);\n return () => {\n document.removeEventListener(\"keydown\", onKey);\n document.removeEventListener(ML_NAV_OPEN, onOpen);\n document.removeEventListener(ML_NAV_CLOSE, onClose);\n };\n }, []);\n\n const runCommand = React.useCallback(\n (cmd: NavCommand) => {\n setOpen(false);\n if (cmd.href) router.push(cmd.href);\n else cmd.action?.();\n },\n [router]\n );\n\n return (\n <>\n {trigger}\n\n <AnimatePresence>\n {open && (\n <>\n\n <motion.div\n className=\"nav-canvas-overlay\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n onClick={() => setOpen(false)}\n />\n\n <motion.div\n className=\"fixed inset-0 z-[101] flex items-end justify-center p-3 pb-[calc(1rem+env(safe-area-inset-bottom))] sm:items-center sm:p-4\"\n initial={{ opacity: 0, y: 24, scale: 1 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: 24 }}\n transition={{ duration: 0.18, ease: \"easeOut\" }}\n onClick={() => setOpen(false)}\n >\n <div\n className={cn(\n \"flex w-full max-h-[85dvh] flex-col overflow-hidden rounded-[20px] sm:max-h-[min(680px,88dvh)] sm:max-w-[620px]\",\n \"bg-background/90 backdrop-blur-2xl backdrop-saturate-150\"\n )}\n onClick={(e) => e.stopPropagation()}\n >\n <Command shouldFilter label=\"Medialane navigation\" className=\"flex min-h-0 flex-1 flex-col\">\n\n <div className=\"flex justify-center pt-2.5 sm:hidden\" aria-hidden=\"true\">\n <span className=\"h-1 w-9 rounded-full bg-muted-foreground/30\" />\n </div>\n\n <div className=\"flex items-center gap-3 border-b border-border/40 px-4 py-3.5\">\n <Search\n className={cn(\n \"h-[18px] w-[18px] shrink-0 transition-colors\",\n query ? \"text-primary\" : \"text-muted-foreground\"\n )}\n />\n <Command.Input\n ref={inputRef}\n value={query}\n onValueChange={setQuery}\n placeholder=\"Search or run a command…\"\n className=\"flex-1 bg-transparent text-base outline-none placeholder:text-muted-foreground\"\n />\n <Kbd className=\"hidden sm:inline-flex\">esc</Kbd>\n <button\n onClick={() => setOpen(false)}\n className=\"rounded-md p-1 transition-colors hover:bg-muted/50 sm:hidden\"\n aria-label=\"Close\"\n >\n <X className=\"h-4 w-4 text-muted-foreground\" />\n </button>\n </div>\n\n <Command.List className=\"min-h-0 flex-1 overflow-y-auto overscroll-contain p-2\">\n <Command.Empty className=\"py-8 text-center text-sm text-muted-foreground\">\n No results found.\n </Command.Empty>\n\n {commands.map((group, i) => {\n const primary = !group.heading;\n return (\n <React.Fragment key={group.heading ?? `__primary-${i}`}>\n {i > 0 && (\n <Command.Separator className=\"my-1.5 h-px bg-border/40\" />\n )}\n <Command.Group heading={group.heading} className={GROUP_HEADING_CLASSES}>\n {group.items.map((item) => (\n <CommandRow\n key={item.id}\n item={item}\n primary={primary}\n onSelect={() => runCommand(item)}\n />\n ))}\n </Command.Group>\n </React.Fragment>\n );\n })}\n </Command.List>\n\n {accountSlot && (\n <div className=\"border-t border-border/40 bg-muted/20 px-3 py-3\">\n {accountSlot}\n </div>\n )}\n\n <div className=\"flex items-center justify-between gap-3 border-t border-border/40 bg-muted/20 px-3 py-2\">\n <div className=\"flex items-center gap-3\">\n {footerSlot}\n {showKeyboardHints && (\n <span className=\"hidden items-center gap-3 text-[10.5px] text-muted-foreground/70 sm:flex\">\n <span className=\"flex items-center gap-1\"><Kbd>↑</Kbd><Kbd>↓</Kbd> Navigate</span>\n <span className=\"flex items-center gap-1\"><Kbd>↵</Kbd> Open</span>\n </span>\n )}\n </div>\n {brandSlot ?? (\n <span className=\"flex shrink-0 items-center gap-2 text-2xs text-muted-foreground/50\">\n medialane\n <Kbd className=\"hidden sm:inline-flex\">⌘K</Kbd>\n </span>\n )}\n </div>\n </Command>\n </div>\n </motion.div>\n </>\n )}\n </AnimatePresence>\n </>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/components/nav-command-menu.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { Command } from \"cmdk\";\nimport { useRouter } from \"./router.js\";\nimport { Search, X, ArrowRight } from \"lucide-react\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { cn } from \"../utils/cn.js\";\n\nexport interface NavCommand {\n id: string;\n label: string;\n icon: React.ComponentType<{ className?: string }>;\n href?: string;\n action?: () => void;\n\n keywords?: string[];\n\n description?: string;\n}\n\nexport interface NavCommandGroup {\n\n heading?: string;\n items: NavCommand[];\n}\n\nexport interface NavCommandMenuProps {\n commands: NavCommandGroup[];\n\n trigger?: React.ReactNode;\n\n accountSlot?: React.ReactNode;\n\n footerSlot?: React.ReactNode;\n\n showKeyboardHints?: boolean;\n\n brandSlot?: React.ReactNode;\n}\n\nconst ML_NAV_OPEN = \"ml:nav-open\";\nconst ML_NAV_CLOSE = \"ml:nav-close\";\n\nexport function useNavCommandMenu() {\n return {\n open: () => document.dispatchEvent(new CustomEvent(ML_NAV_OPEN)),\n close: () => document.dispatchEvent(new CustomEvent(ML_NAV_CLOSE)),\n };\n}\n\nfunction Kbd({ children, className }: { children: React.ReactNode; className?: string }) {\n return (\n <kbd\n className={cn(\n \"inline-flex min-w-[18px] items-center justify-center rounded-md bg-muted/60 px-1.5 py-0.5\",\n \"font-sans text-2xs leading-none text-muted-foreground\",\n className\n )}\n >\n {children}\n </kbd>\n );\n}\n\nfunction CommandRow({ item, primary, onSelect }: { item: NavCommand; primary: boolean; onSelect: () => void }) {\n return (\n <Command.Item\n value={[item.label, ...(item.keywords ?? [])].join(\" \")}\n onSelect={onSelect}\n className={cn(\n \"group/item flex cursor-pointer items-center gap-3 rounded-xl\",\n \"transition-colors duration-150 aria-selected:bg-primary/10\",\n primary ? \"px-2.5 py-2.5\" : \"px-2.5 py-2\"\n )}\n >\n <span\n className={cn(\n \"flex shrink-0 items-center justify-center rounded-lg transition-colors\",\n \"bg-muted/50 group-aria-selected/item:bg-primary/15\",\n primary ? \"h-9 w-9\" : \"h-8 w-8\"\n )}\n >\n <item.icon\n className={cn(\n \"text-foreground/80 transition-colors group-aria-selected/item:text-primary\",\n primary ? \"h-[18px] w-[18px]\" : \"h-4 w-4\"\n )}\n />\n </span>\n <span className=\"min-w-0 flex-1\">\n <span\n className={cn(\n \"block truncate leading-tight\",\n primary ? \"text-base font-medium\" : \"text-sm\"\n )}\n >\n {item.label}\n </span>\n {item.description && (\n <span className=\"mt-0.5 block truncate text-[11.5px] leading-tight text-muted-foreground\">\n {item.description}\n </span>\n )}\n </span>\n <ArrowRight className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground/30 transition-colors group-aria-selected/item:text-primary/70\" />\n </Command.Item>\n );\n}\n\nconst GROUP_HEADING_CLASSES = cn(\n \"[&_[cmdk-group-heading]]:px-2.5\",\n \"[&_[cmdk-group-heading]]:pt-2\",\n \"[&_[cmdk-group-heading]]:pb-1\",\n \"[&_[cmdk-group-heading]]:text-[10.5px]\",\n \"[&_[cmdk-group-heading]]:font-semibold\",\n \"[&_[cmdk-group-heading]]:uppercase\",\n \"[&_[cmdk-group-heading]]:tracking-[0.08em]\",\n \"[&_[cmdk-group-heading]]:text-muted-foreground/60\"\n);\n\nexport function NavCommandMenu({\n commands,\n trigger,\n accountSlot,\n footerSlot,\n showKeyboardHints = true,\n brandSlot,\n}: NavCommandMenuProps) {\n const [open, setOpen] = React.useState(false);\n const [query, setQuery] = React.useState(\"\");\n const router = useRouter();\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n React.useEffect(() => {\n if (!open) return;\n setQuery(\"\");\n const t = setTimeout(() => inputRef.current?.focus(), 60);\n return () => clearTimeout(t);\n }, [open]);\n\n React.useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"k\" && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n setOpen((prev) => !prev);\n }\n if (e.key === \"Escape\") setOpen(false);\n };\n const onOpen = () => setOpen(true);\n const onClose = () => setOpen(false);\n\n document.addEventListener(\"keydown\", onKey);\n document.addEventListener(ML_NAV_OPEN, onOpen);\n document.addEventListener(ML_NAV_CLOSE, onClose);\n return () => {\n document.removeEventListener(\"keydown\", onKey);\n document.removeEventListener(ML_NAV_OPEN, onOpen);\n document.removeEventListener(ML_NAV_CLOSE, onClose);\n };\n }, []);\n\n const runCommand = React.useCallback(\n (cmd: NavCommand) => {\n setOpen(false);\n if (cmd.href) router.push(cmd.href);\n else cmd.action?.();\n },\n [router]\n );\n\n return (\n <>\n {trigger}\n\n <AnimatePresence>\n {open && (\n <>\n\n <motion.div\n className=\"nav-canvas-overlay\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n onClick={() => setOpen(false)}\n />\n\n <motion.div\n className=\"fixed inset-0 z-[101] flex items-end justify-center p-3 pb-[calc(1rem+env(safe-area-inset-bottom))] sm:items-center sm:p-4\"\n initial={{ opacity: 0, y: 24, scale: 1 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: 24 }}\n transition={{ duration: 0.18, ease: \"easeOut\" }}\n onClick={() => setOpen(false)}\n >\n <div\n className={cn(\n \"flex w-full max-h-[85dvh] flex-col overflow-hidden rounded-[20px] sm:max-h-[min(680px,88dvh)] sm:max-w-[620px]\",\n \"bg-background/90 backdrop-blur-2xl backdrop-saturate-150\"\n )}\n onClick={(e) => e.stopPropagation()}\n >\n <Command shouldFilter label=\"Medialane navigation\" className=\"flex min-h-0 flex-1 flex-col\">\n\n <div className=\"flex justify-center pt-2.5 sm:hidden\" aria-hidden=\"true\">\n <span className=\"h-1 w-9 rounded-full bg-muted-foreground/30\" />\n </div>\n\n <div className=\"flex items-center gap-3 border-b border-border/40 px-4 py-3.5\">\n <Search\n className={cn(\n \"h-[18px] w-[18px] shrink-0 transition-colors\",\n query ? \"text-primary\" : \"text-muted-foreground\"\n )}\n />\n <Command.Input\n ref={inputRef}\n value={query}\n onValueChange={setQuery}\n placeholder=\"Search or run a command…\"\n className=\"flex-1 bg-transparent text-base outline-none placeholder:text-muted-foreground\"\n />\n <Kbd className=\"hidden sm:inline-flex\">esc</Kbd>\n <button\n onClick={() => setOpen(false)}\n className=\"rounded-md p-1 transition-colors hover:bg-muted/50 sm:hidden\"\n aria-label=\"Close\"\n >\n <X className=\"h-4 w-4 text-muted-foreground\" />\n </button>\n </div>\n\n <Command.List className=\"min-h-0 flex-1 overflow-y-auto overscroll-contain p-2\">\n <Command.Empty className=\"py-8 text-center text-sm text-muted-foreground\">\n No results found.\n </Command.Empty>\n\n {commands.map((group, i) => {\n const primary = !group.heading;\n return (\n <React.Fragment key={group.heading ?? `__primary-${i}`}>\n {i > 0 && (\n <Command.Separator className=\"my-1.5 h-px bg-border/40\" />\n )}\n <Command.Group heading={group.heading} className={GROUP_HEADING_CLASSES}>\n {group.items.map((item) => (\n <CommandRow\n key={item.id}\n item={item}\n primary={primary}\n onSelect={() => runCommand(item)}\n />\n ))}\n </Command.Group>\n </React.Fragment>\n );\n })}\n </Command.List>\n\n {accountSlot && (\n <div className=\"border-t border-border/40 bg-muted/20 px-3 py-3\">\n {accountSlot}\n </div>\n )}\n\n <div className=\"flex items-center justify-between gap-3 border-t border-border/40 bg-muted/20 px-3 py-2\">\n <div className=\"flex items-center gap-3\">\n {footerSlot}\n {showKeyboardHints && (\n <span className=\"hidden items-center gap-3 text-[10.5px] text-muted-foreground/70 sm:flex\">\n <span className=\"flex items-center gap-1\"><Kbd>↑</Kbd><Kbd>↓</Kbd> Navigate</span>\n <span className=\"flex items-center gap-1\"><Kbd>↵</Kbd> Open</span>\n </span>\n )}\n </div>\n {brandSlot ?? (\n <span className=\"flex shrink-0 items-center gap-2 text-2xs text-muted-foreground/50\">\n medialane\n <Kbd className=\"hidden sm:inline-flex\">⌘K</Kbd>\n </span>\n )}\n </div>\n </Command>\n </div>\n </motion.div>\n </>\n )}\n </AnimatePresence>\n </>\n );\n}\n"],"mappings":"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","names":[]}
@@ -33,7 +33,7 @@ __export(owner_setup_panel_exports, {
33
33
  });
34
34
  module.exports = __toCommonJS(owner_setup_panel_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_lucide_react = require("lucide-react");
38
38
  var import_cn = require("../utils/cn.js");
39
39
  function OwnerSetupPanel({ contract, profile }) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/owner-setup-panel.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { CheckCircle2, Circle, Settings, Sparkles } from \"lucide-react\";\nimport { cn } from \"../utils/cn.js\";\nimport type { ApiCollectionProfile } from \"@medialane/sdk\";\n\ninterface SetupItem {\n label: string;\n done: boolean;\n}\n\ninterface OwnerSetupPanelProps {\n contract: string;\n profile: ApiCollectionProfile | null;\n}\n\nexport function OwnerSetupPanel({ contract, profile }: OwnerSetupPanelProps) {\n const items: SetupItem[] = [\n { label: \"Display name\", done: !!profile?.displayName },\n { label: \"Description\", done: !!profile?.description },\n { label: \"Cover image\", done: !!profile?.image },\n { label: \"Banner image\", done: !!profile?.bannerImage },\n { label: \"Social links\", done: !!(profile?.twitterUrl || profile?.discordUrl || profile?.websiteUrl) },\n { label: \"Exclusive content\", done: !!profile?.hasGatedContent },\n ];\n\n const doneCount = items.filter((i) => i.done).length;\n\n if (doneCount === items.length) return null;\n\n return (\n <div className=\"mx-4 sm:mx-6 mt-3 rounded-2xl border border-border bg-card/80 p-4 space-y-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <Settings className=\"h-4 w-4 text-muted-foreground\" />\n <p className=\"text-sm font-semibold\">Set up your collection</p>\n </div>\n <span className=\"text-xs text-muted-foreground tabular-nums\">\n {doneCount}/{items.length} complete\n </span>\n </div>\n\n <div className=\"w-full h-1.5 rounded-full bg-muted overflow-hidden\">\n <div\n className=\"h-full rounded-full btn-border-animated transition-all duration-500\"\n style={{ width: `${(doneCount / items.length) * 100}%` }}\n />\n </div>\n\n <div className=\"grid grid-cols-2 gap-x-4 gap-y-1\">\n {items.map(({ label, done }) => (\n <div key={label} className=\"flex items-center gap-1.5\">\n {done ? (\n <CheckCircle2 className=\"h-3.5 w-3.5 text-emerald-500 shrink-0\" />\n ) : (\n <Circle className=\"h-3.5 w-3.5 text-muted-foreground/40 shrink-0\" />\n )}\n <span className={cn(\"text-xs\", done ? \"text-muted-foreground line-through\" : \"text-foreground\")}>\n {label}\n </span>\n </div>\n ))}\n </div>\n\n <Link\n href={`/portfolio/collections/${contract}/settings`}\n className=\"inline-flex items-center gap-1.5 text-xs font-semibold text-primary hover:underline\"\n >\n <Sparkles className=\"h-3 w-3\" />\n Complete your collection profile\n </Link>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAkCQ;AAhCR,kBAAiB;AACjB,0BAAyD;AACzD,gBAAmB;AAaZ,SAAS,gBAAgB,EAAE,UAAU,QAAQ,GAAyB;AAC3E,QAAM,QAAqB;AAAA,IACzB,EAAE,OAAO,gBAAqB,MAAM,CAAC,CAAC,SAAS,YAAY;AAAA,IAC3D,EAAE,OAAO,eAAqB,MAAM,CAAC,CAAC,SAAS,YAAY;AAAA,IAC3D,EAAE,OAAO,eAAqB,MAAM,CAAC,CAAC,SAAS,MAAM;AAAA,IACrD,EAAE,OAAO,gBAAqB,MAAM,CAAC,CAAC,SAAS,YAAY;AAAA,IAC3D,EAAE,OAAO,gBAAqB,MAAM,CAAC,EAAE,SAAS,cAAc,SAAS,cAAc,SAAS,YAAY;AAAA,IAC1G,EAAE,OAAO,qBAAqB,MAAM,CAAC,CAAC,SAAS,gBAAgB;AAAA,EACjE;AAEA,QAAM,YAAY,MAAM,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE;AAE9C,MAAI,cAAc,MAAM,OAAQ,QAAO;AAEvC,SACE,6CAAC,SAAI,WAAU,+EACb;AAAA,iDAAC,SAAI,WAAU,qCACb;AAAA,mDAAC,SAAI,WAAU,2BACb;AAAA,oDAAC,gCAAS,WAAU,iCAAgC;AAAA,QACpD,4CAAC,OAAE,WAAU,yBAAwB,oCAAsB;AAAA,SAC7D;AAAA,MACA,6CAAC,UAAK,WAAU,8CACb;AAAA;AAAA,QAAU;AAAA,QAAE,MAAM;AAAA,QAAO;AAAA,SAC5B;AAAA,OACF;AAAA,IAEA,4CAAC,SAAI,WAAU,sDACb;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO,EAAE,OAAO,GAAI,YAAY,MAAM,SAAU,GAAG,IAAI;AAAA;AAAA,IACzD,GACF;AAAA,IAEA,4CAAC,SAAI,WAAU,oCACZ,gBAAM,IAAI,CAAC,EAAE,OAAO,KAAK,MACxB,6CAAC,SAAgB,WAAU,6BACxB;AAAA,aACC,4CAAC,oCAAa,WAAU,yCAAwC,IAEhE,4CAAC,8BAAO,WAAU,iDAAgD;AAAA,MAEpE,4CAAC,UAAK,eAAW,cAAG,WAAW,OAAO,uCAAuC,iBAAiB,GAC3F,iBACH;AAAA,SARQ,KASV,CACD,GACH;AAAA,IAEA;AAAA,MAAC,YAAAA;AAAA,MAAA;AAAA,QACC,MAAM,0BAA0B,QAAQ;AAAA,QACxC,WAAU;AAAA,QAEV;AAAA,sDAAC,gCAAS,WAAU,WAAU;AAAA,UAAE;AAAA;AAAA;AAAA,IAElC;AAAA,KACF;AAEJ;","names":["Link"]}
1
+ {"version":3,"sources":["../../src/components/owner-setup-panel.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"./link.js\";\nimport { CheckCircle2, Circle, Settings, Sparkles } from \"lucide-react\";\nimport { cn } from \"../utils/cn.js\";\nimport type { ApiCollectionProfile } from \"@medialane/sdk\";\n\ninterface SetupItem {\n label: string;\n done: boolean;\n}\n\ninterface OwnerSetupPanelProps {\n contract: string;\n profile: ApiCollectionProfile | null;\n}\n\nexport function OwnerSetupPanel({ contract, profile }: OwnerSetupPanelProps) {\n const items: SetupItem[] = [\n { label: \"Display name\", done: !!profile?.displayName },\n { label: \"Description\", done: !!profile?.description },\n { label: \"Cover image\", done: !!profile?.image },\n { label: \"Banner image\", done: !!profile?.bannerImage },\n { label: \"Social links\", done: !!(profile?.twitterUrl || profile?.discordUrl || profile?.websiteUrl) },\n { label: \"Exclusive content\", done: !!profile?.hasGatedContent },\n ];\n\n const doneCount = items.filter((i) => i.done).length;\n\n if (doneCount === items.length) return null;\n\n return (\n <div className=\"mx-4 sm:mx-6 mt-3 rounded-2xl border border-border bg-card/80 p-4 space-y-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <Settings className=\"h-4 w-4 text-muted-foreground\" />\n <p className=\"text-sm font-semibold\">Set up your collection</p>\n </div>\n <span className=\"text-xs text-muted-foreground tabular-nums\">\n {doneCount}/{items.length} complete\n </span>\n </div>\n\n <div className=\"w-full h-1.5 rounded-full bg-muted overflow-hidden\">\n <div\n className=\"h-full rounded-full btn-border-animated transition-all duration-500\"\n style={{ width: `${(doneCount / items.length) * 100}%` }}\n />\n </div>\n\n <div className=\"grid grid-cols-2 gap-x-4 gap-y-1\">\n {items.map(({ label, done }) => (\n <div key={label} className=\"flex items-center gap-1.5\">\n {done ? (\n <CheckCircle2 className=\"h-3.5 w-3.5 text-emerald-500 shrink-0\" />\n ) : (\n <Circle className=\"h-3.5 w-3.5 text-muted-foreground/40 shrink-0\" />\n )}\n <span className={cn(\"text-xs\", done ? \"text-muted-foreground line-through\" : \"text-foreground\")}>\n {label}\n </span>\n </div>\n ))}\n </div>\n\n <Link\n href={`/portfolio/collections/${contract}/settings`}\n className=\"inline-flex items-center gap-1.5 text-xs font-semibold text-primary hover:underline\"\n >\n <Sparkles className=\"h-3 w-3\" />\n Complete your collection profile\n </Link>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAkCQ;AAhCR,kBAAiB;AACjB,0BAAyD;AACzD,gBAAmB;AAaZ,SAAS,gBAAgB,EAAE,UAAU,QAAQ,GAAyB;AAC3E,QAAM,QAAqB;AAAA,IACzB,EAAE,OAAO,gBAAqB,MAAM,CAAC,CAAC,SAAS,YAAY;AAAA,IAC3D,EAAE,OAAO,eAAqB,MAAM,CAAC,CAAC,SAAS,YAAY;AAAA,IAC3D,EAAE,OAAO,eAAqB,MAAM,CAAC,CAAC,SAAS,MAAM;AAAA,IACrD,EAAE,OAAO,gBAAqB,MAAM,CAAC,CAAC,SAAS,YAAY;AAAA,IAC3D,EAAE,OAAO,gBAAqB,MAAM,CAAC,EAAE,SAAS,cAAc,SAAS,cAAc,SAAS,YAAY;AAAA,IAC1G,EAAE,OAAO,qBAAqB,MAAM,CAAC,CAAC,SAAS,gBAAgB;AAAA,EACjE;AAEA,QAAM,YAAY,MAAM,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE;AAE9C,MAAI,cAAc,MAAM,OAAQ,QAAO;AAEvC,SACE,6CAAC,SAAI,WAAU,+EACb;AAAA,iDAAC,SAAI,WAAU,qCACb;AAAA,mDAAC,SAAI,WAAU,2BACb;AAAA,oDAAC,gCAAS,WAAU,iCAAgC;AAAA,QACpD,4CAAC,OAAE,WAAU,yBAAwB,oCAAsB;AAAA,SAC7D;AAAA,MACA,6CAAC,UAAK,WAAU,8CACb;AAAA;AAAA,QAAU;AAAA,QAAE,MAAM;AAAA,QAAO;AAAA,SAC5B;AAAA,OACF;AAAA,IAEA,4CAAC,SAAI,WAAU,sDACb;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO,EAAE,OAAO,GAAI,YAAY,MAAM,SAAU,GAAG,IAAI;AAAA;AAAA,IACzD,GACF;AAAA,IAEA,4CAAC,SAAI,WAAU,oCACZ,gBAAM,IAAI,CAAC,EAAE,OAAO,KAAK,MACxB,6CAAC,SAAgB,WAAU,6BACxB;AAAA,aACC,4CAAC,oCAAa,WAAU,yCAAwC,IAEhE,4CAAC,8BAAO,WAAU,iDAAgD;AAAA,MAEpE,4CAAC,UAAK,eAAW,cAAG,WAAW,OAAO,uCAAuC,iBAAiB,GAC3F,iBACH;AAAA,SARQ,KASV,CACD,GACH;AAAA,IAEA;AAAA,MAAC,YAAAA;AAAA,MAAA;AAAA,QACC,MAAM,0BAA0B,QAAQ;AAAA,QACxC,WAAU;AAAA,QAEV;AAAA,sDAAC,gCAAS,WAAU,WAAU;AAAA,UAAE;AAAA;AAAA;AAAA,IAElC;AAAA,KACF;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 { CheckCircle2, Circle, Settings, Sparkles } from "lucide-react";
5
5
  import { cn } from "../utils/cn.js";
6
6
  function OwnerSetupPanel({ contract, profile }) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/owner-setup-panel.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { CheckCircle2, Circle, Settings, Sparkles } from \"lucide-react\";\nimport { cn } from \"../utils/cn.js\";\nimport type { ApiCollectionProfile } from \"@medialane/sdk\";\n\ninterface SetupItem {\n label: string;\n done: boolean;\n}\n\ninterface OwnerSetupPanelProps {\n contract: string;\n profile: ApiCollectionProfile | null;\n}\n\nexport function OwnerSetupPanel({ contract, profile }: OwnerSetupPanelProps) {\n const items: SetupItem[] = [\n { label: \"Display name\", done: !!profile?.displayName },\n { label: \"Description\", done: !!profile?.description },\n { label: \"Cover image\", done: !!profile?.image },\n { label: \"Banner image\", done: !!profile?.bannerImage },\n { label: \"Social links\", done: !!(profile?.twitterUrl || profile?.discordUrl || profile?.websiteUrl) },\n { label: \"Exclusive content\", done: !!profile?.hasGatedContent },\n ];\n\n const doneCount = items.filter((i) => i.done).length;\n\n if (doneCount === items.length) return null;\n\n return (\n <div className=\"mx-4 sm:mx-6 mt-3 rounded-2xl border border-border bg-card/80 p-4 space-y-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <Settings className=\"h-4 w-4 text-muted-foreground\" />\n <p className=\"text-sm font-semibold\">Set up your collection</p>\n </div>\n <span className=\"text-xs text-muted-foreground tabular-nums\">\n {doneCount}/{items.length} complete\n </span>\n </div>\n\n <div className=\"w-full h-1.5 rounded-full bg-muted overflow-hidden\">\n <div\n className=\"h-full rounded-full btn-border-animated transition-all duration-500\"\n style={{ width: `${(doneCount / items.length) * 100}%` }}\n />\n </div>\n\n <div className=\"grid grid-cols-2 gap-x-4 gap-y-1\">\n {items.map(({ label, done }) => (\n <div key={label} className=\"flex items-center gap-1.5\">\n {done ? (\n <CheckCircle2 className=\"h-3.5 w-3.5 text-emerald-500 shrink-0\" />\n ) : (\n <Circle className=\"h-3.5 w-3.5 text-muted-foreground/40 shrink-0\" />\n )}\n <span className={cn(\"text-xs\", done ? \"text-muted-foreground line-through\" : \"text-foreground\")}>\n {label}\n </span>\n </div>\n ))}\n </div>\n\n <Link\n href={`/portfolio/collections/${contract}/settings`}\n className=\"inline-flex items-center gap-1.5 text-xs font-semibold text-primary hover:underline\"\n >\n <Sparkles className=\"h-3 w-3\" />\n Complete your collection profile\n </Link>\n </div>\n );\n}\n"],"mappings":";AAkCQ,SACE,KADF;AAhCR,OAAO,UAAU;AACjB,SAAS,cAAc,QAAQ,UAAU,gBAAgB;AACzD,SAAS,UAAU;AAaZ,SAAS,gBAAgB,EAAE,UAAU,QAAQ,GAAyB;AAC3E,QAAM,QAAqB;AAAA,IACzB,EAAE,OAAO,gBAAqB,MAAM,CAAC,CAAC,SAAS,YAAY;AAAA,IAC3D,EAAE,OAAO,eAAqB,MAAM,CAAC,CAAC,SAAS,YAAY;AAAA,IAC3D,EAAE,OAAO,eAAqB,MAAM,CAAC,CAAC,SAAS,MAAM;AAAA,IACrD,EAAE,OAAO,gBAAqB,MAAM,CAAC,CAAC,SAAS,YAAY;AAAA,IAC3D,EAAE,OAAO,gBAAqB,MAAM,CAAC,EAAE,SAAS,cAAc,SAAS,cAAc,SAAS,YAAY;AAAA,IAC1G,EAAE,OAAO,qBAAqB,MAAM,CAAC,CAAC,SAAS,gBAAgB;AAAA,EACjE;AAEA,QAAM,YAAY,MAAM,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE;AAE9C,MAAI,cAAc,MAAM,OAAQ,QAAO;AAEvC,SACE,qBAAC,SAAI,WAAU,+EACb;AAAA,yBAAC,SAAI,WAAU,qCACb;AAAA,2BAAC,SAAI,WAAU,2BACb;AAAA,4BAAC,YAAS,WAAU,iCAAgC;AAAA,QACpD,oBAAC,OAAE,WAAU,yBAAwB,oCAAsB;AAAA,SAC7D;AAAA,MACA,qBAAC,UAAK,WAAU,8CACb;AAAA;AAAA,QAAU;AAAA,QAAE,MAAM;AAAA,QAAO;AAAA,SAC5B;AAAA,OACF;AAAA,IAEA,oBAAC,SAAI,WAAU,sDACb;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO,EAAE,OAAO,GAAI,YAAY,MAAM,SAAU,GAAG,IAAI;AAAA;AAAA,IACzD,GACF;AAAA,IAEA,oBAAC,SAAI,WAAU,oCACZ,gBAAM,IAAI,CAAC,EAAE,OAAO,KAAK,MACxB,qBAAC,SAAgB,WAAU,6BACxB;AAAA,aACC,oBAAC,gBAAa,WAAU,yCAAwC,IAEhE,oBAAC,UAAO,WAAU,iDAAgD;AAAA,MAEpE,oBAAC,UAAK,WAAW,GAAG,WAAW,OAAO,uCAAuC,iBAAiB,GAC3F,iBACH;AAAA,SARQ,KASV,CACD,GACH;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,0BAA0B,QAAQ;AAAA,QACxC,WAAU;AAAA,QAEV;AAAA,8BAAC,YAAS,WAAU,WAAU;AAAA,UAAE;AAAA;AAAA;AAAA,IAElC;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/components/owner-setup-panel.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"./link.js\";\nimport { CheckCircle2, Circle, Settings, Sparkles } from \"lucide-react\";\nimport { cn } from \"../utils/cn.js\";\nimport type { ApiCollectionProfile } from \"@medialane/sdk\";\n\ninterface SetupItem {\n label: string;\n done: boolean;\n}\n\ninterface OwnerSetupPanelProps {\n contract: string;\n profile: ApiCollectionProfile | null;\n}\n\nexport function OwnerSetupPanel({ contract, profile }: OwnerSetupPanelProps) {\n const items: SetupItem[] = [\n { label: \"Display name\", done: !!profile?.displayName },\n { label: \"Description\", done: !!profile?.description },\n { label: \"Cover image\", done: !!profile?.image },\n { label: \"Banner image\", done: !!profile?.bannerImage },\n { label: \"Social links\", done: !!(profile?.twitterUrl || profile?.discordUrl || profile?.websiteUrl) },\n { label: \"Exclusive content\", done: !!profile?.hasGatedContent },\n ];\n\n const doneCount = items.filter((i) => i.done).length;\n\n if (doneCount === items.length) return null;\n\n return (\n <div className=\"mx-4 sm:mx-6 mt-3 rounded-2xl border border-border bg-card/80 p-4 space-y-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <Settings className=\"h-4 w-4 text-muted-foreground\" />\n <p className=\"text-sm font-semibold\">Set up your collection</p>\n </div>\n <span className=\"text-xs text-muted-foreground tabular-nums\">\n {doneCount}/{items.length} complete\n </span>\n </div>\n\n <div className=\"w-full h-1.5 rounded-full bg-muted overflow-hidden\">\n <div\n className=\"h-full rounded-full btn-border-animated transition-all duration-500\"\n style={{ width: `${(doneCount / items.length) * 100}%` }}\n />\n </div>\n\n <div className=\"grid grid-cols-2 gap-x-4 gap-y-1\">\n {items.map(({ label, done }) => (\n <div key={label} className=\"flex items-center gap-1.5\">\n {done ? (\n <CheckCircle2 className=\"h-3.5 w-3.5 text-emerald-500 shrink-0\" />\n ) : (\n <Circle className=\"h-3.5 w-3.5 text-muted-foreground/40 shrink-0\" />\n )}\n <span className={cn(\"text-xs\", done ? \"text-muted-foreground line-through\" : \"text-foreground\")}>\n {label}\n </span>\n </div>\n ))}\n </div>\n\n <Link\n href={`/portfolio/collections/${contract}/settings`}\n className=\"inline-flex items-center gap-1.5 text-xs font-semibold text-primary hover:underline\"\n >\n <Sparkles className=\"h-3 w-3\" />\n Complete your collection profile\n </Link>\n </div>\n );\n}\n"],"mappings":";AAkCQ,SACE,KADF;AAhCR,OAAO,UAAU;AACjB,SAAS,cAAc,QAAQ,UAAU,gBAAgB;AACzD,SAAS,UAAU;AAaZ,SAAS,gBAAgB,EAAE,UAAU,QAAQ,GAAyB;AAC3E,QAAM,QAAqB;AAAA,IACzB,EAAE,OAAO,gBAAqB,MAAM,CAAC,CAAC,SAAS,YAAY;AAAA,IAC3D,EAAE,OAAO,eAAqB,MAAM,CAAC,CAAC,SAAS,YAAY;AAAA,IAC3D,EAAE,OAAO,eAAqB,MAAM,CAAC,CAAC,SAAS,MAAM;AAAA,IACrD,EAAE,OAAO,gBAAqB,MAAM,CAAC,CAAC,SAAS,YAAY;AAAA,IAC3D,EAAE,OAAO,gBAAqB,MAAM,CAAC,EAAE,SAAS,cAAc,SAAS,cAAc,SAAS,YAAY;AAAA,IAC1G,EAAE,OAAO,qBAAqB,MAAM,CAAC,CAAC,SAAS,gBAAgB;AAAA,EACjE;AAEA,QAAM,YAAY,MAAM,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE;AAE9C,MAAI,cAAc,MAAM,OAAQ,QAAO;AAEvC,SACE,qBAAC,SAAI,WAAU,+EACb;AAAA,yBAAC,SAAI,WAAU,qCACb;AAAA,2BAAC,SAAI,WAAU,2BACb;AAAA,4BAAC,YAAS,WAAU,iCAAgC;AAAA,QACpD,oBAAC,OAAE,WAAU,yBAAwB,oCAAsB;AAAA,SAC7D;AAAA,MACA,qBAAC,UAAK,WAAU,8CACb;AAAA;AAAA,QAAU;AAAA,QAAE,MAAM;AAAA,QAAO;AAAA,SAC5B;AAAA,OACF;AAAA,IAEA,oBAAC,SAAI,WAAU,sDACb;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO,EAAE,OAAO,GAAI,YAAY,MAAM,SAAU,GAAG,IAAI;AAAA;AAAA,IACzD,GACF;AAAA,IAEA,oBAAC,SAAI,WAAU,oCACZ,gBAAM,IAAI,CAAC,EAAE,OAAO,KAAK,MACxB,qBAAC,SAAgB,WAAU,6BACxB;AAAA,aACC,oBAAC,gBAAa,WAAU,yCAAwC,IAEhE,oBAAC,UAAO,WAAU,iDAAgD;AAAA,MAEpE,oBAAC,UAAK,WAAW,GAAG,WAAW,OAAO,uCAAuC,iBAAiB,GAC3F,iBACH;AAAA,SARQ,KASV,CACD,GACH;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,0BAA0B,QAAQ;AAAA,QACxC,WAAU;AAAA,QAEV;AAAA,8BAAC,YAAS,WAAU,WAAU;AAAA,UAAE;AAAA;AAAA;AAAA,IAElC;AAAA,KACF;AAEJ;","names":[]}
@@ -33,7 +33,7 @@ __export(parent_attribution_banner_exports, {
33
33
  });
34
34
  module.exports = __toCommonJS(parent_attribution_banner_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_lucide_react = require("lucide-react");
38
38
  function ParentAttributionBanner({ parentContract, parentTokenId, parentName }) {
39
39
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/parent-attribution-banner.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { GitBranch, ExternalLink } from \"lucide-react\";\n\nexport interface ParentBannerProps {\n parentContract: string;\n parentTokenId: string;\n parentName?: string;\n}\n\nexport function ParentAttributionBanner({ parentContract, parentTokenId, parentName }: ParentBannerProps) {\n return (\n <Link\n href={`/asset/${parentContract}/${parentTokenId}`}\n className=\"flex items-center gap-2.5 px-3 py-2 rounded-xl border border-primary/25 bg-primary/5 text-sm hover:bg-primary/10 transition-colors group\"\n >\n <GitBranch className=\"h-4 w-4 text-primary shrink-0\" />\n <span className=\"text-muted-foreground\">Remix of</span>\n <span className=\"font-medium text-foreground truncate\">{parentName ?? `Token #${parentTokenId}`}</span>\n <ExternalLink className=\"h-3.5 w-3.5 text-muted-foreground ml-auto shrink-0 group-hover:text-foreground transition-colors\" />\n </Link>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAaI;AAXJ,kBAAiB;AACjB,0BAAwC;AAQjC,SAAS,wBAAwB,EAAE,gBAAgB,eAAe,WAAW,GAAsB;AACxG,SACE;AAAA,IAAC,YAAAA;AAAA,IAAA;AAAA,MACC,MAAM,UAAU,cAAc,IAAI,aAAa;AAAA,MAC/C,WAAU;AAAA,MAEV;AAAA,oDAAC,iCAAU,WAAU,iCAAgC;AAAA,QACrD,4CAAC,UAAK,WAAU,yBAAwB,sBAAQ;AAAA,QAChD,4CAAC,UAAK,WAAU,wCAAwC,wBAAc,UAAU,aAAa,IAAG;AAAA,QAChG,4CAAC,oCAAa,WAAU,oGAAmG;AAAA;AAAA;AAAA,EAC7H;AAEJ;","names":["Link"]}
1
+ {"version":3,"sources":["../../src/components/parent-attribution-banner.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"./link.js\";\nimport { GitBranch, ExternalLink } from \"lucide-react\";\n\nexport interface ParentBannerProps {\n parentContract: string;\n parentTokenId: string;\n parentName?: string;\n}\n\nexport function ParentAttributionBanner({ parentContract, parentTokenId, parentName }: ParentBannerProps) {\n return (\n <Link\n href={`/asset/${parentContract}/${parentTokenId}`}\n className=\"flex items-center gap-2.5 px-3 py-2 rounded-xl border border-primary/25 bg-primary/5 text-sm hover:bg-primary/10 transition-colors group\"\n >\n <GitBranch className=\"h-4 w-4 text-primary shrink-0\" />\n <span className=\"text-muted-foreground\">Remix of</span>\n <span className=\"font-medium text-foreground truncate\">{parentName ?? `Token #${parentTokenId}`}</span>\n <ExternalLink className=\"h-3.5 w-3.5 text-muted-foreground ml-auto shrink-0 group-hover:text-foreground transition-colors\" />\n </Link>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAaI;AAXJ,kBAAiB;AACjB,0BAAwC;AAQjC,SAAS,wBAAwB,EAAE,gBAAgB,eAAe,WAAW,GAAsB;AACxG,SACE;AAAA,IAAC,YAAAA;AAAA,IAAA;AAAA,MACC,MAAM,UAAU,cAAc,IAAI,aAAa;AAAA,MAC/C,WAAU;AAAA,MAEV;AAAA,oDAAC,iCAAU,WAAU,iCAAgC;AAAA,QACrD,4CAAC,UAAK,WAAU,yBAAwB,sBAAQ;AAAA,QAChD,4CAAC,UAAK,WAAU,wCAAwC,wBAAc,UAAU,aAAa,IAAG;AAAA,QAChG,4CAAC,oCAAa,WAAU,oGAAmG;AAAA;AAAA;AAAA,EAC7H;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 { GitBranch, ExternalLink } from "lucide-react";
5
5
  function ParentAttributionBanner({ parentContract, parentTokenId, parentName }) {
6
6
  return /* @__PURE__ */ jsxs(
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/parent-attribution-banner.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { GitBranch, ExternalLink } from \"lucide-react\";\n\nexport interface ParentBannerProps {\n parentContract: string;\n parentTokenId: string;\n parentName?: string;\n}\n\nexport function ParentAttributionBanner({ parentContract, parentTokenId, parentName }: ParentBannerProps) {\n return (\n <Link\n href={`/asset/${parentContract}/${parentTokenId}`}\n className=\"flex items-center gap-2.5 px-3 py-2 rounded-xl border border-primary/25 bg-primary/5 text-sm hover:bg-primary/10 transition-colors group\"\n >\n <GitBranch className=\"h-4 w-4 text-primary shrink-0\" />\n <span className=\"text-muted-foreground\">Remix of</span>\n <span className=\"font-medium text-foreground truncate\">{parentName ?? `Token #${parentTokenId}`}</span>\n <ExternalLink className=\"h-3.5 w-3.5 text-muted-foreground ml-auto shrink-0 group-hover:text-foreground transition-colors\" />\n </Link>\n );\n}\n"],"mappings":";AAaI,SAIE,KAJF;AAXJ,OAAO,UAAU;AACjB,SAAS,WAAW,oBAAoB;AAQjC,SAAS,wBAAwB,EAAE,gBAAgB,eAAe,WAAW,GAAsB;AACxG,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAM,UAAU,cAAc,IAAI,aAAa;AAAA,MAC/C,WAAU;AAAA,MAEV;AAAA,4BAAC,aAAU,WAAU,iCAAgC;AAAA,QACrD,oBAAC,UAAK,WAAU,yBAAwB,sBAAQ;AAAA,QAChD,oBAAC,UAAK,WAAU,wCAAwC,wBAAc,UAAU,aAAa,IAAG;AAAA,QAChG,oBAAC,gBAAa,WAAU,oGAAmG;AAAA;AAAA;AAAA,EAC7H;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/components/parent-attribution-banner.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"./link.js\";\nimport { GitBranch, ExternalLink } from \"lucide-react\";\n\nexport interface ParentBannerProps {\n parentContract: string;\n parentTokenId: string;\n parentName?: string;\n}\n\nexport function ParentAttributionBanner({ parentContract, parentTokenId, parentName }: ParentBannerProps) {\n return (\n <Link\n href={`/asset/${parentContract}/${parentTokenId}`}\n className=\"flex items-center gap-2.5 px-3 py-2 rounded-xl border border-primary/25 bg-primary/5 text-sm hover:bg-primary/10 transition-colors group\"\n >\n <GitBranch className=\"h-4 w-4 text-primary shrink-0\" />\n <span className=\"text-muted-foreground\">Remix of</span>\n <span className=\"font-medium text-foreground truncate\">{parentName ?? `Token #${parentTokenId}`}</span>\n <ExternalLink className=\"h-3.5 w-3.5 text-muted-foreground ml-auto shrink-0 group-hover:text-foreground transition-colors\" />\n </Link>\n );\n}\n"],"mappings":";AAaI,SAIE,KAJF;AAXJ,OAAO,UAAU;AACjB,SAAS,WAAW,oBAAoB;AAQjC,SAAS,wBAAwB,EAAE,gBAAgB,eAAe,WAAW,GAAsB;AACxG,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAM,UAAU,cAAc,IAAI,aAAa;AAAA,MAC/C,WAAU;AAAA,MAEV;AAAA,4BAAC,aAAU,WAAU,iCAAgC;AAAA,QACrD,oBAAC,UAAK,WAAU,yBAAwB,sBAAQ;AAAA,QAChD,oBAAC,UAAK,WAAU,wCAAwC,wBAAc,UAAU,aAAa,IAAG;AAAA,QAChG,oBAAC,gBAAa,WAAU,oGAAmG;AAAA;AAAA;AAAA,EAC7H;AAEJ;","names":[]}
@@ -31,7 +31,7 @@ var import_empty_or_error = require("./empty-or-error.js");
31
31
  var import_activity = require("../data/activity.js");
32
32
  var import_activity_row = require("./activity-row.js");
33
33
  var import_cn = require("../utils/cn.js");
34
- const EXPLORER_URL = (typeof process !== "undefined" ? process.env.NEXT_PUBLIC_EXPLORER_URL : void 0) || "https://voyager.online";
34
+ var import_explorer_url = require("../utils/explorer-url.js");
35
35
  function PortfolioActivity({ getClient, address }) {
36
36
  const { activities, isLoading, error, mutate } = (0, import_use_activities.useActivitiesByAddress)(getClient, address);
37
37
  const [typeFilter, setTypeFilter] = (0, import_react.useState)("");
@@ -101,7 +101,7 @@ function PortfolioActivity({ getClient, address }) {
101
101
  activity,
102
102
  showActor: false,
103
103
  showExplorer: true,
104
- explorerUrl: EXPLORER_URL,
104
+ explorerUrl: import_explorer_url.EXPLORER_URL,
105
105
  getAssetHref: (c, t) => (0, import_sdk.assetHref)("STARKNET", c, t)
106
106
  },
107
107
  `${activity.txHash}-${activity.type}-${i}`
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/portfolio-activity.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useMemo } from \"react\";\nimport type { MedialaneClient } from \"@medialane/sdk/starknet\";\nimport { Activity } from \"lucide-react\";\nimport { assetHref } from \"@medialane/sdk\";\nimport { useActivitiesByAddress } from \"../utils/use-activities.js\";\nimport { EmptyOrError } from \"./empty-or-error.js\";\nimport { ACTIVITY_TYPE_CONFIG, TYPE_FILTERS } from \"../data/activity.js\";\nimport { ActivityRow } from \"./activity-row.js\";\nimport { cn } from \"../utils/cn.js\";\n\nconst EXPLORER_URL =\n (typeof process !== \"undefined\" ? process.env.NEXT_PUBLIC_EXPLORER_URL : undefined) ||\n \"https://voyager.online\";\n\nexport interface PortfolioActivityProps {\n getClient: () => MedialaneClient;\n address: string | null;\n}\n\nexport function PortfolioActivity({ getClient, address }: PortfolioActivityProps) {\n const { activities, isLoading, error, mutate } = useActivitiesByAddress(getClient, address);\n const [typeFilter, setTypeFilter] = useState(\"\");\n\n const displayed = typeFilter\n ? activities.filter((a) => a.type === typeFilter)\n : activities;\n\n const typeCounts = useMemo(() => {\n const counts: Record<string, number> = {};\n for (const a of activities) {\n counts[a.type] = (counts[a.type] ?? 0) + 1;\n }\n return counts;\n }, [activities]);\n\n return (\n <div className=\"space-y-4\">\n\n <div className=\"flex flex-wrap gap-2\">\n {TYPE_FILTERS.map((f) => {\n const typeConfig = f.value ? ACTIVITY_TYPE_CONFIG[f.value] : null;\n const Icon = typeConfig?.icon;\n const count = f.value ? typeCounts[f.value] : activities.length;\n const isActive = typeFilter === f.value;\n return (\n <button\n key={f.value}\n onClick={() => setTypeFilter(f.value)}\n className={cn(\n \"flex items-center gap-1.5 text-xs px-3 py-1.5 rounded-full transition-all font-medium\",\n isActive\n ? \"bg-primary text-primary-foreground shadow-sm\"\n : \"bg-muted text-muted-foreground hover:bg-muted/70 hover:text-foreground\"\n )}\n >\n {Icon && (\n <Icon\n className={cn(\n \"h-3 w-3\",\n isActive ? \"text-primary-foreground\" : typeConfig?.colorClass\n )}\n />\n )}\n {f.label}\n {!isLoading && count != null && count > 0 && (\n <span\n className={cn(\n \"text-[10px] font-bold tabular-nums\",\n isActive\n ? \"text-primary-foreground/70\"\n : \"text-muted-foreground/60\"\n )}\n >\n {count}\n </span>\n )}\n </button>\n );\n })}\n </div>\n\n <EmptyOrError\n isLoading={isLoading}\n error={error}\n isEmpty={displayed.length === 0}\n onRetry={mutate}\n emptyTitle={typeFilter ? `No ${typeFilter} events yet` : \"No activity yet\"}\n emptyDescription=\"Start by listing or buying an asset on the marketplace.\"\n emptyCta={{ label: \"Browse marketplace\", href: \"/marketplace\" }}\n emptyIcon={<Activity className=\"h-7 w-7 text-muted-foreground\" />}\n skeletonCount={8}\n >\n <div className=\"rounded-xl border border-border overflow-hidden divide-y divide-border/50\">\n {displayed.map((activity, i) => (\n <ActivityRow\n key={`${activity.txHash}-${activity.type}-${i}`}\n activity={activity}\n showActor={false}\n showExplorer\n explorerUrl={EXPLORER_URL}\n getAssetHref={(c, t) => assetHref(\"STARKNET\", c, t)}\n />\n ))}\n </div>\n </EmptyOrError>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA+CY;AA7CZ,mBAAkC;AAElC,0BAAyB;AACzB,iBAA0B;AAC1B,4BAAuC;AACvC,4BAA6B;AAC7B,sBAAmD;AACnD,0BAA4B;AAC5B,gBAAmB;AAEnB,MAAM,gBACH,OAAO,YAAY,cAAc,QAAQ,IAAI,2BAA2B,WACzE;AAOK,SAAS,kBAAkB,EAAE,WAAW,QAAQ,GAA2B;AAChF,QAAM,EAAE,YAAY,WAAW,OAAO,OAAO,QAAI,8CAAuB,WAAW,OAAO;AAC1F,QAAM,CAAC,YAAY,aAAa,QAAI,uBAAS,EAAE;AAE/C,QAAM,YAAY,aACd,WAAW,OAAO,CAAC,MAAM,EAAE,SAAS,UAAU,IAC9C;AAEJ,QAAM,iBAAa,sBAAQ,MAAM;AAC/B,UAAM,SAAiC,CAAC;AACxC,eAAW,KAAK,YAAY;AAC1B,aAAO,EAAE,IAAI,KAAK,OAAO,EAAE,IAAI,KAAK,KAAK;AAAA,IAC3C;AACA,WAAO;AAAA,EACT,GAAG,CAAC,UAAU,CAAC;AAEf,SACE,6CAAC,SAAI,WAAU,aAEb;AAAA,gDAAC,SAAI,WAAU,wBACZ,uCAAa,IAAI,CAAC,MAAM;AACvB,YAAM,aAAa,EAAE,QAAQ,qCAAqB,EAAE,KAAK,IAAI;AAC7D,YAAM,OAAO,YAAY;AACzB,YAAM,QAAQ,EAAE,QAAQ,WAAW,EAAE,KAAK,IAAI,WAAW;AACzD,YAAM,WAAW,eAAe,EAAE;AAClC,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,SAAS,MAAM,cAAc,EAAE,KAAK;AAAA,UACpC,eAAW;AAAA,YACT;AAAA,YACA,WACI,iDACA;AAAA,UACN;AAAA,UAEC;AAAA,oBACC;AAAA,cAAC;AAAA;AAAA,gBACC,eAAW;AAAA,kBACT;AAAA,kBACA,WAAW,4BAA4B,YAAY;AAAA,gBACrD;AAAA;AAAA,YACF;AAAA,YAED,EAAE;AAAA,YACF,CAAC,aAAa,SAAS,QAAQ,QAAQ,KACtC;AAAA,cAAC;AAAA;AAAA,gBACC,eAAW;AAAA,kBACT;AAAA,kBACA,WACI,+BACA;AAAA,gBACN;AAAA,gBAEC;AAAA;AAAA,YACH;AAAA;AAAA;AAAA,QA5BG,EAAE;AAAA,MA8BT;AAAA,IAEJ,CAAC,GACH;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,SAAS,UAAU,WAAW;AAAA,QAC9B,SAAS;AAAA,QACT,YAAY,aAAa,MAAM,UAAU,gBAAgB;AAAA,QACzD,kBAAiB;AAAA,QACjB,UAAU,EAAE,OAAO,sBAAsB,MAAM,eAAe;AAAA,QAC9D,WAAW,4CAAC,gCAAS,WAAU,iCAAgC;AAAA,QAC/D,eAAe;AAAA,QAEf,sDAAC,SAAI,WAAU,6EACZ,oBAAU,IAAI,CAAC,UAAU,MACxB;AAAA,UAAC;AAAA;AAAA,YAEC;AAAA,YACA,WAAW;AAAA,YACX,cAAY;AAAA,YACZ,aAAa;AAAA,YACb,cAAc,CAAC,GAAG,UAAM,sBAAU,YAAY,GAAG,CAAC;AAAA;AAAA,UAL7C,GAAG,SAAS,MAAM,IAAI,SAAS,IAAI,IAAI,CAAC;AAAA,QAM/C,CACD,GACH;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/components/portfolio-activity.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useMemo } from \"react\";\nimport type { MedialaneClient } from \"@medialane/sdk/starknet\";\nimport { Activity } from \"lucide-react\";\nimport { assetHref } from \"@medialane/sdk\";\nimport { useActivitiesByAddress } from \"../utils/use-activities.js\";\nimport { EmptyOrError } from \"./empty-or-error.js\";\nimport { ACTIVITY_TYPE_CONFIG, TYPE_FILTERS } from \"../data/activity.js\";\nimport { ActivityRow } from \"./activity-row.js\";\nimport { cn } from \"../utils/cn.js\";\nimport { EXPLORER_URL } from \"../utils/explorer-url.js\";\n\nexport interface PortfolioActivityProps {\n getClient: () => MedialaneClient;\n address: string | null;\n}\n\nexport function PortfolioActivity({ getClient, address }: PortfolioActivityProps) {\n const { activities, isLoading, error, mutate } = useActivitiesByAddress(getClient, address);\n const [typeFilter, setTypeFilter] = useState(\"\");\n\n const displayed = typeFilter\n ? activities.filter((a) => a.type === typeFilter)\n : activities;\n\n const typeCounts = useMemo(() => {\n const counts: Record<string, number> = {};\n for (const a of activities) {\n counts[a.type] = (counts[a.type] ?? 0) + 1;\n }\n return counts;\n }, [activities]);\n\n return (\n <div className=\"space-y-4\">\n\n <div className=\"flex flex-wrap gap-2\">\n {TYPE_FILTERS.map((f) => {\n const typeConfig = f.value ? ACTIVITY_TYPE_CONFIG[f.value] : null;\n const Icon = typeConfig?.icon;\n const count = f.value ? typeCounts[f.value] : activities.length;\n const isActive = typeFilter === f.value;\n return (\n <button\n key={f.value}\n onClick={() => setTypeFilter(f.value)}\n className={cn(\n \"flex items-center gap-1.5 text-xs px-3 py-1.5 rounded-full transition-all font-medium\",\n isActive\n ? \"bg-primary text-primary-foreground shadow-sm\"\n : \"bg-muted text-muted-foreground hover:bg-muted/70 hover:text-foreground\"\n )}\n >\n {Icon && (\n <Icon\n className={cn(\n \"h-3 w-3\",\n isActive ? \"text-primary-foreground\" : typeConfig?.colorClass\n )}\n />\n )}\n {f.label}\n {!isLoading && count != null && count > 0 && (\n <span\n className={cn(\n \"text-[10px] font-bold tabular-nums\",\n isActive\n ? \"text-primary-foreground/70\"\n : \"text-muted-foreground/60\"\n )}\n >\n {count}\n </span>\n )}\n </button>\n );\n })}\n </div>\n\n <EmptyOrError\n isLoading={isLoading}\n error={error}\n isEmpty={displayed.length === 0}\n onRetry={mutate}\n emptyTitle={typeFilter ? `No ${typeFilter} events yet` : \"No activity yet\"}\n emptyDescription=\"Start by listing or buying an asset on the marketplace.\"\n emptyCta={{ label: \"Browse marketplace\", href: \"/marketplace\" }}\n emptyIcon={<Activity className=\"h-7 w-7 text-muted-foreground\" />}\n skeletonCount={8}\n >\n <div className=\"rounded-xl border border-border overflow-hidden divide-y divide-border/50\">\n {displayed.map((activity, i) => (\n <ActivityRow\n key={`${activity.txHash}-${activity.type}-${i}`}\n activity={activity}\n showActor={false}\n showExplorer\n explorerUrl={EXPLORER_URL}\n getAssetHref={(c, t) => assetHref(\"STARKNET\", c, t)}\n />\n ))}\n </div>\n </EmptyOrError>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA4CY;AA1CZ,mBAAkC;AAElC,0BAAyB;AACzB,iBAA0B;AAC1B,4BAAuC;AACvC,4BAA6B;AAC7B,sBAAmD;AACnD,0BAA4B;AAC5B,gBAAmB;AACnB,0BAA6B;AAOtB,SAAS,kBAAkB,EAAE,WAAW,QAAQ,GAA2B;AAChF,QAAM,EAAE,YAAY,WAAW,OAAO,OAAO,QAAI,8CAAuB,WAAW,OAAO;AAC1F,QAAM,CAAC,YAAY,aAAa,QAAI,uBAAS,EAAE;AAE/C,QAAM,YAAY,aACd,WAAW,OAAO,CAAC,MAAM,EAAE,SAAS,UAAU,IAC9C;AAEJ,QAAM,iBAAa,sBAAQ,MAAM;AAC/B,UAAM,SAAiC,CAAC;AACxC,eAAW,KAAK,YAAY;AAC1B,aAAO,EAAE,IAAI,KAAK,OAAO,EAAE,IAAI,KAAK,KAAK;AAAA,IAC3C;AACA,WAAO;AAAA,EACT,GAAG,CAAC,UAAU,CAAC;AAEf,SACE,6CAAC,SAAI,WAAU,aAEb;AAAA,gDAAC,SAAI,WAAU,wBACZ,uCAAa,IAAI,CAAC,MAAM;AACvB,YAAM,aAAa,EAAE,QAAQ,qCAAqB,EAAE,KAAK,IAAI;AAC7D,YAAM,OAAO,YAAY;AACzB,YAAM,QAAQ,EAAE,QAAQ,WAAW,EAAE,KAAK,IAAI,WAAW;AACzD,YAAM,WAAW,eAAe,EAAE;AAClC,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,SAAS,MAAM,cAAc,EAAE,KAAK;AAAA,UACpC,eAAW;AAAA,YACT;AAAA,YACA,WACI,iDACA;AAAA,UACN;AAAA,UAEC;AAAA,oBACC;AAAA,cAAC;AAAA;AAAA,gBACC,eAAW;AAAA,kBACT;AAAA,kBACA,WAAW,4BAA4B,YAAY;AAAA,gBACrD;AAAA;AAAA,YACF;AAAA,YAED,EAAE;AAAA,YACF,CAAC,aAAa,SAAS,QAAQ,QAAQ,KACtC;AAAA,cAAC;AAAA;AAAA,gBACC,eAAW;AAAA,kBACT;AAAA,kBACA,WACI,+BACA;AAAA,gBACN;AAAA,gBAEC;AAAA;AAAA,YACH;AAAA;AAAA;AAAA,QA5BG,EAAE;AAAA,MA8BT;AAAA,IAEJ,CAAC,GACH;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,SAAS,UAAU,WAAW;AAAA,QAC9B,SAAS;AAAA,QACT,YAAY,aAAa,MAAM,UAAU,gBAAgB;AAAA,QACzD,kBAAiB;AAAA,QACjB,UAAU,EAAE,OAAO,sBAAsB,MAAM,eAAe;AAAA,QAC9D,WAAW,4CAAC,gCAAS,WAAU,iCAAgC;AAAA,QAC/D,eAAe;AAAA,QAEf,sDAAC,SAAI,WAAU,6EACZ,oBAAU,IAAI,CAAC,UAAU,MACxB;AAAA,UAAC;AAAA;AAAA,YAEC;AAAA,YACA,WAAW;AAAA,YACX,cAAY;AAAA,YACZ,aAAa;AAAA,YACb,cAAc,CAAC,GAAG,UAAM,sBAAU,YAAY,GAAG,CAAC;AAAA;AAAA,UAL7C,GAAG,SAAS,MAAM,IAAI,SAAS,IAAI,IAAI,CAAC;AAAA,QAM/C,CACD,GACH;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;","names":[]}
@@ -8,7 +8,7 @@ import { EmptyOrError } from "./empty-or-error.js";
8
8
  import { ACTIVITY_TYPE_CONFIG, TYPE_FILTERS } from "../data/activity.js";
9
9
  import { ActivityRow } from "./activity-row.js";
10
10
  import { cn } from "../utils/cn.js";
11
- const EXPLORER_URL = (typeof process !== "undefined" ? process.env.NEXT_PUBLIC_EXPLORER_URL : void 0) || "https://voyager.online";
11
+ import { EXPLORER_URL } from "../utils/explorer-url.js";
12
12
  function PortfolioActivity({ getClient, address }) {
13
13
  const { activities, isLoading, error, mutate } = useActivitiesByAddress(getClient, address);
14
14
  const [typeFilter, setTypeFilter] = useState("");
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/portfolio-activity.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useMemo } from \"react\";\nimport type { MedialaneClient } from \"@medialane/sdk/starknet\";\nimport { Activity } from \"lucide-react\";\nimport { assetHref } from \"@medialane/sdk\";\nimport { useActivitiesByAddress } from \"../utils/use-activities.js\";\nimport { EmptyOrError } from \"./empty-or-error.js\";\nimport { ACTIVITY_TYPE_CONFIG, TYPE_FILTERS } from \"../data/activity.js\";\nimport { ActivityRow } from \"./activity-row.js\";\nimport { cn } from \"../utils/cn.js\";\n\nconst EXPLORER_URL =\n (typeof process !== \"undefined\" ? process.env.NEXT_PUBLIC_EXPLORER_URL : undefined) ||\n \"https://voyager.online\";\n\nexport interface PortfolioActivityProps {\n getClient: () => MedialaneClient;\n address: string | null;\n}\n\nexport function PortfolioActivity({ getClient, address }: PortfolioActivityProps) {\n const { activities, isLoading, error, mutate } = useActivitiesByAddress(getClient, address);\n const [typeFilter, setTypeFilter] = useState(\"\");\n\n const displayed = typeFilter\n ? activities.filter((a) => a.type === typeFilter)\n : activities;\n\n const typeCounts = useMemo(() => {\n const counts: Record<string, number> = {};\n for (const a of activities) {\n counts[a.type] = (counts[a.type] ?? 0) + 1;\n }\n return counts;\n }, [activities]);\n\n return (\n <div className=\"space-y-4\">\n\n <div className=\"flex flex-wrap gap-2\">\n {TYPE_FILTERS.map((f) => {\n const typeConfig = f.value ? ACTIVITY_TYPE_CONFIG[f.value] : null;\n const Icon = typeConfig?.icon;\n const count = f.value ? typeCounts[f.value] : activities.length;\n const isActive = typeFilter === f.value;\n return (\n <button\n key={f.value}\n onClick={() => setTypeFilter(f.value)}\n className={cn(\n \"flex items-center gap-1.5 text-xs px-3 py-1.5 rounded-full transition-all font-medium\",\n isActive\n ? \"bg-primary text-primary-foreground shadow-sm\"\n : \"bg-muted text-muted-foreground hover:bg-muted/70 hover:text-foreground\"\n )}\n >\n {Icon && (\n <Icon\n className={cn(\n \"h-3 w-3\",\n isActive ? \"text-primary-foreground\" : typeConfig?.colorClass\n )}\n />\n )}\n {f.label}\n {!isLoading && count != null && count > 0 && (\n <span\n className={cn(\n \"text-[10px] font-bold tabular-nums\",\n isActive\n ? \"text-primary-foreground/70\"\n : \"text-muted-foreground/60\"\n )}\n >\n {count}\n </span>\n )}\n </button>\n );\n })}\n </div>\n\n <EmptyOrError\n isLoading={isLoading}\n error={error}\n isEmpty={displayed.length === 0}\n onRetry={mutate}\n emptyTitle={typeFilter ? `No ${typeFilter} events yet` : \"No activity yet\"}\n emptyDescription=\"Start by listing or buying an asset on the marketplace.\"\n emptyCta={{ label: \"Browse marketplace\", href: \"/marketplace\" }}\n emptyIcon={<Activity className=\"h-7 w-7 text-muted-foreground\" />}\n skeletonCount={8}\n >\n <div className=\"rounded-xl border border-border overflow-hidden divide-y divide-border/50\">\n {displayed.map((activity, i) => (\n <ActivityRow\n key={`${activity.txHash}-${activity.type}-${i}`}\n activity={activity}\n showActor={false}\n showExplorer\n explorerUrl={EXPLORER_URL}\n getAssetHref={(c, t) => assetHref(\"STARKNET\", c, t)}\n />\n ))}\n </div>\n </EmptyOrError>\n </div>\n );\n}\n"],"mappings":";AA+CY,SAWI,KAXJ;AA7CZ,SAAS,UAAU,eAAe;AAElC,SAAS,gBAAgB;AACzB,SAAS,iBAAiB;AAC1B,SAAS,8BAA8B;AACvC,SAAS,oBAAoB;AAC7B,SAAS,sBAAsB,oBAAoB;AACnD,SAAS,mBAAmB;AAC5B,SAAS,UAAU;AAEnB,MAAM,gBACH,OAAO,YAAY,cAAc,QAAQ,IAAI,2BAA2B,WACzE;AAOK,SAAS,kBAAkB,EAAE,WAAW,QAAQ,GAA2B;AAChF,QAAM,EAAE,YAAY,WAAW,OAAO,OAAO,IAAI,uBAAuB,WAAW,OAAO;AAC1F,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,EAAE;AAE/C,QAAM,YAAY,aACd,WAAW,OAAO,CAAC,MAAM,EAAE,SAAS,UAAU,IAC9C;AAEJ,QAAM,aAAa,QAAQ,MAAM;AAC/B,UAAM,SAAiC,CAAC;AACxC,eAAW,KAAK,YAAY;AAC1B,aAAO,EAAE,IAAI,KAAK,OAAO,EAAE,IAAI,KAAK,KAAK;AAAA,IAC3C;AACA,WAAO;AAAA,EACT,GAAG,CAAC,UAAU,CAAC;AAEf,SACE,qBAAC,SAAI,WAAU,aAEb;AAAA,wBAAC,SAAI,WAAU,wBACZ,uBAAa,IAAI,CAAC,MAAM;AACvB,YAAM,aAAa,EAAE,QAAQ,qBAAqB,EAAE,KAAK,IAAI;AAC7D,YAAM,OAAO,YAAY;AACzB,YAAM,QAAQ,EAAE,QAAQ,WAAW,EAAE,KAAK,IAAI,WAAW;AACzD,YAAM,WAAW,eAAe,EAAE;AAClC,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,SAAS,MAAM,cAAc,EAAE,KAAK;AAAA,UACpC,WAAW;AAAA,YACT;AAAA,YACA,WACI,iDACA;AAAA,UACN;AAAA,UAEC;AAAA,oBACC;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW;AAAA,kBACT;AAAA,kBACA,WAAW,4BAA4B,YAAY;AAAA,gBACrD;AAAA;AAAA,YACF;AAAA,YAED,EAAE;AAAA,YACF,CAAC,aAAa,SAAS,QAAQ,QAAQ,KACtC;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW;AAAA,kBACT;AAAA,kBACA,WACI,+BACA;AAAA,gBACN;AAAA,gBAEC;AAAA;AAAA,YACH;AAAA;AAAA;AAAA,QA5BG,EAAE;AAAA,MA8BT;AAAA,IAEJ,CAAC,GACH;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,SAAS,UAAU,WAAW;AAAA,QAC9B,SAAS;AAAA,QACT,YAAY,aAAa,MAAM,UAAU,gBAAgB;AAAA,QACzD,kBAAiB;AAAA,QACjB,UAAU,EAAE,OAAO,sBAAsB,MAAM,eAAe;AAAA,QAC9D,WAAW,oBAAC,YAAS,WAAU,iCAAgC;AAAA,QAC/D,eAAe;AAAA,QAEf,8BAAC,SAAI,WAAU,6EACZ,oBAAU,IAAI,CAAC,UAAU,MACxB;AAAA,UAAC;AAAA;AAAA,YAEC;AAAA,YACA,WAAW;AAAA,YACX,cAAY;AAAA,YACZ,aAAa;AAAA,YACb,cAAc,CAAC,GAAG,MAAM,UAAU,YAAY,GAAG,CAAC;AAAA;AAAA,UAL7C,GAAG,SAAS,MAAM,IAAI,SAAS,IAAI,IAAI,CAAC;AAAA,QAM/C,CACD,GACH;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/components/portfolio-activity.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useMemo } from \"react\";\nimport type { MedialaneClient } from \"@medialane/sdk/starknet\";\nimport { Activity } from \"lucide-react\";\nimport { assetHref } from \"@medialane/sdk\";\nimport { useActivitiesByAddress } from \"../utils/use-activities.js\";\nimport { EmptyOrError } from \"./empty-or-error.js\";\nimport { ACTIVITY_TYPE_CONFIG, TYPE_FILTERS } from \"../data/activity.js\";\nimport { ActivityRow } from \"./activity-row.js\";\nimport { cn } from \"../utils/cn.js\";\nimport { EXPLORER_URL } from \"../utils/explorer-url.js\";\n\nexport interface PortfolioActivityProps {\n getClient: () => MedialaneClient;\n address: string | null;\n}\n\nexport function PortfolioActivity({ getClient, address }: PortfolioActivityProps) {\n const { activities, isLoading, error, mutate } = useActivitiesByAddress(getClient, address);\n const [typeFilter, setTypeFilter] = useState(\"\");\n\n const displayed = typeFilter\n ? activities.filter((a) => a.type === typeFilter)\n : activities;\n\n const typeCounts = useMemo(() => {\n const counts: Record<string, number> = {};\n for (const a of activities) {\n counts[a.type] = (counts[a.type] ?? 0) + 1;\n }\n return counts;\n }, [activities]);\n\n return (\n <div className=\"space-y-4\">\n\n <div className=\"flex flex-wrap gap-2\">\n {TYPE_FILTERS.map((f) => {\n const typeConfig = f.value ? ACTIVITY_TYPE_CONFIG[f.value] : null;\n const Icon = typeConfig?.icon;\n const count = f.value ? typeCounts[f.value] : activities.length;\n const isActive = typeFilter === f.value;\n return (\n <button\n key={f.value}\n onClick={() => setTypeFilter(f.value)}\n className={cn(\n \"flex items-center gap-1.5 text-xs px-3 py-1.5 rounded-full transition-all font-medium\",\n isActive\n ? \"bg-primary text-primary-foreground shadow-sm\"\n : \"bg-muted text-muted-foreground hover:bg-muted/70 hover:text-foreground\"\n )}\n >\n {Icon && (\n <Icon\n className={cn(\n \"h-3 w-3\",\n isActive ? \"text-primary-foreground\" : typeConfig?.colorClass\n )}\n />\n )}\n {f.label}\n {!isLoading && count != null && count > 0 && (\n <span\n className={cn(\n \"text-[10px] font-bold tabular-nums\",\n isActive\n ? \"text-primary-foreground/70\"\n : \"text-muted-foreground/60\"\n )}\n >\n {count}\n </span>\n )}\n </button>\n );\n })}\n </div>\n\n <EmptyOrError\n isLoading={isLoading}\n error={error}\n isEmpty={displayed.length === 0}\n onRetry={mutate}\n emptyTitle={typeFilter ? `No ${typeFilter} events yet` : \"No activity yet\"}\n emptyDescription=\"Start by listing or buying an asset on the marketplace.\"\n emptyCta={{ label: \"Browse marketplace\", href: \"/marketplace\" }}\n emptyIcon={<Activity className=\"h-7 w-7 text-muted-foreground\" />}\n skeletonCount={8}\n >\n <div className=\"rounded-xl border border-border overflow-hidden divide-y divide-border/50\">\n {displayed.map((activity, i) => (\n <ActivityRow\n key={`${activity.txHash}-${activity.type}-${i}`}\n activity={activity}\n showActor={false}\n showExplorer\n explorerUrl={EXPLORER_URL}\n getAssetHref={(c, t) => assetHref(\"STARKNET\", c, t)}\n />\n ))}\n </div>\n </EmptyOrError>\n </div>\n );\n}\n"],"mappings":";AA4CY,SAWI,KAXJ;AA1CZ,SAAS,UAAU,eAAe;AAElC,SAAS,gBAAgB;AACzB,SAAS,iBAAiB;AAC1B,SAAS,8BAA8B;AACvC,SAAS,oBAAoB;AAC7B,SAAS,sBAAsB,oBAAoB;AACnD,SAAS,mBAAmB;AAC5B,SAAS,UAAU;AACnB,SAAS,oBAAoB;AAOtB,SAAS,kBAAkB,EAAE,WAAW,QAAQ,GAA2B;AAChF,QAAM,EAAE,YAAY,WAAW,OAAO,OAAO,IAAI,uBAAuB,WAAW,OAAO;AAC1F,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,EAAE;AAE/C,QAAM,YAAY,aACd,WAAW,OAAO,CAAC,MAAM,EAAE,SAAS,UAAU,IAC9C;AAEJ,QAAM,aAAa,QAAQ,MAAM;AAC/B,UAAM,SAAiC,CAAC;AACxC,eAAW,KAAK,YAAY;AAC1B,aAAO,EAAE,IAAI,KAAK,OAAO,EAAE,IAAI,KAAK,KAAK;AAAA,IAC3C;AACA,WAAO;AAAA,EACT,GAAG,CAAC,UAAU,CAAC;AAEf,SACE,qBAAC,SAAI,WAAU,aAEb;AAAA,wBAAC,SAAI,WAAU,wBACZ,uBAAa,IAAI,CAAC,MAAM;AACvB,YAAM,aAAa,EAAE,QAAQ,qBAAqB,EAAE,KAAK,IAAI;AAC7D,YAAM,OAAO,YAAY;AACzB,YAAM,QAAQ,EAAE,QAAQ,WAAW,EAAE,KAAK,IAAI,WAAW;AACzD,YAAM,WAAW,eAAe,EAAE;AAClC,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,SAAS,MAAM,cAAc,EAAE,KAAK;AAAA,UACpC,WAAW;AAAA,YACT;AAAA,YACA,WACI,iDACA;AAAA,UACN;AAAA,UAEC;AAAA,oBACC;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW;AAAA,kBACT;AAAA,kBACA,WAAW,4BAA4B,YAAY;AAAA,gBACrD;AAAA;AAAA,YACF;AAAA,YAED,EAAE;AAAA,YACF,CAAC,aAAa,SAAS,QAAQ,QAAQ,KACtC;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW;AAAA,kBACT;AAAA,kBACA,WACI,+BACA;AAAA,gBACN;AAAA,gBAEC;AAAA;AAAA,YACH;AAAA;AAAA;AAAA,QA5BG,EAAE;AAAA,MA8BT;AAAA,IAEJ,CAAC,GACH;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,SAAS,UAAU,WAAW;AAAA,QAC9B,SAAS;AAAA,QACT,YAAY,aAAa,MAAM,UAAU,gBAAgB;AAAA,QACzD,kBAAiB;AAAA,QACjB,UAAU,EAAE,OAAO,sBAAsB,MAAM,eAAe;AAAA,QAC9D,WAAW,oBAAC,YAAS,WAAU,iCAAgC;AAAA,QAC/D,eAAe;AAAA,QAEf,8BAAC,SAAI,WAAU,6EACZ,oBAAU,IAAI,CAAC,UAAU,MACxB;AAAA,UAAC;AAAA;AAAA,YAEC;AAAA,YACA,WAAW;AAAA,YACX,cAAY;AAAA,YACZ,aAAa;AAAA,YACb,cAAc,CAAC,GAAG,MAAM,UAAU,YAAY,GAAG,CAAC;AAAA;AAAA,UAL7C,GAAG,SAAS,MAAM,IAAI,SAAS,IAAI,IAAI,CAAC;AAAA,QAM/C,CACD,GACH;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;","names":[]}
@@ -33,7 +33,7 @@ __export(portfolio_chip_filter_exports, {
33
33
  });
34
34
  module.exports = __toCommonJS(portfolio_chip_filter_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_cn = require("../utils/cn.js");
38
38
  const CHIP_CLASS = "shrink-0 rounded-full px-3.5 py-1.5 text-sm whitespace-nowrap transition-colors border";
39
39
  const INACTIVE_CLASS = "bg-muted border-border/60 text-muted-foreground hover:text-foreground hover:border-border";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/portfolio-chip-filter.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { cn } from \"../utils/cn.js\";\n\nexport interface PortfolioChipFilterOption {\n key: string;\n label: string;\n\n href?: string;\n}\n\nexport interface PortfolioChipFilterProps {\n options: PortfolioChipFilterOption[];\n\n value: string;\n onChange: (key: string) => void;\n\n showAll?: boolean;\n className?: string;\n}\n\nconst CHIP_CLASS =\n \"shrink-0 rounded-full px-3.5 py-1.5 text-sm whitespace-nowrap transition-colors border\";\nconst INACTIVE_CLASS = \"bg-muted border-border/60 text-muted-foreground hover:text-foreground hover:border-border\";\nconst ACTIVE_CLASS = \"bg-gradient-to-r from-brand-purple to-brand-orange border-transparent text-white font-bold\";\n\nexport function PortfolioChipFilter({\n options,\n value,\n onChange,\n showAll = true,\n className,\n}: PortfolioChipFilterProps) {\n const items = showAll ? [{ key: \"all\", label: \"All\" }, ...options] : options;\n\n return (\n <div\n className={cn(\n \"flex items-center gap-1.5 overflow-x-auto scrollbar-hide -mx-4 px-4 sm:-mx-6 sm:px-6 lg:-mx-8 lg:px-8\",\n className,\n )}\n >\n {items.map((item) =>\n item.href ? (\n <Link\n key={item.key}\n href={item.href}\n className={cn(CHIP_CLASS, item.href === value ? ACTIVE_CLASS : INACTIVE_CLASS)}\n >\n {item.label}\n </Link>\n ) : (\n <button\n key={item.key}\n type=\"button\"\n onClick={() => onChange(item.key)}\n className={cn(CHIP_CLASS, item.key === value ? ACTIVE_CLASS : INACTIVE_CLASS)}\n >\n {item.label}\n </button>\n ),\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA6CU;AA3CV,kBAAiB;AACjB,gBAAmB;AAmBnB,MAAM,aACJ;AACF,MAAM,iBAAiB;AACvB,MAAM,eAAe;AAEd,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AACF,GAA6B;AAC3B,QAAM,QAAQ,UAAU,CAAC,EAAE,KAAK,OAAO,OAAO,MAAM,GAAG,GAAG,OAAO,IAAI;AAErE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MAEC,gBAAM;AAAA,QAAI,CAAC,SACV,KAAK,OACH;AAAA,UAAC,YAAAA;AAAA,UAAA;AAAA,YAEC,MAAM,KAAK;AAAA,YACX,eAAW,cAAG,YAAY,KAAK,SAAS,QAAQ,eAAe,cAAc;AAAA,YAE5E,eAAK;AAAA;AAAA,UAJD,KAAK;AAAA,QAKZ,IAEA;AAAA,UAAC;AAAA;AAAA,YAEC,MAAK;AAAA,YACL,SAAS,MAAM,SAAS,KAAK,GAAG;AAAA,YAChC,eAAW,cAAG,YAAY,KAAK,QAAQ,QAAQ,eAAe,cAAc;AAAA,YAE3E,eAAK;AAAA;AAAA,UALD,KAAK;AAAA,QAMZ;AAAA,MAEJ;AAAA;AAAA,EACF;AAEJ;","names":["Link"]}
1
+ {"version":3,"sources":["../../src/components/portfolio-chip-filter.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"./link.js\";\nimport { cn } from \"../utils/cn.js\";\n\nexport interface PortfolioChipFilterOption {\n key: string;\n label: string;\n\n href?: string;\n}\n\nexport interface PortfolioChipFilterProps {\n options: PortfolioChipFilterOption[];\n\n value: string;\n onChange: (key: string) => void;\n\n showAll?: boolean;\n className?: string;\n}\n\nconst CHIP_CLASS =\n \"shrink-0 rounded-full px-3.5 py-1.5 text-sm whitespace-nowrap transition-colors border\";\nconst INACTIVE_CLASS = \"bg-muted border-border/60 text-muted-foreground hover:text-foreground hover:border-border\";\nconst ACTIVE_CLASS = \"bg-gradient-to-r from-brand-purple to-brand-orange border-transparent text-white font-bold\";\n\nexport function PortfolioChipFilter({\n options,\n value,\n onChange,\n showAll = true,\n className,\n}: PortfolioChipFilterProps) {\n const items = showAll ? [{ key: \"all\", label: \"All\" }, ...options] : options;\n\n return (\n <div\n className={cn(\n \"flex items-center gap-1.5 overflow-x-auto scrollbar-hide -mx-4 px-4 sm:-mx-6 sm:px-6 lg:-mx-8 lg:px-8\",\n className,\n )}\n >\n {items.map((item) =>\n item.href ? (\n <Link\n key={item.key}\n href={item.href}\n className={cn(CHIP_CLASS, item.href === value ? ACTIVE_CLASS : INACTIVE_CLASS)}\n >\n {item.label}\n </Link>\n ) : (\n <button\n key={item.key}\n type=\"button\"\n onClick={() => onChange(item.key)}\n className={cn(CHIP_CLASS, item.key === value ? ACTIVE_CLASS : INACTIVE_CLASS)}\n >\n {item.label}\n </button>\n ),\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA6CU;AA3CV,kBAAiB;AACjB,gBAAmB;AAmBnB,MAAM,aACJ;AACF,MAAM,iBAAiB;AACvB,MAAM,eAAe;AAEd,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AACF,GAA6B;AAC3B,QAAM,QAAQ,UAAU,CAAC,EAAE,KAAK,OAAO,OAAO,MAAM,GAAG,GAAG,OAAO,IAAI;AAErE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MAEC,gBAAM;AAAA,QAAI,CAAC,SACV,KAAK,OACH;AAAA,UAAC,YAAAA;AAAA,UAAA;AAAA,YAEC,MAAM,KAAK;AAAA,YACX,eAAW,cAAG,YAAY,KAAK,SAAS,QAAQ,eAAe,cAAc;AAAA,YAE5E,eAAK;AAAA;AAAA,UAJD,KAAK;AAAA,QAKZ,IAEA;AAAA,UAAC;AAAA;AAAA,YAEC,MAAK;AAAA,YACL,SAAS,MAAM,SAAS,KAAK,GAAG;AAAA,YAChC,eAAW,cAAG,YAAY,KAAK,QAAQ,QAAQ,eAAe,cAAc;AAAA,YAE3E,eAAK;AAAA;AAAA,UALD,KAAK;AAAA,QAMZ;AAAA,MAEJ;AAAA;AAAA,EACF;AAEJ;","names":["Link"]}
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { jsx } from "react/jsx-runtime";
3
- import Link from "next/link";
3
+ import Link from "./link.js";
4
4
  import { cn } from "../utils/cn.js";
5
5
  const CHIP_CLASS = "shrink-0 rounded-full px-3.5 py-1.5 text-sm whitespace-nowrap transition-colors border";
6
6
  const INACTIVE_CLASS = "bg-muted border-border/60 text-muted-foreground hover:text-foreground hover:border-border";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/portfolio-chip-filter.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { cn } from \"../utils/cn.js\";\n\nexport interface PortfolioChipFilterOption {\n key: string;\n label: string;\n\n href?: string;\n}\n\nexport interface PortfolioChipFilterProps {\n options: PortfolioChipFilterOption[];\n\n value: string;\n onChange: (key: string) => void;\n\n showAll?: boolean;\n className?: string;\n}\n\nconst CHIP_CLASS =\n \"shrink-0 rounded-full px-3.5 py-1.5 text-sm whitespace-nowrap transition-colors border\";\nconst INACTIVE_CLASS = \"bg-muted border-border/60 text-muted-foreground hover:text-foreground hover:border-border\";\nconst ACTIVE_CLASS = \"bg-gradient-to-r from-brand-purple to-brand-orange border-transparent text-white font-bold\";\n\nexport function PortfolioChipFilter({\n options,\n value,\n onChange,\n showAll = true,\n className,\n}: PortfolioChipFilterProps) {\n const items = showAll ? [{ key: \"all\", label: \"All\" }, ...options] : options;\n\n return (\n <div\n className={cn(\n \"flex items-center gap-1.5 overflow-x-auto scrollbar-hide -mx-4 px-4 sm:-mx-6 sm:px-6 lg:-mx-8 lg:px-8\",\n className,\n )}\n >\n {items.map((item) =>\n item.href ? (\n <Link\n key={item.key}\n href={item.href}\n className={cn(CHIP_CLASS, item.href === value ? ACTIVE_CLASS : INACTIVE_CLASS)}\n >\n {item.label}\n </Link>\n ) : (\n <button\n key={item.key}\n type=\"button\"\n onClick={() => onChange(item.key)}\n className={cn(CHIP_CLASS, item.key === value ? ACTIVE_CLASS : INACTIVE_CLASS)}\n >\n {item.label}\n </button>\n ),\n )}\n </div>\n );\n}\n"],"mappings":";AA6CU;AA3CV,OAAO,UAAU;AACjB,SAAS,UAAU;AAmBnB,MAAM,aACJ;AACF,MAAM,iBAAiB;AACvB,MAAM,eAAe;AAEd,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AACF,GAA6B;AAC3B,QAAM,QAAQ,UAAU,CAAC,EAAE,KAAK,OAAO,OAAO,MAAM,GAAG,GAAG,OAAO,IAAI;AAErE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MAEC,gBAAM;AAAA,QAAI,CAAC,SACV,KAAK,OACH;AAAA,UAAC;AAAA;AAAA,YAEC,MAAM,KAAK;AAAA,YACX,WAAW,GAAG,YAAY,KAAK,SAAS,QAAQ,eAAe,cAAc;AAAA,YAE5E,eAAK;AAAA;AAAA,UAJD,KAAK;AAAA,QAKZ,IAEA;AAAA,UAAC;AAAA;AAAA,YAEC,MAAK;AAAA,YACL,SAAS,MAAM,SAAS,KAAK,GAAG;AAAA,YAChC,WAAW,GAAG,YAAY,KAAK,QAAQ,QAAQ,eAAe,cAAc;AAAA,YAE3E,eAAK;AAAA;AAAA,UALD,KAAK;AAAA,QAMZ;AAAA,MAEJ;AAAA;AAAA,EACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/components/portfolio-chip-filter.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"./link.js\";\nimport { cn } from \"../utils/cn.js\";\n\nexport interface PortfolioChipFilterOption {\n key: string;\n label: string;\n\n href?: string;\n}\n\nexport interface PortfolioChipFilterProps {\n options: PortfolioChipFilterOption[];\n\n value: string;\n onChange: (key: string) => void;\n\n showAll?: boolean;\n className?: string;\n}\n\nconst CHIP_CLASS =\n \"shrink-0 rounded-full px-3.5 py-1.5 text-sm whitespace-nowrap transition-colors border\";\nconst INACTIVE_CLASS = \"bg-muted border-border/60 text-muted-foreground hover:text-foreground hover:border-border\";\nconst ACTIVE_CLASS = \"bg-gradient-to-r from-brand-purple to-brand-orange border-transparent text-white font-bold\";\n\nexport function PortfolioChipFilter({\n options,\n value,\n onChange,\n showAll = true,\n className,\n}: PortfolioChipFilterProps) {\n const items = showAll ? [{ key: \"all\", label: \"All\" }, ...options] : options;\n\n return (\n <div\n className={cn(\n \"flex items-center gap-1.5 overflow-x-auto scrollbar-hide -mx-4 px-4 sm:-mx-6 sm:px-6 lg:-mx-8 lg:px-8\",\n className,\n )}\n >\n {items.map((item) =>\n item.href ? (\n <Link\n key={item.key}\n href={item.href}\n className={cn(CHIP_CLASS, item.href === value ? ACTIVE_CLASS : INACTIVE_CLASS)}\n >\n {item.label}\n </Link>\n ) : (\n <button\n key={item.key}\n type=\"button\"\n onClick={() => onChange(item.key)}\n className={cn(CHIP_CLASS, item.key === value ? ACTIVE_CLASS : INACTIVE_CLASS)}\n >\n {item.label}\n </button>\n ),\n )}\n </div>\n );\n}\n"],"mappings":";AA6CU;AA3CV,OAAO,UAAU;AACjB,SAAS,UAAU;AAmBnB,MAAM,aACJ;AACF,MAAM,iBAAiB;AACvB,MAAM,eAAe;AAEd,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AACF,GAA6B;AAC3B,QAAM,QAAQ,UAAU,CAAC,EAAE,KAAK,OAAO,OAAO,MAAM,GAAG,GAAG,OAAO,IAAI;AAErE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MAEC,gBAAM;AAAA,QAAI,CAAC,SACV,KAAK,OACH;AAAA,UAAC;AAAA;AAAA,YAEC,MAAM,KAAK;AAAA,YACX,WAAW,GAAG,YAAY,KAAK,SAAS,QAAQ,eAAe,cAAc;AAAA,YAE5E,eAAK;AAAA;AAAA,UAJD,KAAK;AAAA,QAKZ,IAEA;AAAA,UAAC;AAAA;AAAA,YAEC,MAAK;AAAA,YACL,SAAS,MAAM,SAAS,KAAK,GAAG;AAAA,YAChC,WAAW,GAAG,YAAY,KAAK,QAAQ,QAAQ,eAAe,cAAc;AAAA,YAE3E,eAAK;AAAA;AAAA,UALD,KAAK;AAAA,QAMZ;AAAA,MAEJ;AAAA;AAAA,EACF;AAEJ;","names":[]}
@@ -33,7 +33,7 @@ __export(portfolio_header_exports, {
33
33
  });
34
34
  module.exports = __toCommonJS(portfolio_header_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_cn = require("../utils/cn.js");
38
38
  var import_address_display = require("./address-display.js");
39
39
  function PortfolioHeader({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/portfolio-header.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { cn } from \"../utils/cn.js\";\nimport { AddressDisplay } from \"./address-display.js\";\n\nexport interface PortfolioHeaderScore {\n\n levelName: string;\n totalXp: number;\n\n href?: string;\n}\n\nexport interface PortfolioHeaderProps {\n address: string;\n score?: PortfolioHeaderScore | null;\n className?: string;\n}\n\nexport function PortfolioHeader({\n address,\n score,\n className,\n}: PortfolioHeaderProps) {\n const scoreChip = score && (\n <div className=\"rounded-full bg-gradient-to-r from-brand-orange to-brand-maeve px-3.5 py-1.5 flex items-baseline gap-2 whitespace-nowrap text-white\">\n <span className=\"text-sm font-bold\">\n {score.levelName}\n </span>\n <span className=\"text-xs font-medium text-white/80 tabular-nums\">\n {score.totalXp.toLocaleString()} XP\n </span>\n </div>\n );\n\n return (\n <div className={cn(\"flex items-center justify-between gap-4\", className)}>\n <div className=\"min-w-0\">\n <p className=\"text-xs font-medium text-muted-foreground\">\n Portfolio\n </p>\n <AddressDisplay\n address={address}\n chars={6}\n className=\"text-2xl sm:text-3xl font-black tracking-tight text-foreground\"\n />\n </div>\n {score?.href ? (\n <Link href={score.href} className=\"shrink-0 active:opacity-80\">\n {scoreChip}\n </Link>\n ) : (\n <div className=\"shrink-0\">{scoreChip}</div>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BM;AAzBN,kBAAiB;AACjB,gBAAmB;AACnB,6BAA+B;AAgBxB,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AACF,GAAyB;AACvB,QAAM,YAAY,SAChB,6CAAC,SAAI,WAAU,uIACb;AAAA,gDAAC,UAAK,WAAU,qBACb,gBAAM,WACT;AAAA,IACA,6CAAC,UAAK,WAAU,kDACb;AAAA,YAAM,QAAQ,eAAe;AAAA,MAAE;AAAA,OAClC;AAAA,KACF;AAGF,SACE,6CAAC,SAAI,eAAW,cAAG,2CAA2C,SAAS,GACrE;AAAA,iDAAC,SAAI,WAAU,WACb;AAAA,kDAAC,OAAE,WAAU,6CAA4C,uBAEzD;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,OAAO;AAAA,UACP,WAAU;AAAA;AAAA,MACZ;AAAA,OACF;AAAA,IACC,OAAO,OACN,4CAAC,YAAAA,SAAA,EAAK,MAAM,MAAM,MAAM,WAAU,8BAC/B,qBACH,IAEA,4CAAC,SAAI,WAAU,YAAY,qBAAU;AAAA,KAEzC;AAEJ;","names":["Link"]}
1
+ {"version":3,"sources":["../../src/components/portfolio-header.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"./link.js\";\nimport { cn } from \"../utils/cn.js\";\nimport { AddressDisplay } from \"./address-display.js\";\n\nexport interface PortfolioHeaderScore {\n\n levelName: string;\n totalXp: number;\n\n href?: string;\n}\n\nexport interface PortfolioHeaderProps {\n address: string;\n score?: PortfolioHeaderScore | null;\n className?: string;\n}\n\nexport function PortfolioHeader({\n address,\n score,\n className,\n}: PortfolioHeaderProps) {\n const scoreChip = score && (\n <div className=\"rounded-full bg-gradient-to-r from-brand-orange to-brand-maeve px-3.5 py-1.5 flex items-baseline gap-2 whitespace-nowrap text-white\">\n <span className=\"text-sm font-bold\">\n {score.levelName}\n </span>\n <span className=\"text-xs font-medium text-white/80 tabular-nums\">\n {score.totalXp.toLocaleString()} XP\n </span>\n </div>\n );\n\n return (\n <div className={cn(\"flex items-center justify-between gap-4\", className)}>\n <div className=\"min-w-0\">\n <p className=\"text-xs font-medium text-muted-foreground\">\n Portfolio\n </p>\n <AddressDisplay\n address={address}\n chars={6}\n className=\"text-2xl sm:text-3xl font-black tracking-tight text-foreground\"\n />\n </div>\n {score?.href ? (\n <Link href={score.href} className=\"shrink-0 active:opacity-80\">\n {scoreChip}\n </Link>\n ) : (\n <div className=\"shrink-0\">{scoreChip}</div>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BM;AAzBN,kBAAiB;AACjB,gBAAmB;AACnB,6BAA+B;AAgBxB,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AACF,GAAyB;AACvB,QAAM,YAAY,SAChB,6CAAC,SAAI,WAAU,uIACb;AAAA,gDAAC,UAAK,WAAU,qBACb,gBAAM,WACT;AAAA,IACA,6CAAC,UAAK,WAAU,kDACb;AAAA,YAAM,QAAQ,eAAe;AAAA,MAAE;AAAA,OAClC;AAAA,KACF;AAGF,SACE,6CAAC,SAAI,eAAW,cAAG,2CAA2C,SAAS,GACrE;AAAA,iDAAC,SAAI,WAAU,WACb;AAAA,kDAAC,OAAE,WAAU,6CAA4C,uBAEzD;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,OAAO;AAAA,UACP,WAAU;AAAA;AAAA,MACZ;AAAA,OACF;AAAA,IACC,OAAO,OACN,4CAAC,YAAAA,SAAA,EAAK,MAAM,MAAM,MAAM,WAAU,8BAC/B,qBACH,IAEA,4CAAC,SAAI,WAAU,YAAY,qBAAU;AAAA,KAEzC;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 { cn } from "../utils/cn.js";
5
5
  import { AddressDisplay } from "./address-display.js";
6
6
  function PortfolioHeader({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/portfolio-header.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { cn } from \"../utils/cn.js\";\nimport { AddressDisplay } from \"./address-display.js\";\n\nexport interface PortfolioHeaderScore {\n\n levelName: string;\n totalXp: number;\n\n href?: string;\n}\n\nexport interface PortfolioHeaderProps {\n address: string;\n score?: PortfolioHeaderScore | null;\n className?: string;\n}\n\nexport function PortfolioHeader({\n address,\n score,\n className,\n}: PortfolioHeaderProps) {\n const scoreChip = score && (\n <div className=\"rounded-full bg-gradient-to-r from-brand-orange to-brand-maeve px-3.5 py-1.5 flex items-baseline gap-2 whitespace-nowrap text-white\">\n <span className=\"text-sm font-bold\">\n {score.levelName}\n </span>\n <span className=\"text-xs font-medium text-white/80 tabular-nums\">\n {score.totalXp.toLocaleString()} XP\n </span>\n </div>\n );\n\n return (\n <div className={cn(\"flex items-center justify-between gap-4\", className)}>\n <div className=\"min-w-0\">\n <p className=\"text-xs font-medium text-muted-foreground\">\n Portfolio\n </p>\n <AddressDisplay\n address={address}\n chars={6}\n className=\"text-2xl sm:text-3xl font-black tracking-tight text-foreground\"\n />\n </div>\n {score?.href ? (\n <Link href={score.href} className=\"shrink-0 active:opacity-80\">\n {scoreChip}\n </Link>\n ) : (\n <div className=\"shrink-0\">{scoreChip}</div>\n )}\n </div>\n );\n}\n"],"mappings":";AA2BM,cAGA,YAHA;AAzBN,OAAO,UAAU;AACjB,SAAS,UAAU;AACnB,SAAS,sBAAsB;AAgBxB,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AACF,GAAyB;AACvB,QAAM,YAAY,SAChB,qBAAC,SAAI,WAAU,uIACb;AAAA,wBAAC,UAAK,WAAU,qBACb,gBAAM,WACT;AAAA,IACA,qBAAC,UAAK,WAAU,kDACb;AAAA,YAAM,QAAQ,eAAe;AAAA,MAAE;AAAA,OAClC;AAAA,KACF;AAGF,SACE,qBAAC,SAAI,WAAW,GAAG,2CAA2C,SAAS,GACrE;AAAA,yBAAC,SAAI,WAAU,WACb;AAAA,0BAAC,OAAE,WAAU,6CAA4C,uBAEzD;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,OAAO;AAAA,UACP,WAAU;AAAA;AAAA,MACZ;AAAA,OACF;AAAA,IACC,OAAO,OACN,oBAAC,QAAK,MAAM,MAAM,MAAM,WAAU,8BAC/B,qBACH,IAEA,oBAAC,SAAI,WAAU,YAAY,qBAAU;AAAA,KAEzC;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/components/portfolio-header.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"./link.js\";\nimport { cn } from \"../utils/cn.js\";\nimport { AddressDisplay } from \"./address-display.js\";\n\nexport interface PortfolioHeaderScore {\n\n levelName: string;\n totalXp: number;\n\n href?: string;\n}\n\nexport interface PortfolioHeaderProps {\n address: string;\n score?: PortfolioHeaderScore | null;\n className?: string;\n}\n\nexport function PortfolioHeader({\n address,\n score,\n className,\n}: PortfolioHeaderProps) {\n const scoreChip = score && (\n <div className=\"rounded-full bg-gradient-to-r from-brand-orange to-brand-maeve px-3.5 py-1.5 flex items-baseline gap-2 whitespace-nowrap text-white\">\n <span className=\"text-sm font-bold\">\n {score.levelName}\n </span>\n <span className=\"text-xs font-medium text-white/80 tabular-nums\">\n {score.totalXp.toLocaleString()} XP\n </span>\n </div>\n );\n\n return (\n <div className={cn(\"flex items-center justify-between gap-4\", className)}>\n <div className=\"min-w-0\">\n <p className=\"text-xs font-medium text-muted-foreground\">\n Portfolio\n </p>\n <AddressDisplay\n address={address}\n chars={6}\n className=\"text-2xl sm:text-3xl font-black tracking-tight text-foreground\"\n />\n </div>\n {score?.href ? (\n <Link href={score.href} className=\"shrink-0 active:opacity-80\">\n {scoreChip}\n </Link>\n ) : (\n <div className=\"shrink-0\">{scoreChip}</div>\n )}\n </div>\n );\n}\n"],"mappings":";AA2BM,cAGA,YAHA;AAzBN,OAAO,UAAU;AACjB,SAAS,UAAU;AACnB,SAAS,sBAAsB;AAgBxB,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AACF,GAAyB;AACvB,QAAM,YAAY,SAChB,qBAAC,SAAI,WAAU,uIACb;AAAA,wBAAC,UAAK,WAAU,qBACb,gBAAM,WACT;AAAA,IACA,qBAAC,UAAK,WAAU,kDACb;AAAA,YAAM,QAAQ,eAAe;AAAA,MAAE;AAAA,OAClC;AAAA,KACF;AAGF,SACE,qBAAC,SAAI,WAAW,GAAG,2CAA2C,SAAS,GACrE;AAAA,yBAAC,SAAI,WAAU,WACb;AAAA,0BAAC,OAAE,WAAU,6CAA4C,uBAEzD;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,OAAO;AAAA,UACP,WAAU;AAAA;AAAA,MACZ;AAAA,OACF;AAAA,IACC,OAAO,OACN,oBAAC,QAAK,MAAM,MAAM,MAAM,WAAU,8BAC/B,qBACH,IAEA,oBAAC,SAAI,WAAU,YAAY,qBAAU;AAAA,KAEzC;AAEJ;","names":[]}
@@ -33,7 +33,7 @@ __export(portfolio_section_exports, {
33
33
  });
34
34
  module.exports = __toCommonJS(portfolio_section_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_lucide_react = require("lucide-react");
38
38
  var import_cn = require("../utils/cn.js");
39
39
  const BORDER_BY_COLOR = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/portfolio-section.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { ArrowRight } from \"lucide-react\";\nimport { cn } from \"../utils/cn.js\";\n\nexport type PortfolioSectionColor =\n | \"blue\"\n | \"purple\"\n | \"rose\"\n | \"orange\"\n | \"maeve\"\n | \"navy\";\n\nconst BORDER_BY_COLOR: Record<PortfolioSectionColor, string> = {\n blue: \"border-brand-blue/40\",\n purple: \"border-brand-purple/40\",\n rose: \"border-brand-rose/40\",\n orange: \"border-brand-orange/40\",\n maeve: \"border-brand-maeve/40\",\n navy: \"border-brand-navy/40\",\n};\n\nexport interface PortfolioSectionProps {\n title: string;\n href: string;\n\n /** Which brand color accents this section's hairline border. */\n color?: PortfolioSectionColor;\n\n /** \"default\" sits in the grid alongside its siblings; \"wide\" spans the\n * full row instead — for list-like content (e.g. Activity) that reads\n * better edge-to-edge than column-width. */\n size?: \"default\" | \"wide\";\n children: React.ReactNode;\n className?: string;\n}\n\nexport function PortfolioSection({\n title,\n href,\n color = \"purple\",\n size = \"default\",\n children,\n className,\n}: PortfolioSectionProps) {\n return (\n <section\n className={cn(\n \"rounded-2xl border min-w-0\",\n BORDER_BY_COLOR[color],\n size === \"wide\" && \"sm:col-span-2 lg:col-span-3\",\n className,\n )}\n >\n <div className=\"flex items-center justify-between gap-3 px-5 pt-5 pb-3\">\n <h2 className=\"text-sm font-black text-foreground tracking-tight\">\n {title}\n </h2>\n <Link\n href={href}\n className=\"inline-flex items-center gap-1 text-xs font-medium text-muted-foreground hover:text-foreground transition-colors\"\n >\n See all\n <ArrowRight className=\"h-3 w-3\" />\n </Link>\n </div>\n <div className=\"px-5 pb-5\">{children}</div>\n </section>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAwDQ;AAtDR,kBAAiB;AACjB,0BAA2B;AAC3B,gBAAmB;AAUnB,MAAM,kBAAyD;AAAA,EAC7D,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AACR;AAiBO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,OAAO;AAAA,EACP;AAAA,EACA;AACF,GAA0B;AACxB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW;AAAA,QACT;AAAA,QACA,gBAAgB,KAAK;AAAA,QACrB,SAAS,UAAU;AAAA,QACnB;AAAA,MACF;AAAA,MAEA;AAAA,qDAAC,SAAI,WAAU,0DACb;AAAA,sDAAC,QAAG,WAAU,qDACX,iBACH;AAAA,UACA;AAAA,YAAC,YAAAA;AAAA,YAAA;AAAA,cACC;AAAA,cACA,WAAU;AAAA,cACX;AAAA;AAAA,gBAEC,4CAAC,kCAAW,WAAU,WAAU;AAAA;AAAA;AAAA,UAClC;AAAA,WACF;AAAA,QACA,4CAAC,SAAI,WAAU,aAAa,UAAS;AAAA;AAAA;AAAA,EACvC;AAEJ;","names":["Link"]}
1
+ {"version":3,"sources":["../../src/components/portfolio-section.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"./link.js\";\nimport { ArrowRight } from \"lucide-react\";\nimport { cn } from \"../utils/cn.js\";\n\nexport type PortfolioSectionColor =\n | \"blue\"\n | \"purple\"\n | \"rose\"\n | \"orange\"\n | \"maeve\"\n | \"navy\";\n\nconst BORDER_BY_COLOR: Record<PortfolioSectionColor, string> = {\n blue: \"border-brand-blue/40\",\n purple: \"border-brand-purple/40\",\n rose: \"border-brand-rose/40\",\n orange: \"border-brand-orange/40\",\n maeve: \"border-brand-maeve/40\",\n navy: \"border-brand-navy/40\",\n};\n\nexport interface PortfolioSectionProps {\n title: string;\n href: string;\n\n /** Which brand color accents this section's hairline border. */\n color?: PortfolioSectionColor;\n\n /** \"default\" sits in the grid alongside its siblings; \"wide\" spans the\n * full row instead — for list-like content (e.g. Activity) that reads\n * better edge-to-edge than column-width. */\n size?: \"default\" | \"wide\";\n children: React.ReactNode;\n className?: string;\n}\n\nexport function PortfolioSection({\n title,\n href,\n color = \"purple\",\n size = \"default\",\n children,\n className,\n}: PortfolioSectionProps) {\n return (\n <section\n className={cn(\n \"rounded-2xl border min-w-0\",\n BORDER_BY_COLOR[color],\n size === \"wide\" && \"sm:col-span-2 lg:col-span-3\",\n className,\n )}\n >\n <div className=\"flex items-center justify-between gap-3 px-5 pt-5 pb-3\">\n <h2 className=\"text-sm font-black text-foreground tracking-tight\">\n {title}\n </h2>\n <Link\n href={href}\n className=\"inline-flex items-center gap-1 text-xs font-medium text-muted-foreground hover:text-foreground transition-colors\"\n >\n See all\n <ArrowRight className=\"h-3 w-3\" />\n </Link>\n </div>\n <div className=\"px-5 pb-5\">{children}</div>\n </section>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAwDQ;AAtDR,kBAAiB;AACjB,0BAA2B;AAC3B,gBAAmB;AAUnB,MAAM,kBAAyD;AAAA,EAC7D,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AACR;AAiBO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,OAAO;AAAA,EACP;AAAA,EACA;AACF,GAA0B;AACxB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW;AAAA,QACT;AAAA,QACA,gBAAgB,KAAK;AAAA,QACrB,SAAS,UAAU;AAAA,QACnB;AAAA,MACF;AAAA,MAEA;AAAA,qDAAC,SAAI,WAAU,0DACb;AAAA,sDAAC,QAAG,WAAU,qDACX,iBACH;AAAA,UACA;AAAA,YAAC,YAAAA;AAAA,YAAA;AAAA,cACC;AAAA,cACA,WAAU;AAAA,cACX;AAAA;AAAA,gBAEC,4CAAC,kCAAW,WAAU,WAAU;AAAA;AAAA;AAAA,UAClC;AAAA,WACF;AAAA,QACA,4CAAC,SAAI,WAAU,aAAa,UAAS;AAAA;AAAA;AAAA,EACvC;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 { ArrowRight } from "lucide-react";
5
5
  import { cn } from "../utils/cn.js";
6
6
  const BORDER_BY_COLOR = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/portfolio-section.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { ArrowRight } from \"lucide-react\";\nimport { cn } from \"../utils/cn.js\";\n\nexport type PortfolioSectionColor =\n | \"blue\"\n | \"purple\"\n | \"rose\"\n | \"orange\"\n | \"maeve\"\n | \"navy\";\n\nconst BORDER_BY_COLOR: Record<PortfolioSectionColor, string> = {\n blue: \"border-brand-blue/40\",\n purple: \"border-brand-purple/40\",\n rose: \"border-brand-rose/40\",\n orange: \"border-brand-orange/40\",\n maeve: \"border-brand-maeve/40\",\n navy: \"border-brand-navy/40\",\n};\n\nexport interface PortfolioSectionProps {\n title: string;\n href: string;\n\n /** Which brand color accents this section's hairline border. */\n color?: PortfolioSectionColor;\n\n /** \"default\" sits in the grid alongside its siblings; \"wide\" spans the\n * full row instead — for list-like content (e.g. Activity) that reads\n * better edge-to-edge than column-width. */\n size?: \"default\" | \"wide\";\n children: React.ReactNode;\n className?: string;\n}\n\nexport function PortfolioSection({\n title,\n href,\n color = \"purple\",\n size = \"default\",\n children,\n className,\n}: PortfolioSectionProps) {\n return (\n <section\n className={cn(\n \"rounded-2xl border min-w-0\",\n BORDER_BY_COLOR[color],\n size === \"wide\" && \"sm:col-span-2 lg:col-span-3\",\n className,\n )}\n >\n <div className=\"flex items-center justify-between gap-3 px-5 pt-5 pb-3\">\n <h2 className=\"text-sm font-black text-foreground tracking-tight\">\n {title}\n </h2>\n <Link\n href={href}\n className=\"inline-flex items-center gap-1 text-xs font-medium text-muted-foreground hover:text-foreground transition-colors\"\n >\n See all\n <ArrowRight className=\"h-3 w-3\" />\n </Link>\n </div>\n <div className=\"px-5 pb-5\">{children}</div>\n </section>\n );\n}\n"],"mappings":";AAwDQ,cAGA,YAHA;AAtDR,OAAO,UAAU;AACjB,SAAS,kBAAkB;AAC3B,SAAS,UAAU;AAUnB,MAAM,kBAAyD;AAAA,EAC7D,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AACR;AAiBO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,OAAO;AAAA,EACP;AAAA,EACA;AACF,GAA0B;AACxB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,gBAAgB,KAAK;AAAA,QACrB,SAAS,UAAU;AAAA,QACnB;AAAA,MACF;AAAA,MAEA;AAAA,6BAAC,SAAI,WAAU,0DACb;AAAA,8BAAC,QAAG,WAAU,qDACX,iBACH;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA,WAAU;AAAA,cACX;AAAA;AAAA,gBAEC,oBAAC,cAAW,WAAU,WAAU;AAAA;AAAA;AAAA,UAClC;AAAA,WACF;AAAA,QACA,oBAAC,SAAI,WAAU,aAAa,UAAS;AAAA;AAAA;AAAA,EACvC;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/components/portfolio-section.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"./link.js\";\nimport { ArrowRight } from \"lucide-react\";\nimport { cn } from \"../utils/cn.js\";\n\nexport type PortfolioSectionColor =\n | \"blue\"\n | \"purple\"\n | \"rose\"\n | \"orange\"\n | \"maeve\"\n | \"navy\";\n\nconst BORDER_BY_COLOR: Record<PortfolioSectionColor, string> = {\n blue: \"border-brand-blue/40\",\n purple: \"border-brand-purple/40\",\n rose: \"border-brand-rose/40\",\n orange: \"border-brand-orange/40\",\n maeve: \"border-brand-maeve/40\",\n navy: \"border-brand-navy/40\",\n};\n\nexport interface PortfolioSectionProps {\n title: string;\n href: string;\n\n /** Which brand color accents this section's hairline border. */\n color?: PortfolioSectionColor;\n\n /** \"default\" sits in the grid alongside its siblings; \"wide\" spans the\n * full row instead — for list-like content (e.g. Activity) that reads\n * better edge-to-edge than column-width. */\n size?: \"default\" | \"wide\";\n children: React.ReactNode;\n className?: string;\n}\n\nexport function PortfolioSection({\n title,\n href,\n color = \"purple\",\n size = \"default\",\n children,\n className,\n}: PortfolioSectionProps) {\n return (\n <section\n className={cn(\n \"rounded-2xl border min-w-0\",\n BORDER_BY_COLOR[color],\n size === \"wide\" && \"sm:col-span-2 lg:col-span-3\",\n className,\n )}\n >\n <div className=\"flex items-center justify-between gap-3 px-5 pt-5 pb-3\">\n <h2 className=\"text-sm font-black text-foreground tracking-tight\">\n {title}\n </h2>\n <Link\n href={href}\n className=\"inline-flex items-center gap-1 text-xs font-medium text-muted-foreground hover:text-foreground transition-colors\"\n >\n See all\n <ArrowRight className=\"h-3 w-3\" />\n </Link>\n </div>\n <div className=\"px-5 pb-5\">{children}</div>\n </section>\n );\n}\n"],"mappings":";AAwDQ,cAGA,YAHA;AAtDR,OAAO,UAAU;AACjB,SAAS,kBAAkB;AAC3B,SAAS,UAAU;AAUnB,MAAM,kBAAyD;AAAA,EAC7D,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AACR;AAiBO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,OAAO;AAAA,EACP;AAAA,EACA;AACF,GAA0B;AACxB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,gBAAgB,KAAK;AAAA,QACrB,SAAS,UAAU;AAAA,QACnB;AAAA,MACF;AAAA,MAEA;AAAA,6BAAC,SAAI,WAAU,0DACb;AAAA,8BAAC,QAAG,WAAU,qDACX,iBACH;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA,WAAU;AAAA,cACX;AAAA;AAAA,gBAEC,oBAAC,cAAW,WAAU,WAAU;AAAA;AAAA;AAAA,UAClC;AAAA,WACF;AAAA,QACA,oBAAC,SAAI,WAAU,aAAa,UAAS;AAAA;AAAA;AAAA,EACvC;AAEJ;","names":[]}
@@ -33,7 +33,7 @@ __export(remixes_tab_exports, {
33
33
  });
34
34
  module.exports = __toCommonJS(remixes_tab_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_sdk = require("@medialane/sdk");
38
38
  var import_lucide_react = require("lucide-react");
39
39
  var import_use_remix_offers = require("../utils/use-remix-offers.js");
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/remixes-tab.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { assetHref } from \"@medialane/sdk\";\nimport { GitBranch } from \"lucide-react\";\nimport { useTokenRemixes } from \"../utils/use-remix-offers.js\";\nimport { Skeleton } from \"./skeleton.js\";\nimport type { ApiFetchConfig } from \"../utils/api-fetch.js\";\n\nexport interface RemixesTabProps {\n apiConfig: ApiFetchConfig;\n contractAddress: string;\n tokenId: string;\n}\n\nexport function RemixesTab({ apiConfig, contractAddress, tokenId }: RemixesTabProps) {\n const { remixes, total, isLoading } = useTokenRemixes(apiConfig, contractAddress, tokenId);\n\n if (isLoading) {\n return (\n <div className=\"grid grid-cols-2 sm:grid-cols-3 gap-3\">\n {Array.from({ length: 3 }).map((_, i) => (\n <Skeleton key={i} className=\"aspect-square rounded-xl\" />\n ))}\n </div>\n );\n }\n\n if (remixes.length === 0) {\n return (\n <div className=\"flex flex-col items-center gap-3 py-12 text-center\">\n <div className=\"h-12 w-12 rounded-full bg-primary/10 flex items-center justify-center\">\n <GitBranch className=\"h-5 w-5 text-primary\" />\n </div>\n <p className=\"text-sm font-medium\">No remixes yet</p>\n <p className=\"text-xs text-muted-foreground\">Remix this asset to create the first derivative work.</p>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-3\">\n <p className=\"text-xs text-muted-foreground\">{total} remix{total !== 1 ? \"es\" : \"\"} of this asset</p>\n <div className=\"grid grid-cols-2 sm:grid-cols-3 gap-3\">\n {remixes.map((remix) =>\n remix.remixContract && remix.remixTokenId ? (\n <Link\n key={remix.id}\n href={assetHref(\"STARKNET\", remix.remixContract, remix.remixTokenId)}\n className=\"group relative block\"\n >\n <div className=\"card-base p-3 space-y-1 hover:border-primary/40 transition-colors\">\n <div className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n <GitBranch className=\"h-3 w-3 text-primary\" />\n <span className=\"text-primary font-medium\">Remix</span>\n </div>\n <p className=\"text-xs tabular-nums truncate\">#{remix.remixTokenId}</p>\n <p className=\"text-[10px] text-muted-foreground\">{remix.licenseType}</p>\n <div className=\"flex gap-1 flex-wrap\">\n {remix.commercial && (\n <span className=\"text-[9px] px-1.5 py-0.5 rounded-full bg-brand-blue/10 text-brand-blue border border-brand-blue/20\">Commercial</span>\n )}\n {remix.derivatives && (\n <span className=\"text-[9px] px-1.5 py-0.5 rounded-full bg-primary/10 text-primary border border-primary/20\">Derivatives</span>\n )}\n </div>\n </div>\n </Link>\n ) : null\n )}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAsBU;AApBV,kBAAiB;AACjB,iBAA0B;AAC1B,0BAA0B;AAC1B,8BAAgC;AAChC,sBAAyB;AASlB,SAAS,WAAW,EAAE,WAAW,iBAAiB,QAAQ,GAAoB;AACnF,QAAM,EAAE,SAAS,OAAO,UAAU,QAAI,yCAAgB,WAAW,iBAAiB,OAAO;AAEzF,MAAI,WAAW;AACb,WACE,4CAAC,SAAI,WAAU,yCACZ,gBAAM,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,MACjC,4CAAC,4BAAiB,WAAU,8BAAb,CAAwC,CACxD,GACH;AAAA,EAEJ;AAEA,MAAI,QAAQ,WAAW,GAAG;AACxB,WACE,6CAAC,SAAI,WAAU,sDACb;AAAA,kDAAC,SAAI,WAAU,yEACb,sDAAC,iCAAU,WAAU,wBAAuB,GAC9C;AAAA,MACA,4CAAC,OAAE,WAAU,uBAAsB,4BAAc;AAAA,MACjD,4CAAC,OAAE,WAAU,iCAAgC,mEAAqD;AAAA,OACpG;AAAA,EAEJ;AAEA,SACE,6CAAC,SAAI,WAAU,aACb;AAAA,iDAAC,OAAE,WAAU,iCAAiC;AAAA;AAAA,MAAM;AAAA,MAAO,UAAU,IAAI,OAAO;AAAA,MAAG;AAAA,OAAc;AAAA,IACjG,4CAAC,SAAI,WAAU,yCACZ,kBAAQ;AAAA,MAAI,CAAC,UACZ,MAAM,iBAAiB,MAAM,eAC3B;AAAA,QAAC,YAAAA;AAAA,QAAA;AAAA,UAEC,UAAM,sBAAU,YAAY,MAAM,eAAe,MAAM,YAAY;AAAA,UACnE,WAAU;AAAA,UAEV,uDAAC,SAAI,WAAU,qEACb;AAAA,yDAAC,SAAI,WAAU,2DACb;AAAA,0DAAC,iCAAU,WAAU,wBAAuB;AAAA,cAC5C,4CAAC,UAAK,WAAU,4BAA2B,mBAAK;AAAA,eAClD;AAAA,YACA,6CAAC,OAAE,WAAU,iCAAgC;AAAA;AAAA,cAAE,MAAM;AAAA,eAAa;AAAA,YAClE,4CAAC,OAAE,WAAU,qCAAqC,gBAAM,aAAY;AAAA,YACpE,6CAAC,SAAI,WAAU,wBACZ;AAAA,oBAAM,cACL,4CAAC,UAAK,WAAU,sGAAqG,wBAAU;AAAA,cAEhI,MAAM,eACL,4CAAC,UAAK,WAAU,6FAA4F,yBAAW;AAAA,eAE3H;AAAA,aACF;AAAA;AAAA,QAnBK,MAAM;AAAA,MAoBb,IACE;AAAA,IACN,GACF;AAAA,KACF;AAEJ;","names":["Link"]}
1
+ {"version":3,"sources":["../../src/components/remixes-tab.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"./link.js\";\nimport { assetHref } from \"@medialane/sdk\";\nimport { GitBranch } from \"lucide-react\";\nimport { useTokenRemixes } from \"../utils/use-remix-offers.js\";\nimport { Skeleton } from \"./skeleton.js\";\nimport type { ApiFetchConfig } from \"../utils/api-fetch.js\";\n\nexport interface RemixesTabProps {\n apiConfig: ApiFetchConfig;\n contractAddress: string;\n tokenId: string;\n}\n\nexport function RemixesTab({ apiConfig, contractAddress, tokenId }: RemixesTabProps) {\n const { remixes, total, isLoading } = useTokenRemixes(apiConfig, contractAddress, tokenId);\n\n if (isLoading) {\n return (\n <div className=\"grid grid-cols-2 sm:grid-cols-3 gap-3\">\n {Array.from({ length: 3 }).map((_, i) => (\n <Skeleton key={i} className=\"aspect-square rounded-xl\" />\n ))}\n </div>\n );\n }\n\n if (remixes.length === 0) {\n return (\n <div className=\"flex flex-col items-center gap-3 py-12 text-center\">\n <div className=\"h-12 w-12 rounded-full bg-primary/10 flex items-center justify-center\">\n <GitBranch className=\"h-5 w-5 text-primary\" />\n </div>\n <p className=\"text-sm font-medium\">No remixes yet</p>\n <p className=\"text-xs text-muted-foreground\">Remix this asset to create the first derivative work.</p>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-3\">\n <p className=\"text-xs text-muted-foreground\">{total} remix{total !== 1 ? \"es\" : \"\"} of this asset</p>\n <div className=\"grid grid-cols-2 sm:grid-cols-3 gap-3\">\n {remixes.map((remix) =>\n remix.remixContract && remix.remixTokenId ? (\n <Link\n key={remix.id}\n href={assetHref(\"STARKNET\", remix.remixContract, remix.remixTokenId)}\n className=\"group relative block\"\n >\n <div className=\"card-base p-3 space-y-1 hover:border-primary/40 transition-colors\">\n <div className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n <GitBranch className=\"h-3 w-3 text-primary\" />\n <span className=\"text-primary font-medium\">Remix</span>\n </div>\n <p className=\"text-xs tabular-nums truncate\">#{remix.remixTokenId}</p>\n <p className=\"text-[10px] text-muted-foreground\">{remix.licenseType}</p>\n <div className=\"flex gap-1 flex-wrap\">\n {remix.commercial && (\n <span className=\"text-[9px] px-1.5 py-0.5 rounded-full bg-brand-blue/10 text-brand-blue border border-brand-blue/20\">Commercial</span>\n )}\n {remix.derivatives && (\n <span className=\"text-[9px] px-1.5 py-0.5 rounded-full bg-primary/10 text-primary border border-primary/20\">Derivatives</span>\n )}\n </div>\n </div>\n </Link>\n ) : null\n )}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAsBU;AApBV,kBAAiB;AACjB,iBAA0B;AAC1B,0BAA0B;AAC1B,8BAAgC;AAChC,sBAAyB;AASlB,SAAS,WAAW,EAAE,WAAW,iBAAiB,QAAQ,GAAoB;AACnF,QAAM,EAAE,SAAS,OAAO,UAAU,QAAI,yCAAgB,WAAW,iBAAiB,OAAO;AAEzF,MAAI,WAAW;AACb,WACE,4CAAC,SAAI,WAAU,yCACZ,gBAAM,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,MACjC,4CAAC,4BAAiB,WAAU,8BAAb,CAAwC,CACxD,GACH;AAAA,EAEJ;AAEA,MAAI,QAAQ,WAAW,GAAG;AACxB,WACE,6CAAC,SAAI,WAAU,sDACb;AAAA,kDAAC,SAAI,WAAU,yEACb,sDAAC,iCAAU,WAAU,wBAAuB,GAC9C;AAAA,MACA,4CAAC,OAAE,WAAU,uBAAsB,4BAAc;AAAA,MACjD,4CAAC,OAAE,WAAU,iCAAgC,mEAAqD;AAAA,OACpG;AAAA,EAEJ;AAEA,SACE,6CAAC,SAAI,WAAU,aACb;AAAA,iDAAC,OAAE,WAAU,iCAAiC;AAAA;AAAA,MAAM;AAAA,MAAO,UAAU,IAAI,OAAO;AAAA,MAAG;AAAA,OAAc;AAAA,IACjG,4CAAC,SAAI,WAAU,yCACZ,kBAAQ;AAAA,MAAI,CAAC,UACZ,MAAM,iBAAiB,MAAM,eAC3B;AAAA,QAAC,YAAAA;AAAA,QAAA;AAAA,UAEC,UAAM,sBAAU,YAAY,MAAM,eAAe,MAAM,YAAY;AAAA,UACnE,WAAU;AAAA,UAEV,uDAAC,SAAI,WAAU,qEACb;AAAA,yDAAC,SAAI,WAAU,2DACb;AAAA,0DAAC,iCAAU,WAAU,wBAAuB;AAAA,cAC5C,4CAAC,UAAK,WAAU,4BAA2B,mBAAK;AAAA,eAClD;AAAA,YACA,6CAAC,OAAE,WAAU,iCAAgC;AAAA;AAAA,cAAE,MAAM;AAAA,eAAa;AAAA,YAClE,4CAAC,OAAE,WAAU,qCAAqC,gBAAM,aAAY;AAAA,YACpE,6CAAC,SAAI,WAAU,wBACZ;AAAA,oBAAM,cACL,4CAAC,UAAK,WAAU,sGAAqG,wBAAU;AAAA,cAEhI,MAAM,eACL,4CAAC,UAAK,WAAU,6FAA4F,yBAAW;AAAA,eAE3H;AAAA,aACF;AAAA;AAAA,QAnBK,MAAM;AAAA,MAoBb,IACE;AAAA,IACN,GACF;AAAA,KACF;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 { assetHref } from "@medialane/sdk";
5
5
  import { GitBranch } from "lucide-react";
6
6
  import { useTokenRemixes } from "../utils/use-remix-offers.js";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/remixes-tab.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { assetHref } from \"@medialane/sdk\";\nimport { GitBranch } from \"lucide-react\";\nimport { useTokenRemixes } from \"../utils/use-remix-offers.js\";\nimport { Skeleton } from \"./skeleton.js\";\nimport type { ApiFetchConfig } from \"../utils/api-fetch.js\";\n\nexport interface RemixesTabProps {\n apiConfig: ApiFetchConfig;\n contractAddress: string;\n tokenId: string;\n}\n\nexport function RemixesTab({ apiConfig, contractAddress, tokenId }: RemixesTabProps) {\n const { remixes, total, isLoading } = useTokenRemixes(apiConfig, contractAddress, tokenId);\n\n if (isLoading) {\n return (\n <div className=\"grid grid-cols-2 sm:grid-cols-3 gap-3\">\n {Array.from({ length: 3 }).map((_, i) => (\n <Skeleton key={i} className=\"aspect-square rounded-xl\" />\n ))}\n </div>\n );\n }\n\n if (remixes.length === 0) {\n return (\n <div className=\"flex flex-col items-center gap-3 py-12 text-center\">\n <div className=\"h-12 w-12 rounded-full bg-primary/10 flex items-center justify-center\">\n <GitBranch className=\"h-5 w-5 text-primary\" />\n </div>\n <p className=\"text-sm font-medium\">No remixes yet</p>\n <p className=\"text-xs text-muted-foreground\">Remix this asset to create the first derivative work.</p>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-3\">\n <p className=\"text-xs text-muted-foreground\">{total} remix{total !== 1 ? \"es\" : \"\"} of this asset</p>\n <div className=\"grid grid-cols-2 sm:grid-cols-3 gap-3\">\n {remixes.map((remix) =>\n remix.remixContract && remix.remixTokenId ? (\n <Link\n key={remix.id}\n href={assetHref(\"STARKNET\", remix.remixContract, remix.remixTokenId)}\n className=\"group relative block\"\n >\n <div className=\"card-base p-3 space-y-1 hover:border-primary/40 transition-colors\">\n <div className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n <GitBranch className=\"h-3 w-3 text-primary\" />\n <span className=\"text-primary font-medium\">Remix</span>\n </div>\n <p className=\"text-xs tabular-nums truncate\">#{remix.remixTokenId}</p>\n <p className=\"text-[10px] text-muted-foreground\">{remix.licenseType}</p>\n <div className=\"flex gap-1 flex-wrap\">\n {remix.commercial && (\n <span className=\"text-[9px] px-1.5 py-0.5 rounded-full bg-brand-blue/10 text-brand-blue border border-brand-blue/20\">Commercial</span>\n )}\n {remix.derivatives && (\n <span className=\"text-[9px] px-1.5 py-0.5 rounded-full bg-primary/10 text-primary border border-primary/20\">Derivatives</span>\n )}\n </div>\n </div>\n </Link>\n ) : null\n )}\n </div>\n </div>\n );\n}\n"],"mappings":";AAsBU,cAQJ,YARI;AApBV,OAAO,UAAU;AACjB,SAAS,iBAAiB;AAC1B,SAAS,iBAAiB;AAC1B,SAAS,uBAAuB;AAChC,SAAS,gBAAgB;AASlB,SAAS,WAAW,EAAE,WAAW,iBAAiB,QAAQ,GAAoB;AACnF,QAAM,EAAE,SAAS,OAAO,UAAU,IAAI,gBAAgB,WAAW,iBAAiB,OAAO;AAEzF,MAAI,WAAW;AACb,WACE,oBAAC,SAAI,WAAU,yCACZ,gBAAM,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,MACjC,oBAAC,YAAiB,WAAU,8BAAb,CAAwC,CACxD,GACH;AAAA,EAEJ;AAEA,MAAI,QAAQ,WAAW,GAAG;AACxB,WACE,qBAAC,SAAI,WAAU,sDACb;AAAA,0BAAC,SAAI,WAAU,yEACb,8BAAC,aAAU,WAAU,wBAAuB,GAC9C;AAAA,MACA,oBAAC,OAAE,WAAU,uBAAsB,4BAAc;AAAA,MACjD,oBAAC,OAAE,WAAU,iCAAgC,mEAAqD;AAAA,OACpG;AAAA,EAEJ;AAEA,SACE,qBAAC,SAAI,WAAU,aACb;AAAA,yBAAC,OAAE,WAAU,iCAAiC;AAAA;AAAA,MAAM;AAAA,MAAO,UAAU,IAAI,OAAO;AAAA,MAAG;AAAA,OAAc;AAAA,IACjG,oBAAC,SAAI,WAAU,yCACZ,kBAAQ;AAAA,MAAI,CAAC,UACZ,MAAM,iBAAiB,MAAM,eAC3B;AAAA,QAAC;AAAA;AAAA,UAEC,MAAM,UAAU,YAAY,MAAM,eAAe,MAAM,YAAY;AAAA,UACnE,WAAU;AAAA,UAEV,+BAAC,SAAI,WAAU,qEACb;AAAA,iCAAC,SAAI,WAAU,2DACb;AAAA,kCAAC,aAAU,WAAU,wBAAuB;AAAA,cAC5C,oBAAC,UAAK,WAAU,4BAA2B,mBAAK;AAAA,eAClD;AAAA,YACA,qBAAC,OAAE,WAAU,iCAAgC;AAAA;AAAA,cAAE,MAAM;AAAA,eAAa;AAAA,YAClE,oBAAC,OAAE,WAAU,qCAAqC,gBAAM,aAAY;AAAA,YACpE,qBAAC,SAAI,WAAU,wBACZ;AAAA,oBAAM,cACL,oBAAC,UAAK,WAAU,sGAAqG,wBAAU;AAAA,cAEhI,MAAM,eACL,oBAAC,UAAK,WAAU,6FAA4F,yBAAW;AAAA,eAE3H;AAAA,aACF;AAAA;AAAA,QAnBK,MAAM;AAAA,MAoBb,IACE;AAAA,IACN,GACF;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/components/remixes-tab.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"./link.js\";\nimport { assetHref } from \"@medialane/sdk\";\nimport { GitBranch } from \"lucide-react\";\nimport { useTokenRemixes } from \"../utils/use-remix-offers.js\";\nimport { Skeleton } from \"./skeleton.js\";\nimport type { ApiFetchConfig } from \"../utils/api-fetch.js\";\n\nexport interface RemixesTabProps {\n apiConfig: ApiFetchConfig;\n contractAddress: string;\n tokenId: string;\n}\n\nexport function RemixesTab({ apiConfig, contractAddress, tokenId }: RemixesTabProps) {\n const { remixes, total, isLoading } = useTokenRemixes(apiConfig, contractAddress, tokenId);\n\n if (isLoading) {\n return (\n <div className=\"grid grid-cols-2 sm:grid-cols-3 gap-3\">\n {Array.from({ length: 3 }).map((_, i) => (\n <Skeleton key={i} className=\"aspect-square rounded-xl\" />\n ))}\n </div>\n );\n }\n\n if (remixes.length === 0) {\n return (\n <div className=\"flex flex-col items-center gap-3 py-12 text-center\">\n <div className=\"h-12 w-12 rounded-full bg-primary/10 flex items-center justify-center\">\n <GitBranch className=\"h-5 w-5 text-primary\" />\n </div>\n <p className=\"text-sm font-medium\">No remixes yet</p>\n <p className=\"text-xs text-muted-foreground\">Remix this asset to create the first derivative work.</p>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-3\">\n <p className=\"text-xs text-muted-foreground\">{total} remix{total !== 1 ? \"es\" : \"\"} of this asset</p>\n <div className=\"grid grid-cols-2 sm:grid-cols-3 gap-3\">\n {remixes.map((remix) =>\n remix.remixContract && remix.remixTokenId ? (\n <Link\n key={remix.id}\n href={assetHref(\"STARKNET\", remix.remixContract, remix.remixTokenId)}\n className=\"group relative block\"\n >\n <div className=\"card-base p-3 space-y-1 hover:border-primary/40 transition-colors\">\n <div className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n <GitBranch className=\"h-3 w-3 text-primary\" />\n <span className=\"text-primary font-medium\">Remix</span>\n </div>\n <p className=\"text-xs tabular-nums truncate\">#{remix.remixTokenId}</p>\n <p className=\"text-[10px] text-muted-foreground\">{remix.licenseType}</p>\n <div className=\"flex gap-1 flex-wrap\">\n {remix.commercial && (\n <span className=\"text-[9px] px-1.5 py-0.5 rounded-full bg-brand-blue/10 text-brand-blue border border-brand-blue/20\">Commercial</span>\n )}\n {remix.derivatives && (\n <span className=\"text-[9px] px-1.5 py-0.5 rounded-full bg-primary/10 text-primary border border-primary/20\">Derivatives</span>\n )}\n </div>\n </div>\n </Link>\n ) : null\n )}\n </div>\n </div>\n );\n}\n"],"mappings":";AAsBU,cAQJ,YARI;AApBV,OAAO,UAAU;AACjB,SAAS,iBAAiB;AAC1B,SAAS,iBAAiB;AAC1B,SAAS,uBAAuB;AAChC,SAAS,gBAAgB;AASlB,SAAS,WAAW,EAAE,WAAW,iBAAiB,QAAQ,GAAoB;AACnF,QAAM,EAAE,SAAS,OAAO,UAAU,IAAI,gBAAgB,WAAW,iBAAiB,OAAO;AAEzF,MAAI,WAAW;AACb,WACE,oBAAC,SAAI,WAAU,yCACZ,gBAAM,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,MACjC,oBAAC,YAAiB,WAAU,8BAAb,CAAwC,CACxD,GACH;AAAA,EAEJ;AAEA,MAAI,QAAQ,WAAW,GAAG;AACxB,WACE,qBAAC,SAAI,WAAU,sDACb;AAAA,0BAAC,SAAI,WAAU,yEACb,8BAAC,aAAU,WAAU,wBAAuB,GAC9C;AAAA,MACA,oBAAC,OAAE,WAAU,uBAAsB,4BAAc;AAAA,MACjD,oBAAC,OAAE,WAAU,iCAAgC,mEAAqD;AAAA,OACpG;AAAA,EAEJ;AAEA,SACE,qBAAC,SAAI,WAAU,aACb;AAAA,yBAAC,OAAE,WAAU,iCAAiC;AAAA;AAAA,MAAM;AAAA,MAAO,UAAU,IAAI,OAAO;AAAA,MAAG;AAAA,OAAc;AAAA,IACjG,oBAAC,SAAI,WAAU,yCACZ,kBAAQ;AAAA,MAAI,CAAC,UACZ,MAAM,iBAAiB,MAAM,eAC3B;AAAA,QAAC;AAAA;AAAA,UAEC,MAAM,UAAU,YAAY,MAAM,eAAe,MAAM,YAAY;AAAA,UACnE,WAAU;AAAA,UAEV,+BAAC,SAAI,WAAU,qEACb;AAAA,iCAAC,SAAI,WAAU,2DACb;AAAA,kCAAC,aAAU,WAAU,wBAAuB;AAAA,cAC5C,oBAAC,UAAK,WAAU,4BAA2B,mBAAK;AAAA,eAClD;AAAA,YACA,qBAAC,OAAE,WAAU,iCAAgC;AAAA;AAAA,cAAE,MAAM;AAAA,eAAa;AAAA,YAClE,oBAAC,OAAE,WAAU,qCAAqC,gBAAM,aAAY;AAAA,YACpE,qBAAC,SAAI,WAAU,wBACZ;AAAA,oBAAM,cACL,oBAAC,UAAK,WAAU,sGAAqG,wBAAU;AAAA,cAEhI,MAAM,eACL,oBAAC,UAAK,WAAU,6FAA4F,yBAAW;AAAA,eAE3H;AAAA,aACF;AAAA;AAAA,QAnBK,MAAM;AAAA,MAoBb,IACE;AAAA,IACN,GACF;AAAA,KACF;AAEJ;","names":[]}
@@ -33,7 +33,7 @@ __export(rewards_section_exports, {
33
33
  });
34
34
  module.exports = __toCommonJS(rewards_section_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_lucide_react = require("lucide-react");
38
38
  const pillars = [
39
39
  {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/rewards-section.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { ArrowRight, Zap, Coins, Gift } from \"lucide-react\";\n\nexport interface RewardsSectionProps {\n rewardsHref: string;\n}\n\nconst pillars = [\n {\n icon: Zap,\n label: \"XP\",\n detail: \"Earned for every mint, trade, and connection you make.\",\n },\n {\n icon: Coins,\n label: \"Creator's Fund\",\n detail: \"Your XP grows your share of the shared pool.\",\n },\n {\n icon: Gift,\n label: \"Airdrop\",\n detail: \"Claim your share on-chain, every round.\",\n },\n];\n\nexport function RewardsSection({ rewardsHref }: RewardsSectionProps) {\n return (\n <div className=\"rounded-2xl p-[1.5px] bg-gradient-to-r from-brand-orange to-brand-maeve\">\n <section className=\"rounded-[15px] bg-background px-7 py-8 sm:px-9\">\n <div className=\"flex flex-col lg:flex-row lg:items-center gap-8 lg:gap-14\">\n <div className=\"flex-1 min-w-0\">\n <h2 className=\"text-2xl sm:text-3xl font-bold tracking-tight leading-tight text-foreground\">\n Rewards\n </h2>\n <p className=\"mt-2 text-sm text-muted-foreground leading-relaxed max-w-md\">\n Every action earns XP. Active members receive a growing share of the\n Creator&apos;s Fund, claimed as an airdrop each round.\n </p>\n\n <Link\n href={rewardsHref}\n className=\"mt-6 inline-flex items-center justify-center gap-2 rounded-xl bg-gradient-to-r from-brand-orange to-brand-maeve px-6 py-3 text-sm font-semibold text-white transition-all hover:brightness-110 active:scale-[0.98]\"\n >\n View your rewards\n <ArrowRight className=\"h-4 w-4\" />\n </Link>\n </div>\n\n <div className=\"flex flex-col gap-4 lg:w-[300px] shrink-0 lg:border-l lg:border-border lg:pl-10\">\n {pillars.map(({ icon: Icon, label, detail }) => (\n <div key={label} className=\"flex items-start gap-3.5\">\n <div className=\"flex h-9 w-9 items-center justify-center rounded-lg bg-gradient-to-br from-brand-orange/15 to-brand-maeve/15 text-brand-maeve shrink-0\">\n <Icon className=\"h-4 w-4\" />\n </div>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-semibold text-foreground\">{label}</p>\n <p className=\"text-xs text-muted-foreground leading-relaxed\">{detail}</p>\n </div>\n </div>\n ))}\n </div>\n </div>\n </section>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAiCY;AA/BZ,kBAAiB;AACjB,0BAA6C;AAM7C,MAAM,UAAU;AAAA,EACd;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AACF;AAEO,SAAS,eAAe,EAAE,YAAY,GAAwB;AACnE,SACE,4CAAC,SAAI,WAAU,2EACb,sDAAC,aAAQ,WAAU,kDACjB,uDAAC,SAAI,WAAU,6DACb;AAAA,iDAAC,SAAI,WAAU,kBACb;AAAA,kDAAC,QAAG,WAAU,+EAA8E,qBAE5F;AAAA,MACA,4CAAC,OAAE,WAAU,+DAA8D,oIAG3E;AAAA,MAEA;AAAA,QAAC,YAAAA;AAAA,QAAA;AAAA,UACC,MAAM;AAAA,UACN,WAAU;AAAA,UACX;AAAA;AAAA,YAEC,4CAAC,kCAAW,WAAU,WAAU;AAAA;AAAA;AAAA,MAClC;AAAA,OACF;AAAA,IAEA,4CAAC,SAAI,WAAU,mFACZ,kBAAQ,IAAI,CAAC,EAAE,MAAM,MAAM,OAAO,OAAO,MACxC,6CAAC,SAAgB,WAAU,4BACzB;AAAA,kDAAC,SAAI,WAAU,0IACb,sDAAC,QAAK,WAAU,WAAU,GAC5B;AAAA,MACA,6CAAC,SAAI,WAAU,WACb;AAAA,oDAAC,OAAE,WAAU,yCAAyC,iBAAM;AAAA,QAC5D,4CAAC,OAAE,WAAU,iDAAiD,kBAAO;AAAA,SACvE;AAAA,SAPQ,KAQV,CACD,GACH;AAAA,KACF,GACF,GACF;AAEJ;","names":["Link"]}
1
+ {"version":3,"sources":["../../src/components/rewards-section.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"./link.js\";\nimport { ArrowRight, Zap, Coins, Gift } from \"lucide-react\";\n\nexport interface RewardsSectionProps {\n rewardsHref: string;\n}\n\nconst pillars = [\n {\n icon: Zap,\n label: \"XP\",\n detail: \"Earned for every mint, trade, and connection you make.\",\n },\n {\n icon: Coins,\n label: \"Creator's Fund\",\n detail: \"Your XP grows your share of the shared pool.\",\n },\n {\n icon: Gift,\n label: \"Airdrop\",\n detail: \"Claim your share on-chain, every round.\",\n },\n];\n\nexport function RewardsSection({ rewardsHref }: RewardsSectionProps) {\n return (\n <div className=\"rounded-2xl p-[1.5px] bg-gradient-to-r from-brand-orange to-brand-maeve\">\n <section className=\"rounded-[15px] bg-background px-7 py-8 sm:px-9\">\n <div className=\"flex flex-col lg:flex-row lg:items-center gap-8 lg:gap-14\">\n <div className=\"flex-1 min-w-0\">\n <h2 className=\"text-2xl sm:text-3xl font-bold tracking-tight leading-tight text-foreground\">\n Rewards\n </h2>\n <p className=\"mt-2 text-sm text-muted-foreground leading-relaxed max-w-md\">\n Every action earns XP. Active members receive a growing share of the\n Creator&apos;s Fund, claimed as an airdrop each round.\n </p>\n\n <Link\n href={rewardsHref}\n className=\"mt-6 inline-flex items-center justify-center gap-2 rounded-xl bg-gradient-to-r from-brand-orange to-brand-maeve px-6 py-3 text-sm font-semibold text-white transition-all hover:brightness-110 active:scale-[0.98]\"\n >\n View your rewards\n <ArrowRight className=\"h-4 w-4\" />\n </Link>\n </div>\n\n <div className=\"flex flex-col gap-4 lg:w-[300px] shrink-0 lg:border-l lg:border-border lg:pl-10\">\n {pillars.map(({ icon: Icon, label, detail }) => (\n <div key={label} className=\"flex items-start gap-3.5\">\n <div className=\"flex h-9 w-9 items-center justify-center rounded-lg bg-gradient-to-br from-brand-orange/15 to-brand-maeve/15 text-brand-maeve shrink-0\">\n <Icon className=\"h-4 w-4\" />\n </div>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-semibold text-foreground\">{label}</p>\n <p className=\"text-xs text-muted-foreground leading-relaxed\">{detail}</p>\n </div>\n </div>\n ))}\n </div>\n </div>\n </section>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAiCY;AA/BZ,kBAAiB;AACjB,0BAA6C;AAM7C,MAAM,UAAU;AAAA,EACd;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AACF;AAEO,SAAS,eAAe,EAAE,YAAY,GAAwB;AACnE,SACE,4CAAC,SAAI,WAAU,2EACb,sDAAC,aAAQ,WAAU,kDACjB,uDAAC,SAAI,WAAU,6DACb;AAAA,iDAAC,SAAI,WAAU,kBACb;AAAA,kDAAC,QAAG,WAAU,+EAA8E,qBAE5F;AAAA,MACA,4CAAC,OAAE,WAAU,+DAA8D,oIAG3E;AAAA,MAEA;AAAA,QAAC,YAAAA;AAAA,QAAA;AAAA,UACC,MAAM;AAAA,UACN,WAAU;AAAA,UACX;AAAA;AAAA,YAEC,4CAAC,kCAAW,WAAU,WAAU;AAAA;AAAA;AAAA,MAClC;AAAA,OACF;AAAA,IAEA,4CAAC,SAAI,WAAU,mFACZ,kBAAQ,IAAI,CAAC,EAAE,MAAM,MAAM,OAAO,OAAO,MACxC,6CAAC,SAAgB,WAAU,4BACzB;AAAA,kDAAC,SAAI,WAAU,0IACb,sDAAC,QAAK,WAAU,WAAU,GAC5B;AAAA,MACA,6CAAC,SAAI,WAAU,WACb;AAAA,oDAAC,OAAE,WAAU,yCAAyC,iBAAM;AAAA,QAC5D,4CAAC,OAAE,WAAU,iDAAiD,kBAAO;AAAA,SACvE;AAAA,SAPQ,KAQV,CACD,GACH;AAAA,KACF,GACF,GACF;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 { ArrowRight, Zap, Coins, Gift } from "lucide-react";
5
5
  const pillars = [
6
6
  {