@medialane/ui 0.120.0 → 0.121.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 (448) hide show
  1. package/dist/components/action-button.cjs.map +1 -1
  2. package/dist/components/action-button.d.cts +0 -9
  3. package/dist/components/action-button.d.ts +0 -9
  4. package/dist/components/action-button.js.map +1 -1
  5. package/dist/components/action-dialog.cjs.map +1 -1
  6. package/dist/components/action-dialog.d.cts +0 -1
  7. package/dist/components/action-dialog.d.ts +0 -1
  8. package/dist/components/action-dialog.js.map +1 -1
  9. package/dist/components/activity-card.cjs.map +1 -1
  10. package/dist/components/activity-card.d.cts +0 -3
  11. package/dist/components/activity-card.d.ts +0 -3
  12. package/dist/components/activity-card.js.map +1 -1
  13. package/dist/components/activity-row.cjs.map +1 -1
  14. package/dist/components/activity-row.d.cts +0 -1
  15. package/dist/components/activity-row.d.ts +0 -1
  16. package/dist/components/activity-row.js.map +1 -1
  17. package/dist/components/activity-ticker.cjs.map +1 -1
  18. package/dist/components/activity-ticker.d.cts +0 -1
  19. package/dist/components/activity-ticker.d.ts +0 -1
  20. package/dist/components/activity-ticker.js.map +1 -1
  21. package/dist/components/address-display.cjs.map +1 -1
  22. package/dist/components/address-display.d.cts +0 -1
  23. package/dist/components/address-display.d.ts +0 -1
  24. package/dist/components/address-display.js.map +1 -1
  25. package/dist/components/animated-token-media.cjs.map +1 -1
  26. package/dist/components/animated-token-media.d.cts +0 -10
  27. package/dist/components/animated-token-media.d.ts +0 -10
  28. package/dist/components/animated-token-media.js.map +1 -1
  29. package/dist/components/asset-card.cjs.map +1 -1
  30. package/dist/components/asset-card.d.cts +0 -29
  31. package/dist/components/asset-card.d.ts +0 -29
  32. package/dist/components/asset-card.js.map +1 -1
  33. package/dist/components/asset-collection-bar.cjs.map +1 -1
  34. package/dist/components/asset-collection-bar.d.cts +0 -1
  35. package/dist/components/asset-collection-bar.d.ts +0 -1
  36. package/dist/components/asset-collection-bar.js.map +1 -1
  37. package/dist/components/asset-license-summary.cjs.map +1 -1
  38. package/dist/components/asset-license-summary.d.cts +0 -8
  39. package/dist/components/asset-license-summary.d.ts +0 -8
  40. package/dist/components/asset-license-summary.js.map +1 -1
  41. package/dist/components/asset-lightbox.cjs.map +1 -1
  42. package/dist/components/asset-lightbox.js.map +1 -1
  43. package/dist/components/asset-marketplace-panel.cjs.map +1 -1
  44. package/dist/components/asset-marketplace-panel.d.cts +0 -13
  45. package/dist/components/asset-marketplace-panel.d.ts +0 -13
  46. package/dist/components/asset-marketplace-panel.js.map +1 -1
  47. package/dist/components/asset-markets-tab.cjs.map +1 -1
  48. package/dist/components/asset-markets-tab.js.map +1 -1
  49. package/dist/components/asset-overview-content.cjs.map +1 -1
  50. package/dist/components/asset-overview-content.d.cts +0 -7
  51. package/dist/components/asset-overview-content.d.ts +0 -7
  52. package/dist/components/asset-overview-content.js.map +1 -1
  53. package/dist/components/asset-picker-cell.cjs.map +1 -1
  54. package/dist/components/asset-picker-cell.d.cts +0 -4
  55. package/dist/components/asset-picker-cell.d.ts +0 -4
  56. package/dist/components/asset-picker-cell.js.map +1 -1
  57. package/dist/components/asset-picker.cjs.map +1 -1
  58. package/dist/components/asset-picker.d.cts +0 -4
  59. package/dist/components/asset-picker.d.ts +0 -4
  60. package/dist/components/asset-picker.js.map +1 -1
  61. package/dist/components/asset-search-picker.cjs.map +1 -1
  62. package/dist/components/asset-search-picker.d.cts +0 -2
  63. package/dist/components/asset-search-picker.d.ts +0 -2
  64. package/dist/components/asset-search-picker.js.map +1 -1
  65. package/dist/components/asset-top-sections.cjs.map +1 -1
  66. package/dist/components/asset-top-sections.d.cts +0 -18
  67. package/dist/components/asset-top-sections.d.ts +0 -18
  68. package/dist/components/asset-top-sections.js.map +1 -1
  69. package/dist/components/asset-utility-icons.cjs.map +1 -1
  70. package/dist/components/asset-utility-icons.d.cts +0 -5
  71. package/dist/components/asset-utility-icons.d.ts +0 -5
  72. package/dist/components/asset-utility-icons.js.map +1 -1
  73. package/dist/components/claim-rail.cjs.map +1 -1
  74. package/dist/components/claim-rail.d.cts +0 -9
  75. package/dist/components/claim-rail.d.ts +0 -9
  76. package/dist/components/claim-rail.js.map +1 -1
  77. package/dist/components/club-owner-actions.cjs.map +1 -1
  78. package/dist/components/club-owner-actions.d.cts +0 -2
  79. package/dist/components/club-owner-actions.d.ts +0 -2
  80. package/dist/components/club-owner-actions.js.map +1 -1
  81. package/dist/components/coin-card.cjs.map +1 -1
  82. package/dist/components/coin-card.d.cts +0 -2
  83. package/dist/components/coin-card.d.ts +0 -2
  84. package/dist/components/coin-card.js.map +1 -1
  85. package/dist/components/coin-launch-preview.cjs.map +1 -1
  86. package/dist/components/coin-launch-preview.d.cts +0 -7
  87. package/dist/components/coin-launch-preview.d.ts +0 -7
  88. package/dist/components/coin-launch-preview.js.map +1 -1
  89. package/dist/components/coins-explorer.cjs.map +1 -1
  90. package/dist/components/coins-explorer.d.cts +0 -1
  91. package/dist/components/coins-explorer.d.ts +0 -1
  92. package/dist/components/coins-explorer.js.map +1 -1
  93. package/dist/components/collection-card.cjs.map +1 -1
  94. package/dist/components/collection-card.d.cts +0 -2
  95. package/dist/components/collection-card.d.ts +0 -2
  96. package/dist/components/collection-card.js.map +1 -1
  97. package/dist/components/collection-filters.cjs.map +1 -1
  98. package/dist/components/collection-filters.js.map +1 -1
  99. package/dist/components/collection-hero-banner.cjs.map +1 -1
  100. package/dist/components/collection-hero-banner.d.cts +0 -7
  101. package/dist/components/collection-hero-banner.d.ts +0 -7
  102. package/dist/components/collection-hero-banner.js.map +1 -1
  103. package/dist/components/collection-traits-tab.cjs.map +1 -1
  104. package/dist/components/collection-traits-tab.js.map +1 -1
  105. package/dist/components/community-rewards-section.cjs.map +1 -1
  106. package/dist/components/community-rewards-section.js.map +1 -1
  107. package/dist/components/create-form-primitives.cjs.map +1 -1
  108. package/dist/components/create-form-primitives.d.cts +0 -2
  109. package/dist/components/create-form-primitives.d.ts +0 -2
  110. package/dist/components/create-form-primitives.js.map +1 -1
  111. package/dist/components/creation-record.cjs.map +1 -1
  112. package/dist/components/creation-record.d.cts +0 -5
  113. package/dist/components/creation-record.d.ts +0 -5
  114. package/dist/components/creation-record.js.map +1 -1
  115. package/dist/components/creator-airdrop-banner.cjs.map +1 -1
  116. package/dist/components/creator-airdrop-banner.d.cts +0 -1
  117. package/dist/components/creator-airdrop-banner.d.ts +0 -1
  118. package/dist/components/creator-airdrop-banner.js.map +1 -1
  119. package/dist/components/creator-analytics.cjs.map +1 -1
  120. package/dist/components/creator-analytics.js.map +1 -1
  121. package/dist/components/creator-score-inline.cjs.map +1 -1
  122. package/dist/components/creator-score-inline.d.cts +0 -5
  123. package/dist/components/creator-score-inline.d.ts +0 -5
  124. package/dist/components/creator-score-inline.js.map +1 -1
  125. package/dist/components/cta-card-grid.cjs.map +1 -1
  126. package/dist/components/cta-card-grid.d.cts +0 -2
  127. package/dist/components/cta-card-grid.d.ts +0 -2
  128. package/dist/components/cta-card-grid.js.map +1 -1
  129. package/dist/components/currency-icon.cjs.map +1 -1
  130. package/dist/components/currency-icon.d.cts +0 -5
  131. package/dist/components/currency-icon.d.ts +0 -5
  132. package/dist/components/currency-icon.js.map +1 -1
  133. package/dist/components/discover-collections-strip.cjs.map +1 -1
  134. package/dist/components/discover-collections-strip.d.cts +0 -4
  135. package/dist/components/discover-collections-strip.d.ts +0 -4
  136. package/dist/components/discover-collections-strip.js.map +1 -1
  137. package/dist/components/discover-creators-strip.cjs.map +1 -1
  138. package/dist/components/discover-creators-strip.js.map +1 -1
  139. package/dist/components/discover-feed-section.cjs.map +1 -1
  140. package/dist/components/discover-feed-section.d.cts +0 -11
  141. package/dist/components/discover-feed-section.d.ts +0 -11
  142. package/dist/components/discover-feed-section.js.map +1 -1
  143. package/dist/components/discover-hero.cjs.map +1 -1
  144. package/dist/components/discover-hero.js.map +1 -1
  145. package/dist/components/drop-countdown.cjs.map +1 -1
  146. package/dist/components/drop-countdown.js.map +1 -1
  147. package/dist/components/dual-price.cjs +0 -6
  148. package/dist/components/dual-price.cjs.map +1 -1
  149. package/dist/components/dual-price.d.cts +0 -30
  150. package/dist/components/dual-price.d.ts +0 -30
  151. package/dist/components/dual-price.js +0 -6
  152. package/dist/components/dual-price.js.map +1 -1
  153. package/dist/components/empty-or-error.cjs.map +1 -1
  154. package/dist/components/empty-or-error.d.cts +0 -1
  155. package/dist/components/empty-or-error.d.ts +0 -1
  156. package/dist/components/empty-or-error.js.map +1 -1
  157. package/dist/components/gradient-button.cjs.map +1 -1
  158. package/dist/components/gradient-button.d.cts +0 -13
  159. package/dist/components/gradient-button.d.ts +0 -13
  160. package/dist/components/gradient-button.js.map +1 -1
  161. package/dist/components/help-icon.cjs.map +1 -1
  162. package/dist/components/help-icon.d.cts +0 -4
  163. package/dist/components/help-icon.d.ts +0 -4
  164. package/dist/components/help-icon.js.map +1 -1
  165. package/dist/components/hero-slider.cjs.map +1 -1
  166. package/dist/components/hero-slider.d.cts +0 -1
  167. package/dist/components/hero-slider.d.ts +0 -1
  168. package/dist/components/hero-slider.js.map +1 -1
  169. package/dist/components/ip-type-badge.cjs.map +1 -1
  170. package/dist/components/ip-type-badge.d.cts +0 -2
  171. package/dist/components/ip-type-badge.d.ts +0 -2
  172. package/dist/components/ip-type-badge.js.map +1 -1
  173. package/dist/components/ip-type-display.cjs.map +1 -1
  174. package/dist/components/ip-type-display.js.map +1 -1
  175. package/dist/components/ip-type-fields.cjs.map +1 -1
  176. package/dist/components/ip-type-fields.d.cts +0 -2
  177. package/dist/components/ip-type-fields.d.ts +0 -2
  178. package/dist/components/ip-type-fields.js.map +1 -1
  179. package/dist/components/launchpad-filter-bar.cjs.map +1 -1
  180. package/dist/components/launchpad-filter-bar.d.cts +0 -8
  181. package/dist/components/launchpad-filter-bar.d.ts +0 -8
  182. package/dist/components/launchpad-filter-bar.js.map +1 -1
  183. package/dist/components/launchpad-services.cjs +0 -1
  184. package/dist/components/launchpad-services.cjs.map +1 -1
  185. package/dist/components/launchpad-services.d.cts +0 -36
  186. package/dist/components/launchpad-services.d.ts +0 -36
  187. package/dist/components/launchpad-services.js +0 -1
  188. package/dist/components/launchpad-services.js.map +1 -1
  189. package/dist/components/launchpad-strip.cjs.map +1 -1
  190. package/dist/components/launchpad-strip.d.cts +0 -6
  191. package/dist/components/launchpad-strip.d.ts +0 -6
  192. package/dist/components/launchpad-strip.js.map +1 -1
  193. package/dist/components/license-terms-builder.cjs.map +1 -1
  194. package/dist/components/license-terms-builder.d.cts +0 -34
  195. package/dist/components/license-terms-builder.d.ts +0 -34
  196. package/dist/components/license-terms-builder.js.map +1 -1
  197. package/dist/components/listing-card.cjs.map +1 -1
  198. package/dist/components/listing-card.d.cts +0 -19
  199. package/dist/components/listing-card.d.ts +0 -19
  200. package/dist/components/listing-card.js.map +1 -1
  201. package/dist/components/load-more-sentinel.cjs.map +1 -1
  202. package/dist/components/load-more-sentinel.d.cts +0 -6
  203. package/dist/components/load-more-sentinel.d.ts +0 -6
  204. package/dist/components/load-more-sentinel.js.map +1 -1
  205. package/dist/components/medialane-collection-card.cjs +1 -4
  206. package/dist/components/medialane-collection-card.cjs.map +1 -1
  207. package/dist/components/medialane-collection-card.d.cts +0 -13
  208. package/dist/components/medialane-collection-card.d.ts +0 -13
  209. package/dist/components/medialane-collection-card.js +1 -4
  210. package/dist/components/medialane-collection-card.js.map +1 -1
  211. package/dist/components/motion-primitives.cjs.map +1 -1
  212. package/dist/components/motion-primitives.js.map +1 -1
  213. package/dist/components/nav-command-menu.cjs.map +1 -1
  214. package/dist/components/nav-command-menu.d.cts +0 -32
  215. package/dist/components/nav-command-menu.d.ts +0 -32
  216. package/dist/components/nav-command-menu.js.map +1 -1
  217. package/dist/components/nav-shell.cjs.map +1 -1
  218. package/dist/components/nav-shell.d.cts +0 -57
  219. package/dist/components/nav-shell.d.ts +0 -57
  220. package/dist/components/nav-shell.js.map +1 -1
  221. package/dist/components/nav-theme-toggle.cjs.map +1 -1
  222. package/dist/components/nav-theme-toggle.d.cts +0 -4
  223. package/dist/components/nav-theme-toggle.d.ts +0 -4
  224. package/dist/components/nav-theme-toggle.js.map +1 -1
  225. package/dist/components/order-sort-control.cjs.map +1 -1
  226. package/dist/components/order-sort-control.d.cts +0 -2
  227. package/dist/components/order-sort-control.d.ts +0 -2
  228. package/dist/components/order-sort-control.js.map +1 -1
  229. package/dist/components/page-container.cjs +0 -3
  230. package/dist/components/page-container.cjs.map +1 -1
  231. package/dist/components/page-container.d.cts +0 -6
  232. package/dist/components/page-container.d.ts +0 -6
  233. package/dist/components/page-container.js +0 -3
  234. package/dist/components/page-container.js.map +1 -1
  235. package/dist/components/parent-attribution-banner.cjs.map +1 -1
  236. package/dist/components/parent-attribution-banner.d.cts +0 -1
  237. package/dist/components/parent-attribution-banner.d.ts +0 -1
  238. package/dist/components/parent-attribution-banner.js.map +1 -1
  239. package/dist/components/portfolio-activity.cjs.map +1 -1
  240. package/dist/components/portfolio-activity.js.map +1 -1
  241. package/dist/components/portfolio-bento-tile.cjs +8 -3
  242. package/dist/components/portfolio-bento-tile.cjs.map +1 -1
  243. package/dist/components/portfolio-bento-tile.d.cts +5 -13
  244. package/dist/components/portfolio-bento-tile.d.ts +5 -13
  245. package/dist/components/portfolio-bento-tile.js +8 -3
  246. package/dist/components/portfolio-bento-tile.js.map +1 -1
  247. package/dist/components/portfolio-chip-filter.cjs.map +1 -1
  248. package/dist/components/portfolio-chip-filter.d.cts +0 -14
  249. package/dist/components/portfolio-chip-filter.d.ts +0 -14
  250. package/dist/components/portfolio-chip-filter.js.map +1 -1
  251. package/dist/components/portfolio-header.cjs.map +1 -1
  252. package/dist/components/portfolio-header.d.cts +0 -11
  253. package/dist/components/portfolio-header.d.ts +0 -11
  254. package/dist/components/portfolio-header.js.map +1 -1
  255. package/dist/components/portfolio-overview.cjs +6 -1
  256. package/dist/components/portfolio-overview.cjs.map +1 -1
  257. package/dist/components/portfolio-overview.d.cts +0 -18
  258. package/dist/components/portfolio-overview.d.ts +0 -18
  259. package/dist/components/portfolio-overview.js +6 -1
  260. package/dist/components/portfolio-overview.js.map +1 -1
  261. package/dist/components/price-history-chart.cjs.map +1 -1
  262. package/dist/components/price-history-chart.js.map +1 -1
  263. package/dist/components/rewards/badge-catalog.cjs.map +1 -1
  264. package/dist/components/rewards/badge-catalog.d.cts +0 -5
  265. package/dist/components/rewards/badge-catalog.d.ts +0 -5
  266. package/dist/components/rewards/badge-catalog.js.map +1 -1
  267. package/dist/components/rewards/badge-shelf.cjs.map +1 -1
  268. package/dist/components/rewards/badge-shelf.d.cts +0 -5
  269. package/dist/components/rewards/badge-shelf.d.ts +0 -5
  270. package/dist/components/rewards/badge-shelf.js.map +1 -1
  271. package/dist/components/rewards/badge-unlock-toast-content.cjs.map +1 -1
  272. package/dist/components/rewards/badge-unlock-toast-content.d.cts +0 -2
  273. package/dist/components/rewards/badge-unlock-toast-content.d.ts +0 -2
  274. package/dist/components/rewards/badge-unlock-toast-content.js.map +1 -1
  275. package/dist/components/rewards/journey-path.cjs.map +1 -1
  276. package/dist/components/rewards/journey-path.d.cts +0 -9
  277. package/dist/components/rewards/journey-path.d.ts +0 -9
  278. package/dist/components/rewards/journey-path.js.map +1 -1
  279. package/dist/components/rewards/leaderboard-table.cjs.map +1 -1
  280. package/dist/components/rewards/leaderboard-table.d.cts +0 -11
  281. package/dist/components/rewards/leaderboard-table.d.ts +0 -11
  282. package/dist/components/rewards/leaderboard-table.js.map +1 -1
  283. package/dist/components/rewards/level-badge.cjs.map +1 -1
  284. package/dist/components/rewards/level-badge.d.cts +0 -10
  285. package/dist/components/rewards/level-badge.d.ts +0 -10
  286. package/dist/components/rewards/level-badge.js.map +1 -1
  287. package/dist/components/rewards/level-journey-list.cjs.map +1 -1
  288. package/dist/components/rewards/level-journey-list.d.cts +0 -7
  289. package/dist/components/rewards/level-journey-list.d.ts +0 -7
  290. package/dist/components/rewards/level-journey-list.js.map +1 -1
  291. package/dist/components/rewards/level-up-celebration.cjs.map +1 -1
  292. package/dist/components/rewards/level-up-celebration.d.cts +0 -4
  293. package/dist/components/rewards/level-up-celebration.d.ts +0 -4
  294. package/dist/components/rewards/level-up-celebration.js.map +1 -1
  295. package/dist/components/rewards/reward-toast.cjs.map +1 -1
  296. package/dist/components/rewards/reward-toast.d.cts +0 -8
  297. package/dist/components/rewards/reward-toast.d.ts +0 -8
  298. package/dist/components/rewards/reward-toast.js.map +1 -1
  299. package/dist/components/rewards/score-summary-card.cjs.map +1 -1
  300. package/dist/components/rewards/score-summary-card.d.cts +0 -5
  301. package/dist/components/rewards/score-summary-card.d.ts +0 -5
  302. package/dist/components/rewards/score-summary-card.js.map +1 -1
  303. package/dist/components/rewards/use-rewards-celebrations.cjs.map +1 -1
  304. package/dist/components/rewards/use-rewards-celebrations.d.cts +0 -10
  305. package/dist/components/rewards/use-rewards-celebrations.d.ts +0 -10
  306. package/dist/components/rewards/use-rewards-celebrations.js.map +1 -1
  307. package/dist/components/rewards/xp-progress.cjs.map +1 -1
  308. package/dist/components/rewards/xp-progress.d.cts +0 -4
  309. package/dist/components/rewards/xp-progress.d.ts +0 -4
  310. package/dist/components/rewards/xp-progress.js.map +1 -1
  311. package/dist/components/rewards/xp-toast-content.cjs.map +1 -1
  312. package/dist/components/rewards/xp-toast-content.d.cts +0 -7
  313. package/dist/components/rewards/xp-toast-content.d.ts +0 -7
  314. package/dist/components/rewards/xp-toast-content.js.map +1 -1
  315. package/dist/components/scroll-section.cjs.map +1 -1
  316. package/dist/components/scroll-section.d.cts +0 -6
  317. package/dist/components/scroll-section.d.ts +0 -6
  318. package/dist/components/scroll-section.js.map +1 -1
  319. package/dist/components/service-form-shell.cjs.map +1 -1
  320. package/dist/components/service-form-shell.d.cts +0 -14
  321. package/dist/components/service-form-shell.d.ts +0 -14
  322. package/dist/components/service-form-shell.js.map +1 -1
  323. package/dist/components/service-header.cjs.map +1 -1
  324. package/dist/components/service-header.d.cts +0 -11
  325. package/dist/components/service-header.d.ts +0 -11
  326. package/dist/components/service-header.js.map +1 -1
  327. package/dist/components/share-button.cjs.map +1 -1
  328. package/dist/components/share-button.js.map +1 -1
  329. package/dist/components/stat-tile.cjs.map +1 -1
  330. package/dist/components/stat-tile.d.cts +0 -4
  331. package/dist/components/stat-tile.d.ts +0 -4
  332. package/dist/components/stat-tile.js.map +1 -1
  333. package/dist/components/step-nav.cjs.map +1 -1
  334. package/dist/components/step-nav.d.cts +0 -11
  335. package/dist/components/step-nav.d.ts +0 -11
  336. package/dist/components/step-nav.js.map +1 -1
  337. package/dist/components/theme-ambient-background.cjs.map +1 -1
  338. package/dist/components/theme-ambient-background.d.cts +0 -6
  339. package/dist/components/theme-ambient-background.d.ts +0 -6
  340. package/dist/components/theme-ambient-background.js.map +1 -1
  341. package/dist/components/token-card.cjs.map +1 -1
  342. package/dist/components/token-card.d.cts +0 -6
  343. package/dist/components/token-card.d.ts +0 -6
  344. package/dist/components/token-card.js.map +1 -1
  345. package/dist/components/token-glyph.cjs.map +1 -1
  346. package/dist/components/token-glyph.d.cts +0 -2
  347. package/dist/components/token-glyph.d.ts +0 -2
  348. package/dist/components/token-glyph.js.map +1 -1
  349. package/dist/data/brand.cjs.map +1 -1
  350. package/dist/data/brand.d.cts +0 -6
  351. package/dist/data/brand.d.ts +0 -6
  352. package/dist/data/brand.js.map +1 -1
  353. package/dist/data/coins.cjs.map +1 -1
  354. package/dist/data/coins.d.cts +0 -9
  355. package/dist/data/coins.d.ts +0 -9
  356. package/dist/data/coins.js.map +1 -1
  357. package/dist/data/ip-templates.cjs.map +1 -1
  358. package/dist/data/ip-templates.d.cts +0 -12
  359. package/dist/data/ip-templates.d.ts +0 -12
  360. package/dist/data/ip-templates.js.map +1 -1
  361. package/dist/data/ip-types.cjs.map +1 -1
  362. package/dist/data/ip-types.d.cts +0 -2
  363. package/dist/data/ip-types.d.ts +0 -2
  364. package/dist/data/ip-types.js.map +1 -1
  365. package/dist/data/ip.cjs.map +1 -1
  366. package/dist/data/ip.d.cts +0 -1
  367. package/dist/data/ip.d.ts +0 -1
  368. package/dist/data/ip.js.map +1 -1
  369. package/dist/data/launchpad-services.cjs +0 -10
  370. package/dist/data/launchpad-services.cjs.map +1 -1
  371. package/dist/data/launchpad-services.d.cts +0 -10
  372. package/dist/data/launchpad-services.d.ts +0 -10
  373. package/dist/data/launchpad-services.js +0 -10
  374. package/dist/data/launchpad-services.js.map +1 -1
  375. package/dist/data/living-render-collections.cjs +0 -2
  376. package/dist/data/living-render-collections.cjs.map +1 -1
  377. package/dist/data/living-render-collections.d.cts +0 -11
  378. package/dist/data/living-render-collections.d.ts +0 -11
  379. package/dist/data/living-render-collections.js +0 -2
  380. package/dist/data/living-render-collections.js.map +1 -1
  381. package/dist/data/notification.cjs.map +1 -1
  382. package/dist/data/notification.d.cts +0 -3
  383. package/dist/data/notification.d.ts +0 -3
  384. package/dist/index.cjs.map +1 -1
  385. package/dist/index.js.map +1 -1
  386. package/dist/preset/tailwind.cjs +0 -9
  387. package/dist/preset/tailwind.cjs.map +1 -1
  388. package/dist/preset/tailwind.js +0 -9
  389. package/dist/preset/tailwind.js.map +1 -1
  390. package/dist/utils/address.cjs.map +1 -1
  391. package/dist/utils/address.d.cts +0 -4
  392. package/dist/utils/address.d.ts +0 -4
  393. package/dist/utils/address.js.map +1 -1
  394. package/dist/utils/api-fetch.cjs.map +1 -1
  395. package/dist/utils/api-fetch.d.cts +0 -21
  396. package/dist/utils/api-fetch.d.ts +0 -21
  397. package/dist/utils/api-fetch.js.map +1 -1
  398. package/dist/utils/format.cjs.map +1 -1
  399. package/dist/utils/format.d.cts +0 -11
  400. package/dist/utils/format.d.ts +0 -11
  401. package/dist/utils/format.js.map +1 -1
  402. package/dist/utils/ipfs.cjs.map +1 -1
  403. package/dist/utils/ipfs.d.cts +0 -8
  404. package/dist/utils/ipfs.d.ts +0 -8
  405. package/dist/utils/ipfs.js.map +1 -1
  406. package/dist/utils/license-summary.cjs.map +1 -1
  407. package/dist/utils/license-summary.d.cts +0 -8
  408. package/dist/utils/license-summary.d.ts +0 -8
  409. package/dist/utils/license-summary.js.map +1 -1
  410. package/dist/utils/notification-storage.cjs.map +1 -1
  411. package/dist/utils/notification-storage.js.map +1 -1
  412. package/dist/utils/portfolio-counts.cjs.map +1 -1
  413. package/dist/utils/portfolio-counts.d.cts +0 -18
  414. package/dist/utils/portfolio-counts.d.ts +0 -18
  415. package/dist/utils/portfolio-counts.js.map +1 -1
  416. package/dist/utils/proxy-body.cjs.map +1 -1
  417. package/dist/utils/proxy-body.d.cts +0 -11
  418. package/dist/utils/proxy-body.d.ts +0 -11
  419. package/dist/utils/proxy-body.js.map +1 -1
  420. package/dist/utils/time.cjs.map +1 -1
  421. package/dist/utils/time.d.cts +0 -5
  422. package/dist/utils/time.d.ts +0 -5
  423. package/dist/utils/time.js.map +1 -1
  424. package/dist/utils/use-collections.cjs.map +1 -1
  425. package/dist/utils/use-collections.d.cts +1 -11
  426. package/dist/utils/use-collections.d.ts +1 -11
  427. package/dist/utils/use-collections.js.map +1 -1
  428. package/dist/utils/use-intersection-active.cjs.map +1 -1
  429. package/dist/utils/use-intersection-active.d.cts +0 -7
  430. package/dist/utils/use-intersection-active.d.ts +0 -7
  431. package/dist/utils/use-intersection-active.js.map +1 -1
  432. package/dist/utils/use-notifications.cjs.map +1 -1
  433. package/dist/utils/use-notifications.js.map +1 -1
  434. package/dist/utils/use-orders.cjs.map +1 -1
  435. package/dist/utils/use-orders.d.cts +0 -2
  436. package/dist/utils/use-orders.d.ts +0 -2
  437. package/dist/utils/use-orders.js.map +1 -1
  438. package/dist/utils/use-profiles.cjs.map +1 -1
  439. package/dist/utils/use-profiles.js.map +1 -1
  440. package/dist/utils/use-remix-offers.cjs.map +1 -1
  441. package/dist/utils/use-remix-offers.d.cts +0 -1
  442. package/dist/utils/use-remix-offers.d.ts +0 -1
  443. package/dist/utils/use-remix-offers.js.map +1 -1
  444. package/dist/utils/use-rewards.cjs.map +1 -1
  445. package/dist/utils/use-rewards.d.cts +0 -4
  446. package/dist/utils/use-rewards.d.ts +0 -4
  447. package/dist/utils/use-rewards.js.map +1 -1
  448. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/collection-traits-tab.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport type { MedialaneClient } from \"@medialane/sdk/starknet\";\nimport type { ApiToken } from \"@medialane/sdk\";\nimport { Sparkles } from \"lucide-react\";\nimport { useCollectionTokens } from \"../utils/use-collections.js\";\nimport { useCollectionFilters } from \"./collection-filters.js\";\n\nconst FETCH_PAGE_SIZE = 100;\n// Rarity is a nice-to-have stat, not settlement data — cap the crawl so a\n// very large collection doesn't turn this tab into an unbounded fetch loop.\nconst MAX_TOKENS_FOR_RARITY = 2000;\n\nexport interface CollectionTraitsTabProps {\n getClient: () => MedialaneClient;\n contract: string;\n}\n\nexport function CollectionTraitsTab({ getClient, contract }: CollectionTraitsTabProps) {\n const [page, setPage] = useState(1);\n const [all, setAll] = useState<ApiToken[]>([]);\n const { tokens, meta, isLoading } = useCollectionTokens(getClient, contract, page, FETCH_PAGE_SIZE, \"recent\");\n\n useEffect(() => {\n if (tokens.length === 0) return;\n setAll((prev) => (page === 1 ? tokens : [...prev, ...tokens]));\n }, [tokens, page]);\n\n useEffect(() => {\n const total = Math.min(meta?.total ?? 0, MAX_TOKENS_FOR_RARITY);\n if (!isLoading && all.length > 0 && all.length < total) setPage((p) => p + 1);\n }, [isLoading, all.length, meta?.total]);\n\n const { traitSections } = useCollectionFilters(all, {}, () => {}, \"recent\", () => {});\n const sampleSize = all.length;\n const stillLoading = isLoading || (meta?.total != null && sampleSize < Math.min(meta.total, MAX_TOKENS_FOR_RARITY));\n\n if (traitSections.length === 0 && !stillLoading) {\n return (\n <div className=\"py-20 flex flex-col items-center gap-3 text-center\">\n <Sparkles className=\"h-10 w-10 text-muted-foreground/40\" />\n <p className=\"text-sm font-medium text-muted-foreground\">No traits found</p>\n <p className=\"text-xs text-muted-foreground/70 max-w-xs\">\n Items in this collection don&apos;t carry attribute metadata yet.\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-6\">\n {stillLoading && (\n <p className=\"text-xs text-muted-foreground\">Reading trait data — rarity updates as more items load…</p>\n )}\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4\">\n {traitSections.map((section) => (\n <div key={section.traitType} className=\"space-y-2\">\n <p className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">{section.traitType}</p>\n <div className=\"space-y-1.5\">\n {section.values.map(({ value, count }) => {\n const pct = sampleSize > 0 ? Math.round((count / sampleSize) * 1000) / 10 : 0;\n return (\n <div key={value} className=\"flex items-center justify-between gap-3 rounded-lg bg-muted/50 px-3 py-2\">\n <span className=\"text-sm font-medium truncate\">{value}</span>\n <span className=\"text-xs font-bold tabular-nums text-muted-foreground shrink-0\">\n {count} · {pct}%\n </span>\n </div>\n );\n })}\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAwCM;AAtCN,mBAAoC;AAGpC,0BAAyB;AACzB,6BAAoC;AACpC,gCAAqC;AAErC,MAAM,kBAAkB;AAGxB,MAAM,wBAAwB;AAOvB,SAAS,oBAAoB,EAAE,WAAW,SAAS,GAA6B;AACrF,QAAM,CAAC,MAAM,OAAO,QAAI,uBAAS,CAAC;AAClC,QAAM,CAAC,KAAK,MAAM,QAAI,uBAAqB,CAAC,CAAC;AAC7C,QAAM,EAAE,QAAQ,MAAM,UAAU,QAAI,4CAAoB,WAAW,UAAU,MAAM,iBAAiB,QAAQ;AAE5G,8BAAU,MAAM;AACd,QAAI,OAAO,WAAW,EAAG;AACzB,WAAO,CAAC,SAAU,SAAS,IAAI,SAAS,CAAC,GAAG,MAAM,GAAG,MAAM,CAAE;AAAA,EAC/D,GAAG,CAAC,QAAQ,IAAI,CAAC;AAEjB,8BAAU,MAAM;AACd,UAAM,QAAQ,KAAK,IAAI,MAAM,SAAS,GAAG,qBAAqB;AAC9D,QAAI,CAAC,aAAa,IAAI,SAAS,KAAK,IAAI,SAAS,MAAO,SAAQ,CAAC,MAAM,IAAI,CAAC;AAAA,EAC9E,GAAG,CAAC,WAAW,IAAI,QAAQ,MAAM,KAAK,CAAC;AAEvC,QAAM,EAAE,cAAc,QAAI,gDAAqB,KAAK,CAAC,GAAG,MAAM;AAAA,EAAC,GAAG,UAAU,MAAM;AAAA,EAAC,CAAC;AACpF,QAAM,aAAa,IAAI;AACvB,QAAM,eAAe,aAAc,MAAM,SAAS,QAAQ,aAAa,KAAK,IAAI,KAAK,OAAO,qBAAqB;AAEjH,MAAI,cAAc,WAAW,KAAK,CAAC,cAAc;AAC/C,WACE,6CAAC,SAAI,WAAU,sDACb;AAAA,kDAAC,gCAAS,WAAU,sCAAqC;AAAA,MACzD,4CAAC,OAAE,WAAU,6CAA4C,6BAAe;AAAA,MACxE,4CAAC,OAAE,WAAU,6CAA4C,0EAEzD;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,6CAAC,SAAI,WAAU,aACZ;AAAA,oBACC,4CAAC,OAAE,WAAU,iCAAgC,+EAAuD;AAAA,IAEtG,4CAAC,SAAI,WAAU,wDACZ,wBAAc,IAAI,CAAC,YAClB,6CAAC,SAA4B,WAAU,aACrC;AAAA,kDAAC,OAAE,WAAU,uEAAuE,kBAAQ,WAAU;AAAA,MACtG,4CAAC,SAAI,WAAU,eACZ,kBAAQ,OAAO,IAAI,CAAC,EAAE,OAAO,MAAM,MAAM;AACxC,cAAM,MAAM,aAAa,IAAI,KAAK,MAAO,QAAQ,aAAc,GAAI,IAAI,KAAK;AAC5E,eACE,6CAAC,SAAgB,WAAU,4EACzB;AAAA,sDAAC,UAAK,WAAU,gCAAgC,iBAAM;AAAA,UACtD,6CAAC,UAAK,WAAU,iEACb;AAAA;AAAA,YAAM;AAAA,YAAI;AAAA,YAAI;AAAA,aACjB;AAAA,aAJQ,KAKV;AAAA,MAEJ,CAAC,GACH;AAAA,SAdQ,QAAQ,SAelB,CACD,GACH;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/components/collection-traits-tab.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport type { MedialaneClient } from \"@medialane/sdk/starknet\";\nimport type { ApiToken } from \"@medialane/sdk\";\nimport { Sparkles } from \"lucide-react\";\nimport { useCollectionTokens } from \"../utils/use-collections.js\";\nimport { useCollectionFilters } from \"./collection-filters.js\";\n\nconst FETCH_PAGE_SIZE = 100;\n\nconst MAX_TOKENS_FOR_RARITY = 2000;\n\nexport interface CollectionTraitsTabProps {\n getClient: () => MedialaneClient;\n contract: string;\n}\n\nexport function CollectionTraitsTab({ getClient, contract }: CollectionTraitsTabProps) {\n const [page, setPage] = useState(1);\n const [all, setAll] = useState<ApiToken[]>([]);\n const { tokens, meta, isLoading } = useCollectionTokens(getClient, contract, page, FETCH_PAGE_SIZE, \"recent\");\n\n useEffect(() => {\n if (tokens.length === 0) return;\n setAll((prev) => (page === 1 ? tokens : [...prev, ...tokens]));\n }, [tokens, page]);\n\n useEffect(() => {\n const total = Math.min(meta?.total ?? 0, MAX_TOKENS_FOR_RARITY);\n if (!isLoading && all.length > 0 && all.length < total) setPage((p) => p + 1);\n }, [isLoading, all.length, meta?.total]);\n\n const { traitSections } = useCollectionFilters(all, {}, () => {}, \"recent\", () => {});\n const sampleSize = all.length;\n const stillLoading = isLoading || (meta?.total != null && sampleSize < Math.min(meta.total, MAX_TOKENS_FOR_RARITY));\n\n if (traitSections.length === 0 && !stillLoading) {\n return (\n <div className=\"py-20 flex flex-col items-center gap-3 text-center\">\n <Sparkles className=\"h-10 w-10 text-muted-foreground/40\" />\n <p className=\"text-sm font-medium text-muted-foreground\">No traits found</p>\n <p className=\"text-xs text-muted-foreground/70 max-w-xs\">\n Items in this collection don&apos;t carry attribute metadata yet.\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-6\">\n {stillLoading && (\n <p className=\"text-xs text-muted-foreground\">Reading trait data — rarity updates as more items load…</p>\n )}\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4\">\n {traitSections.map((section) => (\n <div key={section.traitType} className=\"space-y-2\">\n <p className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">{section.traitType}</p>\n <div className=\"space-y-1.5\">\n {section.values.map(({ value, count }) => {\n const pct = sampleSize > 0 ? Math.round((count / sampleSize) * 1000) / 10 : 0;\n return (\n <div key={value} className=\"flex items-center justify-between gap-3 rounded-lg bg-muted/50 px-3 py-2\">\n <span className=\"text-sm font-medium truncate\">{value}</span>\n <span className=\"text-xs font-bold tabular-nums text-muted-foreground shrink-0\">\n {count} · {pct}%\n </span>\n </div>\n );\n })}\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAuCM;AArCN,mBAAoC;AAGpC,0BAAyB;AACzB,6BAAoC;AACpC,gCAAqC;AAErC,MAAM,kBAAkB;AAExB,MAAM,wBAAwB;AAOvB,SAAS,oBAAoB,EAAE,WAAW,SAAS,GAA6B;AACrF,QAAM,CAAC,MAAM,OAAO,QAAI,uBAAS,CAAC;AAClC,QAAM,CAAC,KAAK,MAAM,QAAI,uBAAqB,CAAC,CAAC;AAC7C,QAAM,EAAE,QAAQ,MAAM,UAAU,QAAI,4CAAoB,WAAW,UAAU,MAAM,iBAAiB,QAAQ;AAE5G,8BAAU,MAAM;AACd,QAAI,OAAO,WAAW,EAAG;AACzB,WAAO,CAAC,SAAU,SAAS,IAAI,SAAS,CAAC,GAAG,MAAM,GAAG,MAAM,CAAE;AAAA,EAC/D,GAAG,CAAC,QAAQ,IAAI,CAAC;AAEjB,8BAAU,MAAM;AACd,UAAM,QAAQ,KAAK,IAAI,MAAM,SAAS,GAAG,qBAAqB;AAC9D,QAAI,CAAC,aAAa,IAAI,SAAS,KAAK,IAAI,SAAS,MAAO,SAAQ,CAAC,MAAM,IAAI,CAAC;AAAA,EAC9E,GAAG,CAAC,WAAW,IAAI,QAAQ,MAAM,KAAK,CAAC;AAEvC,QAAM,EAAE,cAAc,QAAI,gDAAqB,KAAK,CAAC,GAAG,MAAM;AAAA,EAAC,GAAG,UAAU,MAAM;AAAA,EAAC,CAAC;AACpF,QAAM,aAAa,IAAI;AACvB,QAAM,eAAe,aAAc,MAAM,SAAS,QAAQ,aAAa,KAAK,IAAI,KAAK,OAAO,qBAAqB;AAEjH,MAAI,cAAc,WAAW,KAAK,CAAC,cAAc;AAC/C,WACE,6CAAC,SAAI,WAAU,sDACb;AAAA,kDAAC,gCAAS,WAAU,sCAAqC;AAAA,MACzD,4CAAC,OAAE,WAAU,6CAA4C,6BAAe;AAAA,MACxE,4CAAC,OAAE,WAAU,6CAA4C,0EAEzD;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,6CAAC,SAAI,WAAU,aACZ;AAAA,oBACC,4CAAC,OAAE,WAAU,iCAAgC,+EAAuD;AAAA,IAEtG,4CAAC,SAAI,WAAU,wDACZ,wBAAc,IAAI,CAAC,YAClB,6CAAC,SAA4B,WAAU,aACrC;AAAA,kDAAC,OAAE,WAAU,uEAAuE,kBAAQ,WAAU;AAAA,MACtG,4CAAC,SAAI,WAAU,eACZ,kBAAQ,OAAO,IAAI,CAAC,EAAE,OAAO,MAAM,MAAM;AACxC,cAAM,MAAM,aAAa,IAAI,KAAK,MAAO,QAAQ,aAAc,GAAI,IAAI,KAAK;AAC5E,eACE,6CAAC,SAAgB,WAAU,4EACzB;AAAA,sDAAC,UAAK,WAAU,gCAAgC,iBAAM;AAAA,UACtD,6CAAC,UAAK,WAAU,iEACb;AAAA;AAAA,YAAM;AAAA,YAAI;AAAA,YAAI;AAAA,aACjB;AAAA,aAJQ,KAKV;AAAA,MAEJ,CAAC,GACH;AAAA,SAdQ,QAAQ,SAelB,CACD,GACH;AAAA,KACF;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/collection-traits-tab.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport type { MedialaneClient } from \"@medialane/sdk/starknet\";\nimport type { ApiToken } from \"@medialane/sdk\";\nimport { Sparkles } from \"lucide-react\";\nimport { useCollectionTokens } from \"../utils/use-collections.js\";\nimport { useCollectionFilters } from \"./collection-filters.js\";\n\nconst FETCH_PAGE_SIZE = 100;\n// Rarity is a nice-to-have stat, not settlement data — cap the crawl so a\n// very large collection doesn't turn this tab into an unbounded fetch loop.\nconst MAX_TOKENS_FOR_RARITY = 2000;\n\nexport interface CollectionTraitsTabProps {\n getClient: () => MedialaneClient;\n contract: string;\n}\n\nexport function CollectionTraitsTab({ getClient, contract }: CollectionTraitsTabProps) {\n const [page, setPage] = useState(1);\n const [all, setAll] = useState<ApiToken[]>([]);\n const { tokens, meta, isLoading } = useCollectionTokens(getClient, contract, page, FETCH_PAGE_SIZE, \"recent\");\n\n useEffect(() => {\n if (tokens.length === 0) return;\n setAll((prev) => (page === 1 ? tokens : [...prev, ...tokens]));\n }, [tokens, page]);\n\n useEffect(() => {\n const total = Math.min(meta?.total ?? 0, MAX_TOKENS_FOR_RARITY);\n if (!isLoading && all.length > 0 && all.length < total) setPage((p) => p + 1);\n }, [isLoading, all.length, meta?.total]);\n\n const { traitSections } = useCollectionFilters(all, {}, () => {}, \"recent\", () => {});\n const sampleSize = all.length;\n const stillLoading = isLoading || (meta?.total != null && sampleSize < Math.min(meta.total, MAX_TOKENS_FOR_RARITY));\n\n if (traitSections.length === 0 && !stillLoading) {\n return (\n <div className=\"py-20 flex flex-col items-center gap-3 text-center\">\n <Sparkles className=\"h-10 w-10 text-muted-foreground/40\" />\n <p className=\"text-sm font-medium text-muted-foreground\">No traits found</p>\n <p className=\"text-xs text-muted-foreground/70 max-w-xs\">\n Items in this collection don&apos;t carry attribute metadata yet.\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-6\">\n {stillLoading && (\n <p className=\"text-xs text-muted-foreground\">Reading trait data — rarity updates as more items load…</p>\n )}\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4\">\n {traitSections.map((section) => (\n <div key={section.traitType} className=\"space-y-2\">\n <p className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">{section.traitType}</p>\n <div className=\"space-y-1.5\">\n {section.values.map(({ value, count }) => {\n const pct = sampleSize > 0 ? Math.round((count / sampleSize) * 1000) / 10 : 0;\n return (\n <div key={value} className=\"flex items-center justify-between gap-3 rounded-lg bg-muted/50 px-3 py-2\">\n <span className=\"text-sm font-medium truncate\">{value}</span>\n <span className=\"text-xs font-bold tabular-nums text-muted-foreground shrink-0\">\n {count} · {pct}%\n </span>\n </div>\n );\n })}\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n}\n"],"mappings":";AAwCM,SACE,KADF;AAtCN,SAAS,UAAU,iBAAiB;AAGpC,SAAS,gBAAgB;AACzB,SAAS,2BAA2B;AACpC,SAAS,4BAA4B;AAErC,MAAM,kBAAkB;AAGxB,MAAM,wBAAwB;AAOvB,SAAS,oBAAoB,EAAE,WAAW,SAAS,GAA6B;AACrF,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,CAAC;AAClC,QAAM,CAAC,KAAK,MAAM,IAAI,SAAqB,CAAC,CAAC;AAC7C,QAAM,EAAE,QAAQ,MAAM,UAAU,IAAI,oBAAoB,WAAW,UAAU,MAAM,iBAAiB,QAAQ;AAE5G,YAAU,MAAM;AACd,QAAI,OAAO,WAAW,EAAG;AACzB,WAAO,CAAC,SAAU,SAAS,IAAI,SAAS,CAAC,GAAG,MAAM,GAAG,MAAM,CAAE;AAAA,EAC/D,GAAG,CAAC,QAAQ,IAAI,CAAC;AAEjB,YAAU,MAAM;AACd,UAAM,QAAQ,KAAK,IAAI,MAAM,SAAS,GAAG,qBAAqB;AAC9D,QAAI,CAAC,aAAa,IAAI,SAAS,KAAK,IAAI,SAAS,MAAO,SAAQ,CAAC,MAAM,IAAI,CAAC;AAAA,EAC9E,GAAG,CAAC,WAAW,IAAI,QAAQ,MAAM,KAAK,CAAC;AAEvC,QAAM,EAAE,cAAc,IAAI,qBAAqB,KAAK,CAAC,GAAG,MAAM;AAAA,EAAC,GAAG,UAAU,MAAM;AAAA,EAAC,CAAC;AACpF,QAAM,aAAa,IAAI;AACvB,QAAM,eAAe,aAAc,MAAM,SAAS,QAAQ,aAAa,KAAK,IAAI,KAAK,OAAO,qBAAqB;AAEjH,MAAI,cAAc,WAAW,KAAK,CAAC,cAAc;AAC/C,WACE,qBAAC,SAAI,WAAU,sDACb;AAAA,0BAAC,YAAS,WAAU,sCAAqC;AAAA,MACzD,oBAAC,OAAE,WAAU,6CAA4C,6BAAe;AAAA,MACxE,oBAAC,OAAE,WAAU,6CAA4C,0EAEzD;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,qBAAC,SAAI,WAAU,aACZ;AAAA,oBACC,oBAAC,OAAE,WAAU,iCAAgC,+EAAuD;AAAA,IAEtG,oBAAC,SAAI,WAAU,wDACZ,wBAAc,IAAI,CAAC,YAClB,qBAAC,SAA4B,WAAU,aACrC;AAAA,0BAAC,OAAE,WAAU,uEAAuE,kBAAQ,WAAU;AAAA,MACtG,oBAAC,SAAI,WAAU,eACZ,kBAAQ,OAAO,IAAI,CAAC,EAAE,OAAO,MAAM,MAAM;AACxC,cAAM,MAAM,aAAa,IAAI,KAAK,MAAO,QAAQ,aAAc,GAAI,IAAI,KAAK;AAC5E,eACE,qBAAC,SAAgB,WAAU,4EACzB;AAAA,8BAAC,UAAK,WAAU,gCAAgC,iBAAM;AAAA,UACtD,qBAAC,UAAK,WAAU,iEACb;AAAA;AAAA,YAAM;AAAA,YAAI;AAAA,YAAI;AAAA,aACjB;AAAA,aAJQ,KAKV;AAAA,MAEJ,CAAC,GACH;AAAA,SAdQ,QAAQ,SAelB,CACD,GACH;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/components/collection-traits-tab.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport type { MedialaneClient } from \"@medialane/sdk/starknet\";\nimport type { ApiToken } from \"@medialane/sdk\";\nimport { Sparkles } from \"lucide-react\";\nimport { useCollectionTokens } from \"../utils/use-collections.js\";\nimport { useCollectionFilters } from \"./collection-filters.js\";\n\nconst FETCH_PAGE_SIZE = 100;\n\nconst MAX_TOKENS_FOR_RARITY = 2000;\n\nexport interface CollectionTraitsTabProps {\n getClient: () => MedialaneClient;\n contract: string;\n}\n\nexport function CollectionTraitsTab({ getClient, contract }: CollectionTraitsTabProps) {\n const [page, setPage] = useState(1);\n const [all, setAll] = useState<ApiToken[]>([]);\n const { tokens, meta, isLoading } = useCollectionTokens(getClient, contract, page, FETCH_PAGE_SIZE, \"recent\");\n\n useEffect(() => {\n if (tokens.length === 0) return;\n setAll((prev) => (page === 1 ? tokens : [...prev, ...tokens]));\n }, [tokens, page]);\n\n useEffect(() => {\n const total = Math.min(meta?.total ?? 0, MAX_TOKENS_FOR_RARITY);\n if (!isLoading && all.length > 0 && all.length < total) setPage((p) => p + 1);\n }, [isLoading, all.length, meta?.total]);\n\n const { traitSections } = useCollectionFilters(all, {}, () => {}, \"recent\", () => {});\n const sampleSize = all.length;\n const stillLoading = isLoading || (meta?.total != null && sampleSize < Math.min(meta.total, MAX_TOKENS_FOR_RARITY));\n\n if (traitSections.length === 0 && !stillLoading) {\n return (\n <div className=\"py-20 flex flex-col items-center gap-3 text-center\">\n <Sparkles className=\"h-10 w-10 text-muted-foreground/40\" />\n <p className=\"text-sm font-medium text-muted-foreground\">No traits found</p>\n <p className=\"text-xs text-muted-foreground/70 max-w-xs\">\n Items in this collection don&apos;t carry attribute metadata yet.\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-6\">\n {stillLoading && (\n <p className=\"text-xs text-muted-foreground\">Reading trait data — rarity updates as more items load…</p>\n )}\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4\">\n {traitSections.map((section) => (\n <div key={section.traitType} className=\"space-y-2\">\n <p className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">{section.traitType}</p>\n <div className=\"space-y-1.5\">\n {section.values.map(({ value, count }) => {\n const pct = sampleSize > 0 ? Math.round((count / sampleSize) * 1000) / 10 : 0;\n return (\n <div key={value} className=\"flex items-center justify-between gap-3 rounded-lg bg-muted/50 px-3 py-2\">\n <span className=\"text-sm font-medium truncate\">{value}</span>\n <span className=\"text-xs font-bold tabular-nums text-muted-foreground shrink-0\">\n {count} · {pct}%\n </span>\n </div>\n );\n })}\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n}\n"],"mappings":";AAuCM,SACE,KADF;AArCN,SAAS,UAAU,iBAAiB;AAGpC,SAAS,gBAAgB;AACzB,SAAS,2BAA2B;AACpC,SAAS,4BAA4B;AAErC,MAAM,kBAAkB;AAExB,MAAM,wBAAwB;AAOvB,SAAS,oBAAoB,EAAE,WAAW,SAAS,GAA6B;AACrF,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,CAAC;AAClC,QAAM,CAAC,KAAK,MAAM,IAAI,SAAqB,CAAC,CAAC;AAC7C,QAAM,EAAE,QAAQ,MAAM,UAAU,IAAI,oBAAoB,WAAW,UAAU,MAAM,iBAAiB,QAAQ;AAE5G,YAAU,MAAM;AACd,QAAI,OAAO,WAAW,EAAG;AACzB,WAAO,CAAC,SAAU,SAAS,IAAI,SAAS,CAAC,GAAG,MAAM,GAAG,MAAM,CAAE;AAAA,EAC/D,GAAG,CAAC,QAAQ,IAAI,CAAC;AAEjB,YAAU,MAAM;AACd,UAAM,QAAQ,KAAK,IAAI,MAAM,SAAS,GAAG,qBAAqB;AAC9D,QAAI,CAAC,aAAa,IAAI,SAAS,KAAK,IAAI,SAAS,MAAO,SAAQ,CAAC,MAAM,IAAI,CAAC;AAAA,EAC9E,GAAG,CAAC,WAAW,IAAI,QAAQ,MAAM,KAAK,CAAC;AAEvC,QAAM,EAAE,cAAc,IAAI,qBAAqB,KAAK,CAAC,GAAG,MAAM;AAAA,EAAC,GAAG,UAAU,MAAM;AAAA,EAAC,CAAC;AACpF,QAAM,aAAa,IAAI;AACvB,QAAM,eAAe,aAAc,MAAM,SAAS,QAAQ,aAAa,KAAK,IAAI,KAAK,OAAO,qBAAqB;AAEjH,MAAI,cAAc,WAAW,KAAK,CAAC,cAAc;AAC/C,WACE,qBAAC,SAAI,WAAU,sDACb;AAAA,0BAAC,YAAS,WAAU,sCAAqC;AAAA,MACzD,oBAAC,OAAE,WAAU,6CAA4C,6BAAe;AAAA,MACxE,oBAAC,OAAE,WAAU,6CAA4C,0EAEzD;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,qBAAC,SAAI,WAAU,aACZ;AAAA,oBACC,oBAAC,OAAE,WAAU,iCAAgC,+EAAuD;AAAA,IAEtG,oBAAC,SAAI,WAAU,wDACZ,wBAAc,IAAI,CAAC,YAClB,qBAAC,SAA4B,WAAU,aACrC;AAAA,0BAAC,OAAE,WAAU,uEAAuE,kBAAQ,WAAU;AAAA,MACtG,oBAAC,SAAI,WAAU,eACZ,kBAAQ,OAAO,IAAI,CAAC,EAAE,OAAO,MAAM,MAAM;AACxC,cAAM,MAAM,aAAa,IAAI,KAAK,MAAO,QAAQ,aAAc,GAAI,IAAI,KAAK;AAC5E,eACE,qBAAC,SAAgB,WAAU,4EACzB;AAAA,8BAAC,UAAK,WAAU,gCAAgC,iBAAM;AAAA,UACtD,qBAAC,UAAK,WAAU,iEACb;AAAA;AAAA,YAAM;AAAA,YAAI;AAAA,YAAI;AAAA,aACjB;AAAA,aAJQ,KAKV;AAAA,MAEJ,CAAC,GACH;AAAA,SAdQ,QAAQ,SAelB,CACD,GACH;AAAA,KACF;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/community-rewards-section.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { ArrowRight, Zap, Palette, ShoppingBag, MessageSquare } from \"lucide-react\";\nimport { AddressDisplay } from \"./address-display.js\";\n\nexport interface CommunityRewardsEntry {\n address: string;\n totalXp: number;\n}\n\nexport interface CommunityRewardsSectionProps {\n entries: CommunityRewardsEntry[];\n isLoading?: boolean;\n rewardsHref: string;\n creatorHref: (address: string) => string;\n}\n\nconst EARN_ACTIONS = [\n { icon: Zap, label: \"Mint\" },\n { icon: Palette, label: \"Create\" },\n { icon: ShoppingBag, label: \"Trade\" },\n { icon: MessageSquare, label: \"Engage\" },\n];\n\nexport function CommunityRewardsSection({\n entries,\n isLoading = false,\n rewardsHref,\n creatorHref,\n}: CommunityRewardsSectionProps) {\n return (\n <section className=\"rounded-2xl bg-muted/50 dark:bg-card overflow-hidden grid lg:grid-cols-2 max-lg:divide-y lg:divide-x divide-brand-orange/20\">\n\n {/* Left — info panel */}\n <div className=\"px-7 py-8 sm:px-9 flex flex-col gap-6\">\n <div>\n {/* Creator's Fund eyebrow — shared with CreatorAirdropBanner */}\n <span className=\"text-xs font-bold uppercase tracking-widest text-brand-orange\">\n Creator&apos;s Fund\n </span>\n <h2 className=\"mt-4 text-2xl font-bold tracking-tight leading-tight\">\n Community Rewards\n </h2>\n <p className=\"mt-1.5 text-sm text-muted-foreground leading-relaxed\">\n Earn XP. Share the Creator&apos;s Fund.\n </p>\n </div>\n\n {/* Recently active — live rail sourced from the same entries as the\n member cards on the right, no rank/podium framing. */}\n {!isLoading && entries.length > 0 && (\n <div className=\"border-y border-brand-orange/20 py-3\">\n <p className=\"text-2xs font-bold uppercase tracking-widest text-muted-foreground mb-2\">\n Recently active\n </p>\n <div className=\"flex -space-x-2\">\n {entries.slice(0, 5).map((entry) => (\n <span\n key={entry.address}\n title={`${entry.totalXp.toLocaleString()} XP`}\n className=\"flex h-7 w-7 items-center justify-center rounded-full border-2 border-background bg-brand-orange/15 text-[9px] font-bold text-brand-orange\"\n >\n {entry.address.slice(2, 4).toUpperCase()}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {/* Earn actions — plain text row */}\n <div className=\"flex flex-wrap gap-x-5 gap-y-2\">\n {EARN_ACTIONS.map(({ icon: Icon, label }) => (\n <span\n key={label}\n className=\"flex items-center gap-1.5 text-xs font-medium text-muted-foreground\"\n >\n <Icon className=\"h-3 w-3 text-brand-orange/70\" />\n {label}\n </span>\n ))}\n </div>\n\n <Link\n href={rewardsHref}\n className=\"mt-auto inline-flex items-center justify-center gap-2 rounded-xl bg-brand-orange px-6 py-3 text-sm font-semibold text-white transition-all hover:brightness-110 active:scale-[0.98]\"\n >\n Start earning XP\n <ArrowRight className=\"h-3.5 w-3.5\" />\n </Link>\n </div>\n\n {/* Right — member cards */}\n <div className=\"p-5 sm:p-6\">\n {!isLoading && entries.length > 0 ? (\n <div className=\"grid grid-cols-2 gap-3 h-full\">\n {entries.slice(0, 4).map((entry) => (\n <Link\n key={entry.address}\n href={creatorHref(entry.address)}\n className=\"group relative rounded-xl bg-card dark:bg-muted/30 hover:bg-card/70 dark:hover:bg-muted/50 overflow-hidden transition-colors flex flex-col justify-between p-4\"\n >\n <div className=\"absolute inset-x-0 top-0 h-0.5 bg-brand-orange/40\" />\n\n {/* XP — hero number */}\n <div className=\"space-y-0.5 pt-1\">\n <p className=\"text-2xl font-black tabular-nums leading-none\">\n {entry.totalXp.toLocaleString()}\n </p>\n <p className=\"text-2xs text-muted-foreground\">XP earned</p>\n </div>\n\n <AddressDisplay\n address={entry.address}\n chars={4}\n showCopy={false}\n className=\"text-xs font-medium text-muted-foreground group-hover:text-foreground transition-colors\"\n />\n </Link>\n ))}\n </div>\n ) : (\n <div className=\"grid grid-cols-2 gap-3 h-full\">\n {Array.from({ length: 4 }).map((_, i) => (\n <div key={i} className=\"min-h-[100px] rounded-xl bg-card dark:bg-muted/30 animate-pulse\" />\n ))}\n </div>\n )}\n </div>\n </section>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAoCQ;AAlCR,kBAAiB;AACjB,0BAAqE;AACrE,6BAA+B;AAc/B,MAAM,eAAe;AAAA,EACnB,EAAE,MAAM,yBAAK,OAAO,OAAO;AAAA,EAC3B,EAAE,MAAM,6BAAS,OAAO,SAAS;AAAA,EACjC,EAAE,MAAM,iCAAa,OAAO,QAAQ;AAAA,EACpC,EAAE,MAAM,mCAAe,OAAO,SAAS;AACzC;AAEO,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AACF,GAAiC;AAC/B,SACE,6CAAC,aAAQ,WAAU,+HAGjB;AAAA,iDAAC,SAAI,WAAU,yCACb;AAAA,mDAAC,SAEC;AAAA,oDAAC,UAAK,WAAU,iEAAgE,4BAEhF;AAAA,QACA,4CAAC,QAAG,WAAU,wDAAuD,+BAErE;AAAA,QACA,4CAAC,OAAE,WAAU,wDAAuD,gDAEpE;AAAA,SACF;AAAA,MAIC,CAAC,aAAa,QAAQ,SAAS,KAC9B,6CAAC,SAAI,WAAU,wCACb;AAAA,oDAAC,OAAE,WAAU,2EAA0E,6BAEvF;AAAA,QACA,4CAAC,SAAI,WAAU,mBACZ,kBAAQ,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,UACxB;AAAA,UAAC;AAAA;AAAA,YAEC,OAAO,GAAG,MAAM,QAAQ,eAAe,CAAC;AAAA,YACxC,WAAU;AAAA,YAET,gBAAM,QAAQ,MAAM,GAAG,CAAC,EAAE,YAAY;AAAA;AAAA,UAJlC,MAAM;AAAA,QAKb,CACD,GACH;AAAA,SACF;AAAA,MAIF,4CAAC,SAAI,WAAU,kCACZ,uBAAa,IAAI,CAAC,EAAE,MAAM,MAAM,MAAM,MACrC;AAAA,QAAC;AAAA;AAAA,UAEC,WAAU;AAAA,UAEV;AAAA,wDAAC,QAAK,WAAU,gCAA+B;AAAA,YAC9C;AAAA;AAAA;AAAA,QAJI;AAAA,MAKP,CACD,GACH;AAAA,MAEA;AAAA,QAAC,YAAAA;AAAA,QAAA;AAAA,UACC,MAAM;AAAA,UACN,WAAU;AAAA,UACX;AAAA;AAAA,YAEC,4CAAC,kCAAW,WAAU,eAAc;AAAA;AAAA;AAAA,MACtC;AAAA,OACF;AAAA,IAGA,4CAAC,SAAI,WAAU,cACZ,WAAC,aAAa,QAAQ,SAAS,IAC9B,4CAAC,SAAI,WAAU,iCACZ,kBAAQ,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,UACxB;AAAA,MAAC,YAAAA;AAAA,MAAA;AAAA,QAEC,MAAM,YAAY,MAAM,OAAO;AAAA,QAC/B,WAAU;AAAA,QAEV;AAAA,sDAAC,SAAI,WAAU,qDAAoD;AAAA,UAGnE,6CAAC,SAAI,WAAU,oBACb;AAAA,wDAAC,OAAE,WAAU,iDACV,gBAAM,QAAQ,eAAe,GAChC;AAAA,YACA,4CAAC,OAAE,WAAU,kCAAiC,uBAAS;AAAA,aACzD;AAAA,UAEA;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,MAAM;AAAA,cACf,OAAO;AAAA,cACP,UAAU;AAAA,cACV,WAAU;AAAA;AAAA,UACZ;AAAA;AAAA;AAAA,MAnBK,MAAM;AAAA,IAoBb,CACD,GACH,IAEA,4CAAC,SAAI,WAAU,iCACZ,gBAAM,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,MACjC,4CAAC,SAAY,WAAU,qEAAb,CAA+E,CAC1F,GACH,GAEJ;AAAA,KACF;AAEJ;","names":["Link"]}
1
+ {"version":3,"sources":["../../src/components/community-rewards-section.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { ArrowRight, Zap, Palette, ShoppingBag, MessageSquare } from \"lucide-react\";\nimport { AddressDisplay } from \"./address-display.js\";\n\nexport interface CommunityRewardsEntry {\n address: string;\n totalXp: number;\n}\n\nexport interface CommunityRewardsSectionProps {\n entries: CommunityRewardsEntry[];\n isLoading?: boolean;\n rewardsHref: string;\n creatorHref: (address: string) => string;\n}\n\nconst EARN_ACTIONS = [\n { icon: Zap, label: \"Mint\" },\n { icon: Palette, label: \"Create\" },\n { icon: ShoppingBag, label: \"Trade\" },\n { icon: MessageSquare, label: \"Engage\" },\n];\n\nexport function CommunityRewardsSection({\n entries,\n isLoading = false,\n rewardsHref,\n creatorHref,\n}: CommunityRewardsSectionProps) {\n return (\n <section className=\"rounded-2xl bg-muted/50 dark:bg-card overflow-hidden grid lg:grid-cols-2 max-lg:divide-y lg:divide-x divide-brand-orange/20\">\n\n <div className=\"px-7 py-8 sm:px-9 flex flex-col gap-6\">\n <div>\n\n <span className=\"text-xs font-bold uppercase tracking-widest text-brand-orange\">\n Creator&apos;s Fund\n </span>\n <h2 className=\"mt-4 text-2xl font-bold tracking-tight leading-tight\">\n Community Rewards\n </h2>\n <p className=\"mt-1.5 text-sm text-muted-foreground leading-relaxed\">\n Earn XP. Share the Creator&apos;s Fund.\n </p>\n </div>\n\n {!isLoading && entries.length > 0 && (\n <div className=\"border-y border-brand-orange/20 py-3\">\n <p className=\"text-2xs font-bold uppercase tracking-widest text-muted-foreground mb-2\">\n Recently active\n </p>\n <div className=\"flex -space-x-2\">\n {entries.slice(0, 5).map((entry) => (\n <span\n key={entry.address}\n title={`${entry.totalXp.toLocaleString()} XP`}\n className=\"flex h-7 w-7 items-center justify-center rounded-full border-2 border-background bg-brand-orange/15 text-[9px] font-bold text-brand-orange\"\n >\n {entry.address.slice(2, 4).toUpperCase()}\n </span>\n ))}\n </div>\n </div>\n )}\n\n <div className=\"flex flex-wrap gap-x-5 gap-y-2\">\n {EARN_ACTIONS.map(({ icon: Icon, label }) => (\n <span\n key={label}\n className=\"flex items-center gap-1.5 text-xs font-medium text-muted-foreground\"\n >\n <Icon className=\"h-3 w-3 text-brand-orange/70\" />\n {label}\n </span>\n ))}\n </div>\n\n <Link\n href={rewardsHref}\n className=\"mt-auto inline-flex items-center justify-center gap-2 rounded-xl bg-brand-orange px-6 py-3 text-sm font-semibold text-white transition-all hover:brightness-110 active:scale-[0.98]\"\n >\n Start earning XP\n <ArrowRight className=\"h-3.5 w-3.5\" />\n </Link>\n </div>\n\n <div className=\"p-5 sm:p-6\">\n {!isLoading && entries.length > 0 ? (\n <div className=\"grid grid-cols-2 gap-3 h-full\">\n {entries.slice(0, 4).map((entry) => (\n <Link\n key={entry.address}\n href={creatorHref(entry.address)}\n className=\"group relative rounded-xl bg-card dark:bg-muted/30 hover:bg-card/70 dark:hover:bg-muted/50 overflow-hidden transition-colors flex flex-col justify-between p-4\"\n >\n <div className=\"absolute inset-x-0 top-0 h-0.5 bg-brand-orange/40\" />\n\n <div className=\"space-y-0.5 pt-1\">\n <p className=\"text-2xl font-black tabular-nums leading-none\">\n {entry.totalXp.toLocaleString()}\n </p>\n <p className=\"text-2xs text-muted-foreground\">XP earned</p>\n </div>\n\n <AddressDisplay\n address={entry.address}\n chars={4}\n showCopy={false}\n className=\"text-xs font-medium text-muted-foreground group-hover:text-foreground transition-colors\"\n />\n </Link>\n ))}\n </div>\n ) : (\n <div className=\"grid grid-cols-2 gap-3 h-full\">\n {Array.from({ length: 4 }).map((_, i) => (\n <div key={i} className=\"min-h-[100px] rounded-xl bg-card dark:bg-muted/30 animate-pulse\" />\n ))}\n </div>\n )}\n </div>\n </section>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAmCQ;AAjCR,kBAAiB;AACjB,0BAAqE;AACrE,6BAA+B;AAc/B,MAAM,eAAe;AAAA,EACnB,EAAE,MAAM,yBAAK,OAAO,OAAO;AAAA,EAC3B,EAAE,MAAM,6BAAS,OAAO,SAAS;AAAA,EACjC,EAAE,MAAM,iCAAa,OAAO,QAAQ;AAAA,EACpC,EAAE,MAAM,mCAAe,OAAO,SAAS;AACzC;AAEO,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AACF,GAAiC;AAC/B,SACE,6CAAC,aAAQ,WAAU,+HAEjB;AAAA,iDAAC,SAAI,WAAU,yCACb;AAAA,mDAAC,SAEC;AAAA,oDAAC,UAAK,WAAU,iEAAgE,4BAEhF;AAAA,QACA,4CAAC,QAAG,WAAU,wDAAuD,+BAErE;AAAA,QACA,4CAAC,OAAE,WAAU,wDAAuD,gDAEpE;AAAA,SACF;AAAA,MAEC,CAAC,aAAa,QAAQ,SAAS,KAC9B,6CAAC,SAAI,WAAU,wCACb;AAAA,oDAAC,OAAE,WAAU,2EAA0E,6BAEvF;AAAA,QACA,4CAAC,SAAI,WAAU,mBACZ,kBAAQ,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,UACxB;AAAA,UAAC;AAAA;AAAA,YAEC,OAAO,GAAG,MAAM,QAAQ,eAAe,CAAC;AAAA,YACxC,WAAU;AAAA,YAET,gBAAM,QAAQ,MAAM,GAAG,CAAC,EAAE,YAAY;AAAA;AAAA,UAJlC,MAAM;AAAA,QAKb,CACD,GACH;AAAA,SACF;AAAA,MAGF,4CAAC,SAAI,WAAU,kCACZ,uBAAa,IAAI,CAAC,EAAE,MAAM,MAAM,MAAM,MACrC;AAAA,QAAC;AAAA;AAAA,UAEC,WAAU;AAAA,UAEV;AAAA,wDAAC,QAAK,WAAU,gCAA+B;AAAA,YAC9C;AAAA;AAAA;AAAA,QAJI;AAAA,MAKP,CACD,GACH;AAAA,MAEA;AAAA,QAAC,YAAAA;AAAA,QAAA;AAAA,UACC,MAAM;AAAA,UACN,WAAU;AAAA,UACX;AAAA;AAAA,YAEC,4CAAC,kCAAW,WAAU,eAAc;AAAA;AAAA;AAAA,MACtC;AAAA,OACF;AAAA,IAEA,4CAAC,SAAI,WAAU,cACZ,WAAC,aAAa,QAAQ,SAAS,IAC9B,4CAAC,SAAI,WAAU,iCACZ,kBAAQ,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,UACxB;AAAA,MAAC,YAAAA;AAAA,MAAA;AAAA,QAEC,MAAM,YAAY,MAAM,OAAO;AAAA,QAC/B,WAAU;AAAA,QAEV;AAAA,sDAAC,SAAI,WAAU,qDAAoD;AAAA,UAEnE,6CAAC,SAAI,WAAU,oBACb;AAAA,wDAAC,OAAE,WAAU,iDACV,gBAAM,QAAQ,eAAe,GAChC;AAAA,YACA,4CAAC,OAAE,WAAU,kCAAiC,uBAAS;AAAA,aACzD;AAAA,UAEA;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,MAAM;AAAA,cACf,OAAO;AAAA,cACP,UAAU;AAAA,cACV,WAAU;AAAA;AAAA,UACZ;AAAA;AAAA;AAAA,MAlBK,MAAM;AAAA,IAmBb,CACD,GACH,IAEA,4CAAC,SAAI,WAAU,iCACZ,gBAAM,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,MACjC,4CAAC,SAAY,WAAU,qEAAb,CAA+E,CAC1F,GACH,GAEJ;AAAA,KACF;AAEJ;","names":["Link"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/community-rewards-section.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { ArrowRight, Zap, Palette, ShoppingBag, MessageSquare } from \"lucide-react\";\nimport { AddressDisplay } from \"./address-display.js\";\n\nexport interface CommunityRewardsEntry {\n address: string;\n totalXp: number;\n}\n\nexport interface CommunityRewardsSectionProps {\n entries: CommunityRewardsEntry[];\n isLoading?: boolean;\n rewardsHref: string;\n creatorHref: (address: string) => string;\n}\n\nconst EARN_ACTIONS = [\n { icon: Zap, label: \"Mint\" },\n { icon: Palette, label: \"Create\" },\n { icon: ShoppingBag, label: \"Trade\" },\n { icon: MessageSquare, label: \"Engage\" },\n];\n\nexport function CommunityRewardsSection({\n entries,\n isLoading = false,\n rewardsHref,\n creatorHref,\n}: CommunityRewardsSectionProps) {\n return (\n <section className=\"rounded-2xl bg-muted/50 dark:bg-card overflow-hidden grid lg:grid-cols-2 max-lg:divide-y lg:divide-x divide-brand-orange/20\">\n\n {/* Left — info panel */}\n <div className=\"px-7 py-8 sm:px-9 flex flex-col gap-6\">\n <div>\n {/* Creator's Fund eyebrow — shared with CreatorAirdropBanner */}\n <span className=\"text-xs font-bold uppercase tracking-widest text-brand-orange\">\n Creator&apos;s Fund\n </span>\n <h2 className=\"mt-4 text-2xl font-bold tracking-tight leading-tight\">\n Community Rewards\n </h2>\n <p className=\"mt-1.5 text-sm text-muted-foreground leading-relaxed\">\n Earn XP. Share the Creator&apos;s Fund.\n </p>\n </div>\n\n {/* Recently active — live rail sourced from the same entries as the\n member cards on the right, no rank/podium framing. */}\n {!isLoading && entries.length > 0 && (\n <div className=\"border-y border-brand-orange/20 py-3\">\n <p className=\"text-2xs font-bold uppercase tracking-widest text-muted-foreground mb-2\">\n Recently active\n </p>\n <div className=\"flex -space-x-2\">\n {entries.slice(0, 5).map((entry) => (\n <span\n key={entry.address}\n title={`${entry.totalXp.toLocaleString()} XP`}\n className=\"flex h-7 w-7 items-center justify-center rounded-full border-2 border-background bg-brand-orange/15 text-[9px] font-bold text-brand-orange\"\n >\n {entry.address.slice(2, 4).toUpperCase()}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {/* Earn actions — plain text row */}\n <div className=\"flex flex-wrap gap-x-5 gap-y-2\">\n {EARN_ACTIONS.map(({ icon: Icon, label }) => (\n <span\n key={label}\n className=\"flex items-center gap-1.5 text-xs font-medium text-muted-foreground\"\n >\n <Icon className=\"h-3 w-3 text-brand-orange/70\" />\n {label}\n </span>\n ))}\n </div>\n\n <Link\n href={rewardsHref}\n className=\"mt-auto inline-flex items-center justify-center gap-2 rounded-xl bg-brand-orange px-6 py-3 text-sm font-semibold text-white transition-all hover:brightness-110 active:scale-[0.98]\"\n >\n Start earning XP\n <ArrowRight className=\"h-3.5 w-3.5\" />\n </Link>\n </div>\n\n {/* Right — member cards */}\n <div className=\"p-5 sm:p-6\">\n {!isLoading && entries.length > 0 ? (\n <div className=\"grid grid-cols-2 gap-3 h-full\">\n {entries.slice(0, 4).map((entry) => (\n <Link\n key={entry.address}\n href={creatorHref(entry.address)}\n className=\"group relative rounded-xl bg-card dark:bg-muted/30 hover:bg-card/70 dark:hover:bg-muted/50 overflow-hidden transition-colors flex flex-col justify-between p-4\"\n >\n <div className=\"absolute inset-x-0 top-0 h-0.5 bg-brand-orange/40\" />\n\n {/* XP — hero number */}\n <div className=\"space-y-0.5 pt-1\">\n <p className=\"text-2xl font-black tabular-nums leading-none\">\n {entry.totalXp.toLocaleString()}\n </p>\n <p className=\"text-2xs text-muted-foreground\">XP earned</p>\n </div>\n\n <AddressDisplay\n address={entry.address}\n chars={4}\n showCopy={false}\n className=\"text-xs font-medium text-muted-foreground group-hover:text-foreground transition-colors\"\n />\n </Link>\n ))}\n </div>\n ) : (\n <div className=\"grid grid-cols-2 gap-3 h-full\">\n {Array.from({ length: 4 }).map((_, i) => (\n <div key={i} className=\"min-h-[100px] rounded-xl bg-card dark:bg-muted/30 animate-pulse\" />\n ))}\n </div>\n )}\n </div>\n </section>\n );\n}\n"],"mappings":";AAoCQ,SAEE,KAFF;AAlCR,OAAO,UAAU;AACjB,SAAS,YAAY,KAAK,SAAS,aAAa,qBAAqB;AACrE,SAAS,sBAAsB;AAc/B,MAAM,eAAe;AAAA,EACnB,EAAE,MAAM,KAAK,OAAO,OAAO;AAAA,EAC3B,EAAE,MAAM,SAAS,OAAO,SAAS;AAAA,EACjC,EAAE,MAAM,aAAa,OAAO,QAAQ;AAAA,EACpC,EAAE,MAAM,eAAe,OAAO,SAAS;AACzC;AAEO,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AACF,GAAiC;AAC/B,SACE,qBAAC,aAAQ,WAAU,+HAGjB;AAAA,yBAAC,SAAI,WAAU,yCACb;AAAA,2BAAC,SAEC;AAAA,4BAAC,UAAK,WAAU,iEAAgE,4BAEhF;AAAA,QACA,oBAAC,QAAG,WAAU,wDAAuD,+BAErE;AAAA,QACA,oBAAC,OAAE,WAAU,wDAAuD,gDAEpE;AAAA,SACF;AAAA,MAIC,CAAC,aAAa,QAAQ,SAAS,KAC9B,qBAAC,SAAI,WAAU,wCACb;AAAA,4BAAC,OAAE,WAAU,2EAA0E,6BAEvF;AAAA,QACA,oBAAC,SAAI,WAAU,mBACZ,kBAAQ,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,UACxB;AAAA,UAAC;AAAA;AAAA,YAEC,OAAO,GAAG,MAAM,QAAQ,eAAe,CAAC;AAAA,YACxC,WAAU;AAAA,YAET,gBAAM,QAAQ,MAAM,GAAG,CAAC,EAAE,YAAY;AAAA;AAAA,UAJlC,MAAM;AAAA,QAKb,CACD,GACH;AAAA,SACF;AAAA,MAIF,oBAAC,SAAI,WAAU,kCACZ,uBAAa,IAAI,CAAC,EAAE,MAAM,MAAM,MAAM,MACrC;AAAA,QAAC;AAAA;AAAA,UAEC,WAAU;AAAA,UAEV;AAAA,gCAAC,QAAK,WAAU,gCAA+B;AAAA,YAC9C;AAAA;AAAA;AAAA,QAJI;AAAA,MAKP,CACD,GACH;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,MAAM;AAAA,UACN,WAAU;AAAA,UACX;AAAA;AAAA,YAEC,oBAAC,cAAW,WAAU,eAAc;AAAA;AAAA;AAAA,MACtC;AAAA,OACF;AAAA,IAGA,oBAAC,SAAI,WAAU,cACZ,WAAC,aAAa,QAAQ,SAAS,IAC9B,oBAAC,SAAI,WAAU,iCACZ,kBAAQ,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,UACxB;AAAA,MAAC;AAAA;AAAA,QAEC,MAAM,YAAY,MAAM,OAAO;AAAA,QAC/B,WAAU;AAAA,QAEV;AAAA,8BAAC,SAAI,WAAU,qDAAoD;AAAA,UAGnE,qBAAC,SAAI,WAAU,oBACb;AAAA,gCAAC,OAAE,WAAU,iDACV,gBAAM,QAAQ,eAAe,GAChC;AAAA,YACA,oBAAC,OAAE,WAAU,kCAAiC,uBAAS;AAAA,aACzD;AAAA,UAEA;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,MAAM;AAAA,cACf,OAAO;AAAA,cACP,UAAU;AAAA,cACV,WAAU;AAAA;AAAA,UACZ;AAAA;AAAA;AAAA,MAnBK,MAAM;AAAA,IAoBb,CACD,GACH,IAEA,oBAAC,SAAI,WAAU,iCACZ,gBAAM,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,MACjC,oBAAC,SAAY,WAAU,qEAAb,CAA+E,CAC1F,GACH,GAEJ;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/components/community-rewards-section.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { ArrowRight, Zap, Palette, ShoppingBag, MessageSquare } from \"lucide-react\";\nimport { AddressDisplay } from \"./address-display.js\";\n\nexport interface CommunityRewardsEntry {\n address: string;\n totalXp: number;\n}\n\nexport interface CommunityRewardsSectionProps {\n entries: CommunityRewardsEntry[];\n isLoading?: boolean;\n rewardsHref: string;\n creatorHref: (address: string) => string;\n}\n\nconst EARN_ACTIONS = [\n { icon: Zap, label: \"Mint\" },\n { icon: Palette, label: \"Create\" },\n { icon: ShoppingBag, label: \"Trade\" },\n { icon: MessageSquare, label: \"Engage\" },\n];\n\nexport function CommunityRewardsSection({\n entries,\n isLoading = false,\n rewardsHref,\n creatorHref,\n}: CommunityRewardsSectionProps) {\n return (\n <section className=\"rounded-2xl bg-muted/50 dark:bg-card overflow-hidden grid lg:grid-cols-2 max-lg:divide-y lg:divide-x divide-brand-orange/20\">\n\n <div className=\"px-7 py-8 sm:px-9 flex flex-col gap-6\">\n <div>\n\n <span className=\"text-xs font-bold uppercase tracking-widest text-brand-orange\">\n Creator&apos;s Fund\n </span>\n <h2 className=\"mt-4 text-2xl font-bold tracking-tight leading-tight\">\n Community Rewards\n </h2>\n <p className=\"mt-1.5 text-sm text-muted-foreground leading-relaxed\">\n Earn XP. Share the Creator&apos;s Fund.\n </p>\n </div>\n\n {!isLoading && entries.length > 0 && (\n <div className=\"border-y border-brand-orange/20 py-3\">\n <p className=\"text-2xs font-bold uppercase tracking-widest text-muted-foreground mb-2\">\n Recently active\n </p>\n <div className=\"flex -space-x-2\">\n {entries.slice(0, 5).map((entry) => (\n <span\n key={entry.address}\n title={`${entry.totalXp.toLocaleString()} XP`}\n className=\"flex h-7 w-7 items-center justify-center rounded-full border-2 border-background bg-brand-orange/15 text-[9px] font-bold text-brand-orange\"\n >\n {entry.address.slice(2, 4).toUpperCase()}\n </span>\n ))}\n </div>\n </div>\n )}\n\n <div className=\"flex flex-wrap gap-x-5 gap-y-2\">\n {EARN_ACTIONS.map(({ icon: Icon, label }) => (\n <span\n key={label}\n className=\"flex items-center gap-1.5 text-xs font-medium text-muted-foreground\"\n >\n <Icon className=\"h-3 w-3 text-brand-orange/70\" />\n {label}\n </span>\n ))}\n </div>\n\n <Link\n href={rewardsHref}\n className=\"mt-auto inline-flex items-center justify-center gap-2 rounded-xl bg-brand-orange px-6 py-3 text-sm font-semibold text-white transition-all hover:brightness-110 active:scale-[0.98]\"\n >\n Start earning XP\n <ArrowRight className=\"h-3.5 w-3.5\" />\n </Link>\n </div>\n\n <div className=\"p-5 sm:p-6\">\n {!isLoading && entries.length > 0 ? (\n <div className=\"grid grid-cols-2 gap-3 h-full\">\n {entries.slice(0, 4).map((entry) => (\n <Link\n key={entry.address}\n href={creatorHref(entry.address)}\n className=\"group relative rounded-xl bg-card dark:bg-muted/30 hover:bg-card/70 dark:hover:bg-muted/50 overflow-hidden transition-colors flex flex-col justify-between p-4\"\n >\n <div className=\"absolute inset-x-0 top-0 h-0.5 bg-brand-orange/40\" />\n\n <div className=\"space-y-0.5 pt-1\">\n <p className=\"text-2xl font-black tabular-nums leading-none\">\n {entry.totalXp.toLocaleString()}\n </p>\n <p className=\"text-2xs text-muted-foreground\">XP earned</p>\n </div>\n\n <AddressDisplay\n address={entry.address}\n chars={4}\n showCopy={false}\n className=\"text-xs font-medium text-muted-foreground group-hover:text-foreground transition-colors\"\n />\n </Link>\n ))}\n </div>\n ) : (\n <div className=\"grid grid-cols-2 gap-3 h-full\">\n {Array.from({ length: 4 }).map((_, i) => (\n <div key={i} className=\"min-h-[100px] rounded-xl bg-card dark:bg-muted/30 animate-pulse\" />\n ))}\n </div>\n )}\n </div>\n </section>\n );\n}\n"],"mappings":";AAmCQ,SAEE,KAFF;AAjCR,OAAO,UAAU;AACjB,SAAS,YAAY,KAAK,SAAS,aAAa,qBAAqB;AACrE,SAAS,sBAAsB;AAc/B,MAAM,eAAe;AAAA,EACnB,EAAE,MAAM,KAAK,OAAO,OAAO;AAAA,EAC3B,EAAE,MAAM,SAAS,OAAO,SAAS;AAAA,EACjC,EAAE,MAAM,aAAa,OAAO,QAAQ;AAAA,EACpC,EAAE,MAAM,eAAe,OAAO,SAAS;AACzC;AAEO,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AACF,GAAiC;AAC/B,SACE,qBAAC,aAAQ,WAAU,+HAEjB;AAAA,yBAAC,SAAI,WAAU,yCACb;AAAA,2BAAC,SAEC;AAAA,4BAAC,UAAK,WAAU,iEAAgE,4BAEhF;AAAA,QACA,oBAAC,QAAG,WAAU,wDAAuD,+BAErE;AAAA,QACA,oBAAC,OAAE,WAAU,wDAAuD,gDAEpE;AAAA,SACF;AAAA,MAEC,CAAC,aAAa,QAAQ,SAAS,KAC9B,qBAAC,SAAI,WAAU,wCACb;AAAA,4BAAC,OAAE,WAAU,2EAA0E,6BAEvF;AAAA,QACA,oBAAC,SAAI,WAAU,mBACZ,kBAAQ,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,UACxB;AAAA,UAAC;AAAA;AAAA,YAEC,OAAO,GAAG,MAAM,QAAQ,eAAe,CAAC;AAAA,YACxC,WAAU;AAAA,YAET,gBAAM,QAAQ,MAAM,GAAG,CAAC,EAAE,YAAY;AAAA;AAAA,UAJlC,MAAM;AAAA,QAKb,CACD,GACH;AAAA,SACF;AAAA,MAGF,oBAAC,SAAI,WAAU,kCACZ,uBAAa,IAAI,CAAC,EAAE,MAAM,MAAM,MAAM,MACrC;AAAA,QAAC;AAAA;AAAA,UAEC,WAAU;AAAA,UAEV;AAAA,gCAAC,QAAK,WAAU,gCAA+B;AAAA,YAC9C;AAAA;AAAA;AAAA,QAJI;AAAA,MAKP,CACD,GACH;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,MAAM;AAAA,UACN,WAAU;AAAA,UACX;AAAA;AAAA,YAEC,oBAAC,cAAW,WAAU,eAAc;AAAA;AAAA;AAAA,MACtC;AAAA,OACF;AAAA,IAEA,oBAAC,SAAI,WAAU,cACZ,WAAC,aAAa,QAAQ,SAAS,IAC9B,oBAAC,SAAI,WAAU,iCACZ,kBAAQ,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,UACxB;AAAA,MAAC;AAAA;AAAA,QAEC,MAAM,YAAY,MAAM,OAAO;AAAA,QAC/B,WAAU;AAAA,QAEV;AAAA,8BAAC,SAAI,WAAU,qDAAoD;AAAA,UAEnE,qBAAC,SAAI,WAAU,oBACb;AAAA,gCAAC,OAAE,WAAU,iDACV,gBAAM,QAAQ,eAAe,GAChC;AAAA,YACA,oBAAC,OAAE,WAAU,kCAAiC,uBAAS;AAAA,aACzD;AAAA,UAEA;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,MAAM;AAAA,cACf,OAAO;AAAA,cACP,UAAU;AAAA,cACV,WAAU;AAAA;AAAA,UACZ;AAAA;AAAA;AAAA,MAlBK,MAAM;AAAA,IAmBb,CACD,GACH,IAEA,oBAAC,SAAI,WAAU,iCACZ,gBAAM,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,MACjC,oBAAC,SAAY,WAAU,qEAAb,CAA+E,CAC1F,GACH,GAEJ;AAAA,KACF;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/create-form-primitives.tsx"],"sourcesContent":["import { cn } from \"../utils/cn.js\";\n\n/** Segmented two/three-option toggle used across the create flows. */\nexport function ToggleGroup({\n value, options, onChange,\n}: { value: string; options: readonly string[]; onChange: (v: string) => void }) {\n return (\n <div className=\"flex rounded-lg border border-border overflow-hidden w-full\">\n {options.map((opt, i) => (\n <button\n key={opt}\n type=\"button\"\n onClick={() => onChange(opt)}\n className={cn(\n \"flex-1 px-3 py-2 text-sm transition-colors\",\n i > 0 && \"border-l border-border\",\n value === opt\n ? \"bg-primary text-primary-foreground font-medium\"\n : \"bg-background hover:bg-muted text-muted-foreground\",\n )}\n >\n {opt}\n </button>\n ))}\n </div>\n );\n}\n\n/** Titled card section wrapper for the create forms. */\nexport function Section({ title, icon, children }: {\n title: string; icon: React.ReactNode; children: React.ReactNode;\n}) {\n return (\n <div className=\"rounded-xl border border-border bg-card p-5 space-y-4\">\n <div className=\"flex items-center gap-2 text-sm font-semibold\">\n <span className=\"text-primary\">{icon}</span>\n {title}\n </div>\n {children}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASQ;AATR,gBAAmB;AAGZ,SAAS,YAAY;AAAA,EAC1B;AAAA,EAAO;AAAA,EAAS;AAClB,GAAiF;AAC/E,SACE,4CAAC,SAAI,WAAU,+DACZ,kBAAQ,IAAI,CAAC,KAAK,MACjB;AAAA,IAAC;AAAA;AAAA,MAEC,MAAK;AAAA,MACL,SAAS,MAAM,SAAS,GAAG;AAAA,MAC3B,eAAW;AAAA,QACT;AAAA,QACA,IAAI,KAAK;AAAA,QACT,UAAU,MACN,mDACA;AAAA,MACN;AAAA,MAEC;AAAA;AAAA,IAXI;AAAA,EAYP,CACD,GACH;AAEJ;AAGO,SAAS,QAAQ,EAAE,OAAO,MAAM,SAAS,GAE7C;AACD,SACE,6CAAC,SAAI,WAAU,yDACb;AAAA,iDAAC,SAAI,WAAU,iDACb;AAAA,kDAAC,UAAK,WAAU,gBAAgB,gBAAK;AAAA,MACpC;AAAA,OACH;AAAA,IACC;AAAA,KACH;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/components/create-form-primitives.tsx"],"sourcesContent":["import { cn } from \"../utils/cn.js\";\n\nexport function ToggleGroup({\n value, options, onChange,\n}: { value: string; options: readonly string[]; onChange: (v: string) => void }) {\n return (\n <div className=\"flex rounded-lg border border-border overflow-hidden w-full\">\n {options.map((opt, i) => (\n <button\n key={opt}\n type=\"button\"\n onClick={() => onChange(opt)}\n className={cn(\n \"flex-1 px-3 py-2 text-sm transition-colors\",\n i > 0 && \"border-l border-border\",\n value === opt\n ? \"bg-primary text-primary-foreground font-medium\"\n : \"bg-background hover:bg-muted text-muted-foreground\",\n )}\n >\n {opt}\n </button>\n ))}\n </div>\n );\n}\n\nexport function Section({ title, icon, children }: {\n title: string; icon: React.ReactNode; children: React.ReactNode;\n}) {\n return (\n <div className=\"rounded-xl border border-border bg-card p-5 space-y-4\">\n <div className=\"flex items-center gap-2 text-sm font-semibold\">\n <span className=\"text-primary\">{icon}</span>\n {title}\n </div>\n {children}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQQ;AARR,gBAAmB;AAEZ,SAAS,YAAY;AAAA,EAC1B;AAAA,EAAO;AAAA,EAAS;AAClB,GAAiF;AAC/E,SACE,4CAAC,SAAI,WAAU,+DACZ,kBAAQ,IAAI,CAAC,KAAK,MACjB;AAAA,IAAC;AAAA;AAAA,MAEC,MAAK;AAAA,MACL,SAAS,MAAM,SAAS,GAAG;AAAA,MAC3B,eAAW;AAAA,QACT;AAAA,QACA,IAAI,KAAK;AAAA,QACT,UAAU,MACN,mDACA;AAAA,MACN;AAAA,MAEC;AAAA;AAAA,IAXI;AAAA,EAYP,CACD,GACH;AAEJ;AAEO,SAAS,QAAQ,EAAE,OAAO,MAAM,SAAS,GAE7C;AACD,SACE,6CAAC,SAAI,WAAU,yDACb;AAAA,iDAAC,SAAI,WAAU,iDACb;AAAA,kDAAC,UAAK,WAAU,gBAAgB,gBAAK;AAAA,MACpC;AAAA,OACH;AAAA,IACC;AAAA,KACH;AAEJ;","names":[]}
@@ -1,12 +1,10 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
 
3
- /** Segmented two/three-option toggle used across the create flows. */
4
3
  declare function ToggleGroup({ value, options, onChange, }: {
5
4
  value: string;
6
5
  options: readonly string[];
7
6
  onChange: (v: string) => void;
8
7
  }): react_jsx_runtime.JSX.Element;
9
- /** Titled card section wrapper for the create forms. */
10
8
  declare function Section({ title, icon, children }: {
11
9
  title: string;
12
10
  icon: React.ReactNode;
@@ -1,12 +1,10 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
 
3
- /** Segmented two/three-option toggle used across the create flows. */
4
3
  declare function ToggleGroup({ value, options, onChange, }: {
5
4
  value: string;
6
5
  options: readonly string[];
7
6
  onChange: (v: string) => void;
8
7
  }): react_jsx_runtime.JSX.Element;
9
- /** Titled card section wrapper for the create forms. */
10
8
  declare function Section({ title, icon, children }: {
11
9
  title: string;
12
10
  icon: React.ReactNode;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/create-form-primitives.tsx"],"sourcesContent":["import { cn } from \"../utils/cn.js\";\n\n/** Segmented two/three-option toggle used across the create flows. */\nexport function ToggleGroup({\n value, options, onChange,\n}: { value: string; options: readonly string[]; onChange: (v: string) => void }) {\n return (\n <div className=\"flex rounded-lg border border-border overflow-hidden w-full\">\n {options.map((opt, i) => (\n <button\n key={opt}\n type=\"button\"\n onClick={() => onChange(opt)}\n className={cn(\n \"flex-1 px-3 py-2 text-sm transition-colors\",\n i > 0 && \"border-l border-border\",\n value === opt\n ? \"bg-primary text-primary-foreground font-medium\"\n : \"bg-background hover:bg-muted text-muted-foreground\",\n )}\n >\n {opt}\n </button>\n ))}\n </div>\n );\n}\n\n/** Titled card section wrapper for the create forms. */\nexport function Section({ title, icon, children }: {\n title: string; icon: React.ReactNode; children: React.ReactNode;\n}) {\n return (\n <div className=\"rounded-xl border border-border bg-card p-5 space-y-4\">\n <div className=\"flex items-center gap-2 text-sm font-semibold\">\n <span className=\"text-primary\">{icon}</span>\n {title}\n </div>\n {children}\n </div>\n );\n}\n"],"mappings":"AASQ,cAyBF,YAzBE;AATR,SAAS,UAAU;AAGZ,SAAS,YAAY;AAAA,EAC1B;AAAA,EAAO;AAAA,EAAS;AAClB,GAAiF;AAC/E,SACE,oBAAC,SAAI,WAAU,+DACZ,kBAAQ,IAAI,CAAC,KAAK,MACjB;AAAA,IAAC;AAAA;AAAA,MAEC,MAAK;AAAA,MACL,SAAS,MAAM,SAAS,GAAG;AAAA,MAC3B,WAAW;AAAA,QACT;AAAA,QACA,IAAI,KAAK;AAAA,QACT,UAAU,MACN,mDACA;AAAA,MACN;AAAA,MAEC;AAAA;AAAA,IAXI;AAAA,EAYP,CACD,GACH;AAEJ;AAGO,SAAS,QAAQ,EAAE,OAAO,MAAM,SAAS,GAE7C;AACD,SACE,qBAAC,SAAI,WAAU,yDACb;AAAA,yBAAC,SAAI,WAAU,iDACb;AAAA,0BAAC,UAAK,WAAU,gBAAgB,gBAAK;AAAA,MACpC;AAAA,OACH;AAAA,IACC;AAAA,KACH;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/components/create-form-primitives.tsx"],"sourcesContent":["import { cn } from \"../utils/cn.js\";\n\nexport function ToggleGroup({\n value, options, onChange,\n}: { value: string; options: readonly string[]; onChange: (v: string) => void }) {\n return (\n <div className=\"flex rounded-lg border border-border overflow-hidden w-full\">\n {options.map((opt, i) => (\n <button\n key={opt}\n type=\"button\"\n onClick={() => onChange(opt)}\n className={cn(\n \"flex-1 px-3 py-2 text-sm transition-colors\",\n i > 0 && \"border-l border-border\",\n value === opt\n ? \"bg-primary text-primary-foreground font-medium\"\n : \"bg-background hover:bg-muted text-muted-foreground\",\n )}\n >\n {opt}\n </button>\n ))}\n </div>\n );\n}\n\nexport function Section({ title, icon, children }: {\n title: string; icon: React.ReactNode; children: React.ReactNode;\n}) {\n return (\n <div className=\"rounded-xl border border-border bg-card p-5 space-y-4\">\n <div className=\"flex items-center gap-2 text-sm font-semibold\">\n <span className=\"text-primary\">{icon}</span>\n {title}\n </div>\n {children}\n </div>\n );\n}\n"],"mappings":"AAQQ,cAwBF,YAxBE;AARR,SAAS,UAAU;AAEZ,SAAS,YAAY;AAAA,EAC1B;AAAA,EAAO;AAAA,EAAS;AAClB,GAAiF;AAC/E,SACE,oBAAC,SAAI,WAAU,+DACZ,kBAAQ,IAAI,CAAC,KAAK,MACjB;AAAA,IAAC;AAAA;AAAA,MAEC,MAAK;AAAA,MACL,SAAS,MAAM,SAAS,GAAG;AAAA,MAC3B,WAAW;AAAA,QACT;AAAA,QACA,IAAI,KAAK;AAAA,QACT,UAAU,MACN,mDACA;AAAA,MACN;AAAA,MAEC;AAAA;AAAA,IAXI;AAAA,EAYP,CACD,GACH;AAEJ;AAEO,SAAS,QAAQ,EAAE,OAAO,MAAM,SAAS,GAE7C;AACD,SACE,qBAAC,SAAI,WAAU,yDACb;AAAA,yBAAC,SAAI,WAAU,iDACb;AAAA,0BAAC,UAAK,WAAU,gBAAgB,gBAAK;AAAA,MACpC;AAAA,OACH;AAAA,IACC;AAAA,KACH;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/creation-record.tsx"],"sourcesContent":["\"use client\";\n\nimport { Award, ExternalLink } from \"lucide-react\";\nimport Link from \"next/link\";\nimport { normalizeAddress } from \"@medialane/sdk\";\n\nconst EXPLORER_URL = process.env.NEXT_PUBLIC_EXPLORER_URL || \"https://voyager.online\";\n\nexport interface CreationRecordProps {\n originalCreator: string;\n registeredAt: number; // unix seconds\n}\n\n/**\n * Berne Convention authorship record surfaced from IPNft.get_full_token_data.\n * Both fields are immutable on-chain — original_creator is set at mint time\n * and never changes regardless of subsequent ownership transfers.\n */\nexport function CreationRecord({ originalCreator, registeredAt }: CreationRecordProps) {\n const creator = originalCreator ? normalizeAddress(\"STARKNET\", originalCreator) : \"\";\n const date = new Date(registeredAt * 1000);\n const formatted = date.toLocaleDateString(undefined, {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n });\n\n return (\n <div className=\"rounded-lg bg-amber-500/5 p-4\">\n <div className=\"flex items-center gap-2 mb-3\">\n <Award className=\"h-4 w-4 text-amber-500\" />\n <p className=\"text-sm font-semibold text-amber-500\">Creation Record</p>\n </div>\n <p className=\"text-xs text-muted-foreground mb-3\">\n Immutable on-chain authorship record set at mint and stored permanently\n for legal evidence of creation (Berne Convention).\n </p>\n <dl className=\"space-y-2 text-sm\">\n <div className=\"flex items-center justify-between\">\n <dt className=\"text-muted-foreground\">Original creator</dt>\n <dd className=\"tabular-nums\">\n <Link href={`/creator/${creator}`} className=\"hover:underline\">\n {creator.slice(0, 6)}…{creator.slice(-4)}\n </Link>\n </dd>\n </div>\n <div className=\"flex items-center justify-between\">\n <dt className=\"text-muted-foreground\">Registered at</dt>\n <dd>\n <a\n href={`${EXPLORER_URL}/contract/${creator}`}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"inline-flex items-center gap-1 hover:underline\"\n >\n {formatted}\n <ExternalLink className=\"h-3 w-3\" />\n </a>\n </dd>\n </div>\n </dl>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA6BM;AA3BN,0BAAoC;AACpC,kBAAiB;AACjB,iBAAiC;AAEjC,MAAM,eAAe,QAAQ,IAAI,4BAA4B;AAYtD,SAAS,eAAe,EAAE,iBAAiB,aAAa,GAAwB;AACrF,QAAM,UAAU,sBAAkB,6BAAiB,YAAY,eAAe,IAAI;AAClF,QAAM,OAAO,IAAI,KAAK,eAAe,GAAI;AACzC,QAAM,YAAY,KAAK,mBAAmB,QAAW;AAAA,IACnD,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,EACP,CAAC;AAED,SACE,6CAAC,SAAI,WAAU,iCACb;AAAA,iDAAC,SAAI,WAAU,gCACb;AAAA,kDAAC,6BAAM,WAAU,0BAAyB;AAAA,MAC1C,4CAAC,OAAE,WAAU,wCAAuC,6BAAe;AAAA,OACrE;AAAA,IACA,4CAAC,OAAE,WAAU,sCAAqC,wIAGlD;AAAA,IACA,6CAAC,QAAG,WAAU,qBACZ;AAAA,mDAAC,SAAI,WAAU,qCACb;AAAA,oDAAC,QAAG,WAAU,yBAAwB,8BAAgB;AAAA,QACtD,4CAAC,QAAG,WAAU,gBACZ,uDAAC,YAAAA,SAAA,EAAK,MAAM,YAAY,OAAO,IAAI,WAAU,mBAC1C;AAAA,kBAAQ,MAAM,GAAG,CAAC;AAAA,UAAE;AAAA,UAAE,QAAQ,MAAM,EAAE;AAAA,WACzC,GACF;AAAA,SACF;AAAA,MACA,6CAAC,SAAI,WAAU,qCACb;AAAA,oDAAC,QAAG,WAAU,yBAAwB,2BAAa;AAAA,QACnD,4CAAC,QACC;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,GAAG,YAAY,aAAa,OAAO;AAAA,YACzC,QAAO;AAAA,YACP,KAAI;AAAA,YACJ,WAAU;AAAA,YAET;AAAA;AAAA,cACD,4CAAC,oCAAa,WAAU,WAAU;AAAA;AAAA;AAAA,QACpC,GACF;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAEJ;","names":["Link"]}
1
+ {"version":3,"sources":["../../src/components/creation-record.tsx"],"sourcesContent":["\"use client\";\n\nimport { Award, ExternalLink } from \"lucide-react\";\nimport Link from \"next/link\";\nimport { normalizeAddress } from \"@medialane/sdk\";\n\nconst EXPLORER_URL = process.env.NEXT_PUBLIC_EXPLORER_URL || \"https://voyager.online\";\n\nexport interface CreationRecordProps {\n originalCreator: string;\n registeredAt: number;\n}\n\nexport function CreationRecord({ originalCreator, registeredAt }: CreationRecordProps) {\n const creator = originalCreator ? normalizeAddress(\"STARKNET\", originalCreator) : \"\";\n const date = new Date(registeredAt * 1000);\n const formatted = date.toLocaleDateString(undefined, {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n });\n\n return (\n <div className=\"rounded-lg bg-amber-500/5 p-4\">\n <div className=\"flex items-center gap-2 mb-3\">\n <Award className=\"h-4 w-4 text-amber-500\" />\n <p className=\"text-sm font-semibold text-amber-500\">Creation Record</p>\n </div>\n <p className=\"text-xs text-muted-foreground mb-3\">\n Immutable on-chain authorship record set at mint and stored permanently\n for legal evidence of creation (Berne Convention).\n </p>\n <dl className=\"space-y-2 text-sm\">\n <div className=\"flex items-center justify-between\">\n <dt className=\"text-muted-foreground\">Original creator</dt>\n <dd className=\"tabular-nums\">\n <Link href={`/creator/${creator}`} className=\"hover:underline\">\n {creator.slice(0, 6)}…{creator.slice(-4)}\n </Link>\n </dd>\n </div>\n <div className=\"flex items-center justify-between\">\n <dt className=\"text-muted-foreground\">Registered at</dt>\n <dd>\n <a\n href={`${EXPLORER_URL}/contract/${creator}`}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"inline-flex items-center gap-1 hover:underline\"\n >\n {formatted}\n <ExternalLink className=\"h-3 w-3\" />\n </a>\n </dd>\n </div>\n </dl>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBM;AAtBN,0BAAoC;AACpC,kBAAiB;AACjB,iBAAiC;AAEjC,MAAM,eAAe,QAAQ,IAAI,4BAA4B;AAOtD,SAAS,eAAe,EAAE,iBAAiB,aAAa,GAAwB;AACrF,QAAM,UAAU,sBAAkB,6BAAiB,YAAY,eAAe,IAAI;AAClF,QAAM,OAAO,IAAI,KAAK,eAAe,GAAI;AACzC,QAAM,YAAY,KAAK,mBAAmB,QAAW;AAAA,IACnD,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,EACP,CAAC;AAED,SACE,6CAAC,SAAI,WAAU,iCACb;AAAA,iDAAC,SAAI,WAAU,gCACb;AAAA,kDAAC,6BAAM,WAAU,0BAAyB;AAAA,MAC1C,4CAAC,OAAE,WAAU,wCAAuC,6BAAe;AAAA,OACrE;AAAA,IACA,4CAAC,OAAE,WAAU,sCAAqC,wIAGlD;AAAA,IACA,6CAAC,QAAG,WAAU,qBACZ;AAAA,mDAAC,SAAI,WAAU,qCACb;AAAA,oDAAC,QAAG,WAAU,yBAAwB,8BAAgB;AAAA,QACtD,4CAAC,QAAG,WAAU,gBACZ,uDAAC,YAAAA,SAAA,EAAK,MAAM,YAAY,OAAO,IAAI,WAAU,mBAC1C;AAAA,kBAAQ,MAAM,GAAG,CAAC;AAAA,UAAE;AAAA,UAAE,QAAQ,MAAM,EAAE;AAAA,WACzC,GACF;AAAA,SACF;AAAA,MACA,6CAAC,SAAI,WAAU,qCACb;AAAA,oDAAC,QAAG,WAAU,yBAAwB,2BAAa;AAAA,QACnD,4CAAC,QACC;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,GAAG,YAAY,aAAa,OAAO;AAAA,YACzC,QAAO;AAAA,YACP,KAAI;AAAA,YACJ,WAAU;AAAA,YAET;AAAA;AAAA,cACD,4CAAC,oCAAa,WAAU,WAAU;AAAA;AAAA;AAAA,QACpC,GACF;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAEJ;","names":["Link"]}
@@ -4,11 +4,6 @@ interface CreationRecordProps {
4
4
  originalCreator: string;
5
5
  registeredAt: number;
6
6
  }
7
- /**
8
- * Berne Convention authorship record surfaced from IPNft.get_full_token_data.
9
- * Both fields are immutable on-chain — original_creator is set at mint time
10
- * and never changes regardless of subsequent ownership transfers.
11
- */
12
7
  declare function CreationRecord({ originalCreator, registeredAt }: CreationRecordProps): react_jsx_runtime.JSX.Element;
13
8
 
14
9
  export { CreationRecord, type CreationRecordProps };
@@ -4,11 +4,6 @@ interface CreationRecordProps {
4
4
  originalCreator: string;
5
5
  registeredAt: number;
6
6
  }
7
- /**
8
- * Berne Convention authorship record surfaced from IPNft.get_full_token_data.
9
- * Both fields are immutable on-chain — original_creator is set at mint time
10
- * and never changes regardless of subsequent ownership transfers.
11
- */
12
7
  declare function CreationRecord({ originalCreator, registeredAt }: CreationRecordProps): react_jsx_runtime.JSX.Element;
13
8
 
14
9
  export { CreationRecord, type CreationRecordProps };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/creation-record.tsx"],"sourcesContent":["\"use client\";\n\nimport { Award, ExternalLink } from \"lucide-react\";\nimport Link from \"next/link\";\nimport { normalizeAddress } from \"@medialane/sdk\";\n\nconst EXPLORER_URL = process.env.NEXT_PUBLIC_EXPLORER_URL || \"https://voyager.online\";\n\nexport interface CreationRecordProps {\n originalCreator: string;\n registeredAt: number; // unix seconds\n}\n\n/**\n * Berne Convention authorship record surfaced from IPNft.get_full_token_data.\n * Both fields are immutable on-chain — original_creator is set at mint time\n * and never changes regardless of subsequent ownership transfers.\n */\nexport function CreationRecord({ originalCreator, registeredAt }: CreationRecordProps) {\n const creator = originalCreator ? normalizeAddress(\"STARKNET\", originalCreator) : \"\";\n const date = new Date(registeredAt * 1000);\n const formatted = date.toLocaleDateString(undefined, {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n });\n\n return (\n <div className=\"rounded-lg bg-amber-500/5 p-4\">\n <div className=\"flex items-center gap-2 mb-3\">\n <Award className=\"h-4 w-4 text-amber-500\" />\n <p className=\"text-sm font-semibold text-amber-500\">Creation Record</p>\n </div>\n <p className=\"text-xs text-muted-foreground mb-3\">\n Immutable on-chain authorship record set at mint and stored permanently\n for legal evidence of creation (Berne Convention).\n </p>\n <dl className=\"space-y-2 text-sm\">\n <div className=\"flex items-center justify-between\">\n <dt className=\"text-muted-foreground\">Original creator</dt>\n <dd className=\"tabular-nums\">\n <Link href={`/creator/${creator}`} className=\"hover:underline\">\n {creator.slice(0, 6)}…{creator.slice(-4)}\n </Link>\n </dd>\n </div>\n <div className=\"flex items-center justify-between\">\n <dt className=\"text-muted-foreground\">Registered at</dt>\n <dd>\n <a\n href={`${EXPLORER_URL}/contract/${creator}`}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"inline-flex items-center gap-1 hover:underline\"\n >\n {formatted}\n <ExternalLink className=\"h-3 w-3\" />\n </a>\n </dd>\n </div>\n </dl>\n </div>\n );\n}\n"],"mappings":";AA6BM,SACE,KADF;AA3BN,SAAS,OAAO,oBAAoB;AACpC,OAAO,UAAU;AACjB,SAAS,wBAAwB;AAEjC,MAAM,eAAe,QAAQ,IAAI,4BAA4B;AAYtD,SAAS,eAAe,EAAE,iBAAiB,aAAa,GAAwB;AACrF,QAAM,UAAU,kBAAkB,iBAAiB,YAAY,eAAe,IAAI;AAClF,QAAM,OAAO,IAAI,KAAK,eAAe,GAAI;AACzC,QAAM,YAAY,KAAK,mBAAmB,QAAW;AAAA,IACnD,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,EACP,CAAC;AAED,SACE,qBAAC,SAAI,WAAU,iCACb;AAAA,yBAAC,SAAI,WAAU,gCACb;AAAA,0BAAC,SAAM,WAAU,0BAAyB;AAAA,MAC1C,oBAAC,OAAE,WAAU,wCAAuC,6BAAe;AAAA,OACrE;AAAA,IACA,oBAAC,OAAE,WAAU,sCAAqC,wIAGlD;AAAA,IACA,qBAAC,QAAG,WAAU,qBACZ;AAAA,2BAAC,SAAI,WAAU,qCACb;AAAA,4BAAC,QAAG,WAAU,yBAAwB,8BAAgB;AAAA,QACtD,oBAAC,QAAG,WAAU,gBACZ,+BAAC,QAAK,MAAM,YAAY,OAAO,IAAI,WAAU,mBAC1C;AAAA,kBAAQ,MAAM,GAAG,CAAC;AAAA,UAAE;AAAA,UAAE,QAAQ,MAAM,EAAE;AAAA,WACzC,GACF;AAAA,SACF;AAAA,MACA,qBAAC,SAAI,WAAU,qCACb;AAAA,4BAAC,QAAG,WAAU,yBAAwB,2BAAa;AAAA,QACnD,oBAAC,QACC;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,GAAG,YAAY,aAAa,OAAO;AAAA,YACzC,QAAO;AAAA,YACP,KAAI;AAAA,YACJ,WAAU;AAAA,YAET;AAAA;AAAA,cACD,oBAAC,gBAAa,WAAU,WAAU;AAAA;AAAA;AAAA,QACpC,GACF;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/components/creation-record.tsx"],"sourcesContent":["\"use client\";\n\nimport { Award, ExternalLink } from \"lucide-react\";\nimport Link from \"next/link\";\nimport { normalizeAddress } from \"@medialane/sdk\";\n\nconst EXPLORER_URL = process.env.NEXT_PUBLIC_EXPLORER_URL || \"https://voyager.online\";\n\nexport interface CreationRecordProps {\n originalCreator: string;\n registeredAt: number;\n}\n\nexport function CreationRecord({ originalCreator, registeredAt }: CreationRecordProps) {\n const creator = originalCreator ? normalizeAddress(\"STARKNET\", originalCreator) : \"\";\n const date = new Date(registeredAt * 1000);\n const formatted = date.toLocaleDateString(undefined, {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n });\n\n return (\n <div className=\"rounded-lg bg-amber-500/5 p-4\">\n <div className=\"flex items-center gap-2 mb-3\">\n <Award className=\"h-4 w-4 text-amber-500\" />\n <p className=\"text-sm font-semibold text-amber-500\">Creation Record</p>\n </div>\n <p className=\"text-xs text-muted-foreground mb-3\">\n Immutable on-chain authorship record set at mint and stored permanently\n for legal evidence of creation (Berne Convention).\n </p>\n <dl className=\"space-y-2 text-sm\">\n <div className=\"flex items-center justify-between\">\n <dt className=\"text-muted-foreground\">Original creator</dt>\n <dd className=\"tabular-nums\">\n <Link href={`/creator/${creator}`} className=\"hover:underline\">\n {creator.slice(0, 6)}…{creator.slice(-4)}\n </Link>\n </dd>\n </div>\n <div className=\"flex items-center justify-between\">\n <dt className=\"text-muted-foreground\">Registered at</dt>\n <dd>\n <a\n href={`${EXPLORER_URL}/contract/${creator}`}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"inline-flex items-center gap-1 hover:underline\"\n >\n {formatted}\n <ExternalLink className=\"h-3 w-3\" />\n </a>\n </dd>\n </div>\n </dl>\n </div>\n );\n}\n"],"mappings":";AAwBM,SACE,KADF;AAtBN,SAAS,OAAO,oBAAoB;AACpC,OAAO,UAAU;AACjB,SAAS,wBAAwB;AAEjC,MAAM,eAAe,QAAQ,IAAI,4BAA4B;AAOtD,SAAS,eAAe,EAAE,iBAAiB,aAAa,GAAwB;AACrF,QAAM,UAAU,kBAAkB,iBAAiB,YAAY,eAAe,IAAI;AAClF,QAAM,OAAO,IAAI,KAAK,eAAe,GAAI;AACzC,QAAM,YAAY,KAAK,mBAAmB,QAAW;AAAA,IACnD,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,EACP,CAAC;AAED,SACE,qBAAC,SAAI,WAAU,iCACb;AAAA,yBAAC,SAAI,WAAU,gCACb;AAAA,0BAAC,SAAM,WAAU,0BAAyB;AAAA,MAC1C,oBAAC,OAAE,WAAU,wCAAuC,6BAAe;AAAA,OACrE;AAAA,IACA,oBAAC,OAAE,WAAU,sCAAqC,wIAGlD;AAAA,IACA,qBAAC,QAAG,WAAU,qBACZ;AAAA,2BAAC,SAAI,WAAU,qCACb;AAAA,4BAAC,QAAG,WAAU,yBAAwB,8BAAgB;AAAA,QACtD,oBAAC,QAAG,WAAU,gBACZ,+BAAC,QAAK,MAAM,YAAY,OAAO,IAAI,WAAU,mBAC1C;AAAA,kBAAQ,MAAM,GAAG,CAAC;AAAA,UAAE;AAAA,UAAE,QAAQ,MAAM,EAAE;AAAA,WACzC,GACF;AAAA,SACF;AAAA,MACA,qBAAC,SAAI,WAAU,qCACb;AAAA,4BAAC,QAAG,WAAU,yBAAwB,2BAAa;AAAA,QACnD,oBAAC,QACC;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,GAAG,YAAY,aAAa,OAAO;AAAA,YACzC,QAAO;AAAA,YACP,KAAI;AAAA,YACJ,WAAU;AAAA,YAET;AAAA;AAAA,cACD,oBAAC,gBAAa,WAAU,WAAU;AAAA;AAAA;AAAA,QACpC,GACF;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/creator-airdrop-banner.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { ArrowRight } from \"lucide-react\";\n\nexport interface CreatorAirdropBannerProps {\n /** Route of the airdrop claim page. */\n href: string;\n}\n\nconst HIGHLIGHTS = [\n \"Free and frictionless participation\",\n \"Eligible for every prize distribution\",\n \"Create, trade and earn more rewards\",\n];\n\nexport function CreatorAirdropBanner({ href }: CreatorAirdropBannerProps) {\n return (\n <section className=\"rounded-2xl bg-muted/50 dark:bg-card px-7 py-8 sm:px-9\">\n {/* Creator's Fund eyebrow — shared with CommunityRewardsSection */}\n <div className=\"flex items-center gap-3\">\n <span className=\"text-xs font-bold uppercase tracking-widest text-brand-orange\">\n Creator&apos;s Fund\n </span>\n <span className=\"flex items-center gap-1.5 text-xs font-medium text-muted-foreground\">\n <span className=\"h-1.5 w-1.5 rounded-full bg-brand-orange animate-pulse\" />\n Live\n </span>\n </div>\n\n <div className=\"mt-4 flex flex-col sm:flex-row sm:items-center gap-6\">\n <div className=\"flex-1 min-w-0\">\n <h2 className=\"text-2xl sm:text-3xl font-bold tracking-tight leading-tight\">\n Creator&apos;s Airdrop\n </h2>\n <p className=\"mt-1.5 text-sm text-muted-foreground leading-relaxed max-w-md\">\n Claim your participation and join the creator&apos;s fund distribution.\n </p>\n </div>\n\n <Link\n href={href}\n className=\"inline-flex items-center justify-center gap-2 rounded-xl bg-brand-orange px-6 py-3 text-sm font-semibold text-white transition-all hover:brightness-110 active:scale-[0.98] shrink-0\"\n >\n Read More\n <ArrowRight className=\"h-4 w-4\" />\n </Link>\n </div>\n\n <div className=\"mt-7 border-t border-brand-orange/20 pt-4 flex flex-wrap items-center gap-x-2.5 gap-y-1.5 text-sm text-muted-foreground\">\n {HIGHLIGHTS.map((h, i) => (\n <span key={h} className=\"flex items-center gap-2.5\">\n {i > 0 && <span className=\"text-brand-orange/50\" aria-hidden>·</span>}\n {h}\n </span>\n ))}\n </div>\n </section>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBQ;AAnBR,kBAAiB;AACjB,0BAA2B;AAO3B,MAAM,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,qBAAqB,EAAE,KAAK,GAA8B;AACxE,SACE,6CAAC,aAAQ,WAAU,0DAEjB;AAAA,iDAAC,SAAI,WAAU,2BACb;AAAA,kDAAC,UAAK,WAAU,iEAAgE,4BAEhF;AAAA,MACA,6CAAC,UAAK,WAAU,uEACd;AAAA,oDAAC,UAAK,WAAU,0DAAyD;AAAA,QAAE;AAAA,SAE7E;AAAA,OACF;AAAA,IAEA,6CAAC,SAAI,WAAU,wDACb;AAAA,mDAAC,SAAI,WAAU,kBACb;AAAA,oDAAC,QAAG,WAAU,+DAA8D,+BAE5E;AAAA,QACA,4CAAC,OAAE,WAAU,iEAAgE,gFAE7E;AAAA,SACF;AAAA,MAEA;AAAA,QAAC,YAAAA;AAAA,QAAA;AAAA,UACC;AAAA,UACA,WAAU;AAAA,UACX;AAAA;AAAA,YAEC,4CAAC,kCAAW,WAAU,WAAU;AAAA;AAAA;AAAA,MAClC;AAAA,OACF;AAAA,IAEA,4CAAC,SAAI,WAAU,2HACZ,qBAAW,IAAI,CAAC,GAAG,MAClB,6CAAC,UAAa,WAAU,6BACrB;AAAA,UAAI,KAAK,4CAAC,UAAK,WAAU,wBAAuB,eAAW,MAAC,kBAAC;AAAA,MAC7D;AAAA,SAFQ,CAGX,CACD,GACH;AAAA,KACF;AAEJ;","names":["Link"]}
1
+ {"version":3,"sources":["../../src/components/creator-airdrop-banner.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { ArrowRight } from \"lucide-react\";\n\nexport interface CreatorAirdropBannerProps {\n\n href: string;\n}\n\nconst HIGHLIGHTS = [\n \"Free and frictionless participation\",\n \"Eligible for every prize distribution\",\n \"Create, trade and earn more rewards\",\n];\n\nexport function CreatorAirdropBanner({ href }: CreatorAirdropBannerProps) {\n return (\n <section className=\"rounded-2xl bg-muted/50 dark:bg-card px-7 py-8 sm:px-9\">\n\n <div className=\"flex items-center gap-3\">\n <span className=\"text-xs font-bold uppercase tracking-widest text-brand-orange\">\n Creator&apos;s Fund\n </span>\n <span className=\"flex items-center gap-1.5 text-xs font-medium text-muted-foreground\">\n <span className=\"h-1.5 w-1.5 rounded-full bg-brand-orange animate-pulse\" />\n Live\n </span>\n </div>\n\n <div className=\"mt-4 flex flex-col sm:flex-row sm:items-center gap-6\">\n <div className=\"flex-1 min-w-0\">\n <h2 className=\"text-2xl sm:text-3xl font-bold tracking-tight leading-tight\">\n Creator&apos;s Airdrop\n </h2>\n <p className=\"mt-1.5 text-sm text-muted-foreground leading-relaxed max-w-md\">\n Claim your participation and join the creator&apos;s fund distribution.\n </p>\n </div>\n\n <Link\n href={href}\n className=\"inline-flex items-center justify-center gap-2 rounded-xl bg-brand-orange px-6 py-3 text-sm font-semibold text-white transition-all hover:brightness-110 active:scale-[0.98] shrink-0\"\n >\n Read More\n <ArrowRight className=\"h-4 w-4\" />\n </Link>\n </div>\n\n <div className=\"mt-7 border-t border-brand-orange/20 pt-4 flex flex-wrap items-center gap-x-2.5 gap-y-1.5 text-sm text-muted-foreground\">\n {HIGHLIGHTS.map((h, i) => (\n <span key={h} className=\"flex items-center gap-2.5\">\n {i > 0 && <span className=\"text-brand-orange/50\" aria-hidden>·</span>}\n {h}\n </span>\n ))}\n </div>\n </section>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBQ;AAnBR,kBAAiB;AACjB,0BAA2B;AAO3B,MAAM,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,qBAAqB,EAAE,KAAK,GAA8B;AACxE,SACE,6CAAC,aAAQ,WAAU,0DAEjB;AAAA,iDAAC,SAAI,WAAU,2BACb;AAAA,kDAAC,UAAK,WAAU,iEAAgE,4BAEhF;AAAA,MACA,6CAAC,UAAK,WAAU,uEACd;AAAA,oDAAC,UAAK,WAAU,0DAAyD;AAAA,QAAE;AAAA,SAE7E;AAAA,OACF;AAAA,IAEA,6CAAC,SAAI,WAAU,wDACb;AAAA,mDAAC,SAAI,WAAU,kBACb;AAAA,oDAAC,QAAG,WAAU,+DAA8D,+BAE5E;AAAA,QACA,4CAAC,OAAE,WAAU,iEAAgE,gFAE7E;AAAA,SACF;AAAA,MAEA;AAAA,QAAC,YAAAA;AAAA,QAAA;AAAA,UACC;AAAA,UACA,WAAU;AAAA,UACX;AAAA;AAAA,YAEC,4CAAC,kCAAW,WAAU,WAAU;AAAA;AAAA;AAAA,MAClC;AAAA,OACF;AAAA,IAEA,4CAAC,SAAI,WAAU,2HACZ,qBAAW,IAAI,CAAC,GAAG,MAClB,6CAAC,UAAa,WAAU,6BACrB;AAAA,UAAI,KAAK,4CAAC,UAAK,WAAU,wBAAuB,eAAW,MAAC,kBAAC;AAAA,MAC7D;AAAA,SAFQ,CAGX,CACD,GACH;AAAA,KACF;AAEJ;","names":["Link"]}
@@ -1,7 +1,6 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
 
3
3
  interface CreatorAirdropBannerProps {
4
- /** Route of the airdrop claim page. */
5
4
  href: string;
6
5
  }
7
6
  declare function CreatorAirdropBanner({ href }: CreatorAirdropBannerProps): react_jsx_runtime.JSX.Element;
@@ -1,7 +1,6 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
 
3
3
  interface CreatorAirdropBannerProps {
4
- /** Route of the airdrop claim page. */
5
4
  href: string;
6
5
  }
7
6
  declare function CreatorAirdropBanner({ href }: CreatorAirdropBannerProps): react_jsx_runtime.JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/creator-airdrop-banner.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { ArrowRight } from \"lucide-react\";\n\nexport interface CreatorAirdropBannerProps {\n /** Route of the airdrop claim page. */\n href: string;\n}\n\nconst HIGHLIGHTS = [\n \"Free and frictionless participation\",\n \"Eligible for every prize distribution\",\n \"Create, trade and earn more rewards\",\n];\n\nexport function CreatorAirdropBanner({ href }: CreatorAirdropBannerProps) {\n return (\n <section className=\"rounded-2xl bg-muted/50 dark:bg-card px-7 py-8 sm:px-9\">\n {/* Creator's Fund eyebrow — shared with CommunityRewardsSection */}\n <div className=\"flex items-center gap-3\">\n <span className=\"text-xs font-bold uppercase tracking-widest text-brand-orange\">\n Creator&apos;s Fund\n </span>\n <span className=\"flex items-center gap-1.5 text-xs font-medium text-muted-foreground\">\n <span className=\"h-1.5 w-1.5 rounded-full bg-brand-orange animate-pulse\" />\n Live\n </span>\n </div>\n\n <div className=\"mt-4 flex flex-col sm:flex-row sm:items-center gap-6\">\n <div className=\"flex-1 min-w-0\">\n <h2 className=\"text-2xl sm:text-3xl font-bold tracking-tight leading-tight\">\n Creator&apos;s Airdrop\n </h2>\n <p className=\"mt-1.5 text-sm text-muted-foreground leading-relaxed max-w-md\">\n Claim your participation and join the creator&apos;s fund distribution.\n </p>\n </div>\n\n <Link\n href={href}\n className=\"inline-flex items-center justify-center gap-2 rounded-xl bg-brand-orange px-6 py-3 text-sm font-semibold text-white transition-all hover:brightness-110 active:scale-[0.98] shrink-0\"\n >\n Read More\n <ArrowRight className=\"h-4 w-4\" />\n </Link>\n </div>\n\n <div className=\"mt-7 border-t border-brand-orange/20 pt-4 flex flex-wrap items-center gap-x-2.5 gap-y-1.5 text-sm text-muted-foreground\">\n {HIGHLIGHTS.map((h, i) => (\n <span key={h} className=\"flex items-center gap-2.5\">\n {i > 0 && <span className=\"text-brand-orange/50\" aria-hidden>·</span>}\n {h}\n </span>\n ))}\n </div>\n </section>\n );\n}\n"],"mappings":";AAqBQ,cAGA,YAHA;AAnBR,OAAO,UAAU;AACjB,SAAS,kBAAkB;AAO3B,MAAM,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,qBAAqB,EAAE,KAAK,GAA8B;AACxE,SACE,qBAAC,aAAQ,WAAU,0DAEjB;AAAA,yBAAC,SAAI,WAAU,2BACb;AAAA,0BAAC,UAAK,WAAU,iEAAgE,4BAEhF;AAAA,MACA,qBAAC,UAAK,WAAU,uEACd;AAAA,4BAAC,UAAK,WAAU,0DAAyD;AAAA,QAAE;AAAA,SAE7E;AAAA,OACF;AAAA,IAEA,qBAAC,SAAI,WAAU,wDACb;AAAA,2BAAC,SAAI,WAAU,kBACb;AAAA,4BAAC,QAAG,WAAU,+DAA8D,+BAE5E;AAAA,QACA,oBAAC,OAAE,WAAU,iEAAgE,gFAE7E;AAAA,SACF;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,WAAU;AAAA,UACX;AAAA;AAAA,YAEC,oBAAC,cAAW,WAAU,WAAU;AAAA;AAAA;AAAA,MAClC;AAAA,OACF;AAAA,IAEA,oBAAC,SAAI,WAAU,2HACZ,qBAAW,IAAI,CAAC,GAAG,MAClB,qBAAC,UAAa,WAAU,6BACrB;AAAA,UAAI,KAAK,oBAAC,UAAK,WAAU,wBAAuB,eAAW,MAAC,kBAAC;AAAA,MAC7D;AAAA,SAFQ,CAGX,CACD,GACH;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/components/creator-airdrop-banner.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { ArrowRight } from \"lucide-react\";\n\nexport interface CreatorAirdropBannerProps {\n\n href: string;\n}\n\nconst HIGHLIGHTS = [\n \"Free and frictionless participation\",\n \"Eligible for every prize distribution\",\n \"Create, trade and earn more rewards\",\n];\n\nexport function CreatorAirdropBanner({ href }: CreatorAirdropBannerProps) {\n return (\n <section className=\"rounded-2xl bg-muted/50 dark:bg-card px-7 py-8 sm:px-9\">\n\n <div className=\"flex items-center gap-3\">\n <span className=\"text-xs font-bold uppercase tracking-widest text-brand-orange\">\n Creator&apos;s Fund\n </span>\n <span className=\"flex items-center gap-1.5 text-xs font-medium text-muted-foreground\">\n <span className=\"h-1.5 w-1.5 rounded-full bg-brand-orange animate-pulse\" />\n Live\n </span>\n </div>\n\n <div className=\"mt-4 flex flex-col sm:flex-row sm:items-center gap-6\">\n <div className=\"flex-1 min-w-0\">\n <h2 className=\"text-2xl sm:text-3xl font-bold tracking-tight leading-tight\">\n Creator&apos;s Airdrop\n </h2>\n <p className=\"mt-1.5 text-sm text-muted-foreground leading-relaxed max-w-md\">\n Claim your participation and join the creator&apos;s fund distribution.\n </p>\n </div>\n\n <Link\n href={href}\n className=\"inline-flex items-center justify-center gap-2 rounded-xl bg-brand-orange px-6 py-3 text-sm font-semibold text-white transition-all hover:brightness-110 active:scale-[0.98] shrink-0\"\n >\n Read More\n <ArrowRight className=\"h-4 w-4\" />\n </Link>\n </div>\n\n <div className=\"mt-7 border-t border-brand-orange/20 pt-4 flex flex-wrap items-center gap-x-2.5 gap-y-1.5 text-sm text-muted-foreground\">\n {HIGHLIGHTS.map((h, i) => (\n <span key={h} className=\"flex items-center gap-2.5\">\n {i > 0 && <span className=\"text-brand-orange/50\" aria-hidden>·</span>}\n {h}\n </span>\n ))}\n </div>\n </section>\n );\n}\n"],"mappings":";AAqBQ,cAGA,YAHA;AAnBR,OAAO,UAAU;AACjB,SAAS,kBAAkB;AAO3B,MAAM,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,qBAAqB,EAAE,KAAK,GAA8B;AACxE,SACE,qBAAC,aAAQ,WAAU,0DAEjB;AAAA,yBAAC,SAAI,WAAU,2BACb;AAAA,0BAAC,UAAK,WAAU,iEAAgE,4BAEhF;AAAA,MACA,qBAAC,UAAK,WAAU,uEACd;AAAA,4BAAC,UAAK,WAAU,0DAAyD;AAAA,QAAE;AAAA,SAE7E;AAAA,OACF;AAAA,IAEA,qBAAC,SAAI,WAAU,wDACb;AAAA,2BAAC,SAAI,WAAU,kBACb;AAAA,4BAAC,QAAG,WAAU,+DAA8D,+BAE5E;AAAA,QACA,oBAAC,OAAE,WAAU,iEAAgE,gFAE7E;AAAA,SACF;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,WAAU;AAAA,UACX;AAAA;AAAA,YAEC,oBAAC,cAAW,WAAU,WAAU;AAAA;AAAA;AAAA,MAClC;AAAA,OACF;AAAA,IAEA,oBAAC,SAAI,WAAU,2HACZ,qBAAW,IAAI,CAAC,GAAG,MAClB,qBAAC,UAAa,WAAU,6BACrB;AAAA,UAAI,KAAK,oBAAC,UAAK,WAAU,wBAAuB,eAAW,MAAC,kBAAC;AAAA,MAC7D;AAAA,SAFQ,CAGX,CACD,GACH;AAAA,KACF;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/creator-analytics.tsx"],"sourcesContent":["\"use client\";\n\nimport { useMemo } from \"react\";\nimport {\n BarChart,\n Bar,\n XAxis,\n YAxis,\n Tooltip,\n ResponsiveContainer,\n} from \"recharts\";\nimport type { ApiActivity } from \"@medialane/sdk\";\nimport { TrendingUp, ShoppingBag, Coins } from \"lucide-react\";\n\ninterface CreatorAnalyticsProps {\n activities: ApiActivity[];\n isLoading: boolean;\n}\n\ninterface DayStat {\n label: string;\n volume: number;\n}\n\nfunction parsePrice(formatted: string | null | undefined): number {\n if (!formatted) return 0;\n return parseFloat(formatted.replace(/[^0-9.]/g, \"\")) || 0;\n}\n\nfunction buildDailyVolume(sales: ApiActivity[]): DayStat[] {\n const buckets = new Map<string, number>();\n const now = Date.now();\n // Pre-fill last 30 days so chart always shows full range\n for (let i = 29; i >= 0; i--) {\n const d = new Date(now - i * 86_400_000);\n buckets.set(\n d.toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\" }),\n 0\n );\n }\n for (const s of sales) {\n const ts =\n typeof s.timestamp === \"number\"\n ? s.timestamp * 1000\n : new Date(s.timestamp).getTime();\n if (now - ts > 30 * 86_400_000) continue;\n const label = new Date(ts).toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n });\n buckets.set(label, (buckets.get(label) ?? 0) + parsePrice(s.price?.formatted));\n }\n return Array.from(buckets.entries()).map(([label, volume]) => ({ label, volume }));\n}\n\nexport function CreatorAnalytics({ activities, isLoading }: CreatorAnalyticsProps) {\n const { sales, totalVolume, topCurrency, dailyVolume } = useMemo(() => {\n const sales = activities.filter((a) => a.type === \"sale\");\n\n // Volume per currency\n const byCurrency = new Map<string, number>();\n for (const s of sales) {\n const cur = s.price?.currency ?? \"STRK\";\n byCurrency.set(cur, (byCurrency.get(cur) ?? 0) + parsePrice(s.price?.formatted));\n }\n const sorted = [...byCurrency.entries()].sort((a, b) => b[1] - a[1]);\n const topCurrency = sorted[0]?.[0] ?? \"STRK\";\n const totalVolume = sorted[0]?.[1] ?? 0;\n\n const dailyVolume = buildDailyVolume(\n sales.filter((s) => (s.price?.currency ?? \"STRK\") === topCurrency)\n );\n\n return { sales, totalVolume, topCurrency, dailyVolume };\n }, [activities]);\n\n if (isLoading) {\n return (\n <div className=\"space-y-4 animate-pulse\">\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"h-20 rounded-xl bg-muted\" />\n ))}\n </div>\n );\n }\n\n if (sales.length === 0) {\n return (\n <div className=\"py-12 text-center text-sm text-muted-foreground\">\n No sales recorded yet.\n </div>\n );\n }\n\n const stats = [\n {\n label: \"Total Sales\",\n value: sales.length.toString(),\n icon: ShoppingBag,\n },\n {\n label: `Total Volume (${topCurrency})`,\n value: totalVolume.toFixed(2),\n icon: Coins,\n },\n {\n label: \"Last 30 Days\",\n value: `${dailyVolume.filter((d) => d.volume > 0).length} active days`,\n icon: TrendingUp,\n },\n ];\n\n return (\n <div className=\"space-y-6\">\n {/* Stat cards */}\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-3\">\n {stats.map(({ label, value, icon: Icon }) => (\n <div\n key={label}\n className=\"rounded-xl border border-border bg-card/50 p-4 space-y-1\"\n >\n <div className=\"flex items-center gap-2 text-muted-foreground\">\n <Icon className=\"h-3.5 w-3.5\" />\n <p className=\"text-xs font-medium uppercase tracking-wide\">{label}</p>\n </div>\n <p className=\"text-2xl font-bold tabular-nums\">{value}</p>\n </div>\n ))}\n </div>\n\n {/* 30-day volume chart */}\n <div className=\"rounded-xl border border-border bg-card/50 p-4 space-y-2\">\n <p className=\"text-xs font-medium text-muted-foreground uppercase tracking-wide\">\n 30-day volume · {topCurrency}\n </p>\n <ResponsiveContainer width=\"100%\" height={140}>\n <BarChart\n data={dailyVolume}\n margin={{ top: 4, right: 4, bottom: 0, left: 0 }}\n >\n <XAxis\n dataKey=\"label\"\n tick={{ fontSize: 10, fill: \"hsl(var(--muted-foreground))\" }}\n axisLine={false}\n tickLine={false}\n interval={6}\n />\n <YAxis\n tick={{ fontSize: 10, fill: \"hsl(var(--muted-foreground))\" }}\n axisLine={false}\n tickLine={false}\n width={40}\n />\n <Tooltip\n contentStyle={{\n background: \"hsl(var(--background))\",\n border: \"1px solid hsl(var(--border))\",\n borderRadius: \"8px\",\n fontSize: \"12px\",\n color: \"hsl(var(--foreground))\",\n }}\n formatter={(value) => [`${value} ${topCurrency}`, \"Volume\"]}\n />\n <Bar\n dataKey=\"volume\"\n fill=\"hsl(var(--primary))\"\n radius={[3, 3, 0, 0]}\n maxBarSize={24}\n />\n </BarChart>\n </ResponsiveContainer>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["sales","topCurrency","totalVolume","dailyVolume"]}
1
+ {"version":3,"sources":["../../src/components/creator-analytics.tsx"],"sourcesContent":["\"use client\";\n\nimport { useMemo } from \"react\";\nimport {\n BarChart,\n Bar,\n XAxis,\n YAxis,\n Tooltip,\n ResponsiveContainer,\n} from \"recharts\";\nimport type { ApiActivity } from \"@medialane/sdk\";\nimport { TrendingUp, ShoppingBag, Coins } from \"lucide-react\";\n\ninterface CreatorAnalyticsProps {\n activities: ApiActivity[];\n isLoading: boolean;\n}\n\ninterface DayStat {\n label: string;\n volume: number;\n}\n\nfunction parsePrice(formatted: string | null | undefined): number {\n if (!formatted) return 0;\n return parseFloat(formatted.replace(/[^0-9.]/g, \"\")) || 0;\n}\n\nfunction buildDailyVolume(sales: ApiActivity[]): DayStat[] {\n const buckets = new Map<string, number>();\n const now = Date.now();\n\n for (let i = 29; i >= 0; i--) {\n const d = new Date(now - i * 86_400_000);\n buckets.set(\n d.toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\" }),\n 0\n );\n }\n for (const s of sales) {\n const ts =\n typeof s.timestamp === \"number\"\n ? s.timestamp * 1000\n : new Date(s.timestamp).getTime();\n if (now - ts > 30 * 86_400_000) continue;\n const label = new Date(ts).toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n });\n buckets.set(label, (buckets.get(label) ?? 0) + parsePrice(s.price?.formatted));\n }\n return Array.from(buckets.entries()).map(([label, volume]) => ({ label, volume }));\n}\n\nexport function CreatorAnalytics({ activities, isLoading }: CreatorAnalyticsProps) {\n const { sales, totalVolume, topCurrency, dailyVolume } = useMemo(() => {\n const sales = activities.filter((a) => a.type === \"sale\");\n\n const byCurrency = new Map<string, number>();\n for (const s of sales) {\n const cur = s.price?.currency ?? \"STRK\";\n byCurrency.set(cur, (byCurrency.get(cur) ?? 0) + parsePrice(s.price?.formatted));\n }\n const sorted = [...byCurrency.entries()].sort((a, b) => b[1] - a[1]);\n const topCurrency = sorted[0]?.[0] ?? \"STRK\";\n const totalVolume = sorted[0]?.[1] ?? 0;\n\n const dailyVolume = buildDailyVolume(\n sales.filter((s) => (s.price?.currency ?? \"STRK\") === topCurrency)\n );\n\n return { sales, totalVolume, topCurrency, dailyVolume };\n }, [activities]);\n\n if (isLoading) {\n return (\n <div className=\"space-y-4 animate-pulse\">\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"h-20 rounded-xl bg-muted\" />\n ))}\n </div>\n );\n }\n\n if (sales.length === 0) {\n return (\n <div className=\"py-12 text-center text-sm text-muted-foreground\">\n No sales recorded yet.\n </div>\n );\n }\n\n const stats = [\n {\n label: \"Total Sales\",\n value: sales.length.toString(),\n icon: ShoppingBag,\n },\n {\n label: `Total Volume (${topCurrency})`,\n value: totalVolume.toFixed(2),\n icon: Coins,\n },\n {\n label: \"Last 30 Days\",\n value: `${dailyVolume.filter((d) => d.volume > 0).length} active days`,\n icon: TrendingUp,\n },\n ];\n\n return (\n <div className=\"space-y-6\">\n\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-3\">\n {stats.map(({ label, value, icon: Icon }) => (\n <div\n key={label}\n className=\"rounded-xl border border-border bg-card/50 p-4 space-y-1\"\n >\n <div className=\"flex items-center gap-2 text-muted-foreground\">\n <Icon className=\"h-3.5 w-3.5\" />\n <p className=\"text-xs font-medium uppercase tracking-wide\">{label}</p>\n </div>\n <p className=\"text-2xl font-bold tabular-nums\">{value}</p>\n </div>\n ))}\n </div>\n\n <div className=\"rounded-xl border border-border bg-card/50 p-4 space-y-2\">\n <p className=\"text-xs font-medium text-muted-foreground uppercase tracking-wide\">\n 30-day volume · {topCurrency}\n </p>\n <ResponsiveContainer width=\"100%\" height={140}>\n <BarChart\n data={dailyVolume}\n margin={{ top: 4, right: 4, bottom: 0, left: 0 }}\n >\n <XAxis\n dataKey=\"label\"\n tick={{ fontSize: 10, fill: \"hsl(var(--muted-foreground))\" }}\n axisLine={false}\n tickLine={false}\n interval={6}\n />\n <YAxis\n tick={{ fontSize: 10, fill: \"hsl(var(--muted-foreground))\" }}\n axisLine={false}\n tickLine={false}\n width={40}\n />\n <Tooltip\n contentStyle={{\n background: \"hsl(var(--background))\",\n border: \"1px solid hsl(var(--border))\",\n borderRadius: \"8px\",\n fontSize: \"12px\",\n color: \"hsl(var(--foreground))\",\n }}\n formatter={(value) => [`${value} ${topCurrency}`, \"Volume\"]}\n />\n <Bar\n dataKey=\"volume\"\n fill=\"hsl(var(--primary))\"\n radius={[3, 3, 0, 0]}\n maxBarSize={24}\n />\n </BarChart>\n </ResponsiveContainer>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["sales","topCurrency","totalVolume","dailyVolume"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/creator-analytics.tsx"],"sourcesContent":["\"use client\";\n\nimport { useMemo } from \"react\";\nimport {\n BarChart,\n Bar,\n XAxis,\n YAxis,\n Tooltip,\n ResponsiveContainer,\n} from \"recharts\";\nimport type { ApiActivity } from \"@medialane/sdk\";\nimport { TrendingUp, ShoppingBag, Coins } from \"lucide-react\";\n\ninterface CreatorAnalyticsProps {\n activities: ApiActivity[];\n isLoading: boolean;\n}\n\ninterface DayStat {\n label: string;\n volume: number;\n}\n\nfunction parsePrice(formatted: string | null | undefined): number {\n if (!formatted) return 0;\n return parseFloat(formatted.replace(/[^0-9.]/g, \"\")) || 0;\n}\n\nfunction buildDailyVolume(sales: ApiActivity[]): DayStat[] {\n const buckets = new Map<string, number>();\n const now = Date.now();\n // Pre-fill last 30 days so chart always shows full range\n for (let i = 29; i >= 0; i--) {\n const d = new Date(now - i * 86_400_000);\n buckets.set(\n d.toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\" }),\n 0\n );\n }\n for (const s of sales) {\n const ts =\n typeof s.timestamp === \"number\"\n ? s.timestamp * 1000\n : new Date(s.timestamp).getTime();\n if (now - ts > 30 * 86_400_000) continue;\n const label = new Date(ts).toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n });\n buckets.set(label, (buckets.get(label) ?? 0) + parsePrice(s.price?.formatted));\n }\n return Array.from(buckets.entries()).map(([label, volume]) => ({ label, volume }));\n}\n\nexport function CreatorAnalytics({ activities, isLoading }: CreatorAnalyticsProps) {\n const { sales, totalVolume, topCurrency, dailyVolume } = useMemo(() => {\n const sales = activities.filter((a) => a.type === \"sale\");\n\n // Volume per currency\n const byCurrency = new Map<string, number>();\n for (const s of sales) {\n const cur = s.price?.currency ?? \"STRK\";\n byCurrency.set(cur, (byCurrency.get(cur) ?? 0) + parsePrice(s.price?.formatted));\n }\n const sorted = [...byCurrency.entries()].sort((a, b) => b[1] - a[1]);\n const topCurrency = sorted[0]?.[0] ?? \"STRK\";\n const totalVolume = sorted[0]?.[1] ?? 0;\n\n const dailyVolume = buildDailyVolume(\n sales.filter((s) => (s.price?.currency ?? \"STRK\") === topCurrency)\n );\n\n return { sales, totalVolume, topCurrency, dailyVolume };\n }, [activities]);\n\n if (isLoading) {\n return (\n <div className=\"space-y-4 animate-pulse\">\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"h-20 rounded-xl bg-muted\" />\n ))}\n </div>\n );\n }\n\n if (sales.length === 0) {\n return (\n <div className=\"py-12 text-center text-sm text-muted-foreground\">\n No sales recorded yet.\n </div>\n );\n }\n\n const stats = [\n {\n label: \"Total Sales\",\n value: sales.length.toString(),\n icon: ShoppingBag,\n },\n {\n label: `Total Volume (${topCurrency})`,\n value: totalVolume.toFixed(2),\n icon: Coins,\n },\n {\n label: \"Last 30 Days\",\n value: `${dailyVolume.filter((d) => d.volume > 0).length} active days`,\n icon: TrendingUp,\n },\n ];\n\n return (\n <div className=\"space-y-6\">\n {/* Stat cards */}\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-3\">\n {stats.map(({ label, value, icon: Icon }) => (\n <div\n key={label}\n className=\"rounded-xl border border-border bg-card/50 p-4 space-y-1\"\n >\n <div className=\"flex items-center gap-2 text-muted-foreground\">\n <Icon className=\"h-3.5 w-3.5\" />\n <p className=\"text-xs font-medium uppercase tracking-wide\">{label}</p>\n </div>\n <p className=\"text-2xl font-bold tabular-nums\">{value}</p>\n </div>\n ))}\n </div>\n\n {/* 30-day volume chart */}\n <div className=\"rounded-xl border border-border bg-card/50 p-4 space-y-2\">\n <p className=\"text-xs font-medium text-muted-foreground uppercase tracking-wide\">\n 30-day volume · {topCurrency}\n </p>\n <ResponsiveContainer width=\"100%\" height={140}>\n <BarChart\n data={dailyVolume}\n margin={{ top: 4, right: 4, bottom: 0, left: 0 }}\n >\n <XAxis\n dataKey=\"label\"\n tick={{ fontSize: 10, fill: \"hsl(var(--muted-foreground))\" }}\n axisLine={false}\n tickLine={false}\n interval={6}\n />\n <YAxis\n tick={{ fontSize: 10, fill: \"hsl(var(--muted-foreground))\" }}\n axisLine={false}\n tickLine={false}\n width={40}\n />\n <Tooltip\n contentStyle={{\n background: \"hsl(var(--background))\",\n border: \"1px solid hsl(var(--border))\",\n borderRadius: \"8px\",\n fontSize: \"12px\",\n color: \"hsl(var(--foreground))\",\n }}\n formatter={(value) => [`${value} ${topCurrency}`, \"Volume\"]}\n />\n <Bar\n dataKey=\"volume\"\n fill=\"hsl(var(--primary))\"\n radius={[3, 3, 0, 0]}\n maxBarSize={24}\n />\n </BarChart>\n </ResponsiveContainer>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["sales","topCurrency","totalVolume","dailyVolume"]}
1
+ {"version":3,"sources":["../../src/components/creator-analytics.tsx"],"sourcesContent":["\"use client\";\n\nimport { useMemo } from \"react\";\nimport {\n BarChart,\n Bar,\n XAxis,\n YAxis,\n Tooltip,\n ResponsiveContainer,\n} from \"recharts\";\nimport type { ApiActivity } from \"@medialane/sdk\";\nimport { TrendingUp, ShoppingBag, Coins } from \"lucide-react\";\n\ninterface CreatorAnalyticsProps {\n activities: ApiActivity[];\n isLoading: boolean;\n}\n\ninterface DayStat {\n label: string;\n volume: number;\n}\n\nfunction parsePrice(formatted: string | null | undefined): number {\n if (!formatted) return 0;\n return parseFloat(formatted.replace(/[^0-9.]/g, \"\")) || 0;\n}\n\nfunction buildDailyVolume(sales: ApiActivity[]): DayStat[] {\n const buckets = new Map<string, number>();\n const now = Date.now();\n\n for (let i = 29; i >= 0; i--) {\n const d = new Date(now - i * 86_400_000);\n buckets.set(\n d.toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\" }),\n 0\n );\n }\n for (const s of sales) {\n const ts =\n typeof s.timestamp === \"number\"\n ? s.timestamp * 1000\n : new Date(s.timestamp).getTime();\n if (now - ts > 30 * 86_400_000) continue;\n const label = new Date(ts).toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n });\n buckets.set(label, (buckets.get(label) ?? 0) + parsePrice(s.price?.formatted));\n }\n return Array.from(buckets.entries()).map(([label, volume]) => ({ label, volume }));\n}\n\nexport function CreatorAnalytics({ activities, isLoading }: CreatorAnalyticsProps) {\n const { sales, totalVolume, topCurrency, dailyVolume } = useMemo(() => {\n const sales = activities.filter((a) => a.type === \"sale\");\n\n const byCurrency = new Map<string, number>();\n for (const s of sales) {\n const cur = s.price?.currency ?? \"STRK\";\n byCurrency.set(cur, (byCurrency.get(cur) ?? 0) + parsePrice(s.price?.formatted));\n }\n const sorted = [...byCurrency.entries()].sort((a, b) => b[1] - a[1]);\n const topCurrency = sorted[0]?.[0] ?? \"STRK\";\n const totalVolume = sorted[0]?.[1] ?? 0;\n\n const dailyVolume = buildDailyVolume(\n sales.filter((s) => (s.price?.currency ?? \"STRK\") === topCurrency)\n );\n\n return { sales, totalVolume, topCurrency, dailyVolume };\n }, [activities]);\n\n if (isLoading) {\n return (\n <div className=\"space-y-4 animate-pulse\">\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"h-20 rounded-xl bg-muted\" />\n ))}\n </div>\n );\n }\n\n if (sales.length === 0) {\n return (\n <div className=\"py-12 text-center text-sm text-muted-foreground\">\n No sales recorded yet.\n </div>\n );\n }\n\n const stats = [\n {\n label: \"Total Sales\",\n value: sales.length.toString(),\n icon: ShoppingBag,\n },\n {\n label: `Total Volume (${topCurrency})`,\n value: totalVolume.toFixed(2),\n icon: Coins,\n },\n {\n label: \"Last 30 Days\",\n value: `${dailyVolume.filter((d) => d.volume > 0).length} active days`,\n icon: TrendingUp,\n },\n ];\n\n return (\n <div className=\"space-y-6\">\n\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-3\">\n {stats.map(({ label, value, icon: Icon }) => (\n <div\n key={label}\n className=\"rounded-xl border border-border bg-card/50 p-4 space-y-1\"\n >\n <div className=\"flex items-center gap-2 text-muted-foreground\">\n <Icon className=\"h-3.5 w-3.5\" />\n <p className=\"text-xs font-medium uppercase tracking-wide\">{label}</p>\n </div>\n <p className=\"text-2xl font-bold tabular-nums\">{value}</p>\n </div>\n ))}\n </div>\n\n <div className=\"rounded-xl border border-border bg-card/50 p-4 space-y-2\">\n <p className=\"text-xs font-medium text-muted-foreground uppercase tracking-wide\">\n 30-day volume · {topCurrency}\n </p>\n <ResponsiveContainer width=\"100%\" height={140}>\n <BarChart\n data={dailyVolume}\n margin={{ top: 4, right: 4, bottom: 0, left: 0 }}\n >\n <XAxis\n dataKey=\"label\"\n tick={{ fontSize: 10, fill: \"hsl(var(--muted-foreground))\" }}\n axisLine={false}\n tickLine={false}\n interval={6}\n />\n <YAxis\n tick={{ fontSize: 10, fill: \"hsl(var(--muted-foreground))\" }}\n axisLine={false}\n tickLine={false}\n width={40}\n />\n <Tooltip\n contentStyle={{\n background: \"hsl(var(--background))\",\n border: \"1px solid hsl(var(--border))\",\n borderRadius: \"8px\",\n fontSize: \"12px\",\n color: \"hsl(var(--foreground))\",\n }}\n formatter={(value) => [`${value} ${topCurrency}`, \"Volume\"]}\n />\n <Bar\n dataKey=\"volume\"\n fill=\"hsl(var(--primary))\"\n radius={[3, 3, 0, 0]}\n maxBarSize={24}\n />\n </BarChart>\n </ResponsiveContainer>\n </div>\n </div>\n );\n}\n"],"mappings":";AA+EU,cAyCE,YAzCF;AA7EV,SAAS,eAAe;AACxB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,YAAY,aAAa,aAAa;AAY/C,SAAS,WAAW,WAA8C;AAChE,MAAI,CAAC,UAAW,QAAO;AACvB,SAAO,WAAW,UAAU,QAAQ,YAAY,EAAE,CAAC,KAAK;AAC1D;AAEA,SAAS,iBAAiB,OAAiC;AACzD,QAAM,UAAU,oBAAI,IAAoB;AACxC,QAAM,MAAM,KAAK,IAAI;AAErB,WAAS,IAAI,IAAI,KAAK,GAAG,KAAK;AAC5B,UAAM,IAAI,IAAI,KAAK,MAAM,IAAI,KAAU;AACvC,YAAQ;AAAA,MACN,EAAE,mBAAmB,SAAS,EAAE,OAAO,SAAS,KAAK,UAAU,CAAC;AAAA,MAChE;AAAA,IACF;AAAA,EACF;AACA,aAAW,KAAK,OAAO;AACrB,UAAM,KACJ,OAAO,EAAE,cAAc,WACnB,EAAE,YAAY,MACd,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ;AACpC,QAAI,MAAM,KAAK,KAAK,MAAY;AAChC,UAAM,QAAQ,IAAI,KAAK,EAAE,EAAE,mBAAmB,SAAS;AAAA,MACrD,OAAO;AAAA,MACP,KAAK;AAAA,IACP,CAAC;AACD,YAAQ,IAAI,QAAQ,QAAQ,IAAI,KAAK,KAAK,KAAK,WAAW,EAAE,OAAO,SAAS,CAAC;AAAA,EAC/E;AACA,SAAO,MAAM,KAAK,QAAQ,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,OAAO,MAAM,OAAO,EAAE,OAAO,OAAO,EAAE;AACnF;AAEO,SAAS,iBAAiB,EAAE,YAAY,UAAU,GAA0B;AACjF,QAAM,EAAE,OAAO,aAAa,aAAa,YAAY,IAAI,QAAQ,MAAM;AACrE,UAAMA,SAAQ,WAAW,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM;AAExD,UAAM,aAAa,oBAAI,IAAoB;AAC3C,eAAW,KAAKA,QAAO;AACrB,YAAM,MAAM,EAAE,OAAO,YAAY;AACjC,iBAAW,IAAI,MAAM,WAAW,IAAI,GAAG,KAAK,KAAK,WAAW,EAAE,OAAO,SAAS,CAAC;AAAA,IACjF;AACA,UAAM,SAAS,CAAC,GAAG,WAAW,QAAQ,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AACnE,UAAMC,eAAc,OAAO,CAAC,IAAI,CAAC,KAAK;AACtC,UAAMC,eAAc,OAAO,CAAC,IAAI,CAAC,KAAK;AAEtC,UAAMC,eAAc;AAAA,MAClBH,OAAM,OAAO,CAAC,OAAO,EAAE,OAAO,YAAY,YAAYC,YAAW;AAAA,IACnE;AAEA,WAAO,EAAE,OAAAD,QAAO,aAAAE,cAAa,aAAAD,cAAa,aAAAE,aAAY;AAAA,EACxD,GAAG,CAAC,UAAU,CAAC;AAEf,MAAI,WAAW;AACb,WACE,oBAAC,SAAI,WAAU,2BACZ,WAAC,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,MACd,oBAAC,SAAY,WAAU,8BAAb,CAAwC,CACnD,GACH;AAAA,EAEJ;AAEA,MAAI,MAAM,WAAW,GAAG;AACtB,WACE,oBAAC,SAAI,WAAU,mDAAkD,oCAEjE;AAAA,EAEJ;AAEA,QAAM,QAAQ;AAAA,IACZ;AAAA,MACE,OAAO;AAAA,MACP,OAAO,MAAM,OAAO,SAAS;AAAA,MAC7B,MAAM;AAAA,IACR;AAAA,IACA;AAAA,MACE,OAAO,iBAAiB,WAAW;AAAA,MACnC,OAAO,YAAY,QAAQ,CAAC;AAAA,MAC5B,MAAM;AAAA,IACR;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,OAAO,GAAG,YAAY,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;AAAA,MACxD,MAAM;AAAA,IACR;AAAA,EACF;AAEA,SACE,qBAAC,SAAI,WAAU,aAEb;AAAA,wBAAC,SAAI,WAAU,yCACZ,gBAAM,IAAI,CAAC,EAAE,OAAO,OAAO,MAAM,KAAK,MACrC;AAAA,MAAC;AAAA;AAAA,QAEC,WAAU;AAAA,QAEV;AAAA,+BAAC,SAAI,WAAU,iDACb;AAAA,gCAAC,QAAK,WAAU,eAAc;AAAA,YAC9B,oBAAC,OAAE,WAAU,+CAA+C,iBAAM;AAAA,aACpE;AAAA,UACA,oBAAC,OAAE,WAAU,mCAAmC,iBAAM;AAAA;AAAA;AAAA,MAPjD;AAAA,IAQP,CACD,GACH;AAAA,IAEA,qBAAC,SAAI,WAAU,4DACb;AAAA,2BAAC,OAAE,WAAU,qEAAoE;AAAA;AAAA,QAC9D;AAAA,SACnB;AAAA,MACA,oBAAC,uBAAoB,OAAM,QAAO,QAAQ,KACxC;AAAA,QAAC;AAAA;AAAA,UACC,MAAM;AAAA,UACN,QAAQ,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,EAAE;AAAA,UAE/C;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,MAAM,EAAE,UAAU,IAAI,MAAM,+BAA+B;AAAA,gBAC3D,UAAU;AAAA,gBACV,UAAU;AAAA,gBACV,UAAU;AAAA;AAAA,YACZ;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM,EAAE,UAAU,IAAI,MAAM,+BAA+B;AAAA,gBAC3D,UAAU;AAAA,gBACV,UAAU;AAAA,gBACV,OAAO;AAAA;AAAA,YACT;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,cAAc;AAAA,kBACZ,YAAY;AAAA,kBACZ,QAAQ;AAAA,kBACR,cAAc;AAAA,kBACd,UAAU;AAAA,kBACV,OAAO;AAAA,gBACT;AAAA,gBACA,WAAW,CAAC,UAAU,CAAC,GAAG,KAAK,IAAI,WAAW,IAAI,QAAQ;AAAA;AAAA,YAC5D;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,QAAQ,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,gBACnB,YAAY;AAAA;AAAA,YACd;AAAA;AAAA;AAAA,MACF,GACF;AAAA,OACF;AAAA,KACF;AAEJ;","names":["sales","topCurrency","totalVolume","dailyVolume"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/creator-score-inline.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport type { MedialaneClient } from \"@medialane/sdk/starknet\";\nimport { LevelBadge } from \"./rewards/level-badge.js\";\nimport { BadgeShelf } from \"./rewards/badge-shelf.js\";\nimport { useRewards } from \"../utils/use-rewards.js\";\n\nexport interface CreatorScoreInlineProps {\n getClient: () => MedialaneClient;\n address: string | null | undefined;\n size?: \"sm\" | \"md\" | \"lg\";\n /** Also show the earned badges under the chip (creator/profile pages). */\n showBadges?: boolean;\n /** Max badges when showBadges is set. */\n maxBadges?: number;\n className?: string;\n}\n\n/** Level chip (+ optional badge row) for an address, linking to /rewards.\n * Renders nothing while loading, on failure, or for addresses with no XP —\n * rewards must never add error states or noise to non-rewards pages. */\nexport function CreatorScoreInline({ getClient, address, size = \"sm\", showBadges = false, maxBadges = 6, className }: CreatorScoreInlineProps) {\n const { data } = useRewards(getClient, address);\n if (!data || data.totalXp <= 0) return null;\n\n return (\n <div className={className}>\n <Link href=\"/rewards\" className=\"inline-flex active:opacity-80\">\n <LevelBadge level={data.currentLevel} name={data.currentLevelName} badgeColor={data.badgeColor} size={size} />\n </Link>\n {showBadges && data.badges.length > 0 && (\n <BadgeShelf badges={data.badges.slice(0, maxBadges)} className=\"mt-2\" />\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BI;AAzBJ,kBAAiB;AAEjB,yBAA2B;AAC3B,yBAA2B;AAC3B,yBAA2B;AAgBpB,SAAS,mBAAmB,EAAE,WAAW,SAAS,OAAO,MAAM,aAAa,OAAO,YAAY,GAAG,UAAU,GAA4B;AAC7I,QAAM,EAAE,KAAK,QAAI,+BAAW,WAAW,OAAO;AAC9C,MAAI,CAAC,QAAQ,KAAK,WAAW,EAAG,QAAO;AAEvC,SACE,6CAAC,SAAI,WACH;AAAA,gDAAC,YAAAA,SAAA,EAAK,MAAK,YAAW,WAAU,iCAC9B,sDAAC,iCAAW,OAAO,KAAK,cAAc,MAAM,KAAK,kBAAkB,YAAY,KAAK,YAAY,MAAY,GAC9G;AAAA,IACC,cAAc,KAAK,OAAO,SAAS,KAClC,4CAAC,iCAAW,QAAQ,KAAK,OAAO,MAAM,GAAG,SAAS,GAAG,WAAU,QAAO;AAAA,KAE1E;AAEJ;","names":["Link"]}
1
+ {"version":3,"sources":["../../src/components/creator-score-inline.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport type { MedialaneClient } from \"@medialane/sdk/starknet\";\nimport { LevelBadge } from \"./rewards/level-badge.js\";\nimport { BadgeShelf } from \"./rewards/badge-shelf.js\";\nimport { useRewards } from \"../utils/use-rewards.js\";\n\nexport interface CreatorScoreInlineProps {\n getClient: () => MedialaneClient;\n address: string | null | undefined;\n size?: \"sm\" | \"md\" | \"lg\";\n\n showBadges?: boolean;\n\n maxBadges?: number;\n className?: string;\n}\n\nexport function CreatorScoreInline({ getClient, address, size = \"sm\", showBadges = false, maxBadges = 6, className }: CreatorScoreInlineProps) {\n const { data } = useRewards(getClient, address);\n if (!data || data.totalXp <= 0) return null;\n\n return (\n <div className={className}>\n <Link href=\"/rewards\" className=\"inline-flex active:opacity-80\">\n <LevelBadge level={data.currentLevel} name={data.currentLevelName} badgeColor={data.badgeColor} size={size} />\n </Link>\n {showBadges && data.badges.length > 0 && (\n <BadgeShelf badges={data.badges.slice(0, maxBadges)} className=\"mt-2\" />\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBI;AAtBJ,kBAAiB;AAEjB,yBAA2B;AAC3B,yBAA2B;AAC3B,yBAA2B;AAapB,SAAS,mBAAmB,EAAE,WAAW,SAAS,OAAO,MAAM,aAAa,OAAO,YAAY,GAAG,UAAU,GAA4B;AAC7I,QAAM,EAAE,KAAK,QAAI,+BAAW,WAAW,OAAO;AAC9C,MAAI,CAAC,QAAQ,KAAK,WAAW,EAAG,QAAO;AAEvC,SACE,6CAAC,SAAI,WACH;AAAA,gDAAC,YAAAA,SAAA,EAAK,MAAK,YAAW,WAAU,iCAC9B,sDAAC,iCAAW,OAAO,KAAK,cAAc,MAAM,KAAK,kBAAkB,YAAY,KAAK,YAAY,MAAY,GAC9G;AAAA,IACC,cAAc,KAAK,OAAO,SAAS,KAClC,4CAAC,iCAAW,QAAQ,KAAK,OAAO,MAAM,GAAG,SAAS,GAAG,WAAU,QAAO;AAAA,KAE1E;AAEJ;","names":["Link"]}
@@ -5,15 +5,10 @@ interface CreatorScoreInlineProps {
5
5
  getClient: () => MedialaneClient;
6
6
  address: string | null | undefined;
7
7
  size?: "sm" | "md" | "lg";
8
- /** Also show the earned badges under the chip (creator/profile pages). */
9
8
  showBadges?: boolean;
10
- /** Max badges when showBadges is set. */
11
9
  maxBadges?: number;
12
10
  className?: string;
13
11
  }
14
- /** Level chip (+ optional badge row) for an address, linking to /rewards.
15
- * Renders nothing while loading, on failure, or for addresses with no XP —
16
- * rewards must never add error states or noise to non-rewards pages. */
17
12
  declare function CreatorScoreInline({ getClient, address, size, showBadges, maxBadges, className }: CreatorScoreInlineProps): react_jsx_runtime.JSX.Element | null;
18
13
 
19
14
  export { CreatorScoreInline, type CreatorScoreInlineProps };
@@ -5,15 +5,10 @@ interface CreatorScoreInlineProps {
5
5
  getClient: () => MedialaneClient;
6
6
  address: string | null | undefined;
7
7
  size?: "sm" | "md" | "lg";
8
- /** Also show the earned badges under the chip (creator/profile pages). */
9
8
  showBadges?: boolean;
10
- /** Max badges when showBadges is set. */
11
9
  maxBadges?: number;
12
10
  className?: string;
13
11
  }
14
- /** Level chip (+ optional badge row) for an address, linking to /rewards.
15
- * Renders nothing while loading, on failure, or for addresses with no XP —
16
- * rewards must never add error states or noise to non-rewards pages. */
17
12
  declare function CreatorScoreInline({ getClient, address, size, showBadges, maxBadges, className }: CreatorScoreInlineProps): react_jsx_runtime.JSX.Element | null;
18
13
 
19
14
  export { CreatorScoreInline, type CreatorScoreInlineProps };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/creator-score-inline.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport type { MedialaneClient } from \"@medialane/sdk/starknet\";\nimport { LevelBadge } from \"./rewards/level-badge.js\";\nimport { BadgeShelf } from \"./rewards/badge-shelf.js\";\nimport { useRewards } from \"../utils/use-rewards.js\";\n\nexport interface CreatorScoreInlineProps {\n getClient: () => MedialaneClient;\n address: string | null | undefined;\n size?: \"sm\" | \"md\" | \"lg\";\n /** Also show the earned badges under the chip (creator/profile pages). */\n showBadges?: boolean;\n /** Max badges when showBadges is set. */\n maxBadges?: number;\n className?: string;\n}\n\n/** Level chip (+ optional badge row) for an address, linking to /rewards.\n * Renders nothing while loading, on failure, or for addresses with no XP —\n * rewards must never add error states or noise to non-rewards pages. */\nexport function CreatorScoreInline({ getClient, address, size = \"sm\", showBadges = false, maxBadges = 6, className }: CreatorScoreInlineProps) {\n const { data } = useRewards(getClient, address);\n if (!data || data.totalXp <= 0) return null;\n\n return (\n <div className={className}>\n <Link href=\"/rewards\" className=\"inline-flex active:opacity-80\">\n <LevelBadge level={data.currentLevel} name={data.currentLevelName} badgeColor={data.badgeColor} size={size} />\n </Link>\n {showBadges && data.badges.length > 0 && (\n <BadgeShelf badges={data.badges.slice(0, maxBadges)} className=\"mt-2\" />\n )}\n </div>\n );\n}\n"],"mappings":";AA2BI,SAEI,KAFJ;AAzBJ,OAAO,UAAU;AAEjB,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB;AAgBpB,SAAS,mBAAmB,EAAE,WAAW,SAAS,OAAO,MAAM,aAAa,OAAO,YAAY,GAAG,UAAU,GAA4B;AAC7I,QAAM,EAAE,KAAK,IAAI,WAAW,WAAW,OAAO;AAC9C,MAAI,CAAC,QAAQ,KAAK,WAAW,EAAG,QAAO;AAEvC,SACE,qBAAC,SAAI,WACH;AAAA,wBAAC,QAAK,MAAK,YAAW,WAAU,iCAC9B,8BAAC,cAAW,OAAO,KAAK,cAAc,MAAM,KAAK,kBAAkB,YAAY,KAAK,YAAY,MAAY,GAC9G;AAAA,IACC,cAAc,KAAK,OAAO,SAAS,KAClC,oBAAC,cAAW,QAAQ,KAAK,OAAO,MAAM,GAAG,SAAS,GAAG,WAAU,QAAO;AAAA,KAE1E;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/components/creator-score-inline.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport type { MedialaneClient } from \"@medialane/sdk/starknet\";\nimport { LevelBadge } from \"./rewards/level-badge.js\";\nimport { BadgeShelf } from \"./rewards/badge-shelf.js\";\nimport { useRewards } from \"../utils/use-rewards.js\";\n\nexport interface CreatorScoreInlineProps {\n getClient: () => MedialaneClient;\n address: string | null | undefined;\n size?: \"sm\" | \"md\" | \"lg\";\n\n showBadges?: boolean;\n\n maxBadges?: number;\n className?: string;\n}\n\nexport function CreatorScoreInline({ getClient, address, size = \"sm\", showBadges = false, maxBadges = 6, className }: CreatorScoreInlineProps) {\n const { data } = useRewards(getClient, address);\n if (!data || data.totalXp <= 0) return null;\n\n return (\n <div className={className}>\n <Link href=\"/rewards\" className=\"inline-flex active:opacity-80\">\n <LevelBadge level={data.currentLevel} name={data.currentLevelName} badgeColor={data.badgeColor} size={size} />\n </Link>\n {showBadges && data.badges.length > 0 && (\n <BadgeShelf badges={data.badges.slice(0, maxBadges)} className=\"mt-2\" />\n )}\n </div>\n );\n}\n"],"mappings":";AAwBI,SAEI,KAFJ;AAtBJ,OAAO,UAAU;AAEjB,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB;AAapB,SAAS,mBAAmB,EAAE,WAAW,SAAS,OAAO,MAAM,aAAa,OAAO,YAAY,GAAG,UAAU,GAA4B;AAC7I,QAAM,EAAE,KAAK,IAAI,WAAW,WAAW,OAAO;AAC9C,MAAI,CAAC,QAAQ,KAAK,WAAW,EAAG,QAAO;AAEvC,SACE,qBAAC,SAAI,WACH;AAAA,wBAAC,QAAK,MAAK,YAAW,WAAU,iCAC9B,8BAAC,cAAW,OAAO,KAAK,cAAc,MAAM,KAAK,kBAAkB,YAAY,KAAK,YAAY,MAAY,GAC9G;AAAA,IACC,cAAc,KAAK,OAAO,SAAS,KAClC,oBAAC,cAAW,QAAQ,KAAK,OAAO,MAAM,GAAG,SAAS,GAAG,WAAU,QAAO;AAAA,KAE1E;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/cta-card-grid.tsx"],"sourcesContent":["import type { ElementType } from \"react\";\nimport Link from \"next/link\";\nimport { ArrowRight } from \"lucide-react\";\nimport { cn } from \"../utils/cn.js\";\n\nexport interface CtaCardItem {\n icon: ElementType;\n title: string;\n description: string;\n links: { label: string; href: string }[];\n href: string;\n /** Tailwind gradient class applied as a 3% opacity hover overlay */\n gradient: string;\n /** Tailwind gradient + shadow class for the icon pill */\n iconGradient: string;\n}\n\nexport interface CtaCardGridProps {\n cards: CtaCardItem[];\n}\n\nfunction CtaCard({ icon: Icon, title, description, links, href, gradient, iconGradient }: CtaCardItem) {\n return (\n <div className=\"bento-cell p-6 sm:p-8 flex flex-col gap-6 relative overflow-hidden group hover:border-border/80 transition-colors\">\n <div className={`absolute inset-0 opacity-[0.03] group-hover:opacity-[0.06] transition-opacity ${gradient} pointer-events-none`} />\n\n <div className=\"relative z-10 space-y-3\">\n <div className={cn(\"h-11 w-11 rounded-2xl flex items-center justify-center shadow-lg\", iconGradient)}>\n <Icon className=\"h-5 w-5 text-white\" />\n </div>\n <div>\n <h3 className=\"text-xl font-black\">{title}</h3>\n <p className=\"text-sm text-muted-foreground leading-relaxed mt-1\">{description}</p>\n </div>\n </div>\n\n <ul className=\"relative z-10 space-y-2\">\n {links.map((link) => (\n <li key={link.href}>\n <Link href={link.href} className=\"flex items-center gap-2.5 text-sm text-muted-foreground hover:text-foreground transition-colors group/link\">\n <ArrowRight className=\"h-3.5 w-3.5 text-primary opacity-0 group-hover/link:opacity-100 transition-opacity shrink-0 -ml-0.5\" />\n {link.label}\n </Link>\n </li>\n ))}\n </ul>\n\n <div className=\"relative z-10 mt-auto\">\n <Link href={href} className=\"inline-flex items-center gap-1.5 text-sm border border-border rounded-md px-3 py-1.5 hover:border-primary/40 transition-colors group-hover:border-primary/40\">\n Explore {title} <ArrowRight className=\"h-3.5 w-3.5 ml-1.5\" />\n </Link>\n </div>\n </div>\n );\n}\n\nexport function CtaCardGrid({ cards }: CtaCardGridProps) {\n return (\n <section className=\"space-y-5\">\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n {cards.map((card) => (\n <CtaCard key={card.title} {...card} />\n ))}\n </div>\n </section>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBM;AAvBN,kBAAiB;AACjB,0BAA2B;AAC3B,gBAAmB;AAkBnB,SAAS,QAAQ,EAAE,MAAM,MAAM,OAAO,aAAa,OAAO,MAAM,UAAU,aAAa,GAAgB;AACrG,SACE,6CAAC,SAAI,WAAU,qHACb;AAAA,gDAAC,SAAI,WAAW,iFAAiF,QAAQ,wBAAwB;AAAA,IAEjI,6CAAC,SAAI,WAAU,2BACb;AAAA,kDAAC,SAAI,eAAW,cAAG,oEAAoE,YAAY,GACjG,sDAAC,QAAK,WAAU,sBAAqB,GACvC;AAAA,MACA,6CAAC,SACC;AAAA,oDAAC,QAAG,WAAU,sBAAsB,iBAAM;AAAA,QAC1C,4CAAC,OAAE,WAAU,sDAAsD,uBAAY;AAAA,SACjF;AAAA,OACF;AAAA,IAEA,4CAAC,QAAG,WAAU,2BACX,gBAAM,IAAI,CAAC,SACV,4CAAC,QACC,uDAAC,YAAAA,SAAA,EAAK,MAAM,KAAK,MAAM,WAAU,8GAC/B;AAAA,kDAAC,kCAAW,WAAU,uGAAsG;AAAA,MAC3H,KAAK;AAAA,OACR,KAJO,KAAK,IAKd,CACD,GACH;AAAA,IAEA,4CAAC,SAAI,WAAU,yBACb,uDAAC,YAAAA,SAAA,EAAK,MAAY,WAAU,gKAA+J;AAAA;AAAA,MAChL;AAAA,MAAM;AAAA,MAAC,4CAAC,kCAAW,WAAU,sBAAqB;AAAA,OAC7D,GACF;AAAA,KACF;AAEJ;AAEO,SAAS,YAAY,EAAE,MAAM,GAAqB;AACvD,SACE,4CAAC,aAAQ,WAAU,aACjB,sDAAC,SAAI,WAAU,yCACZ,gBAAM,IAAI,CAAC,SACV,4CAAC,WAA0B,GAAG,QAAhB,KAAK,KAAiB,CACrC,GACH,GACF;AAEJ;","names":["Link"]}
1
+ {"version":3,"sources":["../../src/components/cta-card-grid.tsx"],"sourcesContent":["import type { ElementType } from \"react\";\nimport Link from \"next/link\";\nimport { ArrowRight } from \"lucide-react\";\nimport { cn } from \"../utils/cn.js\";\n\nexport interface CtaCardItem {\n icon: ElementType;\n title: string;\n description: string;\n links: { label: string; href: string }[];\n href: string;\n\n gradient: string;\n\n iconGradient: string;\n}\n\nexport interface CtaCardGridProps {\n cards: CtaCardItem[];\n}\n\nfunction CtaCard({ icon: Icon, title, description, links, href, gradient, iconGradient }: CtaCardItem) {\n return (\n <div className=\"bento-cell p-6 sm:p-8 flex flex-col gap-6 relative overflow-hidden group hover:border-border/80 transition-colors\">\n <div className={`absolute inset-0 opacity-[0.03] group-hover:opacity-[0.06] transition-opacity ${gradient} pointer-events-none`} />\n\n <div className=\"relative z-10 space-y-3\">\n <div className={cn(\"h-11 w-11 rounded-2xl flex items-center justify-center shadow-lg\", iconGradient)}>\n <Icon className=\"h-5 w-5 text-white\" />\n </div>\n <div>\n <h3 className=\"text-xl font-black\">{title}</h3>\n <p className=\"text-sm text-muted-foreground leading-relaxed mt-1\">{description}</p>\n </div>\n </div>\n\n <ul className=\"relative z-10 space-y-2\">\n {links.map((link) => (\n <li key={link.href}>\n <Link href={link.href} className=\"flex items-center gap-2.5 text-sm text-muted-foreground hover:text-foreground transition-colors group/link\">\n <ArrowRight className=\"h-3.5 w-3.5 text-primary opacity-0 group-hover/link:opacity-100 transition-opacity shrink-0 -ml-0.5\" />\n {link.label}\n </Link>\n </li>\n ))}\n </ul>\n\n <div className=\"relative z-10 mt-auto\">\n <Link href={href} className=\"inline-flex items-center gap-1.5 text-sm border border-border rounded-md px-3 py-1.5 hover:border-primary/40 transition-colors group-hover:border-primary/40\">\n Explore {title} <ArrowRight className=\"h-3.5 w-3.5 ml-1.5\" />\n </Link>\n </div>\n </div>\n );\n}\n\nexport function CtaCardGrid({ cards }: CtaCardGridProps) {\n return (\n <section className=\"space-y-5\">\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n {cards.map((card) => (\n <CtaCard key={card.title} {...card} />\n ))}\n </div>\n </section>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBM;AAvBN,kBAAiB;AACjB,0BAA2B;AAC3B,gBAAmB;AAkBnB,SAAS,QAAQ,EAAE,MAAM,MAAM,OAAO,aAAa,OAAO,MAAM,UAAU,aAAa,GAAgB;AACrG,SACE,6CAAC,SAAI,WAAU,qHACb;AAAA,gDAAC,SAAI,WAAW,iFAAiF,QAAQ,wBAAwB;AAAA,IAEjI,6CAAC,SAAI,WAAU,2BACb;AAAA,kDAAC,SAAI,eAAW,cAAG,oEAAoE,YAAY,GACjG,sDAAC,QAAK,WAAU,sBAAqB,GACvC;AAAA,MACA,6CAAC,SACC;AAAA,oDAAC,QAAG,WAAU,sBAAsB,iBAAM;AAAA,QAC1C,4CAAC,OAAE,WAAU,sDAAsD,uBAAY;AAAA,SACjF;AAAA,OACF;AAAA,IAEA,4CAAC,QAAG,WAAU,2BACX,gBAAM,IAAI,CAAC,SACV,4CAAC,QACC,uDAAC,YAAAA,SAAA,EAAK,MAAM,KAAK,MAAM,WAAU,8GAC/B;AAAA,kDAAC,kCAAW,WAAU,uGAAsG;AAAA,MAC3H,KAAK;AAAA,OACR,KAJO,KAAK,IAKd,CACD,GACH;AAAA,IAEA,4CAAC,SAAI,WAAU,yBACb,uDAAC,YAAAA,SAAA,EAAK,MAAY,WAAU,gKAA+J;AAAA;AAAA,MAChL;AAAA,MAAM;AAAA,MAAC,4CAAC,kCAAW,WAAU,sBAAqB;AAAA,OAC7D,GACF;AAAA,KACF;AAEJ;AAEO,SAAS,YAAY,EAAE,MAAM,GAAqB;AACvD,SACE,4CAAC,aAAQ,WAAU,aACjB,sDAAC,SAAI,WAAU,yCACZ,gBAAM,IAAI,CAAC,SACV,4CAAC,WAA0B,GAAG,QAAhB,KAAK,KAAiB,CACrC,GACH,GACF;AAEJ;","names":["Link"]}
@@ -10,9 +10,7 @@ interface CtaCardItem {
10
10
  href: string;
11
11
  }[];
12
12
  href: string;
13
- /** Tailwind gradient class applied as a 3% opacity hover overlay */
14
13
  gradient: string;
15
- /** Tailwind gradient + shadow class for the icon pill */
16
14
  iconGradient: string;
17
15
  }
18
16
  interface CtaCardGridProps {
@@ -10,9 +10,7 @@ interface CtaCardItem {
10
10
  href: string;
11
11
  }[];
12
12
  href: string;
13
- /** Tailwind gradient class applied as a 3% opacity hover overlay */
14
13
  gradient: string;
15
- /** Tailwind gradient + shadow class for the icon pill */
16
14
  iconGradient: string;
17
15
  }
18
16
  interface CtaCardGridProps {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/cta-card-grid.tsx"],"sourcesContent":["import type { ElementType } from \"react\";\nimport Link from \"next/link\";\nimport { ArrowRight } from \"lucide-react\";\nimport { cn } from \"../utils/cn.js\";\n\nexport interface CtaCardItem {\n icon: ElementType;\n title: string;\n description: string;\n links: { label: string; href: string }[];\n href: string;\n /** Tailwind gradient class applied as a 3% opacity hover overlay */\n gradient: string;\n /** Tailwind gradient + shadow class for the icon pill */\n iconGradient: string;\n}\n\nexport interface CtaCardGridProps {\n cards: CtaCardItem[];\n}\n\nfunction CtaCard({ icon: Icon, title, description, links, href, gradient, iconGradient }: CtaCardItem) {\n return (\n <div className=\"bento-cell p-6 sm:p-8 flex flex-col gap-6 relative overflow-hidden group hover:border-border/80 transition-colors\">\n <div className={`absolute inset-0 opacity-[0.03] group-hover:opacity-[0.06] transition-opacity ${gradient} pointer-events-none`} />\n\n <div className=\"relative z-10 space-y-3\">\n <div className={cn(\"h-11 w-11 rounded-2xl flex items-center justify-center shadow-lg\", iconGradient)}>\n <Icon className=\"h-5 w-5 text-white\" />\n </div>\n <div>\n <h3 className=\"text-xl font-black\">{title}</h3>\n <p className=\"text-sm text-muted-foreground leading-relaxed mt-1\">{description}</p>\n </div>\n </div>\n\n <ul className=\"relative z-10 space-y-2\">\n {links.map((link) => (\n <li key={link.href}>\n <Link href={link.href} className=\"flex items-center gap-2.5 text-sm text-muted-foreground hover:text-foreground transition-colors group/link\">\n <ArrowRight className=\"h-3.5 w-3.5 text-primary opacity-0 group-hover/link:opacity-100 transition-opacity shrink-0 -ml-0.5\" />\n {link.label}\n </Link>\n </li>\n ))}\n </ul>\n\n <div className=\"relative z-10 mt-auto\">\n <Link href={href} className=\"inline-flex items-center gap-1.5 text-sm border border-border rounded-md px-3 py-1.5 hover:border-primary/40 transition-colors group-hover:border-primary/40\">\n Explore {title} <ArrowRight className=\"h-3.5 w-3.5 ml-1.5\" />\n </Link>\n </div>\n </div>\n );\n}\n\nexport function CtaCardGrid({ cards }: CtaCardGridProps) {\n return (\n <section className=\"space-y-5\">\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n {cards.map((card) => (\n <CtaCard key={card.title} {...card} />\n ))}\n </div>\n </section>\n );\n}\n"],"mappings":"AAwBM,cAME,YANF;AAvBN,OAAO,UAAU;AACjB,SAAS,kBAAkB;AAC3B,SAAS,UAAU;AAkBnB,SAAS,QAAQ,EAAE,MAAM,MAAM,OAAO,aAAa,OAAO,MAAM,UAAU,aAAa,GAAgB;AACrG,SACE,qBAAC,SAAI,WAAU,qHACb;AAAA,wBAAC,SAAI,WAAW,iFAAiF,QAAQ,wBAAwB;AAAA,IAEjI,qBAAC,SAAI,WAAU,2BACb;AAAA,0BAAC,SAAI,WAAW,GAAG,oEAAoE,YAAY,GACjG,8BAAC,QAAK,WAAU,sBAAqB,GACvC;AAAA,MACA,qBAAC,SACC;AAAA,4BAAC,QAAG,WAAU,sBAAsB,iBAAM;AAAA,QAC1C,oBAAC,OAAE,WAAU,sDAAsD,uBAAY;AAAA,SACjF;AAAA,OACF;AAAA,IAEA,oBAAC,QAAG,WAAU,2BACX,gBAAM,IAAI,CAAC,SACV,oBAAC,QACC,+BAAC,QAAK,MAAM,KAAK,MAAM,WAAU,8GAC/B;AAAA,0BAAC,cAAW,WAAU,uGAAsG;AAAA,MAC3H,KAAK;AAAA,OACR,KAJO,KAAK,IAKd,CACD,GACH;AAAA,IAEA,oBAAC,SAAI,WAAU,yBACb,+BAAC,QAAK,MAAY,WAAU,gKAA+J;AAAA;AAAA,MAChL;AAAA,MAAM;AAAA,MAAC,oBAAC,cAAW,WAAU,sBAAqB;AAAA,OAC7D,GACF;AAAA,KACF;AAEJ;AAEO,SAAS,YAAY,EAAE,MAAM,GAAqB;AACvD,SACE,oBAAC,aAAQ,WAAU,aACjB,8BAAC,SAAI,WAAU,yCACZ,gBAAM,IAAI,CAAC,SACV,oBAAC,WAA0B,GAAG,QAAhB,KAAK,KAAiB,CACrC,GACH,GACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/components/cta-card-grid.tsx"],"sourcesContent":["import type { ElementType } from \"react\";\nimport Link from \"next/link\";\nimport { ArrowRight } from \"lucide-react\";\nimport { cn } from \"../utils/cn.js\";\n\nexport interface CtaCardItem {\n icon: ElementType;\n title: string;\n description: string;\n links: { label: string; href: string }[];\n href: string;\n\n gradient: string;\n\n iconGradient: string;\n}\n\nexport interface CtaCardGridProps {\n cards: CtaCardItem[];\n}\n\nfunction CtaCard({ icon: Icon, title, description, links, href, gradient, iconGradient }: CtaCardItem) {\n return (\n <div className=\"bento-cell p-6 sm:p-8 flex flex-col gap-6 relative overflow-hidden group hover:border-border/80 transition-colors\">\n <div className={`absolute inset-0 opacity-[0.03] group-hover:opacity-[0.06] transition-opacity ${gradient} pointer-events-none`} />\n\n <div className=\"relative z-10 space-y-3\">\n <div className={cn(\"h-11 w-11 rounded-2xl flex items-center justify-center shadow-lg\", iconGradient)}>\n <Icon className=\"h-5 w-5 text-white\" />\n </div>\n <div>\n <h3 className=\"text-xl font-black\">{title}</h3>\n <p className=\"text-sm text-muted-foreground leading-relaxed mt-1\">{description}</p>\n </div>\n </div>\n\n <ul className=\"relative z-10 space-y-2\">\n {links.map((link) => (\n <li key={link.href}>\n <Link href={link.href} className=\"flex items-center gap-2.5 text-sm text-muted-foreground hover:text-foreground transition-colors group/link\">\n <ArrowRight className=\"h-3.5 w-3.5 text-primary opacity-0 group-hover/link:opacity-100 transition-opacity shrink-0 -ml-0.5\" />\n {link.label}\n </Link>\n </li>\n ))}\n </ul>\n\n <div className=\"relative z-10 mt-auto\">\n <Link href={href} className=\"inline-flex items-center gap-1.5 text-sm border border-border rounded-md px-3 py-1.5 hover:border-primary/40 transition-colors group-hover:border-primary/40\">\n Explore {title} <ArrowRight className=\"h-3.5 w-3.5 ml-1.5\" />\n </Link>\n </div>\n </div>\n );\n}\n\nexport function CtaCardGrid({ cards }: CtaCardGridProps) {\n return (\n <section className=\"space-y-5\">\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n {cards.map((card) => (\n <CtaCard key={card.title} {...card} />\n ))}\n </div>\n </section>\n );\n}\n"],"mappings":"AAwBM,cAME,YANF;AAvBN,OAAO,UAAU;AACjB,SAAS,kBAAkB;AAC3B,SAAS,UAAU;AAkBnB,SAAS,QAAQ,EAAE,MAAM,MAAM,OAAO,aAAa,OAAO,MAAM,UAAU,aAAa,GAAgB;AACrG,SACE,qBAAC,SAAI,WAAU,qHACb;AAAA,wBAAC,SAAI,WAAW,iFAAiF,QAAQ,wBAAwB;AAAA,IAEjI,qBAAC,SAAI,WAAU,2BACb;AAAA,0BAAC,SAAI,WAAW,GAAG,oEAAoE,YAAY,GACjG,8BAAC,QAAK,WAAU,sBAAqB,GACvC;AAAA,MACA,qBAAC,SACC;AAAA,4BAAC,QAAG,WAAU,sBAAsB,iBAAM;AAAA,QAC1C,oBAAC,OAAE,WAAU,sDAAsD,uBAAY;AAAA,SACjF;AAAA,OACF;AAAA,IAEA,oBAAC,QAAG,WAAU,2BACX,gBAAM,IAAI,CAAC,SACV,oBAAC,QACC,+BAAC,QAAK,MAAM,KAAK,MAAM,WAAU,8GAC/B;AAAA,0BAAC,cAAW,WAAU,uGAAsG;AAAA,MAC3H,KAAK;AAAA,OACR,KAJO,KAAK,IAKd,CACD,GACH;AAAA,IAEA,oBAAC,SAAI,WAAU,yBACb,+BAAC,QAAK,MAAY,WAAU,gKAA+J;AAAA;AAAA,MAChL;AAAA,MAAM;AAAA,MAAC,oBAAC,cAAW,WAAU,sBAAqB;AAAA,OAC7D,GACF;AAAA,KACF;AAEJ;AAEO,SAAS,YAAY,EAAE,MAAM,GAAqB;AACvD,SACE,oBAAC,aAAQ,WAAU,aACjB,8BAAC,SAAI,WAAU,yCACZ,gBAAM,IAAI,CAAC,SACV,oBAAC,WAA0B,GAAG,QAAhB,KAAK,KAAiB,CACrC,GACH,GACF;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/currency-icon.tsx"],"sourcesContent":["\"use client\";\n\nimport Image from \"next/image\";\nimport { cn } from \"../utils/cn.js\";\n\nconst CURRENCY_ICON_PATHS: Record<string, string> = {\n USDC: \"/usdc.svg\",\n USDT: \"/usdt.svg\",\n ETH: \"/eth.svg\",\n STRK: \"/strk.svg\",\n WBTC: \"/btc.svg\",\n};\n\nexport interface CurrencyIconProps {\n symbol: string | null | undefined;\n size?: number;\n className?: string;\n /**\n * Base path prepended to icon paths. Default: \"\" (icons served from app's public root).\n * Example: \"https://cdn.medialane.io/icons\"\n */\n iconsBasePath?: string;\n}\n\nexport function CurrencyIcon({ symbol, size = 16, className, iconsBasePath = \"\" }: CurrencyIconProps) {\n const path = symbol ? CURRENCY_ICON_PATHS[symbol] : undefined;\n if (!path) return null;\n return (\n <Image\n src={`${iconsBasePath}${path}`}\n alt={symbol ?? \"\"}\n width={size}\n height={size}\n className={cn(\"inline-block shrink-0\", className)}\n unoptimized\n />\n );\n}\n\nexport interface CurrencyAmountProps {\n amount: string;\n symbol: string | null | undefined;\n amountClassName?: string;\n iconSize?: number;\n className?: string;\n /** Forwarded to CurrencyIcon. */\n iconsBasePath?: string;\n}\n\nexport function CurrencyAmount({\n amount,\n symbol,\n amountClassName,\n iconSize = 14,\n className,\n iconsBasePath,\n}: CurrencyAmountProps) {\n return (\n <span className={cn(\"inline-flex items-center gap-1\", className)}>\n <CurrencyIcon symbol={symbol} size={iconSize} iconsBasePath={iconsBasePath} />\n <span className={amountClassName}>{amount}</span>\n </span>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA4BI;AA1BJ,mBAAkB;AAClB,gBAAmB;AAEnB,MAAM,sBAA8C;AAAA,EAClD,MAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AACR;AAaO,SAAS,aAAa,EAAE,QAAQ,OAAO,IAAI,WAAW,gBAAgB,GAAG,GAAsB;AACpG,QAAM,OAAO,SAAS,oBAAoB,MAAM,IAAI;AACpD,MAAI,CAAC,KAAM,QAAO;AAClB,SACE;AAAA,IAAC,aAAAA;AAAA,IAAA;AAAA,MACC,KAAK,GAAG,aAAa,GAAG,IAAI;AAAA,MAC5B,KAAK,UAAU;AAAA,MACf,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,eAAW,cAAG,yBAAyB,SAAS;AAAA,MAChD,aAAW;AAAA;AAAA,EACb;AAEJ;AAYO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AACF,GAAwB;AACtB,SACE,6CAAC,UAAK,eAAW,cAAG,kCAAkC,SAAS,GAC7D;AAAA,gDAAC,gBAAa,QAAgB,MAAM,UAAU,eAA8B;AAAA,IAC5E,4CAAC,UAAK,WAAW,iBAAkB,kBAAO;AAAA,KAC5C;AAEJ;","names":["Image"]}
1
+ {"version":3,"sources":["../../src/components/currency-icon.tsx"],"sourcesContent":["\"use client\";\n\nimport Image from \"next/image\";\nimport { cn } from \"../utils/cn.js\";\n\nconst CURRENCY_ICON_PATHS: Record<string, string> = {\n USDC: \"/usdc.svg\",\n USDT: \"/usdt.svg\",\n ETH: \"/eth.svg\",\n STRK: \"/strk.svg\",\n WBTC: \"/btc.svg\",\n};\n\nexport interface CurrencyIconProps {\n symbol: string | null | undefined;\n size?: number;\n className?: string;\n\n iconsBasePath?: string;\n}\n\nexport function CurrencyIcon({ symbol, size = 16, className, iconsBasePath = \"\" }: CurrencyIconProps) {\n const path = symbol ? CURRENCY_ICON_PATHS[symbol] : undefined;\n if (!path) return null;\n return (\n <Image\n src={`${iconsBasePath}${path}`}\n alt={symbol ?? \"\"}\n width={size}\n height={size}\n className={cn(\"inline-block shrink-0\", className)}\n unoptimized\n />\n );\n}\n\nexport interface CurrencyAmountProps {\n amount: string;\n symbol: string | null | undefined;\n amountClassName?: string;\n iconSize?: number;\n className?: string;\n\n iconsBasePath?: string;\n}\n\nexport function CurrencyAmount({\n amount,\n symbol,\n amountClassName,\n iconSize = 14,\n className,\n iconsBasePath,\n}: CurrencyAmountProps) {\n return (\n <span className={cn(\"inline-flex items-center gap-1\", className)}>\n <CurrencyIcon symbol={symbol} size={iconSize} iconsBasePath={iconsBasePath} />\n <span className={amountClassName}>{amount}</span>\n </span>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBI;AAvBJ,mBAAkB;AAClB,gBAAmB;AAEnB,MAAM,sBAA8C;AAAA,EAClD,MAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AACR;AAUO,SAAS,aAAa,EAAE,QAAQ,OAAO,IAAI,WAAW,gBAAgB,GAAG,GAAsB;AACpG,QAAM,OAAO,SAAS,oBAAoB,MAAM,IAAI;AACpD,MAAI,CAAC,KAAM,QAAO;AAClB,SACE;AAAA,IAAC,aAAAA;AAAA,IAAA;AAAA,MACC,KAAK,GAAG,aAAa,GAAG,IAAI;AAAA,MAC5B,KAAK,UAAU;AAAA,MACf,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,eAAW,cAAG,yBAAyB,SAAS;AAAA,MAChD,aAAW;AAAA;AAAA,EACb;AAEJ;AAYO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AACF,GAAwB;AACtB,SACE,6CAAC,UAAK,eAAW,cAAG,kCAAkC,SAAS,GAC7D;AAAA,gDAAC,gBAAa,QAAgB,MAAM,UAAU,eAA8B;AAAA,IAC5E,4CAAC,UAAK,WAAW,iBAAkB,kBAAO;AAAA,KAC5C;AAEJ;","names":["Image"]}
@@ -4,10 +4,6 @@ interface CurrencyIconProps {
4
4
  symbol: string | null | undefined;
5
5
  size?: number;
6
6
  className?: string;
7
- /**
8
- * Base path prepended to icon paths. Default: "" (icons served from app's public root).
9
- * Example: "https://cdn.medialane.io/icons"
10
- */
11
7
  iconsBasePath?: string;
12
8
  }
13
9
  declare function CurrencyIcon({ symbol, size, className, iconsBasePath }: CurrencyIconProps): react_jsx_runtime.JSX.Element | null;
@@ -17,7 +13,6 @@ interface CurrencyAmountProps {
17
13
  amountClassName?: string;
18
14
  iconSize?: number;
19
15
  className?: string;
20
- /** Forwarded to CurrencyIcon. */
21
16
  iconsBasePath?: string;
22
17
  }
23
18
  declare function CurrencyAmount({ amount, symbol, amountClassName, iconSize, className, iconsBasePath, }: CurrencyAmountProps): react_jsx_runtime.JSX.Element;