@medialane/ui 0.182.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 (255) 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/fast-mint/types.cjs.map +1 -1
  104. package/dist/components/fast-mint/types.d.cts +3 -1
  105. package/dist/components/fast-mint/types.d.ts +3 -1
  106. package/dist/components/image.d.cts +2 -0
  107. package/dist/components/image.d.ts +2 -0
  108. package/dist/index.cjs +46 -27
  109. package/dist/index.cjs.map +1 -1
  110. package/dist/index.d.cts +20 -11
  111. package/dist/index.d.ts +20 -11
  112. package/dist/index.js +31 -25
  113. package/dist/index.js.map +1 -1
  114. package/dist/utils/drop/actions.cjs +76 -0
  115. package/dist/utils/drop/actions.cjs.map +1 -0
  116. package/dist/utils/drop/actions.d.cts +46 -0
  117. package/dist/utils/drop/actions.d.ts +46 -0
  118. package/dist/utils/drop/actions.js +49 -0
  119. package/dist/utils/drop/actions.js.map +1 -0
  120. package/dist/utils/drop/allowlist.cjs +50 -0
  121. package/dist/utils/drop/allowlist.cjs.map +1 -0
  122. package/dist/utils/drop/allowlist.d.cts +10 -0
  123. package/dist/utils/drop/allowlist.d.ts +10 -0
  124. package/dist/utils/drop/allowlist.js +26 -0
  125. package/dist/utils/drop/allowlist.js.map +1 -0
  126. package/dist/utils/drop/chain.cjs +37 -0
  127. package/dist/utils/drop/chain.cjs.map +1 -0
  128. package/dist/utils/drop/chain.d.cts +5 -0
  129. package/dist/utils/drop/chain.d.ts +5 -0
  130. package/dist/utils/drop/chain.js +13 -0
  131. package/dist/utils/drop/chain.js.map +1 -0
  132. package/dist/utils/drop/claim-proof.cjs +48 -0
  133. package/dist/utils/drop/claim-proof.cjs.map +1 -0
  134. package/dist/utils/drop/claim-proof.d.cts +9 -0
  135. package/dist/utils/drop/claim-proof.d.ts +9 -0
  136. package/dist/utils/drop/claim-proof.js +24 -0
  137. package/dist/utils/drop/claim-proof.js.map +1 -0
  138. package/dist/utils/drop/draft.cjs +87 -0
  139. package/dist/utils/drop/draft.cjs.map +1 -0
  140. package/dist/utils/drop/draft.d.cts +32 -0
  141. package/dist/utils/drop/draft.d.ts +32 -0
  142. package/dist/utils/drop/draft.js +61 -0
  143. package/dist/utils/drop/draft.js.map +1 -0
  144. package/dist/utils/drop/metadata.cjs +70 -0
  145. package/dist/utils/drop/metadata.cjs.map +1 -0
  146. package/dist/utils/drop/metadata.d.cts +34 -0
  147. package/dist/utils/drop/metadata.d.ts +34 -0
  148. package/dist/utils/drop/metadata.js +43 -0
  149. package/dist/utils/drop/metadata.js.map +1 -0
  150. package/dist/utils/{drop-status.cjs → drop/preview.cjs} +14 -14
  151. package/dist/utils/drop/preview.cjs.map +1 -0
  152. package/dist/utils/drop/preview.d.cts +4 -0
  153. package/dist/utils/drop/preview.d.ts +4 -0
  154. package/dist/utils/drop/preview.js +13 -0
  155. package/dist/utils/drop/preview.js.map +1 -0
  156. package/dist/utils/drop/receipt.cjs +39 -0
  157. package/dist/utils/drop/receipt.cjs.map +1 -0
  158. package/dist/utils/drop/receipt.d.cts +6 -0
  159. package/dist/utils/drop/receipt.d.ts +6 -0
  160. package/dist/utils/drop/receipt.js +15 -0
  161. package/dist/utils/drop/receipt.js.map +1 -0
  162. package/dist/utils/drop/sale.cjs +108 -0
  163. package/dist/utils/drop/sale.cjs.map +1 -0
  164. package/dist/utils/drop/sale.d.cts +52 -0
  165. package/dist/utils/drop/sale.d.ts +52 -0
  166. package/dist/utils/drop/sale.js +78 -0
  167. package/dist/utils/drop/sale.js.map +1 -0
  168. package/dist/utils/drop/types.cjs +17 -0
  169. package/dist/utils/drop/types.cjs.map +1 -0
  170. package/dist/utils/drop/types.d.cts +20 -0
  171. package/dist/utils/drop/types.d.ts +20 -0
  172. package/dist/utils/drop/types.js +1 -0
  173. package/dist/utils/drop/types.js.map +1 -0
  174. package/dist/utils/drop/upload.cjs +48 -0
  175. package/dist/utils/drop/upload.cjs.map +1 -0
  176. package/dist/utils/drop/upload.d.cts +11 -0
  177. package/dist/utils/drop/upload.d.ts +11 -0
  178. package/dist/utils/drop/upload.js +24 -0
  179. package/dist/utils/drop/upload.js.map +1 -0
  180. package/dist/utils/drop/use-now.cjs +38 -0
  181. package/dist/utils/drop/use-now.cjs.map +1 -0
  182. package/dist/utils/drop/use-now.d.cts +4 -0
  183. package/dist/utils/drop/use-now.d.ts +4 -0
  184. package/dist/utils/drop/use-now.js +14 -0
  185. package/dist/utils/drop/use-now.js.map +1 -0
  186. package/dist/utils/drop/view.cjs +89 -0
  187. package/dist/utils/drop/view.cjs.map +1 -0
  188. package/dist/utils/drop/view.d.cts +34 -0
  189. package/dist/utils/drop/view.d.ts +34 -0
  190. package/dist/utils/drop/view.js +64 -0
  191. package/dist/utils/drop/view.js.map +1 -0
  192. package/dist/utils/launchpad-defaults.cjs +0 -22
  193. package/dist/utils/launchpad-defaults.cjs.map +1 -1
  194. package/dist/utils/launchpad-defaults.d.cts +1 -7
  195. package/dist/utils/launchpad-defaults.d.ts +1 -7
  196. package/dist/utils/launchpad-defaults.js +0 -21
  197. package/dist/utils/launchpad-defaults.js.map +1 -1
  198. package/dist/utils/use-drops.cjs +41 -45
  199. package/dist/utils/use-drops.cjs.map +1 -1
  200. package/dist/utils/use-drops.d.cts +31 -23
  201. package/dist/utils/use-drops.d.ts +31 -23
  202. package/dist/utils/use-drops.js +35 -40
  203. package/dist/utils/use-drops.js.map +1 -1
  204. package/dist/utils/wallet-failure.cjs +2 -2
  205. package/dist/utils/wallet-failure.cjs.map +1 -1
  206. package/dist/utils/wallet-failure.js +2 -2
  207. package/dist/utils/wallet-failure.js.map +1 -1
  208. package/package.json +3 -3
  209. package/dist/components/account/account.test.cjs +0 -86
  210. package/dist/components/account/account.test.cjs.map +0 -1
  211. package/dist/components/account/account.test.d.cts +0 -2
  212. package/dist/components/account/account.test.d.ts +0 -2
  213. package/dist/components/account/account.test.js +0 -85
  214. package/dist/components/account/account.test.js.map +0 -1
  215. package/dist/components/drop-create-form.cjs +0 -341
  216. package/dist/components/drop-create-form.cjs.map +0 -1
  217. package/dist/components/drop-create-form.d.cts +0 -39
  218. package/dist/components/drop-create-form.d.ts +0 -39
  219. package/dist/components/drop-create-form.js +0 -322
  220. package/dist/components/drop-create-form.js.map +0 -1
  221. package/dist/components/drop-preview-card.cjs +0 -106
  222. package/dist/components/drop-preview-card.cjs.map +0 -1
  223. package/dist/components/drop-preview-card.d.cts +0 -17
  224. package/dist/components/drop-preview-card.d.ts +0 -17
  225. package/dist/components/drop-preview-card.js +0 -82
  226. package/dist/components/drop-preview-card.js.map +0 -1
  227. package/dist/components/drop-preview-card.test.cjs +0 -84
  228. package/dist/components/drop-preview-card.test.cjs.map +0 -1
  229. package/dist/components/drop-preview-card.test.d.cts +0 -3
  230. package/dist/components/drop-preview-card.test.d.ts +0 -3
  231. package/dist/components/drop-preview-card.test.js +0 -83
  232. package/dist/components/drop-preview-card.test.js.map +0 -1
  233. package/dist/components/drop-status-display.test.cjs +0 -29
  234. package/dist/components/drop-status-display.test.cjs.map +0 -1
  235. package/dist/components/drop-status-display.test.d.cts +0 -2
  236. package/dist/components/drop-status-display.test.d.ts +0 -2
  237. package/dist/components/drop-status-display.test.js +0 -28
  238. package/dist/components/drop-status-display.test.js.map +0 -1
  239. package/dist/components/exclusive-content-section.cjs +0 -88
  240. package/dist/components/exclusive-content-section.cjs.map +0 -1
  241. package/dist/components/exclusive-content-section.d.cts +0 -10
  242. package/dist/components/exclusive-content-section.d.ts +0 -10
  243. package/dist/components/exclusive-content-section.js +0 -64
  244. package/dist/components/exclusive-content-section.js.map +0 -1
  245. package/dist/data/drop-create-schema.cjs +0 -92
  246. package/dist/data/drop-create-schema.cjs.map +0 -1
  247. package/dist/data/drop-create-schema.d.cts +0 -131
  248. package/dist/data/drop-create-schema.d.ts +0 -131
  249. package/dist/data/drop-create-schema.js +0 -58
  250. package/dist/data/drop-create-schema.js.map +0 -1
  251. package/dist/utils/drop-status.cjs.map +0 -1
  252. package/dist/utils/drop-status.d.cts +0 -12
  253. package/dist/utils/drop-status.d.ts +0 -12
  254. package/dist/utils/drop-status.js +0 -13
  255. package/dist/utils/drop-status.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/drop/create/launch-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { CheckCircle2, Loader2, RotateCcw, XCircle } from \"lucide-react\";\nimport { dropHref } from \"@medialane/sdk\";\nimport { buildPopAllowlist, dropClaimLinks, popClaimLinksCsv, type PopClaimLink } from \"@medialane/sdk/starknet\";\nimport { ActionDialog } from \"../../action-dialog.js\";\nimport { GradientButton } from \"../../gradient-button.js\";\nimport { Button } from \"../../button.js\";\nimport { ShareButton } from \"../../share-button.js\";\nimport { describeError } from \"../../../utils/describe-error.js\";\nimport { uploadDirectoryToIpfs, uploadFileToIpfs } from \"../../../utils/ipfs-upload.js\";\nimport { parseAllowlist } from \"../../../utils/drop/allowlist.js\";\nimport { buildDropMetadataFiles, metadataBytes, MAX_DROP_METADATA_BYTES } from \"../../../utils/drop/metadata.js\";\nimport { toDropTerms, priceLabel } from \"../../../utils/drop/sale.js\";\nimport { draftSupply, type DropDraft } from \"../../../utils/drop/draft.js\";\nimport { uploadAll, type UploadTask } from \"../../../utils/drop/upload.js\";\nimport { launchDrop, saveExclusiveContent } from \"../../../utils/drop/actions.js\";\nimport type { DropAppProps } from \"../../../utils/drop/types.js\";\n\ntype Step =\n | { kind: \"review\" }\n | { kind: \"uploading\" }\n | { kind: \"launching\" }\n | { kind: \"done\"; collection: string; links: PopClaimLink[]; warning: string | null }\n | { kind: \"error\"; message: string };\n\nexport function LaunchDialog({ open, onClose, draft, app }: { open: boolean; onClose: () => void; draft: DropDraft; app: DropAppProps }) {\n const [step, setStep] = useState<Step>({ kind: \"review\" });\n const [tasks, setTasks] = useState<UploadTask[]>([]);\n const [baseUri, setBaseUri] = useState<string | null>(null);\n const client = app.getClient();\n const files = draft.kind === \"edition\" ? (draft.edition ? [draft.edition] : []) : draft.items.map((i) => i.file);\n const terms = toDropTerms(draft.sale);\n const list = draft.listOnly ? buildPopAllowlist(parseAllowlist(draft.allowlist).addresses) : null;\n\n const run = async () => {\n try {\n let uri = baseUri;\n if (!uri) {\n setStep({ kind: \"uploading\" });\n const initial = tasks.length > 0 ? tasks : [\n ...files.map((file, i) => ({ id: `art-${i}`, file, status: \"pending\" as const, uri: null, error: null })),\n ...(draft.cover ? [{ id: \"cover\", file: draft.cover, status: \"pending\" as const, uri: null, error: null }] : []),\n ];\n const done = await uploadAll(initial, async (f) => (await uploadFileToIpfs(client.api, f, \"image\")).uri, setTasks);\n setTasks(done);\n if (done.some((t) => t.status !== \"done\")) {\n setStep({ kind: \"error\", message: \"Some files didn't upload. Retry to send only those.\" });\n return;\n }\n const art = done.filter((t) => t.id.startsWith(\"art-\"));\n const metadata = buildDropMetadataFiles({\n kind: draft.kind,\n name: draft.name.trim(),\n description: draft.description.trim(),\n creator: app.walletAddress!,\n coverUri: done.find((t) => t.id === \"cover\")?.uri ?? null,\n license: draft.license,\n registrationDate: new Date().toISOString().slice(0, 10),\n items: draft.kind === \"edition\"\n ? [{ name: \"\", description: \"\", imageUri: art[0]!.uri! }]\n : draft.items.map((it, i) => ({ name: it.name, description: it.description, imageUri: art[i]!.uri! })),\n supply: draftSupply(draft),\n });\n if (metadataBytes(metadata) > MAX_DROP_METADATA_BYTES) {\n setStep({ kind: \"error\", message: \"The descriptions are too long for this many tokens. Shorten them and try again.\" });\n return;\n }\n uri = (await uploadDirectoryToIpfs(client.api, metadata)).baseUri;\n setBaseUri(uri);\n }\n setStep({ kind: \"launching\" });\n const signer = await app.getSigner();\n const { collection } = await launchDrop({ client, provider: app.provider, signer }, {\n owner: app.walletAddress!,\n name: draft.name.trim(),\n symbol: draft.symbol,\n baseUri: uri!,\n maxSupply: draftSupply(draft),\n terms,\n allowlistRoot: list?.root,\n description: draft.description.trim() || undefined,\n });\n let warning: string | null = null;\n if (draft.gated.enabled) {\n try {\n await saveExclusiveContent(client, collection, draft.gated);\n } catch {\n warning = \"Your drop launched, but the exclusive content wasn't saved. You can add it from Manage.\";\n }\n }\n setStep({ kind: \"done\", collection, links: list ? dropClaimLinks(window.location.origin, collection, list) : [], warning });\n } catch (err) {\n setStep({ kind: \"error\", message: describeError(err, \"We couldn't launch your drop. Please try again.\").message });\n }\n };\n\n const close = () => {\n if (step.kind === \"uploading\" || step.kind === \"launching\") return;\n onClose();\n };\n\n return (\n <ActionDialog open={open} onClose={close}>\n <div className=\"space-y-5 p-6\">\n {step.kind === \"review\" && (\n <>\n <h2 className=\"text-lg font-semibold\">Review and launch</h2>\n <div className=\"space-y-2 rounded-xl border border-border p-4 text-sm\">\n <p className=\"font-semibold\">{draft.name}</p>\n <p className=\"text-xs font-semibold uppercase tracking-widest text-muted-foreground\">Fixed after launch</p>\n <Row label=\"Price\" value={priceLabel(terms.price, terms.paymentToken)} />\n <Row label=\"Supply\" value={`${draftSupply(draft).toLocaleString(\"en-US\")} ${draft.kind === \"edition\" ? \"copies\" : \"items\"}`} />\n <Row label=\"Starts\" value={terms.startTime === 0 ? \"At launch\" : new Date(terms.startTime * 1000).toLocaleString()} />\n <Row label=\"Ends\" value={terms.endTime === 0 ? \"No end date\" : new Date(terms.endTime * 1000).toLocaleString()} />\n <Row label=\"Per wallet\" value={terms.maxPerWallet === \"0\" ? \"No limit\" : terms.maxPerWallet} />\n <Row label=\"Who can mint\" value={list ? `${Object.keys(list.proofs).length} wallets on a list` : \"Everyone\"} />\n <p className=\"pt-1 text-xs text-muted-foreground\">The artwork and these terms can't be changed after launch. You can change the list later.</p>\n </div>\n <GradientButton big onClick={() => void run()}>Launch drop</GradientButton>\n </>\n )}\n {step.kind === \"uploading\" && (\n <>\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><Loader2 className=\"h-4 w-4 animate-spin\" />Uploading</h2>\n <p className=\"text-sm text-muted-foreground\">{tasks.filter((t) => t.status === \"done\").length} of {tasks.length} files</p>\n </>\n )}\n {step.kind === \"launching\" && (\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><Loader2 className=\"h-4 w-4 animate-spin\" />Launching your drop…</h2>\n )}\n {step.kind === \"error\" && (\n <>\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><XCircle className=\"h-4 w-4 text-destructive\" />Not launched</h2>\n <p className=\"text-sm text-muted-foreground\">{step.message}</p>\n {tasks.some((t) => t.status === \"failed\") && (\n <ul className=\"space-y-1 text-xs text-muted-foreground\">\n {tasks.filter((t) => t.status === \"failed\").map((t) => <li key={t.id}>{t.file.name}: {t.error}</li>)}\n </ul>\n )}\n <Button onClick={() => void run()} className=\"gap-1.5\"><RotateCcw className=\"h-3.5 w-3.5\" />Try again</Button>\n </>\n )}\n {step.kind === \"done\" && (\n <>\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><CheckCircle2 className=\"h-5 w-5 text-green-500\" />Your drop is live</h2>\n {step.warning && <p className=\"text-sm text-brand-orange\">{step.warning}</p>}\n <div className=\"flex flex-wrap gap-2\">\n <ShareButton title={draft.name} url={`${window.location.origin}${dropHref(step.collection)}`} variant=\"outline\" />\n <Button asChild variant=\"outline\"><a href={dropHref(step.collection)}>View drop</a></Button>\n {step.links.length > 0 && (\n <Button variant=\"outline\" onClick={() => downloadCsv(popClaimLinksCsv(step.links), \"claim-links.csv\")}>Download claim links</Button>\n )}\n </div>\n {step.links.length > 0 && <p className=\"text-xs text-muted-foreground\">Send each wallet its link — the link is what lets it mint.</p>}\n </>\n )}\n </div>\n </ActionDialog>\n );\n}\n\nfunction Row({ label, value }: { label: string; value: string }) {\n return <div className=\"flex justify-between gap-3\"><span className=\"text-muted-foreground\">{label}</span><span className=\"text-right font-medium\">{value}</span></div>;\n}\n\nexport function downloadCsv(csv: string, name: string) {\n const href = URL.createObjectURL(new Blob([csv], { type: \"text/csv\" }));\n Object.assign(document.createElement(\"a\"), { href, download: name }).click();\n URL.revokeObjectURL(href);\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,21 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { DropDraft } from '../../../utils/drop/draft.cjs';
3
+ import { DropAppProps } from '../../../utils/drop/types.cjs';
4
+ import '../../drop-item-list.cjs';
5
+ import '../../../utils/drop/metadata.cjs';
6
+ import '@medialane/sdk';
7
+ import '../../../utils/drop/sale.cjs';
8
+ import 'starknet';
9
+ import '@medialane/sdk/starknet';
10
+ import '../../fast-mint/types.cjs';
11
+ import 'react';
12
+
13
+ declare function LaunchDialog({ open, onClose, draft, app }: {
14
+ open: boolean;
15
+ onClose: () => void;
16
+ draft: DropDraft;
17
+ app: DropAppProps;
18
+ }): react_jsx_runtime.JSX.Element;
19
+ declare function downloadCsv(csv: string, name: string): void;
20
+
21
+ export { LaunchDialog, downloadCsv };
@@ -0,0 +1,21 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { DropDraft } from '../../../utils/drop/draft.js';
3
+ import { DropAppProps } from '../../../utils/drop/types.js';
4
+ import '../../drop-item-list.js';
5
+ import '../../../utils/drop/metadata.js';
6
+ import '@medialane/sdk';
7
+ import '../../../utils/drop/sale.js';
8
+ import 'starknet';
9
+ import '@medialane/sdk/starknet';
10
+ import '../../fast-mint/types.js';
11
+ import 'react';
12
+
13
+ declare function LaunchDialog({ open, onClose, draft, app }: {
14
+ open: boolean;
15
+ onClose: () => void;
16
+ draft: DropDraft;
17
+ app: DropAppProps;
18
+ }): react_jsx_runtime.JSX.Element;
19
+ declare function downloadCsv(csv: string, name: string): void;
20
+
21
+ export { LaunchDialog, downloadCsv };
@@ -0,0 +1,168 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import { useState } from "react";
4
+ import { CheckCircle2, Loader2, RotateCcw, XCircle } from "lucide-react";
5
+ import { dropHref } from "@medialane/sdk";
6
+ import { buildPopAllowlist, dropClaimLinks, popClaimLinksCsv } from "@medialane/sdk/starknet";
7
+ import { ActionDialog } from "../../action-dialog.js";
8
+ import { GradientButton } from "../../gradient-button.js";
9
+ import { Button } from "../../button.js";
10
+ import { ShareButton } from "../../share-button.js";
11
+ import { describeError } from "../../../utils/describe-error.js";
12
+ import { uploadDirectoryToIpfs, uploadFileToIpfs } from "../../../utils/ipfs-upload.js";
13
+ import { parseAllowlist } from "../../../utils/drop/allowlist.js";
14
+ import { buildDropMetadataFiles, metadataBytes, MAX_DROP_METADATA_BYTES } from "../../../utils/drop/metadata.js";
15
+ import { toDropTerms, priceLabel } from "../../../utils/drop/sale.js";
16
+ import { draftSupply } from "../../../utils/drop/draft.js";
17
+ import { uploadAll } from "../../../utils/drop/upload.js";
18
+ import { launchDrop, saveExclusiveContent } from "../../../utils/drop/actions.js";
19
+ function LaunchDialog({ open, onClose, draft, app }) {
20
+ const [step, setStep] = useState({ kind: "review" });
21
+ const [tasks, setTasks] = useState([]);
22
+ const [baseUri, setBaseUri] = useState(null);
23
+ const client = app.getClient();
24
+ const files = draft.kind === "edition" ? draft.edition ? [draft.edition] : [] : draft.items.map((i) => i.file);
25
+ const terms = toDropTerms(draft.sale);
26
+ const list = draft.listOnly ? buildPopAllowlist(parseAllowlist(draft.allowlist).addresses) : null;
27
+ const run = async () => {
28
+ try {
29
+ let uri = baseUri;
30
+ if (!uri) {
31
+ setStep({ kind: "uploading" });
32
+ const initial = tasks.length > 0 ? tasks : [
33
+ ...files.map((file, i) => ({ id: `art-${i}`, file, status: "pending", uri: null, error: null })),
34
+ ...draft.cover ? [{ id: "cover", file: draft.cover, status: "pending", uri: null, error: null }] : []
35
+ ];
36
+ const done = await uploadAll(initial, async (f) => (await uploadFileToIpfs(client.api, f, "image")).uri, setTasks);
37
+ setTasks(done);
38
+ if (done.some((t) => t.status !== "done")) {
39
+ setStep({ kind: "error", message: "Some files didn't upload. Retry to send only those." });
40
+ return;
41
+ }
42
+ const art = done.filter((t) => t.id.startsWith("art-"));
43
+ const metadata = buildDropMetadataFiles({
44
+ kind: draft.kind,
45
+ name: draft.name.trim(),
46
+ description: draft.description.trim(),
47
+ creator: app.walletAddress,
48
+ coverUri: done.find((t) => t.id === "cover")?.uri ?? null,
49
+ license: draft.license,
50
+ registrationDate: (/* @__PURE__ */ new Date()).toISOString().slice(0, 10),
51
+ items: draft.kind === "edition" ? [{ name: "", description: "", imageUri: art[0].uri }] : draft.items.map((it, i) => ({ name: it.name, description: it.description, imageUri: art[i].uri })),
52
+ supply: draftSupply(draft)
53
+ });
54
+ if (metadataBytes(metadata) > MAX_DROP_METADATA_BYTES) {
55
+ setStep({ kind: "error", message: "The descriptions are too long for this many tokens. Shorten them and try again." });
56
+ return;
57
+ }
58
+ uri = (await uploadDirectoryToIpfs(client.api, metadata)).baseUri;
59
+ setBaseUri(uri);
60
+ }
61
+ setStep({ kind: "launching" });
62
+ const signer = await app.getSigner();
63
+ const { collection } = await launchDrop({ client, provider: app.provider, signer }, {
64
+ owner: app.walletAddress,
65
+ name: draft.name.trim(),
66
+ symbol: draft.symbol,
67
+ baseUri: uri,
68
+ maxSupply: draftSupply(draft),
69
+ terms,
70
+ allowlistRoot: list?.root,
71
+ description: draft.description.trim() || void 0
72
+ });
73
+ let warning = null;
74
+ if (draft.gated.enabled) {
75
+ try {
76
+ await saveExclusiveContent(client, collection, draft.gated);
77
+ } catch {
78
+ warning = "Your drop launched, but the exclusive content wasn't saved. You can add it from Manage.";
79
+ }
80
+ }
81
+ setStep({ kind: "done", collection, links: list ? dropClaimLinks(window.location.origin, collection, list) : [], warning });
82
+ } catch (err) {
83
+ setStep({ kind: "error", message: describeError(err, "We couldn't launch your drop. Please try again.").message });
84
+ }
85
+ };
86
+ const close = () => {
87
+ if (step.kind === "uploading" || step.kind === "launching") return;
88
+ onClose();
89
+ };
90
+ return /* @__PURE__ */ jsx(ActionDialog, { open, onClose: close, children: /* @__PURE__ */ jsxs("div", { className: "space-y-5 p-6", children: [
91
+ step.kind === "review" && /* @__PURE__ */ jsxs(Fragment, { children: [
92
+ /* @__PURE__ */ jsx("h2", { className: "text-lg font-semibold", children: "Review and launch" }),
93
+ /* @__PURE__ */ jsxs("div", { className: "space-y-2 rounded-xl border border-border p-4 text-sm", children: [
94
+ /* @__PURE__ */ jsx("p", { className: "font-semibold", children: draft.name }),
95
+ /* @__PURE__ */ jsx("p", { className: "text-xs font-semibold uppercase tracking-widest text-muted-foreground", children: "Fixed after launch" }),
96
+ /* @__PURE__ */ jsx(Row, { label: "Price", value: priceLabel(terms.price, terms.paymentToken) }),
97
+ /* @__PURE__ */ jsx(Row, { label: "Supply", value: `${draftSupply(draft).toLocaleString("en-US")} ${draft.kind === "edition" ? "copies" : "items"}` }),
98
+ /* @__PURE__ */ jsx(Row, { label: "Starts", value: terms.startTime === 0 ? "At launch" : new Date(terms.startTime * 1e3).toLocaleString() }),
99
+ /* @__PURE__ */ jsx(Row, { label: "Ends", value: terms.endTime === 0 ? "No end date" : new Date(terms.endTime * 1e3).toLocaleString() }),
100
+ /* @__PURE__ */ jsx(Row, { label: "Per wallet", value: terms.maxPerWallet === "0" ? "No limit" : terms.maxPerWallet }),
101
+ /* @__PURE__ */ jsx(Row, { label: "Who can mint", value: list ? `${Object.keys(list.proofs).length} wallets on a list` : "Everyone" }),
102
+ /* @__PURE__ */ jsx("p", { className: "pt-1 text-xs text-muted-foreground", children: "The artwork and these terms can't be changed after launch. You can change the list later." })
103
+ ] }),
104
+ /* @__PURE__ */ jsx(GradientButton, { big: true, onClick: () => void run(), children: "Launch drop" })
105
+ ] }),
106
+ step.kind === "uploading" && /* @__PURE__ */ jsxs(Fragment, { children: [
107
+ /* @__PURE__ */ jsxs("h2", { className: "flex items-center gap-2 text-lg font-semibold", children: [
108
+ /* @__PURE__ */ jsx(Loader2, { className: "h-4 w-4 animate-spin" }),
109
+ "Uploading"
110
+ ] }),
111
+ /* @__PURE__ */ jsxs("p", { className: "text-sm text-muted-foreground", children: [
112
+ tasks.filter((t) => t.status === "done").length,
113
+ " of ",
114
+ tasks.length,
115
+ " files"
116
+ ] })
117
+ ] }),
118
+ step.kind === "launching" && /* @__PURE__ */ jsxs("h2", { className: "flex items-center gap-2 text-lg font-semibold", children: [
119
+ /* @__PURE__ */ jsx(Loader2, { className: "h-4 w-4 animate-spin" }),
120
+ "Launching your drop\u2026"
121
+ ] }),
122
+ step.kind === "error" && /* @__PURE__ */ jsxs(Fragment, { children: [
123
+ /* @__PURE__ */ jsxs("h2", { className: "flex items-center gap-2 text-lg font-semibold", children: [
124
+ /* @__PURE__ */ jsx(XCircle, { className: "h-4 w-4 text-destructive" }),
125
+ "Not launched"
126
+ ] }),
127
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: step.message }),
128
+ tasks.some((t) => t.status === "failed") && /* @__PURE__ */ jsx("ul", { className: "space-y-1 text-xs text-muted-foreground", children: tasks.filter((t) => t.status === "failed").map((t) => /* @__PURE__ */ jsxs("li", { children: [
129
+ t.file.name,
130
+ ": ",
131
+ t.error
132
+ ] }, t.id)) }),
133
+ /* @__PURE__ */ jsxs(Button, { onClick: () => void run(), className: "gap-1.5", children: [
134
+ /* @__PURE__ */ jsx(RotateCcw, { className: "h-3.5 w-3.5" }),
135
+ "Try again"
136
+ ] })
137
+ ] }),
138
+ step.kind === "done" && /* @__PURE__ */ jsxs(Fragment, { children: [
139
+ /* @__PURE__ */ jsxs("h2", { className: "flex items-center gap-2 text-lg font-semibold", children: [
140
+ /* @__PURE__ */ jsx(CheckCircle2, { className: "h-5 w-5 text-green-500" }),
141
+ "Your drop is live"
142
+ ] }),
143
+ step.warning && /* @__PURE__ */ jsx("p", { className: "text-sm text-brand-orange", children: step.warning }),
144
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-2", children: [
145
+ /* @__PURE__ */ jsx(ShareButton, { title: draft.name, url: `${window.location.origin}${dropHref(step.collection)}`, variant: "outline" }),
146
+ /* @__PURE__ */ jsx(Button, { asChild: true, variant: "outline", children: /* @__PURE__ */ jsx("a", { href: dropHref(step.collection), children: "View drop" }) }),
147
+ step.links.length > 0 && /* @__PURE__ */ jsx(Button, { variant: "outline", onClick: () => downloadCsv(popClaimLinksCsv(step.links), "claim-links.csv"), children: "Download claim links" })
148
+ ] }),
149
+ step.links.length > 0 && /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: "Send each wallet its link \u2014 the link is what lets it mint." })
150
+ ] })
151
+ ] }) });
152
+ }
153
+ function Row({ label, value }) {
154
+ return /* @__PURE__ */ jsxs("div", { className: "flex justify-between gap-3", children: [
155
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: label }),
156
+ /* @__PURE__ */ jsx("span", { className: "text-right font-medium", children: value })
157
+ ] });
158
+ }
159
+ function downloadCsv(csv, name) {
160
+ const href = URL.createObjectURL(new Blob([csv], { type: "text/csv" }));
161
+ Object.assign(document.createElement("a"), { href, download: name }).click();
162
+ URL.revokeObjectURL(href);
163
+ }
164
+ export {
165
+ LaunchDialog,
166
+ downloadCsv
167
+ };
168
+ //# sourceMappingURL=launch-dialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/drop/create/launch-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { CheckCircle2, Loader2, RotateCcw, XCircle } from \"lucide-react\";\nimport { dropHref } from \"@medialane/sdk\";\nimport { buildPopAllowlist, dropClaimLinks, popClaimLinksCsv, type PopClaimLink } from \"@medialane/sdk/starknet\";\nimport { ActionDialog } from \"../../action-dialog.js\";\nimport { GradientButton } from \"../../gradient-button.js\";\nimport { Button } from \"../../button.js\";\nimport { ShareButton } from \"../../share-button.js\";\nimport { describeError } from \"../../../utils/describe-error.js\";\nimport { uploadDirectoryToIpfs, uploadFileToIpfs } from \"../../../utils/ipfs-upload.js\";\nimport { parseAllowlist } from \"../../../utils/drop/allowlist.js\";\nimport { buildDropMetadataFiles, metadataBytes, MAX_DROP_METADATA_BYTES } from \"../../../utils/drop/metadata.js\";\nimport { toDropTerms, priceLabel } from \"../../../utils/drop/sale.js\";\nimport { draftSupply, type DropDraft } from \"../../../utils/drop/draft.js\";\nimport { uploadAll, type UploadTask } from \"../../../utils/drop/upload.js\";\nimport { launchDrop, saveExclusiveContent } from \"../../../utils/drop/actions.js\";\nimport type { DropAppProps } from \"../../../utils/drop/types.js\";\n\ntype Step =\n | { kind: \"review\" }\n | { kind: \"uploading\" }\n | { kind: \"launching\" }\n | { kind: \"done\"; collection: string; links: PopClaimLink[]; warning: string | null }\n | { kind: \"error\"; message: string };\n\nexport function LaunchDialog({ open, onClose, draft, app }: { open: boolean; onClose: () => void; draft: DropDraft; app: DropAppProps }) {\n const [step, setStep] = useState<Step>({ kind: \"review\" });\n const [tasks, setTasks] = useState<UploadTask[]>([]);\n const [baseUri, setBaseUri] = useState<string | null>(null);\n const client = app.getClient();\n const files = draft.kind === \"edition\" ? (draft.edition ? [draft.edition] : []) : draft.items.map((i) => i.file);\n const terms = toDropTerms(draft.sale);\n const list = draft.listOnly ? buildPopAllowlist(parseAllowlist(draft.allowlist).addresses) : null;\n\n const run = async () => {\n try {\n let uri = baseUri;\n if (!uri) {\n setStep({ kind: \"uploading\" });\n const initial = tasks.length > 0 ? tasks : [\n ...files.map((file, i) => ({ id: `art-${i}`, file, status: \"pending\" as const, uri: null, error: null })),\n ...(draft.cover ? [{ id: \"cover\", file: draft.cover, status: \"pending\" as const, uri: null, error: null }] : []),\n ];\n const done = await uploadAll(initial, async (f) => (await uploadFileToIpfs(client.api, f, \"image\")).uri, setTasks);\n setTasks(done);\n if (done.some((t) => t.status !== \"done\")) {\n setStep({ kind: \"error\", message: \"Some files didn't upload. Retry to send only those.\" });\n return;\n }\n const art = done.filter((t) => t.id.startsWith(\"art-\"));\n const metadata = buildDropMetadataFiles({\n kind: draft.kind,\n name: draft.name.trim(),\n description: draft.description.trim(),\n creator: app.walletAddress!,\n coverUri: done.find((t) => t.id === \"cover\")?.uri ?? null,\n license: draft.license,\n registrationDate: new Date().toISOString().slice(0, 10),\n items: draft.kind === \"edition\"\n ? [{ name: \"\", description: \"\", imageUri: art[0]!.uri! }]\n : draft.items.map((it, i) => ({ name: it.name, description: it.description, imageUri: art[i]!.uri! })),\n supply: draftSupply(draft),\n });\n if (metadataBytes(metadata) > MAX_DROP_METADATA_BYTES) {\n setStep({ kind: \"error\", message: \"The descriptions are too long for this many tokens. Shorten them and try again.\" });\n return;\n }\n uri = (await uploadDirectoryToIpfs(client.api, metadata)).baseUri;\n setBaseUri(uri);\n }\n setStep({ kind: \"launching\" });\n const signer = await app.getSigner();\n const { collection } = await launchDrop({ client, provider: app.provider, signer }, {\n owner: app.walletAddress!,\n name: draft.name.trim(),\n symbol: draft.symbol,\n baseUri: uri!,\n maxSupply: draftSupply(draft),\n terms,\n allowlistRoot: list?.root,\n description: draft.description.trim() || undefined,\n });\n let warning: string | null = null;\n if (draft.gated.enabled) {\n try {\n await saveExclusiveContent(client, collection, draft.gated);\n } catch {\n warning = \"Your drop launched, but the exclusive content wasn't saved. You can add it from Manage.\";\n }\n }\n setStep({ kind: \"done\", collection, links: list ? dropClaimLinks(window.location.origin, collection, list) : [], warning });\n } catch (err) {\n setStep({ kind: \"error\", message: describeError(err, \"We couldn't launch your drop. Please try again.\").message });\n }\n };\n\n const close = () => {\n if (step.kind === \"uploading\" || step.kind === \"launching\") return;\n onClose();\n };\n\n return (\n <ActionDialog open={open} onClose={close}>\n <div className=\"space-y-5 p-6\">\n {step.kind === \"review\" && (\n <>\n <h2 className=\"text-lg font-semibold\">Review and launch</h2>\n <div className=\"space-y-2 rounded-xl border border-border p-4 text-sm\">\n <p className=\"font-semibold\">{draft.name}</p>\n <p className=\"text-xs font-semibold uppercase tracking-widest text-muted-foreground\">Fixed after launch</p>\n <Row label=\"Price\" value={priceLabel(terms.price, terms.paymentToken)} />\n <Row label=\"Supply\" value={`${draftSupply(draft).toLocaleString(\"en-US\")} ${draft.kind === \"edition\" ? \"copies\" : \"items\"}`} />\n <Row label=\"Starts\" value={terms.startTime === 0 ? \"At launch\" : new Date(terms.startTime * 1000).toLocaleString()} />\n <Row label=\"Ends\" value={terms.endTime === 0 ? \"No end date\" : new Date(terms.endTime * 1000).toLocaleString()} />\n <Row label=\"Per wallet\" value={terms.maxPerWallet === \"0\" ? \"No limit\" : terms.maxPerWallet} />\n <Row label=\"Who can mint\" value={list ? `${Object.keys(list.proofs).length} wallets on a list` : \"Everyone\"} />\n <p className=\"pt-1 text-xs text-muted-foreground\">The artwork and these terms can't be changed after launch. You can change the list later.</p>\n </div>\n <GradientButton big onClick={() => void run()}>Launch drop</GradientButton>\n </>\n )}\n {step.kind === \"uploading\" && (\n <>\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><Loader2 className=\"h-4 w-4 animate-spin\" />Uploading</h2>\n <p className=\"text-sm text-muted-foreground\">{tasks.filter((t) => t.status === \"done\").length} of {tasks.length} files</p>\n </>\n )}\n {step.kind === \"launching\" && (\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><Loader2 className=\"h-4 w-4 animate-spin\" />Launching your drop…</h2>\n )}\n {step.kind === \"error\" && (\n <>\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><XCircle className=\"h-4 w-4 text-destructive\" />Not launched</h2>\n <p className=\"text-sm text-muted-foreground\">{step.message}</p>\n {tasks.some((t) => t.status === \"failed\") && (\n <ul className=\"space-y-1 text-xs text-muted-foreground\">\n {tasks.filter((t) => t.status === \"failed\").map((t) => <li key={t.id}>{t.file.name}: {t.error}</li>)}\n </ul>\n )}\n <Button onClick={() => void run()} className=\"gap-1.5\"><RotateCcw className=\"h-3.5 w-3.5\" />Try again</Button>\n </>\n )}\n {step.kind === \"done\" && (\n <>\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><CheckCircle2 className=\"h-5 w-5 text-green-500\" />Your drop is live</h2>\n {step.warning && <p className=\"text-sm text-brand-orange\">{step.warning}</p>}\n <div className=\"flex flex-wrap gap-2\">\n <ShareButton title={draft.name} url={`${window.location.origin}${dropHref(step.collection)}`} variant=\"outline\" />\n <Button asChild variant=\"outline\"><a href={dropHref(step.collection)}>View drop</a></Button>\n {step.links.length > 0 && (\n <Button variant=\"outline\" onClick={() => downloadCsv(popClaimLinksCsv(step.links), \"claim-links.csv\")}>Download claim links</Button>\n )}\n </div>\n {step.links.length > 0 && <p className=\"text-xs text-muted-foreground\">Send each wallet its link — the link is what lets it mint.</p>}\n </>\n )}\n </div>\n </ActionDialog>\n );\n}\n\nfunction Row({ label, value }: { label: string; value: string }) {\n return <div className=\"flex justify-between gap-3\"><span className=\"text-muted-foreground\">{label}</span><span className=\"text-right font-medium\">{value}</span></div>;\n}\n\nexport function downloadCsv(csv: string, name: string) {\n const href = URL.createObjectURL(new Blob([csv], { type: \"text/csv\" }));\n Object.assign(document.createElement(\"a\"), { href, download: name }).click();\n URL.revokeObjectURL(href);\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ "use client";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+ var list_section_exports = {};
21
+ __export(list_section_exports, {
22
+ ListSection: () => ListSection
23
+ });
24
+ module.exports = __toCommonJS(list_section_exports);
25
+ var import_jsx_runtime = require("react/jsx-runtime");
26
+ var import_lucide_react = require("lucide-react");
27
+ var import_textarea = require("../../textarea.js");
28
+ var import_create_form_primitives = require("../../create-form-primitives.js");
29
+ var import_allowlist = require("../../../utils/drop/allowlist.js");
30
+ var import_artwork_section = require("./artwork-section.js");
31
+ function ListSection({ draft, setDraft, errors }) {
32
+ const parsed = draft.listOnly ? (0, import_allowlist.parseAllowlist)(draft.allowlist) : null;
33
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_create_form_primitives.Section, { title: "Who can mint", icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Users, { className: "h-4 w-4" }), children: [
34
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_create_form_primitives.ToggleGroup, { value: draft.listOnly ? "A list" : "Everyone", options: ["Everyone", "A list"], onChange: (v) => setDraft({ listOnly: v === "A list" }) }),
35
+ draft.listOnly && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-2", children: [
36
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_textarea.Textarea, { rows: 6, placeholder: "Paste wallet addresses, one per line", value: draft.allowlist, onChange: (e) => setDraft({ allowlist: e.target.value }) }),
37
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("label", { className: "inline-block cursor-pointer text-xs font-semibold text-primary", children: [
38
+ "Upload a CSV",
39
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
40
+ "input",
41
+ {
42
+ type: "file",
43
+ accept: ".csv,text/csv,text/plain",
44
+ className: "hidden",
45
+ onChange: async (e) => {
46
+ const f = e.target.files?.[0];
47
+ if (f) setDraft({ allowlist: await f.text() });
48
+ }
49
+ }
50
+ )
51
+ ] }),
52
+ parsed && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", { className: "text-xs text-muted-foreground", children: [
53
+ parsed.addresses.length,
54
+ " wallet",
55
+ parsed.addresses.length === 1 ? "" : "s",
56
+ parsed.duplicates.length > 0 && ` \xB7 ${parsed.duplicates.length} duplicate${parsed.duplicates.length === 1 ? "" : "s"} skipped`
57
+ ] }),
58
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-xs text-muted-foreground", children: "After launch you get a claim link for each wallet to share." }),
59
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_artwork_section.FieldError, { message: errors.allowlist })
60
+ ] })
61
+ ] });
62
+ }
63
+ // Annotate the CommonJS export names for ESM import in node:
64
+ 0 && (module.exports = {
65
+ ListSection
66
+ });
67
+ //# sourceMappingURL=list-section.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/drop/create/list-section.tsx"],"sourcesContent":["\"use client\";\n\nimport { Users } from \"lucide-react\";\nimport { Textarea } from \"../../textarea.js\";\nimport { Section, ToggleGroup } from \"../../create-form-primitives.js\";\nimport { parseAllowlist } from \"../../../utils/drop/allowlist.js\";\nimport { FieldError, type SectionProps } from \"./artwork-section.js\";\n\nexport function ListSection({ draft, setDraft, errors }: SectionProps) {\n const parsed = draft.listOnly ? parseAllowlist(draft.allowlist) : null;\n return (\n <Section title=\"Who can mint\" icon={<Users className=\"h-4 w-4\" />}>\n <ToggleGroup value={draft.listOnly ? \"A list\" : \"Everyone\"} options={[\"Everyone\", \"A list\"]} onChange={(v) => setDraft({ listOnly: v === \"A list\" })} />\n {draft.listOnly && (\n <div className=\"space-y-2\">\n <Textarea rows={6} placeholder=\"Paste wallet addresses, one per line\" value={draft.allowlist} onChange={(e) => setDraft({ allowlist: e.target.value })} />\n <label className=\"inline-block cursor-pointer text-xs font-semibold text-primary\">\n Upload a CSV\n <input type=\"file\" accept=\".csv,text/csv,text/plain\" className=\"hidden\"\n onChange={async (e) => { const f = e.target.files?.[0]; if (f) setDraft({ allowlist: await f.text() }); }} />\n </label>\n {parsed && (\n <p className=\"text-xs text-muted-foreground\">\n {parsed.addresses.length} wallet{parsed.addresses.length === 1 ? \"\" : \"s\"}\n {parsed.duplicates.length > 0 && ` · ${parsed.duplicates.length} duplicate${parsed.duplicates.length === 1 ? \"\" : \"s\"} skipped`}\n </p>\n )}\n <p className=\"text-xs text-muted-foreground\">After launch you get a claim link for each wallet to share.</p>\n <FieldError message={errors.allowlist} />\n </div>\n )}\n </Section>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWwC;AATxC,0BAAsB;AACtB,sBAAyB;AACzB,oCAAqC;AACrC,uBAA+B;AAC/B,6BAA8C;AAEvC,SAAS,YAAY,EAAE,OAAO,UAAU,OAAO,GAAiB;AACrE,QAAM,SAAS,MAAM,eAAW,iCAAe,MAAM,SAAS,IAAI;AAClE,SACE,6CAAC,yCAAQ,OAAM,gBAAe,MAAM,4CAAC,6BAAM,WAAU,WAAU,GAC7D;AAAA,gDAAC,6CAAY,OAAO,MAAM,WAAW,WAAW,YAAY,SAAS,CAAC,YAAY,QAAQ,GAAG,UAAU,CAAC,MAAM,SAAS,EAAE,UAAU,MAAM,SAAS,CAAC,GAAG;AAAA,IACrJ,MAAM,YACL,6CAAC,SAAI,WAAU,aACb;AAAA,kDAAC,4BAAS,MAAM,GAAG,aAAY,wCAAuC,OAAO,MAAM,WAAW,UAAU,CAAC,MAAM,SAAS,EAAE,WAAW,EAAE,OAAO,MAAM,CAAC,GAAG;AAAA,MACxJ,6CAAC,WAAM,WAAU,kEAAiE;AAAA;AAAA,QAEhF;AAAA,UAAC;AAAA;AAAA,YAAM,MAAK;AAAA,YAAO,QAAO;AAAA,YAA2B,WAAU;AAAA,YAC7D,UAAU,OAAO,MAAM;AAAE,oBAAM,IAAI,EAAE,OAAO,QAAQ,CAAC;AAAG,kBAAI,EAAG,UAAS,EAAE,WAAW,MAAM,EAAE,KAAK,EAAE,CAAC;AAAA,YAAG;AAAA;AAAA,QAAG;AAAA,SAC/G;AAAA,MACC,UACC,6CAAC,OAAE,WAAU,iCACV;AAAA,eAAO,UAAU;AAAA,QAAO;AAAA,QAAQ,OAAO,UAAU,WAAW,IAAI,KAAK;AAAA,QACrE,OAAO,WAAW,SAAS,KAAK,SAAM,OAAO,WAAW,MAAM,aAAa,OAAO,WAAW,WAAW,IAAI,KAAK,GAAG;AAAA,SACvH;AAAA,MAEF,4CAAC,OAAE,WAAU,iCAAgC,yEAA2D;AAAA,MACxG,4CAAC,qCAAW,SAAS,OAAO,WAAW;AAAA,OACzC;AAAA,KAEJ;AAEJ;","names":[]}
@@ -0,0 +1,11 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { SectionProps } from './artwork-section.cjs';
3
+ import '../../../utils/drop/draft.cjs';
4
+ import '../../drop-item-list.cjs';
5
+ import '../../../utils/drop/metadata.cjs';
6
+ import '@medialane/sdk';
7
+ import '../../../utils/drop/sale.cjs';
8
+
9
+ declare function ListSection({ draft, setDraft, errors }: SectionProps): react_jsx_runtime.JSX.Element;
10
+
11
+ export { ListSection };
@@ -0,0 +1,11 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { SectionProps } from './artwork-section.js';
3
+ import '../../../utils/drop/draft.js';
4
+ import '../../drop-item-list.js';
5
+ import '../../../utils/drop/metadata.js';
6
+ import '@medialane/sdk';
7
+ import '../../../utils/drop/sale.js';
8
+
9
+ declare function ListSection({ draft, setDraft, errors }: SectionProps): react_jsx_runtime.JSX.Element;
10
+
11
+ export { ListSection };
@@ -0,0 +1,43 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { Users } from "lucide-react";
4
+ import { Textarea } from "../../textarea.js";
5
+ import { Section, ToggleGroup } from "../../create-form-primitives.js";
6
+ import { parseAllowlist } from "../../../utils/drop/allowlist.js";
7
+ import { FieldError } from "./artwork-section.js";
8
+ function ListSection({ draft, setDraft, errors }) {
9
+ const parsed = draft.listOnly ? parseAllowlist(draft.allowlist) : null;
10
+ return /* @__PURE__ */ jsxs(Section, { title: "Who can mint", icon: /* @__PURE__ */ jsx(Users, { className: "h-4 w-4" }), children: [
11
+ /* @__PURE__ */ jsx(ToggleGroup, { value: draft.listOnly ? "A list" : "Everyone", options: ["Everyone", "A list"], onChange: (v) => setDraft({ listOnly: v === "A list" }) }),
12
+ draft.listOnly && /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
13
+ /* @__PURE__ */ jsx(Textarea, { rows: 6, placeholder: "Paste wallet addresses, one per line", value: draft.allowlist, onChange: (e) => setDraft({ allowlist: e.target.value }) }),
14
+ /* @__PURE__ */ jsxs("label", { className: "inline-block cursor-pointer text-xs font-semibold text-primary", children: [
15
+ "Upload a CSV",
16
+ /* @__PURE__ */ jsx(
17
+ "input",
18
+ {
19
+ type: "file",
20
+ accept: ".csv,text/csv,text/plain",
21
+ className: "hidden",
22
+ onChange: async (e) => {
23
+ const f = e.target.files?.[0];
24
+ if (f) setDraft({ allowlist: await f.text() });
25
+ }
26
+ }
27
+ )
28
+ ] }),
29
+ parsed && /* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground", children: [
30
+ parsed.addresses.length,
31
+ " wallet",
32
+ parsed.addresses.length === 1 ? "" : "s",
33
+ parsed.duplicates.length > 0 && ` \xB7 ${parsed.duplicates.length} duplicate${parsed.duplicates.length === 1 ? "" : "s"} skipped`
34
+ ] }),
35
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: "After launch you get a claim link for each wallet to share." }),
36
+ /* @__PURE__ */ jsx(FieldError, { message: errors.allowlist })
37
+ ] })
38
+ ] });
39
+ }
40
+ export {
41
+ ListSection
42
+ };
43
+ //# sourceMappingURL=list-section.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/drop/create/list-section.tsx"],"sourcesContent":["\"use client\";\n\nimport { Users } from \"lucide-react\";\nimport { Textarea } from \"../../textarea.js\";\nimport { Section, ToggleGroup } from \"../../create-form-primitives.js\";\nimport { parseAllowlist } from \"../../../utils/drop/allowlist.js\";\nimport { FieldError, type SectionProps } from \"./artwork-section.js\";\n\nexport function ListSection({ draft, setDraft, errors }: SectionProps) {\n const parsed = draft.listOnly ? parseAllowlist(draft.allowlist) : null;\n return (\n <Section title=\"Who can mint\" icon={<Users className=\"h-4 w-4\" />}>\n <ToggleGroup value={draft.listOnly ? \"A list\" : \"Everyone\"} options={[\"Everyone\", \"A list\"]} onChange={(v) => setDraft({ listOnly: v === \"A list\" })} />\n {draft.listOnly && (\n <div className=\"space-y-2\">\n <Textarea rows={6} placeholder=\"Paste wallet addresses, one per line\" value={draft.allowlist} onChange={(e) => setDraft({ allowlist: e.target.value })} />\n <label className=\"inline-block cursor-pointer text-xs font-semibold text-primary\">\n Upload a CSV\n <input type=\"file\" accept=\".csv,text/csv,text/plain\" className=\"hidden\"\n onChange={async (e) => { const f = e.target.files?.[0]; if (f) setDraft({ allowlist: await f.text() }); }} />\n </label>\n {parsed && (\n <p className=\"text-xs text-muted-foreground\">\n {parsed.addresses.length} wallet{parsed.addresses.length === 1 ? \"\" : \"s\"}\n {parsed.duplicates.length > 0 && ` · ${parsed.duplicates.length} duplicate${parsed.duplicates.length === 1 ? \"\" : \"s\"} skipped`}\n </p>\n )}\n <p className=\"text-xs text-muted-foreground\">After launch you get a claim link for each wallet to share.</p>\n <FieldError message={errors.allowlist} />\n </div>\n )}\n </Section>\n );\n}\n"],"mappings":";AAWwC,cAK9B,YAL8B;AATxC,SAAS,aAAa;AACtB,SAAS,gBAAgB;AACzB,SAAS,SAAS,mBAAmB;AACrC,SAAS,sBAAsB;AAC/B,SAAS,kBAAqC;AAEvC,SAAS,YAAY,EAAE,OAAO,UAAU,OAAO,GAAiB;AACrE,QAAM,SAAS,MAAM,WAAW,eAAe,MAAM,SAAS,IAAI;AAClE,SACE,qBAAC,WAAQ,OAAM,gBAAe,MAAM,oBAAC,SAAM,WAAU,WAAU,GAC7D;AAAA,wBAAC,eAAY,OAAO,MAAM,WAAW,WAAW,YAAY,SAAS,CAAC,YAAY,QAAQ,GAAG,UAAU,CAAC,MAAM,SAAS,EAAE,UAAU,MAAM,SAAS,CAAC,GAAG;AAAA,IACrJ,MAAM,YACL,qBAAC,SAAI,WAAU,aACb;AAAA,0BAAC,YAAS,MAAM,GAAG,aAAY,wCAAuC,OAAO,MAAM,WAAW,UAAU,CAAC,MAAM,SAAS,EAAE,WAAW,EAAE,OAAO,MAAM,CAAC,GAAG;AAAA,MACxJ,qBAAC,WAAM,WAAU,kEAAiE;AAAA;AAAA,QAEhF;AAAA,UAAC;AAAA;AAAA,YAAM,MAAK;AAAA,YAAO,QAAO;AAAA,YAA2B,WAAU;AAAA,YAC7D,UAAU,OAAO,MAAM;AAAE,oBAAM,IAAI,EAAE,OAAO,QAAQ,CAAC;AAAG,kBAAI,EAAG,UAAS,EAAE,WAAW,MAAM,EAAE,KAAK,EAAE,CAAC;AAAA,YAAG;AAAA;AAAA,QAAG;AAAA,SAC/G;AAAA,MACC,UACC,qBAAC,OAAE,WAAU,iCACV;AAAA,eAAO,UAAU;AAAA,QAAO;AAAA,QAAQ,OAAO,UAAU,WAAW,IAAI,KAAK;AAAA,QACrE,OAAO,WAAW,SAAS,KAAK,SAAM,OAAO,WAAW,MAAM,aAAa,OAAO,WAAW,WAAW,IAAI,KAAK,GAAG;AAAA,SACvH;AAAA,MAEF,oBAAC,OAAE,WAAU,iCAAgC,yEAA2D;AAAA,MACxG,oBAAC,cAAW,SAAS,OAAO,WAAW;AAAA,OACzC;AAAA,KAEJ;AAEJ;","names":[]}
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ "use client";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+ var sale_section_exports = {};
21
+ __export(sale_section_exports, {
22
+ SaleSection: () => SaleSection
23
+ });
24
+ module.exports = __toCommonJS(sale_section_exports);
25
+ var import_jsx_runtime = require("react/jsx-runtime");
26
+ var import_lucide_react = require("lucide-react");
27
+ var import_sdk = require("@medialane/sdk");
28
+ var import_input = require("../../input.js");
29
+ var import_switch = require("../../switch.js");
30
+ var import_create_form_primitives = require("../../create-form-primitives.js");
31
+ var import_select = require("../../select.js");
32
+ var import_sale = require("../../../utils/drop/sale.js");
33
+ var import_artwork_section = require("./artwork-section.js");
34
+ function SaleSection({ draft, setDraft, errors, feeConfig }) {
35
+ const sale = draft.sale;
36
+ const set = (patch) => setDraft({ sale: { ...sale, ...patch } });
37
+ const line = (0, import_sale.collectorPriceLine)(sale, feeConfig);
38
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_create_form_primitives.Section, { title: "Sale", icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Tag, { className: "h-4 w-4" }), children: [
39
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_create_form_primitives.ToggleGroup, { value: sale.paid ? "Paid" : "Free", options: ["Free", "Paid"], onChange: (v) => set({ paid: v === "Paid" }) }),
40
+ sale.paid && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-1.5", children: [
41
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex gap-2", children: [
42
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_input.Input, { inputMode: "decimal", placeholder: "Price per token", value: sale.price, onChange: (e) => set({ price: e.target.value.trim() }) }),
43
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_select.Select, { value: sale.tokenSymbol, onValueChange: (v) => set({ tokenSymbol: v }), children: [
44
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_select.SelectTrigger, { className: "w-28", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_select.SelectValue, {}) }),
45
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_select.SelectContent, { children: (0, import_sdk.getListableTokens)().map((t) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_select.SelectItem, { value: t.symbol, children: t.symbol }, t.symbol)) })
46
+ ] })
47
+ ] }),
48
+ line && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-xs text-muted-foreground", children: line }),
49
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_artwork_section.FieldError, { message: errors.price })
50
+ ] }),
51
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Toggle, { label: "Starts now", checked: sale.startNow, onChange: (v) => set({ startNow: v }) }),
52
+ !sale.startNow && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-1.5", children: [
53
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_input.Input, { type: "datetime-local", value: sale.start, onChange: (e) => set({ start: e.target.value }) }),
54
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_artwork_section.FieldError, { message: errors.start })
55
+ ] }),
56
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Toggle, { label: "Has an end date", checked: sale.hasEnd, onChange: (v) => set({ hasEnd: v }) }),
57
+ sale.hasEnd && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-1.5", children: [
58
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_input.Input, { type: "datetime-local", value: sale.end, onChange: (e) => set({ end: e.target.value }) }),
59
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_artwork_section.FieldError, { message: errors.end })
60
+ ] }),
61
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Toggle, { label: "Limit per wallet", checked: sale.limitPerWallet, onChange: (v) => set({ limitPerWallet: v }) }),
62
+ sale.limitPerWallet && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-1.5", children: [
63
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_input.Input, { inputMode: "numeric", className: "max-w-[10rem]", value: sale.perWallet, onChange: (e) => set({ perWallet: e.target.value.trim() }) }),
64
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_artwork_section.FieldError, { message: errors.perWallet })
65
+ ] })
66
+ ] });
67
+ }
68
+ function Toggle({ label, checked, onChange }) {
69
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center justify-between", children: [
70
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-sm", children: label }),
71
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_switch.Switch, { checked, onCheckedChange: onChange })
72
+ ] });
73
+ }
74
+ // Annotate the CommonJS export names for ESM import in node:
75
+ 0 && (module.exports = {
76
+ SaleSection
77
+ });
78
+ //# sourceMappingURL=sale-section.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/drop/create/sale-section.tsx"],"sourcesContent":["\"use client\";\n\nimport { Tag } from \"lucide-react\";\nimport { getListableTokens, type ResolvedFeeConfig } from \"@medialane/sdk\";\nimport { Input } from \"../../input.js\";\nimport { Switch } from \"../../switch.js\";\nimport { Section, ToggleGroup } from \"../../create-form-primitives.js\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../../select.js\";\nimport { collectorPriceLine, type SaleDraft } from \"../../../utils/drop/sale.js\";\nimport { FieldError, type SectionProps } from \"./artwork-section.js\";\n\nexport function SaleSection({ draft, setDraft, errors, feeConfig }: SectionProps & { feeConfig: ResolvedFeeConfig }) {\n const sale = draft.sale;\n const set = (patch: Partial<SaleDraft>) => setDraft({ sale: { ...sale, ...patch } });\n const line = collectorPriceLine(sale, feeConfig);\n return (\n <Section title=\"Sale\" icon={<Tag className=\"h-4 w-4\" />}>\n <ToggleGroup value={sale.paid ? \"Paid\" : \"Free\"} options={[\"Free\", \"Paid\"]} onChange={(v) => set({ paid: v === \"Paid\" })} />\n {sale.paid && (\n <div className=\"space-y-1.5\">\n <div className=\"flex gap-2\">\n <Input inputMode=\"decimal\" placeholder=\"Price per token\" value={sale.price} onChange={(e) => set({ price: e.target.value.trim() })} />\n <Select value={sale.tokenSymbol} onValueChange={(v) => set({ tokenSymbol: v })}>\n <SelectTrigger className=\"w-28\"><SelectValue /></SelectTrigger>\n <SelectContent>{getListableTokens().map((t) => <SelectItem key={t.symbol} value={t.symbol}>{t.symbol}</SelectItem>)}</SelectContent>\n </Select>\n </div>\n {line && <p className=\"text-xs text-muted-foreground\">{line}</p>}\n <FieldError message={errors.price} />\n </div>\n )}\n <Toggle label=\"Starts now\" checked={sale.startNow} onChange={(v) => set({ startNow: v })} />\n {!sale.startNow && (\n <div className=\"space-y-1.5\">\n <Input type=\"datetime-local\" value={sale.start} onChange={(e) => set({ start: e.target.value })} />\n <FieldError message={errors.start} />\n </div>\n )}\n <Toggle label=\"Has an end date\" checked={sale.hasEnd} onChange={(v) => set({ hasEnd: v })} />\n {sale.hasEnd && (\n <div className=\"space-y-1.5\">\n <Input type=\"datetime-local\" value={sale.end} onChange={(e) => set({ end: e.target.value })} />\n <FieldError message={errors.end} />\n </div>\n )}\n <Toggle label=\"Limit per wallet\" checked={sale.limitPerWallet} onChange={(v) => set({ limitPerWallet: v })} />\n {sale.limitPerWallet && (\n <div className=\"space-y-1.5\">\n <Input inputMode=\"numeric\" className=\"max-w-[10rem]\" value={sale.perWallet} onChange={(e) => set({ perWallet: e.target.value.trim() })} />\n <FieldError message={errors.perWallet} />\n </div>\n )}\n </Section>\n );\n}\n\nfunction Toggle({ label, checked, onChange }: { label: string; checked: boolean; onChange: (v: boolean) => void }) {\n return (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm\">{label}</span>\n <Switch checked={checked} onCheckedChange={onChange} />\n </div>\n );\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,13 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ResolvedFeeConfig } from '@medialane/sdk';
3
+ import { SectionProps } from './artwork-section.cjs';
4
+ import '../../../utils/drop/draft.cjs';
5
+ import '../../drop-item-list.cjs';
6
+ import '../../../utils/drop/metadata.cjs';
7
+ import '../../../utils/drop/sale.cjs';
8
+
9
+ declare function SaleSection({ draft, setDraft, errors, feeConfig }: SectionProps & {
10
+ feeConfig: ResolvedFeeConfig;
11
+ }): react_jsx_runtime.JSX.Element;
12
+
13
+ export { SaleSection };
@@ -0,0 +1,13 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ResolvedFeeConfig } from '@medialane/sdk';
3
+ import { SectionProps } from './artwork-section.js';
4
+ import '../../../utils/drop/draft.js';
5
+ import '../../drop-item-list.js';
6
+ import '../../../utils/drop/metadata.js';
7
+ import '../../../utils/drop/sale.js';
8
+
9
+ declare function SaleSection({ draft, setDraft, errors, feeConfig }: SectionProps & {
10
+ feeConfig: ResolvedFeeConfig;
11
+ }): react_jsx_runtime.JSX.Element;
12
+
13
+ export { SaleSection };