@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/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 };