@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.
- package/dist/components/drop/create/artwork-section.cjs +115 -0
- package/dist/components/drop/create/artwork-section.cjs.map +1 -0
- package/dist/components/drop/create/artwork-section.d.cts +23 -0
- package/dist/components/drop/create/artwork-section.d.ts +23 -0
- package/dist/components/drop/create/artwork-section.js +79 -0
- package/dist/components/drop/create/artwork-section.js.map +1 -0
- package/dist/components/drop/create/details-section.cjs +110 -0
- package/dist/components/drop/create/details-section.cjs.map +1 -0
- package/dist/components/drop/create/details-section.d.cts +11 -0
- package/dist/components/drop/create/details-section.d.ts +11 -0
- package/dist/components/drop/create/details-section.js +86 -0
- package/dist/components/drop/create/details-section.js.map +1 -0
- package/dist/components/drop/create/drop-create.cjs +112 -0
- package/dist/components/drop/create/drop-create.cjs.map +1 -0
- package/dist/components/drop/create/drop-create.d.cts +22 -0
- package/dist/components/drop/create/drop-create.d.ts +22 -0
- package/dist/components/drop/create/drop-create.js +77 -0
- package/dist/components/drop/create/drop-create.js.map +1 -0
- package/dist/components/drop/create/exclusive-fields.cjs +45 -0
- package/dist/components/drop/create/exclusive-fields.cjs.map +1 -0
- package/dist/components/drop/create/exclusive-fields.d.cts +14 -0
- package/dist/components/drop/create/exclusive-fields.d.ts +14 -0
- package/dist/components/drop/create/exclusive-fields.js +21 -0
- package/dist/components/drop/create/exclusive-fields.js.map +1 -0
- package/dist/components/drop/create/launch-dialog.cjs +193 -0
- package/dist/components/drop/create/launch-dialog.cjs.map +1 -0
- package/dist/components/drop/create/launch-dialog.d.cts +21 -0
- package/dist/components/drop/create/launch-dialog.d.ts +21 -0
- package/dist/components/drop/create/launch-dialog.js +168 -0
- package/dist/components/drop/create/launch-dialog.js.map +1 -0
- package/dist/components/drop/create/list-section.cjs +67 -0
- package/dist/components/drop/create/list-section.cjs.map +1 -0
- package/dist/components/drop/create/list-section.d.cts +11 -0
- package/dist/components/drop/create/list-section.d.ts +11 -0
- package/dist/components/drop/create/list-section.js +43 -0
- package/dist/components/drop/create/list-section.js.map +1 -0
- package/dist/components/drop/create/sale-section.cjs +78 -0
- package/dist/components/drop/create/sale-section.cjs.map +1 -0
- package/dist/components/drop/create/sale-section.d.cts +13 -0
- package/dist/components/drop/create/sale-section.d.ts +13 -0
- package/dist/components/drop/create/sale-section.js +54 -0
- package/dist/components/drop/create/sale-section.js.map +1 -0
- package/dist/components/drop/drop-card.cjs +81 -0
- package/dist/components/drop/drop-card.cjs.map +1 -0
- package/dist/components/drop/drop-card.d.cts +18 -0
- package/dist/components/drop/drop-card.d.ts +18 -0
- package/dist/components/drop/drop-card.js +45 -0
- package/dist/components/drop/drop-card.js.map +1 -0
- package/dist/components/drop/drop-listing.cjs +79 -0
- package/dist/components/drop/drop-listing.cjs.map +1 -0
- package/dist/components/drop/drop-listing.d.cts +10 -0
- package/dist/components/drop/drop-listing.d.ts +10 -0
- package/dist/components/drop/drop-listing.js +45 -0
- package/dist/components/drop/drop-listing.js.map +1 -0
- package/dist/components/drop/drop-token-link.cjs +63 -0
- package/dist/components/drop/drop-token-link.cjs.map +1 -0
- package/dist/components/drop/drop-token-link.d.cts +9 -0
- package/dist/components/drop/drop-token-link.d.ts +9 -0
- package/dist/components/drop/drop-token-link.js +29 -0
- package/dist/components/drop/drop-token-link.js.map +1 -0
- package/dist/components/drop/my-drops.cjs +71 -0
- package/dist/components/drop/my-drops.cjs.map +1 -0
- package/dist/components/drop/my-drops.d.cts +12 -0
- package/dist/components/drop/my-drops.d.ts +12 -0
- package/dist/components/drop/my-drops.js +37 -0
- package/dist/components/drop/my-drops.js.map +1 -0
- package/dist/components/drop/page/drop-action-box.cjs +63 -0
- package/dist/components/drop/page/drop-action-box.cjs.map +1 -0
- package/dist/components/drop/page/drop-action-box.d.cts +16 -0
- package/dist/components/drop/page/drop-action-box.d.ts +16 -0
- package/dist/components/drop/page/drop-action-box.js +39 -0
- package/dist/components/drop/page/drop-action-box.js.map +1 -0
- package/dist/components/drop/page/drop-activity.cjs +42 -0
- package/dist/components/drop/page/drop-activity.cjs.map +1 -0
- package/dist/components/drop/page/drop-activity.d.cts +8 -0
- package/dist/components/drop/page/drop-activity.d.ts +8 -0
- package/dist/components/drop/page/drop-activity.js +18 -0
- package/dist/components/drop/page/drop-activity.js.map +1 -0
- package/dist/components/drop/page/drop-manage.cjs +161 -0
- package/dist/components/drop/page/drop-manage.cjs.map +1 -0
- package/dist/components/drop/page/drop-manage.d.cts +24 -0
- package/dist/components/drop/page/drop-manage.d.ts +24 -0
- package/dist/components/drop/page/drop-manage.js +137 -0
- package/dist/components/drop/page/drop-manage.js.map +1 -0
- package/dist/components/drop/page/drop-mint-dialog.cjs +97 -0
- package/dist/components/drop/page/drop-mint-dialog.cjs.map +1 -0
- package/dist/components/drop/page/drop-mint-dialog.d.cts +15 -0
- package/dist/components/drop/page/drop-mint-dialog.d.ts +15 -0
- package/dist/components/drop/page/drop-mint-dialog.js +73 -0
- package/dist/components/drop/page/drop-mint-dialog.js.map +1 -0
- package/dist/components/drop/page/drop-page.cjs +165 -0
- package/dist/components/drop/page/drop-page.cjs.map +1 -0
- package/dist/components/drop/page/drop-page.d.cts +16 -0
- package/dist/components/drop/page/drop-page.d.ts +16 -0
- package/dist/components/drop/page/drop-page.js +131 -0
- package/dist/components/drop/page/drop-page.js.map +1 -0
- package/dist/components/drop-status-display.cjs +7 -38
- package/dist/components/drop-status-display.cjs.map +1 -1
- package/dist/components/drop-status-display.d.cts +6 -7
- package/dist/components/drop-status-display.d.ts +6 -7
- package/dist/components/drop-status-display.js +7 -37
- package/dist/components/drop-status-display.js.map +1 -1
- package/dist/components/fast-mint/types.cjs.map +1 -1
- package/dist/components/fast-mint/types.d.cts +3 -1
- package/dist/components/fast-mint/types.d.ts +3 -1
- package/dist/components/image.d.cts +2 -0
- package/dist/components/image.d.ts +2 -0
- package/dist/index.cjs +46 -27
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +20 -11
- package/dist/index.d.ts +20 -11
- package/dist/index.js +31 -25
- package/dist/index.js.map +1 -1
- package/dist/utils/drop/actions.cjs +76 -0
- package/dist/utils/drop/actions.cjs.map +1 -0
- package/dist/utils/drop/actions.d.cts +46 -0
- package/dist/utils/drop/actions.d.ts +46 -0
- package/dist/utils/drop/actions.js +49 -0
- package/dist/utils/drop/actions.js.map +1 -0
- package/dist/utils/drop/allowlist.cjs +50 -0
- package/dist/utils/drop/allowlist.cjs.map +1 -0
- package/dist/utils/drop/allowlist.d.cts +10 -0
- package/dist/utils/drop/allowlist.d.ts +10 -0
- package/dist/utils/drop/allowlist.js +26 -0
- package/dist/utils/drop/allowlist.js.map +1 -0
- package/dist/utils/drop/chain.cjs +37 -0
- package/dist/utils/drop/chain.cjs.map +1 -0
- package/dist/utils/drop/chain.d.cts +5 -0
- package/dist/utils/drop/chain.d.ts +5 -0
- package/dist/utils/drop/chain.js +13 -0
- package/dist/utils/drop/chain.js.map +1 -0
- package/dist/utils/drop/claim-proof.cjs +48 -0
- package/dist/utils/drop/claim-proof.cjs.map +1 -0
- package/dist/utils/drop/claim-proof.d.cts +9 -0
- package/dist/utils/drop/claim-proof.d.ts +9 -0
- package/dist/utils/drop/claim-proof.js +24 -0
- package/dist/utils/drop/claim-proof.js.map +1 -0
- package/dist/utils/drop/draft.cjs +87 -0
- package/dist/utils/drop/draft.cjs.map +1 -0
- package/dist/utils/drop/draft.d.cts +32 -0
- package/dist/utils/drop/draft.d.ts +32 -0
- package/dist/utils/drop/draft.js +61 -0
- package/dist/utils/drop/draft.js.map +1 -0
- package/dist/utils/drop/metadata.cjs +70 -0
- package/dist/utils/drop/metadata.cjs.map +1 -0
- package/dist/utils/drop/metadata.d.cts +34 -0
- package/dist/utils/drop/metadata.d.ts +34 -0
- package/dist/utils/drop/metadata.js +43 -0
- package/dist/utils/drop/metadata.js.map +1 -0
- package/dist/utils/{drop-status.cjs → drop/preview.cjs} +14 -14
- package/dist/utils/drop/preview.cjs.map +1 -0
- package/dist/utils/drop/preview.d.cts +4 -0
- package/dist/utils/drop/preview.d.ts +4 -0
- package/dist/utils/drop/preview.js +13 -0
- package/dist/utils/drop/preview.js.map +1 -0
- package/dist/utils/drop/receipt.cjs +39 -0
- package/dist/utils/drop/receipt.cjs.map +1 -0
- package/dist/utils/drop/receipt.d.cts +6 -0
- package/dist/utils/drop/receipt.d.ts +6 -0
- package/dist/utils/drop/receipt.js +15 -0
- package/dist/utils/drop/receipt.js.map +1 -0
- package/dist/utils/drop/sale.cjs +108 -0
- package/dist/utils/drop/sale.cjs.map +1 -0
- package/dist/utils/drop/sale.d.cts +52 -0
- package/dist/utils/drop/sale.d.ts +52 -0
- package/dist/utils/drop/sale.js +78 -0
- package/dist/utils/drop/sale.js.map +1 -0
- package/dist/utils/drop/types.cjs +17 -0
- package/dist/utils/drop/types.cjs.map +1 -0
- package/dist/utils/drop/types.d.cts +20 -0
- package/dist/utils/drop/types.d.ts +20 -0
- package/dist/utils/drop/types.js +1 -0
- package/dist/utils/drop/types.js.map +1 -0
- package/dist/utils/drop/upload.cjs +48 -0
- package/dist/utils/drop/upload.cjs.map +1 -0
- package/dist/utils/drop/upload.d.cts +11 -0
- package/dist/utils/drop/upload.d.ts +11 -0
- package/dist/utils/drop/upload.js +24 -0
- package/dist/utils/drop/upload.js.map +1 -0
- package/dist/utils/drop/use-now.cjs +38 -0
- package/dist/utils/drop/use-now.cjs.map +1 -0
- package/dist/utils/drop/use-now.d.cts +4 -0
- package/dist/utils/drop/use-now.d.ts +4 -0
- package/dist/utils/drop/use-now.js +14 -0
- package/dist/utils/drop/use-now.js.map +1 -0
- package/dist/utils/drop/view.cjs +89 -0
- package/dist/utils/drop/view.cjs.map +1 -0
- package/dist/utils/drop/view.d.cts +34 -0
- package/dist/utils/drop/view.d.ts +34 -0
- package/dist/utils/drop/view.js +64 -0
- package/dist/utils/drop/view.js.map +1 -0
- package/dist/utils/launchpad-defaults.cjs +0 -22
- package/dist/utils/launchpad-defaults.cjs.map +1 -1
- package/dist/utils/launchpad-defaults.d.cts +1 -7
- package/dist/utils/launchpad-defaults.d.ts +1 -7
- package/dist/utils/launchpad-defaults.js +0 -21
- package/dist/utils/launchpad-defaults.js.map +1 -1
- package/dist/utils/use-drops.cjs +41 -45
- package/dist/utils/use-drops.cjs.map +1 -1
- package/dist/utils/use-drops.d.cts +31 -23
- package/dist/utils/use-drops.d.ts +31 -23
- package/dist/utils/use-drops.js +35 -40
- package/dist/utils/use-drops.js.map +1 -1
- package/dist/utils/wallet-failure.cjs +2 -2
- package/dist/utils/wallet-failure.cjs.map +1 -1
- package/dist/utils/wallet-failure.js +2 -2
- package/dist/utils/wallet-failure.js.map +1 -1
- package/package.json +3 -3
- package/dist/components/account/account.test.cjs +0 -86
- package/dist/components/account/account.test.cjs.map +0 -1
- package/dist/components/account/account.test.d.cts +0 -2
- package/dist/components/account/account.test.d.ts +0 -2
- package/dist/components/account/account.test.js +0 -85
- package/dist/components/account/account.test.js.map +0 -1
- package/dist/components/drop-create-form.cjs +0 -341
- package/dist/components/drop-create-form.cjs.map +0 -1
- package/dist/components/drop-create-form.d.cts +0 -39
- package/dist/components/drop-create-form.d.ts +0 -39
- package/dist/components/drop-create-form.js +0 -322
- package/dist/components/drop-create-form.js.map +0 -1
- package/dist/components/drop-preview-card.cjs +0 -106
- package/dist/components/drop-preview-card.cjs.map +0 -1
- package/dist/components/drop-preview-card.d.cts +0 -17
- package/dist/components/drop-preview-card.d.ts +0 -17
- package/dist/components/drop-preview-card.js +0 -82
- package/dist/components/drop-preview-card.js.map +0 -1
- package/dist/components/drop-preview-card.test.cjs +0 -84
- package/dist/components/drop-preview-card.test.cjs.map +0 -1
- package/dist/components/drop-preview-card.test.d.cts +0 -3
- package/dist/components/drop-preview-card.test.d.ts +0 -3
- package/dist/components/drop-preview-card.test.js +0 -83
- package/dist/components/drop-preview-card.test.js.map +0 -1
- package/dist/components/drop-status-display.test.cjs +0 -29
- package/dist/components/drop-status-display.test.cjs.map +0 -1
- package/dist/components/drop-status-display.test.d.cts +0 -2
- package/dist/components/drop-status-display.test.d.ts +0 -2
- package/dist/components/drop-status-display.test.js +0 -28
- package/dist/components/drop-status-display.test.js.map +0 -1
- package/dist/components/exclusive-content-section.cjs +0 -88
- package/dist/components/exclusive-content-section.cjs.map +0 -1
- package/dist/components/exclusive-content-section.d.cts +0 -10
- package/dist/components/exclusive-content-section.d.ts +0 -10
- package/dist/components/exclusive-content-section.js +0 -64
- package/dist/components/exclusive-content-section.js.map +0 -1
- package/dist/data/drop-create-schema.cjs +0 -92
- package/dist/data/drop-create-schema.cjs.map +0 -1
- package/dist/data/drop-create-schema.d.cts +0 -131
- package/dist/data/drop-create-schema.d.ts +0 -131
- package/dist/data/drop-create-schema.js +0 -58
- package/dist/data/drop-create-schema.js.map +0 -1
- package/dist/utils/drop-status.cjs.map +0 -1
- package/dist/utils/drop-status.d.cts +0 -12
- package/dist/utils/drop-status.d.ts +0 -12
- package/dist/utils/drop-status.js +0 -13
- 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":";AA2GU,mBACE,KACA,YAFF;AAzGV,SAAS,gBAAgB;AACzB,SAAS,cAAc,SAAS,WAAW,eAAe;AAC1D,SAAS,gBAAgB;AACzB,SAAS,mBAAmB,gBAAgB,wBAA2C;AACvF,SAAS,oBAAoB;AAC7B,SAAS,sBAAsB;AAC/B,SAAS,cAAc;AACvB,SAAS,mBAAmB;AAC5B,SAAS,qBAAqB;AAC9B,SAAS,uBAAuB,wBAAwB;AACxD,SAAS,sBAAsB;AAC/B,SAAS,wBAAwB,eAAe,+BAA+B;AAC/E,SAAS,aAAa,kBAAkB;AACxC,SAAS,mBAAmC;AAC5C,SAAS,iBAAkC;AAC3C,SAAS,YAAY,4BAA4B;AAU1C,SAAS,aAAa,EAAE,MAAM,SAAS,OAAO,IAAI,GAAgF;AACvI,QAAM,CAAC,MAAM,OAAO,IAAI,SAAe,EAAE,MAAM,SAAS,CAAC;AACzD,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAuB,CAAC,CAAC;AACnD,QAAM,CAAC,SAAS,UAAU,IAAI,SAAwB,IAAI;AAC1D,QAAM,SAAS,IAAI,UAAU;AAC7B,QAAM,QAAQ,MAAM,SAAS,YAAa,MAAM,UAAU,CAAC,MAAM,OAAO,IAAI,CAAC,IAAK,MAAM,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI;AAC/G,QAAM,QAAQ,YAAY,MAAM,IAAI;AACpC,QAAM,OAAO,MAAM,WAAW,kBAAkB,eAAe,MAAM,SAAS,EAAE,SAAS,IAAI;AAE7F,QAAM,MAAM,YAAY;AACtB,QAAI;AACF,UAAI,MAAM;AACV,UAAI,CAAC,KAAK;AACR,gBAAQ,EAAE,MAAM,YAAY,CAAC;AAC7B,cAAM,UAAU,MAAM,SAAS,IAAI,QAAQ;AAAA,UACzC,GAAG,MAAM,IAAI,CAAC,MAAM,OAAO,EAAE,IAAI,OAAO,CAAC,IAAI,MAAM,QAAQ,WAAoB,KAAK,MAAM,OAAO,KAAK,EAAE;AAAA,UACxG,GAAI,MAAM,QAAQ,CAAC,EAAE,IAAI,SAAS,MAAM,MAAM,OAAO,QAAQ,WAAoB,KAAK,MAAM,OAAO,KAAK,CAAC,IAAI,CAAC;AAAA,QAChH;AACA,cAAM,OAAO,MAAM,UAAU,SAAS,OAAO,OAAO,MAAM,iBAAiB,OAAO,KAAK,GAAG,OAAO,GAAG,KAAK,QAAQ;AACjH,iBAAS,IAAI;AACb,YAAI,KAAK,KAAK,CAAC,MAAM,EAAE,WAAW,MAAM,GAAG;AACzC,kBAAQ,EAAE,MAAM,SAAS,SAAS,sDAAsD,CAAC;AACzF;AAAA,QACF;AACA,cAAM,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,GAAG,WAAW,MAAM,CAAC;AACtD,cAAM,WAAW,uBAAuB;AAAA,UACtC,MAAM,MAAM;AAAA,UACZ,MAAM,MAAM,KAAK,KAAK;AAAA,UACtB,aAAa,MAAM,YAAY,KAAK;AAAA,UACpC,SAAS,IAAI;AAAA,UACb,UAAU,KAAK,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO,GAAG,OAAO;AAAA,UACrD,SAAS,MAAM;AAAA,UACf,mBAAkB,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAAA,UACtD,OAAO,MAAM,SAAS,YAClB,CAAC,EAAE,MAAM,IAAI,aAAa,IAAI,UAAU,IAAI,CAAC,EAAG,IAAK,CAAC,IACtD,MAAM,MAAM,IAAI,CAAC,IAAI,OAAO,EAAE,MAAM,GAAG,MAAM,aAAa,GAAG,aAAa,UAAU,IAAI,CAAC,EAAG,IAAK,EAAE;AAAA,UACvG,QAAQ,YAAY,KAAK;AAAA,QAC3B,CAAC;AACD,YAAI,cAAc,QAAQ,IAAI,yBAAyB;AACrD,kBAAQ,EAAE,MAAM,SAAS,SAAS,kFAAkF,CAAC;AACrH;AAAA,QACF;AACA,eAAO,MAAM,sBAAsB,OAAO,KAAK,QAAQ,GAAG;AAC1D,mBAAW,GAAG;AAAA,MAChB;AACA,cAAQ,EAAE,MAAM,YAAY,CAAC;AAC7B,YAAM,SAAS,MAAM,IAAI,UAAU;AACnC,YAAM,EAAE,WAAW,IAAI,MAAM,WAAW,EAAE,QAAQ,UAAU,IAAI,UAAU,OAAO,GAAG;AAAA,QAClF,OAAO,IAAI;AAAA,QACX,MAAM,MAAM,KAAK,KAAK;AAAA,QACtB,QAAQ,MAAM;AAAA,QACd,SAAS;AAAA,QACT,WAAW,YAAY,KAAK;AAAA,QAC5B;AAAA,QACA,eAAe,MAAM;AAAA,QACrB,aAAa,MAAM,YAAY,KAAK,KAAK;AAAA,MAC3C,CAAC;AACD,UAAI,UAAyB;AAC7B,UAAI,MAAM,MAAM,SAAS;AACvB,YAAI;AACF,gBAAM,qBAAqB,QAAQ,YAAY,MAAM,KAAK;AAAA,QAC5D,QAAQ;AACN,oBAAU;AAAA,QACZ;AAAA,MACF;AACA,cAAQ,EAAE,MAAM,QAAQ,YAAY,OAAO,OAAO,eAAe,OAAO,SAAS,QAAQ,YAAY,IAAI,IAAI,CAAC,GAAG,QAAQ,CAAC;AAAA,IAC5H,SAAS,KAAK;AACZ,cAAQ,EAAE,MAAM,SAAS,SAAS,cAAc,KAAK,iDAAiD,EAAE,QAAQ,CAAC;AAAA,IACnH;AAAA,EACF;AAEA,QAAM,QAAQ,MAAM;AAClB,QAAI,KAAK,SAAS,eAAe,KAAK,SAAS,YAAa;AAC5D,YAAQ;AAAA,EACV;AAEA,SACE,oBAAC,gBAAa,MAAY,SAAS,OACjC,+BAAC,SAAI,WAAU,iBACZ;AAAA,SAAK,SAAS,YACb,iCACE;AAAA,0BAAC,QAAG,WAAU,yBAAwB,+BAAiB;AAAA,MACvD,qBAAC,SAAI,WAAU,yDACb;AAAA,4BAAC,OAAE,WAAU,iBAAiB,gBAAM,MAAK;AAAA,QACzC,oBAAC,OAAE,WAAU,yEAAwE,gCAAkB;AAAA,QACvG,oBAAC,OAAI,OAAM,SAAQ,OAAO,WAAW,MAAM,OAAO,MAAM,YAAY,GAAG;AAAA,QACvE,oBAAC,OAAI,OAAM,UAAS,OAAO,GAAG,YAAY,KAAK,EAAE,eAAe,OAAO,CAAC,IAAI,MAAM,SAAS,YAAY,WAAW,OAAO,IAAI;AAAA,QAC7H,oBAAC,OAAI,OAAM,UAAS,OAAO,MAAM,cAAc,IAAI,cAAc,IAAI,KAAK,MAAM,YAAY,GAAI,EAAE,eAAe,GAAG;AAAA,QACpH,oBAAC,OAAI,OAAM,QAAO,OAAO,MAAM,YAAY,IAAI,gBAAgB,IAAI,KAAK,MAAM,UAAU,GAAI,EAAE,eAAe,GAAG;AAAA,QAChH,oBAAC,OAAI,OAAM,cAAa,OAAO,MAAM,iBAAiB,MAAM,aAAa,MAAM,cAAc;AAAA,QAC7F,oBAAC,OAAI,OAAM,gBAAe,OAAO,OAAO,GAAG,OAAO,KAAK,KAAK,MAAM,EAAE,MAAM,uBAAuB,YAAY;AAAA,QAC7G,oBAAC,OAAE,WAAU,sCAAqC,uGAAyF;AAAA,SAC7I;AAAA,MACA,oBAAC,kBAAe,KAAG,MAAC,SAAS,MAAM,KAAK,IAAI,GAAG,yBAAW;AAAA,OAC5D;AAAA,IAED,KAAK,SAAS,eACb,iCACE;AAAA,2BAAC,QAAG,WAAU,iDAAgD;AAAA,4BAAC,WAAQ,WAAU,wBAAuB;AAAA,QAAE;AAAA,SAAS;AAAA,MACnH,qBAAC,OAAE,WAAU,iCAAiC;AAAA,cAAM,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM,EAAE;AAAA,QAAO;AAAA,QAAK,MAAM;AAAA,QAAO;AAAA,SAAM;AAAA,OACxH;AAAA,IAED,KAAK,SAAS,eACb,qBAAC,QAAG,WAAU,iDAAgD;AAAA,0BAAC,WAAQ,WAAU,wBAAuB;AAAA,MAAE;AAAA,OAAoB;AAAA,IAE/H,KAAK,SAAS,WACb,iCACE;AAAA,2BAAC,QAAG,WAAU,iDAAgD;AAAA,4BAAC,WAAQ,WAAU,4BAA2B;AAAA,QAAE;AAAA,SAAY;AAAA,MAC1H,oBAAC,OAAE,WAAU,iCAAiC,eAAK,SAAQ;AAAA,MAC1D,MAAM,KAAK,CAAC,MAAM,EAAE,WAAW,QAAQ,KACtC,oBAAC,QAAG,WAAU,2CACX,gBAAM,OAAO,CAAC,MAAM,EAAE,WAAW,QAAQ,EAAE,IAAI,CAAC,MAAM,qBAAC,QAAe;AAAA,UAAE,KAAK;AAAA,QAAK;AAAA,QAAG,EAAE;AAAA,WAAxB,EAAE,EAA4B,CAAK,GACrG;AAAA,MAEF,qBAAC,UAAO,SAAS,MAAM,KAAK,IAAI,GAAG,WAAU,WAAU;AAAA,4BAAC,aAAU,WAAU,eAAc;AAAA,QAAE;AAAA,SAAS;AAAA,OACvG;AAAA,IAED,KAAK,SAAS,UACb,iCACE;AAAA,2BAAC,QAAG,WAAU,iDAAgD;AAAA,4BAAC,gBAAa,WAAU,0BAAyB;AAAA,QAAE;AAAA,SAAiB;AAAA,MACjI,KAAK,WAAW,oBAAC,OAAE,WAAU,6BAA6B,eAAK,SAAQ;AAAA,MACxE,qBAAC,SAAI,WAAU,wBACb;AAAA,4BAAC,eAAY,OAAO,MAAM,MAAM,KAAK,GAAG,OAAO,SAAS,MAAM,GAAG,SAAS,KAAK,UAAU,CAAC,IAAI,SAAQ,WAAU;AAAA,QAChH,oBAAC,UAAO,SAAO,MAAC,SAAQ,WAAU,8BAAC,OAAE,MAAM,SAAS,KAAK,UAAU,GAAG,uBAAS,GAAI;AAAA,QAClF,KAAK,MAAM,SAAS,KACnB,oBAAC,UAAO,SAAQ,WAAU,SAAS,MAAM,YAAY,iBAAiB,KAAK,KAAK,GAAG,iBAAiB,GAAG,kCAAoB;AAAA,SAE/H;AAAA,MACC,KAAK,MAAM,SAAS,KAAK,oBAAC,OAAE,WAAU,iCAAgC,6EAA0D;AAAA,OACnI;AAAA,KAEJ,GACF;AAEJ;AAEA,SAAS,IAAI,EAAE,OAAO,MAAM,GAAqC;AAC/D,SAAO,qBAAC,SAAI,WAAU,8BAA6B;AAAA,wBAAC,UAAK,WAAU,yBAAyB,iBAAM;AAAA,IAAO,oBAAC,UAAK,WAAU,0BAA0B,iBAAM;AAAA,KAAO;AAClK;AAEO,SAAS,YAAY,KAAa,MAAc;AACrD,QAAM,OAAO,IAAI,gBAAgB,IAAI,KAAK,CAAC,GAAG,GAAG,EAAE,MAAM,WAAW,CAAC,CAAC;AACtE,SAAO,OAAO,SAAS,cAAc,GAAG,GAAG,EAAE,MAAM,UAAU,KAAK,CAAC,EAAE,MAAM;AAC3E,MAAI,gBAAgB,IAAI;AAC1B;","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 };
|