@medialane/ui 0.258.0 → 0.260.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 (167) hide show
  1. package/dist/components/activities-feed.cjs +5 -1
  2. package/dist/components/activities-feed.cjs.map +1 -1
  3. package/dist/components/activities-feed.js +5 -1
  4. package/dist/components/activities-feed.js.map +1 -1
  5. package/dist/components/activity-feed-shell.cjs +3 -1
  6. package/dist/components/activity-feed-shell.cjs.map +1 -1
  7. package/dist/components/activity-feed-shell.js +3 -1
  8. package/dist/components/activity-feed-shell.js.map +1 -1
  9. package/dist/components/button.d.cts +1 -1
  10. package/dist/components/button.d.ts +1 -1
  11. package/dist/components/coins-explorer.cjs +5 -1
  12. package/dist/components/coins-explorer.cjs.map +1 -1
  13. package/dist/components/coins-explorer.js +6 -2
  14. package/dist/components/coins-explorer.js.map +1 -1
  15. package/dist/components/comments-section.cjs +7 -6
  16. package/dist/components/comments-section.cjs.map +1 -1
  17. package/dist/components/comments-section.js +7 -6
  18. package/dist/components/comments-section.js.map +1 -1
  19. package/dist/components/discover-community-section.cjs +5 -1
  20. package/dist/components/discover-community-section.cjs.map +1 -1
  21. package/dist/components/discover-community-section.js +5 -1
  22. package/dist/components/discover-community-section.js.map +1 -1
  23. package/dist/components/discover-feed-section.cjs +5 -1
  24. package/dist/components/discover-feed-section.cjs.map +1 -1
  25. package/dist/components/discover-feed-section.js +5 -1
  26. package/dist/components/discover-feed-section.js.map +1 -1
  27. package/dist/components/fast-mint/fast-mint.d.cts +2 -2
  28. package/dist/components/fast-mint/fast-mint.d.ts +2 -2
  29. package/dist/components/fast-mint/success-view.cjs +2 -2
  30. package/dist/components/fast-mint/success-view.cjs.map +1 -1
  31. package/dist/components/fast-mint/success-view.js +2 -2
  32. package/dist/components/fast-mint/success-view.js.map +1 -1
  33. package/dist/components/ip-type-page.cjs +3 -2
  34. package/dist/components/ip-type-page.cjs.map +1 -1
  35. package/dist/components/ip-type-page.js +3 -2
  36. package/dist/components/ip-type-page.js.map +1 -1
  37. package/dist/components/launchpad/coin-create.cjs +9 -7
  38. package/dist/components/launchpad/coin-create.cjs.map +1 -1
  39. package/dist/components/launchpad/coin-create.js +9 -7
  40. package/dist/components/launchpad/coin-create.js.map +1 -1
  41. package/dist/components/launchpad/collection-create-form.cjs +11 -14
  42. package/dist/components/launchpad/collection-create-form.cjs.map +1 -1
  43. package/dist/components/launchpad/collection-create-form.js +12 -15
  44. package/dist/components/launchpad/collection-create-form.js.map +1 -1
  45. package/dist/components/launchpad/collection-create-presets.cjs +8 -8
  46. package/dist/components/launchpad/collection-create-presets.cjs.map +1 -1
  47. package/dist/components/launchpad/collection-create-presets.d.cts +2 -1
  48. package/dist/components/launchpad/collection-create-presets.d.ts +2 -1
  49. package/dist/components/launchpad/collection-create-presets.js +8 -8
  50. package/dist/components/launchpad/collection-create-presets.js.map +1 -1
  51. package/dist/components/launchpad/edition-mint.cjs +9 -7
  52. package/dist/components/launchpad/edition-mint.cjs.map +1 -1
  53. package/dist/components/launchpad/edition-mint.js +9 -7
  54. package/dist/components/launchpad/edition-mint.js.map +1 -1
  55. package/dist/components/launchpad/pop-create.cjs +5 -6
  56. package/dist/components/launchpad/pop-create.cjs.map +1 -1
  57. package/dist/components/launchpad/pop-create.js +5 -6
  58. package/dist/components/launchpad/pop-create.js.map +1 -1
  59. package/dist/components/launchpad/remix-mint.cjs +9 -7
  60. package/dist/components/launchpad/remix-mint.cjs.map +1 -1
  61. package/dist/components/launchpad/remix-mint.js +9 -7
  62. package/dist/components/launchpad/remix-mint.js.map +1 -1
  63. package/dist/components/launchpad/single-edition-mint.cjs +9 -7
  64. package/dist/components/launchpad/single-edition-mint.cjs.map +1 -1
  65. package/dist/components/launchpad/single-edition-mint.js +9 -7
  66. package/dist/components/launchpad/single-edition-mint.js.map +1 -1
  67. package/dist/components/launchpad/sponsorship-create.cjs +5 -6
  68. package/dist/components/launchpad/sponsorship-create.cjs.map +1 -1
  69. package/dist/components/launchpad/sponsorship-create.js +5 -6
  70. package/dist/components/launchpad/sponsorship-create.js.map +1 -1
  71. package/dist/components/launchpad/tier-mint-form.cjs +5 -6
  72. package/dist/components/launchpad/tier-mint-form.cjs.map +1 -1
  73. package/dist/components/launchpad/tier-mint-form.js +5 -6
  74. package/dist/components/launchpad/tier-mint-form.js.map +1 -1
  75. package/dist/components/launchpad/tier-mint-presets.cjs +2 -2
  76. package/dist/components/launchpad/tier-mint-presets.cjs.map +1 -1
  77. package/dist/components/launchpad/tier-mint-presets.d.cts +2 -1
  78. package/dist/components/launchpad/tier-mint-presets.d.ts +2 -1
  79. package/dist/components/launchpad/tier-mint-presets.js +2 -2
  80. package/dist/components/launchpad/tier-mint-presets.js.map +1 -1
  81. package/dist/components/marketplace-dialog-primitives.cjs +1 -31
  82. package/dist/components/marketplace-dialog-primitives.cjs.map +1 -1
  83. package/dist/components/marketplace-dialog-primitives.d.cts +1 -12
  84. package/dist/components/marketplace-dialog-primitives.d.ts +1 -12
  85. package/dist/components/marketplace-dialog-primitives.js +2 -31
  86. package/dist/components/marketplace-dialog-primitives.js.map +1 -1
  87. package/dist/components/media-wallet/media-wallet-activity.cjs +5 -1
  88. package/dist/components/media-wallet/media-wallet-activity.cjs.map +1 -1
  89. package/dist/components/media-wallet/media-wallet-activity.js +5 -1
  90. package/dist/components/media-wallet/media-wallet-activity.js.map +1 -1
  91. package/dist/components/media-wallet/media-wallet-home.cjs +3 -2
  92. package/dist/components/media-wallet/media-wallet-home.cjs.map +1 -1
  93. package/dist/components/media-wallet/media-wallet-home.js +3 -2
  94. package/dist/components/media-wallet/media-wallet-home.js.map +1 -1
  95. package/dist/components/media-wallet/media-wallet-send.cjs +5 -2
  96. package/dist/components/media-wallet/media-wallet-send.cjs.map +1 -1
  97. package/dist/components/media-wallet/media-wallet-send.js +5 -2
  98. package/dist/components/media-wallet/media-wallet-send.js.map +1 -1
  99. package/dist/components/media-wallet/success-dialog.cjs +5 -11
  100. package/dist/components/media-wallet/success-dialog.cjs.map +1 -1
  101. package/dist/components/media-wallet/success-dialog.js +5 -11
  102. package/dist/components/media-wallet/success-dialog.js.map +1 -1
  103. package/dist/components/pop-claim-button.cjs +7 -6
  104. package/dist/components/pop-claim-button.cjs.map +1 -1
  105. package/dist/components/pop-claim-button.js +7 -6
  106. package/dist/components/pop-claim-button.js.map +1 -1
  107. package/dist/components/pop-manage-page.cjs +5 -4
  108. package/dist/components/pop-manage-page.cjs.map +1 -1
  109. package/dist/components/pop-manage-page.js +5 -4
  110. package/dist/components/pop-manage-page.js.map +1 -1
  111. package/dist/components/portfolio-sponsorships.cjs +15 -8
  112. package/dist/components/portfolio-sponsorships.cjs.map +1 -1
  113. package/dist/components/portfolio-sponsorships.js +15 -8
  114. package/dist/components/portfolio-sponsorships.js.map +1 -1
  115. package/dist/components/service-collections-page.cjs +2 -2
  116. package/dist/components/service-collections-page.cjs.map +1 -1
  117. package/dist/components/service-collections-page.d.cts +2 -2
  118. package/dist/components/service-collections-page.d.ts +2 -2
  119. package/dist/components/service-collections-page.js +2 -2
  120. package/dist/components/service-collections-page.js.map +1 -1
  121. package/dist/components/sheet.d.cts +1 -1
  122. package/dist/components/sheet.d.ts +1 -1
  123. package/dist/components/sponsorship-offer-page.cjs +9 -8
  124. package/dist/components/sponsorship-offer-page.cjs.map +1 -1
  125. package/dist/components/sponsorship-offer-page.js +9 -8
  126. package/dist/components/sponsorship-offer-page.js.map +1 -1
  127. package/dist/components/transaction-success.cjs +60 -0
  128. package/dist/components/transaction-success.cjs.map +1 -0
  129. package/dist/components/transaction-success.d.cts +20 -0
  130. package/dist/components/transaction-success.d.ts +20 -0
  131. package/dist/components/transaction-success.js +26 -0
  132. package/dist/components/transaction-success.js.map +1 -0
  133. package/dist/components/transfer-collection-ownership.cjs +6 -8
  134. package/dist/components/transfer-collection-ownership.cjs.map +1 -1
  135. package/dist/components/transfer-collection-ownership.js +6 -8
  136. package/dist/components/transfer-collection-ownership.js.map +1 -1
  137. package/dist/index.cjs +9 -8
  138. package/dist/index.cjs.map +1 -1
  139. package/dist/index.d.cts +4 -3
  140. package/dist/index.d.ts +4 -3
  141. package/dist/index.js +6 -6
  142. package/dist/index.js.map +1 -1
  143. package/dist/utils/empty-messages.cjs +62 -0
  144. package/dist/utils/empty-messages.cjs.map +1 -0
  145. package/dist/utils/empty-messages.d.cts +40 -0
  146. package/dist/utils/empty-messages.d.ts +40 -0
  147. package/dist/utils/empty-messages.js +38 -0
  148. package/dist/utils/empty-messages.js.map +1 -0
  149. package/dist/utils/success-messages.cjs +106 -0
  150. package/dist/utils/success-messages.cjs.map +1 -0
  151. package/dist/utils/success-messages.d.cts +58 -0
  152. package/dist/utils/success-messages.d.ts +58 -0
  153. package/dist/utils/success-messages.js +82 -0
  154. package/dist/utils/success-messages.js.map +1 -0
  155. package/package.json +3 -3
  156. package/dist/components/creation-success.cjs +0 -64
  157. package/dist/components/creation-success.cjs.map +0 -1
  158. package/dist/components/creation-success.d.cts +0 -20
  159. package/dist/components/creation-success.d.ts +0 -20
  160. package/dist/components/creation-success.js +0 -30
  161. package/dist/components/creation-success.js.map +0 -1
  162. package/dist/components/transaction-done.cjs +0 -46
  163. package/dist/components/transaction-done.cjs.map +0 -1
  164. package/dist/components/transaction-done.d.cts +0 -18
  165. package/dist/components/transaction-done.d.ts +0 -18
  166. package/dist/components/transaction-done.js +0 -22
  167. package/dist/components/transaction-done.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/fast-mint/success-view.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport Link from \"../link.js\";\nimport { CheckCircle2, Eye, Tag, ArrowRightLeft, GitBranch } from \"lucide-react\";\nimport { cn } from \"../../utils/cn.js\";\nimport { Button } from \"../button.js\";\nimport { MedialaneCollectionCard } from \"../medialane-collection-card.js\";\nimport type { MintedAsset } from \"./types.js\";\n\nexport interface SuccessViewProps {\n presentation?: \"inline\" | \"dialog\";\n previewImage: string | null;\n name: string;\n collectionLabel?: string;\n mintedAsset: MintedAsset | null;\n onPublishAnother: () => void;\n footer?: ReactNode;\n}\n\nexport function SuccessView({\n presentation = \"inline\",\n previewImage,\n name,\n collectionLabel,\n mintedAsset,\n footer,\n onPublishAnother,\n}: SuccessViewProps) {\n return (\n <section className={cn(presentation === \"dialog\" ? \"\" : \"rounded-2xl border border-border p-6 sm:p-8\")}>\n <div className=\"grid grid-cols-1 sm:grid-cols-[220px_1fr] gap-6 items-start\">\n <MedialaneCollectionCard image={previewImage} name={name} collection={collectionLabel} />\n <div className=\"space-y-5\">\n <div className=\"space-y-1.5\">\n <div className=\"flex items-center gap-2 text-green-500\">\n <CheckCircle2 className=\"h-5 w-5\" />\n <p className=\"text-sm font-semibold\">Published — live onchain</p>\n </div>\n <p className=\"text-sm text-muted-foreground\">\n {mintedAsset ? \"Ready to share, sell, or remix.\" : \"It'll appear in your portfolio shortly.\"}\n </p>\n </div>\n\n {mintedAsset && (\n <div className=\"grid grid-cols-2 gap-2.5\">\n <Link\n href={`/asset/STARKNET/${mintedAsset.contract}/${mintedAsset.tokenId}`}\n className=\"flex items-center gap-2 rounded-xl border border-border px-4 py-3 text-sm font-semibold hover:bg-muted/40 transition-colors\"\n >\n <Eye className=\"h-4 w-4 text-muted-foreground\" />\n View asset\n </Link>\n <Link\n href={`/asset/STARKNET/${mintedAsset.contract}/${mintedAsset.tokenId}?action=list`}\n className=\"flex items-center gap-2 rounded-xl border border-border px-4 py-3 text-sm font-semibold hover:bg-muted/40 transition-colors\"\n >\n <Tag className=\"h-4 w-4 text-muted-foreground\" />\n List on marketplace\n </Link>\n <Link\n href={`/asset/STARKNET/${mintedAsset.contract}/${mintedAsset.tokenId}?action=transfer`}\n className=\"flex items-center gap-2 rounded-xl border border-border px-4 py-3 text-sm font-semibold hover:bg-muted/40 transition-colors\"\n >\n <ArrowRightLeft className=\"h-4 w-4 text-muted-foreground\" />\n Transfer\n </Link>\n <Link\n href={`/create/remix/${mintedAsset.contract}/${mintedAsset.tokenId}`}\n className=\"flex items-center gap-2 rounded-xl border border-border px-4 py-3 text-sm font-semibold hover:bg-muted/40 transition-colors\"\n >\n <GitBranch className=\"h-4 w-4 text-muted-foreground\" />\n Create a remix\n </Link>\n </div>\n )}\n\n {footer}\n\n <Button variant=\"outline\" onClick={onPublishAnother} className=\"w-full sm:w-auto\">\n Publish another\n </Button>\n </div>\n </div>\n </section>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAgCQ;AA7BR,kBAAiB;AACjB,0BAAkE;AAClE,gBAAmB;AACnB,oBAAuB;AACvB,uCAAwC;AAajC,SAAS,YAAY;AAAA,EAC1B,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAqB;AACnB,SACE,4CAAC,aAAQ,eAAW,cAAG,iBAAiB,WAAW,KAAK,6CAA6C,GACnG,uDAAC,SAAI,WAAU,+DACb;AAAA,gDAAC,4DAAwB,OAAO,cAAc,MAAY,YAAY,iBAAiB;AAAA,IACvF,6CAAC,SAAI,WAAU,aACb;AAAA,mDAAC,SAAI,WAAU,eACb;AAAA,qDAAC,SAAI,WAAU,0CACb;AAAA,sDAAC,oCAAa,WAAU,WAAU;AAAA,UAClC,4CAAC,OAAE,WAAU,yBAAwB,2CAAwB;AAAA,WAC/D;AAAA,QACA,4CAAC,OAAE,WAAU,iCACV,wBAAc,oCAAoC,2CACrD;AAAA,SACF;AAAA,MAEC,eACC,6CAAC,SAAI,WAAU,4BACb;AAAA;AAAA,UAAC,YAAAA;AAAA,UAAA;AAAA,YACC,MAAM,mBAAmB,YAAY,QAAQ,IAAI,YAAY,OAAO;AAAA,YACpE,WAAU;AAAA,YAEV;AAAA,0DAAC,2BAAI,WAAU,iCAAgC;AAAA,cAAE;AAAA;AAAA;AAAA,QAEnD;AAAA,QACA;AAAA,UAAC,YAAAA;AAAA,UAAA;AAAA,YACC,MAAM,mBAAmB,YAAY,QAAQ,IAAI,YAAY,OAAO;AAAA,YACpE,WAAU;AAAA,YAEV;AAAA,0DAAC,2BAAI,WAAU,iCAAgC;AAAA,cAAE;AAAA;AAAA;AAAA,QAEnD;AAAA,QACA;AAAA,UAAC,YAAAA;AAAA,UAAA;AAAA,YACC,MAAM,mBAAmB,YAAY,QAAQ,IAAI,YAAY,OAAO;AAAA,YACpE,WAAU;AAAA,YAEV;AAAA,0DAAC,sCAAe,WAAU,iCAAgC;AAAA,cAAE;AAAA;AAAA;AAAA,QAE9D;AAAA,QACA;AAAA,UAAC,YAAAA;AAAA,UAAA;AAAA,YACC,MAAM,iBAAiB,YAAY,QAAQ,IAAI,YAAY,OAAO;AAAA,YAClE,WAAU;AAAA,YAEV;AAAA,0DAAC,iCAAU,WAAU,iCAAgC;AAAA,cAAE;AAAA;AAAA;AAAA,QAEzD;AAAA,SACF;AAAA,MAGD;AAAA,MAED,4CAAC,wBAAO,SAAQ,WAAU,SAAS,kBAAkB,WAAU,oBAAmB,6BAElF;AAAA,OACF;AAAA,KACF,GACF;AAEJ;","names":["Link"]}
1
+ {"version":3,"sources":["../../../src/components/fast-mint/success-view.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport Link from \"../link.js\";\nimport { CheckCircle2, Eye, Tag, ArrowRightLeft, GitBranch } from \"lucide-react\";\nimport { cn } from \"../../utils/cn.js\";\nimport { Button } from \"../button.js\";\nimport { MedialaneCollectionCard } from \"../medialane-collection-card.js\";\nimport type { MintedAsset } from \"./types.js\";\n\nexport interface SuccessViewProps {\n presentation?: \"inline\" | \"dialog\";\n previewImage: string | null;\n name: string;\n collectionLabel?: string;\n mintedAsset: MintedAsset | null;\n onPublishAnother: () => void;\n footer?: ReactNode;\n}\n\nexport function SuccessView({\n presentation = \"inline\",\n previewImage,\n name,\n collectionLabel,\n mintedAsset,\n footer,\n onPublishAnother,\n}: SuccessViewProps) {\n return (\n <section className={cn(presentation === \"dialog\" ? \"\" : \"rounded-2xl border border-border p-6 sm:p-8\")}>\n <div className=\"grid grid-cols-1 sm:grid-cols-[220px_1fr] gap-6 items-start\">\n <MedialaneCollectionCard image={previewImage} name={name} collection={collectionLabel} />\n <div className=\"space-y-5\">\n <div className=\"space-y-1.5\">\n <div className=\"flex items-center gap-2 text-green-500\">\n <CheckCircle2 className=\"h-5 w-5\" />\n <p className=\"text-sm font-semibold\">Asset published</p>\n </div>\n <p className=\"text-sm text-muted-foreground\">\n It is recorded onchain with your wallet as owner.\n </p>\n </div>\n\n {mintedAsset && (\n <div className=\"grid grid-cols-2 gap-2.5\">\n <Link\n href={`/asset/STARKNET/${mintedAsset.contract}/${mintedAsset.tokenId}`}\n className=\"flex items-center gap-2 rounded-xl border border-border px-4 py-3 text-sm font-semibold hover:bg-muted/40 transition-colors\"\n >\n <Eye className=\"h-4 w-4 text-muted-foreground\" />\n View asset\n </Link>\n <Link\n href={`/asset/STARKNET/${mintedAsset.contract}/${mintedAsset.tokenId}?action=list`}\n className=\"flex items-center gap-2 rounded-xl border border-border px-4 py-3 text-sm font-semibold hover:bg-muted/40 transition-colors\"\n >\n <Tag className=\"h-4 w-4 text-muted-foreground\" />\n List on marketplace\n </Link>\n <Link\n href={`/asset/STARKNET/${mintedAsset.contract}/${mintedAsset.tokenId}?action=transfer`}\n className=\"flex items-center gap-2 rounded-xl border border-border px-4 py-3 text-sm font-semibold hover:bg-muted/40 transition-colors\"\n >\n <ArrowRightLeft className=\"h-4 w-4 text-muted-foreground\" />\n Transfer\n </Link>\n <Link\n href={`/create/remix/${mintedAsset.contract}/${mintedAsset.tokenId}`}\n className=\"flex items-center gap-2 rounded-xl border border-border px-4 py-3 text-sm font-semibold hover:bg-muted/40 transition-colors\"\n >\n <GitBranch className=\"h-4 w-4 text-muted-foreground\" />\n Create a remix\n </Link>\n </div>\n )}\n\n {footer}\n\n <Button variant=\"outline\" onClick={onPublishAnother} className=\"w-full sm:w-auto\">\n Publish another\n </Button>\n </div>\n </div>\n </section>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAgCQ;AA7BR,kBAAiB;AACjB,0BAAkE;AAClE,gBAAmB;AACnB,oBAAuB;AACvB,uCAAwC;AAajC,SAAS,YAAY;AAAA,EAC1B,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAqB;AACnB,SACE,4CAAC,aAAQ,eAAW,cAAG,iBAAiB,WAAW,KAAK,6CAA6C,GACnG,uDAAC,SAAI,WAAU,+DACb;AAAA,gDAAC,4DAAwB,OAAO,cAAc,MAAY,YAAY,iBAAiB;AAAA,IACvF,6CAAC,SAAI,WAAU,aACb;AAAA,mDAAC,SAAI,WAAU,eACb;AAAA,qDAAC,SAAI,WAAU,0CACb;AAAA,sDAAC,oCAAa,WAAU,WAAU;AAAA,UAClC,4CAAC,OAAE,WAAU,yBAAwB,6BAAe;AAAA,WACtD;AAAA,QACA,4CAAC,OAAE,WAAU,iCAAgC,+DAE7C;AAAA,SACF;AAAA,MAEC,eACC,6CAAC,SAAI,WAAU,4BACb;AAAA;AAAA,UAAC,YAAAA;AAAA,UAAA;AAAA,YACC,MAAM,mBAAmB,YAAY,QAAQ,IAAI,YAAY,OAAO;AAAA,YACpE,WAAU;AAAA,YAEV;AAAA,0DAAC,2BAAI,WAAU,iCAAgC;AAAA,cAAE;AAAA;AAAA;AAAA,QAEnD;AAAA,QACA;AAAA,UAAC,YAAAA;AAAA,UAAA;AAAA,YACC,MAAM,mBAAmB,YAAY,QAAQ,IAAI,YAAY,OAAO;AAAA,YACpE,WAAU;AAAA,YAEV;AAAA,0DAAC,2BAAI,WAAU,iCAAgC;AAAA,cAAE;AAAA;AAAA;AAAA,QAEnD;AAAA,QACA;AAAA,UAAC,YAAAA;AAAA,UAAA;AAAA,YACC,MAAM,mBAAmB,YAAY,QAAQ,IAAI,YAAY,OAAO;AAAA,YACpE,WAAU;AAAA,YAEV;AAAA,0DAAC,sCAAe,WAAU,iCAAgC;AAAA,cAAE;AAAA;AAAA;AAAA,QAE9D;AAAA,QACA;AAAA,UAAC,YAAAA;AAAA,UAAA;AAAA,YACC,MAAM,iBAAiB,YAAY,QAAQ,IAAI,YAAY,OAAO;AAAA,YAClE,WAAU;AAAA,YAEV;AAAA,0DAAC,iCAAU,WAAU,iCAAgC;AAAA,cAAE;AAAA;AAAA;AAAA,QAEzD;AAAA,SACF;AAAA,MAGD;AAAA,MAED,4CAAC,wBAAO,SAAQ,WAAU,SAAS,kBAAkB,WAAU,oBAAmB,6BAElF;AAAA,OACF;AAAA,KACF,GACF;AAEJ;","names":["Link"]}
@@ -20,9 +20,9 @@ function SuccessView({
20
20
  /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
21
21
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-green-500", children: [
22
22
  /* @__PURE__ */ jsx(CheckCircle2, { className: "h-5 w-5" }),
23
- /* @__PURE__ */ jsx("p", { className: "text-sm font-semibold", children: "Published \u2014 live onchain" })
23
+ /* @__PURE__ */ jsx("p", { className: "text-sm font-semibold", children: "Asset published" })
24
24
  ] }),
25
- /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: mintedAsset ? "Ready to share, sell, or remix." : "It'll appear in your portfolio shortly." })
25
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: "It is recorded onchain with your wallet as owner." })
26
26
  ] }),
27
27
  mintedAsset && /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-2.5", children: [
28
28
  /* @__PURE__ */ jsxs(
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/fast-mint/success-view.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport Link from \"../link.js\";\nimport { CheckCircle2, Eye, Tag, ArrowRightLeft, GitBranch } from \"lucide-react\";\nimport { cn } from \"../../utils/cn.js\";\nimport { Button } from \"../button.js\";\nimport { MedialaneCollectionCard } from \"../medialane-collection-card.js\";\nimport type { MintedAsset } from \"./types.js\";\n\nexport interface SuccessViewProps {\n presentation?: \"inline\" | \"dialog\";\n previewImage: string | null;\n name: string;\n collectionLabel?: string;\n mintedAsset: MintedAsset | null;\n onPublishAnother: () => void;\n footer?: ReactNode;\n}\n\nexport function SuccessView({\n presentation = \"inline\",\n previewImage,\n name,\n collectionLabel,\n mintedAsset,\n footer,\n onPublishAnother,\n}: SuccessViewProps) {\n return (\n <section className={cn(presentation === \"dialog\" ? \"\" : \"rounded-2xl border border-border p-6 sm:p-8\")}>\n <div className=\"grid grid-cols-1 sm:grid-cols-[220px_1fr] gap-6 items-start\">\n <MedialaneCollectionCard image={previewImage} name={name} collection={collectionLabel} />\n <div className=\"space-y-5\">\n <div className=\"space-y-1.5\">\n <div className=\"flex items-center gap-2 text-green-500\">\n <CheckCircle2 className=\"h-5 w-5\" />\n <p className=\"text-sm font-semibold\">Published — live onchain</p>\n </div>\n <p className=\"text-sm text-muted-foreground\">\n {mintedAsset ? \"Ready to share, sell, or remix.\" : \"It'll appear in your portfolio shortly.\"}\n </p>\n </div>\n\n {mintedAsset && (\n <div className=\"grid grid-cols-2 gap-2.5\">\n <Link\n href={`/asset/STARKNET/${mintedAsset.contract}/${mintedAsset.tokenId}`}\n className=\"flex items-center gap-2 rounded-xl border border-border px-4 py-3 text-sm font-semibold hover:bg-muted/40 transition-colors\"\n >\n <Eye className=\"h-4 w-4 text-muted-foreground\" />\n View asset\n </Link>\n <Link\n href={`/asset/STARKNET/${mintedAsset.contract}/${mintedAsset.tokenId}?action=list`}\n className=\"flex items-center gap-2 rounded-xl border border-border px-4 py-3 text-sm font-semibold hover:bg-muted/40 transition-colors\"\n >\n <Tag className=\"h-4 w-4 text-muted-foreground\" />\n List on marketplace\n </Link>\n <Link\n href={`/asset/STARKNET/${mintedAsset.contract}/${mintedAsset.tokenId}?action=transfer`}\n className=\"flex items-center gap-2 rounded-xl border border-border px-4 py-3 text-sm font-semibold hover:bg-muted/40 transition-colors\"\n >\n <ArrowRightLeft className=\"h-4 w-4 text-muted-foreground\" />\n Transfer\n </Link>\n <Link\n href={`/create/remix/${mintedAsset.contract}/${mintedAsset.tokenId}`}\n className=\"flex items-center gap-2 rounded-xl border border-border px-4 py-3 text-sm font-semibold hover:bg-muted/40 transition-colors\"\n >\n <GitBranch className=\"h-4 w-4 text-muted-foreground\" />\n Create a remix\n </Link>\n </div>\n )}\n\n {footer}\n\n <Button variant=\"outline\" onClick={onPublishAnother} className=\"w-full sm:w-auto\">\n Publish another\n </Button>\n </div>\n </div>\n </section>\n );\n}\n"],"mappings":";AAgCQ,cAGI,YAHJ;AA7BR,OAAO,UAAU;AACjB,SAAS,cAAc,KAAK,KAAK,gBAAgB,iBAAiB;AAClE,SAAS,UAAU;AACnB,SAAS,cAAc;AACvB,SAAS,+BAA+B;AAajC,SAAS,YAAY;AAAA,EAC1B,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAqB;AACnB,SACE,oBAAC,aAAQ,WAAW,GAAG,iBAAiB,WAAW,KAAK,6CAA6C,GACnG,+BAAC,SAAI,WAAU,+DACb;AAAA,wBAAC,2BAAwB,OAAO,cAAc,MAAY,YAAY,iBAAiB;AAAA,IACvF,qBAAC,SAAI,WAAU,aACb;AAAA,2BAAC,SAAI,WAAU,eACb;AAAA,6BAAC,SAAI,WAAU,0CACb;AAAA,8BAAC,gBAAa,WAAU,WAAU;AAAA,UAClC,oBAAC,OAAE,WAAU,yBAAwB,2CAAwB;AAAA,WAC/D;AAAA,QACA,oBAAC,OAAE,WAAU,iCACV,wBAAc,oCAAoC,2CACrD;AAAA,SACF;AAAA,MAEC,eACC,qBAAC,SAAI,WAAU,4BACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,mBAAmB,YAAY,QAAQ,IAAI,YAAY,OAAO;AAAA,YACpE,WAAU;AAAA,YAEV;AAAA,kCAAC,OAAI,WAAU,iCAAgC;AAAA,cAAE;AAAA;AAAA;AAAA,QAEnD;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,mBAAmB,YAAY,QAAQ,IAAI,YAAY,OAAO;AAAA,YACpE,WAAU;AAAA,YAEV;AAAA,kCAAC,OAAI,WAAU,iCAAgC;AAAA,cAAE;AAAA;AAAA;AAAA,QAEnD;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,mBAAmB,YAAY,QAAQ,IAAI,YAAY,OAAO;AAAA,YACpE,WAAU;AAAA,YAEV;AAAA,kCAAC,kBAAe,WAAU,iCAAgC;AAAA,cAAE;AAAA;AAAA;AAAA,QAE9D;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,iBAAiB,YAAY,QAAQ,IAAI,YAAY,OAAO;AAAA,YAClE,WAAU;AAAA,YAEV;AAAA,kCAAC,aAAU,WAAU,iCAAgC;AAAA,cAAE;AAAA;AAAA;AAAA,QAEzD;AAAA,SACF;AAAA,MAGD;AAAA,MAED,oBAAC,UAAO,SAAQ,WAAU,SAAS,kBAAkB,WAAU,oBAAmB,6BAElF;AAAA,OACF;AAAA,KACF,GACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/fast-mint/success-view.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport Link from \"../link.js\";\nimport { CheckCircle2, Eye, Tag, ArrowRightLeft, GitBranch } from \"lucide-react\";\nimport { cn } from \"../../utils/cn.js\";\nimport { Button } from \"../button.js\";\nimport { MedialaneCollectionCard } from \"../medialane-collection-card.js\";\nimport type { MintedAsset } from \"./types.js\";\n\nexport interface SuccessViewProps {\n presentation?: \"inline\" | \"dialog\";\n previewImage: string | null;\n name: string;\n collectionLabel?: string;\n mintedAsset: MintedAsset | null;\n onPublishAnother: () => void;\n footer?: ReactNode;\n}\n\nexport function SuccessView({\n presentation = \"inline\",\n previewImage,\n name,\n collectionLabel,\n mintedAsset,\n footer,\n onPublishAnother,\n}: SuccessViewProps) {\n return (\n <section className={cn(presentation === \"dialog\" ? \"\" : \"rounded-2xl border border-border p-6 sm:p-8\")}>\n <div className=\"grid grid-cols-1 sm:grid-cols-[220px_1fr] gap-6 items-start\">\n <MedialaneCollectionCard image={previewImage} name={name} collection={collectionLabel} />\n <div className=\"space-y-5\">\n <div className=\"space-y-1.5\">\n <div className=\"flex items-center gap-2 text-green-500\">\n <CheckCircle2 className=\"h-5 w-5\" />\n <p className=\"text-sm font-semibold\">Asset published</p>\n </div>\n <p className=\"text-sm text-muted-foreground\">\n It is recorded onchain with your wallet as owner.\n </p>\n </div>\n\n {mintedAsset && (\n <div className=\"grid grid-cols-2 gap-2.5\">\n <Link\n href={`/asset/STARKNET/${mintedAsset.contract}/${mintedAsset.tokenId}`}\n className=\"flex items-center gap-2 rounded-xl border border-border px-4 py-3 text-sm font-semibold hover:bg-muted/40 transition-colors\"\n >\n <Eye className=\"h-4 w-4 text-muted-foreground\" />\n View asset\n </Link>\n <Link\n href={`/asset/STARKNET/${mintedAsset.contract}/${mintedAsset.tokenId}?action=list`}\n className=\"flex items-center gap-2 rounded-xl border border-border px-4 py-3 text-sm font-semibold hover:bg-muted/40 transition-colors\"\n >\n <Tag className=\"h-4 w-4 text-muted-foreground\" />\n List on marketplace\n </Link>\n <Link\n href={`/asset/STARKNET/${mintedAsset.contract}/${mintedAsset.tokenId}?action=transfer`}\n className=\"flex items-center gap-2 rounded-xl border border-border px-4 py-3 text-sm font-semibold hover:bg-muted/40 transition-colors\"\n >\n <ArrowRightLeft className=\"h-4 w-4 text-muted-foreground\" />\n Transfer\n </Link>\n <Link\n href={`/create/remix/${mintedAsset.contract}/${mintedAsset.tokenId}`}\n className=\"flex items-center gap-2 rounded-xl border border-border px-4 py-3 text-sm font-semibold hover:bg-muted/40 transition-colors\"\n >\n <GitBranch className=\"h-4 w-4 text-muted-foreground\" />\n Create a remix\n </Link>\n </div>\n )}\n\n {footer}\n\n <Button variant=\"outline\" onClick={onPublishAnother} className=\"w-full sm:w-auto\">\n Publish another\n </Button>\n </div>\n </div>\n </section>\n );\n}\n"],"mappings":";AAgCQ,cAGI,YAHJ;AA7BR,OAAO,UAAU;AACjB,SAAS,cAAc,KAAK,KAAK,gBAAgB,iBAAiB;AAClE,SAAS,UAAU;AACnB,SAAS,cAAc;AACvB,SAAS,+BAA+B;AAajC,SAAS,YAAY;AAAA,EAC1B,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAqB;AACnB,SACE,oBAAC,aAAQ,WAAW,GAAG,iBAAiB,WAAW,KAAK,6CAA6C,GACnG,+BAAC,SAAI,WAAU,+DACb;AAAA,wBAAC,2BAAwB,OAAO,cAAc,MAAY,YAAY,iBAAiB;AAAA,IACvF,qBAAC,SAAI,WAAU,aACb;AAAA,2BAAC,SAAI,WAAU,eACb;AAAA,6BAAC,SAAI,WAAU,0CACb;AAAA,8BAAC,gBAAa,WAAU,WAAU;AAAA,UAClC,oBAAC,OAAE,WAAU,yBAAwB,6BAAe;AAAA,WACtD;AAAA,QACA,oBAAC,OAAE,WAAU,iCAAgC,+DAE7C;AAAA,SACF;AAAA,MAEC,eACC,qBAAC,SAAI,WAAU,4BACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,mBAAmB,YAAY,QAAQ,IAAI,YAAY,OAAO;AAAA,YACpE,WAAU;AAAA,YAEV;AAAA,kCAAC,OAAI,WAAU,iCAAgC;AAAA,cAAE;AAAA;AAAA;AAAA,QAEnD;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,mBAAmB,YAAY,QAAQ,IAAI,YAAY,OAAO;AAAA,YACpE,WAAU;AAAA,YAEV;AAAA,kCAAC,OAAI,WAAU,iCAAgC;AAAA,cAAE;AAAA;AAAA;AAAA,QAEnD;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,mBAAmB,YAAY,QAAQ,IAAI,YAAY,OAAO;AAAA,YACpE,WAAU;AAAA,YAEV;AAAA,kCAAC,kBAAe,WAAU,iCAAgC;AAAA,cAAE;AAAA;AAAA;AAAA,QAE9D;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,iBAAiB,YAAY,QAAQ,IAAI,YAAY,OAAO;AAAA,YAClE,WAAU;AAAA,YAEV;AAAA,kCAAC,aAAU,WAAU,iCAAgC;AAAA,cAAE;AAAA;AAAA;AAAA,QAEzD;AAAA,SACF;AAAA,MAGD;AAAA,MAED,oBAAC,UAAO,SAAQ,WAAU,SAAS,kBAAkB,WAAU,oBAAmB,6BAElF;AAAA,OACF;AAAA,KACF,GACF;AAEJ;","names":[]}
@@ -48,6 +48,7 @@ var import_medialane_app = require("./medialane-app.js");
48
48
  var import_cn = require("../utils/cn.js");
49
49
  var import_same_address = require("../utils/same-address.js");
50
50
  var import_use_tokens_by_ip_type = require("../utils/use-tokens-by-ip-type.js");
51
+ var import_empty_messages = require("../utils/empty-messages.js");
51
52
  const PAGE_SIZE = 24;
52
53
  function FilterChip({ active, onClick, label }) {
53
54
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
@@ -275,8 +276,8 @@ function IpTypePage({ slug, useMarketActions }) {
275
276
  isInitialLoading ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-4", children: Array.from({ length: PAGE_SIZE }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_token_card.TokenCardSkeleton, {}, i)) }) : displayed.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "py-24 flex flex-col items-center gap-4 text-center", children: [
276
277
  config && Icon && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: (0, import_cn.cn)("h-16 w-16 rounded-2xl flex items-center justify-center", config.bgClass), children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Icon, { className: (0, import_cn.cn)("h-8 w-8", config.colorClass) }) }),
277
278
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
278
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "font-semibold text-lg", children: listedOnly ? "No listed assets yet" : "No assets indexed yet" }),
279
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-muted-foreground text-sm mt-1", children: listedOnly ? "Try removing the 'Listed only' filter to see all assets." : `Be the first to mint a ${config?.label ?? slug} asset on Medialane.` })
279
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "font-semibold text-lg", children: listedOnly ? "Listed assets appear here" : import_empty_messages.emptyMessages.assetsOfType.title }),
280
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-muted-foreground text-sm mt-1", children: listedOnly ? "Try removing the 'Listed only' filter to see all assets." : import_empty_messages.emptyMessages.assetsOfType.description })
280
281
  ] }),
281
282
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_button.Button, { asChild: true, variant: "outline", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: "/launchpad/single-editions", children: "Create Asset" }) })
282
283
  ] }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-6", children: [
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/ip-type-page.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useEffect, useRef } from \"react\";\nimport { SlidersHorizontal, Search, X as XIcon } from \"lucide-react\";\nimport type { ApiToken } from \"@medialane/sdk\";\nimport Link from \"./link.js\";\nimport { Badge } from \"./badge.js\";\nimport { Button } from \"./button.js\";\nimport { Dialog, DialogContent, DialogTitle } from \"./dialog.js\";\nimport { Input } from \"./input.js\";\nimport { PageContainer } from \"./page-container.js\";\nimport { LoadMoreSentinel } from \"./load-more-sentinel.js\";\nimport { IP_TYPE_CONFIG, IP_TYPE_MAP } from \"./ip-type-badge.js\";\nimport { TokenCard, TokenCardSkeleton } from \"./token-card.js\";\nimport { useMedialaneApp } from \"./medialane-app.js\";\nimport type { CollectionMarketActions } from \"./collection-page.js\";\nimport { cn } from \"../utils/cn.js\";\nimport { isSameAddress } from \"../utils/same-address.js\";\nimport { useTokensByIpType } from \"../utils/use-tokens-by-ip-type.js\";\n\nconst PAGE_SIZE = 24;\n\nfunction FilterChip({ active, onClick, label }: { active: boolean; onClick: () => void; label: string }) {\n return (\n <button\n onClick={onClick}\n className={cn(\n \"text-xs px-3 py-1.5 rounded-full border transition-colors whitespace-nowrap\",\n active\n ? \"border-primary bg-primary/10 text-primary font-medium\"\n : \"border-border text-muted-foreground hover:border-primary/50\"\n )}\n >\n {label}\n </button>\n );\n}\n\nexport interface IpTypePageProps {\n slug: string;\n useMarketActions: () => CollectionMarketActions;\n}\n\nexport function IpTypePage({ slug, useMarketActions }: IpTypePageProps) {\n const { walletAddress } = useMedialaneApp();\n const market = useMarketActions();\n const config = IP_TYPE_MAP[slug];\n const Icon = config?.icon;\n const [page, setPage] = useState(1);\n const [listedOnly, setListedOnly] = useState(false);\n const [allTokens, setAllTokens] = useState<ApiToken[]>([]);\n const prevSlug = useRef(slug);\n\n const [filtersOpen, setFiltersOpen] = useState(false);\n const [sortOrder, setSortOrder] = useState<\"recent\" | \"price_asc\" | \"price_desc\">(\"recent\");\n const [licenseFilter, setLicenseFilter] = useState<string>(\"all\");\n const [creatorSearchInput, setCreatorSearchInput] = useState(\"\");\n const [creatorSearch, setCreatorSearch] = useState(\"\");\n\n useEffect(() => {\n if (prevSlug.current !== slug) {\n prevSlug.current = slug;\n setPage(1);\n setAllTokens([]);\n }\n }, [slug]);\n\n useEffect(() => {\n const t = setTimeout(() => setCreatorSearch(creatorSearchInput), 300);\n return () => clearTimeout(t);\n }, [creatorSearchInput]);\n\n const { tokens, meta, isLoading } = useTokensByIpType(slug, page, PAGE_SIZE);\n\n useEffect(() => {\n if (isLoading) return;\n if (page === 1) {\n setAllTokens(tokens);\n } else {\n setAllTokens((prev) => {\n const seen = new Set(prev.map((t) => `${t.contractAddress}:${t.tokenId}`));\n const fresh = tokens.filter((t) => !seen.has(`${t.contractAddress}:${t.tokenId}`));\n return fresh.length > 0 ? [...prev, ...fresh] : prev;\n });\n }\n }, [tokens, isLoading, page]);\n\n const activeFilterCount =\n (sortOrder !== \"recent\" ? 1 : 0) +\n (licenseFilter !== \"all\" ? 1 : 0) +\n (creatorSearch !== \"\" ? 1 : 0);\n const activeChipCount = activeFilterCount + (listedOnly ? 1 : 0);\n const hasActiveFilters = activeChipCount > 0;\n const resetAll = () => {\n setSortOrder(\"recent\");\n setLicenseFilter(\"all\");\n setCreatorSearch(\"\");\n setCreatorSearchInput(\"\");\n setListedOnly(false);\n };\n\n let displayed = listedOnly\n ? allTokens.filter((t) => (t.activeOrders?.length ?? 0) > 0)\n : [...allTokens];\n\n if (licenseFilter !== \"all\") {\n displayed = displayed.filter((t) =>\n t.metadata?.attributes?.some(\n (a) => a.trait_type === \"License\" && a.value === licenseFilter\n )\n );\n }\n if (creatorSearch) {\n const q = creatorSearch.toLowerCase();\n displayed = displayed.filter((t) => {\n const creatorVal =\n t.metadata?.attributes?.find((a) => a.trait_type === \"Creator\")?.value ?? \"\";\n return (\n String(creatorVal).toLowerCase().includes(q) ||\n t.contractAddress.toLowerCase().includes(q)\n );\n });\n }\n if (sortOrder === \"price_asc\") {\n displayed = [...displayed].sort((a, b) => {\n const pa = parseFloat(a.activeOrders?.[0]?.price?.formatted ?? \"Infinity\");\n const pb = parseFloat(b.activeOrders?.[0]?.price?.formatted ?? \"Infinity\");\n return pa - pb;\n });\n } else if (sortOrder === \"price_desc\") {\n displayed = [...displayed].sort((a, b) => {\n const pa = parseFloat(a.activeOrders?.[0]?.price?.formatted ?? \"0\");\n const pb = parseFloat(b.activeOrders?.[0]?.price?.formatted ?? \"0\");\n return pb - pa;\n });\n }\n\n const isInitialLoading = isLoading && allTokens.length === 0;\n const isLoadingMore = isLoading && allTokens.length > 0;\n const hasMore = meta?.total != null ? allTokens.length < meta.total : false;\n const listedCount = allTokens.filter((t) => (t.activeOrders?.length ?? 0) > 0).length;\n\n return (\n <PageContainer className=\"box-border max-w-full pt-20 pb-16 space-y-8\">\n\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-4\">\n {config && Icon && (\n <div className={cn(\"h-14 w-14 rounded-2xl flex items-center justify-center shadow-lg\", config.bgClass)}>\n <Icon className={cn(\"h-7 w-7\", config.colorClass)} />\n </div>\n )}\n <div>\n <h1 className=\"text-3xl font-semibold\">{config?.label ?? slug}</h1>\n <p className=\"text-muted-foreground mt-0.5\">\n {meta?.total != null ? (\n <>{meta.total.toLocaleString()} assets · {listedCount} market</>\n ) : (\n \"Browsing indexed digital assets on Medialane\"\n )}\n </p>\n </div>\n </div>\n\n <div className=\"flex items-center gap-2 flex-wrap\">\n <button\n onClick={() => setFiltersOpen(true)}\n className={cn(\n \"inline-flex items-center gap-1.5 text-xs px-3.5 py-2 rounded-full border font-medium transition-colors\",\n hasActiveFilters\n ? \"border-primary bg-primary/10 text-primary\"\n : \"border-border text-muted-foreground\"\n )}\n >\n <SlidersHorizontal className=\"h-3.5 w-3.5\" />\n Filters\n {activeChipCount > 0 && (\n <span className=\"ml-0.5 bg-primary text-primary-foreground rounded-full px-1.5 text-2xs font-bold leading-4\">\n {activeChipCount}\n </span>\n )}\n </button>\n\n {listedOnly && (\n <Badge variant=\"secondary\" className=\"cursor-pointer gap-1 text-xs\" onClick={() => setListedOnly(false)}>\n Listed only\n <XIcon className=\"h-3 w-3\" />\n </Badge>\n )}\n {sortOrder !== \"recent\" && (\n <Badge variant=\"secondary\" className=\"cursor-pointer gap-1 text-xs\" onClick={() => setSortOrder(\"recent\")}>\n {sortOrder === \"price_asc\" ? \"Price ↑\" : \"Price ↓\"}\n <XIcon className=\"h-3 w-3\" />\n </Badge>\n )}\n {licenseFilter !== \"all\" && (\n <Badge variant=\"secondary\" className=\"cursor-pointer gap-1 text-xs\" onClick={() => setLicenseFilter(\"all\")}>\n {licenseFilter}\n <XIcon className=\"h-3 w-3\" />\n </Badge>\n )}\n {creatorSearch && (\n <Badge variant=\"secondary\" className=\"cursor-pointer gap-1 text-xs\" onClick={() => { setCreatorSearch(\"\"); setCreatorSearchInput(\"\"); }}>\n {creatorSearch.length > 10 ? `${creatorSearch.slice(0, 10)}…` : creatorSearch}\n <XIcon className=\"h-3 w-3\" />\n </Badge>\n )}\n </div>\n\n <Dialog open={filtersOpen} onOpenChange={setFiltersOpen}>\n <DialogContent className=\"w-full max-w-sm sm:max-w-md p-0 overflow-hidden gap-0 flex flex-col max-h-[85svh]\">\n <div className=\"flex items-center justify-between px-5 py-4 border-b border-border/60 pr-12\">\n <DialogTitle className=\"text-base font-bold flex items-center gap-2\">\n <SlidersHorizontal className=\"h-4 w-4 text-primary\" />\n Filters\n </DialogTitle>\n {hasActiveFilters && (\n <Button variant=\"ghost\" size=\"sm\" className=\"h-7 text-xs text-muted-foreground\" onClick={resetAll}>\n Clear all\n </Button>\n )}\n </div>\n\n <div className=\"flex-1 overflow-y-auto px-5 py-4 space-y-5\">\n\n <div className=\"space-y-2\">\n <p className=\"text-2xs font-semibold text-muted-foreground\">Status</p>\n <div className=\"flex flex-wrap gap-1.5\">\n <FilterChip active={!listedOnly} onClick={() => setListedOnly(false)} label=\"All\" />\n <FilterChip\n active={listedOnly}\n onClick={() => setListedOnly(true)}\n label={`Listed only${listedCount > 0 ? ` (${listedCount})` : \"\"}`}\n />\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <p className=\"text-2xs font-semibold text-muted-foreground\">Sort</p>\n <div className=\"flex flex-wrap gap-1.5\">\n <FilterChip active={sortOrder === \"recent\"} onClick={() => setSortOrder(\"recent\")} label=\"Recent\" />\n <FilterChip active={sortOrder === \"price_asc\"} onClick={() => setSortOrder(\"price_asc\")} label=\"Price ↑\" />\n <FilterChip active={sortOrder === \"price_desc\"} onClick={() => setSortOrder(\"price_desc\")} label=\"Price ↓\" />\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <p className=\"text-2xs font-semibold text-muted-foreground\">License</p>\n <div className=\"flex flex-wrap gap-1.5\">\n {[\"all\", \"CC0\", \"CC BY\", \"CC BY-SA\", \"CC BY-NC\", \"CC BY-ND\", \"Custom\"].map((lic) => (\n <FilterChip\n key={lic}\n active={licenseFilter === lic}\n onClick={() => setLicenseFilter(lic)}\n label={lic === \"all\" ? \"All licenses\" : lic}\n />\n ))}\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <p className=\"text-2xs font-semibold text-muted-foreground\">Creator</p>\n <div className=\"relative\">\n <Search className=\"absolute left-2.5 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground\" />\n <Input\n className=\"h-9 text-sm pl-8\"\n placeholder=\"Name or wallet address…\"\n value={creatorSearchInput}\n onChange={(e) => setCreatorSearchInput(e.target.value)}\n />\n </div>\n </div>\n\n <div className=\"space-y-2 pt-1 border-t border-border/60\">\n <p className=\"text-2xs font-semibold text-muted-foreground\">IP Type</p>\n <div className=\"flex flex-wrap gap-1.5\">\n {IP_TYPE_CONFIG.map((t) => (\n <Link\n key={t.slug}\n href={`/${t.slug}`}\n className={cn(\n \"inline-flex items-center gap-1.5 text-xs px-3 py-1.5 rounded-full border transition-colors whitespace-nowrap\",\n t.slug === slug\n ? \"border-primary bg-primary/10 text-primary font-medium\"\n : \"border-border text-muted-foreground hover:border-primary/50\"\n )}\n >\n <t.icon className={cn(\"h-3 w-3\", t.slug === slug ? t.colorClass : \"\")} />\n {t.label}\n </Link>\n ))}\n </div>\n </div>\n </div>\n\n <div className=\"px-5 py-3 border-t border-border/60\">\n <Button className=\"w-full\" onClick={() => setFiltersOpen(false)}>\n Apply filters\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n </div>\n\n {isInitialLoading ? (\n <div className=\"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-4\">\n {Array.from({ length: PAGE_SIZE }).map((_, i) => (\n <TokenCardSkeleton key={i} />\n ))}\n </div>\n ) : displayed.length === 0 ? (\n <div className=\"py-24 flex flex-col items-center gap-4 text-center\">\n {config && Icon && (\n <div className={cn(\"h-16 w-16 rounded-2xl flex items-center justify-center\", config.bgClass)}>\n <Icon className={cn(\"h-8 w-8\", config.colorClass)} />\n </div>\n )}\n <div>\n <p className=\"font-semibold text-lg\">\n {listedOnly ? \"No listed assets yet\" : \"No assets indexed yet\"}\n </p>\n <p className=\"text-muted-foreground text-sm mt-1\">\n {listedOnly\n ? \"Try removing the 'Listed only' filter to see all assets.\"\n : `Be the first to mint a ${config?.label ?? slug} asset on Medialane.`}\n </p>\n </div>\n <Button asChild variant=\"outline\">\n <Link href=\"/launchpad/single-editions\">Create Asset</Link>\n </Button>\n </div>\n ) : (\n <div className=\"space-y-6\">\n <div className=\"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-4\">\n {displayed.map((token) => {\n const listing = token.activeOrders?.find((o) => o.offer.itemType === \"ERC721\" || o.offer.itemType === \"ERC1155\");\n const isOwner = !!walletAddress && !!token.owner && isSameAddress(token.owner, walletAddress);\n return (\n <TokenCard\n key={`${token.contractAddress}:${token.tokenId}`}\n token={token}\n isOwner={isOwner}\n onBuy={!isOwner && listing ? () => market.buy(listing) : undefined}\n onOffer={isOwner ? undefined : market.offer}\n />\n );\n })}\n </div>\n\n {!listedOnly && (\n <LoadMoreSentinel\n hasMore={hasMore}\n isLoading={isLoadingMore}\n onLoadMore={() => setPage((p) => p + 1)}\n />\n )}\n </div>\n )}\n\n {market.dialogs}\n </PageContainer>\n );\n}\n"],"mappings":"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","names":["XIcon","Link"]}
1
+ {"version":3,"sources":["../../src/components/ip-type-page.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useEffect, useRef } from \"react\";\nimport { SlidersHorizontal, Search, X as XIcon } from \"lucide-react\";\nimport type { ApiToken } from \"@medialane/sdk\";\nimport Link from \"./link.js\";\nimport { Badge } from \"./badge.js\";\nimport { Button } from \"./button.js\";\nimport { Dialog, DialogContent, DialogTitle } from \"./dialog.js\";\nimport { Input } from \"./input.js\";\nimport { PageContainer } from \"./page-container.js\";\nimport { LoadMoreSentinel } from \"./load-more-sentinel.js\";\nimport { IP_TYPE_CONFIG, IP_TYPE_MAP } from \"./ip-type-badge.js\";\nimport { TokenCard, TokenCardSkeleton } from \"./token-card.js\";\nimport { useMedialaneApp } from \"./medialane-app.js\";\nimport type { CollectionMarketActions } from \"./collection-page.js\";\nimport { cn } from \"../utils/cn.js\";\nimport { isSameAddress } from \"../utils/same-address.js\";\nimport { useTokensByIpType } from \"../utils/use-tokens-by-ip-type.js\";\nimport { emptyMessages } from \"../utils/empty-messages.js\";\n\nconst PAGE_SIZE = 24;\n\nfunction FilterChip({ active, onClick, label }: { active: boolean; onClick: () => void; label: string }) {\n return (\n <button\n onClick={onClick}\n className={cn(\n \"text-xs px-3 py-1.5 rounded-full border transition-colors whitespace-nowrap\",\n active\n ? \"border-primary bg-primary/10 text-primary font-medium\"\n : \"border-border text-muted-foreground hover:border-primary/50\"\n )}\n >\n {label}\n </button>\n );\n}\n\nexport interface IpTypePageProps {\n slug: string;\n useMarketActions: () => CollectionMarketActions;\n}\n\nexport function IpTypePage({ slug, useMarketActions }: IpTypePageProps) {\n const { walletAddress } = useMedialaneApp();\n const market = useMarketActions();\n const config = IP_TYPE_MAP[slug];\n const Icon = config?.icon;\n const [page, setPage] = useState(1);\n const [listedOnly, setListedOnly] = useState(false);\n const [allTokens, setAllTokens] = useState<ApiToken[]>([]);\n const prevSlug = useRef(slug);\n\n const [filtersOpen, setFiltersOpen] = useState(false);\n const [sortOrder, setSortOrder] = useState<\"recent\" | \"price_asc\" | \"price_desc\">(\"recent\");\n const [licenseFilter, setLicenseFilter] = useState<string>(\"all\");\n const [creatorSearchInput, setCreatorSearchInput] = useState(\"\");\n const [creatorSearch, setCreatorSearch] = useState(\"\");\n\n useEffect(() => {\n if (prevSlug.current !== slug) {\n prevSlug.current = slug;\n setPage(1);\n setAllTokens([]);\n }\n }, [slug]);\n\n useEffect(() => {\n const t = setTimeout(() => setCreatorSearch(creatorSearchInput), 300);\n return () => clearTimeout(t);\n }, [creatorSearchInput]);\n\n const { tokens, meta, isLoading } = useTokensByIpType(slug, page, PAGE_SIZE);\n\n useEffect(() => {\n if (isLoading) return;\n if (page === 1) {\n setAllTokens(tokens);\n } else {\n setAllTokens((prev) => {\n const seen = new Set(prev.map((t) => `${t.contractAddress}:${t.tokenId}`));\n const fresh = tokens.filter((t) => !seen.has(`${t.contractAddress}:${t.tokenId}`));\n return fresh.length > 0 ? [...prev, ...fresh] : prev;\n });\n }\n }, [tokens, isLoading, page]);\n\n const activeFilterCount =\n (sortOrder !== \"recent\" ? 1 : 0) +\n (licenseFilter !== \"all\" ? 1 : 0) +\n (creatorSearch !== \"\" ? 1 : 0);\n const activeChipCount = activeFilterCount + (listedOnly ? 1 : 0);\n const hasActiveFilters = activeChipCount > 0;\n const resetAll = () => {\n setSortOrder(\"recent\");\n setLicenseFilter(\"all\");\n setCreatorSearch(\"\");\n setCreatorSearchInput(\"\");\n setListedOnly(false);\n };\n\n let displayed = listedOnly\n ? allTokens.filter((t) => (t.activeOrders?.length ?? 0) > 0)\n : [...allTokens];\n\n if (licenseFilter !== \"all\") {\n displayed = displayed.filter((t) =>\n t.metadata?.attributes?.some(\n (a) => a.trait_type === \"License\" && a.value === licenseFilter\n )\n );\n }\n if (creatorSearch) {\n const q = creatorSearch.toLowerCase();\n displayed = displayed.filter((t) => {\n const creatorVal =\n t.metadata?.attributes?.find((a) => a.trait_type === \"Creator\")?.value ?? \"\";\n return (\n String(creatorVal).toLowerCase().includes(q) ||\n t.contractAddress.toLowerCase().includes(q)\n );\n });\n }\n if (sortOrder === \"price_asc\") {\n displayed = [...displayed].sort((a, b) => {\n const pa = parseFloat(a.activeOrders?.[0]?.price?.formatted ?? \"Infinity\");\n const pb = parseFloat(b.activeOrders?.[0]?.price?.formatted ?? \"Infinity\");\n return pa - pb;\n });\n } else if (sortOrder === \"price_desc\") {\n displayed = [...displayed].sort((a, b) => {\n const pa = parseFloat(a.activeOrders?.[0]?.price?.formatted ?? \"0\");\n const pb = parseFloat(b.activeOrders?.[0]?.price?.formatted ?? \"0\");\n return pb - pa;\n });\n }\n\n const isInitialLoading = isLoading && allTokens.length === 0;\n const isLoadingMore = isLoading && allTokens.length > 0;\n const hasMore = meta?.total != null ? allTokens.length < meta.total : false;\n const listedCount = allTokens.filter((t) => (t.activeOrders?.length ?? 0) > 0).length;\n\n return (\n <PageContainer className=\"box-border max-w-full pt-20 pb-16 space-y-8\">\n\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-4\">\n {config && Icon && (\n <div className={cn(\"h-14 w-14 rounded-2xl flex items-center justify-center shadow-lg\", config.bgClass)}>\n <Icon className={cn(\"h-7 w-7\", config.colorClass)} />\n </div>\n )}\n <div>\n <h1 className=\"text-3xl font-semibold\">{config?.label ?? slug}</h1>\n <p className=\"text-muted-foreground mt-0.5\">\n {meta?.total != null ? (\n <>{meta.total.toLocaleString()} assets · {listedCount} market</>\n ) : (\n \"Browsing indexed digital assets on Medialane\"\n )}\n </p>\n </div>\n </div>\n\n <div className=\"flex items-center gap-2 flex-wrap\">\n <button\n onClick={() => setFiltersOpen(true)}\n className={cn(\n \"inline-flex items-center gap-1.5 text-xs px-3.5 py-2 rounded-full border font-medium transition-colors\",\n hasActiveFilters\n ? \"border-primary bg-primary/10 text-primary\"\n : \"border-border text-muted-foreground\"\n )}\n >\n <SlidersHorizontal className=\"h-3.5 w-3.5\" />\n Filters\n {activeChipCount > 0 && (\n <span className=\"ml-0.5 bg-primary text-primary-foreground rounded-full px-1.5 text-2xs font-bold leading-4\">\n {activeChipCount}\n </span>\n )}\n </button>\n\n {listedOnly && (\n <Badge variant=\"secondary\" className=\"cursor-pointer gap-1 text-xs\" onClick={() => setListedOnly(false)}>\n Listed only\n <XIcon className=\"h-3 w-3\" />\n </Badge>\n )}\n {sortOrder !== \"recent\" && (\n <Badge variant=\"secondary\" className=\"cursor-pointer gap-1 text-xs\" onClick={() => setSortOrder(\"recent\")}>\n {sortOrder === \"price_asc\" ? \"Price ↑\" : \"Price ↓\"}\n <XIcon className=\"h-3 w-3\" />\n </Badge>\n )}\n {licenseFilter !== \"all\" && (\n <Badge variant=\"secondary\" className=\"cursor-pointer gap-1 text-xs\" onClick={() => setLicenseFilter(\"all\")}>\n {licenseFilter}\n <XIcon className=\"h-3 w-3\" />\n </Badge>\n )}\n {creatorSearch && (\n <Badge variant=\"secondary\" className=\"cursor-pointer gap-1 text-xs\" onClick={() => { setCreatorSearch(\"\"); setCreatorSearchInput(\"\"); }}>\n {creatorSearch.length > 10 ? `${creatorSearch.slice(0, 10)}…` : creatorSearch}\n <XIcon className=\"h-3 w-3\" />\n </Badge>\n )}\n </div>\n\n <Dialog open={filtersOpen} onOpenChange={setFiltersOpen}>\n <DialogContent className=\"w-full max-w-sm sm:max-w-md p-0 overflow-hidden gap-0 flex flex-col max-h-[85svh]\">\n <div className=\"flex items-center justify-between px-5 py-4 border-b border-border/60 pr-12\">\n <DialogTitle className=\"text-base font-bold flex items-center gap-2\">\n <SlidersHorizontal className=\"h-4 w-4 text-primary\" />\n Filters\n </DialogTitle>\n {hasActiveFilters && (\n <Button variant=\"ghost\" size=\"sm\" className=\"h-7 text-xs text-muted-foreground\" onClick={resetAll}>\n Clear all\n </Button>\n )}\n </div>\n\n <div className=\"flex-1 overflow-y-auto px-5 py-4 space-y-5\">\n\n <div className=\"space-y-2\">\n <p className=\"text-2xs font-semibold text-muted-foreground\">Status</p>\n <div className=\"flex flex-wrap gap-1.5\">\n <FilterChip active={!listedOnly} onClick={() => setListedOnly(false)} label=\"All\" />\n <FilterChip\n active={listedOnly}\n onClick={() => setListedOnly(true)}\n label={`Listed only${listedCount > 0 ? ` (${listedCount})` : \"\"}`}\n />\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <p className=\"text-2xs font-semibold text-muted-foreground\">Sort</p>\n <div className=\"flex flex-wrap gap-1.5\">\n <FilterChip active={sortOrder === \"recent\"} onClick={() => setSortOrder(\"recent\")} label=\"Recent\" />\n <FilterChip active={sortOrder === \"price_asc\"} onClick={() => setSortOrder(\"price_asc\")} label=\"Price ↑\" />\n <FilterChip active={sortOrder === \"price_desc\"} onClick={() => setSortOrder(\"price_desc\")} label=\"Price ↓\" />\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <p className=\"text-2xs font-semibold text-muted-foreground\">License</p>\n <div className=\"flex flex-wrap gap-1.5\">\n {[\"all\", \"CC0\", \"CC BY\", \"CC BY-SA\", \"CC BY-NC\", \"CC BY-ND\", \"Custom\"].map((lic) => (\n <FilterChip\n key={lic}\n active={licenseFilter === lic}\n onClick={() => setLicenseFilter(lic)}\n label={lic === \"all\" ? \"All licenses\" : lic}\n />\n ))}\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <p className=\"text-2xs font-semibold text-muted-foreground\">Creator</p>\n <div className=\"relative\">\n <Search className=\"absolute left-2.5 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground\" />\n <Input\n className=\"h-9 text-sm pl-8\"\n placeholder=\"Name or wallet address…\"\n value={creatorSearchInput}\n onChange={(e) => setCreatorSearchInput(e.target.value)}\n />\n </div>\n </div>\n\n <div className=\"space-y-2 pt-1 border-t border-border/60\">\n <p className=\"text-2xs font-semibold text-muted-foreground\">IP Type</p>\n <div className=\"flex flex-wrap gap-1.5\">\n {IP_TYPE_CONFIG.map((t) => (\n <Link\n key={t.slug}\n href={`/${t.slug}`}\n className={cn(\n \"inline-flex items-center gap-1.5 text-xs px-3 py-1.5 rounded-full border transition-colors whitespace-nowrap\",\n t.slug === slug\n ? \"border-primary bg-primary/10 text-primary font-medium\"\n : \"border-border text-muted-foreground hover:border-primary/50\"\n )}\n >\n <t.icon className={cn(\"h-3 w-3\", t.slug === slug ? t.colorClass : \"\")} />\n {t.label}\n </Link>\n ))}\n </div>\n </div>\n </div>\n\n <div className=\"px-5 py-3 border-t border-border/60\">\n <Button className=\"w-full\" onClick={() => setFiltersOpen(false)}>\n Apply filters\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n </div>\n\n {isInitialLoading ? (\n <div className=\"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-4\">\n {Array.from({ length: PAGE_SIZE }).map((_, i) => (\n <TokenCardSkeleton key={i} />\n ))}\n </div>\n ) : displayed.length === 0 ? (\n <div className=\"py-24 flex flex-col items-center gap-4 text-center\">\n {config && Icon && (\n <div className={cn(\"h-16 w-16 rounded-2xl flex items-center justify-center\", config.bgClass)}>\n <Icon className={cn(\"h-8 w-8\", config.colorClass)} />\n </div>\n )}\n <div>\n <p className=\"font-semibold text-lg\">\n {listedOnly ? \"Listed assets appear here\" : emptyMessages.assetsOfType.title}\n </p>\n <p className=\"text-muted-foreground text-sm mt-1\">\n {listedOnly\n ? \"Try removing the 'Listed only' filter to see all assets.\"\n : emptyMessages.assetsOfType.description}\n </p>\n </div>\n <Button asChild variant=\"outline\">\n <Link href=\"/launchpad/single-editions\">Create Asset</Link>\n </Button>\n </div>\n ) : (\n <div className=\"space-y-6\">\n <div className=\"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-4\">\n {displayed.map((token) => {\n const listing = token.activeOrders?.find((o) => o.offer.itemType === \"ERC721\" || o.offer.itemType === \"ERC1155\");\n const isOwner = !!walletAddress && !!token.owner && isSameAddress(token.owner, walletAddress);\n return (\n <TokenCard\n key={`${token.contractAddress}:${token.tokenId}`}\n token={token}\n isOwner={isOwner}\n onBuy={!isOwner && listing ? () => market.buy(listing) : undefined}\n onOffer={isOwner ? undefined : market.offer}\n />\n );\n })}\n </div>\n\n {!listedOnly && (\n <LoadMoreSentinel\n hasMore={hasMore}\n isLoading={isLoadingMore}\n onLoadMore={() => setPage((p) => p + 1)}\n />\n )}\n </div>\n )}\n\n {market.dialogs}\n </PageContainer>\n );\n}\n"],"mappings":"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","names":["XIcon","Link"]}
@@ -15,6 +15,7 @@ import { useMedialaneApp } from "./medialane-app.js";
15
15
  import { cn } from "../utils/cn.js";
16
16
  import { isSameAddress } from "../utils/same-address.js";
17
17
  import { useTokensByIpType } from "../utils/use-tokens-by-ip-type.js";
18
+ import { emptyMessages } from "../utils/empty-messages.js";
18
19
  const PAGE_SIZE = 24;
19
20
  function FilterChip({ active, onClick, label }) {
20
21
  return /* @__PURE__ */ jsx(
@@ -242,8 +243,8 @@ function IpTypePage({ slug, useMarketActions }) {
242
243
  isInitialLoading ? /* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-4", children: Array.from({ length: PAGE_SIZE }).map((_, i) => /* @__PURE__ */ jsx(TokenCardSkeleton, {}, i)) }) : displayed.length === 0 ? /* @__PURE__ */ jsxs("div", { className: "py-24 flex flex-col items-center gap-4 text-center", children: [
243
244
  config && Icon && /* @__PURE__ */ jsx("div", { className: cn("h-16 w-16 rounded-2xl flex items-center justify-center", config.bgClass), children: /* @__PURE__ */ jsx(Icon, { className: cn("h-8 w-8", config.colorClass) }) }),
244
245
  /* @__PURE__ */ jsxs("div", { children: [
245
- /* @__PURE__ */ jsx("p", { className: "font-semibold text-lg", children: listedOnly ? "No listed assets yet" : "No assets indexed yet" }),
246
- /* @__PURE__ */ jsx("p", { className: "text-muted-foreground text-sm mt-1", children: listedOnly ? "Try removing the 'Listed only' filter to see all assets." : `Be the first to mint a ${config?.label ?? slug} asset on Medialane.` })
246
+ /* @__PURE__ */ jsx("p", { className: "font-semibold text-lg", children: listedOnly ? "Listed assets appear here" : emptyMessages.assetsOfType.title }),
247
+ /* @__PURE__ */ jsx("p", { className: "text-muted-foreground text-sm mt-1", children: listedOnly ? "Try removing the 'Listed only' filter to see all assets." : emptyMessages.assetsOfType.description })
247
248
  ] }),
248
249
  /* @__PURE__ */ jsx(Button, { asChild: true, variant: "outline", children: /* @__PURE__ */ jsx(Link, { href: "/launchpad/single-editions", children: "Create Asset" }) })
249
250
  ] }) : /* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/ip-type-page.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useEffect, useRef } from \"react\";\nimport { SlidersHorizontal, Search, X as XIcon } from \"lucide-react\";\nimport type { ApiToken } from \"@medialane/sdk\";\nimport Link from \"./link.js\";\nimport { Badge } from \"./badge.js\";\nimport { Button } from \"./button.js\";\nimport { Dialog, DialogContent, DialogTitle } from \"./dialog.js\";\nimport { Input } from \"./input.js\";\nimport { PageContainer } from \"./page-container.js\";\nimport { LoadMoreSentinel } from \"./load-more-sentinel.js\";\nimport { IP_TYPE_CONFIG, IP_TYPE_MAP } from \"./ip-type-badge.js\";\nimport { TokenCard, TokenCardSkeleton } from \"./token-card.js\";\nimport { useMedialaneApp } from \"./medialane-app.js\";\nimport type { CollectionMarketActions } from \"./collection-page.js\";\nimport { cn } from \"../utils/cn.js\";\nimport { isSameAddress } from \"../utils/same-address.js\";\nimport { useTokensByIpType } from \"../utils/use-tokens-by-ip-type.js\";\n\nconst PAGE_SIZE = 24;\n\nfunction FilterChip({ active, onClick, label }: { active: boolean; onClick: () => void; label: string }) {\n return (\n <button\n onClick={onClick}\n className={cn(\n \"text-xs px-3 py-1.5 rounded-full border transition-colors whitespace-nowrap\",\n active\n ? \"border-primary bg-primary/10 text-primary font-medium\"\n : \"border-border text-muted-foreground hover:border-primary/50\"\n )}\n >\n {label}\n </button>\n );\n}\n\nexport interface IpTypePageProps {\n slug: string;\n useMarketActions: () => CollectionMarketActions;\n}\n\nexport function IpTypePage({ slug, useMarketActions }: IpTypePageProps) {\n const { walletAddress } = useMedialaneApp();\n const market = useMarketActions();\n const config = IP_TYPE_MAP[slug];\n const Icon = config?.icon;\n const [page, setPage] = useState(1);\n const [listedOnly, setListedOnly] = useState(false);\n const [allTokens, setAllTokens] = useState<ApiToken[]>([]);\n const prevSlug = useRef(slug);\n\n const [filtersOpen, setFiltersOpen] = useState(false);\n const [sortOrder, setSortOrder] = useState<\"recent\" | \"price_asc\" | \"price_desc\">(\"recent\");\n const [licenseFilter, setLicenseFilter] = useState<string>(\"all\");\n const [creatorSearchInput, setCreatorSearchInput] = useState(\"\");\n const [creatorSearch, setCreatorSearch] = useState(\"\");\n\n useEffect(() => {\n if (prevSlug.current !== slug) {\n prevSlug.current = slug;\n setPage(1);\n setAllTokens([]);\n }\n }, [slug]);\n\n useEffect(() => {\n const t = setTimeout(() => setCreatorSearch(creatorSearchInput), 300);\n return () => clearTimeout(t);\n }, [creatorSearchInput]);\n\n const { tokens, meta, isLoading } = useTokensByIpType(slug, page, PAGE_SIZE);\n\n useEffect(() => {\n if (isLoading) return;\n if (page === 1) {\n setAllTokens(tokens);\n } else {\n setAllTokens((prev) => {\n const seen = new Set(prev.map((t) => `${t.contractAddress}:${t.tokenId}`));\n const fresh = tokens.filter((t) => !seen.has(`${t.contractAddress}:${t.tokenId}`));\n return fresh.length > 0 ? [...prev, ...fresh] : prev;\n });\n }\n }, [tokens, isLoading, page]);\n\n const activeFilterCount =\n (sortOrder !== \"recent\" ? 1 : 0) +\n (licenseFilter !== \"all\" ? 1 : 0) +\n (creatorSearch !== \"\" ? 1 : 0);\n const activeChipCount = activeFilterCount + (listedOnly ? 1 : 0);\n const hasActiveFilters = activeChipCount > 0;\n const resetAll = () => {\n setSortOrder(\"recent\");\n setLicenseFilter(\"all\");\n setCreatorSearch(\"\");\n setCreatorSearchInput(\"\");\n setListedOnly(false);\n };\n\n let displayed = listedOnly\n ? allTokens.filter((t) => (t.activeOrders?.length ?? 0) > 0)\n : [...allTokens];\n\n if (licenseFilter !== \"all\") {\n displayed = displayed.filter((t) =>\n t.metadata?.attributes?.some(\n (a) => a.trait_type === \"License\" && a.value === licenseFilter\n )\n );\n }\n if (creatorSearch) {\n const q = creatorSearch.toLowerCase();\n displayed = displayed.filter((t) => {\n const creatorVal =\n t.metadata?.attributes?.find((a) => a.trait_type === \"Creator\")?.value ?? \"\";\n return (\n String(creatorVal).toLowerCase().includes(q) ||\n t.contractAddress.toLowerCase().includes(q)\n );\n });\n }\n if (sortOrder === \"price_asc\") {\n displayed = [...displayed].sort((a, b) => {\n const pa = parseFloat(a.activeOrders?.[0]?.price?.formatted ?? \"Infinity\");\n const pb = parseFloat(b.activeOrders?.[0]?.price?.formatted ?? \"Infinity\");\n return pa - pb;\n });\n } else if (sortOrder === \"price_desc\") {\n displayed = [...displayed].sort((a, b) => {\n const pa = parseFloat(a.activeOrders?.[0]?.price?.formatted ?? \"0\");\n const pb = parseFloat(b.activeOrders?.[0]?.price?.formatted ?? \"0\");\n return pb - pa;\n });\n }\n\n const isInitialLoading = isLoading && allTokens.length === 0;\n const isLoadingMore = isLoading && allTokens.length > 0;\n const hasMore = meta?.total != null ? allTokens.length < meta.total : false;\n const listedCount = allTokens.filter((t) => (t.activeOrders?.length ?? 0) > 0).length;\n\n return (\n <PageContainer className=\"box-border max-w-full pt-20 pb-16 space-y-8\">\n\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-4\">\n {config && Icon && (\n <div className={cn(\"h-14 w-14 rounded-2xl flex items-center justify-center shadow-lg\", config.bgClass)}>\n <Icon className={cn(\"h-7 w-7\", config.colorClass)} />\n </div>\n )}\n <div>\n <h1 className=\"text-3xl font-semibold\">{config?.label ?? slug}</h1>\n <p className=\"text-muted-foreground mt-0.5\">\n {meta?.total != null ? (\n <>{meta.total.toLocaleString()} assets · {listedCount} market</>\n ) : (\n \"Browsing indexed digital assets on Medialane\"\n )}\n </p>\n </div>\n </div>\n\n <div className=\"flex items-center gap-2 flex-wrap\">\n <button\n onClick={() => setFiltersOpen(true)}\n className={cn(\n \"inline-flex items-center gap-1.5 text-xs px-3.5 py-2 rounded-full border font-medium transition-colors\",\n hasActiveFilters\n ? \"border-primary bg-primary/10 text-primary\"\n : \"border-border text-muted-foreground\"\n )}\n >\n <SlidersHorizontal className=\"h-3.5 w-3.5\" />\n Filters\n {activeChipCount > 0 && (\n <span className=\"ml-0.5 bg-primary text-primary-foreground rounded-full px-1.5 text-2xs font-bold leading-4\">\n {activeChipCount}\n </span>\n )}\n </button>\n\n {listedOnly && (\n <Badge variant=\"secondary\" className=\"cursor-pointer gap-1 text-xs\" onClick={() => setListedOnly(false)}>\n Listed only\n <XIcon className=\"h-3 w-3\" />\n </Badge>\n )}\n {sortOrder !== \"recent\" && (\n <Badge variant=\"secondary\" className=\"cursor-pointer gap-1 text-xs\" onClick={() => setSortOrder(\"recent\")}>\n {sortOrder === \"price_asc\" ? \"Price ↑\" : \"Price ↓\"}\n <XIcon className=\"h-3 w-3\" />\n </Badge>\n )}\n {licenseFilter !== \"all\" && (\n <Badge variant=\"secondary\" className=\"cursor-pointer gap-1 text-xs\" onClick={() => setLicenseFilter(\"all\")}>\n {licenseFilter}\n <XIcon className=\"h-3 w-3\" />\n </Badge>\n )}\n {creatorSearch && (\n <Badge variant=\"secondary\" className=\"cursor-pointer gap-1 text-xs\" onClick={() => { setCreatorSearch(\"\"); setCreatorSearchInput(\"\"); }}>\n {creatorSearch.length > 10 ? `${creatorSearch.slice(0, 10)}…` : creatorSearch}\n <XIcon className=\"h-3 w-3\" />\n </Badge>\n )}\n </div>\n\n <Dialog open={filtersOpen} onOpenChange={setFiltersOpen}>\n <DialogContent className=\"w-full max-w-sm sm:max-w-md p-0 overflow-hidden gap-0 flex flex-col max-h-[85svh]\">\n <div className=\"flex items-center justify-between px-5 py-4 border-b border-border/60 pr-12\">\n <DialogTitle className=\"text-base font-bold flex items-center gap-2\">\n <SlidersHorizontal className=\"h-4 w-4 text-primary\" />\n Filters\n </DialogTitle>\n {hasActiveFilters && (\n <Button variant=\"ghost\" size=\"sm\" className=\"h-7 text-xs text-muted-foreground\" onClick={resetAll}>\n Clear all\n </Button>\n )}\n </div>\n\n <div className=\"flex-1 overflow-y-auto px-5 py-4 space-y-5\">\n\n <div className=\"space-y-2\">\n <p className=\"text-2xs font-semibold text-muted-foreground\">Status</p>\n <div className=\"flex flex-wrap gap-1.5\">\n <FilterChip active={!listedOnly} onClick={() => setListedOnly(false)} label=\"All\" />\n <FilterChip\n active={listedOnly}\n onClick={() => setListedOnly(true)}\n label={`Listed only${listedCount > 0 ? ` (${listedCount})` : \"\"}`}\n />\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <p className=\"text-2xs font-semibold text-muted-foreground\">Sort</p>\n <div className=\"flex flex-wrap gap-1.5\">\n <FilterChip active={sortOrder === \"recent\"} onClick={() => setSortOrder(\"recent\")} label=\"Recent\" />\n <FilterChip active={sortOrder === \"price_asc\"} onClick={() => setSortOrder(\"price_asc\")} label=\"Price ↑\" />\n <FilterChip active={sortOrder === \"price_desc\"} onClick={() => setSortOrder(\"price_desc\")} label=\"Price ↓\" />\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <p className=\"text-2xs font-semibold text-muted-foreground\">License</p>\n <div className=\"flex flex-wrap gap-1.5\">\n {[\"all\", \"CC0\", \"CC BY\", \"CC BY-SA\", \"CC BY-NC\", \"CC BY-ND\", \"Custom\"].map((lic) => (\n <FilterChip\n key={lic}\n active={licenseFilter === lic}\n onClick={() => setLicenseFilter(lic)}\n label={lic === \"all\" ? \"All licenses\" : lic}\n />\n ))}\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <p className=\"text-2xs font-semibold text-muted-foreground\">Creator</p>\n <div className=\"relative\">\n <Search className=\"absolute left-2.5 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground\" />\n <Input\n className=\"h-9 text-sm pl-8\"\n placeholder=\"Name or wallet address…\"\n value={creatorSearchInput}\n onChange={(e) => setCreatorSearchInput(e.target.value)}\n />\n </div>\n </div>\n\n <div className=\"space-y-2 pt-1 border-t border-border/60\">\n <p className=\"text-2xs font-semibold text-muted-foreground\">IP Type</p>\n <div className=\"flex flex-wrap gap-1.5\">\n {IP_TYPE_CONFIG.map((t) => (\n <Link\n key={t.slug}\n href={`/${t.slug}`}\n className={cn(\n \"inline-flex items-center gap-1.5 text-xs px-3 py-1.5 rounded-full border transition-colors whitespace-nowrap\",\n t.slug === slug\n ? \"border-primary bg-primary/10 text-primary font-medium\"\n : \"border-border text-muted-foreground hover:border-primary/50\"\n )}\n >\n <t.icon className={cn(\"h-3 w-3\", t.slug === slug ? t.colorClass : \"\")} />\n {t.label}\n </Link>\n ))}\n </div>\n </div>\n </div>\n\n <div className=\"px-5 py-3 border-t border-border/60\">\n <Button className=\"w-full\" onClick={() => setFiltersOpen(false)}>\n Apply filters\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n </div>\n\n {isInitialLoading ? (\n <div className=\"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-4\">\n {Array.from({ length: PAGE_SIZE }).map((_, i) => (\n <TokenCardSkeleton key={i} />\n ))}\n </div>\n ) : displayed.length === 0 ? (\n <div className=\"py-24 flex flex-col items-center gap-4 text-center\">\n {config && Icon && (\n <div className={cn(\"h-16 w-16 rounded-2xl flex items-center justify-center\", config.bgClass)}>\n <Icon className={cn(\"h-8 w-8\", config.colorClass)} />\n </div>\n )}\n <div>\n <p className=\"font-semibold text-lg\">\n {listedOnly ? \"No listed assets yet\" : \"No assets indexed yet\"}\n </p>\n <p className=\"text-muted-foreground text-sm mt-1\">\n {listedOnly\n ? \"Try removing the 'Listed only' filter to see all assets.\"\n : `Be the first to mint a ${config?.label ?? slug} asset on Medialane.`}\n </p>\n </div>\n <Button asChild variant=\"outline\">\n <Link href=\"/launchpad/single-editions\">Create Asset</Link>\n </Button>\n </div>\n ) : (\n <div className=\"space-y-6\">\n <div className=\"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-4\">\n {displayed.map((token) => {\n const listing = token.activeOrders?.find((o) => o.offer.itemType === \"ERC721\" || o.offer.itemType === \"ERC1155\");\n const isOwner = !!walletAddress && !!token.owner && isSameAddress(token.owner, walletAddress);\n return (\n <TokenCard\n key={`${token.contractAddress}:${token.tokenId}`}\n token={token}\n isOwner={isOwner}\n onBuy={!isOwner && listing ? () => market.buy(listing) : undefined}\n onOffer={isOwner ? undefined : market.offer}\n />\n );\n })}\n </div>\n\n {!listedOnly && (\n <LoadMoreSentinel\n hasMore={hasMore}\n isLoading={isLoadingMore}\n onLoadMore={() => setPage((p) => p + 1)}\n />\n )}\n </div>\n )}\n\n {market.dialogs}\n </PageContainer>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/components/ip-type-page.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useEffect, useRef } from \"react\";\nimport { SlidersHorizontal, Search, X as XIcon } from \"lucide-react\";\nimport type { ApiToken } from \"@medialane/sdk\";\nimport Link from \"./link.js\";\nimport { Badge } from \"./badge.js\";\nimport { Button } from \"./button.js\";\nimport { Dialog, DialogContent, DialogTitle } from \"./dialog.js\";\nimport { Input } from \"./input.js\";\nimport { PageContainer } from \"./page-container.js\";\nimport { LoadMoreSentinel } from \"./load-more-sentinel.js\";\nimport { IP_TYPE_CONFIG, IP_TYPE_MAP } from \"./ip-type-badge.js\";\nimport { TokenCard, TokenCardSkeleton } from \"./token-card.js\";\nimport { useMedialaneApp } from \"./medialane-app.js\";\nimport type { CollectionMarketActions } from \"./collection-page.js\";\nimport { cn } from \"../utils/cn.js\";\nimport { isSameAddress } from \"../utils/same-address.js\";\nimport { useTokensByIpType } from \"../utils/use-tokens-by-ip-type.js\";\nimport { emptyMessages } from \"../utils/empty-messages.js\";\n\nconst PAGE_SIZE = 24;\n\nfunction FilterChip({ active, onClick, label }: { active: boolean; onClick: () => void; label: string }) {\n return (\n <button\n onClick={onClick}\n className={cn(\n \"text-xs px-3 py-1.5 rounded-full border transition-colors whitespace-nowrap\",\n active\n ? \"border-primary bg-primary/10 text-primary font-medium\"\n : \"border-border text-muted-foreground hover:border-primary/50\"\n )}\n >\n {label}\n </button>\n );\n}\n\nexport interface IpTypePageProps {\n slug: string;\n useMarketActions: () => CollectionMarketActions;\n}\n\nexport function IpTypePage({ slug, useMarketActions }: IpTypePageProps) {\n const { walletAddress } = useMedialaneApp();\n const market = useMarketActions();\n const config = IP_TYPE_MAP[slug];\n const Icon = config?.icon;\n const [page, setPage] = useState(1);\n const [listedOnly, setListedOnly] = useState(false);\n const [allTokens, setAllTokens] = useState<ApiToken[]>([]);\n const prevSlug = useRef(slug);\n\n const [filtersOpen, setFiltersOpen] = useState(false);\n const [sortOrder, setSortOrder] = useState<\"recent\" | \"price_asc\" | \"price_desc\">(\"recent\");\n const [licenseFilter, setLicenseFilter] = useState<string>(\"all\");\n const [creatorSearchInput, setCreatorSearchInput] = useState(\"\");\n const [creatorSearch, setCreatorSearch] = useState(\"\");\n\n useEffect(() => {\n if (prevSlug.current !== slug) {\n prevSlug.current = slug;\n setPage(1);\n setAllTokens([]);\n }\n }, [slug]);\n\n useEffect(() => {\n const t = setTimeout(() => setCreatorSearch(creatorSearchInput), 300);\n return () => clearTimeout(t);\n }, [creatorSearchInput]);\n\n const { tokens, meta, isLoading } = useTokensByIpType(slug, page, PAGE_SIZE);\n\n useEffect(() => {\n if (isLoading) return;\n if (page === 1) {\n setAllTokens(tokens);\n } else {\n setAllTokens((prev) => {\n const seen = new Set(prev.map((t) => `${t.contractAddress}:${t.tokenId}`));\n const fresh = tokens.filter((t) => !seen.has(`${t.contractAddress}:${t.tokenId}`));\n return fresh.length > 0 ? [...prev, ...fresh] : prev;\n });\n }\n }, [tokens, isLoading, page]);\n\n const activeFilterCount =\n (sortOrder !== \"recent\" ? 1 : 0) +\n (licenseFilter !== \"all\" ? 1 : 0) +\n (creatorSearch !== \"\" ? 1 : 0);\n const activeChipCount = activeFilterCount + (listedOnly ? 1 : 0);\n const hasActiveFilters = activeChipCount > 0;\n const resetAll = () => {\n setSortOrder(\"recent\");\n setLicenseFilter(\"all\");\n setCreatorSearch(\"\");\n setCreatorSearchInput(\"\");\n setListedOnly(false);\n };\n\n let displayed = listedOnly\n ? allTokens.filter((t) => (t.activeOrders?.length ?? 0) > 0)\n : [...allTokens];\n\n if (licenseFilter !== \"all\") {\n displayed = displayed.filter((t) =>\n t.metadata?.attributes?.some(\n (a) => a.trait_type === \"License\" && a.value === licenseFilter\n )\n );\n }\n if (creatorSearch) {\n const q = creatorSearch.toLowerCase();\n displayed = displayed.filter((t) => {\n const creatorVal =\n t.metadata?.attributes?.find((a) => a.trait_type === \"Creator\")?.value ?? \"\";\n return (\n String(creatorVal).toLowerCase().includes(q) ||\n t.contractAddress.toLowerCase().includes(q)\n );\n });\n }\n if (sortOrder === \"price_asc\") {\n displayed = [...displayed].sort((a, b) => {\n const pa = parseFloat(a.activeOrders?.[0]?.price?.formatted ?? \"Infinity\");\n const pb = parseFloat(b.activeOrders?.[0]?.price?.formatted ?? \"Infinity\");\n return pa - pb;\n });\n } else if (sortOrder === \"price_desc\") {\n displayed = [...displayed].sort((a, b) => {\n const pa = parseFloat(a.activeOrders?.[0]?.price?.formatted ?? \"0\");\n const pb = parseFloat(b.activeOrders?.[0]?.price?.formatted ?? \"0\");\n return pb - pa;\n });\n }\n\n const isInitialLoading = isLoading && allTokens.length === 0;\n const isLoadingMore = isLoading && allTokens.length > 0;\n const hasMore = meta?.total != null ? allTokens.length < meta.total : false;\n const listedCount = allTokens.filter((t) => (t.activeOrders?.length ?? 0) > 0).length;\n\n return (\n <PageContainer className=\"box-border max-w-full pt-20 pb-16 space-y-8\">\n\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-4\">\n {config && Icon && (\n <div className={cn(\"h-14 w-14 rounded-2xl flex items-center justify-center shadow-lg\", config.bgClass)}>\n <Icon className={cn(\"h-7 w-7\", config.colorClass)} />\n </div>\n )}\n <div>\n <h1 className=\"text-3xl font-semibold\">{config?.label ?? slug}</h1>\n <p className=\"text-muted-foreground mt-0.5\">\n {meta?.total != null ? (\n <>{meta.total.toLocaleString()} assets · {listedCount} market</>\n ) : (\n \"Browsing indexed digital assets on Medialane\"\n )}\n </p>\n </div>\n </div>\n\n <div className=\"flex items-center gap-2 flex-wrap\">\n <button\n onClick={() => setFiltersOpen(true)}\n className={cn(\n \"inline-flex items-center gap-1.5 text-xs px-3.5 py-2 rounded-full border font-medium transition-colors\",\n hasActiveFilters\n ? \"border-primary bg-primary/10 text-primary\"\n : \"border-border text-muted-foreground\"\n )}\n >\n <SlidersHorizontal className=\"h-3.5 w-3.5\" />\n Filters\n {activeChipCount > 0 && (\n <span className=\"ml-0.5 bg-primary text-primary-foreground rounded-full px-1.5 text-2xs font-bold leading-4\">\n {activeChipCount}\n </span>\n )}\n </button>\n\n {listedOnly && (\n <Badge variant=\"secondary\" className=\"cursor-pointer gap-1 text-xs\" onClick={() => setListedOnly(false)}>\n Listed only\n <XIcon className=\"h-3 w-3\" />\n </Badge>\n )}\n {sortOrder !== \"recent\" && (\n <Badge variant=\"secondary\" className=\"cursor-pointer gap-1 text-xs\" onClick={() => setSortOrder(\"recent\")}>\n {sortOrder === \"price_asc\" ? \"Price ↑\" : \"Price ↓\"}\n <XIcon className=\"h-3 w-3\" />\n </Badge>\n )}\n {licenseFilter !== \"all\" && (\n <Badge variant=\"secondary\" className=\"cursor-pointer gap-1 text-xs\" onClick={() => setLicenseFilter(\"all\")}>\n {licenseFilter}\n <XIcon className=\"h-3 w-3\" />\n </Badge>\n )}\n {creatorSearch && (\n <Badge variant=\"secondary\" className=\"cursor-pointer gap-1 text-xs\" onClick={() => { setCreatorSearch(\"\"); setCreatorSearchInput(\"\"); }}>\n {creatorSearch.length > 10 ? `${creatorSearch.slice(0, 10)}…` : creatorSearch}\n <XIcon className=\"h-3 w-3\" />\n </Badge>\n )}\n </div>\n\n <Dialog open={filtersOpen} onOpenChange={setFiltersOpen}>\n <DialogContent className=\"w-full max-w-sm sm:max-w-md p-0 overflow-hidden gap-0 flex flex-col max-h-[85svh]\">\n <div className=\"flex items-center justify-between px-5 py-4 border-b border-border/60 pr-12\">\n <DialogTitle className=\"text-base font-bold flex items-center gap-2\">\n <SlidersHorizontal className=\"h-4 w-4 text-primary\" />\n Filters\n </DialogTitle>\n {hasActiveFilters && (\n <Button variant=\"ghost\" size=\"sm\" className=\"h-7 text-xs text-muted-foreground\" onClick={resetAll}>\n Clear all\n </Button>\n )}\n </div>\n\n <div className=\"flex-1 overflow-y-auto px-5 py-4 space-y-5\">\n\n <div className=\"space-y-2\">\n <p className=\"text-2xs font-semibold text-muted-foreground\">Status</p>\n <div className=\"flex flex-wrap gap-1.5\">\n <FilterChip active={!listedOnly} onClick={() => setListedOnly(false)} label=\"All\" />\n <FilterChip\n active={listedOnly}\n onClick={() => setListedOnly(true)}\n label={`Listed only${listedCount > 0 ? ` (${listedCount})` : \"\"}`}\n />\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <p className=\"text-2xs font-semibold text-muted-foreground\">Sort</p>\n <div className=\"flex flex-wrap gap-1.5\">\n <FilterChip active={sortOrder === \"recent\"} onClick={() => setSortOrder(\"recent\")} label=\"Recent\" />\n <FilterChip active={sortOrder === \"price_asc\"} onClick={() => setSortOrder(\"price_asc\")} label=\"Price ↑\" />\n <FilterChip active={sortOrder === \"price_desc\"} onClick={() => setSortOrder(\"price_desc\")} label=\"Price ↓\" />\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <p className=\"text-2xs font-semibold text-muted-foreground\">License</p>\n <div className=\"flex flex-wrap gap-1.5\">\n {[\"all\", \"CC0\", \"CC BY\", \"CC BY-SA\", \"CC BY-NC\", \"CC BY-ND\", \"Custom\"].map((lic) => (\n <FilterChip\n key={lic}\n active={licenseFilter === lic}\n onClick={() => setLicenseFilter(lic)}\n label={lic === \"all\" ? \"All licenses\" : lic}\n />\n ))}\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <p className=\"text-2xs font-semibold text-muted-foreground\">Creator</p>\n <div className=\"relative\">\n <Search className=\"absolute left-2.5 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground\" />\n <Input\n className=\"h-9 text-sm pl-8\"\n placeholder=\"Name or wallet address…\"\n value={creatorSearchInput}\n onChange={(e) => setCreatorSearchInput(e.target.value)}\n />\n </div>\n </div>\n\n <div className=\"space-y-2 pt-1 border-t border-border/60\">\n <p className=\"text-2xs font-semibold text-muted-foreground\">IP Type</p>\n <div className=\"flex flex-wrap gap-1.5\">\n {IP_TYPE_CONFIG.map((t) => (\n <Link\n key={t.slug}\n href={`/${t.slug}`}\n className={cn(\n \"inline-flex items-center gap-1.5 text-xs px-3 py-1.5 rounded-full border transition-colors whitespace-nowrap\",\n t.slug === slug\n ? \"border-primary bg-primary/10 text-primary font-medium\"\n : \"border-border text-muted-foreground hover:border-primary/50\"\n )}\n >\n <t.icon className={cn(\"h-3 w-3\", t.slug === slug ? t.colorClass : \"\")} />\n {t.label}\n </Link>\n ))}\n </div>\n </div>\n </div>\n\n <div className=\"px-5 py-3 border-t border-border/60\">\n <Button className=\"w-full\" onClick={() => setFiltersOpen(false)}>\n Apply filters\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n </div>\n\n {isInitialLoading ? (\n <div className=\"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-4\">\n {Array.from({ length: PAGE_SIZE }).map((_, i) => (\n <TokenCardSkeleton key={i} />\n ))}\n </div>\n ) : displayed.length === 0 ? (\n <div className=\"py-24 flex flex-col items-center gap-4 text-center\">\n {config && Icon && (\n <div className={cn(\"h-16 w-16 rounded-2xl flex items-center justify-center\", config.bgClass)}>\n <Icon className={cn(\"h-8 w-8\", config.colorClass)} />\n </div>\n )}\n <div>\n <p className=\"font-semibold text-lg\">\n {listedOnly ? \"Listed assets appear here\" : emptyMessages.assetsOfType.title}\n </p>\n <p className=\"text-muted-foreground text-sm mt-1\">\n {listedOnly\n ? \"Try removing the 'Listed only' filter to see all assets.\"\n : emptyMessages.assetsOfType.description}\n </p>\n </div>\n <Button asChild variant=\"outline\">\n <Link href=\"/launchpad/single-editions\">Create Asset</Link>\n </Button>\n </div>\n ) : (\n <div className=\"space-y-6\">\n <div className=\"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-4\">\n {displayed.map((token) => {\n const listing = token.activeOrders?.find((o) => o.offer.itemType === \"ERC721\" || o.offer.itemType === \"ERC1155\");\n const isOwner = !!walletAddress && !!token.owner && isSameAddress(token.owner, walletAddress);\n return (\n <TokenCard\n key={`${token.contractAddress}:${token.tokenId}`}\n token={token}\n isOwner={isOwner}\n onBuy={!isOwner && listing ? () => market.buy(listing) : undefined}\n onOffer={isOwner ? undefined : market.offer}\n />\n );\n })}\n </div>\n\n {!listedOnly && (\n <LoadMoreSentinel\n hasMore={hasMore}\n isLoading={isLoadingMore}\n onLoadMore={() => setPage((p) => p + 1)}\n />\n )}\n </div>\n )}\n\n {market.dialogs}\n </PageContainer>\n );\n}\n"],"mappings":"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","names":[]}
@@ -47,7 +47,7 @@ var import_coin_launch_preview = require("../coin-launch-preview.js");
47
47
  var import_currency_icon = require("../currency-icon.js");
48
48
  var import_gradient_button = require("../gradient-button.js");
49
49
  var import_claim_route_shell = require("../claim-route-shell.js");
50
- var import_creation_success = require("../creation-success.js");
50
+ var import_transaction_success = require("../transaction-success.js");
51
51
  var import_transaction_dialog = require("../transaction-dialog.js");
52
52
  var import_wallet_required = require("../wallet-required.js");
53
53
  var import_medialane_app = require("../medialane-app.js");
@@ -182,15 +182,17 @@ function CoinCreate({ aside, tradeHref }) {
182
182
  description: "Secure your account to design and launch your own coin with permanently-locked liquidity, in a few clicks.",
183
183
  children: [
184
184
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_transaction_dialog.TransactionDialog, { tx, title: "Launch your coin", workingLabel: "Launching your coin\u2026", firstStepLabel: "Deploy your coin", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
185
- import_creation_success.CreationSuccess,
185
+ import_transaction_success.TransactionSuccess,
186
186
  {
187
187
  name: name || "Your coin",
188
188
  image: imagePreview,
189
- caption: "Your coin is live",
190
- primary: coinAddress ? { href: tradeHref(coinAddress), label: "View & trade your coin" } : { href: "/launchpad", label: "Back to Launchpad" },
191
- secondary: coinAddress ? { href: "/launchpad", label: "Back to Launchpad" } : void 0,
192
- onAgain: handleReset,
193
- againLabel: "Launch another coin",
189
+ title: "Coin launched",
190
+ description: "The supply is fixed and the liquidity is locked.",
191
+ actions: [
192
+ ...coinAddress ? [{ href: tradeHref(coinAddress), label: "View & trade your coin" }] : [],
193
+ { href: "/launchpad", label: "Back to Launchpad" },
194
+ { label: "Launch another coin", onClick: handleReset }
195
+ ],
194
196
  children: [
195
197
  profileStatus === "saving" && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", { className: "text-xs text-muted-foreground flex items-center justify-center gap-1.5", children: [
196
198
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Loader2, { className: "h-3 w-3 animate-spin" }),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/launchpad/coin-create.tsx"],"sourcesContent":["\"use client\";\n\nimport { useMemo, useState, type ReactNode } from \"react\";\nimport { ArrowRight, Coins, ImagePlus, Loader2, X } from \"lucide-react\";\nimport { SUPPORTED_TOKENS, formatAmount, getTokenBySymbol, normalizeAddress } from \"@medialane/sdk\";\nimport { acceptFor } from \"../../utils/upload-limits.js\";\nimport {\n SUGGESTED_DEFAULT_PRICE,\n buybackQuoteRaw,\n coinToRaw as toRaw,\n fdvHuman,\n parseCreatorCoinCreated,\n teamCoinsRaw,\n validateCoinName as validateName,\n validateCoinSupply as validateSupply,\n validateCoinSymbol as validateSymbol,\n validatePrice,\n assertTransactionSucceeded,\n type CreatorCoinReceiptLike,\n} from \"@medialane/sdk/starknet\";\nimport Image from \"../image.js\";\nimport Link from \"../link.js\";\nimport { Input } from \"../input.js\";\nimport { Label } from \"../label.js\";\nimport { Textarea } from \"../textarea.js\";\nimport { CoinLaunchPreview, type CoinPreviewData } from \"../coin-launch-preview.js\";\nimport { CurrencyAmount, CurrencyIcon } from \"../currency-icon.js\";\nimport { GradientButton } from \"../gradient-button.js\";\nimport { ClaimRouteShell } from \"../claim-route-shell.js\";\nimport { CreationSuccess } from \"../creation-success.js\";\nimport { TransactionDialog } from \"../transaction-dialog.js\";\nimport { WalletRequired } from \"../wallet-required.js\";\nimport { useMedialaneApp } from \"../medialane-app.js\";\nimport { RewardEarned } from \"../rewards/reward-earned.js\";\nimport { cn } from \"../../utils/cn.js\";\nimport { suggestLaunchpadSymbol } from \"../../utils/launchpad-defaults.js\";\nimport { runIntentCalls } from \"../../utils/run-intent-calls.js\";\nimport { useTransaction } from \"../../utils/use-transaction.js\";\nimport { useLaunchpadImageUpload } from \"../../utils/use-launchpad-image-upload.js\";\nimport { useTokenBalance } from \"../../utils/media-wallet/use-erc20-balance.js\";\n\nconst QUOTE_OPTIONS = SUPPORTED_TOKENS.map((t) => t.symbol);\ntype Quote = (typeof QUOTE_OPTIONS)[number];\n\nconst SUPPLY_PRESETS = [\n { label: \"1M\", value: \"1000000\" },\n { label: \"100M\", value: \"100000000\" },\n { label: \"1B\", value: \"1000000000\" },\n];\n\ntype ProfileStatus = \"idle\" | \"saving\" | \"saved\" | \"failed\";\n\nexport interface CoinCreateProps {\n aside?: ReactNode;\n tradeHref: (coinAddress: string) => string;\n}\n\nexport function CoinCreate({ aside, tradeHref }: CoinCreateProps) {\n const app = useMedialaneApp();\n const walletAddress = app.walletAddress;\n const tx = useTransaction();\n const [name, setName] = useState(\"\");\n const [symbol, setSymbol] = useState(\"\");\n const [autoSymbol, setAutoSymbol] = useState(\"\");\n const [description, setDescription] = useState(\"\");\n const [supply, setSupply] = useState(\"\");\n const [quote, setQuote] = useState<Quote>(\"STRK\");\n const [price, setPrice] = useState(String(SUGGESTED_DEFAULT_PRICE));\n const [teamPct, setTeamPct] = useState(5);\n const [coinAddress, setCoinAddress] = useState<string | null>(null);\n const [profileStatus, setProfileStatus] = useState<ProfileStatus>(\"idle\");\n\n const upload = useLaunchpadImageUpload({ successMessage: \"Image ready\" });\n const { imagePreview, imageUri, imageUploading, uploadError, uploadSuccess, fileInputRef, handleImageSelect, clearImage } = upload;\n\n const quoteToken = getTokenBySymbol(quote)!;\n const { rawBalance } = useTokenBalance(quote, walletAddress ?? null);\n\n const priceNum = Number(price);\n const nameErr = name ? validateName(name) : null;\n const symErr = symbol ? validateSymbol(symbol) : null;\n const supplyErr = supply ? validateSupply(supply) : null;\n const priceErr = price ? validatePrice(quoteToken.decimals, priceNum) : \"Price is required\";\n const identityValid = !validateName(name) && !validateSymbol(symbol);\n const economicsValid = !validateSupply(supply) && !priceErr;\n\n const handleNameChange = (v: string) => {\n setName(v);\n const suggested = suggestLaunchpadSymbol(v);\n if (suggested && (!symbol || symbol === autoSymbol)) {\n setSymbol(suggested);\n setAutoSymbol(suggested);\n }\n };\n\n const preview = useMemo(() => {\n if (validateSupply(supply) || validatePrice(quoteToken.decimals, priceNum)) return null;\n const supplyHuman = Number(supply);\n const supplyRaw = toRaw(BigInt(supply));\n const teamRaw = teamCoinsRaw(supplyRaw, teamPct);\n const buybackRaw = buybackQuoteRaw(teamRaw, priceNum, quoteToken.decimals);\n return {\n fdv: fdvHuman(supplyHuman, priceNum),\n teamCoins: supplyHuman * (teamPct / 100),\n buybackRaw,\n buybackHuman: formatAmount(buybackRaw.toString(), quoteToken.decimals),\n };\n }, [supply, priceNum, teamPct, quoteToken.decimals]);\n\n const insufficient = preview != null && rawBalance != null && rawBalance < preview.buybackRaw;\n const canLaunch = identityValid && economicsValid && preview != null && teamPct > 0 && !insufficient && !imageUploading;\n\n const previewData: CoinPreviewData = {\n name,\n symbol,\n description,\n imageUrl: imagePreview,\n supplyHuman: economicsValid && supply ? Number(supply) : null,\n price: priceErr ? SUGGESTED_DEFAULT_PRICE : priceNum,\n quoteSymbol: quote,\n teamPct,\n };\n\n const handleLaunchClick = () => {\n if (!canLaunch || !walletAddress || !preview) return;\n const owner = normalizeAddress(\"STARKNET\", walletAddress);\n const supplyRaw = toRaw(BigInt(supply));\n const teamRaw = teamCoinsRaw(supplyRaw, teamPct);\n const buybackRaw = buybackQuoteRaw(teamRaw, priceNum, quoteToken.decimals);\n void tx.run(async (signer) => {\n await app.ensureSignedIn?.();\n const client = app.getClient();\n const api = client.api;\n\n const { txHash: deployHash } = await runIntentCalls(signer, () =>\n api.intents.create(\"create-coin\", { owner, name, symbol, initialSupply: supplyRaw.toString() }),\n );\n const deployReceipt = await assertTransactionSucceeded(client.provider, deployHash);\n const address = parseCreatorCoinCreated(deployReceipt as CreatorCoinReceiptLike);\n\n await runIntentCalls(signer, () =>\n api.intents.create(\"launch-coin\", {\n owner,\n creatorCoin: address,\n quoteToken: quoteToken.address,\n price: priceNum,\n initialHolders: teamPct > 0 ? [owner] : [],\n initialHoldersAmounts: teamPct > 0 ? [teamRaw.toString()] : [],\n transferRestrictionDelay: 0,\n quoteFundAmount: buybackRaw.toString(),\n }),\n );\n await api.coins.sync(address, owner).catch(() => {});\n setCoinAddress(address);\n\n if (imageUri || description) {\n setProfileStatus(\"saving\");\n await api.collections\n .updateProfile(address, { ...(imageUri ? { image: imageUri } : {}), ...(description ? { description } : {}) })\n .then(() => setProfileStatus(\"saved\"))\n .catch(() => setProfileStatus(\"failed\"));\n }\n });\n };\n\n const handleReset = () => {\n tx.reset();\n setCoinAddress(null);\n setProfileStatus(\"idle\");\n setName(\"\");\n setSymbol(\"\");\n setAutoSymbol(\"\");\n setDescription(\"\");\n setSupply(\"\");\n setPrice(String(SUGGESTED_DEFAULT_PRICE));\n setTeamPct(5);\n clearImage();\n };\n\n return (\n <WalletRequired\n icon={Coins}\n iconClassName=\"text-brand-orange\"\n title=\"Launch a Creator Coin\"\n description=\"Secure your account to design and launch your own coin with permanently-locked liquidity, in a few clicks.\"\n >\n <TransactionDialog tx={tx} title=\"Launch your coin\" workingLabel=\"Launching your coin…\" firstStepLabel=\"Deploy your coin\">\n <CreationSuccess\n name={name || \"Your coin\"}\n image={imagePreview}\n caption=\"Your coin is live\"\n primary={coinAddress ? { href: tradeHref(coinAddress), label: \"View & trade your coin\" } : { href: \"/launchpad\", label: \"Back to Launchpad\" }}\n secondary={coinAddress ? { href: \"/launchpad\", label: \"Back to Launchpad\" } : undefined}\n onAgain={handleReset}\n againLabel=\"Launch another coin\"\n >\n {profileStatus === \"saving\" && (\n <p className=\"text-xs text-muted-foreground flex items-center justify-center gap-1.5\">\n <Loader2 className=\"h-3 w-3 animate-spin\" /> Saving your coin&apos;s image &amp; description…\n </p>\n )}\n {profileStatus === \"failed\" && (\n <p className=\"text-xs text-muted-foreground text-center\">\n Couldn&apos;t save the image &amp; description right now. Add them anytime from your collection settings.\n </p>\n )}\n <RewardEarned actionType=\"launch_coin\" />\n </CreationSuccess>\n </TransactionDialog>\n\n <ClaimRouteShell\n icon={<Coins className=\"h-4 w-4 text-white\" />}\n title=\"Design your Creator Coin\"\n subtitle=\"A few steps to design and launch your coin.\"\n aside={\n <>\n <CoinLaunchPreview data={previewData} />\n {aside}\n </>\n }\n >\n <div className=\"space-y-7\">\n\n <section className=\"space-y-4\">\n <div>\n <h3 className=\"text-lg font-bold\">Give it a face</h3>\n </div>\n\n <div className=\"space-y-1.5\">\n <Label>Coin image</Label>\n <div className=\"flex items-center gap-4\">\n <button\n type=\"button\"\n onClick={() => fileInputRef.current?.click()}\n className=\"relative h-24 w-24 shrink-0 rounded-full overflow-hidden border border-dashed border-border bg-muted/20 flex items-center justify-center\"\n >\n {imagePreview ? (\n\n <Image src={imagePreview} alt=\"Coin\" fill unoptimized className=\"object-cover\" />\n ) : (\n <ImagePlus className=\"h-6 w-6 text-muted-foreground\" />\n )}\n {imageUploading && (\n <span className=\"absolute inset-0 bg-background/70 flex items-center justify-center\">\n <Loader2 className=\"h-4 w-4 animate-spin text-primary\" />\n </span>\n )}\n </button>\n <div className=\"space-y-1 text-xs text-muted-foreground\">\n <p>JPG, PNG, GIF, SVG or WebP</p>\n {imagePreview && (\n <button type=\"button\" onClick={clearImage} className=\"inline-flex items-center gap-1 text-muted-foreground active:text-foreground\">\n <X className=\"h-3 w-3\" /> Remove\n </button>\n )}\n {uploadError && <p className=\"text-destructive\">{uploadError}</p>}\n {uploadSuccess && <p className=\"text-emerald-500\">✓ {uploadSuccess}</p>}\n </div>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept={acceptFor(\"image\")}\n className=\"hidden\"\n onChange={(e) => { const f = e.target.files?.[0]; if (f) void handleImageSelect(f); }}\n />\n </div>\n </div>\n\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"name\">Name</Label>\n <Input id=\"name\" value={name} onChange={(e) => handleNameChange(e.target.value)} placeholder=\"My Coin\" />\n {nameErr && <p className=\"text-xs text-destructive\">{nameErr}</p>}\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"symbol\">Symbol</Label>\n <Input id=\"symbol\" value={symbol} onChange={(e) => setSymbol(e.target.value.toUpperCase())} placeholder=\"COIN\" />\n {symErr && <p className=\"text-xs text-destructive\">{symErr}</p>}\n </div>\n </div>\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"description\">Description</Label>\n <Textarea\n id=\"description\"\n value={description}\n onChange={(e) => setDescription(e.target.value.slice(0, 500))}\n placeholder=\"Tell your community what this coin is about…\"\n rows={3}\n />\n </div>\n\n </section>\n\n <div className=\"h-px bg-border/60\" />\n\n <section className=\"space-y-4\">\n <div>\n <h3 className=\"text-lg font-bold\">Set the numbers</h3>\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"supply\">Total supply</Label>\n <div className=\"flex gap-2 mb-1\">\n {SUPPLY_PRESETS.map((p) => (\n <button\n key={p.label}\n type=\"button\"\n onClick={() => setSupply(p.value)}\n className={cn(\n \"rounded-lg border px-3.5 py-1.5 text-sm font-medium\",\n supply === p.value ? \"border-brand-orange bg-brand-orange/10 text-brand-orange\" : \"border-border text-muted-foreground\",\n )}\n >\n {p.label}\n </button>\n ))}\n </div>\n <div className=\"relative\">\n <Input\n id=\"supply\" inputMode=\"numeric\"\n value={supply ? Number(supply).toLocaleString() : \"\"}\n onChange={(e) => setSupply(e.target.value.replace(/[^\\d]/g, \"\"))}\n placeholder=\"1,000,000\"\n className=\"pr-16 text-lg font-semibold tabular-nums\"\n />\n <span className=\"pointer-events-none absolute right-3 top-1/2 -translate-y-1/2 text-sm font-medium text-muted-foreground\">\n coins\n </span>\n </div>\n {supplyErr && <p className=\"text-xs text-destructive\">{supplyErr}</p>}\n </div>\n\n <div className=\"space-y-1.5\">\n <Label>Pair</Label>\n <div className=\"flex gap-2 flex-wrap\">\n {QUOTE_OPTIONS.map((q) => (\n <button\n key={q}\n type=\"button\"\n onClick={() => setQuote(q)}\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-lg border px-3.5 py-1.5 text-sm font-medium\",\n quote === q ? \"border-brand-maeve bg-brand-maeve/10 text-brand-maeve\" : \"border-border text-muted-foreground\",\n )}\n >\n <CurrencyIcon symbol={q} size={16} />\n {q}\n </button>\n ))}\n </div>\n </div>\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"price\">Price ({quote} per coin)</Label>\n <div className=\"relative\">\n <span className=\"pointer-events-none absolute left-3 top-1/2 -translate-y-1/2\">\n <CurrencyIcon symbol={quote} size={16} />\n </span>\n <Input\n id=\"price\" inputMode=\"decimal\" value={price}\n onChange={(e) => setPrice(e.target.value.replace(/[^0-9.]/g, \"\"))}\n placeholder={String(SUGGESTED_DEFAULT_PRICE)}\n className=\"pl-9\"\n />\n </div>\n {priceErr && price && <p className=\"text-xs text-destructive\">{priceErr}</p>}\n </div>\n\n {preview && (\n <div className=\"rounded-xl bg-muted/50 dark:bg-muted/30 p-4\">\n <p className=\"text-2xs uppercase tracking-wide text-muted-foreground\">Starting market cap</p>\n <p className=\"text-2xl font-bold tabular-nums text-brand-maeve\">\n <CurrencyAmount amount={preview.fdv.toLocaleString()} symbol={quote} iconSize={18} />\n </p>\n </div>\n )}\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"alloc\">Your allocation: {teamPct}%</Label>\n <input\n id=\"alloc\" type=\"range\" min={1} max={10} step={1}\n value={teamPct} onChange={(e) => setTeamPct(Number(e.target.value))}\n className=\"w-full accent-[hsl(var(--brand-orange))]\"\n />\n {preview && (\n <p className={cn(\"text-sm font-semibold\", insufficient ? \"text-destructive\" : \"text-foreground\")}>\n <CurrencyAmount amount={preview.buybackHuman} symbol={quote} iconSize={14} /> required\n </p>\n )}\n {insufficient && (\n <p className=\"text-xs text-destructive\">\n Your wallet doesn&apos;t have enough {quote}. Add funds, or adjust the numbers above.\n </p>\n )}\n </div>\n\n </section>\n\n <div className=\"h-px bg-border/60\" />\n\n <section className=\"space-y-4\">\n <GradientButton\n big\n onClick={handleLaunchClick}\n disabled={!canLaunch || tx.phase !== \"idle\"}\n className={!canLaunch || tx.phase !== \"idle\" ? \"opacity-40 pointer-events-none\" : \"\"}\n >\n {tx.phase !== \"idle\" ? <><Loader2 className=\"h-4 w-4 mr-1.5 animate-spin\" /> Launching…</> : <>Launch your coin <ArrowRight className=\"h-4 w-4 ml-1.5\" /></>}\n </GradientButton>\n <p className=\"text-xs text-muted-foreground text-center\">\n <Link href=\"/claim/memecoin\" className=\"underline active:text-foreground\">\n Already launched a coin? Claim it instead.\n </Link>\n </p>\n </section>\n </div>\n </ClaimRouteShell>\n </WalletRequired>\n );\n}\n"],"mappings":"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","names":["validateName","validateSymbol","validateSupply","toRaw","Image","Link"]}
1
+ {"version":3,"sources":["../../../src/components/launchpad/coin-create.tsx"],"sourcesContent":["\"use client\";\n\nimport { useMemo, useState, type ReactNode } from \"react\";\nimport { ArrowRight, Coins, ImagePlus, Loader2, X } from \"lucide-react\";\nimport { SUPPORTED_TOKENS, formatAmount, getTokenBySymbol, normalizeAddress } from \"@medialane/sdk\";\nimport { acceptFor } from \"../../utils/upload-limits.js\";\nimport {\n SUGGESTED_DEFAULT_PRICE,\n buybackQuoteRaw,\n coinToRaw as toRaw,\n fdvHuman,\n parseCreatorCoinCreated,\n teamCoinsRaw,\n validateCoinName as validateName,\n validateCoinSupply as validateSupply,\n validateCoinSymbol as validateSymbol,\n validatePrice,\n assertTransactionSucceeded,\n type CreatorCoinReceiptLike,\n} from \"@medialane/sdk/starknet\";\nimport Image from \"../image.js\";\nimport Link from \"../link.js\";\nimport { Input } from \"../input.js\";\nimport { Label } from \"../label.js\";\nimport { Textarea } from \"../textarea.js\";\nimport { CoinLaunchPreview, type CoinPreviewData } from \"../coin-launch-preview.js\";\nimport { CurrencyAmount, CurrencyIcon } from \"../currency-icon.js\";\nimport { GradientButton } from \"../gradient-button.js\";\nimport { ClaimRouteShell } from \"../claim-route-shell.js\";\nimport { TransactionSuccess } from \"../transaction-success.js\";\nimport { TransactionDialog } from \"../transaction-dialog.js\";\nimport { WalletRequired } from \"../wallet-required.js\";\nimport { useMedialaneApp } from \"../medialane-app.js\";\nimport { RewardEarned } from \"../rewards/reward-earned.js\";\nimport { cn } from \"../../utils/cn.js\";\nimport { suggestLaunchpadSymbol } from \"../../utils/launchpad-defaults.js\";\nimport { runIntentCalls } from \"../../utils/run-intent-calls.js\";\nimport { useTransaction } from \"../../utils/use-transaction.js\";\nimport { useLaunchpadImageUpload } from \"../../utils/use-launchpad-image-upload.js\";\nimport { useTokenBalance } from \"../../utils/media-wallet/use-erc20-balance.js\";\n\nconst QUOTE_OPTIONS = SUPPORTED_TOKENS.map((t) => t.symbol);\ntype Quote = (typeof QUOTE_OPTIONS)[number];\n\nconst SUPPLY_PRESETS = [\n { label: \"1M\", value: \"1000000\" },\n { label: \"100M\", value: \"100000000\" },\n { label: \"1B\", value: \"1000000000\" },\n];\n\ntype ProfileStatus = \"idle\" | \"saving\" | \"saved\" | \"failed\";\n\nexport interface CoinCreateProps {\n aside?: ReactNode;\n tradeHref: (coinAddress: string) => string;\n}\n\nexport function CoinCreate({ aside, tradeHref }: CoinCreateProps) {\n const app = useMedialaneApp();\n const walletAddress = app.walletAddress;\n const tx = useTransaction();\n const [name, setName] = useState(\"\");\n const [symbol, setSymbol] = useState(\"\");\n const [autoSymbol, setAutoSymbol] = useState(\"\");\n const [description, setDescription] = useState(\"\");\n const [supply, setSupply] = useState(\"\");\n const [quote, setQuote] = useState<Quote>(\"STRK\");\n const [price, setPrice] = useState(String(SUGGESTED_DEFAULT_PRICE));\n const [teamPct, setTeamPct] = useState(5);\n const [coinAddress, setCoinAddress] = useState<string | null>(null);\n const [profileStatus, setProfileStatus] = useState<ProfileStatus>(\"idle\");\n\n const upload = useLaunchpadImageUpload({ successMessage: \"Image ready\" });\n const { imagePreview, imageUri, imageUploading, uploadError, uploadSuccess, fileInputRef, handleImageSelect, clearImage } = upload;\n\n const quoteToken = getTokenBySymbol(quote)!;\n const { rawBalance } = useTokenBalance(quote, walletAddress ?? null);\n\n const priceNum = Number(price);\n const nameErr = name ? validateName(name) : null;\n const symErr = symbol ? validateSymbol(symbol) : null;\n const supplyErr = supply ? validateSupply(supply) : null;\n const priceErr = price ? validatePrice(quoteToken.decimals, priceNum) : \"Price is required\";\n const identityValid = !validateName(name) && !validateSymbol(symbol);\n const economicsValid = !validateSupply(supply) && !priceErr;\n\n const handleNameChange = (v: string) => {\n setName(v);\n const suggested = suggestLaunchpadSymbol(v);\n if (suggested && (!symbol || symbol === autoSymbol)) {\n setSymbol(suggested);\n setAutoSymbol(suggested);\n }\n };\n\n const preview = useMemo(() => {\n if (validateSupply(supply) || validatePrice(quoteToken.decimals, priceNum)) return null;\n const supplyHuman = Number(supply);\n const supplyRaw = toRaw(BigInt(supply));\n const teamRaw = teamCoinsRaw(supplyRaw, teamPct);\n const buybackRaw = buybackQuoteRaw(teamRaw, priceNum, quoteToken.decimals);\n return {\n fdv: fdvHuman(supplyHuman, priceNum),\n teamCoins: supplyHuman * (teamPct / 100),\n buybackRaw,\n buybackHuman: formatAmount(buybackRaw.toString(), quoteToken.decimals),\n };\n }, [supply, priceNum, teamPct, quoteToken.decimals]);\n\n const insufficient = preview != null && rawBalance != null && rawBalance < preview.buybackRaw;\n const canLaunch = identityValid && economicsValid && preview != null && teamPct > 0 && !insufficient && !imageUploading;\n\n const previewData: CoinPreviewData = {\n name,\n symbol,\n description,\n imageUrl: imagePreview,\n supplyHuman: economicsValid && supply ? Number(supply) : null,\n price: priceErr ? SUGGESTED_DEFAULT_PRICE : priceNum,\n quoteSymbol: quote,\n teamPct,\n };\n\n const handleLaunchClick = () => {\n if (!canLaunch || !walletAddress || !preview) return;\n const owner = normalizeAddress(\"STARKNET\", walletAddress);\n const supplyRaw = toRaw(BigInt(supply));\n const teamRaw = teamCoinsRaw(supplyRaw, teamPct);\n const buybackRaw = buybackQuoteRaw(teamRaw, priceNum, quoteToken.decimals);\n void tx.run(async (signer) => {\n await app.ensureSignedIn?.();\n const client = app.getClient();\n const api = client.api;\n\n const { txHash: deployHash } = await runIntentCalls(signer, () =>\n api.intents.create(\"create-coin\", { owner, name, symbol, initialSupply: supplyRaw.toString() }),\n );\n const deployReceipt = await assertTransactionSucceeded(client.provider, deployHash);\n const address = parseCreatorCoinCreated(deployReceipt as CreatorCoinReceiptLike);\n\n await runIntentCalls(signer, () =>\n api.intents.create(\"launch-coin\", {\n owner,\n creatorCoin: address,\n quoteToken: quoteToken.address,\n price: priceNum,\n initialHolders: teamPct > 0 ? [owner] : [],\n initialHoldersAmounts: teamPct > 0 ? [teamRaw.toString()] : [],\n transferRestrictionDelay: 0,\n quoteFundAmount: buybackRaw.toString(),\n }),\n );\n await api.coins.sync(address, owner).catch(() => {});\n setCoinAddress(address);\n\n if (imageUri || description) {\n setProfileStatus(\"saving\");\n await api.collections\n .updateProfile(address, { ...(imageUri ? { image: imageUri } : {}), ...(description ? { description } : {}) })\n .then(() => setProfileStatus(\"saved\"))\n .catch(() => setProfileStatus(\"failed\"));\n }\n });\n };\n\n const handleReset = () => {\n tx.reset();\n setCoinAddress(null);\n setProfileStatus(\"idle\");\n setName(\"\");\n setSymbol(\"\");\n setAutoSymbol(\"\");\n setDescription(\"\");\n setSupply(\"\");\n setPrice(String(SUGGESTED_DEFAULT_PRICE));\n setTeamPct(5);\n clearImage();\n };\n\n return (\n <WalletRequired\n icon={Coins}\n iconClassName=\"text-brand-orange\"\n title=\"Launch a Creator Coin\"\n description=\"Secure your account to design and launch your own coin with permanently-locked liquidity, in a few clicks.\"\n >\n <TransactionDialog tx={tx} title=\"Launch your coin\" workingLabel=\"Launching your coin…\" firstStepLabel=\"Deploy your coin\">\n <TransactionSuccess\n name={name || \"Your coin\"}\n image={imagePreview}\n title=\"Coin launched\"\n description=\"The supply is fixed and the liquidity is locked.\"\n actions={[\n ...(coinAddress ? [{ href: tradeHref(coinAddress), label: \"View & trade your coin\" }] : []),\n { href: \"/launchpad\", label: \"Back to Launchpad\" },\n { label: \"Launch another coin\", onClick: handleReset },\n ]}\n >\n {profileStatus === \"saving\" && (\n <p className=\"text-xs text-muted-foreground flex items-center justify-center gap-1.5\">\n <Loader2 className=\"h-3 w-3 animate-spin\" /> Saving your coin&apos;s image &amp; description…\n </p>\n )}\n {profileStatus === \"failed\" && (\n <p className=\"text-xs text-muted-foreground text-center\">\n Couldn&apos;t save the image &amp; description right now. Add them anytime from your collection settings.\n </p>\n )}\n <RewardEarned actionType=\"launch_coin\" />\n </TransactionSuccess>\n </TransactionDialog>\n\n <ClaimRouteShell\n icon={<Coins className=\"h-4 w-4 text-white\" />}\n title=\"Design your Creator Coin\"\n subtitle=\"A few steps to design and launch your coin.\"\n aside={\n <>\n <CoinLaunchPreview data={previewData} />\n {aside}\n </>\n }\n >\n <div className=\"space-y-7\">\n\n <section className=\"space-y-4\">\n <div>\n <h3 className=\"text-lg font-bold\">Give it a face</h3>\n </div>\n\n <div className=\"space-y-1.5\">\n <Label>Coin image</Label>\n <div className=\"flex items-center gap-4\">\n <button\n type=\"button\"\n onClick={() => fileInputRef.current?.click()}\n className=\"relative h-24 w-24 shrink-0 rounded-full overflow-hidden border border-dashed border-border bg-muted/20 flex items-center justify-center\"\n >\n {imagePreview ? (\n\n <Image src={imagePreview} alt=\"Coin\" fill unoptimized className=\"object-cover\" />\n ) : (\n <ImagePlus className=\"h-6 w-6 text-muted-foreground\" />\n )}\n {imageUploading && (\n <span className=\"absolute inset-0 bg-background/70 flex items-center justify-center\">\n <Loader2 className=\"h-4 w-4 animate-spin text-primary\" />\n </span>\n )}\n </button>\n <div className=\"space-y-1 text-xs text-muted-foreground\">\n <p>JPG, PNG, GIF, SVG or WebP</p>\n {imagePreview && (\n <button type=\"button\" onClick={clearImage} className=\"inline-flex items-center gap-1 text-muted-foreground active:text-foreground\">\n <X className=\"h-3 w-3\" /> Remove\n </button>\n )}\n {uploadError && <p className=\"text-destructive\">{uploadError}</p>}\n {uploadSuccess && <p className=\"text-emerald-500\">✓ {uploadSuccess}</p>}\n </div>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept={acceptFor(\"image\")}\n className=\"hidden\"\n onChange={(e) => { const f = e.target.files?.[0]; if (f) void handleImageSelect(f); }}\n />\n </div>\n </div>\n\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"name\">Name</Label>\n <Input id=\"name\" value={name} onChange={(e) => handleNameChange(e.target.value)} placeholder=\"My Coin\" />\n {nameErr && <p className=\"text-xs text-destructive\">{nameErr}</p>}\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"symbol\">Symbol</Label>\n <Input id=\"symbol\" value={symbol} onChange={(e) => setSymbol(e.target.value.toUpperCase())} placeholder=\"COIN\" />\n {symErr && <p className=\"text-xs text-destructive\">{symErr}</p>}\n </div>\n </div>\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"description\">Description</Label>\n <Textarea\n id=\"description\"\n value={description}\n onChange={(e) => setDescription(e.target.value.slice(0, 500))}\n placeholder=\"Tell your community what this coin is about…\"\n rows={3}\n />\n </div>\n\n </section>\n\n <div className=\"h-px bg-border/60\" />\n\n <section className=\"space-y-4\">\n <div>\n <h3 className=\"text-lg font-bold\">Set the numbers</h3>\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"supply\">Total supply</Label>\n <div className=\"flex gap-2 mb-1\">\n {SUPPLY_PRESETS.map((p) => (\n <button\n key={p.label}\n type=\"button\"\n onClick={() => setSupply(p.value)}\n className={cn(\n \"rounded-lg border px-3.5 py-1.5 text-sm font-medium\",\n supply === p.value ? \"border-brand-orange bg-brand-orange/10 text-brand-orange\" : \"border-border text-muted-foreground\",\n )}\n >\n {p.label}\n </button>\n ))}\n </div>\n <div className=\"relative\">\n <Input\n id=\"supply\" inputMode=\"numeric\"\n value={supply ? Number(supply).toLocaleString() : \"\"}\n onChange={(e) => setSupply(e.target.value.replace(/[^\\d]/g, \"\"))}\n placeholder=\"1,000,000\"\n className=\"pr-16 text-lg font-semibold tabular-nums\"\n />\n <span className=\"pointer-events-none absolute right-3 top-1/2 -translate-y-1/2 text-sm font-medium text-muted-foreground\">\n coins\n </span>\n </div>\n {supplyErr && <p className=\"text-xs text-destructive\">{supplyErr}</p>}\n </div>\n\n <div className=\"space-y-1.5\">\n <Label>Pair</Label>\n <div className=\"flex gap-2 flex-wrap\">\n {QUOTE_OPTIONS.map((q) => (\n <button\n key={q}\n type=\"button\"\n onClick={() => setQuote(q)}\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-lg border px-3.5 py-1.5 text-sm font-medium\",\n quote === q ? \"border-brand-maeve bg-brand-maeve/10 text-brand-maeve\" : \"border-border text-muted-foreground\",\n )}\n >\n <CurrencyIcon symbol={q} size={16} />\n {q}\n </button>\n ))}\n </div>\n </div>\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"price\">Price ({quote} per coin)</Label>\n <div className=\"relative\">\n <span className=\"pointer-events-none absolute left-3 top-1/2 -translate-y-1/2\">\n <CurrencyIcon symbol={quote} size={16} />\n </span>\n <Input\n id=\"price\" inputMode=\"decimal\" value={price}\n onChange={(e) => setPrice(e.target.value.replace(/[^0-9.]/g, \"\"))}\n placeholder={String(SUGGESTED_DEFAULT_PRICE)}\n className=\"pl-9\"\n />\n </div>\n {priceErr && price && <p className=\"text-xs text-destructive\">{priceErr}</p>}\n </div>\n\n {preview && (\n <div className=\"rounded-xl bg-muted/50 dark:bg-muted/30 p-4\">\n <p className=\"text-2xs uppercase tracking-wide text-muted-foreground\">Starting market cap</p>\n <p className=\"text-2xl font-bold tabular-nums text-brand-maeve\">\n <CurrencyAmount amount={preview.fdv.toLocaleString()} symbol={quote} iconSize={18} />\n </p>\n </div>\n )}\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"alloc\">Your allocation: {teamPct}%</Label>\n <input\n id=\"alloc\" type=\"range\" min={1} max={10} step={1}\n value={teamPct} onChange={(e) => setTeamPct(Number(e.target.value))}\n className=\"w-full accent-[hsl(var(--brand-orange))]\"\n />\n {preview && (\n <p className={cn(\"text-sm font-semibold\", insufficient ? \"text-destructive\" : \"text-foreground\")}>\n <CurrencyAmount amount={preview.buybackHuman} symbol={quote} iconSize={14} /> required\n </p>\n )}\n {insufficient && (\n <p className=\"text-xs text-destructive\">\n Your wallet doesn&apos;t have enough {quote}. Add funds, or adjust the numbers above.\n </p>\n )}\n </div>\n\n </section>\n\n <div className=\"h-px bg-border/60\" />\n\n <section className=\"space-y-4\">\n <GradientButton\n big\n onClick={handleLaunchClick}\n disabled={!canLaunch || tx.phase !== \"idle\"}\n className={!canLaunch || tx.phase !== \"idle\" ? \"opacity-40 pointer-events-none\" : \"\"}\n >\n {tx.phase !== \"idle\" ? <><Loader2 className=\"h-4 w-4 mr-1.5 animate-spin\" /> Launching…</> : <>Launch your coin <ArrowRight className=\"h-4 w-4 ml-1.5\" /></>}\n </GradientButton>\n <p className=\"text-xs text-muted-foreground text-center\">\n <Link href=\"/claim/memecoin\" className=\"underline active:text-foreground\">\n Already launched a coin? Claim it instead.\n </Link>\n </p>\n </section>\n </div>\n </ClaimRouteShell>\n </WalletRequired>\n );\n}\n"],"mappings":"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","names":["validateName","validateSymbol","validateSupply","toRaw","Image","Link"]}
@@ -26,7 +26,7 @@ import { CoinLaunchPreview } from "../coin-launch-preview.js";
26
26
  import { CurrencyAmount, CurrencyIcon } from "../currency-icon.js";
27
27
  import { GradientButton } from "../gradient-button.js";
28
28
  import { ClaimRouteShell } from "../claim-route-shell.js";
29
- import { CreationSuccess } from "../creation-success.js";
29
+ import { TransactionSuccess } from "../transaction-success.js";
30
30
  import { TransactionDialog } from "../transaction-dialog.js";
31
31
  import { WalletRequired } from "../wallet-required.js";
32
32
  import { useMedialaneApp } from "../medialane-app.js";
@@ -161,15 +161,17 @@ function CoinCreate({ aside, tradeHref }) {
161
161
  description: "Secure your account to design and launch your own coin with permanently-locked liquidity, in a few clicks.",
162
162
  children: [
163
163
  /* @__PURE__ */ jsx(TransactionDialog, { tx, title: "Launch your coin", workingLabel: "Launching your coin\u2026", firstStepLabel: "Deploy your coin", children: /* @__PURE__ */ jsxs(
164
- CreationSuccess,
164
+ TransactionSuccess,
165
165
  {
166
166
  name: name || "Your coin",
167
167
  image: imagePreview,
168
- caption: "Your coin is live",
169
- primary: coinAddress ? { href: tradeHref(coinAddress), label: "View & trade your coin" } : { href: "/launchpad", label: "Back to Launchpad" },
170
- secondary: coinAddress ? { href: "/launchpad", label: "Back to Launchpad" } : void 0,
171
- onAgain: handleReset,
172
- againLabel: "Launch another coin",
168
+ title: "Coin launched",
169
+ description: "The supply is fixed and the liquidity is locked.",
170
+ actions: [
171
+ ...coinAddress ? [{ href: tradeHref(coinAddress), label: "View & trade your coin" }] : [],
172
+ { href: "/launchpad", label: "Back to Launchpad" },
173
+ { label: "Launch another coin", onClick: handleReset }
174
+ ],
173
175
  children: [
174
176
  profileStatus === "saving" && /* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground flex items-center justify-center gap-1.5", children: [
175
177
  /* @__PURE__ */ jsx(Loader2, { className: "h-3 w-3 animate-spin" }),