@medialane/ui 0.183.0 → 0.184.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 (248) hide show
  1. package/dist/components/drop/create/artwork-section.cjs +115 -0
  2. package/dist/components/drop/create/artwork-section.cjs.map +1 -0
  3. package/dist/components/drop/create/artwork-section.d.cts +23 -0
  4. package/dist/components/drop/create/artwork-section.d.ts +23 -0
  5. package/dist/components/drop/create/artwork-section.js +79 -0
  6. package/dist/components/drop/create/artwork-section.js.map +1 -0
  7. package/dist/components/drop/create/details-section.cjs +110 -0
  8. package/dist/components/drop/create/details-section.cjs.map +1 -0
  9. package/dist/components/drop/create/details-section.d.cts +11 -0
  10. package/dist/components/drop/create/details-section.d.ts +11 -0
  11. package/dist/components/drop/create/details-section.js +86 -0
  12. package/dist/components/drop/create/details-section.js.map +1 -0
  13. package/dist/components/drop/create/drop-create.cjs +112 -0
  14. package/dist/components/drop/create/drop-create.cjs.map +1 -0
  15. package/dist/components/drop/create/drop-create.d.cts +22 -0
  16. package/dist/components/drop/create/drop-create.d.ts +22 -0
  17. package/dist/components/drop/create/drop-create.js +77 -0
  18. package/dist/components/drop/create/drop-create.js.map +1 -0
  19. package/dist/components/drop/create/exclusive-fields.cjs +45 -0
  20. package/dist/components/drop/create/exclusive-fields.cjs.map +1 -0
  21. package/dist/components/drop/create/exclusive-fields.d.cts +14 -0
  22. package/dist/components/drop/create/exclusive-fields.d.ts +14 -0
  23. package/dist/components/drop/create/exclusive-fields.js +21 -0
  24. package/dist/components/drop/create/exclusive-fields.js.map +1 -0
  25. package/dist/components/drop/create/launch-dialog.cjs +193 -0
  26. package/dist/components/drop/create/launch-dialog.cjs.map +1 -0
  27. package/dist/components/drop/create/launch-dialog.d.cts +21 -0
  28. package/dist/components/drop/create/launch-dialog.d.ts +21 -0
  29. package/dist/components/drop/create/launch-dialog.js +168 -0
  30. package/dist/components/drop/create/launch-dialog.js.map +1 -0
  31. package/dist/components/drop/create/list-section.cjs +67 -0
  32. package/dist/components/drop/create/list-section.cjs.map +1 -0
  33. package/dist/components/drop/create/list-section.d.cts +11 -0
  34. package/dist/components/drop/create/list-section.d.ts +11 -0
  35. package/dist/components/drop/create/list-section.js +43 -0
  36. package/dist/components/drop/create/list-section.js.map +1 -0
  37. package/dist/components/drop/create/sale-section.cjs +78 -0
  38. package/dist/components/drop/create/sale-section.cjs.map +1 -0
  39. package/dist/components/drop/create/sale-section.d.cts +13 -0
  40. package/dist/components/drop/create/sale-section.d.ts +13 -0
  41. package/dist/components/drop/create/sale-section.js +54 -0
  42. package/dist/components/drop/create/sale-section.js.map +1 -0
  43. package/dist/components/drop/drop-card.cjs +81 -0
  44. package/dist/components/drop/drop-card.cjs.map +1 -0
  45. package/dist/components/drop/drop-card.d.cts +18 -0
  46. package/dist/components/drop/drop-card.d.ts +18 -0
  47. package/dist/components/drop/drop-card.js +45 -0
  48. package/dist/components/drop/drop-card.js.map +1 -0
  49. package/dist/components/drop/drop-listing.cjs +79 -0
  50. package/dist/components/drop/drop-listing.cjs.map +1 -0
  51. package/dist/components/drop/drop-listing.d.cts +10 -0
  52. package/dist/components/drop/drop-listing.d.ts +10 -0
  53. package/dist/components/drop/drop-listing.js +45 -0
  54. package/dist/components/drop/drop-listing.js.map +1 -0
  55. package/dist/components/drop/drop-token-link.cjs +63 -0
  56. package/dist/components/drop/drop-token-link.cjs.map +1 -0
  57. package/dist/components/drop/drop-token-link.d.cts +9 -0
  58. package/dist/components/drop/drop-token-link.d.ts +9 -0
  59. package/dist/components/drop/drop-token-link.js +29 -0
  60. package/dist/components/drop/drop-token-link.js.map +1 -0
  61. package/dist/components/drop/my-drops.cjs +71 -0
  62. package/dist/components/drop/my-drops.cjs.map +1 -0
  63. package/dist/components/drop/my-drops.d.cts +12 -0
  64. package/dist/components/drop/my-drops.d.ts +12 -0
  65. package/dist/components/drop/my-drops.js +37 -0
  66. package/dist/components/drop/my-drops.js.map +1 -0
  67. package/dist/components/drop/page/drop-action-box.cjs +63 -0
  68. package/dist/components/drop/page/drop-action-box.cjs.map +1 -0
  69. package/dist/components/drop/page/drop-action-box.d.cts +16 -0
  70. package/dist/components/drop/page/drop-action-box.d.ts +16 -0
  71. package/dist/components/drop/page/drop-action-box.js +39 -0
  72. package/dist/components/drop/page/drop-action-box.js.map +1 -0
  73. package/dist/components/drop/page/drop-activity.cjs +42 -0
  74. package/dist/components/drop/page/drop-activity.cjs.map +1 -0
  75. package/dist/components/drop/page/drop-activity.d.cts +8 -0
  76. package/dist/components/drop/page/drop-activity.d.ts +8 -0
  77. package/dist/components/drop/page/drop-activity.js +18 -0
  78. package/dist/components/drop/page/drop-activity.js.map +1 -0
  79. package/dist/components/drop/page/drop-manage.cjs +161 -0
  80. package/dist/components/drop/page/drop-manage.cjs.map +1 -0
  81. package/dist/components/drop/page/drop-manage.d.cts +24 -0
  82. package/dist/components/drop/page/drop-manage.d.ts +24 -0
  83. package/dist/components/drop/page/drop-manage.js +137 -0
  84. package/dist/components/drop/page/drop-manage.js.map +1 -0
  85. package/dist/components/drop/page/drop-mint-dialog.cjs +97 -0
  86. package/dist/components/drop/page/drop-mint-dialog.cjs.map +1 -0
  87. package/dist/components/drop/page/drop-mint-dialog.d.cts +15 -0
  88. package/dist/components/drop/page/drop-mint-dialog.d.ts +15 -0
  89. package/dist/components/drop/page/drop-mint-dialog.js +73 -0
  90. package/dist/components/drop/page/drop-mint-dialog.js.map +1 -0
  91. package/dist/components/drop/page/drop-page.cjs +165 -0
  92. package/dist/components/drop/page/drop-page.cjs.map +1 -0
  93. package/dist/components/drop/page/drop-page.d.cts +16 -0
  94. package/dist/components/drop/page/drop-page.d.ts +16 -0
  95. package/dist/components/drop/page/drop-page.js +131 -0
  96. package/dist/components/drop/page/drop-page.js.map +1 -0
  97. package/dist/components/drop-status-display.cjs +7 -38
  98. package/dist/components/drop-status-display.cjs.map +1 -1
  99. package/dist/components/drop-status-display.d.cts +6 -7
  100. package/dist/components/drop-status-display.d.ts +6 -7
  101. package/dist/components/drop-status-display.js +7 -37
  102. package/dist/components/drop-status-display.js.map +1 -1
  103. package/dist/components/image.d.cts +2 -0
  104. package/dist/components/image.d.ts +2 -0
  105. package/dist/index.cjs +46 -27
  106. package/dist/index.cjs.map +1 -1
  107. package/dist/index.d.cts +20 -11
  108. package/dist/index.d.ts +20 -11
  109. package/dist/index.js +31 -25
  110. package/dist/index.js.map +1 -1
  111. package/dist/utils/drop/actions.cjs +76 -0
  112. package/dist/utils/drop/actions.cjs.map +1 -0
  113. package/dist/utils/drop/actions.d.cts +46 -0
  114. package/dist/utils/drop/actions.d.ts +46 -0
  115. package/dist/utils/drop/actions.js +49 -0
  116. package/dist/utils/drop/actions.js.map +1 -0
  117. package/dist/utils/drop/allowlist.cjs +50 -0
  118. package/dist/utils/drop/allowlist.cjs.map +1 -0
  119. package/dist/utils/drop/allowlist.d.cts +10 -0
  120. package/dist/utils/drop/allowlist.d.ts +10 -0
  121. package/dist/utils/drop/allowlist.js +26 -0
  122. package/dist/utils/drop/allowlist.js.map +1 -0
  123. package/dist/utils/drop/chain.cjs +37 -0
  124. package/dist/utils/drop/chain.cjs.map +1 -0
  125. package/dist/utils/drop/chain.d.cts +5 -0
  126. package/dist/utils/drop/chain.d.ts +5 -0
  127. package/dist/utils/drop/chain.js +13 -0
  128. package/dist/utils/drop/chain.js.map +1 -0
  129. package/dist/utils/drop/claim-proof.cjs +48 -0
  130. package/dist/utils/drop/claim-proof.cjs.map +1 -0
  131. package/dist/utils/drop/claim-proof.d.cts +9 -0
  132. package/dist/utils/drop/claim-proof.d.ts +9 -0
  133. package/dist/utils/drop/claim-proof.js +24 -0
  134. package/dist/utils/drop/claim-proof.js.map +1 -0
  135. package/dist/utils/drop/draft.cjs +87 -0
  136. package/dist/utils/drop/draft.cjs.map +1 -0
  137. package/dist/utils/drop/draft.d.cts +32 -0
  138. package/dist/utils/drop/draft.d.ts +32 -0
  139. package/dist/utils/drop/draft.js +61 -0
  140. package/dist/utils/drop/draft.js.map +1 -0
  141. package/dist/utils/drop/metadata.cjs +70 -0
  142. package/dist/utils/drop/metadata.cjs.map +1 -0
  143. package/dist/utils/drop/metadata.d.cts +34 -0
  144. package/dist/utils/drop/metadata.d.ts +34 -0
  145. package/dist/utils/drop/metadata.js +43 -0
  146. package/dist/utils/drop/metadata.js.map +1 -0
  147. package/dist/utils/{drop-status.cjs → drop/preview.cjs} +14 -14
  148. package/dist/utils/drop/preview.cjs.map +1 -0
  149. package/dist/utils/drop/preview.d.cts +4 -0
  150. package/dist/utils/drop/preview.d.ts +4 -0
  151. package/dist/utils/drop/preview.js +13 -0
  152. package/dist/utils/drop/preview.js.map +1 -0
  153. package/dist/utils/drop/receipt.cjs +39 -0
  154. package/dist/utils/drop/receipt.cjs.map +1 -0
  155. package/dist/utils/drop/receipt.d.cts +6 -0
  156. package/dist/utils/drop/receipt.d.ts +6 -0
  157. package/dist/utils/drop/receipt.js +15 -0
  158. package/dist/utils/drop/receipt.js.map +1 -0
  159. package/dist/utils/drop/sale.cjs +108 -0
  160. package/dist/utils/drop/sale.cjs.map +1 -0
  161. package/dist/utils/drop/sale.d.cts +52 -0
  162. package/dist/utils/drop/sale.d.ts +52 -0
  163. package/dist/utils/drop/sale.js +78 -0
  164. package/dist/utils/drop/sale.js.map +1 -0
  165. package/dist/utils/drop/types.cjs +17 -0
  166. package/dist/utils/drop/types.cjs.map +1 -0
  167. package/dist/utils/drop/types.d.cts +20 -0
  168. package/dist/utils/drop/types.d.ts +20 -0
  169. package/dist/utils/drop/types.js +1 -0
  170. package/dist/utils/drop/types.js.map +1 -0
  171. package/dist/utils/drop/upload.cjs +48 -0
  172. package/dist/utils/drop/upload.cjs.map +1 -0
  173. package/dist/utils/drop/upload.d.cts +11 -0
  174. package/dist/utils/drop/upload.d.ts +11 -0
  175. package/dist/utils/drop/upload.js +24 -0
  176. package/dist/utils/drop/upload.js.map +1 -0
  177. package/dist/utils/drop/use-now.cjs +38 -0
  178. package/dist/utils/drop/use-now.cjs.map +1 -0
  179. package/dist/utils/drop/use-now.d.cts +4 -0
  180. package/dist/utils/drop/use-now.d.ts +4 -0
  181. package/dist/utils/drop/use-now.js +14 -0
  182. package/dist/utils/drop/use-now.js.map +1 -0
  183. package/dist/utils/drop/view.cjs +89 -0
  184. package/dist/utils/drop/view.cjs.map +1 -0
  185. package/dist/utils/drop/view.d.cts +34 -0
  186. package/dist/utils/drop/view.d.ts +34 -0
  187. package/dist/utils/drop/view.js +64 -0
  188. package/dist/utils/drop/view.js.map +1 -0
  189. package/dist/utils/launchpad-defaults.cjs +0 -22
  190. package/dist/utils/launchpad-defaults.cjs.map +1 -1
  191. package/dist/utils/launchpad-defaults.d.cts +1 -7
  192. package/dist/utils/launchpad-defaults.d.ts +1 -7
  193. package/dist/utils/launchpad-defaults.js +0 -21
  194. package/dist/utils/launchpad-defaults.js.map +1 -1
  195. package/dist/utils/use-drops.cjs +41 -45
  196. package/dist/utils/use-drops.cjs.map +1 -1
  197. package/dist/utils/use-drops.d.cts +31 -23
  198. package/dist/utils/use-drops.d.ts +31 -23
  199. package/dist/utils/use-drops.js +35 -40
  200. package/dist/utils/use-drops.js.map +1 -1
  201. package/package.json +3 -3
  202. package/dist/components/account/account.test.cjs +0 -86
  203. package/dist/components/account/account.test.cjs.map +0 -1
  204. package/dist/components/account/account.test.d.cts +0 -2
  205. package/dist/components/account/account.test.d.ts +0 -2
  206. package/dist/components/account/account.test.js +0 -85
  207. package/dist/components/account/account.test.js.map +0 -1
  208. package/dist/components/drop-create-form.cjs +0 -341
  209. package/dist/components/drop-create-form.cjs.map +0 -1
  210. package/dist/components/drop-create-form.d.cts +0 -39
  211. package/dist/components/drop-create-form.d.ts +0 -39
  212. package/dist/components/drop-create-form.js +0 -322
  213. package/dist/components/drop-create-form.js.map +0 -1
  214. package/dist/components/drop-preview-card.cjs +0 -106
  215. package/dist/components/drop-preview-card.cjs.map +0 -1
  216. package/dist/components/drop-preview-card.d.cts +0 -17
  217. package/dist/components/drop-preview-card.d.ts +0 -17
  218. package/dist/components/drop-preview-card.js +0 -82
  219. package/dist/components/drop-preview-card.js.map +0 -1
  220. package/dist/components/drop-preview-card.test.cjs +0 -84
  221. package/dist/components/drop-preview-card.test.cjs.map +0 -1
  222. package/dist/components/drop-preview-card.test.d.cts +0 -3
  223. package/dist/components/drop-preview-card.test.d.ts +0 -3
  224. package/dist/components/drop-preview-card.test.js +0 -83
  225. package/dist/components/drop-preview-card.test.js.map +0 -1
  226. package/dist/components/drop-status-display.test.cjs +0 -29
  227. package/dist/components/drop-status-display.test.cjs.map +0 -1
  228. package/dist/components/drop-status-display.test.d.cts +0 -2
  229. package/dist/components/drop-status-display.test.d.ts +0 -2
  230. package/dist/components/drop-status-display.test.js +0 -28
  231. package/dist/components/drop-status-display.test.js.map +0 -1
  232. package/dist/components/exclusive-content-section.cjs +0 -88
  233. package/dist/components/exclusive-content-section.cjs.map +0 -1
  234. package/dist/components/exclusive-content-section.d.cts +0 -10
  235. package/dist/components/exclusive-content-section.d.ts +0 -10
  236. package/dist/components/exclusive-content-section.js +0 -64
  237. package/dist/components/exclusive-content-section.js.map +0 -1
  238. package/dist/data/drop-create-schema.cjs +0 -92
  239. package/dist/data/drop-create-schema.cjs.map +0 -1
  240. package/dist/data/drop-create-schema.d.cts +0 -131
  241. package/dist/data/drop-create-schema.d.ts +0 -131
  242. package/dist/data/drop-create-schema.js +0 -58
  243. package/dist/data/drop-create-schema.js.map +0 -1
  244. package/dist/utils/drop-status.cjs.map +0 -1
  245. package/dist/utils/drop-status.d.cts +0 -12
  246. package/dist/utils/drop-status.d.ts +0 -12
  247. package/dist/utils/drop-status.js +0 -13
  248. package/dist/utils/drop-status.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/drop/page/drop-page.tsx"],"sourcesContent":["\"use client\";\n\nimport { useMemo, useState } from \"react\";\nimport { Package } from \"lucide-react\";\nimport type { ResolvedFeeConfig } from \"@medialane/sdk\";\nimport { dropMintState } from \"@medialane/sdk/starknet\";\nimport Image from \"../../image.js\";\nimport { CreatorChip } from \"../../creator-chip.js\";\nimport { ShareButton } from \"../../share-button.js\";\nimport { Skeleton } from \"../../skeleton.js\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"../../tabs.js\";\nimport { AssetLicenseSummary } from \"../../asset-license-summary.js\";\nimport { TokenCard } from \"../../token-card.js\";\nimport { DropActionBox } from \"./drop-action-box.js\";\nimport { DropActivityList } from \"./drop-activity.js\";\nimport { DropManage } from \"./drop-manage.js\";\nimport { DropMintDialog } from \"./drop-mint-dialog.js\";\nimport { GradientButton } from \"../../gradient-button.js\";\nimport { ipfsToHttp } from \"../../../utils/ipfs.js\";\nimport { useCollectionTokens } from \"../../../utils/use-collections.js\";\nimport { useDrop, useDropChain, useDropFile, useDropMints } from \"../../../utils/use-drops.js\";\nimport { useNow } from \"../../../utils/drop/use-now.js\";\nimport { actionBoxView } from \"../../../utils/drop/view.js\";\nimport { claimProofFor } from \"../../../utils/drop/claim-proof.js\";\nimport { manageDrop, mintDrop, saveExclusiveContent } from \"../../../utils/drop/actions.js\";\nimport type { DropAppProps } from \"../../../utils/drop/types.js\";\n\ntype TokenFile = { image?: string; attributes?: { trait_type?: string; value?: string }[] };\n\nexport function DropPage(props: DropAppProps & { contract: string; feeConfig: ResolvedFeeConfig; initialTab?: string; portfolioHref?: string }) {\n const { contract, getClient, provider, walletAddress } = props;\n const { drop: indexed, isLoading } = useDrop(getClient, contract);\n const chain = useDropChain(provider, contract, walletAddress);\n const { mints, mutate: refreshMints } = useDropMints(getClient, contract);\n const collectionFile = useDropFile<{ drop_kind?: string }>(getClient, indexed?.baseUri ?? null, \"collection.json\");\n const firstToken = useDropFile<TokenFile>(getClient, indexed?.baseUri ?? null, \"1\");\n const { tokens } = useCollectionTokens(getClient, contract, 1, 24);\n const now = useNow();\n const [quantity, setQuantity] = useState(1n);\n const [minting, setMinting] = useState(false);\n const proof = useMemo(\n () => (typeof window === \"undefined\" ? null : claimProofFor(window.localStorage, contract, window.location.hash, \"drop-proof\")),\n [contract],\n );\n\n if (isLoading && !chain.drop) {\n return <div className=\"grid gap-8 lg:grid-cols-2\"><Skeleton className=\"aspect-square rounded-2xl\" /><Skeleton className=\"h-96 rounded-2xl\" /></div>;\n }\n if (!indexed && !chain.drop) {\n return (\n <div className=\"space-y-3 py-24 text-center\">\n <Package className=\"mx-auto h-10 w-10 text-muted-foreground/30\" />\n <p className=\"text-sm text-muted-foreground\">This drop wasn't found. A new drop can take a minute to appear.</p>\n </div>\n );\n }\n\n const onchain = chain.drop;\n const mint = dropMintState({ drop: onchain, wallet: walletAddress, claimed: chain.claimed, proof, balance: chain.balance, feeConfig: props.feeConfig, now });\n const view = onchain ? actionBoxView({ drop: onchain, mint, quantity, feeConfig: props.feeConfig, now }) : null;\n const isOrganizer = !!walletAddress && !!onchain && BigInt(walletAddress) === BigInt(onchain.organizer);\n const isCollection = collectionFile?.drop_kind === \"collection\";\n const art = firstToken?.image ?? indexed?.image ?? null;\n const name = indexed?.name ?? \"Drop\";\n const deps = async () => ({ client: getClient(), provider, signer: await props.getSigner() });\n\n const onAction = () => {\n if (!view) return;\n if (view.button.action === \"sign-in\") props.onRequireWallet();\n if (view.button.action === \"mint\") setMinting(true);\n };\n\n return (\n <div className=\"space-y-10 pb-28 lg:pb-0\">\n <div className=\"grid gap-8 lg:grid-cols-2 lg:gap-10\">\n <div className=\"relative aspect-square overflow-hidden rounded-2xl bg-muted\">\n {art && <Image src={ipfsToHttp(art)} alt={name} fill unoptimized className=\"object-cover\" />}\n </div>\n <div className=\"space-y-5\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"space-y-1\">\n <h1 className=\"text-3xl font-semibold\">{name}</h1>\n {onchain && <CreatorChip getClient={getClient} address={onchain.organizer} />}\n </div>\n <ShareButton title={name} variant=\"outline\" size=\"sm\" />\n </div>\n {view && onchain && (\n <div className=\"hidden lg:block\">\n <DropActionBox view={view} minted={onchain.totalMinted} maxSupply={onchain.maxSupply} quantity={quantity} onQuantity={setQuantity} onAction={onAction} />\n </div>\n )}\n </div>\n </div>\n\n {view && onchain && (\n <div className=\"lg:hidden\">\n <DropActionBox view={view} minted={onchain.totalMinted} maxSupply={onchain.maxSupply} quantity={quantity} onQuantity={setQuantity} onAction={onAction} />\n <div className=\"fixed inset-x-0 bottom-0 z-30 border-t border-border bg-background/95 p-3 backdrop-blur\">\n <GradientButton disabled={view.button.action === \"none\"} onClick={onAction}>{view.button.label}</GradientButton>\n </div>\n </div>\n )}\n\n <Tabs defaultValue={props.initialTab === \"manage\" && isOrganizer ? \"manage\" : \"about\"}>\n <TabsList>\n <TabsTrigger value=\"about\">About</TabsTrigger>\n {isCollection && <TabsTrigger value=\"items\">Items</TabsTrigger>}\n <TabsTrigger value=\"activity\">Activity</TabsTrigger>\n <TabsTrigger value=\"license\">License</TabsTrigger>\n {isOrganizer && <TabsTrigger value=\"manage\">Manage</TabsTrigger>}\n </TabsList>\n <TabsContent value=\"about\" className=\"pt-6\">\n <p className=\"whitespace-pre-line text-sm leading-relaxed text-muted-foreground\">{indexed?.description || \"No description.\"}</p>\n </TabsContent>\n {isCollection && (\n <TabsContent value=\"items\" className=\"pt-6\">\n <div className=\"grid grid-cols-2 gap-4 sm:grid-cols-3 lg:grid-cols-4\">{tokens.map((t) => <TokenCard key={t.tokenId} token={t} />)}</div>\n </TabsContent>\n )}\n <TabsContent value=\"activity\" className=\"pt-6\"><DropActivityList mints={mints} /></TabsContent>\n <TabsContent value=\"license\" className=\"pt-6\"><AssetLicenseSummary attributes={firstToken?.attributes ?? []} /></TabsContent>\n {isOrganizer && onchain && (\n <TabsContent value=\"manage\" className=\"pt-6\">\n <DropManage\n contract={contract}\n indexed={indexed}\n onchain={onchain}\n mints={mints}\n run={async (params) => {\n await manageDrop(await deps(), { owner: walletAddress!, collection: contract, ...params });\n await Promise.all([chain.mutate(), refreshMints()]);\n }}\n saveExclusive={(value) => saveExclusiveContent(getClient(), contract, value)}\n />\n </TabsContent>\n )}\n </Tabs>\n\n {view && minting && (\n <DropMintDialog\n open\n onClose={() => setMinting(false)}\n name={name}\n quantity={quantity > view.maxQuantity ? view.maxQuantity : quantity}\n totalText={view.totalText}\n portfolioHref={props.portfolioHref ?? \"/portfolio\"}\n onMint={async () => {\n const res = await mintDrop(await deps(), { claimer: walletAddress!, collection: contract, quantity: quantity > view.maxQuantity ? view.maxQuantity : quantity, proof });\n await Promise.all([chain.mutate(), refreshMints()]);\n return res;\n }}\n />\n )}\n </div>\n );\n}\n"],"mappings":"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","names":["Image"]}
@@ -0,0 +1,16 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ResolvedFeeConfig } from '@medialane/sdk';
3
+ import { DropAppProps } from '../../../utils/drop/types.cjs';
4
+ import 'starknet';
5
+ import '@medialane/sdk/starknet';
6
+ import '../../fast-mint/types.cjs';
7
+ import 'react';
8
+
9
+ declare function DropPage(props: DropAppProps & {
10
+ contract: string;
11
+ feeConfig: ResolvedFeeConfig;
12
+ initialTab?: string;
13
+ portfolioHref?: string;
14
+ }): react_jsx_runtime.JSX.Element;
15
+
16
+ export { DropPage };
@@ -0,0 +1,16 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ResolvedFeeConfig } from '@medialane/sdk';
3
+ import { DropAppProps } from '../../../utils/drop/types.js';
4
+ import 'starknet';
5
+ import '@medialane/sdk/starknet';
6
+ import '../../fast-mint/types.js';
7
+ import 'react';
8
+
9
+ declare function DropPage(props: DropAppProps & {
10
+ contract: string;
11
+ feeConfig: ResolvedFeeConfig;
12
+ initialTab?: string;
13
+ portfolioHref?: string;
14
+ }): react_jsx_runtime.JSX.Element;
15
+
16
+ export { DropPage };
@@ -0,0 +1,131 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { useMemo, useState } from "react";
4
+ import { Package } from "lucide-react";
5
+ import { dropMintState } from "@medialane/sdk/starknet";
6
+ import Image from "../../image.js";
7
+ import { CreatorChip } from "../../creator-chip.js";
8
+ import { ShareButton } from "../../share-button.js";
9
+ import { Skeleton } from "../../skeleton.js";
10
+ import { Tabs, TabsContent, TabsList, TabsTrigger } from "../../tabs.js";
11
+ import { AssetLicenseSummary } from "../../asset-license-summary.js";
12
+ import { TokenCard } from "../../token-card.js";
13
+ import { DropActionBox } from "./drop-action-box.js";
14
+ import { DropActivityList } from "./drop-activity.js";
15
+ import { DropManage } from "./drop-manage.js";
16
+ import { DropMintDialog } from "./drop-mint-dialog.js";
17
+ import { GradientButton } from "../../gradient-button.js";
18
+ import { ipfsToHttp } from "../../../utils/ipfs.js";
19
+ import { useCollectionTokens } from "../../../utils/use-collections.js";
20
+ import { useDrop, useDropChain, useDropFile, useDropMints } from "../../../utils/use-drops.js";
21
+ import { useNow } from "../../../utils/drop/use-now.js";
22
+ import { actionBoxView } from "../../../utils/drop/view.js";
23
+ import { claimProofFor } from "../../../utils/drop/claim-proof.js";
24
+ import { manageDrop, mintDrop, saveExclusiveContent } from "../../../utils/drop/actions.js";
25
+ function DropPage(props) {
26
+ const { contract, getClient, provider, walletAddress } = props;
27
+ const { drop: indexed, isLoading } = useDrop(getClient, contract);
28
+ const chain = useDropChain(provider, contract, walletAddress);
29
+ const { mints, mutate: refreshMints } = useDropMints(getClient, contract);
30
+ const collectionFile = useDropFile(getClient, indexed?.baseUri ?? null, "collection.json");
31
+ const firstToken = useDropFile(getClient, indexed?.baseUri ?? null, "1");
32
+ const { tokens } = useCollectionTokens(getClient, contract, 1, 24);
33
+ const now = useNow();
34
+ const [quantity, setQuantity] = useState(1n);
35
+ const [minting, setMinting] = useState(false);
36
+ const proof = useMemo(
37
+ () => typeof window === "undefined" ? null : claimProofFor(window.localStorage, contract, window.location.hash, "drop-proof"),
38
+ [contract]
39
+ );
40
+ if (isLoading && !chain.drop) {
41
+ return /* @__PURE__ */ jsxs("div", { className: "grid gap-8 lg:grid-cols-2", children: [
42
+ /* @__PURE__ */ jsx(Skeleton, { className: "aspect-square rounded-2xl" }),
43
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-96 rounded-2xl" })
44
+ ] });
45
+ }
46
+ if (!indexed && !chain.drop) {
47
+ return /* @__PURE__ */ jsxs("div", { className: "space-y-3 py-24 text-center", children: [
48
+ /* @__PURE__ */ jsx(Package, { className: "mx-auto h-10 w-10 text-muted-foreground/30" }),
49
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: "This drop wasn't found. A new drop can take a minute to appear." })
50
+ ] });
51
+ }
52
+ const onchain = chain.drop;
53
+ const mint = dropMintState({ drop: onchain, wallet: walletAddress, claimed: chain.claimed, proof, balance: chain.balance, feeConfig: props.feeConfig, now });
54
+ const view = onchain ? actionBoxView({ drop: onchain, mint, quantity, feeConfig: props.feeConfig, now }) : null;
55
+ const isOrganizer = !!walletAddress && !!onchain && BigInt(walletAddress) === BigInt(onchain.organizer);
56
+ const isCollection = collectionFile?.drop_kind === "collection";
57
+ const art = firstToken?.image ?? indexed?.image ?? null;
58
+ const name = indexed?.name ?? "Drop";
59
+ const deps = async () => ({ client: getClient(), provider, signer: await props.getSigner() });
60
+ const onAction = () => {
61
+ if (!view) return;
62
+ if (view.button.action === "sign-in") props.onRequireWallet();
63
+ if (view.button.action === "mint") setMinting(true);
64
+ };
65
+ return /* @__PURE__ */ jsxs("div", { className: "space-y-10 pb-28 lg:pb-0", children: [
66
+ /* @__PURE__ */ jsxs("div", { className: "grid gap-8 lg:grid-cols-2 lg:gap-10", children: [
67
+ /* @__PURE__ */ jsx("div", { className: "relative aspect-square overflow-hidden rounded-2xl bg-muted", children: art && /* @__PURE__ */ jsx(Image, { src: ipfsToHttp(art), alt: name, fill: true, unoptimized: true, className: "object-cover" }) }),
68
+ /* @__PURE__ */ jsxs("div", { className: "space-y-5", children: [
69
+ /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-3", children: [
70
+ /* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
71
+ /* @__PURE__ */ jsx("h1", { className: "text-3xl font-semibold", children: name }),
72
+ onchain && /* @__PURE__ */ jsx(CreatorChip, { getClient, address: onchain.organizer })
73
+ ] }),
74
+ /* @__PURE__ */ jsx(ShareButton, { title: name, variant: "outline", size: "sm" })
75
+ ] }),
76
+ view && onchain && /* @__PURE__ */ jsx("div", { className: "hidden lg:block", children: /* @__PURE__ */ jsx(DropActionBox, { view, minted: onchain.totalMinted, maxSupply: onchain.maxSupply, quantity, onQuantity: setQuantity, onAction }) })
77
+ ] })
78
+ ] }),
79
+ view && onchain && /* @__PURE__ */ jsxs("div", { className: "lg:hidden", children: [
80
+ /* @__PURE__ */ jsx(DropActionBox, { view, minted: onchain.totalMinted, maxSupply: onchain.maxSupply, quantity, onQuantity: setQuantity, onAction }),
81
+ /* @__PURE__ */ jsx("div", { className: "fixed inset-x-0 bottom-0 z-30 border-t border-border bg-background/95 p-3 backdrop-blur", children: /* @__PURE__ */ jsx(GradientButton, { disabled: view.button.action === "none", onClick: onAction, children: view.button.label }) })
82
+ ] }),
83
+ /* @__PURE__ */ jsxs(Tabs, { defaultValue: props.initialTab === "manage" && isOrganizer ? "manage" : "about", children: [
84
+ /* @__PURE__ */ jsxs(TabsList, { children: [
85
+ /* @__PURE__ */ jsx(TabsTrigger, { value: "about", children: "About" }),
86
+ isCollection && /* @__PURE__ */ jsx(TabsTrigger, { value: "items", children: "Items" }),
87
+ /* @__PURE__ */ jsx(TabsTrigger, { value: "activity", children: "Activity" }),
88
+ /* @__PURE__ */ jsx(TabsTrigger, { value: "license", children: "License" }),
89
+ isOrganizer && /* @__PURE__ */ jsx(TabsTrigger, { value: "manage", children: "Manage" })
90
+ ] }),
91
+ /* @__PURE__ */ jsx(TabsContent, { value: "about", className: "pt-6", children: /* @__PURE__ */ jsx("p", { className: "whitespace-pre-line text-sm leading-relaxed text-muted-foreground", children: indexed?.description || "No description." }) }),
92
+ isCollection && /* @__PURE__ */ jsx(TabsContent, { value: "items", className: "pt-6", children: /* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 gap-4 sm:grid-cols-3 lg:grid-cols-4", children: tokens.map((t) => /* @__PURE__ */ jsx(TokenCard, { token: t }, t.tokenId)) }) }),
93
+ /* @__PURE__ */ jsx(TabsContent, { value: "activity", className: "pt-6", children: /* @__PURE__ */ jsx(DropActivityList, { mints }) }),
94
+ /* @__PURE__ */ jsx(TabsContent, { value: "license", className: "pt-6", children: /* @__PURE__ */ jsx(AssetLicenseSummary, { attributes: firstToken?.attributes ?? [] }) }),
95
+ isOrganizer && onchain && /* @__PURE__ */ jsx(TabsContent, { value: "manage", className: "pt-6", children: /* @__PURE__ */ jsx(
96
+ DropManage,
97
+ {
98
+ contract,
99
+ indexed,
100
+ onchain,
101
+ mints,
102
+ run: async (params) => {
103
+ await manageDrop(await deps(), { owner: walletAddress, collection: contract, ...params });
104
+ await Promise.all([chain.mutate(), refreshMints()]);
105
+ },
106
+ saveExclusive: (value) => saveExclusiveContent(getClient(), contract, value)
107
+ }
108
+ ) })
109
+ ] }),
110
+ view && minting && /* @__PURE__ */ jsx(
111
+ DropMintDialog,
112
+ {
113
+ open: true,
114
+ onClose: () => setMinting(false),
115
+ name,
116
+ quantity: quantity > view.maxQuantity ? view.maxQuantity : quantity,
117
+ totalText: view.totalText,
118
+ portfolioHref: props.portfolioHref ?? "/portfolio",
119
+ onMint: async () => {
120
+ const res = await mintDrop(await deps(), { claimer: walletAddress, collection: contract, quantity: quantity > view.maxQuantity ? view.maxQuantity : quantity, proof });
121
+ await Promise.all([chain.mutate(), refreshMints()]);
122
+ return res;
123
+ }
124
+ }
125
+ )
126
+ ] });
127
+ }
128
+ export {
129
+ DropPage
130
+ };
131
+ //# sourceMappingURL=drop-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/drop/page/drop-page.tsx"],"sourcesContent":["\"use client\";\n\nimport { useMemo, useState } from \"react\";\nimport { Package } from \"lucide-react\";\nimport type { ResolvedFeeConfig } from \"@medialane/sdk\";\nimport { dropMintState } from \"@medialane/sdk/starknet\";\nimport Image from \"../../image.js\";\nimport { CreatorChip } from \"../../creator-chip.js\";\nimport { ShareButton } from \"../../share-button.js\";\nimport { Skeleton } from \"../../skeleton.js\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"../../tabs.js\";\nimport { AssetLicenseSummary } from \"../../asset-license-summary.js\";\nimport { TokenCard } from \"../../token-card.js\";\nimport { DropActionBox } from \"./drop-action-box.js\";\nimport { DropActivityList } from \"./drop-activity.js\";\nimport { DropManage } from \"./drop-manage.js\";\nimport { DropMintDialog } from \"./drop-mint-dialog.js\";\nimport { GradientButton } from \"../../gradient-button.js\";\nimport { ipfsToHttp } from \"../../../utils/ipfs.js\";\nimport { useCollectionTokens } from \"../../../utils/use-collections.js\";\nimport { useDrop, useDropChain, useDropFile, useDropMints } from \"../../../utils/use-drops.js\";\nimport { useNow } from \"../../../utils/drop/use-now.js\";\nimport { actionBoxView } from \"../../../utils/drop/view.js\";\nimport { claimProofFor } from \"../../../utils/drop/claim-proof.js\";\nimport { manageDrop, mintDrop, saveExclusiveContent } from \"../../../utils/drop/actions.js\";\nimport type { DropAppProps } from \"../../../utils/drop/types.js\";\n\ntype TokenFile = { image?: string; attributes?: { trait_type?: string; value?: string }[] };\n\nexport function DropPage(props: DropAppProps & { contract: string; feeConfig: ResolvedFeeConfig; initialTab?: string; portfolioHref?: string }) {\n const { contract, getClient, provider, walletAddress } = props;\n const { drop: indexed, isLoading } = useDrop(getClient, contract);\n const chain = useDropChain(provider, contract, walletAddress);\n const { mints, mutate: refreshMints } = useDropMints(getClient, contract);\n const collectionFile = useDropFile<{ drop_kind?: string }>(getClient, indexed?.baseUri ?? null, \"collection.json\");\n const firstToken = useDropFile<TokenFile>(getClient, indexed?.baseUri ?? null, \"1\");\n const { tokens } = useCollectionTokens(getClient, contract, 1, 24);\n const now = useNow();\n const [quantity, setQuantity] = useState(1n);\n const [minting, setMinting] = useState(false);\n const proof = useMemo(\n () => (typeof window === \"undefined\" ? null : claimProofFor(window.localStorage, contract, window.location.hash, \"drop-proof\")),\n [contract],\n );\n\n if (isLoading && !chain.drop) {\n return <div className=\"grid gap-8 lg:grid-cols-2\"><Skeleton className=\"aspect-square rounded-2xl\" /><Skeleton className=\"h-96 rounded-2xl\" /></div>;\n }\n if (!indexed && !chain.drop) {\n return (\n <div className=\"space-y-3 py-24 text-center\">\n <Package className=\"mx-auto h-10 w-10 text-muted-foreground/30\" />\n <p className=\"text-sm text-muted-foreground\">This drop wasn't found. A new drop can take a minute to appear.</p>\n </div>\n );\n }\n\n const onchain = chain.drop;\n const mint = dropMintState({ drop: onchain, wallet: walletAddress, claimed: chain.claimed, proof, balance: chain.balance, feeConfig: props.feeConfig, now });\n const view = onchain ? actionBoxView({ drop: onchain, mint, quantity, feeConfig: props.feeConfig, now }) : null;\n const isOrganizer = !!walletAddress && !!onchain && BigInt(walletAddress) === BigInt(onchain.organizer);\n const isCollection = collectionFile?.drop_kind === \"collection\";\n const art = firstToken?.image ?? indexed?.image ?? null;\n const name = indexed?.name ?? \"Drop\";\n const deps = async () => ({ client: getClient(), provider, signer: await props.getSigner() });\n\n const onAction = () => {\n if (!view) return;\n if (view.button.action === \"sign-in\") props.onRequireWallet();\n if (view.button.action === \"mint\") setMinting(true);\n };\n\n return (\n <div className=\"space-y-10 pb-28 lg:pb-0\">\n <div className=\"grid gap-8 lg:grid-cols-2 lg:gap-10\">\n <div className=\"relative aspect-square overflow-hidden rounded-2xl bg-muted\">\n {art && <Image src={ipfsToHttp(art)} alt={name} fill unoptimized className=\"object-cover\" />}\n </div>\n <div className=\"space-y-5\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"space-y-1\">\n <h1 className=\"text-3xl font-semibold\">{name}</h1>\n {onchain && <CreatorChip getClient={getClient} address={onchain.organizer} />}\n </div>\n <ShareButton title={name} variant=\"outline\" size=\"sm\" />\n </div>\n {view && onchain && (\n <div className=\"hidden lg:block\">\n <DropActionBox view={view} minted={onchain.totalMinted} maxSupply={onchain.maxSupply} quantity={quantity} onQuantity={setQuantity} onAction={onAction} />\n </div>\n )}\n </div>\n </div>\n\n {view && onchain && (\n <div className=\"lg:hidden\">\n <DropActionBox view={view} minted={onchain.totalMinted} maxSupply={onchain.maxSupply} quantity={quantity} onQuantity={setQuantity} onAction={onAction} />\n <div className=\"fixed inset-x-0 bottom-0 z-30 border-t border-border bg-background/95 p-3 backdrop-blur\">\n <GradientButton disabled={view.button.action === \"none\"} onClick={onAction}>{view.button.label}</GradientButton>\n </div>\n </div>\n )}\n\n <Tabs defaultValue={props.initialTab === \"manage\" && isOrganizer ? \"manage\" : \"about\"}>\n <TabsList>\n <TabsTrigger value=\"about\">About</TabsTrigger>\n {isCollection && <TabsTrigger value=\"items\">Items</TabsTrigger>}\n <TabsTrigger value=\"activity\">Activity</TabsTrigger>\n <TabsTrigger value=\"license\">License</TabsTrigger>\n {isOrganizer && <TabsTrigger value=\"manage\">Manage</TabsTrigger>}\n </TabsList>\n <TabsContent value=\"about\" className=\"pt-6\">\n <p className=\"whitespace-pre-line text-sm leading-relaxed text-muted-foreground\">{indexed?.description || \"No description.\"}</p>\n </TabsContent>\n {isCollection && (\n <TabsContent value=\"items\" className=\"pt-6\">\n <div className=\"grid grid-cols-2 gap-4 sm:grid-cols-3 lg:grid-cols-4\">{tokens.map((t) => <TokenCard key={t.tokenId} token={t} />)}</div>\n </TabsContent>\n )}\n <TabsContent value=\"activity\" className=\"pt-6\"><DropActivityList mints={mints} /></TabsContent>\n <TabsContent value=\"license\" className=\"pt-6\"><AssetLicenseSummary attributes={firstToken?.attributes ?? []} /></TabsContent>\n {isOrganizer && onchain && (\n <TabsContent value=\"manage\" className=\"pt-6\">\n <DropManage\n contract={contract}\n indexed={indexed}\n onchain={onchain}\n mints={mints}\n run={async (params) => {\n await manageDrop(await deps(), { owner: walletAddress!, collection: contract, ...params });\n await Promise.all([chain.mutate(), refreshMints()]);\n }}\n saveExclusive={(value) => saveExclusiveContent(getClient(), contract, value)}\n />\n </TabsContent>\n )}\n </Tabs>\n\n {view && minting && (\n <DropMintDialog\n open\n onClose={() => setMinting(false)}\n name={name}\n quantity={quantity > view.maxQuantity ? view.maxQuantity : quantity}\n totalText={view.totalText}\n portfolioHref={props.portfolioHref ?? \"/portfolio\"}\n onMint={async () => {\n const res = await mintDrop(await deps(), { claimer: walletAddress!, collection: contract, quantity: quantity > view.maxQuantity ? view.maxQuantity : quantity, proof });\n await Promise.all([chain.mutate(), refreshMints()]);\n return res;\n }}\n />\n )}\n </div>\n );\n}\n"],"mappings":";AA8CW,SAA2C,KAA3C;AA5CX,SAAS,SAAS,gBAAgB;AAClC,SAAS,eAAe;AAExB,SAAS,qBAAqB;AAC9B,OAAO,WAAW;AAClB,SAAS,mBAAmB;AAC5B,SAAS,mBAAmB;AAC5B,SAAS,gBAAgB;AACzB,SAAS,MAAM,aAAa,UAAU,mBAAmB;AACzD,SAAS,2BAA2B;AACpC,SAAS,iBAAiB;AAC1B,SAAS,qBAAqB;AAC9B,SAAS,wBAAwB;AACjC,SAAS,kBAAkB;AAC3B,SAAS,sBAAsB;AAC/B,SAAS,sBAAsB;AAC/B,SAAS,kBAAkB;AAC3B,SAAS,2BAA2B;AACpC,SAAS,SAAS,cAAc,aAAa,oBAAoB;AACjE,SAAS,cAAc;AACvB,SAAS,qBAAqB;AAC9B,SAAS,qBAAqB;AAC9B,SAAS,YAAY,UAAU,4BAA4B;AAKpD,SAAS,SAAS,OAAuH;AAC9I,QAAM,EAAE,UAAU,WAAW,UAAU,cAAc,IAAI;AACzD,QAAM,EAAE,MAAM,SAAS,UAAU,IAAI,QAAQ,WAAW,QAAQ;AAChE,QAAM,QAAQ,aAAa,UAAU,UAAU,aAAa;AAC5D,QAAM,EAAE,OAAO,QAAQ,aAAa,IAAI,aAAa,WAAW,QAAQ;AACxE,QAAM,iBAAiB,YAAoC,WAAW,SAAS,WAAW,MAAM,iBAAiB;AACjH,QAAM,aAAa,YAAuB,WAAW,SAAS,WAAW,MAAM,GAAG;AAClF,QAAM,EAAE,OAAO,IAAI,oBAAoB,WAAW,UAAU,GAAG,EAAE;AACjE,QAAM,MAAM,OAAO;AACnB,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,EAAE;AAC3C,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,QAAQ;AAAA,IACZ,MAAO,OAAO,WAAW,cAAc,OAAO,cAAc,OAAO,cAAc,UAAU,OAAO,SAAS,MAAM,YAAY;AAAA,IAC7H,CAAC,QAAQ;AAAA,EACX;AAEA,MAAI,aAAa,CAAC,MAAM,MAAM;AAC5B,WAAO,qBAAC,SAAI,WAAU,6BAA4B;AAAA,0BAAC,YAAS,WAAU,6BAA4B;AAAA,MAAE,oBAAC,YAAS,WAAU,oBAAmB;AAAA,OAAE;AAAA,EAC/I;AACA,MAAI,CAAC,WAAW,CAAC,MAAM,MAAM;AAC3B,WACE,qBAAC,SAAI,WAAU,+BACb;AAAA,0BAAC,WAAQ,WAAU,8CAA6C;AAAA,MAChE,oBAAC,OAAE,WAAU,iCAAgC,6EAA+D;AAAA,OAC9G;AAAA,EAEJ;AAEA,QAAM,UAAU,MAAM;AACtB,QAAM,OAAO,cAAc,EAAE,MAAM,SAAS,QAAQ,eAAe,SAAS,MAAM,SAAS,OAAO,SAAS,MAAM,SAAS,WAAW,MAAM,WAAW,IAAI,CAAC;AAC3J,QAAM,OAAO,UAAU,cAAc,EAAE,MAAM,SAAS,MAAM,UAAU,WAAW,MAAM,WAAW,IAAI,CAAC,IAAI;AAC3G,QAAM,cAAc,CAAC,CAAC,iBAAiB,CAAC,CAAC,WAAW,OAAO,aAAa,MAAM,OAAO,QAAQ,SAAS;AACtG,QAAM,eAAe,gBAAgB,cAAc;AACnD,QAAM,MAAM,YAAY,SAAS,SAAS,SAAS;AACnD,QAAM,OAAO,SAAS,QAAQ;AAC9B,QAAM,OAAO,aAAa,EAAE,QAAQ,UAAU,GAAG,UAAU,QAAQ,MAAM,MAAM,UAAU,EAAE;AAE3F,QAAM,WAAW,MAAM;AACrB,QAAI,CAAC,KAAM;AACX,QAAI,KAAK,OAAO,WAAW,UAAW,OAAM,gBAAgB;AAC5D,QAAI,KAAK,OAAO,WAAW,OAAQ,YAAW,IAAI;AAAA,EACpD;AAEA,SACE,qBAAC,SAAI,WAAU,4BACb;AAAA,yBAAC,SAAI,WAAU,uCACb;AAAA,0BAAC,SAAI,WAAU,+DACZ,iBAAO,oBAAC,SAAM,KAAK,WAAW,GAAG,GAAG,KAAK,MAAM,MAAI,MAAC,aAAW,MAAC,WAAU,gBAAe,GAC5F;AAAA,MACA,qBAAC,SAAI,WAAU,aACb;AAAA,6BAAC,SAAI,WAAU,0CACb;AAAA,+BAAC,SAAI,WAAU,aACb;AAAA,gCAAC,QAAG,WAAU,0BAA0B,gBAAK;AAAA,YAC5C,WAAW,oBAAC,eAAY,WAAsB,SAAS,QAAQ,WAAW;AAAA,aAC7E;AAAA,UACA,oBAAC,eAAY,OAAO,MAAM,SAAQ,WAAU,MAAK,MAAK;AAAA,WACxD;AAAA,QACC,QAAQ,WACP,oBAAC,SAAI,WAAU,mBACb,8BAAC,iBAAc,MAAY,QAAQ,QAAQ,aAAa,WAAW,QAAQ,WAAW,UAAoB,YAAY,aAAa,UAAoB,GACzJ;AAAA,SAEJ;AAAA,OACF;AAAA,IAEC,QAAQ,WACP,qBAAC,SAAI,WAAU,aACb;AAAA,0BAAC,iBAAc,MAAY,QAAQ,QAAQ,aAAa,WAAW,QAAQ,WAAW,UAAoB,YAAY,aAAa,UAAoB;AAAA,MACvJ,oBAAC,SAAI,WAAU,2FACb,8BAAC,kBAAe,UAAU,KAAK,OAAO,WAAW,QAAQ,SAAS,UAAW,eAAK,OAAO,OAAM,GACjG;AAAA,OACF;AAAA,IAGF,qBAAC,QAAK,cAAc,MAAM,eAAe,YAAY,cAAc,WAAW,SAC5E;AAAA,2BAAC,YACC;AAAA,4BAAC,eAAY,OAAM,SAAQ,mBAAK;AAAA,QAC/B,gBAAgB,oBAAC,eAAY,OAAM,SAAQ,mBAAK;AAAA,QACjD,oBAAC,eAAY,OAAM,YAAW,sBAAQ;AAAA,QACtC,oBAAC,eAAY,OAAM,WAAU,qBAAO;AAAA,QACnC,eAAe,oBAAC,eAAY,OAAM,UAAS,oBAAM;AAAA,SACpD;AAAA,MACA,oBAAC,eAAY,OAAM,SAAQ,WAAU,QACnC,8BAAC,OAAE,WAAU,qEAAqE,mBAAS,eAAe,mBAAkB,GAC9H;AAAA,MACC,gBACC,oBAAC,eAAY,OAAM,SAAQ,WAAU,QACnC,8BAAC,SAAI,WAAU,wDAAwD,iBAAO,IAAI,CAAC,MAAM,oBAAC,aAA0B,OAAO,KAAlB,EAAE,OAAmB,CAAE,GAAE,GACpI;AAAA,MAEF,oBAAC,eAAY,OAAM,YAAW,WAAU,QAAO,8BAAC,oBAAiB,OAAc,GAAE;AAAA,MACjF,oBAAC,eAAY,OAAM,WAAU,WAAU,QAAO,8BAAC,uBAAoB,YAAY,YAAY,cAAc,CAAC,GAAG,GAAE;AAAA,MAC9G,eAAe,WACd,oBAAC,eAAY,OAAM,UAAS,WAAU,QACpC;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,KAAK,OAAO,WAAW;AACrB,kBAAM,WAAW,MAAM,KAAK,GAAG,EAAE,OAAO,eAAgB,YAAY,UAAU,GAAG,OAAO,CAAC;AACzF,kBAAM,QAAQ,IAAI,CAAC,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC;AAAA,UACpD;AAAA,UACA,eAAe,CAAC,UAAU,qBAAqB,UAAU,GAAG,UAAU,KAAK;AAAA;AAAA,MAC7E,GACF;AAAA,OAEJ;AAAA,IAEC,QAAQ,WACP;AAAA,MAAC;AAAA;AAAA,QACC,MAAI;AAAA,QACJ,SAAS,MAAM,WAAW,KAAK;AAAA,QAC/B;AAAA,QACA,UAAU,WAAW,KAAK,cAAc,KAAK,cAAc;AAAA,QAC3D,WAAW,KAAK;AAAA,QAChB,eAAe,MAAM,iBAAiB;AAAA,QACtC,QAAQ,YAAY;AAClB,gBAAM,MAAM,MAAM,SAAS,MAAM,KAAK,GAAG,EAAE,SAAS,eAAgB,YAAY,UAAU,UAAU,WAAW,KAAK,cAAc,KAAK,cAAc,UAAU,MAAM,CAAC;AACtK,gBAAM,QAAQ,IAAI,CAAC,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC;AAClD,iBAAO;AAAA,QACT;AAAA;AAAA,IACF;AAAA,KAEJ;AAEJ;","names":[]}
@@ -19,40 +19,24 @@ var __copyProps = (to, from, except, desc) => {
19
19
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
20
  var drop_status_display_exports = {};
21
21
  __export(drop_status_display_exports, {
22
- DropPriceDisplay: () => DropPriceDisplay,
23
22
  DropStatusBadge: () => DropStatusBadge,
24
23
  DropSupplyProgress: () => DropSupplyProgress
25
24
  });
26
25
  module.exports = __toCommonJS(drop_status_display_exports);
27
26
  var import_jsx_runtime = require("react/jsx-runtime");
28
- var import_sdk = require("@medialane/sdk");
29
27
  var import_cn = require("../utils/cn.js");
30
- function getTokenByAddress(address) {
31
- return (0, import_sdk.getListableTokens)().find(
32
- (t) => (0, import_sdk.normalizeAddress)("STARKNET", t.address) === (0, import_sdk.normalizeAddress)("STARKNET", address)
33
- ) ?? null;
34
- }
35
- function DropStatusBadge({ status }) {
28
+ function DropStatusBadge({ phase }) {
36
29
  const map = {
37
30
  live: { label: "Live", cls: "text-green-400 bg-green-500/10" },
38
31
  upcoming: { label: "Upcoming", cls: "text-brand-blue bg-brand-blue/10" },
39
32
  ended: { label: "Ended", cls: "text-muted-foreground bg-muted" },
40
- sold_out: { label: "Sold out", cls: "text-brand-orange bg-brand-orange/10" }
33
+ "sold-out": { label: "Sold out", cls: "text-brand-orange bg-brand-orange/10" }
41
34
  };
42
- const { label, cls } = map[status];
43
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
44
- "span",
45
- {
46
- className: (0, import_cn.cn)(
47
- "inline-flex items-center gap-1 text-xs font-bold uppercase tracking-widest rounded-full px-3 py-1",
48
- cls
49
- ),
50
- children: [
51
- status === "live" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "h-1.5 w-1.5 rounded-full bg-green-400 animate-pulse" }),
52
- label
53
- ]
54
- }
55
- );
35
+ const { label, cls } = map[phase];
36
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: (0, import_cn.cn)("inline-flex items-center gap-1 text-xs font-bold uppercase tracking-widest rounded-full px-3 py-1", cls), children: [
37
+ phase === "live" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "h-1.5 w-1.5 rounded-full bg-green-400 animate-pulse" }),
38
+ label
39
+ ] });
56
40
  }
57
41
  function DropSupplyProgress({ minted, max }) {
58
42
  const pct = max > 0 ? Math.min(100, minted / max * 100) : 0;
@@ -80,23 +64,8 @@ function DropSupplyProgress({ minted, max }) {
80
64
  ] })
81
65
  ] });
82
66
  }
83
- function DropPriceDisplay({ conditions }) {
84
- if (conditions.price === "0" || conditions.paymentToken === "0x0") {
85
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex items-center gap-1.5 text-sm font-semibold text-green-500", children: "Free mint" });
86
- }
87
- const token = getTokenByAddress(conditions.paymentToken);
88
- const decimals = token?.decimals ?? 18;
89
- const priceNum = Number(BigInt(conditions.price) * 10000n / BigInt(10 ** decimals)) / 1e4;
90
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-1.5 text-sm font-semibold", children: [
91
- priceNum,
92
- " ",
93
- token?.symbol ?? "tokens",
94
- " per token"
95
- ] });
96
- }
97
67
  // Annotate the CommonJS export names for ESM import in node:
98
68
  0 && (module.exports = {
99
- DropPriceDisplay,
100
69
  DropStatusBadge,
101
70
  DropSupplyProgress
102
71
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/drop-status-display.tsx"],"sourcesContent":["\"use client\";\n\nimport { getListableTokens, normalizeAddress } from \"@medialane/sdk\";\nimport { cn } from \"../utils/cn.js\";\nimport type { DropConditions, DropStatus } from \"../utils/drop-status.js\";\n\nfunction getTokenByAddress(address: string) {\n return (\n getListableTokens().find(\n (t) => normalizeAddress(\"STARKNET\", t.address) === normalizeAddress(\"STARKNET\", address)\n ) ?? null\n );\n}\n\nexport function DropStatusBadge({ status }: { status: DropStatus }) {\n const map = {\n live: { label: \"Live\", cls: \"text-green-400 bg-green-500/10\" },\n upcoming: { label: \"Upcoming\", cls: \"text-brand-blue bg-brand-blue/10\" },\n ended: { label: \"Ended\", cls: \"text-muted-foreground bg-muted\" },\n sold_out: { label: \"Sold out\", cls: \"text-brand-orange bg-brand-orange/10\" },\n } as const;\n const { label, cls } = map[status];\n return (\n <span\n className={cn(\n \"inline-flex items-center gap-1 text-xs font-bold uppercase tracking-widest rounded-full px-3 py-1\",\n cls\n )}\n >\n {status === \"live\" && <span className=\"h-1.5 w-1.5 rounded-full bg-green-400 animate-pulse\" />}\n {label}\n </span>\n );\n}\n\nexport function DropSupplyProgress({ minted, max }: { minted: number; max: number }) {\n const pct = max > 0 ? Math.min(100, (minted / max) * 100) : 0;\n return (\n <div className=\"space-y-1.5\">\n <div className=\"flex justify-between text-xs text-muted-foreground\">\n <span>{minted.toLocaleString()} minted</span>\n <span>of {max.toLocaleString()}</span>\n </div>\n <div className=\"h-2 rounded-full bg-muted overflow-hidden\">\n <div\n className=\"h-full rounded-full bg-brand-orange transition-all duration-500\"\n style={{ width: `${pct}%` }}\n />\n </div>\n <p className=\"text-xs text-muted-foreground\">{pct.toFixed(1)}% claimed</p>\n </div>\n );\n}\n\nexport function DropPriceDisplay({ conditions }: { conditions: DropConditions }) {\n if (conditions.price === \"0\" || conditions.paymentToken === \"0x0\") {\n return (\n <div className=\"flex items-center gap-1.5 text-sm font-semibold text-green-500\">\n Free mint\n </div>\n );\n }\n const token = getTokenByAddress(conditions.paymentToken);\n const decimals = token?.decimals ?? 18;\n const priceNum = Number(BigInt(conditions.price) * 10000n / BigInt(10 ** decimals)) / 10000;\n return (\n <div className=\"flex items-center gap-1.5 text-sm font-semibold\">\n {priceNum} {token?.symbol ?? \"tokens\"} per token\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBI;AArBJ,iBAAoD;AACpD,gBAAmB;AAGnB,SAAS,kBAAkB,SAAiB;AAC1C,aACE,8BAAkB,EAAE;AAAA,IAClB,CAAC,UAAM,6BAAiB,YAAY,EAAE,OAAO,UAAM,6BAAiB,YAAY,OAAO;AAAA,EACzF,KAAK;AAET;AAEO,SAAS,gBAAgB,EAAE,OAAO,GAA2B;AAClE,QAAM,MAAM;AAAA,IACV,MAAU,EAAE,OAAO,QAAY,KAAK,iCAAmC;AAAA,IACvE,UAAU,EAAE,OAAO,YAAY,KAAK,mCAAuC;AAAA,IAC3E,OAAU,EAAE,OAAO,SAAY,KAAK,iCAAmC;AAAA,IACvE,UAAU,EAAE,OAAO,YAAY,KAAK,uCAAuC;AAAA,EAC7E;AACA,QAAM,EAAE,OAAO,IAAI,IAAI,IAAI,MAAM;AACjC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MAEC;AAAA,mBAAW,UAAU,4CAAC,UAAK,WAAU,uDAAsD;AAAA,QAC3F;AAAA;AAAA;AAAA,EACH;AAEJ;AAEO,SAAS,mBAAmB,EAAE,QAAQ,IAAI,GAAoC;AACnF,QAAM,MAAM,MAAM,IAAI,KAAK,IAAI,KAAM,SAAS,MAAO,GAAG,IAAI;AAC5D,SACE,6CAAC,SAAI,WAAU,eACb;AAAA,iDAAC,SAAI,WAAU,sDACb;AAAA,mDAAC,UAAM;AAAA,eAAO,eAAe;AAAA,QAAE;AAAA,SAAO;AAAA,MACtC,6CAAC,UAAK;AAAA;AAAA,QAAI,IAAI,eAAe;AAAA,SAAE;AAAA,OACjC;AAAA,IACA,4CAAC,SAAI,WAAU,6CACb;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO,EAAE,OAAO,GAAG,GAAG,IAAI;AAAA;AAAA,IAC5B,GACF;AAAA,IACA,6CAAC,OAAE,WAAU,iCAAiC;AAAA,UAAI,QAAQ,CAAC;AAAA,MAAE;AAAA,OAAS;AAAA,KACxE;AAEJ;AAEO,SAAS,iBAAiB,EAAE,WAAW,GAAmC;AAC/E,MAAI,WAAW,UAAU,OAAO,WAAW,iBAAiB,OAAO;AACjE,WACE,4CAAC,SAAI,WAAU,kEAAiE,uBAEhF;AAAA,EAEJ;AACA,QAAM,QAAQ,kBAAkB,WAAW,YAAY;AACvD,QAAM,WAAW,OAAO,YAAY;AACpC,QAAM,WAAW,OAAO,OAAO,WAAW,KAAK,IAAI,SAAS,OAAO,MAAM,QAAQ,CAAC,IAAI;AACtF,SACE,6CAAC,SAAI,WAAU,mDACZ;AAAA;AAAA,IAAS;AAAA,IAAE,OAAO,UAAU;AAAA,IAAS;AAAA,KACxC;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/components/drop-status-display.tsx"],"sourcesContent":["\"use client\";\n\nimport { cn } from \"../utils/cn.js\";\nimport type { DropPhase } from \"../utils/drop/view.js\";\n\nexport function DropStatusBadge({ phase }: { phase: DropPhase }) {\n const map = {\n live: { label: \"Live\", cls: \"text-green-400 bg-green-500/10\" },\n upcoming: { label: \"Upcoming\", cls: \"text-brand-blue bg-brand-blue/10\" },\n ended: { label: \"Ended\", cls: \"text-muted-foreground bg-muted\" },\n \"sold-out\": { label: \"Sold out\", cls: \"text-brand-orange bg-brand-orange/10\" },\n } as const;\n const { label, cls } = map[phase];\n return (\n <span className={cn(\"inline-flex items-center gap-1 text-xs font-bold uppercase tracking-widest rounded-full px-3 py-1\", cls)}>\n {phase === \"live\" && <span className=\"h-1.5 w-1.5 rounded-full bg-green-400 animate-pulse\" />}\n {label}\n </span>\n );\n}\n\nexport function DropSupplyProgress({ minted, max }: { minted: number; max: number }) {\n const pct = max > 0 ? Math.min(100, (minted / max) * 100) : 0;\n return (\n <div className=\"space-y-1.5\">\n <div className=\"flex justify-between text-xs text-muted-foreground\">\n <span>{minted.toLocaleString()} minted</span>\n <span>of {max.toLocaleString()}</span>\n </div>\n <div className=\"h-2 rounded-full bg-muted overflow-hidden\">\n <div\n className=\"h-full rounded-full bg-brand-orange transition-all duration-500\"\n style={{ width: `${pct}%` }}\n />\n </div>\n <p className=\"text-xs text-muted-foreground\">{pct.toFixed(1)}% claimed</p>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAcI;AAZJ,gBAAmB;AAGZ,SAAS,gBAAgB,EAAE,MAAM,GAAyB;AAC/D,QAAM,MAAM;AAAA,IACV,MAAY,EAAE,OAAO,QAAY,KAAK,iCAAiC;AAAA,IACvE,UAAY,EAAE,OAAO,YAAY,KAAK,mCAAmC;AAAA,IACzE,OAAY,EAAE,OAAO,SAAY,KAAK,iCAAiC;AAAA,IACvE,YAAY,EAAE,OAAO,YAAY,KAAK,uCAAuC;AAAA,EAC/E;AACA,QAAM,EAAE,OAAO,IAAI,IAAI,IAAI,KAAK;AAChC,SACE,6CAAC,UAAK,eAAW,cAAG,qGAAqG,GAAG,GACzH;AAAA,cAAU,UAAU,4CAAC,UAAK,WAAU,uDAAsD;AAAA,IAC1F;AAAA,KACH;AAEJ;AAEO,SAAS,mBAAmB,EAAE,QAAQ,IAAI,GAAoC;AACnF,QAAM,MAAM,MAAM,IAAI,KAAK,IAAI,KAAM,SAAS,MAAO,GAAG,IAAI;AAC5D,SACE,6CAAC,SAAI,WAAU,eACb;AAAA,iDAAC,SAAI,WAAU,sDACb;AAAA,mDAAC,UAAM;AAAA,eAAO,eAAe;AAAA,QAAE;AAAA,SAAO;AAAA,MACtC,6CAAC,UAAK;AAAA;AAAA,QAAI,IAAI,eAAe;AAAA,SAAE;AAAA,OACjC;AAAA,IACA,4CAAC,SAAI,WAAU,6CACb;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO,EAAE,OAAO,GAAG,GAAG,IAAI;AAAA;AAAA,IAC5B,GACF;AAAA,IACA,6CAAC,OAAE,WAAU,iCAAiC;AAAA,UAAI,QAAQ,CAAC;AAAA,MAAE;AAAA,OAAS;AAAA,KACxE;AAEJ;","names":[]}
@@ -1,15 +1,14 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { DropConditions, DropStatus } from '../utils/drop-status.cjs';
2
+ import { DropPhase } from '../utils/drop/view.cjs';
3
+ import '@medialane/sdk';
4
+ import '@medialane/sdk/starknet';
3
5
 
4
- declare function DropStatusBadge({ status }: {
5
- status: DropStatus;
6
+ declare function DropStatusBadge({ phase }: {
7
+ phase: DropPhase;
6
8
  }): react_jsx_runtime.JSX.Element;
7
9
  declare function DropSupplyProgress({ minted, max }: {
8
10
  minted: number;
9
11
  max: number;
10
12
  }): react_jsx_runtime.JSX.Element;
11
- declare function DropPriceDisplay({ conditions }: {
12
- conditions: DropConditions;
13
- }): react_jsx_runtime.JSX.Element;
14
13
 
15
- export { DropPriceDisplay, DropStatusBadge, DropSupplyProgress };
14
+ export { DropStatusBadge, DropSupplyProgress };
@@ -1,15 +1,14 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { DropConditions, DropStatus } from '../utils/drop-status.js';
2
+ import { DropPhase } from '../utils/drop/view.js';
3
+ import '@medialane/sdk';
4
+ import '@medialane/sdk/starknet';
3
5
 
4
- declare function DropStatusBadge({ status }: {
5
- status: DropStatus;
6
+ declare function DropStatusBadge({ phase }: {
7
+ phase: DropPhase;
6
8
  }): react_jsx_runtime.JSX.Element;
7
9
  declare function DropSupplyProgress({ minted, max }: {
8
10
  minted: number;
9
11
  max: number;
10
12
  }): react_jsx_runtime.JSX.Element;
11
- declare function DropPriceDisplay({ conditions }: {
12
- conditions: DropConditions;
13
- }): react_jsx_runtime.JSX.Element;
14
13
 
15
- export { DropPriceDisplay, DropStatusBadge, DropSupplyProgress };
14
+ export { DropStatusBadge, DropSupplyProgress };
@@ -1,33 +1,18 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
- import { getListableTokens, normalizeAddress } from "@medialane/sdk";
4
3
  import { cn } from "../utils/cn.js";
5
- function getTokenByAddress(address) {
6
- return getListableTokens().find(
7
- (t) => normalizeAddress("STARKNET", t.address) === normalizeAddress("STARKNET", address)
8
- ) ?? null;
9
- }
10
- function DropStatusBadge({ status }) {
4
+ function DropStatusBadge({ phase }) {
11
5
  const map = {
12
6
  live: { label: "Live", cls: "text-green-400 bg-green-500/10" },
13
7
  upcoming: { label: "Upcoming", cls: "text-brand-blue bg-brand-blue/10" },
14
8
  ended: { label: "Ended", cls: "text-muted-foreground bg-muted" },
15
- sold_out: { label: "Sold out", cls: "text-brand-orange bg-brand-orange/10" }
9
+ "sold-out": { label: "Sold out", cls: "text-brand-orange bg-brand-orange/10" }
16
10
  };
17
- const { label, cls } = map[status];
18
- return /* @__PURE__ */ jsxs(
19
- "span",
20
- {
21
- className: cn(
22
- "inline-flex items-center gap-1 text-xs font-bold uppercase tracking-widest rounded-full px-3 py-1",
23
- cls
24
- ),
25
- children: [
26
- status === "live" && /* @__PURE__ */ jsx("span", { className: "h-1.5 w-1.5 rounded-full bg-green-400 animate-pulse" }),
27
- label
28
- ]
29
- }
30
- );
11
+ const { label, cls } = map[phase];
12
+ return /* @__PURE__ */ jsxs("span", { className: cn("inline-flex items-center gap-1 text-xs font-bold uppercase tracking-widest rounded-full px-3 py-1", cls), children: [
13
+ phase === "live" && /* @__PURE__ */ jsx("span", { className: "h-1.5 w-1.5 rounded-full bg-green-400 animate-pulse" }),
14
+ label
15
+ ] });
31
16
  }
32
17
  function DropSupplyProgress({ minted, max }) {
33
18
  const pct = max > 0 ? Math.min(100, minted / max * 100) : 0;
@@ -55,22 +40,7 @@ function DropSupplyProgress({ minted, max }) {
55
40
  ] })
56
41
  ] });
57
42
  }
58
- function DropPriceDisplay({ conditions }) {
59
- if (conditions.price === "0" || conditions.paymentToken === "0x0") {
60
- return /* @__PURE__ */ jsx("div", { className: "flex items-center gap-1.5 text-sm font-semibold text-green-500", children: "Free mint" });
61
- }
62
- const token = getTokenByAddress(conditions.paymentToken);
63
- const decimals = token?.decimals ?? 18;
64
- const priceNum = Number(BigInt(conditions.price) * 10000n / BigInt(10 ** decimals)) / 1e4;
65
- return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5 text-sm font-semibold", children: [
66
- priceNum,
67
- " ",
68
- token?.symbol ?? "tokens",
69
- " per token"
70
- ] });
71
- }
72
43
  export {
73
- DropPriceDisplay,
74
44
  DropStatusBadge,
75
45
  DropSupplyProgress
76
46
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/drop-status-display.tsx"],"sourcesContent":["\"use client\";\n\nimport { getListableTokens, normalizeAddress } from \"@medialane/sdk\";\nimport { cn } from \"../utils/cn.js\";\nimport type { DropConditions, DropStatus } from \"../utils/drop-status.js\";\n\nfunction getTokenByAddress(address: string) {\n return (\n getListableTokens().find(\n (t) => normalizeAddress(\"STARKNET\", t.address) === normalizeAddress(\"STARKNET\", address)\n ) ?? null\n );\n}\n\nexport function DropStatusBadge({ status }: { status: DropStatus }) {\n const map = {\n live: { label: \"Live\", cls: \"text-green-400 bg-green-500/10\" },\n upcoming: { label: \"Upcoming\", cls: \"text-brand-blue bg-brand-blue/10\" },\n ended: { label: \"Ended\", cls: \"text-muted-foreground bg-muted\" },\n sold_out: { label: \"Sold out\", cls: \"text-brand-orange bg-brand-orange/10\" },\n } as const;\n const { label, cls } = map[status];\n return (\n <span\n className={cn(\n \"inline-flex items-center gap-1 text-xs font-bold uppercase tracking-widest rounded-full px-3 py-1\",\n cls\n )}\n >\n {status === \"live\" && <span className=\"h-1.5 w-1.5 rounded-full bg-green-400 animate-pulse\" />}\n {label}\n </span>\n );\n}\n\nexport function DropSupplyProgress({ minted, max }: { minted: number; max: number }) {\n const pct = max > 0 ? Math.min(100, (minted / max) * 100) : 0;\n return (\n <div className=\"space-y-1.5\">\n <div className=\"flex justify-between text-xs text-muted-foreground\">\n <span>{minted.toLocaleString()} minted</span>\n <span>of {max.toLocaleString()}</span>\n </div>\n <div className=\"h-2 rounded-full bg-muted overflow-hidden\">\n <div\n className=\"h-full rounded-full bg-brand-orange transition-all duration-500\"\n style={{ width: `${pct}%` }}\n />\n </div>\n <p className=\"text-xs text-muted-foreground\">{pct.toFixed(1)}% claimed</p>\n </div>\n );\n}\n\nexport function DropPriceDisplay({ conditions }: { conditions: DropConditions }) {\n if (conditions.price === \"0\" || conditions.paymentToken === \"0x0\") {\n return (\n <div className=\"flex items-center gap-1.5 text-sm font-semibold text-green-500\">\n Free mint\n </div>\n );\n }\n const token = getTokenByAddress(conditions.paymentToken);\n const decimals = token?.decimals ?? 18;\n const priceNum = Number(BigInt(conditions.price) * 10000n / BigInt(10 ** decimals)) / 10000;\n return (\n <div className=\"flex items-center gap-1.5 text-sm font-semibold\">\n {priceNum} {token?.symbol ?? \"tokens\"} per token\n </div>\n );\n}\n"],"mappings":";AAuBI,SAMwB,KANxB;AArBJ,SAAS,mBAAmB,wBAAwB;AACpD,SAAS,UAAU;AAGnB,SAAS,kBAAkB,SAAiB;AAC1C,SACE,kBAAkB,EAAE;AAAA,IAClB,CAAC,MAAM,iBAAiB,YAAY,EAAE,OAAO,MAAM,iBAAiB,YAAY,OAAO;AAAA,EACzF,KAAK;AAET;AAEO,SAAS,gBAAgB,EAAE,OAAO,GAA2B;AAClE,QAAM,MAAM;AAAA,IACV,MAAU,EAAE,OAAO,QAAY,KAAK,iCAAmC;AAAA,IACvE,UAAU,EAAE,OAAO,YAAY,KAAK,mCAAuC;AAAA,IAC3E,OAAU,EAAE,OAAO,SAAY,KAAK,iCAAmC;AAAA,IACvE,UAAU,EAAE,OAAO,YAAY,KAAK,uCAAuC;AAAA,EAC7E;AACA,QAAM,EAAE,OAAO,IAAI,IAAI,IAAI,MAAM;AACjC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MAEC;AAAA,mBAAW,UAAU,oBAAC,UAAK,WAAU,uDAAsD;AAAA,QAC3F;AAAA;AAAA;AAAA,EACH;AAEJ;AAEO,SAAS,mBAAmB,EAAE,QAAQ,IAAI,GAAoC;AACnF,QAAM,MAAM,MAAM,IAAI,KAAK,IAAI,KAAM,SAAS,MAAO,GAAG,IAAI;AAC5D,SACE,qBAAC,SAAI,WAAU,eACb;AAAA,yBAAC,SAAI,WAAU,sDACb;AAAA,2BAAC,UAAM;AAAA,eAAO,eAAe;AAAA,QAAE;AAAA,SAAO;AAAA,MACtC,qBAAC,UAAK;AAAA;AAAA,QAAI,IAAI,eAAe;AAAA,SAAE;AAAA,OACjC;AAAA,IACA,oBAAC,SAAI,WAAU,6CACb;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO,EAAE,OAAO,GAAG,GAAG,IAAI;AAAA;AAAA,IAC5B,GACF;AAAA,IACA,qBAAC,OAAE,WAAU,iCAAiC;AAAA,UAAI,QAAQ,CAAC;AAAA,MAAE;AAAA,OAAS;AAAA,KACxE;AAEJ;AAEO,SAAS,iBAAiB,EAAE,WAAW,GAAmC;AAC/E,MAAI,WAAW,UAAU,OAAO,WAAW,iBAAiB,OAAO;AACjE,WACE,oBAAC,SAAI,WAAU,kEAAiE,uBAEhF;AAAA,EAEJ;AACA,QAAM,QAAQ,kBAAkB,WAAW,YAAY;AACvD,QAAM,WAAW,OAAO,YAAY;AACpC,QAAM,WAAW,OAAO,OAAO,WAAW,KAAK,IAAI,SAAS,OAAO,MAAM,QAAQ,CAAC,IAAI;AACtF,SACE,qBAAC,SAAI,WAAU,mDACZ;AAAA;AAAA,IAAS;AAAA,IAAE,OAAO,UAAU;AAAA,IAAS;AAAA,KACxC;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/components/drop-status-display.tsx"],"sourcesContent":["\"use client\";\n\nimport { cn } from \"../utils/cn.js\";\nimport type { DropPhase } from \"../utils/drop/view.js\";\n\nexport function DropStatusBadge({ phase }: { phase: DropPhase }) {\n const map = {\n live: { label: \"Live\", cls: \"text-green-400 bg-green-500/10\" },\n upcoming: { label: \"Upcoming\", cls: \"text-brand-blue bg-brand-blue/10\" },\n ended: { label: \"Ended\", cls: \"text-muted-foreground bg-muted\" },\n \"sold-out\": { label: \"Sold out\", cls: \"text-brand-orange bg-brand-orange/10\" },\n } as const;\n const { label, cls } = map[phase];\n return (\n <span className={cn(\"inline-flex items-center gap-1 text-xs font-bold uppercase tracking-widest rounded-full px-3 py-1\", cls)}>\n {phase === \"live\" && <span className=\"h-1.5 w-1.5 rounded-full bg-green-400 animate-pulse\" />}\n {label}\n </span>\n );\n}\n\nexport function DropSupplyProgress({ minted, max }: { minted: number; max: number }) {\n const pct = max > 0 ? Math.min(100, (minted / max) * 100) : 0;\n return (\n <div className=\"space-y-1.5\">\n <div className=\"flex justify-between text-xs text-muted-foreground\">\n <span>{minted.toLocaleString()} minted</span>\n <span>of {max.toLocaleString()}</span>\n </div>\n <div className=\"h-2 rounded-full bg-muted overflow-hidden\">\n <div\n className=\"h-full rounded-full bg-brand-orange transition-all duration-500\"\n style={{ width: `${pct}%` }}\n />\n </div>\n <p className=\"text-xs text-muted-foreground\">{pct.toFixed(1)}% claimed</p>\n </div>\n );\n}\n"],"mappings":";AAcI,SACuB,KADvB;AAZJ,SAAS,UAAU;AAGZ,SAAS,gBAAgB,EAAE,MAAM,GAAyB;AAC/D,QAAM,MAAM;AAAA,IACV,MAAY,EAAE,OAAO,QAAY,KAAK,iCAAiC;AAAA,IACvE,UAAY,EAAE,OAAO,YAAY,KAAK,mCAAmC;AAAA,IACzE,OAAY,EAAE,OAAO,SAAY,KAAK,iCAAiC;AAAA,IACvE,YAAY,EAAE,OAAO,YAAY,KAAK,uCAAuC;AAAA,EAC/E;AACA,QAAM,EAAE,OAAO,IAAI,IAAI,IAAI,KAAK;AAChC,SACE,qBAAC,UAAK,WAAW,GAAG,qGAAqG,GAAG,GACzH;AAAA,cAAU,UAAU,oBAAC,UAAK,WAAU,uDAAsD;AAAA,IAC1F;AAAA,KACH;AAEJ;AAEO,SAAS,mBAAmB,EAAE,QAAQ,IAAI,GAAoC;AACnF,QAAM,MAAM,MAAM,IAAI,KAAK,IAAI,KAAM,SAAS,MAAO,GAAG,IAAI;AAC5D,SACE,qBAAC,SAAI,WAAU,eACb;AAAA,yBAAC,SAAI,WAAU,sDACb;AAAA,2BAAC,UAAM;AAAA,eAAO,eAAe;AAAA,QAAE;AAAA,SAAO;AAAA,MACtC,qBAAC,UAAK;AAAA;AAAA,QAAI,IAAI,eAAe;AAAA,SAAE;AAAA,OACjC;AAAA,IACA,oBAAC,SAAI,WAAU,6CACb;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO,EAAE,OAAO,GAAG,GAAG,IAAI;AAAA;AAAA,IAC5B,GACF;AAAA,IACA,qBAAC,OAAE,WAAU,iCAAiC;AAAA,UAAI,QAAQ,CAAC;AAAA,MAAE;AAAA,OAAS;AAAA,KACxE;AAEJ;","names":[]}
@@ -1 +1,3 @@
1
1
  export { default } from 'next/image';
2
+ import 'next/link';
3
+ import 'next/navigation';
@@ -1 +1,3 @@
1
1
  export { default } from 'next/image';
2
+ import 'next/link';
3
+ import 'next/navigation';