@medialane/ui 0.257.0 → 0.259.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 (185) hide show
  1. package/dist/components/account/add-guardian-dialog.cjs +1 -1
  2. package/dist/components/account/add-guardian-dialog.cjs.map +1 -1
  3. package/dist/components/account/add-guardian-dialog.js +1 -1
  4. package/dist/components/account/add-guardian-dialog.js.map +1 -1
  5. package/dist/components/account/device-approval-dialog.cjs +2 -2
  6. package/dist/components/account/device-approval-dialog.cjs.map +1 -1
  7. package/dist/components/account/device-approval-dialog.js +2 -2
  8. package/dist/components/account/device-approval-dialog.js.map +1 -1
  9. package/dist/components/account/devices-section.cjs +1 -1
  10. package/dist/components/account/devices-section.cjs.map +1 -1
  11. package/dist/components/account/devices-section.js +1 -1
  12. package/dist/components/account/devices-section.js.map +1 -1
  13. package/dist/components/account/guardian-recovery-section.cjs +1 -1
  14. package/dist/components/account/guardian-recovery-section.cjs.map +1 -1
  15. package/dist/components/account/guardian-recovery-section.js +1 -1
  16. package/dist/components/account/guardian-recovery-section.js.map +1 -1
  17. package/dist/components/comments-section.cjs +5 -4
  18. package/dist/components/comments-section.cjs.map +1 -1
  19. package/dist/components/comments-section.js +5 -4
  20. package/dist/components/comments-section.js.map +1 -1
  21. package/dist/components/drop/create/launch-dialog.cjs +1 -1
  22. package/dist/components/drop/create/launch-dialog.cjs.map +1 -1
  23. package/dist/components/drop/create/launch-dialog.js +1 -1
  24. package/dist/components/drop/create/launch-dialog.js.map +1 -1
  25. package/dist/components/drop/page/drop-manage.cjs +1 -1
  26. package/dist/components/drop/page/drop-manage.cjs.map +1 -1
  27. package/dist/components/drop/page/drop-manage.js +1 -1
  28. package/dist/components/drop/page/drop-manage.js.map +1 -1
  29. package/dist/components/drop/page/drop-mint-dialog.cjs +1 -1
  30. package/dist/components/drop/page/drop-mint-dialog.cjs.map +1 -1
  31. package/dist/components/drop/page/drop-mint-dialog.js +1 -1
  32. package/dist/components/drop/page/drop-mint-dialog.js.map +1 -1
  33. package/dist/components/empty-or-error.cjs +2 -2
  34. package/dist/components/empty-or-error.cjs.map +1 -1
  35. package/dist/components/empty-or-error.js +2 -2
  36. package/dist/components/empty-or-error.js.map +1 -1
  37. package/dist/components/fast-mint/fast-mint.cjs +2 -1
  38. package/dist/components/fast-mint/fast-mint.cjs.map +1 -1
  39. package/dist/components/fast-mint/fast-mint.js +2 -1
  40. package/dist/components/fast-mint/fast-mint.js.map +1 -1
  41. package/dist/components/launchpad/coin-create.cjs +9 -7
  42. package/dist/components/launchpad/coin-create.cjs.map +1 -1
  43. package/dist/components/launchpad/coin-create.js +9 -7
  44. package/dist/components/launchpad/coin-create.js.map +1 -1
  45. package/dist/components/launchpad/collection-create-form.cjs +11 -14
  46. package/dist/components/launchpad/collection-create-form.cjs.map +1 -1
  47. package/dist/components/launchpad/collection-create-form.js +12 -15
  48. package/dist/components/launchpad/collection-create-form.js.map +1 -1
  49. package/dist/components/launchpad/collection-create-presets.cjs +8 -8
  50. package/dist/components/launchpad/collection-create-presets.cjs.map +1 -1
  51. package/dist/components/launchpad/collection-create-presets.d.cts +2 -1
  52. package/dist/components/launchpad/collection-create-presets.d.ts +2 -1
  53. package/dist/components/launchpad/collection-create-presets.js +8 -8
  54. package/dist/components/launchpad/collection-create-presets.js.map +1 -1
  55. package/dist/components/launchpad/edition-mint.cjs +9 -7
  56. package/dist/components/launchpad/edition-mint.cjs.map +1 -1
  57. package/dist/components/launchpad/edition-mint.js +9 -7
  58. package/dist/components/launchpad/edition-mint.js.map +1 -1
  59. package/dist/components/launchpad/pop-create.cjs +5 -6
  60. package/dist/components/launchpad/pop-create.cjs.map +1 -1
  61. package/dist/components/launchpad/pop-create.js +5 -6
  62. package/dist/components/launchpad/pop-create.js.map +1 -1
  63. package/dist/components/launchpad/remix-mint.cjs +9 -7
  64. package/dist/components/launchpad/remix-mint.cjs.map +1 -1
  65. package/dist/components/launchpad/remix-mint.js +9 -7
  66. package/dist/components/launchpad/remix-mint.js.map +1 -1
  67. package/dist/components/launchpad/single-edition-mint.cjs +9 -7
  68. package/dist/components/launchpad/single-edition-mint.cjs.map +1 -1
  69. package/dist/components/launchpad/single-edition-mint.js +9 -7
  70. package/dist/components/launchpad/single-edition-mint.js.map +1 -1
  71. package/dist/components/launchpad/sponsorship-create.cjs +5 -6
  72. package/dist/components/launchpad/sponsorship-create.cjs.map +1 -1
  73. package/dist/components/launchpad/sponsorship-create.js +5 -6
  74. package/dist/components/launchpad/sponsorship-create.js.map +1 -1
  75. package/dist/components/launchpad/tier-mint-form.cjs +5 -6
  76. package/dist/components/launchpad/tier-mint-form.cjs.map +1 -1
  77. package/dist/components/launchpad/tier-mint-form.js +5 -6
  78. package/dist/components/launchpad/tier-mint-form.js.map +1 -1
  79. package/dist/components/launchpad/tier-mint-presets.cjs +2 -2
  80. package/dist/components/launchpad/tier-mint-presets.cjs.map +1 -1
  81. package/dist/components/launchpad/tier-mint-presets.d.cts +2 -1
  82. package/dist/components/launchpad/tier-mint-presets.d.ts +2 -1
  83. package/dist/components/launchpad/tier-mint-presets.js +2 -2
  84. package/dist/components/launchpad/tier-mint-presets.js.map +1 -1
  85. package/dist/components/license-request-page.cjs +1 -1
  86. package/dist/components/license-request-page.cjs.map +1 -1
  87. package/dist/components/license-request-page.js +1 -1
  88. package/dist/components/license-request-page.js.map +1 -1
  89. package/dist/components/marketplace-dialog-primitives.cjs +0 -30
  90. package/dist/components/marketplace-dialog-primitives.cjs.map +1 -1
  91. package/dist/components/marketplace-dialog-primitives.d.cts +1 -12
  92. package/dist/components/marketplace-dialog-primitives.d.ts +1 -12
  93. package/dist/components/marketplace-dialog-primitives.js +1 -30
  94. package/dist/components/marketplace-dialog-primitives.js.map +1 -1
  95. package/dist/components/media-wallet/activate-card.cjs +1 -1
  96. package/dist/components/media-wallet/activate-card.cjs.map +1 -1
  97. package/dist/components/media-wallet/activate-card.js +1 -1
  98. package/dist/components/media-wallet/activate-card.js.map +1 -1
  99. package/dist/components/media-wallet/media-wallet-activity.cjs +1 -1
  100. package/dist/components/media-wallet/media-wallet-activity.cjs.map +1 -1
  101. package/dist/components/media-wallet/media-wallet-activity.js +1 -1
  102. package/dist/components/media-wallet/media-wallet-activity.js.map +1 -1
  103. package/dist/components/media-wallet/media-wallet-send.cjs +2 -6
  104. package/dist/components/media-wallet/media-wallet-send.cjs.map +1 -1
  105. package/dist/components/media-wallet/media-wallet-send.js +2 -6
  106. package/dist/components/media-wallet/media-wallet-send.js.map +1 -1
  107. package/dist/components/pop-claim-button.cjs +5 -4
  108. package/dist/components/pop-claim-button.cjs.map +1 -1
  109. package/dist/components/pop-claim-button.js +5 -4
  110. package/dist/components/pop-claim-button.js.map +1 -1
  111. package/dist/components/pop-manage-page.cjs +2 -2
  112. package/dist/components/pop-manage-page.cjs.map +1 -1
  113. package/dist/components/pop-manage-page.js +2 -2
  114. package/dist/components/pop-manage-page.js.map +1 -1
  115. package/dist/components/portfolio-sponsorships.cjs +2 -2
  116. package/dist/components/portfolio-sponsorships.cjs.map +1 -1
  117. package/dist/components/portfolio-sponsorships.js +2 -2
  118. package/dist/components/portfolio-sponsorships.js.map +1 -1
  119. package/dist/components/sponsorship-offer-page.cjs +5 -4
  120. package/dist/components/sponsorship-offer-page.cjs.map +1 -1
  121. package/dist/components/sponsorship-offer-page.js +5 -4
  122. package/dist/components/sponsorship-offer-page.js.map +1 -1
  123. package/dist/components/transaction-dialog.cjs +4 -4
  124. package/dist/components/transaction-dialog.cjs.map +1 -1
  125. package/dist/components/transaction-dialog.d.cts +3 -1
  126. package/dist/components/transaction-dialog.d.ts +3 -1
  127. package/dist/components/transaction-dialog.js +4 -4
  128. package/dist/components/transaction-dialog.js.map +1 -1
  129. package/dist/components/{creation-success.cjs → transaction-success.cjs} +14 -15
  130. package/dist/components/transaction-success.cjs.map +1 -0
  131. package/dist/components/transaction-success.d.cts +20 -0
  132. package/dist/components/transaction-success.d.ts +20 -0
  133. package/dist/components/{creation-success.js → transaction-success.js} +10 -11
  134. package/dist/components/transaction-success.js.map +1 -0
  135. package/dist/components/transfer-collection-ownership.cjs +5 -4
  136. package/dist/components/transfer-collection-ownership.cjs.map +1 -1
  137. package/dist/components/transfer-collection-ownership.js +5 -4
  138. package/dist/components/transfer-collection-ownership.js.map +1 -1
  139. package/dist/components/wallet/export-key-section.cjs +3 -3
  140. package/dist/components/wallet/export-key-section.cjs.map +1 -1
  141. package/dist/components/wallet/export-key-section.d.cts +1 -2
  142. package/dist/components/wallet/export-key-section.d.ts +1 -2
  143. package/dist/components/wallet/export-key-section.js +3 -3
  144. package/dist/components/wallet/export-key-section.js.map +1 -1
  145. package/dist/index.cjs +6 -10
  146. package/dist/index.cjs.map +1 -1
  147. package/dist/index.d.cts +4 -4
  148. package/dist/index.d.ts +4 -4
  149. package/dist/index.js +4 -8
  150. package/dist/index.js.map +1 -1
  151. package/dist/utils/describe-error.cjs +16 -11
  152. package/dist/utils/describe-error.cjs.map +1 -1
  153. package/dist/utils/describe-error.d.cts +4 -4
  154. package/dist/utils/describe-error.d.ts +4 -4
  155. package/dist/utils/describe-error.js +16 -10
  156. package/dist/utils/describe-error.js.map +1 -1
  157. package/dist/utils/media-wallet/use-erc20-balance.d.cts +1 -1
  158. package/dist/utils/media-wallet/use-erc20-balance.d.ts +1 -1
  159. package/dist/utils/success-messages.cjs +54 -0
  160. package/dist/utils/success-messages.cjs.map +1 -0
  161. package/dist/utils/success-messages.d.cts +31 -0
  162. package/dist/utils/success-messages.d.ts +31 -0
  163. package/dist/utils/success-messages.js +30 -0
  164. package/dist/utils/success-messages.js.map +1 -0
  165. package/dist/utils/use-email-code.cjs +2 -2
  166. package/dist/utils/use-email-code.cjs.map +1 -1
  167. package/dist/utils/use-email-code.js +2 -2
  168. package/dist/utils/use-email-code.js.map +1 -1
  169. package/dist/utils/use-transaction.cjs +16 -2
  170. package/dist/utils/use-transaction.cjs.map +1 -1
  171. package/dist/utils/use-transaction.d.cts +1 -0
  172. package/dist/utils/use-transaction.d.ts +1 -0
  173. package/dist/utils/use-transaction.js +17 -3
  174. package/dist/utils/use-transaction.js.map +1 -1
  175. package/package.json +3 -3
  176. package/dist/components/creation-success.cjs.map +0 -1
  177. package/dist/components/creation-success.d.cts +0 -20
  178. package/dist/components/creation-success.d.ts +0 -20
  179. package/dist/components/creation-success.js.map +0 -1
  180. package/dist/components/transaction-done.cjs +0 -46
  181. package/dist/components/transaction-done.cjs.map +0 -1
  182. package/dist/components/transaction-done.d.cts +0 -18
  183. package/dist/components/transaction-done.d.ts +0 -18
  184. package/dist/components/transaction-done.js +0 -22
  185. package/dist/components/transaction-done.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/fast-mint/fast-mint.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport Image from \"next/image\";\nimport { useForm } from \"react-hook-form\";\nimport { buildAssetMetadata, type ApiCollection } from \"@medialane/sdk\";\nimport { UPLOAD_LIMITS, acceptFor, uploadError } from \"../../utils/upload-limits.js\";\nimport { executeIntent, deployedCollectionFromReceipt, mintedTokenIdFromReceipt } from \"@medialane/sdk/starknet\";\nimport { mintableCollections, collectionKey } from \"./mintable-collections.js\";\nimport {\n ImagePlus, Music, Video, FileText, Loader2,\n Layers, ImagePlus as SingleIcon, ChevronDown, Boxes, Plus, Check,\n ShieldCheck, X,\n} from \"lucide-react\";\nimport { Input } from \"../input.js\";\nimport { Textarea } from \"../textarea.js\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../select.js\";\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"../collapsible.js\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../popover.js\";\nimport { MedialaneCollectionCard } from \"../medialane-collection-card.js\";\nimport { ActionDialog } from \"../action-dialog.js\";\nimport { IPTypeFields, type MetadataField } from \"../ip-type-fields.js\";\nimport {\n IP_TYPES, LICENSE_TYPES, GEOGRAPHIC_SCOPES, AI_POLICIES, DERIVATIVES_OPTIONS,\n type IPType,\n} from \"../../data/ip.js\";\nimport { IP_TEMPLATES } from \"../../data/ip-templates.js\";\nimport { suggestLaunchpadSymbol } from \"../../utils/launchpad-defaults.js\";\nimport { uploadFileToIpfs, uploadJsonToIpfs, uploadFailureToast } from \"../../utils/ipfs-upload.js\";\nimport { cn } from \"../../utils/cn.js\";\nimport { Dropzone } from \"./dropzone.js\";\nimport { SuccessView } from \"./success-view.js\";\nimport type { FastMintProps, FastMintSigner, MediaKind, MintedAsset } from \"./types.js\";\nimport { profileHref } from \"@medialane/sdk\";\nimport { useImageUrl } from \"../../utils/use-image-url.js\";\n\nconst MEDIA_ROUTE_MIME_TYPES = new Set(UPLOAD_LIMITS.media.mimeTypes);\nconst DOCUMENT_MIME_TYPES = new Set(UPLOAD_LIMITS.document.mimeTypes.filter((type) => type !== \"application/octet-stream\"));\n\nfunction detectMediaKind(mime: string): MediaKind | null {\n if (mime.startsWith(\"image/\")) return MEDIA_ROUTE_MIME_TYPES.has(mime) ? \"image\" : null;\n if (mime.startsWith(\"video/\")) return MEDIA_ROUTE_MIME_TYPES.has(mime) ? \"video\" : null;\n if (mime.startsWith(\"audio/\")) return MEDIA_ROUTE_MIME_TYPES.has(mime) ? \"audio\" : null;\n if (DOCUMENT_MIME_TYPES.has(mime)) return \"document\";\n return null;\n}\n\nconst IP_TYPE_BY_KIND: Record<MediaKind, IPType> = {\n image: \"NFT\",\n audio: \"Audio\",\n video: \"Video\",\n document: \"Documents\",\n};\n\nconst MEDIA_KIND_ICON: Record<MediaKind, typeof ImagePlus> = {\n image: ImagePlus,\n audio: Music,\n video: Video,\n document: FileText,\n};\n\nfunction ToggleGroup({\n value, options, onChange,\n}: { value: string; options: readonly string[]; onChange: (v: string) => void }) {\n return (\n <div className=\"flex rounded-lg border border-border overflow-hidden w-full\">\n {options.map((opt, i) => (\n <button\n key={opt}\n type=\"button\"\n onClick={() => onChange(opt)}\n className={cn(\n \"flex-1 px-3 py-2 text-sm transition-colors\",\n i > 0 && \"border-l border-border\",\n value === opt ? \"bg-primary text-primary-foreground font-medium\" : \"bg-background hover:bg-muted text-muted-foreground\"\n )}\n >\n {opt}\n </button>\n ))}\n </div>\n );\n}\n\nfunction collectionDisplayLabel(col: ApiCollection) {\n return col.name || col.symbol || `Collection #${col.collectionId}`;\n}\n\nfunction CollectionThumb({ image }: { image: string | null | undefined }) {\n const resolveImage = useImageUrl();\n const imageUrl = resolveImage(image);\n return (\n <div className=\"relative h-10 w-10 rounded-lg overflow-hidden bg-muted shrink-0\">\n {imageUrl ? (\n <Image src={imageUrl} alt=\"\" fill className=\"object-cover\" unoptimized />\n ) : (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <Boxes className=\"h-4 w-4 text-muted-foreground/40\" />\n </div>\n )}\n </div>\n );\n}\n\nfunction CollectionPicker({\n collections, value, onChange, valueOf,\n}: {\n collections: ApiCollection[];\n value: string;\n onChange: (id: string) => void;\n valueOf: (c: ApiCollection) => string | null | undefined;\n}) {\n const [open, setOpen] = useState(false);\n const selected = value\n ? collections.find((c) => valueOf(c) === value) ?? null\n : null;\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-expanded={open}\n className=\"flex w-full items-center gap-3 rounded-xl border border-border p-3 text-left transition-colors hover:bg-muted/40\"\n >\n <CollectionThumb image={selected?.image} />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-semibold truncate\">\n {selected ? collectionDisplayLabel(selected) : collections.length ? \"Choose a collection\" : \"No collections yet\"}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {selected ? `${selected.totalSupply ?? 0} work${selected.totalSupply === 1 ? \"\" : \"s\"}` : \"Where this work will live\"}\n </p>\n </div>\n <ChevronDown className=\"h-3.5 w-3.5 text-muted-foreground shrink-0\" />\n </button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[var(--radix-popover-trigger-width)] p-0\" align=\"start\">\n <div className=\"max-h-64 overflow-y-auto p-1\">\n {collections.length === 0 ? (\n <p className=\"px-3 py-4 text-center text-sm text-muted-foreground\">No collections yet — create one instead.</p>\n ) : (\n collections.map((col) => {\n const id = valueOf(col);\n const isSelected = !!id && value === id;\n return (\n <button\n key={id ?? col.contractAddress ?? col.name}\n type=\"button\"\n disabled={!id}\n onClick={() => { if (!id) return; onChange(id); setOpen(false); }}\n className=\"flex w-full items-center gap-2.5 rounded-lg px-2 py-2 text-left transition-colors hover:bg-muted/60\"\n >\n <CollectionThumb image={col.image} />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium truncate\">{collectionDisplayLabel(col)}</p>\n <p className=\"text-xs text-muted-foreground\">{col.totalSupply ?? 0} work{col.totalSupply === 1 ? \"\" : \"s\"}</p>\n </div>\n {isSelected && <Check className=\"h-4 w-4 text-brand-blue shrink-0\" />}\n </button>\n );\n })\n )}\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n\ninterface FormValues {\n name: string;\n description: string;\n external_url: string;\n licenseType: string;\n commercialUse: \"Yes\" | \"No\";\n derivatives: \"Allowed\" | \"Not Allowed\" | \"Share-Alike\";\n attribution: \"Required\" | \"Not Required\";\n geographicScope: string;\n aiPolicy: \"Allowed\" | \"Not Allowed\" | \"Training Only\";\n royalty: number;\n}\n\nexport function FastMint(props: FastMintProps) {\n const {\n presentation = \"inline\", open = true, onClose, mediaKindLock, onMinted,\n collections, refetchCollections,\n hasWallet, walletAddress, onRequireWallet, connectLabel, getUploadToken, getSigner,\n client, successFooter,\n } = props;\n\n const [status, setStatus] = useState<\"idle\" | \"minting\" | \"success\" | \"error\">(\"idle\");\n const [errorMsg, setErrorMsg] = useState<string | null>(null);\n\n const [mediaFile, setMediaFile] = useState<File | null>(null);\n const [mediaPreview, setMediaPreview] = useState<string | null>(null);\n const [mediaUri, setMediaUri] = useState<string | null>(null);\n const [mediaKind, setMediaKind] = useState<MediaKind>(\"image\");\n const [mediaUploading, setMediaUploading] = useState(false);\n const previewUrlRef = useRef<string | null>(null);\n const mediaInputRef = useRef<HTMLInputElement>(null);\n\n const [featurePreview, setFeaturePreview] = useState<string | null>(null);\n const [featureUri, setFeatureUri] = useState<string | null>(null);\n const [featureUploading, setFeatureUploading] = useState(false);\n const featurePreviewRef = useRef<string | null>(null);\n const featureInputRef = useRef<HTMLInputElement>(null);\n\n const [assetType, setAssetType] = useState<\"single\" | \"editions\">(\"single\");\n const [editionCount, setEditionCount] = useState(\"10\");\n\n const [collectionMode, setCollectionMode] = useState<\"existing\" | \"new\">(\"existing\");\n const [existingCollectionId, setExistingCollectionId] = useState(\"\");\n const [existingCollectionContract, setExistingCollectionContract] = useState(\"\");\n const [newCollectionName, setNewCollectionName] = useState(\"\");\n const [newCollectionSymbol, setNewCollectionSymbol] = useState(\"\");\n const [newCollectionDescription, setNewCollectionDescription] = useState(\"\");\n const [autoSymbol, setAutoSymbol] = useState(\"\");\n const [autoCollectionName, setAutoCollectionName] = useState(\"\");\n const [autoCollectionDescription, setAutoCollectionDescription] = useState(\"\");\n\n const [ipType, setIpType] = useState<IPType>(\"NFT\");\n const [advancedOpen, setAdvancedOpen] = useState(false);\n const [ipTypeOpen, setIpTypeOpen] = useState(false);\n const templateFieldsRef = useRef<MetadataField[]>([]);\n\n const [mintedAsset, setMintedAsset] = useState<MintedAsset | null>(null);\n\n useEffect(() => () => {\n if (previewUrlRef.current) URL.revokeObjectURL(previewUrlRef.current);\n if (featurePreviewRef.current) URL.revokeObjectURL(featurePreviewRef.current);\n }, []);\n\n const form = useForm<FormValues>({\n defaultValues: {\n name: \"\", description: \"\", external_url: \"\",\n licenseType: \"CC BY-SA\", commercialUse: \"Yes\", derivatives: \"Share-Alike\",\n attribution: \"Required\", geographicScope: \"Worldwide\", aiPolicy: \"Not Allowed\", royalty: 0,\n },\n });\n const name = form.watch(\"name\");\n\n useEffect(() => {\n if (walletAddress && !form.getValues(\"external_url\")) {\n form.setValue(\"external_url\", `https://medialane.io/account/${walletAddress}`);\n }\n }, [walletAddress, form]);\n\n useEffect(() => {\n const s = suggestLaunchpadSymbol(name);\n if (!s) return;\n if (!newCollectionSymbol || newCollectionSymbol === autoSymbol) {\n setNewCollectionSymbol(s);\n setAutoSymbol(s);\n }\n if (!newCollectionName || newCollectionName === autoCollectionName) {\n setNewCollectionName(name);\n setAutoCollectionName(name);\n }\n }, [name, autoSymbol, autoCollectionName, newCollectionSymbol, newCollectionName]);\n\n const description = form.watch(\"description\");\n useEffect(() => {\n if (!newCollectionDescription || newCollectionDescription === autoCollectionDescription) {\n setNewCollectionDescription(description);\n setAutoCollectionDescription(description);\n }\n }, [description, autoCollectionDescription, newCollectionDescription]);\n\n const erc721Collections = mintableCollections(\"single\", collections);\n const erc1155Collections = mintableCollections(\"editions\", collections);\n\n const handleMediaSelect = async (file: File) => {\n const kind = detectMediaKind(file.type);\n if (!kind) {\n setErrorMsg(\"Publish an image, audio, video (JPG/PNG/GIF/SVG/WebP, MP3/WAV/OGG/FLAC, MP4/WebM), or document (PDF, DOC, DOCX, ODT, RTF, TXT, MD).\");\n return;\n }\n if (mediaKindLock && kind !== mediaKindLock) {\n setErrorMsg(`Please upload a${mediaKindLock === \"image\" ? \"n\" : \"\"} ${mediaKindLock}.`);\n return;\n }\n const viaMediaRoute = MEDIA_ROUTE_MIME_TYPES.has(file.type);\n const fileError = uploadError(file, viaMediaRoute ? \"media\" : \"document\");\n if (fileError) {\n setErrorMsg(fileError);\n return;\n }\n setMediaFile(file);\n setMediaKind(kind);\n setIpType(IP_TYPE_BY_KIND[kind]);\n if (previewUrlRef.current) URL.revokeObjectURL(previewUrlRef.current);\n const objectUrl = URL.createObjectURL(file);\n previewUrlRef.current = objectUrl;\n setMediaPreview(objectUrl);\n setMediaUri(null);\n setMediaUploading(true);\n try {\n const token = await getUploadToken();\n if (!token) throw new Error(\"Sign in first\");\n const { uri } = await uploadFileToIpfs(client.api, file, viaMediaRoute ? \"media\" : \"document\");\n setMediaUri(uri);\n } catch (err) {\n const t = uploadFailureToast(err);\n setErrorMsg(t.description ?? t.title);\n } finally {\n setMediaUploading(false);\n }\n };\n\n const clearMedia = () => {\n setMediaFile(null);\n setMediaPreview(null);\n setMediaUri(null);\n if (mediaInputRef.current) mediaInputRef.current.value = \"\";\n };\n\n const handleFeatureSelect = async (file: File) => {\n if (featurePreviewRef.current) URL.revokeObjectURL(featurePreviewRef.current);\n const objectUrl = URL.createObjectURL(file);\n featurePreviewRef.current = objectUrl;\n setFeaturePreview(objectUrl);\n setFeatureUri(null);\n setFeatureUploading(true);\n try {\n const token = await getUploadToken();\n if (!token) throw new Error(\"Sign in first\");\n const { uri } = await uploadFileToIpfs(client.api, file, \"image\");\n setFeatureUri(uri);\n } catch (err) {\n const t = uploadFailureToast(err);\n setErrorMsg(t.description ?? t.title);\n } finally {\n setFeatureUploading(false);\n }\n };\n\n const handleLicenseChange = (value: string) => {\n form.setValue(\"licenseType\", value);\n const def = LICENSE_TYPES.find((l) => l.value === value);\n if (def) {\n form.setValue(\"commercialUse\", def.commercialUse);\n form.setValue(\"derivatives\", def.derivatives);\n form.setValue(\"attribution\", def.attribution);\n }\n };\n\n const ready = !!mediaUri && !mediaUploading && name.trim().length > 0 &&\n (mediaKind === \"image\" || !!featureUri) &&\n (collectionMode === \"existing\"\n ? assetType === \"single\" ? !!existingCollectionId : !!existingCollectionContract\n : newCollectionName.trim().length > 0 && newCollectionSymbol.trim().length > 0);\n\n async function pollForNewCollection(name: string, symbol: string): Promise<ApiCollection | null> {\n for (let attempt = 0; attempt < 8; attempt++) {\n const list = await refetchCollections();\n const match = list.find((c) => c.name === name && c.symbol === symbol);\n if (match?.collectionId) return match;\n await new Promise((r) => setTimeout(r, 1500));\n }\n return null;\n }\n\n const onSubmit = async (values: FormValues) => {\n if (!hasWallet) { onRequireWallet(); return; }\n if (!walletAddress || !mediaUri) return;\n if (values.external_url && !values.external_url.startsWith(\"http://\") && !values.external_url.startsWith(\"https://\")) {\n setErrorMsg(\"External link must start with http:// or https://\");\n return;\n }\n\n setStatus(\"minting\");\n setErrorMsg(null);\n\n try {\n const signer: FastMintSigner = await getSigner();\n\n const image = mediaKind === \"image\" ? mediaUri : featureUri!;\n const animationUrl = mediaKind === \"image\" ? undefined : mediaUri;\n\n const built = buildAssetMetadata({\n name: values.name,\n description: values.description || \"\",\n externalUrl: values.external_url || \"\",\n imageUri: image,\n creator: walletAddress,\n ipType,\n licenseType: values.licenseType,\n commercialUse: values.commercialUse,\n derivatives: values.derivatives,\n attribution: values.attribution,\n geographicScope: values.geographicScope,\n aiPolicy: values.aiPolicy,\n royalty: String(values.royalty),\n templateTraits: templateFieldsRef.current\n .filter(({ traitType, value }) => traitType.trim() && value.trim())\n .map(({ traitType, value }) => ({ traitType, value })),\n });\n const metadata: Record<string, unknown> = { ...built };\n if (animationUrl) metadata.animation_url = animationUrl;\n\n const uploadToken = await getUploadToken();\n if (!uploadToken) throw new Error(\"Sign in first\");\n const tokenUri = await uploadJsonToIpfs(client.api, metadata);\n\n let result: Awaited<ReturnType<typeof executeIntent>>;\n let finalContractAddress: string | null;\n let finalTokenId: string | null = null;\n\n if (assetType === \"single\") {\n let collectionId = existingCollectionId;\n let contractAddress = erc721Collections.find((c) => c.collectionId === existingCollectionId)?.contractAddress ?? null;\n\n if (collectionMode === \"new\") {\n const intentRes = await client.api.intents.create(\"create-collection\", {\n owner: walletAddress,\n name: newCollectionName,\n symbol: newCollectionSymbol,\n description: newCollectionDescription || undefined,\n image,\n });\n await executeIntent(signer, client, intentRes);\n\n const found = await pollForNewCollection(newCollectionName, newCollectionSymbol);\n if (!found) throw new Error(\"Collection created, but it's still indexing — try minting again in a moment from My Collections.\");\n collectionId = found.collectionId!;\n contractAddress = found.contractAddress ?? null;\n }\n\n const intentRes = await client.api.intents.create(\"mint\", {\n owner: walletAddress,\n collectionId,\n recipient: walletAddress,\n tokenUri,\n royaltyBps: Math.round(values.royalty * 100),\n });\n result = await executeIntent(signer, client, intentRes);\n finalContractAddress = contractAddress;\n\n if (finalContractAddress) {\n finalTokenId = mintedTokenIdFromReceipt(result.receipt, finalContractAddress);\n }\n } else {\n let collectionContract = existingCollectionContract;\n\n if (collectionMode === \"new\") {\n const intentRes = await client.api.intents.create(\"create-collection\", {\n owner: walletAddress,\n name: newCollectionName,\n symbol: newCollectionSymbol,\n description: newCollectionDescription || undefined,\n image,\n baseUri: \"\",\n service: \"mip-erc1155\",\n });\n const deployResult = await executeIntent(signer, client, intentRes);\n\n const deployed = deployedCollectionFromReceipt(deployResult.receipt, \"mip-erc1155\");\n if (!deployed) throw new Error(\"Collection deployed, but its address couldn't be read — check My Collections to mint into it.\");\n collectionContract = deployed;\n }\n\n const intentRes = await client.api.intents.create(\"mint\", {\n owner: walletAddress,\n recipient: walletAddress,\n collectionContract,\n tokenUri,\n value: editionCount,\n royaltyBps: Math.round(values.royalty * 100),\n });\n result = await executeIntent(signer, client, intentRes);\n finalContractAddress = collectionContract;\n finalTokenId = mintedTokenIdFromReceipt(result.receipt, collectionContract);\n }\n\n if (finalContractAddress && finalTokenId) {\n const asset: MintedAsset = { contract: finalContractAddress, tokenId: finalTokenId, image };\n setMintedAsset(asset);\n onMinted?.(asset);\n }\n setStatus(\"success\");\n } catch (err) {\n setErrorMsg(err instanceof Error ? err.message : \"Something went wrong. Please try again.\");\n setStatus(\"error\");\n }\n };\n\n const resetAll = () => {\n setStatus(\"idle\");\n setErrorMsg(null);\n setMintedAsset(null);\n form.reset();\n clearMedia();\n setFeaturePreview(null);\n setFeatureUri(null);\n setAssetType(\"single\");\n setEditionCount(\"10\");\n setCollectionMode(\"existing\");\n setExistingCollectionId(\"\");\n setExistingCollectionContract(\"\");\n setNewCollectionName(\"\");\n setNewCollectionSymbol(\"\");\n setNewCollectionDescription(\"\");\n setAutoSymbol(\"\");\n setAutoCollectionName(\"\");\n setAutoCollectionDescription(\"\");\n templateFieldsRef.current = [];\n };\n\n const busy = status === \"minting\";\n const KindIcon = MEDIA_KIND_ICON[mediaKind];\n const selectedExistingCollection = assetType === \"single\"\n ? erc721Collections.find((c) => c.collectionId === existingCollectionId)\n : erc1155Collections.find((c) => c.contractAddress === existingCollectionContract);\n const collectionLabel = mediaUri\n ? (collectionMode === \"new\"\n ? (newCollectionName || \"New collection\")\n : (selectedExistingCollection?.name || \"IP Asset\"))\n : undefined;\n\n const wrap = (node: React.ReactNode) => {\n if (presentation !== \"dialog\") return node;\n return (\n <ActionDialog open={open} onClose={onClose ?? (() => {})} width={640}>\n <div className=\"relative p-6 sm:p-8\">\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Close\"\n className=\"absolute top-4 right-4 h-8 w-8 rounded-full hover:bg-muted flex items-center justify-center text-muted-foreground\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n {node}\n </div>\n </ActionDialog>\n );\n };\n\n if (status === \"success\") {\n return wrap(\n <SuccessView\n footer={successFooter}\n presentation={presentation}\n previewImage={mediaKind === \"image\" ? mediaPreview : featurePreview}\n name={name}\n collectionLabel={collectionLabel}\n mintedAsset={mintedAsset}\n onPublishAnother={resetAll}\n />\n );\n }\n\n if (!mediaFile) {\n return wrap(\n <Dropzone\n mediaKindLock={mediaKindLock}\n presentation={presentation}\n hasWallet={hasWallet}\n onRequireWallet={onRequireWallet}\n connectLabel={connectLabel}\n onFileSelected={handleMediaSelect}\n />\n );\n }\n\n return wrap(\n <section className=\"space-y-6\">\n <div className=\"flex items-center gap-4 rounded-xl border border-border p-3\">\n <div className=\"relative h-14 w-14 rounded-lg bg-muted overflow-hidden shrink-0\">\n {mediaKind === \"image\" && mediaPreview ? (\n <Image src={mediaPreview} alt=\"\" fill className=\"object-cover\" unoptimized />\n ) : (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <KindIcon className=\"h-6 w-6 text-muted-foreground\" />\n </div>\n )}\n {mediaUploading && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-background/70\">\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n </div>\n )}\n </div>\n <div className=\"min-w-0 flex-1 space-y-1\">\n <p className=\"text-sm font-semibold truncate\">{mediaFile.name}</p>\n <div className=\"flex items-center gap-2 flex-wrap\">\n <p className=\"text-xs text-muted-foreground\">\n {mediaUploading ? \"Uploading…\" : mediaUri ? \"Uploaded\" : \"Upload failed\"}\n </p>\n {mediaUri && (() => {\n const template = IP_TEMPLATES[ipType];\n const TemplateIcon = template.icon;\n return (\n <span\n className={cn(\n \"inline-flex shrink-0 items-center gap-1 rounded-full border px-2 py-0.5 text-2xs font-medium\",\n template.color.bg, template.color.text, template.color.border\n )}\n >\n <TemplateIcon className=\"h-3 w-3\" />\n {template.label}\n </span>\n );\n })()}\n </div>\n </div>\n <button\n type=\"button\"\n onClick={() => mediaInputRef.current?.click()}\n className=\"text-xs font-semibold text-brand-blue hover:underline shrink-0\"\n >\n Change\n </button>\n <input ref={mediaInputRef} type=\"file\" className=\"hidden\" onChange={(e) => { const f = e.target.files?.[0]; if (f) handleMediaSelect(f); }} />\n </div>\n\n {mediaUri && (\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_320px] gap-8 items-start\">\n <div className=\"space-y-5\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Title *</label>\n <Input\n value={name}\n onChange={(e) => form.setValue(\"name\", e.target.value)}\n placeholder=\"My Creative Work\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Description</label>\n <Textarea\n value={form.watch(\"description\")}\n onChange={(e) => form.setValue(\"description\", e.target.value)}\n placeholder=\"Describe your work, its story, and any context for buyers…\"\n rows={3}\n />\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">External link <span className=\"text-muted-foreground font-normal\">(optional)</span></label>\n <Input\n value={form.watch(\"external_url\")}\n onChange={(e) => form.setValue(\"external_url\", e.target.value)}\n placeholder=\"https://yourwebsite.com\"\n />\n </div>\n\n {mediaKind !== \"image\" && (\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Upload a cover image for your asset *</label>\n <div className=\"flex items-center gap-4\">\n <div\n role=\"button\"\n tabIndex={0}\n onClick={() => !featureUploading && featureInputRef.current?.click()}\n onKeyDown={(e) => { if ((e.key === \"Enter\" || e.key === \" \") && !featureUploading) { e.preventDefault(); featureInputRef.current?.click(); } }}\n className=\"relative h-20 w-20 rounded-xl border-2 border-dashed border-border bg-muted flex items-center justify-center overflow-hidden shrink-0 cursor-pointer hover:border-primary/50 transition-colors\"\n >\n {featurePreview ? (\n <Image src={featurePreview} alt=\"\" fill className=\"object-cover\" unoptimized />\n ) : (\n <ImagePlus className=\"h-6 w-6 text-muted-foreground\" />\n )}\n {featureUploading && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-background/70\">\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n </div>\n )}\n <input ref={featureInputRef} type=\"file\" accept={acceptFor(\"image\")} className=\"hidden\" onChange={(e) => { const f = e.target.files?.[0]; if (f) handleFeatureSelect(f); }} />\n </div>\n <p className=\"text-xs text-muted-foreground\">Cover art shown wherever the work is previewed. JPG, PNG, GIF, SVG or WebP.</p>\n </div>\n </div>\n )}\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Asset Type</label>\n <div className=\"grid grid-cols-2 gap-3\">\n <button\n type=\"button\"\n onClick={() => setAssetType(\"single\")}\n className={cn(\"flex items-start gap-3 rounded-xl border p-4 text-left transition-colors\",\n assetType === \"single\" ? \"border-brand-blue bg-brand-blue/5\" : \"border-border hover:bg-muted/40\")}\n >\n <SingleIcon className={cn(\"h-5 w-5 shrink-0 mt-0.5\", assetType === \"single\" ? \"text-brand-blue\" : \"text-muted-foreground\")} />\n <span>\n <span className=\"block text-sm font-semibold\">Single Edition NFT</span>\n <span className=\"block text-xs mt-0.5 text-muted-foreground\">Minted once</span>\n </span>\n </button>\n <button\n type=\"button\"\n onClick={() => setAssetType(\"editions\")}\n className={cn(\"flex items-start gap-3 rounded-xl border p-4 text-left transition-colors\",\n assetType === \"editions\" ? \"border-brand-blue bg-brand-blue/5\" : \"border-border hover:bg-muted/40\")}\n >\n <Layers className={cn(\"h-5 w-5 shrink-0 mt-0.5\", assetType === \"editions\" ? \"text-brand-blue\" : \"text-muted-foreground\")} />\n <span>\n <span className=\"block text-sm font-semibold\">Limited Editions NFT</span>\n <span className=\"block text-xs mt-0.5 text-muted-foreground\">Several numbered copies</span>\n </span>\n </button>\n </div>\n </div>\n\n {assetType === \"editions\" && (\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Number of copies</label>\n <Input\n type=\"number\"\n min={1}\n value={editionCount}\n onChange={(e) => setEditionCount(e.target.value)}\n className=\"max-w-[140px]\"\n />\n </div>\n )}\n\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <label className=\"text-sm font-medium flex items-center gap-1.5\">\n <Boxes className=\"h-4 w-4\" />\n Collection *\n </label>\n <div className=\"flex rounded-lg border border-border overflow-hidden\">\n <button\n type=\"button\"\n onClick={() => setCollectionMode(\"existing\")}\n className={cn(\"px-3 h-7 text-xs font-medium transition-colors\",\n collectionMode === \"existing\" ? \"bg-primary text-primary-foreground\" : \"bg-background hover:bg-muted text-muted-foreground\")}\n >\n Existing\n </button>\n <button\n type=\"button\"\n onClick={() => setCollectionMode(\"new\")}\n className={cn(\"px-3 h-7 text-xs font-medium border-l border-border transition-colors flex items-center gap-1\",\n collectionMode === \"new\" ? \"bg-primary text-primary-foreground\" : \"bg-background hover:bg-muted text-muted-foreground\")}\n >\n <Plus className=\"h-3 w-3\" />New\n </button>\n </div>\n </div>\n\n {collectionMode === \"existing\" ? (\n <CollectionPicker\n collections={assetType === \"single\" ? erc721Collections : erc1155Collections}\n value={assetType === \"single\" ? existingCollectionId : existingCollectionContract}\n onChange={assetType === \"single\" ? setExistingCollectionId : setExistingCollectionContract}\n valueOf={collectionKey(assetType === \"single\" ? \"single\" : \"editions\")}\n />\n ) : (\n <div className=\"flex gap-3 rounded-xl border border-border p-3\">\n <div className=\"relative h-16 w-16 rounded-lg overflow-hidden bg-muted shrink-0\">\n {(mediaKind === \"image\" ? mediaPreview : featurePreview) ? (\n <Image\n src={(mediaKind === \"image\" ? mediaPreview : featurePreview)!}\n alt=\"\"\n fill\n className=\"object-cover\"\n unoptimized\n />\n ) : (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <Boxes className=\"h-5 w-5 text-muted-foreground/40\" />\n </div>\n )}\n </div>\n <div className=\"min-w-0 flex-1 space-y-2\">\n <div className=\"grid grid-cols-[1fr_100px] gap-2\">\n <Input\n value={newCollectionName}\n onChange={(e) => setNewCollectionName(e.target.value)}\n placeholder=\"Collection name\"\n className=\"h-9 text-sm\"\n />\n <Input\n value={newCollectionSymbol}\n onChange={(e) => setNewCollectionSymbol(e.target.value.toUpperCase())}\n placeholder=\"SYMBOL\"\n className=\"h-9 text-sm\"\n />\n </div>\n <Textarea\n value={newCollectionDescription}\n onChange={(e) => setNewCollectionDescription(e.target.value)}\n placeholder=\"Describe this collection…\"\n rows={2}\n className=\"text-sm resize-none\"\n />\n <p className=\"text-2xs text-muted-foreground\">Prefilled from your asset — edit anything above.</p>\n </div>\n </div>\n )}\n </div>\n\n <Collapsible open={advancedOpen} onOpenChange={setAdvancedOpen}>\n <div className=\"rounded-xl border border-border overflow-hidden\">\n <CollapsibleTrigger asChild>\n <button type=\"button\" className=\"w-full flex items-center justify-between px-4 py-3.5 hover:bg-muted/30 transition-colors\">\n <span className=\"flex items-center gap-2\">\n <ShieldCheck className=\"h-4 w-4 text-primary\" />\n <span className=\"text-sm font-semibold\">Licensing Terms</span>\n <span className=\"text-xs text-muted-foreground font-normal\">Optional · Berne Convention</span>\n </span>\n <ChevronDown className={cn(\"h-4 w-4 text-muted-foreground transition-transform\", advancedOpen && \"rotate-180\")} />\n </button>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className=\"px-4 pb-4 space-y-4 border-t border-border/60 pt-4\">\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">License</label>\n <Select value={form.watch(\"licenseType\")} onValueChange={handleLicenseChange}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n {LICENSE_TYPES.map((l) => <SelectItem key={l.value} value={l.value}>{l.label}</SelectItem>)}\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">Commercial use</label>\n <ToggleGroup value={form.watch(\"commercialUse\")} options={[\"Yes\", \"No\"]} onChange={(v) => form.setValue(\"commercialUse\", v as \"Yes\" | \"No\")} />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">Derivatives</label>\n <ToggleGroup value={form.watch(\"derivatives\")} options={DERIVATIVES_OPTIONS} onChange={(v) => form.setValue(\"derivatives\", v as FormValues[\"derivatives\"])} />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">Territory</label>\n <Select value={form.watch(\"geographicScope\")} onValueChange={(v) => form.setValue(\"geographicScope\", v)}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n {GEOGRAPHIC_SCOPES.map((s) => <SelectItem key={s} value={s}>{s}</SelectItem>)}\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">AI &amp; data mining</label>\n <ToggleGroup value={form.watch(\"aiPolicy\")} options={AI_POLICIES} onChange={(v) => form.setValue(\"aiPolicy\", v as FormValues[\"aiPolicy\"])} />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">Royalty % (0–50)</label>\n <Input\n type=\"number\" min={0} max={50} step={0.5}\n value={form.watch(\"royalty\")}\n onChange={(e) => form.setValue(\"royalty\", parseFloat(e.target.value) || 0)}\n className=\"max-w-[120px]\"\n />\n </div>\n </div>\n </CollapsibleContent>\n </div>\n </Collapsible>\n\n <Collapsible open={ipTypeOpen} onOpenChange={setIpTypeOpen}>\n <div className=\"rounded-xl border border-border overflow-hidden\">\n <CollapsibleTrigger asChild>\n <button type=\"button\" className=\"w-full flex items-center justify-between px-4 py-3.5 hover:bg-muted/30 transition-colors\">\n <span className=\"flex items-center gap-2\">\n <Layers className=\"h-4 w-4 text-primary\" />\n <span className=\"text-sm font-semibold\">IP Type &amp; Metadata</span>\n <span className=\"text-xs text-muted-foreground font-normal\">Optional</span>\n </span>\n <ChevronDown className={cn(\"h-4 w-4 text-muted-foreground transition-transform\", ipTypeOpen && \"rotate-180\")} />\n </button>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className=\"px-4 pb-4 space-y-4 border-t border-border/60 pt-4\">\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">IP Type</label>\n <Select value={ipType} onValueChange={(v) => setIpType(v as IPType)}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n {IP_TYPES.map((t) => <SelectItem key={t} value={t}>{t}</SelectItem>)}\n </SelectContent>\n </Select>\n </div>\n <IPTypeFields\n ipType={ipType}\n onChange={(fields) => { templateFieldsRef.current = fields; }}\n uploadDocument={async (file) => {\n const token = await getUploadToken();\n if (!token) throw new Error(\"Sign in first\");\n const { uri } = await uploadFileToIpfs(client.api, file, \"document\");\n return uri;\n }}\n existingDocument={mediaKind === \"document\" && mediaUri && mediaFile ? { uri: mediaUri, name: mediaFile.name } : null}\n />\n </div>\n </CollapsibleContent>\n </div>\n </Collapsible>\n\n {status === \"error\" && errorMsg && <p className=\"text-xs text-destructive\">{errorMsg}</p>}\n\n <button\n type=\"button\"\n disabled={!ready || busy || !hasWallet}\n onClick={form.handleSubmit(onSubmit)}\n className={cn(\n \"w-full h-12 text-base font-semibold text-white rounded-xl flex items-center justify-center gap-2 transition-all hover:brightness-110 active:scale-[0.98] bg-brand-blue\",\n (!ready || busy || !hasWallet) && \"opacity-40 pointer-events-none\"\n )}\n >\n {busy ? <><Loader2 className=\"h-4 w-4 animate-spin\" />Minting…</> : assetType === \"single\" ? \"Mint NFT\" : \"Mint Editions\"}\n </button>\n <p className=\"text-xs text-center text-muted-foreground\">\n Zero platform fees to mint.\n </p>\n </div>\n\n <div className=\"order-first lg:order-last lg:sticky lg:top-20 max-w-[260px] mx-auto w-full lg:max-w-none lg:mx-0\">\n <MedialaneCollectionCard\n image={mediaKind === \"image\" ? mediaPreview : featurePreview}\n name={name}\n collection={collectionLabel}\n creator={walletAddress ? `${walletAddress.slice(0, 6)}…${walletAddress.slice(-4)}` : undefined}\n creatorHref={walletAddress ? profileHref({ address: walletAddress }) : undefined}\n />\n </div>\n </div>\n )}\n </section>\n );\n}\n"],"mappings":"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","names":["name","intentRes"]}
1
+ {"version":3,"sources":["../../../src/components/fast-mint/fast-mint.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport Image from \"next/image\";\nimport { useForm } from \"react-hook-form\";\nimport { buildAssetMetadata, type ApiCollection } from \"@medialane/sdk\";\nimport { describeError } from \"../../utils/describe-error.js\";\nimport { UPLOAD_LIMITS, acceptFor, uploadError } from \"../../utils/upload-limits.js\";\nimport { executeIntent, deployedCollectionFromReceipt, mintedTokenIdFromReceipt } from \"@medialane/sdk/starknet\";\nimport { mintableCollections, collectionKey } from \"./mintable-collections.js\";\nimport {\n ImagePlus, Music, Video, FileText, Loader2,\n Layers, ImagePlus as SingleIcon, ChevronDown, Boxes, Plus, Check,\n ShieldCheck, X,\n} from \"lucide-react\";\nimport { Input } from \"../input.js\";\nimport { Textarea } from \"../textarea.js\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../select.js\";\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"../collapsible.js\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../popover.js\";\nimport { MedialaneCollectionCard } from \"../medialane-collection-card.js\";\nimport { ActionDialog } from \"../action-dialog.js\";\nimport { IPTypeFields, type MetadataField } from \"../ip-type-fields.js\";\nimport {\n IP_TYPES, LICENSE_TYPES, GEOGRAPHIC_SCOPES, AI_POLICIES, DERIVATIVES_OPTIONS,\n type IPType,\n} from \"../../data/ip.js\";\nimport { IP_TEMPLATES } from \"../../data/ip-templates.js\";\nimport { suggestLaunchpadSymbol } from \"../../utils/launchpad-defaults.js\";\nimport { uploadFileToIpfs, uploadJsonToIpfs, uploadFailureToast } from \"../../utils/ipfs-upload.js\";\nimport { cn } from \"../../utils/cn.js\";\nimport { Dropzone } from \"./dropzone.js\";\nimport { SuccessView } from \"./success-view.js\";\nimport type { FastMintProps, FastMintSigner, MediaKind, MintedAsset } from \"./types.js\";\nimport { profileHref } from \"@medialane/sdk\";\nimport { useImageUrl } from \"../../utils/use-image-url.js\";\n\nconst MEDIA_ROUTE_MIME_TYPES = new Set(UPLOAD_LIMITS.media.mimeTypes);\nconst DOCUMENT_MIME_TYPES = new Set(UPLOAD_LIMITS.document.mimeTypes.filter((type) => type !== \"application/octet-stream\"));\n\nfunction detectMediaKind(mime: string): MediaKind | null {\n if (mime.startsWith(\"image/\")) return MEDIA_ROUTE_MIME_TYPES.has(mime) ? \"image\" : null;\n if (mime.startsWith(\"video/\")) return MEDIA_ROUTE_MIME_TYPES.has(mime) ? \"video\" : null;\n if (mime.startsWith(\"audio/\")) return MEDIA_ROUTE_MIME_TYPES.has(mime) ? \"audio\" : null;\n if (DOCUMENT_MIME_TYPES.has(mime)) return \"document\";\n return null;\n}\n\nconst IP_TYPE_BY_KIND: Record<MediaKind, IPType> = {\n image: \"NFT\",\n audio: \"Audio\",\n video: \"Video\",\n document: \"Documents\",\n};\n\nconst MEDIA_KIND_ICON: Record<MediaKind, typeof ImagePlus> = {\n image: ImagePlus,\n audio: Music,\n video: Video,\n document: FileText,\n};\n\nfunction ToggleGroup({\n value, options, onChange,\n}: { value: string; options: readonly string[]; onChange: (v: string) => void }) {\n return (\n <div className=\"flex rounded-lg border border-border overflow-hidden w-full\">\n {options.map((opt, i) => (\n <button\n key={opt}\n type=\"button\"\n onClick={() => onChange(opt)}\n className={cn(\n \"flex-1 px-3 py-2 text-sm transition-colors\",\n i > 0 && \"border-l border-border\",\n value === opt ? \"bg-primary text-primary-foreground font-medium\" : \"bg-background hover:bg-muted text-muted-foreground\"\n )}\n >\n {opt}\n </button>\n ))}\n </div>\n );\n}\n\nfunction collectionDisplayLabel(col: ApiCollection) {\n return col.name || col.symbol || `Collection #${col.collectionId}`;\n}\n\nfunction CollectionThumb({ image }: { image: string | null | undefined }) {\n const resolveImage = useImageUrl();\n const imageUrl = resolveImage(image);\n return (\n <div className=\"relative h-10 w-10 rounded-lg overflow-hidden bg-muted shrink-0\">\n {imageUrl ? (\n <Image src={imageUrl} alt=\"\" fill className=\"object-cover\" unoptimized />\n ) : (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <Boxes className=\"h-4 w-4 text-muted-foreground/40\" />\n </div>\n )}\n </div>\n );\n}\n\nfunction CollectionPicker({\n collections, value, onChange, valueOf,\n}: {\n collections: ApiCollection[];\n value: string;\n onChange: (id: string) => void;\n valueOf: (c: ApiCollection) => string | null | undefined;\n}) {\n const [open, setOpen] = useState(false);\n const selected = value\n ? collections.find((c) => valueOf(c) === value) ?? null\n : null;\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-expanded={open}\n className=\"flex w-full items-center gap-3 rounded-xl border border-border p-3 text-left transition-colors hover:bg-muted/40\"\n >\n <CollectionThumb image={selected?.image} />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-semibold truncate\">\n {selected ? collectionDisplayLabel(selected) : collections.length ? \"Choose a collection\" : \"No collections yet\"}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {selected ? `${selected.totalSupply ?? 0} work${selected.totalSupply === 1 ? \"\" : \"s\"}` : \"Where this work will live\"}\n </p>\n </div>\n <ChevronDown className=\"h-3.5 w-3.5 text-muted-foreground shrink-0\" />\n </button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[var(--radix-popover-trigger-width)] p-0\" align=\"start\">\n <div className=\"max-h-64 overflow-y-auto p-1\">\n {collections.length === 0 ? (\n <p className=\"px-3 py-4 text-center text-sm text-muted-foreground\">No collections yet — create one instead.</p>\n ) : (\n collections.map((col) => {\n const id = valueOf(col);\n const isSelected = !!id && value === id;\n return (\n <button\n key={id ?? col.contractAddress ?? col.name}\n type=\"button\"\n disabled={!id}\n onClick={() => { if (!id) return; onChange(id); setOpen(false); }}\n className=\"flex w-full items-center gap-2.5 rounded-lg px-2 py-2 text-left transition-colors hover:bg-muted/60\"\n >\n <CollectionThumb image={col.image} />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium truncate\">{collectionDisplayLabel(col)}</p>\n <p className=\"text-xs text-muted-foreground\">{col.totalSupply ?? 0} work{col.totalSupply === 1 ? \"\" : \"s\"}</p>\n </div>\n {isSelected && <Check className=\"h-4 w-4 text-brand-blue shrink-0\" />}\n </button>\n );\n })\n )}\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n\ninterface FormValues {\n name: string;\n description: string;\n external_url: string;\n licenseType: string;\n commercialUse: \"Yes\" | \"No\";\n derivatives: \"Allowed\" | \"Not Allowed\" | \"Share-Alike\";\n attribution: \"Required\" | \"Not Required\";\n geographicScope: string;\n aiPolicy: \"Allowed\" | \"Not Allowed\" | \"Training Only\";\n royalty: number;\n}\n\nexport function FastMint(props: FastMintProps) {\n const {\n presentation = \"inline\", open = true, onClose, mediaKindLock, onMinted,\n collections, refetchCollections,\n hasWallet, walletAddress, onRequireWallet, connectLabel, getUploadToken, getSigner,\n client, successFooter,\n } = props;\n\n const [status, setStatus] = useState<\"idle\" | \"minting\" | \"success\" | \"error\">(\"idle\");\n const [errorMsg, setErrorMsg] = useState<string | null>(null);\n\n const [mediaFile, setMediaFile] = useState<File | null>(null);\n const [mediaPreview, setMediaPreview] = useState<string | null>(null);\n const [mediaUri, setMediaUri] = useState<string | null>(null);\n const [mediaKind, setMediaKind] = useState<MediaKind>(\"image\");\n const [mediaUploading, setMediaUploading] = useState(false);\n const previewUrlRef = useRef<string | null>(null);\n const mediaInputRef = useRef<HTMLInputElement>(null);\n\n const [featurePreview, setFeaturePreview] = useState<string | null>(null);\n const [featureUri, setFeatureUri] = useState<string | null>(null);\n const [featureUploading, setFeatureUploading] = useState(false);\n const featurePreviewRef = useRef<string | null>(null);\n const featureInputRef = useRef<HTMLInputElement>(null);\n\n const [assetType, setAssetType] = useState<\"single\" | \"editions\">(\"single\");\n const [editionCount, setEditionCount] = useState(\"10\");\n\n const [collectionMode, setCollectionMode] = useState<\"existing\" | \"new\">(\"existing\");\n const [existingCollectionId, setExistingCollectionId] = useState(\"\");\n const [existingCollectionContract, setExistingCollectionContract] = useState(\"\");\n const [newCollectionName, setNewCollectionName] = useState(\"\");\n const [newCollectionSymbol, setNewCollectionSymbol] = useState(\"\");\n const [newCollectionDescription, setNewCollectionDescription] = useState(\"\");\n const [autoSymbol, setAutoSymbol] = useState(\"\");\n const [autoCollectionName, setAutoCollectionName] = useState(\"\");\n const [autoCollectionDescription, setAutoCollectionDescription] = useState(\"\");\n\n const [ipType, setIpType] = useState<IPType>(\"NFT\");\n const [advancedOpen, setAdvancedOpen] = useState(false);\n const [ipTypeOpen, setIpTypeOpen] = useState(false);\n const templateFieldsRef = useRef<MetadataField[]>([]);\n\n const [mintedAsset, setMintedAsset] = useState<MintedAsset | null>(null);\n\n useEffect(() => () => {\n if (previewUrlRef.current) URL.revokeObjectURL(previewUrlRef.current);\n if (featurePreviewRef.current) URL.revokeObjectURL(featurePreviewRef.current);\n }, []);\n\n const form = useForm<FormValues>({\n defaultValues: {\n name: \"\", description: \"\", external_url: \"\",\n licenseType: \"CC BY-SA\", commercialUse: \"Yes\", derivatives: \"Share-Alike\",\n attribution: \"Required\", geographicScope: \"Worldwide\", aiPolicy: \"Not Allowed\", royalty: 0,\n },\n });\n const name = form.watch(\"name\");\n\n useEffect(() => {\n if (walletAddress && !form.getValues(\"external_url\")) {\n form.setValue(\"external_url\", `https://medialane.io/account/${walletAddress}`);\n }\n }, [walletAddress, form]);\n\n useEffect(() => {\n const s = suggestLaunchpadSymbol(name);\n if (!s) return;\n if (!newCollectionSymbol || newCollectionSymbol === autoSymbol) {\n setNewCollectionSymbol(s);\n setAutoSymbol(s);\n }\n if (!newCollectionName || newCollectionName === autoCollectionName) {\n setNewCollectionName(name);\n setAutoCollectionName(name);\n }\n }, [name, autoSymbol, autoCollectionName, newCollectionSymbol, newCollectionName]);\n\n const description = form.watch(\"description\");\n useEffect(() => {\n if (!newCollectionDescription || newCollectionDescription === autoCollectionDescription) {\n setNewCollectionDescription(description);\n setAutoCollectionDescription(description);\n }\n }, [description, autoCollectionDescription, newCollectionDescription]);\n\n const erc721Collections = mintableCollections(\"single\", collections);\n const erc1155Collections = mintableCollections(\"editions\", collections);\n\n const handleMediaSelect = async (file: File) => {\n const kind = detectMediaKind(file.type);\n if (!kind) {\n setErrorMsg(\"Publish an image, audio, video (JPG/PNG/GIF/SVG/WebP, MP3/WAV/OGG/FLAC, MP4/WebM), or document (PDF, DOC, DOCX, ODT, RTF, TXT, MD).\");\n return;\n }\n if (mediaKindLock && kind !== mediaKindLock) {\n setErrorMsg(`Please upload a${mediaKindLock === \"image\" ? \"n\" : \"\"} ${mediaKindLock}.`);\n return;\n }\n const viaMediaRoute = MEDIA_ROUTE_MIME_TYPES.has(file.type);\n const fileError = uploadError(file, viaMediaRoute ? \"media\" : \"document\");\n if (fileError) {\n setErrorMsg(fileError);\n return;\n }\n setMediaFile(file);\n setMediaKind(kind);\n setIpType(IP_TYPE_BY_KIND[kind]);\n if (previewUrlRef.current) URL.revokeObjectURL(previewUrlRef.current);\n const objectUrl = URL.createObjectURL(file);\n previewUrlRef.current = objectUrl;\n setMediaPreview(objectUrl);\n setMediaUri(null);\n setMediaUploading(true);\n try {\n const token = await getUploadToken();\n if (!token) throw new Error(\"Sign in first\");\n const { uri } = await uploadFileToIpfs(client.api, file, viaMediaRoute ? \"media\" : \"document\");\n setMediaUri(uri);\n } catch (err) {\n const t = uploadFailureToast(err);\n setErrorMsg(t.description ?? t.title);\n } finally {\n setMediaUploading(false);\n }\n };\n\n const clearMedia = () => {\n setMediaFile(null);\n setMediaPreview(null);\n setMediaUri(null);\n if (mediaInputRef.current) mediaInputRef.current.value = \"\";\n };\n\n const handleFeatureSelect = async (file: File) => {\n if (featurePreviewRef.current) URL.revokeObjectURL(featurePreviewRef.current);\n const objectUrl = URL.createObjectURL(file);\n featurePreviewRef.current = objectUrl;\n setFeaturePreview(objectUrl);\n setFeatureUri(null);\n setFeatureUploading(true);\n try {\n const token = await getUploadToken();\n if (!token) throw new Error(\"Sign in first\");\n const { uri } = await uploadFileToIpfs(client.api, file, \"image\");\n setFeatureUri(uri);\n } catch (err) {\n const t = uploadFailureToast(err);\n setErrorMsg(t.description ?? t.title);\n } finally {\n setFeatureUploading(false);\n }\n };\n\n const handleLicenseChange = (value: string) => {\n form.setValue(\"licenseType\", value);\n const def = LICENSE_TYPES.find((l) => l.value === value);\n if (def) {\n form.setValue(\"commercialUse\", def.commercialUse);\n form.setValue(\"derivatives\", def.derivatives);\n form.setValue(\"attribution\", def.attribution);\n }\n };\n\n const ready = !!mediaUri && !mediaUploading && name.trim().length > 0 &&\n (mediaKind === \"image\" || !!featureUri) &&\n (collectionMode === \"existing\"\n ? assetType === \"single\" ? !!existingCollectionId : !!existingCollectionContract\n : newCollectionName.trim().length > 0 && newCollectionSymbol.trim().length > 0);\n\n async function pollForNewCollection(name: string, symbol: string): Promise<ApiCollection | null> {\n for (let attempt = 0; attempt < 8; attempt++) {\n const list = await refetchCollections();\n const match = list.find((c) => c.name === name && c.symbol === symbol);\n if (match?.collectionId) return match;\n await new Promise((r) => setTimeout(r, 1500));\n }\n return null;\n }\n\n const onSubmit = async (values: FormValues) => {\n if (!hasWallet) { onRequireWallet(); return; }\n if (!walletAddress || !mediaUri) return;\n if (values.external_url && !values.external_url.startsWith(\"http://\") && !values.external_url.startsWith(\"https://\")) {\n setErrorMsg(\"External link must start with http:// or https://\");\n return;\n }\n\n setStatus(\"minting\");\n setErrorMsg(null);\n\n try {\n const signer: FastMintSigner = await getSigner();\n\n const image = mediaKind === \"image\" ? mediaUri : featureUri!;\n const animationUrl = mediaKind === \"image\" ? undefined : mediaUri;\n\n const built = buildAssetMetadata({\n name: values.name,\n description: values.description || \"\",\n externalUrl: values.external_url || \"\",\n imageUri: image,\n creator: walletAddress,\n ipType,\n licenseType: values.licenseType,\n commercialUse: values.commercialUse,\n derivatives: values.derivatives,\n attribution: values.attribution,\n geographicScope: values.geographicScope,\n aiPolicy: values.aiPolicy,\n royalty: String(values.royalty),\n templateTraits: templateFieldsRef.current\n .filter(({ traitType, value }) => traitType.trim() && value.trim())\n .map(({ traitType, value }) => ({ traitType, value })),\n });\n const metadata: Record<string, unknown> = { ...built };\n if (animationUrl) metadata.animation_url = animationUrl;\n\n const uploadToken = await getUploadToken();\n if (!uploadToken) throw new Error(\"Sign in first\");\n const tokenUri = await uploadJsonToIpfs(client.api, metadata);\n\n let result: Awaited<ReturnType<typeof executeIntent>>;\n let finalContractAddress: string | null;\n let finalTokenId: string | null = null;\n\n if (assetType === \"single\") {\n let collectionId = existingCollectionId;\n let contractAddress = erc721Collections.find((c) => c.collectionId === existingCollectionId)?.contractAddress ?? null;\n\n if (collectionMode === \"new\") {\n const intentRes = await client.api.intents.create(\"create-collection\", {\n owner: walletAddress,\n name: newCollectionName,\n symbol: newCollectionSymbol,\n description: newCollectionDescription || undefined,\n image,\n });\n await executeIntent(signer, client, intentRes);\n\n const found = await pollForNewCollection(newCollectionName, newCollectionSymbol);\n if (!found) throw new Error(\"Collection created, but it's still indexing — try minting again in a moment from My Collections.\");\n collectionId = found.collectionId!;\n contractAddress = found.contractAddress ?? null;\n }\n\n const intentRes = await client.api.intents.create(\"mint\", {\n owner: walletAddress,\n collectionId,\n recipient: walletAddress,\n tokenUri,\n royaltyBps: Math.round(values.royalty * 100),\n });\n result = await executeIntent(signer, client, intentRes);\n finalContractAddress = contractAddress;\n\n if (finalContractAddress) {\n finalTokenId = mintedTokenIdFromReceipt(result.receipt, finalContractAddress);\n }\n } else {\n let collectionContract = existingCollectionContract;\n\n if (collectionMode === \"new\") {\n const intentRes = await client.api.intents.create(\"create-collection\", {\n owner: walletAddress,\n name: newCollectionName,\n symbol: newCollectionSymbol,\n description: newCollectionDescription || undefined,\n image,\n baseUri: \"\",\n service: \"mip-erc1155\",\n });\n const deployResult = await executeIntent(signer, client, intentRes);\n\n const deployed = deployedCollectionFromReceipt(deployResult.receipt, \"mip-erc1155\");\n if (!deployed) throw new Error(\"Collection deployed, but its address couldn't be read — check My Collections to mint into it.\");\n collectionContract = deployed;\n }\n\n const intentRes = await client.api.intents.create(\"mint\", {\n owner: walletAddress,\n recipient: walletAddress,\n collectionContract,\n tokenUri,\n value: editionCount,\n royaltyBps: Math.round(values.royalty * 100),\n });\n result = await executeIntent(signer, client, intentRes);\n finalContractAddress = collectionContract;\n finalTokenId = mintedTokenIdFromReceipt(result.receipt, collectionContract);\n }\n\n if (finalContractAddress && finalTokenId) {\n const asset: MintedAsset = { contract: finalContractAddress, tokenId: finalTokenId, image };\n setMintedAsset(asset);\n onMinted?.(asset);\n }\n setStatus(\"success\");\n } catch (err) {\n setErrorMsg(describeError(err).message);\n setStatus(\"error\");\n }\n };\n\n const resetAll = () => {\n setStatus(\"idle\");\n setErrorMsg(null);\n setMintedAsset(null);\n form.reset();\n clearMedia();\n setFeaturePreview(null);\n setFeatureUri(null);\n setAssetType(\"single\");\n setEditionCount(\"10\");\n setCollectionMode(\"existing\");\n setExistingCollectionId(\"\");\n setExistingCollectionContract(\"\");\n setNewCollectionName(\"\");\n setNewCollectionSymbol(\"\");\n setNewCollectionDescription(\"\");\n setAutoSymbol(\"\");\n setAutoCollectionName(\"\");\n setAutoCollectionDescription(\"\");\n templateFieldsRef.current = [];\n };\n\n const busy = status === \"minting\";\n const KindIcon = MEDIA_KIND_ICON[mediaKind];\n const selectedExistingCollection = assetType === \"single\"\n ? erc721Collections.find((c) => c.collectionId === existingCollectionId)\n : erc1155Collections.find((c) => c.contractAddress === existingCollectionContract);\n const collectionLabel = mediaUri\n ? (collectionMode === \"new\"\n ? (newCollectionName || \"New collection\")\n : (selectedExistingCollection?.name || \"IP Asset\"))\n : undefined;\n\n const wrap = (node: React.ReactNode) => {\n if (presentation !== \"dialog\") return node;\n return (\n <ActionDialog open={open} onClose={onClose ?? (() => {})} width={640}>\n <div className=\"relative p-6 sm:p-8\">\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Close\"\n className=\"absolute top-4 right-4 h-8 w-8 rounded-full hover:bg-muted flex items-center justify-center text-muted-foreground\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n {node}\n </div>\n </ActionDialog>\n );\n };\n\n if (status === \"success\") {\n return wrap(\n <SuccessView\n footer={successFooter}\n presentation={presentation}\n previewImage={mediaKind === \"image\" ? mediaPreview : featurePreview}\n name={name}\n collectionLabel={collectionLabel}\n mintedAsset={mintedAsset}\n onPublishAnother={resetAll}\n />\n );\n }\n\n if (!mediaFile) {\n return wrap(\n <Dropzone\n mediaKindLock={mediaKindLock}\n presentation={presentation}\n hasWallet={hasWallet}\n onRequireWallet={onRequireWallet}\n connectLabel={connectLabel}\n onFileSelected={handleMediaSelect}\n />\n );\n }\n\n return wrap(\n <section className=\"space-y-6\">\n <div className=\"flex items-center gap-4 rounded-xl border border-border p-3\">\n <div className=\"relative h-14 w-14 rounded-lg bg-muted overflow-hidden shrink-0\">\n {mediaKind === \"image\" && mediaPreview ? (\n <Image src={mediaPreview} alt=\"\" fill className=\"object-cover\" unoptimized />\n ) : (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <KindIcon className=\"h-6 w-6 text-muted-foreground\" />\n </div>\n )}\n {mediaUploading && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-background/70\">\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n </div>\n )}\n </div>\n <div className=\"min-w-0 flex-1 space-y-1\">\n <p className=\"text-sm font-semibold truncate\">{mediaFile.name}</p>\n <div className=\"flex items-center gap-2 flex-wrap\">\n <p className=\"text-xs text-muted-foreground\">\n {mediaUploading ? \"Uploading…\" : mediaUri ? \"Uploaded\" : \"Upload failed\"}\n </p>\n {mediaUri && (() => {\n const template = IP_TEMPLATES[ipType];\n const TemplateIcon = template.icon;\n return (\n <span\n className={cn(\n \"inline-flex shrink-0 items-center gap-1 rounded-full border px-2 py-0.5 text-2xs font-medium\",\n template.color.bg, template.color.text, template.color.border\n )}\n >\n <TemplateIcon className=\"h-3 w-3\" />\n {template.label}\n </span>\n );\n })()}\n </div>\n </div>\n <button\n type=\"button\"\n onClick={() => mediaInputRef.current?.click()}\n className=\"text-xs font-semibold text-brand-blue hover:underline shrink-0\"\n >\n Change\n </button>\n <input ref={mediaInputRef} type=\"file\" className=\"hidden\" onChange={(e) => { const f = e.target.files?.[0]; if (f) handleMediaSelect(f); }} />\n </div>\n\n {mediaUri && (\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_320px] gap-8 items-start\">\n <div className=\"space-y-5\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Title *</label>\n <Input\n value={name}\n onChange={(e) => form.setValue(\"name\", e.target.value)}\n placeholder=\"My Creative Work\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Description</label>\n <Textarea\n value={form.watch(\"description\")}\n onChange={(e) => form.setValue(\"description\", e.target.value)}\n placeholder=\"Describe your work, its story, and any context for buyers…\"\n rows={3}\n />\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">External link <span className=\"text-muted-foreground font-normal\">(optional)</span></label>\n <Input\n value={form.watch(\"external_url\")}\n onChange={(e) => form.setValue(\"external_url\", e.target.value)}\n placeholder=\"https://yourwebsite.com\"\n />\n </div>\n\n {mediaKind !== \"image\" && (\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Upload a cover image for your asset *</label>\n <div className=\"flex items-center gap-4\">\n <div\n role=\"button\"\n tabIndex={0}\n onClick={() => !featureUploading && featureInputRef.current?.click()}\n onKeyDown={(e) => { if ((e.key === \"Enter\" || e.key === \" \") && !featureUploading) { e.preventDefault(); featureInputRef.current?.click(); } }}\n className=\"relative h-20 w-20 rounded-xl border-2 border-dashed border-border bg-muted flex items-center justify-center overflow-hidden shrink-0 cursor-pointer hover:border-primary/50 transition-colors\"\n >\n {featurePreview ? (\n <Image src={featurePreview} alt=\"\" fill className=\"object-cover\" unoptimized />\n ) : (\n <ImagePlus className=\"h-6 w-6 text-muted-foreground\" />\n )}\n {featureUploading && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-background/70\">\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n </div>\n )}\n <input ref={featureInputRef} type=\"file\" accept={acceptFor(\"image\")} className=\"hidden\" onChange={(e) => { const f = e.target.files?.[0]; if (f) handleFeatureSelect(f); }} />\n </div>\n <p className=\"text-xs text-muted-foreground\">Cover art shown wherever the work is previewed. JPG, PNG, GIF, SVG or WebP.</p>\n </div>\n </div>\n )}\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Asset Type</label>\n <div className=\"grid grid-cols-2 gap-3\">\n <button\n type=\"button\"\n onClick={() => setAssetType(\"single\")}\n className={cn(\"flex items-start gap-3 rounded-xl border p-4 text-left transition-colors\",\n assetType === \"single\" ? \"border-brand-blue bg-brand-blue/5\" : \"border-border hover:bg-muted/40\")}\n >\n <SingleIcon className={cn(\"h-5 w-5 shrink-0 mt-0.5\", assetType === \"single\" ? \"text-brand-blue\" : \"text-muted-foreground\")} />\n <span>\n <span className=\"block text-sm font-semibold\">Single Edition NFT</span>\n <span className=\"block text-xs mt-0.5 text-muted-foreground\">Minted once</span>\n </span>\n </button>\n <button\n type=\"button\"\n onClick={() => setAssetType(\"editions\")}\n className={cn(\"flex items-start gap-3 rounded-xl border p-4 text-left transition-colors\",\n assetType === \"editions\" ? \"border-brand-blue bg-brand-blue/5\" : \"border-border hover:bg-muted/40\")}\n >\n <Layers className={cn(\"h-5 w-5 shrink-0 mt-0.5\", assetType === \"editions\" ? \"text-brand-blue\" : \"text-muted-foreground\")} />\n <span>\n <span className=\"block text-sm font-semibold\">Limited Editions NFT</span>\n <span className=\"block text-xs mt-0.5 text-muted-foreground\">Several numbered copies</span>\n </span>\n </button>\n </div>\n </div>\n\n {assetType === \"editions\" && (\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Number of copies</label>\n <Input\n type=\"number\"\n min={1}\n value={editionCount}\n onChange={(e) => setEditionCount(e.target.value)}\n className=\"max-w-[140px]\"\n />\n </div>\n )}\n\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <label className=\"text-sm font-medium flex items-center gap-1.5\">\n <Boxes className=\"h-4 w-4\" />\n Collection *\n </label>\n <div className=\"flex rounded-lg border border-border overflow-hidden\">\n <button\n type=\"button\"\n onClick={() => setCollectionMode(\"existing\")}\n className={cn(\"px-3 h-7 text-xs font-medium transition-colors\",\n collectionMode === \"existing\" ? \"bg-primary text-primary-foreground\" : \"bg-background hover:bg-muted text-muted-foreground\")}\n >\n Existing\n </button>\n <button\n type=\"button\"\n onClick={() => setCollectionMode(\"new\")}\n className={cn(\"px-3 h-7 text-xs font-medium border-l border-border transition-colors flex items-center gap-1\",\n collectionMode === \"new\" ? \"bg-primary text-primary-foreground\" : \"bg-background hover:bg-muted text-muted-foreground\")}\n >\n <Plus className=\"h-3 w-3\" />New\n </button>\n </div>\n </div>\n\n {collectionMode === \"existing\" ? (\n <CollectionPicker\n collections={assetType === \"single\" ? erc721Collections : erc1155Collections}\n value={assetType === \"single\" ? existingCollectionId : existingCollectionContract}\n onChange={assetType === \"single\" ? setExistingCollectionId : setExistingCollectionContract}\n valueOf={collectionKey(assetType === \"single\" ? \"single\" : \"editions\")}\n />\n ) : (\n <div className=\"flex gap-3 rounded-xl border border-border p-3\">\n <div className=\"relative h-16 w-16 rounded-lg overflow-hidden bg-muted shrink-0\">\n {(mediaKind === \"image\" ? mediaPreview : featurePreview) ? (\n <Image\n src={(mediaKind === \"image\" ? mediaPreview : featurePreview)!}\n alt=\"\"\n fill\n className=\"object-cover\"\n unoptimized\n />\n ) : (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <Boxes className=\"h-5 w-5 text-muted-foreground/40\" />\n </div>\n )}\n </div>\n <div className=\"min-w-0 flex-1 space-y-2\">\n <div className=\"grid grid-cols-[1fr_100px] gap-2\">\n <Input\n value={newCollectionName}\n onChange={(e) => setNewCollectionName(e.target.value)}\n placeholder=\"Collection name\"\n className=\"h-9 text-sm\"\n />\n <Input\n value={newCollectionSymbol}\n onChange={(e) => setNewCollectionSymbol(e.target.value.toUpperCase())}\n placeholder=\"SYMBOL\"\n className=\"h-9 text-sm\"\n />\n </div>\n <Textarea\n value={newCollectionDescription}\n onChange={(e) => setNewCollectionDescription(e.target.value)}\n placeholder=\"Describe this collection…\"\n rows={2}\n className=\"text-sm resize-none\"\n />\n <p className=\"text-2xs text-muted-foreground\">Prefilled from your asset — edit anything above.</p>\n </div>\n </div>\n )}\n </div>\n\n <Collapsible open={advancedOpen} onOpenChange={setAdvancedOpen}>\n <div className=\"rounded-xl border border-border overflow-hidden\">\n <CollapsibleTrigger asChild>\n <button type=\"button\" className=\"w-full flex items-center justify-between px-4 py-3.5 hover:bg-muted/30 transition-colors\">\n <span className=\"flex items-center gap-2\">\n <ShieldCheck className=\"h-4 w-4 text-primary\" />\n <span className=\"text-sm font-semibold\">Licensing Terms</span>\n <span className=\"text-xs text-muted-foreground font-normal\">Optional · Berne Convention</span>\n </span>\n <ChevronDown className={cn(\"h-4 w-4 text-muted-foreground transition-transform\", advancedOpen && \"rotate-180\")} />\n </button>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className=\"px-4 pb-4 space-y-4 border-t border-border/60 pt-4\">\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">License</label>\n <Select value={form.watch(\"licenseType\")} onValueChange={handleLicenseChange}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n {LICENSE_TYPES.map((l) => <SelectItem key={l.value} value={l.value}>{l.label}</SelectItem>)}\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">Commercial use</label>\n <ToggleGroup value={form.watch(\"commercialUse\")} options={[\"Yes\", \"No\"]} onChange={(v) => form.setValue(\"commercialUse\", v as \"Yes\" | \"No\")} />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">Derivatives</label>\n <ToggleGroup value={form.watch(\"derivatives\")} options={DERIVATIVES_OPTIONS} onChange={(v) => form.setValue(\"derivatives\", v as FormValues[\"derivatives\"])} />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">Territory</label>\n <Select value={form.watch(\"geographicScope\")} onValueChange={(v) => form.setValue(\"geographicScope\", v)}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n {GEOGRAPHIC_SCOPES.map((s) => <SelectItem key={s} value={s}>{s}</SelectItem>)}\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">AI &amp; data mining</label>\n <ToggleGroup value={form.watch(\"aiPolicy\")} options={AI_POLICIES} onChange={(v) => form.setValue(\"aiPolicy\", v as FormValues[\"aiPolicy\"])} />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">Royalty % (0–50)</label>\n <Input\n type=\"number\" min={0} max={50} step={0.5}\n value={form.watch(\"royalty\")}\n onChange={(e) => form.setValue(\"royalty\", parseFloat(e.target.value) || 0)}\n className=\"max-w-[120px]\"\n />\n </div>\n </div>\n </CollapsibleContent>\n </div>\n </Collapsible>\n\n <Collapsible open={ipTypeOpen} onOpenChange={setIpTypeOpen}>\n <div className=\"rounded-xl border border-border overflow-hidden\">\n <CollapsibleTrigger asChild>\n <button type=\"button\" className=\"w-full flex items-center justify-between px-4 py-3.5 hover:bg-muted/30 transition-colors\">\n <span className=\"flex items-center gap-2\">\n <Layers className=\"h-4 w-4 text-primary\" />\n <span className=\"text-sm font-semibold\">IP Type &amp; Metadata</span>\n <span className=\"text-xs text-muted-foreground font-normal\">Optional</span>\n </span>\n <ChevronDown className={cn(\"h-4 w-4 text-muted-foreground transition-transform\", ipTypeOpen && \"rotate-180\")} />\n </button>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className=\"px-4 pb-4 space-y-4 border-t border-border/60 pt-4\">\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">IP Type</label>\n <Select value={ipType} onValueChange={(v) => setIpType(v as IPType)}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n {IP_TYPES.map((t) => <SelectItem key={t} value={t}>{t}</SelectItem>)}\n </SelectContent>\n </Select>\n </div>\n <IPTypeFields\n ipType={ipType}\n onChange={(fields) => { templateFieldsRef.current = fields; }}\n uploadDocument={async (file) => {\n const token = await getUploadToken();\n if (!token) throw new Error(\"Sign in first\");\n const { uri } = await uploadFileToIpfs(client.api, file, \"document\");\n return uri;\n }}\n existingDocument={mediaKind === \"document\" && mediaUri && mediaFile ? { uri: mediaUri, name: mediaFile.name } : null}\n />\n </div>\n </CollapsibleContent>\n </div>\n </Collapsible>\n\n {status === \"error\" && errorMsg && <p className=\"text-xs text-destructive\">{errorMsg}</p>}\n\n <button\n type=\"button\"\n disabled={!ready || busy || !hasWallet}\n onClick={form.handleSubmit(onSubmit)}\n className={cn(\n \"w-full h-12 text-base font-semibold text-white rounded-xl flex items-center justify-center gap-2 transition-all hover:brightness-110 active:scale-[0.98] bg-brand-blue\",\n (!ready || busy || !hasWallet) && \"opacity-40 pointer-events-none\"\n )}\n >\n {busy ? <><Loader2 className=\"h-4 w-4 animate-spin\" />Minting…</> : assetType === \"single\" ? \"Mint NFT\" : \"Mint Editions\"}\n </button>\n <p className=\"text-xs text-center text-muted-foreground\">\n Zero platform fees to mint.\n </p>\n </div>\n\n <div className=\"order-first lg:order-last lg:sticky lg:top-20 max-w-[260px] mx-auto w-full lg:max-w-none lg:mx-0\">\n <MedialaneCollectionCard\n image={mediaKind === \"image\" ? mediaPreview : featurePreview}\n name={name}\n collection={collectionLabel}\n creator={walletAddress ? `${walletAddress.slice(0, 6)}…${walletAddress.slice(-4)}` : undefined}\n creatorHref={walletAddress ? profileHref({ address: walletAddress }) : undefined}\n />\n </div>\n </div>\n )}\n </section>\n );\n}\n"],"mappings":"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","names":["name","intentRes"]}
@@ -47,7 +47,7 @@ var import_coin_launch_preview = require("../coin-launch-preview.js");
47
47
  var import_currency_icon = require("../currency-icon.js");
48
48
  var import_gradient_button = require("../gradient-button.js");
49
49
  var import_claim_route_shell = require("../claim-route-shell.js");
50
- var import_creation_success = require("../creation-success.js");
50
+ var import_transaction_success = require("../transaction-success.js");
51
51
  var import_transaction_dialog = require("../transaction-dialog.js");
52
52
  var import_wallet_required = require("../wallet-required.js");
53
53
  var import_medialane_app = require("../medialane-app.js");
@@ -182,15 +182,17 @@ function CoinCreate({ aside, tradeHref }) {
182
182
  description: "Secure your account to design and launch your own coin with permanently-locked liquidity, in a few clicks.",
183
183
  children: [
184
184
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_transaction_dialog.TransactionDialog, { tx, title: "Launch your coin", workingLabel: "Launching your coin\u2026", firstStepLabel: "Deploy your coin", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
185
- import_creation_success.CreationSuccess,
185
+ import_transaction_success.TransactionSuccess,
186
186
  {
187
187
  name: name || "Your coin",
188
188
  image: imagePreview,
189
- caption: "Your coin is live",
190
- primary: coinAddress ? { href: tradeHref(coinAddress), label: "View & trade your coin" } : { href: "/launchpad", label: "Back to Launchpad" },
191
- secondary: coinAddress ? { href: "/launchpad", label: "Back to Launchpad" } : void 0,
192
- onAgain: handleReset,
193
- againLabel: "Launch another coin",
189
+ title: "Coin launched",
190
+ description: "The supply is fixed and the liquidity is locked.",
191
+ actions: [
192
+ ...coinAddress ? [{ href: tradeHref(coinAddress), label: "View & trade your coin" }] : [],
193
+ { href: "/launchpad", label: "Back to Launchpad" },
194
+ { label: "Launch another coin", onClick: handleReset }
195
+ ],
194
196
  children: [
195
197
  profileStatus === "saving" && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", { className: "text-xs text-muted-foreground flex items-center justify-center gap-1.5", children: [
196
198
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Loader2, { className: "h-3 w-3 animate-spin" }),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/launchpad/coin-create.tsx"],"sourcesContent":["\"use client\";\n\nimport { useMemo, useState, type ReactNode } from \"react\";\nimport { ArrowRight, Coins, ImagePlus, Loader2, X } from \"lucide-react\";\nimport { SUPPORTED_TOKENS, formatAmount, getTokenBySymbol, normalizeAddress } from \"@medialane/sdk\";\nimport { acceptFor } from \"../../utils/upload-limits.js\";\nimport {\n SUGGESTED_DEFAULT_PRICE,\n buybackQuoteRaw,\n coinToRaw as toRaw,\n fdvHuman,\n parseCreatorCoinCreated,\n teamCoinsRaw,\n validateCoinName as validateName,\n validateCoinSupply as validateSupply,\n validateCoinSymbol as validateSymbol,\n validatePrice,\n assertTransactionSucceeded,\n type CreatorCoinReceiptLike,\n} from \"@medialane/sdk/starknet\";\nimport Image from \"../image.js\";\nimport Link from \"../link.js\";\nimport { Input } from \"../input.js\";\nimport { Label } from \"../label.js\";\nimport { Textarea } from \"../textarea.js\";\nimport { CoinLaunchPreview, type CoinPreviewData } from \"../coin-launch-preview.js\";\nimport { CurrencyAmount, CurrencyIcon } from \"../currency-icon.js\";\nimport { GradientButton } from \"../gradient-button.js\";\nimport { ClaimRouteShell } from \"../claim-route-shell.js\";\nimport { CreationSuccess } from \"../creation-success.js\";\nimport { TransactionDialog } from \"../transaction-dialog.js\";\nimport { WalletRequired } from \"../wallet-required.js\";\nimport { useMedialaneApp } from \"../medialane-app.js\";\nimport { RewardEarned } from \"../rewards/reward-earned.js\";\nimport { cn } from \"../../utils/cn.js\";\nimport { suggestLaunchpadSymbol } from \"../../utils/launchpad-defaults.js\";\nimport { runIntentCalls } from \"../../utils/run-intent-calls.js\";\nimport { useTransaction } from \"../../utils/use-transaction.js\";\nimport { useLaunchpadImageUpload } from \"../../utils/use-launchpad-image-upload.js\";\nimport { useTokenBalance } from \"../../utils/media-wallet/use-erc20-balance.js\";\n\nconst QUOTE_OPTIONS = SUPPORTED_TOKENS.map((t) => t.symbol);\ntype Quote = (typeof QUOTE_OPTIONS)[number];\n\nconst SUPPLY_PRESETS = [\n { label: \"1M\", value: \"1000000\" },\n { label: \"100M\", value: \"100000000\" },\n { label: \"1B\", value: \"1000000000\" },\n];\n\ntype ProfileStatus = \"idle\" | \"saving\" | \"saved\" | \"failed\";\n\nexport interface CoinCreateProps {\n aside?: ReactNode;\n tradeHref: (coinAddress: string) => string;\n}\n\nexport function CoinCreate({ aside, tradeHref }: CoinCreateProps) {\n const app = useMedialaneApp();\n const walletAddress = app.walletAddress;\n const tx = useTransaction();\n const [name, setName] = useState(\"\");\n const [symbol, setSymbol] = useState(\"\");\n const [autoSymbol, setAutoSymbol] = useState(\"\");\n const [description, setDescription] = useState(\"\");\n const [supply, setSupply] = useState(\"\");\n const [quote, setQuote] = useState<Quote>(\"STRK\");\n const [price, setPrice] = useState(String(SUGGESTED_DEFAULT_PRICE));\n const [teamPct, setTeamPct] = useState(5);\n const [coinAddress, setCoinAddress] = useState<string | null>(null);\n const [profileStatus, setProfileStatus] = useState<ProfileStatus>(\"idle\");\n\n const upload = useLaunchpadImageUpload({ successMessage: \"Image ready\" });\n const { imagePreview, imageUri, imageUploading, uploadError, uploadSuccess, fileInputRef, handleImageSelect, clearImage } = upload;\n\n const quoteToken = getTokenBySymbol(quote)!;\n const { rawBalance } = useTokenBalance(quote, walletAddress ?? null);\n\n const priceNum = Number(price);\n const nameErr = name ? validateName(name) : null;\n const symErr = symbol ? validateSymbol(symbol) : null;\n const supplyErr = supply ? validateSupply(supply) : null;\n const priceErr = price ? validatePrice(quoteToken.decimals, priceNum) : \"Price is required\";\n const identityValid = !validateName(name) && !validateSymbol(symbol);\n const economicsValid = !validateSupply(supply) && !priceErr;\n\n const handleNameChange = (v: string) => {\n setName(v);\n const suggested = suggestLaunchpadSymbol(v);\n if (suggested && (!symbol || symbol === autoSymbol)) {\n setSymbol(suggested);\n setAutoSymbol(suggested);\n }\n };\n\n const preview = useMemo(() => {\n if (validateSupply(supply) || validatePrice(quoteToken.decimals, priceNum)) return null;\n const supplyHuman = Number(supply);\n const supplyRaw = toRaw(BigInt(supply));\n const teamRaw = teamCoinsRaw(supplyRaw, teamPct);\n const buybackRaw = buybackQuoteRaw(teamRaw, priceNum, quoteToken.decimals);\n return {\n fdv: fdvHuman(supplyHuman, priceNum),\n teamCoins: supplyHuman * (teamPct / 100),\n buybackRaw,\n buybackHuman: formatAmount(buybackRaw.toString(), quoteToken.decimals),\n };\n }, [supply, priceNum, teamPct, quoteToken.decimals]);\n\n const insufficient = preview != null && rawBalance != null && rawBalance < preview.buybackRaw;\n const canLaunch = identityValid && economicsValid && preview != null && teamPct > 0 && !insufficient && !imageUploading;\n\n const previewData: CoinPreviewData = {\n name,\n symbol,\n description,\n imageUrl: imagePreview,\n supplyHuman: economicsValid && supply ? Number(supply) : null,\n price: priceErr ? SUGGESTED_DEFAULT_PRICE : priceNum,\n quoteSymbol: quote,\n teamPct,\n };\n\n const handleLaunchClick = () => {\n if (!canLaunch || !walletAddress || !preview) return;\n const owner = normalizeAddress(\"STARKNET\", walletAddress);\n const supplyRaw = toRaw(BigInt(supply));\n const teamRaw = teamCoinsRaw(supplyRaw, teamPct);\n const buybackRaw = buybackQuoteRaw(teamRaw, priceNum, quoteToken.decimals);\n void tx.run(async (signer) => {\n await app.ensureSignedIn?.();\n const client = app.getClient();\n const api = client.api;\n\n const { txHash: deployHash } = await runIntentCalls(signer, () =>\n api.intents.create(\"create-coin\", { owner, name, symbol, initialSupply: supplyRaw.toString() }),\n );\n const deployReceipt = await assertTransactionSucceeded(client.provider, deployHash);\n const address = parseCreatorCoinCreated(deployReceipt as CreatorCoinReceiptLike);\n\n await runIntentCalls(signer, () =>\n api.intents.create(\"launch-coin\", {\n owner,\n creatorCoin: address,\n quoteToken: quoteToken.address,\n price: priceNum,\n initialHolders: teamPct > 0 ? [owner] : [],\n initialHoldersAmounts: teamPct > 0 ? [teamRaw.toString()] : [],\n transferRestrictionDelay: 0,\n quoteFundAmount: buybackRaw.toString(),\n }),\n );\n await api.coins.sync(address, owner).catch(() => {});\n setCoinAddress(address);\n\n if (imageUri || description) {\n setProfileStatus(\"saving\");\n await api.collections\n .updateProfile(address, { ...(imageUri ? { image: imageUri } : {}), ...(description ? { description } : {}) })\n .then(() => setProfileStatus(\"saved\"))\n .catch(() => setProfileStatus(\"failed\"));\n }\n });\n };\n\n const handleReset = () => {\n tx.reset();\n setCoinAddress(null);\n setProfileStatus(\"idle\");\n setName(\"\");\n setSymbol(\"\");\n setAutoSymbol(\"\");\n setDescription(\"\");\n setSupply(\"\");\n setPrice(String(SUGGESTED_DEFAULT_PRICE));\n setTeamPct(5);\n clearImage();\n };\n\n return (\n <WalletRequired\n icon={Coins}\n iconClassName=\"text-brand-orange\"\n title=\"Launch a Creator Coin\"\n description=\"Secure your account to design and launch your own coin with permanently-locked liquidity, in a few clicks.\"\n >\n <TransactionDialog tx={tx} title=\"Launch your coin\" workingLabel=\"Launching your coin…\" firstStepLabel=\"Deploy your coin\">\n <CreationSuccess\n name={name || \"Your coin\"}\n image={imagePreview}\n caption=\"Your coin is live\"\n primary={coinAddress ? { href: tradeHref(coinAddress), label: \"View & trade your coin\" } : { href: \"/launchpad\", label: \"Back to Launchpad\" }}\n secondary={coinAddress ? { href: \"/launchpad\", label: \"Back to Launchpad\" } : undefined}\n onAgain={handleReset}\n againLabel=\"Launch another coin\"\n >\n {profileStatus === \"saving\" && (\n <p className=\"text-xs text-muted-foreground flex items-center justify-center gap-1.5\">\n <Loader2 className=\"h-3 w-3 animate-spin\" /> Saving your coin&apos;s image &amp; description…\n </p>\n )}\n {profileStatus === \"failed\" && (\n <p className=\"text-xs text-muted-foreground text-center\">\n Couldn&apos;t save the image &amp; description right now. Add them anytime from your collection settings.\n </p>\n )}\n <RewardEarned actionType=\"launch_coin\" />\n </CreationSuccess>\n </TransactionDialog>\n\n <ClaimRouteShell\n icon={<Coins className=\"h-4 w-4 text-white\" />}\n title=\"Design your Creator Coin\"\n subtitle=\"A few steps to design and launch your coin.\"\n aside={\n <>\n <CoinLaunchPreview data={previewData} />\n {aside}\n </>\n }\n >\n <div className=\"space-y-7\">\n\n <section className=\"space-y-4\">\n <div>\n <h3 className=\"text-lg font-bold\">Give it a face</h3>\n </div>\n\n <div className=\"space-y-1.5\">\n <Label>Coin image</Label>\n <div className=\"flex items-center gap-4\">\n <button\n type=\"button\"\n onClick={() => fileInputRef.current?.click()}\n className=\"relative h-24 w-24 shrink-0 rounded-full overflow-hidden border border-dashed border-border bg-muted/20 flex items-center justify-center\"\n >\n {imagePreview ? (\n\n <Image src={imagePreview} alt=\"Coin\" fill unoptimized className=\"object-cover\" />\n ) : (\n <ImagePlus className=\"h-6 w-6 text-muted-foreground\" />\n )}\n {imageUploading && (\n <span className=\"absolute inset-0 bg-background/70 flex items-center justify-center\">\n <Loader2 className=\"h-4 w-4 animate-spin text-primary\" />\n </span>\n )}\n </button>\n <div className=\"space-y-1 text-xs text-muted-foreground\">\n <p>JPG, PNG, GIF, SVG or WebP</p>\n {imagePreview && (\n <button type=\"button\" onClick={clearImage} className=\"inline-flex items-center gap-1 text-muted-foreground active:text-foreground\">\n <X className=\"h-3 w-3\" /> Remove\n </button>\n )}\n {uploadError && <p className=\"text-destructive\">{uploadError}</p>}\n {uploadSuccess && <p className=\"text-emerald-500\">✓ {uploadSuccess}</p>}\n </div>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept={acceptFor(\"image\")}\n className=\"hidden\"\n onChange={(e) => { const f = e.target.files?.[0]; if (f) void handleImageSelect(f); }}\n />\n </div>\n </div>\n\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"name\">Name</Label>\n <Input id=\"name\" value={name} onChange={(e) => handleNameChange(e.target.value)} placeholder=\"My Coin\" />\n {nameErr && <p className=\"text-xs text-destructive\">{nameErr}</p>}\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"symbol\">Symbol</Label>\n <Input id=\"symbol\" value={symbol} onChange={(e) => setSymbol(e.target.value.toUpperCase())} placeholder=\"COIN\" />\n {symErr && <p className=\"text-xs text-destructive\">{symErr}</p>}\n </div>\n </div>\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"description\">Description</Label>\n <Textarea\n id=\"description\"\n value={description}\n onChange={(e) => setDescription(e.target.value.slice(0, 500))}\n placeholder=\"Tell your community what this coin is about…\"\n rows={3}\n />\n </div>\n\n </section>\n\n <div className=\"h-px bg-border/60\" />\n\n <section className=\"space-y-4\">\n <div>\n <h3 className=\"text-lg font-bold\">Set the numbers</h3>\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"supply\">Total supply</Label>\n <div className=\"flex gap-2 mb-1\">\n {SUPPLY_PRESETS.map((p) => (\n <button\n key={p.label}\n type=\"button\"\n onClick={() => setSupply(p.value)}\n className={cn(\n \"rounded-lg border px-3.5 py-1.5 text-sm font-medium\",\n supply === p.value ? \"border-brand-orange bg-brand-orange/10 text-brand-orange\" : \"border-border text-muted-foreground\",\n )}\n >\n {p.label}\n </button>\n ))}\n </div>\n <div className=\"relative\">\n <Input\n id=\"supply\" inputMode=\"numeric\"\n value={supply ? Number(supply).toLocaleString() : \"\"}\n onChange={(e) => setSupply(e.target.value.replace(/[^\\d]/g, \"\"))}\n placeholder=\"1,000,000\"\n className=\"pr-16 text-lg font-semibold tabular-nums\"\n />\n <span className=\"pointer-events-none absolute right-3 top-1/2 -translate-y-1/2 text-sm font-medium text-muted-foreground\">\n coins\n </span>\n </div>\n {supplyErr && <p className=\"text-xs text-destructive\">{supplyErr}</p>}\n </div>\n\n <div className=\"space-y-1.5\">\n <Label>Pair</Label>\n <div className=\"flex gap-2 flex-wrap\">\n {QUOTE_OPTIONS.map((q) => (\n <button\n key={q}\n type=\"button\"\n onClick={() => setQuote(q)}\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-lg border px-3.5 py-1.5 text-sm font-medium\",\n quote === q ? \"border-brand-maeve bg-brand-maeve/10 text-brand-maeve\" : \"border-border text-muted-foreground\",\n )}\n >\n <CurrencyIcon symbol={q} size={16} />\n {q}\n </button>\n ))}\n </div>\n </div>\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"price\">Price ({quote} per coin)</Label>\n <div className=\"relative\">\n <span className=\"pointer-events-none absolute left-3 top-1/2 -translate-y-1/2\">\n <CurrencyIcon symbol={quote} size={16} />\n </span>\n <Input\n id=\"price\" inputMode=\"decimal\" value={price}\n onChange={(e) => setPrice(e.target.value.replace(/[^0-9.]/g, \"\"))}\n placeholder={String(SUGGESTED_DEFAULT_PRICE)}\n className=\"pl-9\"\n />\n </div>\n {priceErr && price && <p className=\"text-xs text-destructive\">{priceErr}</p>}\n </div>\n\n {preview && (\n <div className=\"rounded-xl bg-muted/50 dark:bg-muted/30 p-4\">\n <p className=\"text-2xs uppercase tracking-wide text-muted-foreground\">Starting market cap</p>\n <p className=\"text-2xl font-bold tabular-nums text-brand-maeve\">\n <CurrencyAmount amount={preview.fdv.toLocaleString()} symbol={quote} iconSize={18} />\n </p>\n </div>\n )}\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"alloc\">Your allocation: {teamPct}%</Label>\n <input\n id=\"alloc\" type=\"range\" min={1} max={10} step={1}\n value={teamPct} onChange={(e) => setTeamPct(Number(e.target.value))}\n className=\"w-full accent-[hsl(var(--brand-orange))]\"\n />\n {preview && (\n <p className={cn(\"text-sm font-semibold\", insufficient ? \"text-destructive\" : \"text-foreground\")}>\n <CurrencyAmount amount={preview.buybackHuman} symbol={quote} iconSize={14} /> required\n </p>\n )}\n {insufficient && (\n <p className=\"text-xs text-destructive\">\n Your wallet doesn&apos;t have enough {quote}. Add funds, or adjust the numbers above.\n </p>\n )}\n </div>\n\n </section>\n\n <div className=\"h-px bg-border/60\" />\n\n <section className=\"space-y-4\">\n <GradientButton\n big\n onClick={handleLaunchClick}\n disabled={!canLaunch || tx.phase !== \"idle\"}\n className={!canLaunch || tx.phase !== \"idle\" ? \"opacity-40 pointer-events-none\" : \"\"}\n >\n {tx.phase !== \"idle\" ? <><Loader2 className=\"h-4 w-4 mr-1.5 animate-spin\" /> Launching…</> : <>Launch your coin <ArrowRight className=\"h-4 w-4 ml-1.5\" /></>}\n </GradientButton>\n <p className=\"text-xs text-muted-foreground text-center\">\n <Link href=\"/claim/memecoin\" className=\"underline active:text-foreground\">\n Already launched a coin? Claim it instead.\n </Link>\n </p>\n </section>\n </div>\n </ClaimRouteShell>\n </WalletRequired>\n );\n}\n"],"mappings":"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","names":["validateName","validateSymbol","validateSupply","toRaw","Image","Link"]}
1
+ {"version":3,"sources":["../../../src/components/launchpad/coin-create.tsx"],"sourcesContent":["\"use client\";\n\nimport { useMemo, useState, type ReactNode } from \"react\";\nimport { ArrowRight, Coins, ImagePlus, Loader2, X } from \"lucide-react\";\nimport { SUPPORTED_TOKENS, formatAmount, getTokenBySymbol, normalizeAddress } from \"@medialane/sdk\";\nimport { acceptFor } from \"../../utils/upload-limits.js\";\nimport {\n SUGGESTED_DEFAULT_PRICE,\n buybackQuoteRaw,\n coinToRaw as toRaw,\n fdvHuman,\n parseCreatorCoinCreated,\n teamCoinsRaw,\n validateCoinName as validateName,\n validateCoinSupply as validateSupply,\n validateCoinSymbol as validateSymbol,\n validatePrice,\n assertTransactionSucceeded,\n type CreatorCoinReceiptLike,\n} from \"@medialane/sdk/starknet\";\nimport Image from \"../image.js\";\nimport Link from \"../link.js\";\nimport { Input } from \"../input.js\";\nimport { Label } from \"../label.js\";\nimport { Textarea } from \"../textarea.js\";\nimport { CoinLaunchPreview, type CoinPreviewData } from \"../coin-launch-preview.js\";\nimport { CurrencyAmount, CurrencyIcon } from \"../currency-icon.js\";\nimport { GradientButton } from \"../gradient-button.js\";\nimport { ClaimRouteShell } from \"../claim-route-shell.js\";\nimport { TransactionSuccess } from \"../transaction-success.js\";\nimport { TransactionDialog } from \"../transaction-dialog.js\";\nimport { WalletRequired } from \"../wallet-required.js\";\nimport { useMedialaneApp } from \"../medialane-app.js\";\nimport { RewardEarned } from \"../rewards/reward-earned.js\";\nimport { cn } from \"../../utils/cn.js\";\nimport { suggestLaunchpadSymbol } from \"../../utils/launchpad-defaults.js\";\nimport { runIntentCalls } from \"../../utils/run-intent-calls.js\";\nimport { useTransaction } from \"../../utils/use-transaction.js\";\nimport { useLaunchpadImageUpload } from \"../../utils/use-launchpad-image-upload.js\";\nimport { useTokenBalance } from \"../../utils/media-wallet/use-erc20-balance.js\";\n\nconst QUOTE_OPTIONS = SUPPORTED_TOKENS.map((t) => t.symbol);\ntype Quote = (typeof QUOTE_OPTIONS)[number];\n\nconst SUPPLY_PRESETS = [\n { label: \"1M\", value: \"1000000\" },\n { label: \"100M\", value: \"100000000\" },\n { label: \"1B\", value: \"1000000000\" },\n];\n\ntype ProfileStatus = \"idle\" | \"saving\" | \"saved\" | \"failed\";\n\nexport interface CoinCreateProps {\n aside?: ReactNode;\n tradeHref: (coinAddress: string) => string;\n}\n\nexport function CoinCreate({ aside, tradeHref }: CoinCreateProps) {\n const app = useMedialaneApp();\n const walletAddress = app.walletAddress;\n const tx = useTransaction();\n const [name, setName] = useState(\"\");\n const [symbol, setSymbol] = useState(\"\");\n const [autoSymbol, setAutoSymbol] = useState(\"\");\n const [description, setDescription] = useState(\"\");\n const [supply, setSupply] = useState(\"\");\n const [quote, setQuote] = useState<Quote>(\"STRK\");\n const [price, setPrice] = useState(String(SUGGESTED_DEFAULT_PRICE));\n const [teamPct, setTeamPct] = useState(5);\n const [coinAddress, setCoinAddress] = useState<string | null>(null);\n const [profileStatus, setProfileStatus] = useState<ProfileStatus>(\"idle\");\n\n const upload = useLaunchpadImageUpload({ successMessage: \"Image ready\" });\n const { imagePreview, imageUri, imageUploading, uploadError, uploadSuccess, fileInputRef, handleImageSelect, clearImage } = upload;\n\n const quoteToken = getTokenBySymbol(quote)!;\n const { rawBalance } = useTokenBalance(quote, walletAddress ?? null);\n\n const priceNum = Number(price);\n const nameErr = name ? validateName(name) : null;\n const symErr = symbol ? validateSymbol(symbol) : null;\n const supplyErr = supply ? validateSupply(supply) : null;\n const priceErr = price ? validatePrice(quoteToken.decimals, priceNum) : \"Price is required\";\n const identityValid = !validateName(name) && !validateSymbol(symbol);\n const economicsValid = !validateSupply(supply) && !priceErr;\n\n const handleNameChange = (v: string) => {\n setName(v);\n const suggested = suggestLaunchpadSymbol(v);\n if (suggested && (!symbol || symbol === autoSymbol)) {\n setSymbol(suggested);\n setAutoSymbol(suggested);\n }\n };\n\n const preview = useMemo(() => {\n if (validateSupply(supply) || validatePrice(quoteToken.decimals, priceNum)) return null;\n const supplyHuman = Number(supply);\n const supplyRaw = toRaw(BigInt(supply));\n const teamRaw = teamCoinsRaw(supplyRaw, teamPct);\n const buybackRaw = buybackQuoteRaw(teamRaw, priceNum, quoteToken.decimals);\n return {\n fdv: fdvHuman(supplyHuman, priceNum),\n teamCoins: supplyHuman * (teamPct / 100),\n buybackRaw,\n buybackHuman: formatAmount(buybackRaw.toString(), quoteToken.decimals),\n };\n }, [supply, priceNum, teamPct, quoteToken.decimals]);\n\n const insufficient = preview != null && rawBalance != null && rawBalance < preview.buybackRaw;\n const canLaunch = identityValid && economicsValid && preview != null && teamPct > 0 && !insufficient && !imageUploading;\n\n const previewData: CoinPreviewData = {\n name,\n symbol,\n description,\n imageUrl: imagePreview,\n supplyHuman: economicsValid && supply ? Number(supply) : null,\n price: priceErr ? SUGGESTED_DEFAULT_PRICE : priceNum,\n quoteSymbol: quote,\n teamPct,\n };\n\n const handleLaunchClick = () => {\n if (!canLaunch || !walletAddress || !preview) return;\n const owner = normalizeAddress(\"STARKNET\", walletAddress);\n const supplyRaw = toRaw(BigInt(supply));\n const teamRaw = teamCoinsRaw(supplyRaw, teamPct);\n const buybackRaw = buybackQuoteRaw(teamRaw, priceNum, quoteToken.decimals);\n void tx.run(async (signer) => {\n await app.ensureSignedIn?.();\n const client = app.getClient();\n const api = client.api;\n\n const { txHash: deployHash } = await runIntentCalls(signer, () =>\n api.intents.create(\"create-coin\", { owner, name, symbol, initialSupply: supplyRaw.toString() }),\n );\n const deployReceipt = await assertTransactionSucceeded(client.provider, deployHash);\n const address = parseCreatorCoinCreated(deployReceipt as CreatorCoinReceiptLike);\n\n await runIntentCalls(signer, () =>\n api.intents.create(\"launch-coin\", {\n owner,\n creatorCoin: address,\n quoteToken: quoteToken.address,\n price: priceNum,\n initialHolders: teamPct > 0 ? [owner] : [],\n initialHoldersAmounts: teamPct > 0 ? [teamRaw.toString()] : [],\n transferRestrictionDelay: 0,\n quoteFundAmount: buybackRaw.toString(),\n }),\n );\n await api.coins.sync(address, owner).catch(() => {});\n setCoinAddress(address);\n\n if (imageUri || description) {\n setProfileStatus(\"saving\");\n await api.collections\n .updateProfile(address, { ...(imageUri ? { image: imageUri } : {}), ...(description ? { description } : {}) })\n .then(() => setProfileStatus(\"saved\"))\n .catch(() => setProfileStatus(\"failed\"));\n }\n });\n };\n\n const handleReset = () => {\n tx.reset();\n setCoinAddress(null);\n setProfileStatus(\"idle\");\n setName(\"\");\n setSymbol(\"\");\n setAutoSymbol(\"\");\n setDescription(\"\");\n setSupply(\"\");\n setPrice(String(SUGGESTED_DEFAULT_PRICE));\n setTeamPct(5);\n clearImage();\n };\n\n return (\n <WalletRequired\n icon={Coins}\n iconClassName=\"text-brand-orange\"\n title=\"Launch a Creator Coin\"\n description=\"Secure your account to design and launch your own coin with permanently-locked liquidity, in a few clicks.\"\n >\n <TransactionDialog tx={tx} title=\"Launch your coin\" workingLabel=\"Launching your coin…\" firstStepLabel=\"Deploy your coin\">\n <TransactionSuccess\n name={name || \"Your coin\"}\n image={imagePreview}\n title=\"Coin launched\"\n description=\"The supply is fixed and the liquidity is locked.\"\n actions={[\n ...(coinAddress ? [{ href: tradeHref(coinAddress), label: \"View & trade your coin\" }] : []),\n { href: \"/launchpad\", label: \"Back to Launchpad\" },\n { label: \"Launch another coin\", onClick: handleReset },\n ]}\n >\n {profileStatus === \"saving\" && (\n <p className=\"text-xs text-muted-foreground flex items-center justify-center gap-1.5\">\n <Loader2 className=\"h-3 w-3 animate-spin\" /> Saving your coin&apos;s image &amp; description…\n </p>\n )}\n {profileStatus === \"failed\" && (\n <p className=\"text-xs text-muted-foreground text-center\">\n Couldn&apos;t save the image &amp; description right now. Add them anytime from your collection settings.\n </p>\n )}\n <RewardEarned actionType=\"launch_coin\" />\n </TransactionSuccess>\n </TransactionDialog>\n\n <ClaimRouteShell\n icon={<Coins className=\"h-4 w-4 text-white\" />}\n title=\"Design your Creator Coin\"\n subtitle=\"A few steps to design and launch your coin.\"\n aside={\n <>\n <CoinLaunchPreview data={previewData} />\n {aside}\n </>\n }\n >\n <div className=\"space-y-7\">\n\n <section className=\"space-y-4\">\n <div>\n <h3 className=\"text-lg font-bold\">Give it a face</h3>\n </div>\n\n <div className=\"space-y-1.5\">\n <Label>Coin image</Label>\n <div className=\"flex items-center gap-4\">\n <button\n type=\"button\"\n onClick={() => fileInputRef.current?.click()}\n className=\"relative h-24 w-24 shrink-0 rounded-full overflow-hidden border border-dashed border-border bg-muted/20 flex items-center justify-center\"\n >\n {imagePreview ? (\n\n <Image src={imagePreview} alt=\"Coin\" fill unoptimized className=\"object-cover\" />\n ) : (\n <ImagePlus className=\"h-6 w-6 text-muted-foreground\" />\n )}\n {imageUploading && (\n <span className=\"absolute inset-0 bg-background/70 flex items-center justify-center\">\n <Loader2 className=\"h-4 w-4 animate-spin text-primary\" />\n </span>\n )}\n </button>\n <div className=\"space-y-1 text-xs text-muted-foreground\">\n <p>JPG, PNG, GIF, SVG or WebP</p>\n {imagePreview && (\n <button type=\"button\" onClick={clearImage} className=\"inline-flex items-center gap-1 text-muted-foreground active:text-foreground\">\n <X className=\"h-3 w-3\" /> Remove\n </button>\n )}\n {uploadError && <p className=\"text-destructive\">{uploadError}</p>}\n {uploadSuccess && <p className=\"text-emerald-500\">✓ {uploadSuccess}</p>}\n </div>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept={acceptFor(\"image\")}\n className=\"hidden\"\n onChange={(e) => { const f = e.target.files?.[0]; if (f) void handleImageSelect(f); }}\n />\n </div>\n </div>\n\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"name\">Name</Label>\n <Input id=\"name\" value={name} onChange={(e) => handleNameChange(e.target.value)} placeholder=\"My Coin\" />\n {nameErr && <p className=\"text-xs text-destructive\">{nameErr}</p>}\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"symbol\">Symbol</Label>\n <Input id=\"symbol\" value={symbol} onChange={(e) => setSymbol(e.target.value.toUpperCase())} placeholder=\"COIN\" />\n {symErr && <p className=\"text-xs text-destructive\">{symErr}</p>}\n </div>\n </div>\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"description\">Description</Label>\n <Textarea\n id=\"description\"\n value={description}\n onChange={(e) => setDescription(e.target.value.slice(0, 500))}\n placeholder=\"Tell your community what this coin is about…\"\n rows={3}\n />\n </div>\n\n </section>\n\n <div className=\"h-px bg-border/60\" />\n\n <section className=\"space-y-4\">\n <div>\n <h3 className=\"text-lg font-bold\">Set the numbers</h3>\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"supply\">Total supply</Label>\n <div className=\"flex gap-2 mb-1\">\n {SUPPLY_PRESETS.map((p) => (\n <button\n key={p.label}\n type=\"button\"\n onClick={() => setSupply(p.value)}\n className={cn(\n \"rounded-lg border px-3.5 py-1.5 text-sm font-medium\",\n supply === p.value ? \"border-brand-orange bg-brand-orange/10 text-brand-orange\" : \"border-border text-muted-foreground\",\n )}\n >\n {p.label}\n </button>\n ))}\n </div>\n <div className=\"relative\">\n <Input\n id=\"supply\" inputMode=\"numeric\"\n value={supply ? Number(supply).toLocaleString() : \"\"}\n onChange={(e) => setSupply(e.target.value.replace(/[^\\d]/g, \"\"))}\n placeholder=\"1,000,000\"\n className=\"pr-16 text-lg font-semibold tabular-nums\"\n />\n <span className=\"pointer-events-none absolute right-3 top-1/2 -translate-y-1/2 text-sm font-medium text-muted-foreground\">\n coins\n </span>\n </div>\n {supplyErr && <p className=\"text-xs text-destructive\">{supplyErr}</p>}\n </div>\n\n <div className=\"space-y-1.5\">\n <Label>Pair</Label>\n <div className=\"flex gap-2 flex-wrap\">\n {QUOTE_OPTIONS.map((q) => (\n <button\n key={q}\n type=\"button\"\n onClick={() => setQuote(q)}\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-lg border px-3.5 py-1.5 text-sm font-medium\",\n quote === q ? \"border-brand-maeve bg-brand-maeve/10 text-brand-maeve\" : \"border-border text-muted-foreground\",\n )}\n >\n <CurrencyIcon symbol={q} size={16} />\n {q}\n </button>\n ))}\n </div>\n </div>\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"price\">Price ({quote} per coin)</Label>\n <div className=\"relative\">\n <span className=\"pointer-events-none absolute left-3 top-1/2 -translate-y-1/2\">\n <CurrencyIcon symbol={quote} size={16} />\n </span>\n <Input\n id=\"price\" inputMode=\"decimal\" value={price}\n onChange={(e) => setPrice(e.target.value.replace(/[^0-9.]/g, \"\"))}\n placeholder={String(SUGGESTED_DEFAULT_PRICE)}\n className=\"pl-9\"\n />\n </div>\n {priceErr && price && <p className=\"text-xs text-destructive\">{priceErr}</p>}\n </div>\n\n {preview && (\n <div className=\"rounded-xl bg-muted/50 dark:bg-muted/30 p-4\">\n <p className=\"text-2xs uppercase tracking-wide text-muted-foreground\">Starting market cap</p>\n <p className=\"text-2xl font-bold tabular-nums text-brand-maeve\">\n <CurrencyAmount amount={preview.fdv.toLocaleString()} symbol={quote} iconSize={18} />\n </p>\n </div>\n )}\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"alloc\">Your allocation: {teamPct}%</Label>\n <input\n id=\"alloc\" type=\"range\" min={1} max={10} step={1}\n value={teamPct} onChange={(e) => setTeamPct(Number(e.target.value))}\n className=\"w-full accent-[hsl(var(--brand-orange))]\"\n />\n {preview && (\n <p className={cn(\"text-sm font-semibold\", insufficient ? \"text-destructive\" : \"text-foreground\")}>\n <CurrencyAmount amount={preview.buybackHuman} symbol={quote} iconSize={14} /> required\n </p>\n )}\n {insufficient && (\n <p className=\"text-xs text-destructive\">\n Your wallet doesn&apos;t have enough {quote}. Add funds, or adjust the numbers above.\n </p>\n )}\n </div>\n\n </section>\n\n <div className=\"h-px bg-border/60\" />\n\n <section className=\"space-y-4\">\n <GradientButton\n big\n onClick={handleLaunchClick}\n disabled={!canLaunch || tx.phase !== \"idle\"}\n className={!canLaunch || tx.phase !== \"idle\" ? \"opacity-40 pointer-events-none\" : \"\"}\n >\n {tx.phase !== \"idle\" ? <><Loader2 className=\"h-4 w-4 mr-1.5 animate-spin\" /> Launching…</> : <>Launch your coin <ArrowRight className=\"h-4 w-4 ml-1.5\" /></>}\n </GradientButton>\n <p className=\"text-xs text-muted-foreground text-center\">\n <Link href=\"/claim/memecoin\" className=\"underline active:text-foreground\">\n Already launched a coin? Claim it instead.\n </Link>\n </p>\n </section>\n </div>\n </ClaimRouteShell>\n </WalletRequired>\n );\n}\n"],"mappings":"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","names":["validateName","validateSymbol","validateSupply","toRaw","Image","Link"]}
@@ -26,7 +26,7 @@ import { CoinLaunchPreview } from "../coin-launch-preview.js";
26
26
  import { CurrencyAmount, CurrencyIcon } from "../currency-icon.js";
27
27
  import { GradientButton } from "../gradient-button.js";
28
28
  import { ClaimRouteShell } from "../claim-route-shell.js";
29
- import { CreationSuccess } from "../creation-success.js";
29
+ import { TransactionSuccess } from "../transaction-success.js";
30
30
  import { TransactionDialog } from "../transaction-dialog.js";
31
31
  import { WalletRequired } from "../wallet-required.js";
32
32
  import { useMedialaneApp } from "../medialane-app.js";
@@ -161,15 +161,17 @@ function CoinCreate({ aside, tradeHref }) {
161
161
  description: "Secure your account to design and launch your own coin with permanently-locked liquidity, in a few clicks.",
162
162
  children: [
163
163
  /* @__PURE__ */ jsx(TransactionDialog, { tx, title: "Launch your coin", workingLabel: "Launching your coin\u2026", firstStepLabel: "Deploy your coin", children: /* @__PURE__ */ jsxs(
164
- CreationSuccess,
164
+ TransactionSuccess,
165
165
  {
166
166
  name: name || "Your coin",
167
167
  image: imagePreview,
168
- caption: "Your coin is live",
169
- primary: coinAddress ? { href: tradeHref(coinAddress), label: "View & trade your coin" } : { href: "/launchpad", label: "Back to Launchpad" },
170
- secondary: coinAddress ? { href: "/launchpad", label: "Back to Launchpad" } : void 0,
171
- onAgain: handleReset,
172
- againLabel: "Launch another coin",
168
+ title: "Coin launched",
169
+ description: "The supply is fixed and the liquidity is locked.",
170
+ actions: [
171
+ ...coinAddress ? [{ href: tradeHref(coinAddress), label: "View & trade your coin" }] : [],
172
+ { href: "/launchpad", label: "Back to Launchpad" },
173
+ { label: "Launch another coin", onClick: handleReset }
174
+ ],
173
175
  children: [
174
176
  profileStatus === "saving" && /* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground flex items-center justify-center gap-1.5", children: [
175
177
  /* @__PURE__ */ jsx(Loader2, { className: "h-3 w-3 animate-spin" }),