@medialane/ui 0.258.0 → 0.260.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/activities-feed.cjs +5 -1
- package/dist/components/activities-feed.cjs.map +1 -1
- package/dist/components/activities-feed.js +5 -1
- package/dist/components/activities-feed.js.map +1 -1
- package/dist/components/activity-feed-shell.cjs +3 -1
- package/dist/components/activity-feed-shell.cjs.map +1 -1
- package/dist/components/activity-feed-shell.js +3 -1
- package/dist/components/activity-feed-shell.js.map +1 -1
- package/dist/components/button.d.cts +1 -1
- package/dist/components/button.d.ts +1 -1
- package/dist/components/coins-explorer.cjs +5 -1
- package/dist/components/coins-explorer.cjs.map +1 -1
- package/dist/components/coins-explorer.js +6 -2
- package/dist/components/coins-explorer.js.map +1 -1
- package/dist/components/comments-section.cjs +7 -6
- package/dist/components/comments-section.cjs.map +1 -1
- package/dist/components/comments-section.js +7 -6
- package/dist/components/comments-section.js.map +1 -1
- package/dist/components/discover-community-section.cjs +5 -1
- package/dist/components/discover-community-section.cjs.map +1 -1
- package/dist/components/discover-community-section.js +5 -1
- package/dist/components/discover-community-section.js.map +1 -1
- package/dist/components/discover-feed-section.cjs +5 -1
- package/dist/components/discover-feed-section.cjs.map +1 -1
- package/dist/components/discover-feed-section.js +5 -1
- package/dist/components/discover-feed-section.js.map +1 -1
- package/dist/components/fast-mint/fast-mint.d.cts +2 -2
- package/dist/components/fast-mint/fast-mint.d.ts +2 -2
- package/dist/components/fast-mint/success-view.cjs +2 -2
- package/dist/components/fast-mint/success-view.cjs.map +1 -1
- package/dist/components/fast-mint/success-view.js +2 -2
- package/dist/components/fast-mint/success-view.js.map +1 -1
- package/dist/components/ip-type-page.cjs +3 -2
- package/dist/components/ip-type-page.cjs.map +1 -1
- package/dist/components/ip-type-page.js +3 -2
- package/dist/components/ip-type-page.js.map +1 -1
- package/dist/components/launchpad/coin-create.cjs +9 -7
- package/dist/components/launchpad/coin-create.cjs.map +1 -1
- package/dist/components/launchpad/coin-create.js +9 -7
- package/dist/components/launchpad/coin-create.js.map +1 -1
- package/dist/components/launchpad/collection-create-form.cjs +11 -14
- package/dist/components/launchpad/collection-create-form.cjs.map +1 -1
- package/dist/components/launchpad/collection-create-form.js +12 -15
- package/dist/components/launchpad/collection-create-form.js.map +1 -1
- package/dist/components/launchpad/collection-create-presets.cjs +8 -8
- package/dist/components/launchpad/collection-create-presets.cjs.map +1 -1
- package/dist/components/launchpad/collection-create-presets.d.cts +2 -1
- package/dist/components/launchpad/collection-create-presets.d.ts +2 -1
- package/dist/components/launchpad/collection-create-presets.js +8 -8
- package/dist/components/launchpad/collection-create-presets.js.map +1 -1
- package/dist/components/launchpad/edition-mint.cjs +9 -7
- package/dist/components/launchpad/edition-mint.cjs.map +1 -1
- package/dist/components/launchpad/edition-mint.js +9 -7
- package/dist/components/launchpad/edition-mint.js.map +1 -1
- package/dist/components/launchpad/pop-create.cjs +5 -6
- package/dist/components/launchpad/pop-create.cjs.map +1 -1
- package/dist/components/launchpad/pop-create.js +5 -6
- package/dist/components/launchpad/pop-create.js.map +1 -1
- package/dist/components/launchpad/remix-mint.cjs +9 -7
- package/dist/components/launchpad/remix-mint.cjs.map +1 -1
- package/dist/components/launchpad/remix-mint.js +9 -7
- package/dist/components/launchpad/remix-mint.js.map +1 -1
- package/dist/components/launchpad/single-edition-mint.cjs +9 -7
- package/dist/components/launchpad/single-edition-mint.cjs.map +1 -1
- package/dist/components/launchpad/single-edition-mint.js +9 -7
- package/dist/components/launchpad/single-edition-mint.js.map +1 -1
- package/dist/components/launchpad/sponsorship-create.cjs +5 -6
- package/dist/components/launchpad/sponsorship-create.cjs.map +1 -1
- package/dist/components/launchpad/sponsorship-create.js +5 -6
- package/dist/components/launchpad/sponsorship-create.js.map +1 -1
- package/dist/components/launchpad/tier-mint-form.cjs +5 -6
- package/dist/components/launchpad/tier-mint-form.cjs.map +1 -1
- package/dist/components/launchpad/tier-mint-form.js +5 -6
- package/dist/components/launchpad/tier-mint-form.js.map +1 -1
- package/dist/components/launchpad/tier-mint-presets.cjs +2 -2
- package/dist/components/launchpad/tier-mint-presets.cjs.map +1 -1
- package/dist/components/launchpad/tier-mint-presets.d.cts +2 -1
- package/dist/components/launchpad/tier-mint-presets.d.ts +2 -1
- package/dist/components/launchpad/tier-mint-presets.js +2 -2
- package/dist/components/launchpad/tier-mint-presets.js.map +1 -1
- package/dist/components/marketplace-dialog-primitives.cjs +1 -31
- package/dist/components/marketplace-dialog-primitives.cjs.map +1 -1
- package/dist/components/marketplace-dialog-primitives.d.cts +1 -12
- package/dist/components/marketplace-dialog-primitives.d.ts +1 -12
- package/dist/components/marketplace-dialog-primitives.js +2 -31
- package/dist/components/marketplace-dialog-primitives.js.map +1 -1
- package/dist/components/media-wallet/media-wallet-activity.cjs +5 -1
- package/dist/components/media-wallet/media-wallet-activity.cjs.map +1 -1
- package/dist/components/media-wallet/media-wallet-activity.js +5 -1
- package/dist/components/media-wallet/media-wallet-activity.js.map +1 -1
- package/dist/components/media-wallet/media-wallet-home.cjs +3 -2
- package/dist/components/media-wallet/media-wallet-home.cjs.map +1 -1
- package/dist/components/media-wallet/media-wallet-home.js +3 -2
- package/dist/components/media-wallet/media-wallet-home.js.map +1 -1
- package/dist/components/media-wallet/media-wallet-send.cjs +5 -2
- package/dist/components/media-wallet/media-wallet-send.cjs.map +1 -1
- package/dist/components/media-wallet/media-wallet-send.js +5 -2
- package/dist/components/media-wallet/media-wallet-send.js.map +1 -1
- package/dist/components/media-wallet/success-dialog.cjs +5 -11
- package/dist/components/media-wallet/success-dialog.cjs.map +1 -1
- package/dist/components/media-wallet/success-dialog.js +5 -11
- package/dist/components/media-wallet/success-dialog.js.map +1 -1
- package/dist/components/pop-claim-button.cjs +7 -6
- package/dist/components/pop-claim-button.cjs.map +1 -1
- package/dist/components/pop-claim-button.js +7 -6
- package/dist/components/pop-claim-button.js.map +1 -1
- package/dist/components/pop-manage-page.cjs +5 -4
- package/dist/components/pop-manage-page.cjs.map +1 -1
- package/dist/components/pop-manage-page.js +5 -4
- package/dist/components/pop-manage-page.js.map +1 -1
- package/dist/components/portfolio-sponsorships.cjs +15 -8
- package/dist/components/portfolio-sponsorships.cjs.map +1 -1
- package/dist/components/portfolio-sponsorships.js +15 -8
- package/dist/components/portfolio-sponsorships.js.map +1 -1
- package/dist/components/service-collections-page.cjs +2 -2
- package/dist/components/service-collections-page.cjs.map +1 -1
- package/dist/components/service-collections-page.d.cts +2 -2
- package/dist/components/service-collections-page.d.ts +2 -2
- package/dist/components/service-collections-page.js +2 -2
- package/dist/components/service-collections-page.js.map +1 -1
- package/dist/components/sheet.d.cts +1 -1
- package/dist/components/sheet.d.ts +1 -1
- package/dist/components/sponsorship-offer-page.cjs +9 -8
- package/dist/components/sponsorship-offer-page.cjs.map +1 -1
- package/dist/components/sponsorship-offer-page.js +9 -8
- package/dist/components/sponsorship-offer-page.js.map +1 -1
- package/dist/components/transaction-success.cjs +60 -0
- package/dist/components/transaction-success.cjs.map +1 -0
- package/dist/components/transaction-success.d.cts +20 -0
- package/dist/components/transaction-success.d.ts +20 -0
- package/dist/components/transaction-success.js +26 -0
- package/dist/components/transaction-success.js.map +1 -0
- package/dist/components/transfer-collection-ownership.cjs +6 -8
- package/dist/components/transfer-collection-ownership.cjs.map +1 -1
- package/dist/components/transfer-collection-ownership.js +6 -8
- package/dist/components/transfer-collection-ownership.js.map +1 -1
- package/dist/index.cjs +9 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -3
- package/dist/index.d.ts +4 -3
- package/dist/index.js +6 -6
- package/dist/index.js.map +1 -1
- package/dist/utils/empty-messages.cjs +62 -0
- package/dist/utils/empty-messages.cjs.map +1 -0
- package/dist/utils/empty-messages.d.cts +40 -0
- package/dist/utils/empty-messages.d.ts +40 -0
- package/dist/utils/empty-messages.js +38 -0
- package/dist/utils/empty-messages.js.map +1 -0
- package/dist/utils/success-messages.cjs +106 -0
- package/dist/utils/success-messages.cjs.map +1 -0
- package/dist/utils/success-messages.d.cts +58 -0
- package/dist/utils/success-messages.d.ts +58 -0
- package/dist/utils/success-messages.js +82 -0
- package/dist/utils/success-messages.js.map +1 -0
- package/package.json +3 -3
- package/dist/components/creation-success.cjs +0 -64
- package/dist/components/creation-success.cjs.map +0 -1
- package/dist/components/creation-success.d.cts +0 -20
- package/dist/components/creation-success.d.ts +0 -20
- package/dist/components/creation-success.js +0 -30
- package/dist/components/creation-success.js.map +0 -1
- package/dist/components/transaction-done.cjs +0 -46
- package/dist/components/transaction-done.cjs.map +0 -1
- package/dist/components/transaction-done.d.cts +0 -18
- package/dist/components/transaction-done.d.ts +0 -18
- package/dist/components/transaction-done.js +0 -22
- package/dist/components/transaction-done.js.map +0 -1
|
@@ -50,7 +50,7 @@ var import_textarea = require("../textarea.js");
|
|
|
50
50
|
var import_select = require("../select.js");
|
|
51
51
|
var import_collapsible = require("../collapsible.js");
|
|
52
52
|
var import_create_form_primitives = require("../create-form-primitives.js");
|
|
53
|
-
var
|
|
53
|
+
var import_transaction_success = require("../transaction-success.js");
|
|
54
54
|
var import_transaction_dialog = require("../transaction-dialog.js");
|
|
55
55
|
var import_wallet_required = require("../wallet-required.js");
|
|
56
56
|
var import_medialane_app = require("../medialane-app.js");
|
|
@@ -240,15 +240,17 @@ function RemixMint({ contract, tokenId }) {
|
|
|
240
240
|
}
|
|
241
241
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_wallet_required.WalletRequired, { ...gate, children: [
|
|
242
242
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_transaction_dialog.TransactionDialog, { tx, title: "Mint a remix", workingLabel: "Minting your remix\u2026", firstStepLabel: "Upload to IPFS", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
243
|
-
|
|
243
|
+
import_transaction_success.TransactionSuccess,
|
|
244
244
|
{
|
|
245
245
|
name,
|
|
246
246
|
image: imagePreview ?? originalImage ?? null,
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
247
|
+
title: "Remix minted",
|
|
248
|
+
description: "It is registered as a remix of the original asset and carries its own license terms.",
|
|
249
|
+
actions: [
|
|
250
|
+
...remixHref ? [{ href: remixHref, label: "View remix" }] : [],
|
|
251
|
+
{ href: "/portfolio/assets", label: "View portfolio" },
|
|
252
|
+
{ label: "Close", onClick: handleAgain }
|
|
253
|
+
],
|
|
252
254
|
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_reward_earned.RewardEarned, { actionType: "mint_asset" })
|
|
253
255
|
}
|
|
254
256
|
) }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/launchpad/remix-mint.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { Boxes, ChevronDown, ChevronLeft, GitBranch, ImagePlus, Info, Percent, Plus, Shield, Upload } from \"lucide-react\";\nimport { assetHref, getDerivativesTerm, getService, normalizeAddress, resolveRemixPolicy } from \"@medialane/sdk\";\nimport { acceptFor, uploadError } from \"../../utils/upload-limits.js\";\nimport { assertTransactionSucceeded, mintedTokenIdFromReceipt } from \"@medialane/sdk/starknet\";\nimport Image from \"../image.js\";\nimport Link from \"../link.js\";\nimport { useRouter } from \"../router.js\";\nimport { Badge } from \"../badge.js\";\nimport { Button } from \"../button.js\";\nimport { Input } from \"../input.js\";\nimport { Label } from \"../label.js\";\nimport { Skeleton } from \"../skeleton.js\";\nimport { Textarea } from \"../textarea.js\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../select.js\";\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"../collapsible.js\";\nimport { Section, ToggleGroup } from \"../create-form-primitives.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 { IP_TYPES, LICENSE_TYPES } from \"../../data/ip.js\";\nimport { cn } from \"../../utils/cn.js\";\nimport { pinAssetMetadata, uploadJsonToIpfs } from \"../../utils/ipfs-upload.js\";\nimport { runIntentCalls } from \"../../utils/run-intent-calls.js\";\nimport { checkIsOwner } from \"../../utils/ownership.js\";\nimport { useCollection, useCollectionsByOwner } from \"../../utils/use-collections.js\";\nimport { useToken, useTokenBalance } from \"../../utils/use-tokens.js\";\nimport { useImageUrl } from \"../../utils/use-image-url.js\";\nimport { useTransaction } from \"../../utils/use-transaction.js\";\nimport { invalidatePortfolioCache } from \"../../utils/portfolio-cache.js\";\n\nexport function RemixMint({ contract, tokenId }: { contract: string; tokenId: string }) {\n const app = useMedialaneApp();\n const router = useRouter();\n const resolveImage = useImageUrl();\n const walletAddress = app.walletAddress;\n const tx = useTransaction();\n const { token, isLoading: tokenLoading } = useToken(contract, tokenId);\n const { collection: parentCollection } = useCollection(contract);\n const { collections: allCollections, isLoading: collectionsLoading } = useCollectionsByOwner(walletAddress ?? null);\n const eligibleCollections = allCollections.filter(\n (c) => getService(c.service)?.id === \"mip-erc1155\" || (getService(c.service)?.id === \"mip-erc721\" && c.collectionId != null),\n );\n const { amount: walletBalance } = useTokenBalance(contract, tokenId, walletAddress);\n const viewerIsOwner = checkIsOwner(token, walletAddress, walletBalance);\n\n const originalName = token?.metadata?.name ?? `Token #${tokenId}`;\n const originalImage = resolveImage(token?.metadata?.image);\n const originalAttributes = Array.isArray(token?.metadata?.attributes)\n ? (token!.metadata!.attributes as { trait_type?: string; value?: string }[])\n : [];\n const attr = (t: string) => originalAttributes.find((a) => a.trait_type === t)?.value;\n\n const remixPolicy = resolveRemixPolicy({\n parentNoDerivatives: getDerivativesTerm(originalAttributes) === \"Not Allowed\",\n viewerIsParentOwner: viewerIsOwner,\n dealAvailable: !!getService(parentCollection?.service),\n });\n\n const [imageFile, setImageFile] = useState<File | null>(null);\n const [imagePreview, setImagePreview] = useState<string | null>(null);\n const [name, setName] = useState(\"\");\n const [description, setDescription] = useState(\"\");\n const [collectionKey, setCollectionKey] = useState(\"\");\n const [ipType, setIpType] = useState<string>(\"Art\");\n const [licenseType, setLicenseType] = useState(\"CC BY\");\n const [commercial, setCommercial] = useState(false);\n const [derivatives, setDerivatives] = useState(true);\n const [royalty, setRoyalty] = useState(\"\");\n const [advancedOpen, setAdvancedOpen] = useState(false);\n const [formError, setFormError] = useState<string | null>(null);\n const [remixHref, setRemixHref] = useState<string | null>(null);\n const previewUrlRef = useRef<string | null>(null);\n const fileInputRef = useRef<HTMLInputElement | null>(null);\n\n useEffect(() => {\n if (token && !name) setName(`Remix of ${originalName}`);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- runs once when the token loads; name is guarded by the check above\n }, [token]);\n\n const getCollectionKey = (c: (typeof eligibleCollections)[number]) => c.collectionId ?? c.contractAddress;\n\n useEffect(() => {\n if (eligibleCollections.length > 0 && !collectionKey) {\n const match = eligibleCollections.find((c) => normalizeAddress(\"STARKNET\", c.contractAddress) === normalizeAddress(\"STARKNET\", contract));\n setCollectionKey(getCollectionKey(match ?? eligibleCollections[0]!));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- runs once when the eligible collections first load\n }, [eligibleCollections.length]);\n\n useEffect(() => {\n return () => {\n if (previewUrlRef.current) URL.revokeObjectURL(previewUrlRef.current);\n };\n }, []);\n\n const redirected = useRef(false);\n useEffect(() => {\n if (!token || remixPolicy.canRemixDirect || redirected.current) return;\n redirected.current = true;\n router.replace(assetHref(\"STARKNET\", contract, tokenId));\n }, [token, remixPolicy.canRemixDirect, router, contract, tokenId]);\n\n const handleLicenseChange = (value: string) => {\n setLicenseType(value);\n const preset = LICENSE_TYPES.find((l) => l.value === value);\n if (preset) {\n setCommercial(preset.commercialUse === \"Yes\");\n setDerivatives(preset.derivatives !== \"Not Allowed\");\n }\n };\n\n const handleImageChange = (file: File) => {\n const fileError = uploadError(file, \"image\");\n if (fileError) {\n setFormError(fileError);\n return;\n }\n setFormError(null);\n if (previewUrlRef.current) URL.revokeObjectURL(previewUrlRef.current);\n const url = URL.createObjectURL(file);\n previewUrlRef.current = url;\n setImageFile(file);\n setImagePreview(url);\n };\n\n const handleSubmit = () => {\n if (!name.trim()) return setFormError(\"Remix name is required\");\n if (!collectionKey) return setFormError(\"Select a collection\");\n if (!walletAddress) return;\n setFormError(null);\n void tx.run(async (signer) => {\n await app.ensureSignedIn?.();\n const client = app.getClient();\n const api = client.api;\n const selected = eligibleCollections.find((c) => getCollectionKey(c) === collectionKey);\n if (!selected) throw new Error(\"Collection not found\");\n\n let tokenUri: string;\n if (imageFile) {\n tokenUri = (\n await pinAssetMetadata(api, {\n imageFile,\n name: name.trim(),\n description: description.trim() || `Remix of ${originalName}`,\n creator: walletAddress,\n ipType,\n licenseType,\n commercialUse: commercial ? \"Yes\" : \"No\",\n derivatives: derivatives ? \"Allowed\" : \"Not Allowed\",\n attribution: \"Required\",\n geographicScope: \"Worldwide\",\n aiPolicy: \"Not Allowed\",\n royalty: royalty || \"0\",\n templateTraits: [\n { traitType: \"Parent Contract\", value: contract },\n { traitType: \"Parent Token ID\", value: tokenId },\n ],\n })\n ).uri;\n } else {\n tokenUri = await uploadJsonToIpfs(api, {\n name: name.trim(),\n description: description.trim() || `Remix of ${originalName}`,\n image: token?.metadata?.image ?? \"\",\n attributes: [\n { trait_type: \"Parent Contract\", value: contract },\n { trait_type: \"Parent Token ID\", value: tokenId },\n { trait_type: \"Remix Type\", value: \"Derivative\" },\n { trait_type: \"IP Type\", value: ipType },\n { trait_type: \"License\", value: licenseType },\n { trait_type: \"Commercial Use\", value: commercial ? \"Yes\" : \"No\" },\n { trait_type: \"Derivatives\", value: derivatives ? \"Allowed\" : \"Not Allowed\" },\n ...(royalty ? [{ trait_type: \"Royalty\", value: `${royalty}%` }] : []),\n { trait_type: \"Creator\", value: walletAddress },\n ],\n });\n }\n\n const { txHash } = await runIntentCalls(signer, () =>\n api.intents.create(\n \"mint\",\n selected.standard === \"ERC1155\"\n ? { owner: walletAddress, recipient: walletAddress, collectionContract: selected.contractAddress, tokenUri, value: \"1\" }\n : { owner: walletAddress, collectionId: selected.collectionId!, recipient: walletAddress, tokenUri, royaltyBps: 0 },\n ),\n );\n const receipt = await assertTransactionSucceeded(client.provider, txHash);\n const remixTokenId = mintedTokenIdFromReceipt(receipt, selected.contractAddress);\n if (!remixTokenId) throw new Error(\"Minted, but could not read the new token id from the receipt\");\n await api.remix.confirmSelf({\n originalContract: contract,\n originalTokenId: tokenId,\n remixContract: selected.contractAddress,\n remixTokenId,\n txHash,\n licenseType,\n commercial,\n derivatives,\n });\n setRemixHref(assetHref(\"STARKNET\", selected.contractAddress, remixTokenId));\n invalidatePortfolioCache(walletAddress);\n });\n };\n\n const handleAgain = () => {\n tx.reset();\n setRemixHref(null);\n };\n\n const gate = { icon: GitBranch, title: \"Connect to create a remix\", description: \"Connect to mint a derivative of this asset.\" };\n\n if (tokenLoading) {\n return (\n <WalletRequired {...gate}>\n <div className=\"max-w-5xl mx-auto px-4 pt-14 pb-8 space-y-6\">\n <Skeleton className=\"h-8 w-48\" />\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_340px] gap-8\">\n <div className=\"space-y-4\">{[1, 2, 3, 4].map((i) => <Skeleton key={i} className=\"h-32 w-full rounded-xl\" />)}</div>\n <Skeleton className=\"h-80 w-full rounded-xl\" />\n </div>\n </div>\n </WalletRequired>\n );\n }\n\n if (!token) {\n return (\n <div className=\"max-w-5xl mx-auto px-4 py-24 text-center space-y-4\">\n <p className=\"text-2xl font-bold\">Asset not found</p>\n <Button asChild variant=\"outline\"><Link href=\"/\">Go home</Link></Button>\n </div>\n );\n }\n\n return (\n <WalletRequired {...gate}>\n <TransactionDialog tx={tx} title=\"Mint a remix\" workingLabel=\"Minting your remix…\" firstStepLabel=\"Upload to IPFS\">\n <CreationSuccess\n name={name}\n image={imagePreview ?? originalImage ?? null}\n caption=\"Your remix is live\"\n primary={remixHref ? { href: remixHref, label: \"View remix\" } : { href: \"/portfolio/assets\", label: \"View portfolio\" }}\n secondary={remixHref ? { href: \"/portfolio/assets\", label: \"View portfolio\" } : undefined}\n onAgain={handleAgain}\n againLabel=\"Close\"\n >\n <RewardEarned actionType=\"mint_asset\" />\n </CreationSuccess>\n </TransactionDialog>\n\n <div className=\"max-w-5xl mx-auto px-4 pt-14 pb-12 space-y-6\">\n <div className=\"space-y-3\">\n <Link href={assetHref(\"STARKNET\", contract, tokenId)} className=\"inline-flex items-center gap-1.5 text-sm text-muted-foreground hover:text-foreground transition-colors\">\n <ChevronLeft className=\"h-4 w-4\" />\n Back to asset\n </Link>\n <div className=\"flex items-center gap-2 text-primary\">\n <GitBranch className=\"h-5 w-5\" />\n <span className=\"text-sm font-semibold\">Create Remix</span>\n </div>\n <h1 className=\"text-3xl font-bold\">Mint a Remix</h1>\n <p className=\"text-muted-foreground max-w-xl\">Mint a derivative work based on this asset. The parent attribution is embedded in the IPFS metadata.</p>\n </div>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_320px] gap-8 items-start\">\n <div className=\"space-y-4\">\n <Section title=\"Remix Artwork\" icon={<ImagePlus className=\"h-4 w-4\" />}>\n <div\n className={cn(\"relative group rounded-xl border-2 border-dashed border-border transition-colors cursor-pointer overflow-hidden\", \"hover:border-primary/50 hover:bg-muted/30\")}\n onClick={() => fileInputRef.current?.click()}\n >\n <input ref={fileInputRef} type=\"file\" accept={acceptFor(\"image\")} className=\"hidden\" onChange={(e) => { const f = e.target.files?.[0]; if (f) handleImageChange(f); }} />\n {imagePreview ? (\n <div className=\"relative aspect-square w-full\">\n <Image src={imagePreview} alt=\"Remix preview\" fill unoptimized className=\"object-cover\" />\n <div className=\"absolute inset-0 bg-black/50 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center\">\n <p className=\"text-white text-sm font-medium flex items-center gap-2\"><Upload className=\"h-4 w-4\" /> Change image</p>\n </div>\n </div>\n ) : (\n <div className=\"aspect-square flex flex-col items-center justify-center gap-3 text-muted-foreground p-8\">\n {originalImage && (\n <div className=\"relative h-20 w-20 rounded-xl overflow-hidden opacity-40 mb-1 ring-2 ring-border\">\n <Image src={originalImage} alt=\"\" fill unoptimized className=\"object-cover\" />\n </div>\n )}\n <Upload className=\"h-8 w-8\" />\n <div className=\"text-center\">\n <p className=\"text-sm font-medium\">Upload remix artwork</p>\n <p className=\"text-xs mt-0.5\">{originalImage ? \"Leave empty to inherit original artwork\" : \"PNG, JPG, GIF, WebP up to 10MB\"}</p>\n </div>\n </div>\n )}\n </div>\n </Section>\n\n <Section title=\"Remix Details\" icon={<GitBranch className=\"h-4 w-4\" />}>\n <div className=\"space-y-1.5\">\n <Label>Remix Name *</Label>\n <Input value={name} onChange={(e) => setName(e.target.value)} placeholder={`Remix of ${originalName}`} />\n </div>\n <div className=\"space-y-1.5\">\n <Label>Description</Label>\n <Textarea value={description} onChange={(e) => setDescription(e.target.value)} placeholder=\"Describe your remix, the creative changes you're making, or your vision for it…\" rows={3} className=\"resize-none\" />\n </div>\n </Section>\n\n <Section title=\"Collection\" icon={<Boxes className=\"h-4 w-4\" />}>\n {collectionsLoading ? (\n <Skeleton className=\"h-10 w-full rounded-md\" />\n ) : eligibleCollections.length === 0 ? (\n <div className=\"rounded-lg border border-dashed border-border p-4 text-center space-y-2\">\n <p className=\"text-sm text-muted-foreground\">No eligible collections. Create one first.</p>\n <Button size=\"sm\" variant=\"outline\" asChild>\n <Link href=\"/launchpad/single-editions/collection\"><Plus className=\"h-3.5 w-3.5 mr-1.5\" />Create collection</Link>\n </Button>\n </div>\n ) : (\n <Select value={collectionKey} onValueChange={setCollectionKey}>\n <SelectTrigger><SelectValue placeholder=\"Select a collection\" /></SelectTrigger>\n <SelectContent>\n {eligibleCollections.map((c) => (\n <SelectItem key={getCollectionKey(c)} value={getCollectionKey(c)}>\n <span className=\"flex items-center gap-2\">\n {c.name ?? c.contractAddress.slice(0, 14) + \"…\"}\n {c.standard && <span className=\"text-2xs tabular-nums text-muted-foreground\">{c.standard}</span>}\n </span>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n </Section>\n\n <Section title=\"IP Type\" icon={<Info className=\"h-4 w-4\" />}>\n <Select value={ipType} onValueChange={setIpType}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>{IP_TYPES.map((t) => <SelectItem key={t} value={t}>{t}</SelectItem>)}</SelectContent>\n </Select>\n </Section>\n\n <Section title=\"License Terms\" icon={<Shield className=\"h-4 w-4\" />}>\n <div className=\"space-y-1.5\">\n <Label>License Type</Label>\n <Select value={licenseType} onValueChange={handleLicenseChange}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>{LICENSE_TYPES.map((l) => <SelectItem key={l.value} value={l.value}>{l.value}</SelectItem>)}</SelectContent>\n </Select>\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs text-muted-foreground uppercase tracking-wide\">Commercial Use</Label>\n <ToggleGroup value={commercial ? \"Yes\" : \"No\"} options={[\"Yes\", \"No\"]} onChange={(v) => setCommercial(v === \"Yes\")} />\n </div>\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs text-muted-foreground uppercase tracking-wide\">Derivatives</Label>\n <ToggleGroup value={derivatives ? \"Allowed\" : \"Not Allowed\"} options={[\"Allowed\", \"Not Allowed\"]} onChange={(v) => setDerivatives(v === \"Allowed\")} />\n </div>\n </div>\n <Collapsible open={advancedOpen} onOpenChange={setAdvancedOpen}>\n <CollapsibleTrigger asChild>\n <button type=\"button\" className=\"flex items-center gap-1.5 text-xs text-muted-foreground hover:text-foreground transition-colors\">\n <ChevronDown className={cn(\"h-3.5 w-3.5 transition-transform\", advancedOpen && \"rotate-180\")} />\n Royalty & advanced\n </button>\n </CollapsibleTrigger>\n <CollapsibleContent className=\"pt-3 space-y-3\">\n <div className=\"space-y-1.5\">\n <Label className=\"flex items-center gap-1.5\"><Percent className=\"h-3.5 w-3.5\" />Royalty %</Label>\n <Input type=\"number\" min=\"0\" max=\"50\" step=\"1\" placeholder=\"0\" value={royalty} onChange={(e) => setRoyalty(e.target.value)} />\n <p className=\"text-xs text-muted-foreground\">Percentage of future sales sent back to you (0–50%)</p>\n </div>\n </CollapsibleContent>\n </Collapsible>\n </Section>\n\n {formError && <p role=\"alert\" className=\"text-sm text-destructive\">{formError}</p>}\n\n <div className=\"btn-border-animated p-[1px] rounded-xl\">\n <button\n type=\"button\"\n disabled={tx.phase !== \"idle\"}\n onClick={handleSubmit}\n className=\"w-full h-12 rounded-[11px] flex items-center justify-center gap-2 text-base font-semibold text-white transition-all hover:brightness-110 active:scale-[0.98] bg-brand-rose disabled:opacity-50\"\n >\n <GitBranch className=\"h-5 w-5\" />\n Mint Remix\n </button>\n </div>\n <p className=\"text-xs text-center text-muted-foreground\">Two operations: IPFS metadata upload + on-chain mint. Gas is free.</p>\n </div>\n\n <div className=\"space-y-4 lg:sticky lg:top-16\">\n <div className=\"rounded-xl border border-border overflow-hidden bg-card\">\n <div className=\"relative aspect-square w-full bg-muted\">\n {originalImage && <Image src={originalImage} alt={originalName} fill unoptimized className=\"object-cover\" />}\n <div className=\"absolute top-2 left-2\">\n <Badge variant=\"secondary\" className=\"text-2xs gap-1\"><GitBranch className=\"h-3 w-3\" />Original</Badge>\n </div>\n </div>\n <div className=\"p-4 space-y-3\">\n <div>\n <p className=\"font-semibold truncate\">{originalName}</p>\n {token.metadata?.description && <p className=\"text-xs text-muted-foreground line-clamp-2 mt-0.5\">{token.metadata.description}</p>}\n </div>\n {(attr(\"License\") || attr(\"Commercial Use\") || attr(\"Derivatives\")) && (\n <div className=\"rounded-lg bg-muted/40 p-3 space-y-1.5 text-xs\">\n <p className=\"text-2xs font-semibold text-muted-foreground\">Original License</p>\n {attr(\"License\") && <div className=\"flex justify-between\"><span className=\"text-muted-foreground\">License</span><span className=\"font-medium\">{attr(\"License\")}</span></div>}\n {attr(\"Commercial Use\") && <div className=\"flex justify-between\"><span className=\"text-muted-foreground\">Commercial</span><span className=\"font-medium\">{attr(\"Commercial Use\")}</span></div>}\n {attr(\"Derivatives\") && <div className=\"flex justify-between\"><span className=\"text-muted-foreground\">Derivatives</span><span className=\"font-medium\">{attr(\"Derivatives\")}</span></div>}\n </div>\n )}\n </div>\n </div>\n <div className=\"rounded-xl border border-primary/20 bg-primary/5 p-4 space-y-3 text-sm\">\n <p className=\"font-semibold flex items-center gap-2\"><Info className=\"h-4 w-4 text-primary\" />What happens next</p>\n <ol className=\"space-y-2 text-muted-foreground text-xs list-decimal list-inside\">\n <li>Your artwork and metadata are uploaded to IPFS</li>\n <li>A new NFT is minted in the selected collection</li>\n <li>Parent attribution is embedded on-chain permanently</li>\n </ol>\n </div>\n </div>\n </div>\n </div>\n </WalletRequired>\n );\n}\n"],"mappings":"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","names":["Link","Image"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/launchpad/remix-mint.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { Boxes, ChevronDown, ChevronLeft, GitBranch, ImagePlus, Info, Percent, Plus, Shield, Upload } from \"lucide-react\";\nimport { assetHref, getDerivativesTerm, getService, normalizeAddress, resolveRemixPolicy } from \"@medialane/sdk\";\nimport { acceptFor, uploadError } from \"../../utils/upload-limits.js\";\nimport { assertTransactionSucceeded, mintedTokenIdFromReceipt } from \"@medialane/sdk/starknet\";\nimport Image from \"../image.js\";\nimport Link from \"../link.js\";\nimport { useRouter } from \"../router.js\";\nimport { Badge } from \"../badge.js\";\nimport { Button } from \"../button.js\";\nimport { Input } from \"../input.js\";\nimport { Label } from \"../label.js\";\nimport { Skeleton } from \"../skeleton.js\";\nimport { Textarea } from \"../textarea.js\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../select.js\";\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"../collapsible.js\";\nimport { Section, ToggleGroup } from \"../create-form-primitives.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 { IP_TYPES, LICENSE_TYPES } from \"../../data/ip.js\";\nimport { cn } from \"../../utils/cn.js\";\nimport { pinAssetMetadata, uploadJsonToIpfs } from \"../../utils/ipfs-upload.js\";\nimport { runIntentCalls } from \"../../utils/run-intent-calls.js\";\nimport { checkIsOwner } from \"../../utils/ownership.js\";\nimport { useCollection, useCollectionsByOwner } from \"../../utils/use-collections.js\";\nimport { useToken, useTokenBalance } from \"../../utils/use-tokens.js\";\nimport { useImageUrl } from \"../../utils/use-image-url.js\";\nimport { useTransaction } from \"../../utils/use-transaction.js\";\nimport { invalidatePortfolioCache } from \"../../utils/portfolio-cache.js\";\n\nexport function RemixMint({ contract, tokenId }: { contract: string; tokenId: string }) {\n const app = useMedialaneApp();\n const router = useRouter();\n const resolveImage = useImageUrl();\n const walletAddress = app.walletAddress;\n const tx = useTransaction();\n const { token, isLoading: tokenLoading } = useToken(contract, tokenId);\n const { collection: parentCollection } = useCollection(contract);\n const { collections: allCollections, isLoading: collectionsLoading } = useCollectionsByOwner(walletAddress ?? null);\n const eligibleCollections = allCollections.filter(\n (c) => getService(c.service)?.id === \"mip-erc1155\" || (getService(c.service)?.id === \"mip-erc721\" && c.collectionId != null),\n );\n const { amount: walletBalance } = useTokenBalance(contract, tokenId, walletAddress);\n const viewerIsOwner = checkIsOwner(token, walletAddress, walletBalance);\n\n const originalName = token?.metadata?.name ?? `Token #${tokenId}`;\n const originalImage = resolveImage(token?.metadata?.image);\n const originalAttributes = Array.isArray(token?.metadata?.attributes)\n ? (token!.metadata!.attributes as { trait_type?: string; value?: string }[])\n : [];\n const attr = (t: string) => originalAttributes.find((a) => a.trait_type === t)?.value;\n\n const remixPolicy = resolveRemixPolicy({\n parentNoDerivatives: getDerivativesTerm(originalAttributes) === \"Not Allowed\",\n viewerIsParentOwner: viewerIsOwner,\n dealAvailable: !!getService(parentCollection?.service),\n });\n\n const [imageFile, setImageFile] = useState<File | null>(null);\n const [imagePreview, setImagePreview] = useState<string | null>(null);\n const [name, setName] = useState(\"\");\n const [description, setDescription] = useState(\"\");\n const [collectionKey, setCollectionKey] = useState(\"\");\n const [ipType, setIpType] = useState<string>(\"Art\");\n const [licenseType, setLicenseType] = useState(\"CC BY\");\n const [commercial, setCommercial] = useState(false);\n const [derivatives, setDerivatives] = useState(true);\n const [royalty, setRoyalty] = useState(\"\");\n const [advancedOpen, setAdvancedOpen] = useState(false);\n const [formError, setFormError] = useState<string | null>(null);\n const [remixHref, setRemixHref] = useState<string | null>(null);\n const previewUrlRef = useRef<string | null>(null);\n const fileInputRef = useRef<HTMLInputElement | null>(null);\n\n useEffect(() => {\n if (token && !name) setName(`Remix of ${originalName}`);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- runs once when the token loads; name is guarded by the check above\n }, [token]);\n\n const getCollectionKey = (c: (typeof eligibleCollections)[number]) => c.collectionId ?? c.contractAddress;\n\n useEffect(() => {\n if (eligibleCollections.length > 0 && !collectionKey) {\n const match = eligibleCollections.find((c) => normalizeAddress(\"STARKNET\", c.contractAddress) === normalizeAddress(\"STARKNET\", contract));\n setCollectionKey(getCollectionKey(match ?? eligibleCollections[0]!));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- runs once when the eligible collections first load\n }, [eligibleCollections.length]);\n\n useEffect(() => {\n return () => {\n if (previewUrlRef.current) URL.revokeObjectURL(previewUrlRef.current);\n };\n }, []);\n\n const redirected = useRef(false);\n useEffect(() => {\n if (!token || remixPolicy.canRemixDirect || redirected.current) return;\n redirected.current = true;\n router.replace(assetHref(\"STARKNET\", contract, tokenId));\n }, [token, remixPolicy.canRemixDirect, router, contract, tokenId]);\n\n const handleLicenseChange = (value: string) => {\n setLicenseType(value);\n const preset = LICENSE_TYPES.find((l) => l.value === value);\n if (preset) {\n setCommercial(preset.commercialUse === \"Yes\");\n setDerivatives(preset.derivatives !== \"Not Allowed\");\n }\n };\n\n const handleImageChange = (file: File) => {\n const fileError = uploadError(file, \"image\");\n if (fileError) {\n setFormError(fileError);\n return;\n }\n setFormError(null);\n if (previewUrlRef.current) URL.revokeObjectURL(previewUrlRef.current);\n const url = URL.createObjectURL(file);\n previewUrlRef.current = url;\n setImageFile(file);\n setImagePreview(url);\n };\n\n const handleSubmit = () => {\n if (!name.trim()) return setFormError(\"Remix name is required\");\n if (!collectionKey) return setFormError(\"Select a collection\");\n if (!walletAddress) return;\n setFormError(null);\n void tx.run(async (signer) => {\n await app.ensureSignedIn?.();\n const client = app.getClient();\n const api = client.api;\n const selected = eligibleCollections.find((c) => getCollectionKey(c) === collectionKey);\n if (!selected) throw new Error(\"Collection not found\");\n\n let tokenUri: string;\n if (imageFile) {\n tokenUri = (\n await pinAssetMetadata(api, {\n imageFile,\n name: name.trim(),\n description: description.trim() || `Remix of ${originalName}`,\n creator: walletAddress,\n ipType,\n licenseType,\n commercialUse: commercial ? \"Yes\" : \"No\",\n derivatives: derivatives ? \"Allowed\" : \"Not Allowed\",\n attribution: \"Required\",\n geographicScope: \"Worldwide\",\n aiPolicy: \"Not Allowed\",\n royalty: royalty || \"0\",\n templateTraits: [\n { traitType: \"Parent Contract\", value: contract },\n { traitType: \"Parent Token ID\", value: tokenId },\n ],\n })\n ).uri;\n } else {\n tokenUri = await uploadJsonToIpfs(api, {\n name: name.trim(),\n description: description.trim() || `Remix of ${originalName}`,\n image: token?.metadata?.image ?? \"\",\n attributes: [\n { trait_type: \"Parent Contract\", value: contract },\n { trait_type: \"Parent Token ID\", value: tokenId },\n { trait_type: \"Remix Type\", value: \"Derivative\" },\n { trait_type: \"IP Type\", value: ipType },\n { trait_type: \"License\", value: licenseType },\n { trait_type: \"Commercial Use\", value: commercial ? \"Yes\" : \"No\" },\n { trait_type: \"Derivatives\", value: derivatives ? \"Allowed\" : \"Not Allowed\" },\n ...(royalty ? [{ trait_type: \"Royalty\", value: `${royalty}%` }] : []),\n { trait_type: \"Creator\", value: walletAddress },\n ],\n });\n }\n\n const { txHash } = await runIntentCalls(signer, () =>\n api.intents.create(\n \"mint\",\n selected.standard === \"ERC1155\"\n ? { owner: walletAddress, recipient: walletAddress, collectionContract: selected.contractAddress, tokenUri, value: \"1\" }\n : { owner: walletAddress, collectionId: selected.collectionId!, recipient: walletAddress, tokenUri, royaltyBps: 0 },\n ),\n );\n const receipt = await assertTransactionSucceeded(client.provider, txHash);\n const remixTokenId = mintedTokenIdFromReceipt(receipt, selected.contractAddress);\n if (!remixTokenId) throw new Error(\"Minted, but could not read the new token id from the receipt\");\n await api.remix.confirmSelf({\n originalContract: contract,\n originalTokenId: tokenId,\n remixContract: selected.contractAddress,\n remixTokenId,\n txHash,\n licenseType,\n commercial,\n derivatives,\n });\n setRemixHref(assetHref(\"STARKNET\", selected.contractAddress, remixTokenId));\n invalidatePortfolioCache(walletAddress);\n });\n };\n\n const handleAgain = () => {\n tx.reset();\n setRemixHref(null);\n };\n\n const gate = { icon: GitBranch, title: \"Connect to create a remix\", description: \"Connect to mint a derivative of this asset.\" };\n\n if (tokenLoading) {\n return (\n <WalletRequired {...gate}>\n <div className=\"max-w-5xl mx-auto px-4 pt-14 pb-8 space-y-6\">\n <Skeleton className=\"h-8 w-48\" />\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_340px] gap-8\">\n <div className=\"space-y-4\">{[1, 2, 3, 4].map((i) => <Skeleton key={i} className=\"h-32 w-full rounded-xl\" />)}</div>\n <Skeleton className=\"h-80 w-full rounded-xl\" />\n </div>\n </div>\n </WalletRequired>\n );\n }\n\n if (!token) {\n return (\n <div className=\"max-w-5xl mx-auto px-4 py-24 text-center space-y-4\">\n <p className=\"text-2xl font-bold\">Asset not found</p>\n <Button asChild variant=\"outline\"><Link href=\"/\">Go home</Link></Button>\n </div>\n );\n }\n\n return (\n <WalletRequired {...gate}>\n <TransactionDialog tx={tx} title=\"Mint a remix\" workingLabel=\"Minting your remix…\" firstStepLabel=\"Upload to IPFS\">\n <TransactionSuccess\n name={name}\n image={imagePreview ?? originalImage ?? null}\n title=\"Remix minted\"\n description=\"It is registered as a remix of the original asset and carries its own license terms.\"\n actions={[\n ...(remixHref ? [{ href: remixHref, label: \"View remix\" }] : []),\n { href: \"/portfolio/assets\", label: \"View portfolio\" },\n { label: \"Close\", onClick: handleAgain },\n ]}\n >\n <RewardEarned actionType=\"mint_asset\" />\n </TransactionSuccess>\n </TransactionDialog>\n\n <div className=\"max-w-5xl mx-auto px-4 pt-14 pb-12 space-y-6\">\n <div className=\"space-y-3\">\n <Link href={assetHref(\"STARKNET\", contract, tokenId)} className=\"inline-flex items-center gap-1.5 text-sm text-muted-foreground hover:text-foreground transition-colors\">\n <ChevronLeft className=\"h-4 w-4\" />\n Back to asset\n </Link>\n <div className=\"flex items-center gap-2 text-primary\">\n <GitBranch className=\"h-5 w-5\" />\n <span className=\"text-sm font-semibold\">Create Remix</span>\n </div>\n <h1 className=\"text-3xl font-bold\">Mint a Remix</h1>\n <p className=\"text-muted-foreground max-w-xl\">Mint a derivative work based on this asset. The parent attribution is embedded in the IPFS metadata.</p>\n </div>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_320px] gap-8 items-start\">\n <div className=\"space-y-4\">\n <Section title=\"Remix Artwork\" icon={<ImagePlus className=\"h-4 w-4\" />}>\n <div\n className={cn(\"relative group rounded-xl border-2 border-dashed border-border transition-colors cursor-pointer overflow-hidden\", \"hover:border-primary/50 hover:bg-muted/30\")}\n onClick={() => fileInputRef.current?.click()}\n >\n <input ref={fileInputRef} type=\"file\" accept={acceptFor(\"image\")} className=\"hidden\" onChange={(e) => { const f = e.target.files?.[0]; if (f) handleImageChange(f); }} />\n {imagePreview ? (\n <div className=\"relative aspect-square w-full\">\n <Image src={imagePreview} alt=\"Remix preview\" fill unoptimized className=\"object-cover\" />\n <div className=\"absolute inset-0 bg-black/50 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center\">\n <p className=\"text-white text-sm font-medium flex items-center gap-2\"><Upload className=\"h-4 w-4\" /> Change image</p>\n </div>\n </div>\n ) : (\n <div className=\"aspect-square flex flex-col items-center justify-center gap-3 text-muted-foreground p-8\">\n {originalImage && (\n <div className=\"relative h-20 w-20 rounded-xl overflow-hidden opacity-40 mb-1 ring-2 ring-border\">\n <Image src={originalImage} alt=\"\" fill unoptimized className=\"object-cover\" />\n </div>\n )}\n <Upload className=\"h-8 w-8\" />\n <div className=\"text-center\">\n <p className=\"text-sm font-medium\">Upload remix artwork</p>\n <p className=\"text-xs mt-0.5\">{originalImage ? \"Leave empty to inherit original artwork\" : \"PNG, JPG, GIF, WebP up to 10MB\"}</p>\n </div>\n </div>\n )}\n </div>\n </Section>\n\n <Section title=\"Remix Details\" icon={<GitBranch className=\"h-4 w-4\" />}>\n <div className=\"space-y-1.5\">\n <Label>Remix Name *</Label>\n <Input value={name} onChange={(e) => setName(e.target.value)} placeholder={`Remix of ${originalName}`} />\n </div>\n <div className=\"space-y-1.5\">\n <Label>Description</Label>\n <Textarea value={description} onChange={(e) => setDescription(e.target.value)} placeholder=\"Describe your remix, the creative changes you're making, or your vision for it…\" rows={3} className=\"resize-none\" />\n </div>\n </Section>\n\n <Section title=\"Collection\" icon={<Boxes className=\"h-4 w-4\" />}>\n {collectionsLoading ? (\n <Skeleton className=\"h-10 w-full rounded-md\" />\n ) : eligibleCollections.length === 0 ? (\n <div className=\"rounded-lg border border-dashed border-border p-4 text-center space-y-2\">\n <p className=\"text-sm text-muted-foreground\">No eligible collections. Create one first.</p>\n <Button size=\"sm\" variant=\"outline\" asChild>\n <Link href=\"/launchpad/single-editions/collection\"><Plus className=\"h-3.5 w-3.5 mr-1.5\" />Create collection</Link>\n </Button>\n </div>\n ) : (\n <Select value={collectionKey} onValueChange={setCollectionKey}>\n <SelectTrigger><SelectValue placeholder=\"Select a collection\" /></SelectTrigger>\n <SelectContent>\n {eligibleCollections.map((c) => (\n <SelectItem key={getCollectionKey(c)} value={getCollectionKey(c)}>\n <span className=\"flex items-center gap-2\">\n {c.name ?? c.contractAddress.slice(0, 14) + \"…\"}\n {c.standard && <span className=\"text-2xs tabular-nums text-muted-foreground\">{c.standard}</span>}\n </span>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n </Section>\n\n <Section title=\"IP Type\" icon={<Info className=\"h-4 w-4\" />}>\n <Select value={ipType} onValueChange={setIpType}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>{IP_TYPES.map((t) => <SelectItem key={t} value={t}>{t}</SelectItem>)}</SelectContent>\n </Select>\n </Section>\n\n <Section title=\"License Terms\" icon={<Shield className=\"h-4 w-4\" />}>\n <div className=\"space-y-1.5\">\n <Label>License Type</Label>\n <Select value={licenseType} onValueChange={handleLicenseChange}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>{LICENSE_TYPES.map((l) => <SelectItem key={l.value} value={l.value}>{l.value}</SelectItem>)}</SelectContent>\n </Select>\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs text-muted-foreground uppercase tracking-wide\">Commercial Use</Label>\n <ToggleGroup value={commercial ? \"Yes\" : \"No\"} options={[\"Yes\", \"No\"]} onChange={(v) => setCommercial(v === \"Yes\")} />\n </div>\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs text-muted-foreground uppercase tracking-wide\">Derivatives</Label>\n <ToggleGroup value={derivatives ? \"Allowed\" : \"Not Allowed\"} options={[\"Allowed\", \"Not Allowed\"]} onChange={(v) => setDerivatives(v === \"Allowed\")} />\n </div>\n </div>\n <Collapsible open={advancedOpen} onOpenChange={setAdvancedOpen}>\n <CollapsibleTrigger asChild>\n <button type=\"button\" className=\"flex items-center gap-1.5 text-xs text-muted-foreground hover:text-foreground transition-colors\">\n <ChevronDown className={cn(\"h-3.5 w-3.5 transition-transform\", advancedOpen && \"rotate-180\")} />\n Royalty & advanced\n </button>\n </CollapsibleTrigger>\n <CollapsibleContent className=\"pt-3 space-y-3\">\n <div className=\"space-y-1.5\">\n <Label className=\"flex items-center gap-1.5\"><Percent className=\"h-3.5 w-3.5\" />Royalty %</Label>\n <Input type=\"number\" min=\"0\" max=\"50\" step=\"1\" placeholder=\"0\" value={royalty} onChange={(e) => setRoyalty(e.target.value)} />\n <p className=\"text-xs text-muted-foreground\">Percentage of future sales sent back to you (0–50%)</p>\n </div>\n </CollapsibleContent>\n </Collapsible>\n </Section>\n\n {formError && <p role=\"alert\" className=\"text-sm text-destructive\">{formError}</p>}\n\n <div className=\"btn-border-animated p-[1px] rounded-xl\">\n <button\n type=\"button\"\n disabled={tx.phase !== \"idle\"}\n onClick={handleSubmit}\n className=\"w-full h-12 rounded-[11px] flex items-center justify-center gap-2 text-base font-semibold text-white transition-all hover:brightness-110 active:scale-[0.98] bg-brand-rose disabled:opacity-50\"\n >\n <GitBranch className=\"h-5 w-5\" />\n Mint Remix\n </button>\n </div>\n <p className=\"text-xs text-center text-muted-foreground\">Two operations: IPFS metadata upload + on-chain mint. Gas is free.</p>\n </div>\n\n <div className=\"space-y-4 lg:sticky lg:top-16\">\n <div className=\"rounded-xl border border-border overflow-hidden bg-card\">\n <div className=\"relative aspect-square w-full bg-muted\">\n {originalImage && <Image src={originalImage} alt={originalName} fill unoptimized className=\"object-cover\" />}\n <div className=\"absolute top-2 left-2\">\n <Badge variant=\"secondary\" className=\"text-2xs gap-1\"><GitBranch className=\"h-3 w-3\" />Original</Badge>\n </div>\n </div>\n <div className=\"p-4 space-y-3\">\n <div>\n <p className=\"font-semibold truncate\">{originalName}</p>\n {token.metadata?.description && <p className=\"text-xs text-muted-foreground line-clamp-2 mt-0.5\">{token.metadata.description}</p>}\n </div>\n {(attr(\"License\") || attr(\"Commercial Use\") || attr(\"Derivatives\")) && (\n <div className=\"rounded-lg bg-muted/40 p-3 space-y-1.5 text-xs\">\n <p className=\"text-2xs font-semibold text-muted-foreground\">Original License</p>\n {attr(\"License\") && <div className=\"flex justify-between\"><span className=\"text-muted-foreground\">License</span><span className=\"font-medium\">{attr(\"License\")}</span></div>}\n {attr(\"Commercial Use\") && <div className=\"flex justify-between\"><span className=\"text-muted-foreground\">Commercial</span><span className=\"font-medium\">{attr(\"Commercial Use\")}</span></div>}\n {attr(\"Derivatives\") && <div className=\"flex justify-between\"><span className=\"text-muted-foreground\">Derivatives</span><span className=\"font-medium\">{attr(\"Derivatives\")}</span></div>}\n </div>\n )}\n </div>\n </div>\n <div className=\"rounded-xl border border-primary/20 bg-primary/5 p-4 space-y-3 text-sm\">\n <p className=\"font-semibold flex items-center gap-2\"><Info className=\"h-4 w-4 text-primary\" />What happens next</p>\n <ol className=\"space-y-2 text-muted-foreground text-xs list-decimal list-inside\">\n <li>Your artwork and metadata are uploaded to IPFS</li>\n <li>A new NFT is minted in the selected collection</li>\n <li>Parent attribution is embedded on-chain permanently</li>\n </ol>\n </div>\n </div>\n </div>\n </div>\n </WalletRequired>\n );\n}\n"],"mappings":"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","names":["Link","Image"]}
|
|
@@ -17,7 +17,7 @@ import { Textarea } from "../textarea.js";
|
|
|
17
17
|
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "../select.js";
|
|
18
18
|
import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "../collapsible.js";
|
|
19
19
|
import { Section, ToggleGroup } from "../create-form-primitives.js";
|
|
20
|
-
import {
|
|
20
|
+
import { TransactionSuccess } from "../transaction-success.js";
|
|
21
21
|
import { TransactionDialog } from "../transaction-dialog.js";
|
|
22
22
|
import { WalletRequired } from "../wallet-required.js";
|
|
23
23
|
import { useMedialaneApp } from "../medialane-app.js";
|
|
@@ -207,15 +207,17 @@ function RemixMint({ contract, tokenId }) {
|
|
|
207
207
|
}
|
|
208
208
|
return /* @__PURE__ */ jsxs(WalletRequired, { ...gate, children: [
|
|
209
209
|
/* @__PURE__ */ jsx(TransactionDialog, { tx, title: "Mint a remix", workingLabel: "Minting your remix\u2026", firstStepLabel: "Upload to IPFS", children: /* @__PURE__ */ jsx(
|
|
210
|
-
|
|
210
|
+
TransactionSuccess,
|
|
211
211
|
{
|
|
212
212
|
name,
|
|
213
213
|
image: imagePreview ?? originalImage ?? null,
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
214
|
+
title: "Remix minted",
|
|
215
|
+
description: "It is registered as a remix of the original asset and carries its own license terms.",
|
|
216
|
+
actions: [
|
|
217
|
+
...remixHref ? [{ href: remixHref, label: "View remix" }] : [],
|
|
218
|
+
{ href: "/portfolio/assets", label: "View portfolio" },
|
|
219
|
+
{ label: "Close", onClick: handleAgain }
|
|
220
|
+
],
|
|
219
221
|
children: /* @__PURE__ */ jsx(RewardEarned, { actionType: "mint_asset" })
|
|
220
222
|
}
|
|
221
223
|
) }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/launchpad/remix-mint.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { Boxes, ChevronDown, ChevronLeft, GitBranch, ImagePlus, Info, Percent, Plus, Shield, Upload } from \"lucide-react\";\nimport { assetHref, getDerivativesTerm, getService, normalizeAddress, resolveRemixPolicy } from \"@medialane/sdk\";\nimport { acceptFor, uploadError } from \"../../utils/upload-limits.js\";\nimport { assertTransactionSucceeded, mintedTokenIdFromReceipt } from \"@medialane/sdk/starknet\";\nimport Image from \"../image.js\";\nimport Link from \"../link.js\";\nimport { useRouter } from \"../router.js\";\nimport { Badge } from \"../badge.js\";\nimport { Button } from \"../button.js\";\nimport { Input } from \"../input.js\";\nimport { Label } from \"../label.js\";\nimport { Skeleton } from \"../skeleton.js\";\nimport { Textarea } from \"../textarea.js\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../select.js\";\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"../collapsible.js\";\nimport { Section, ToggleGroup } from \"../create-form-primitives.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 { IP_TYPES, LICENSE_TYPES } from \"../../data/ip.js\";\nimport { cn } from \"../../utils/cn.js\";\nimport { pinAssetMetadata, uploadJsonToIpfs } from \"../../utils/ipfs-upload.js\";\nimport { runIntentCalls } from \"../../utils/run-intent-calls.js\";\nimport { checkIsOwner } from \"../../utils/ownership.js\";\nimport { useCollection, useCollectionsByOwner } from \"../../utils/use-collections.js\";\nimport { useToken, useTokenBalance } from \"../../utils/use-tokens.js\";\nimport { useImageUrl } from \"../../utils/use-image-url.js\";\nimport { useTransaction } from \"../../utils/use-transaction.js\";\nimport { invalidatePortfolioCache } from \"../../utils/portfolio-cache.js\";\n\nexport function RemixMint({ contract, tokenId }: { contract: string; tokenId: string }) {\n const app = useMedialaneApp();\n const router = useRouter();\n const resolveImage = useImageUrl();\n const walletAddress = app.walletAddress;\n const tx = useTransaction();\n const { token, isLoading: tokenLoading } = useToken(contract, tokenId);\n const { collection: parentCollection } = useCollection(contract);\n const { collections: allCollections, isLoading: collectionsLoading } = useCollectionsByOwner(walletAddress ?? null);\n const eligibleCollections = allCollections.filter(\n (c) => getService(c.service)?.id === \"mip-erc1155\" || (getService(c.service)?.id === \"mip-erc721\" && c.collectionId != null),\n );\n const { amount: walletBalance } = useTokenBalance(contract, tokenId, walletAddress);\n const viewerIsOwner = checkIsOwner(token, walletAddress, walletBalance);\n\n const originalName = token?.metadata?.name ?? `Token #${tokenId}`;\n const originalImage = resolveImage(token?.metadata?.image);\n const originalAttributes = Array.isArray(token?.metadata?.attributes)\n ? (token!.metadata!.attributes as { trait_type?: string; value?: string }[])\n : [];\n const attr = (t: string) => originalAttributes.find((a) => a.trait_type === t)?.value;\n\n const remixPolicy = resolveRemixPolicy({\n parentNoDerivatives: getDerivativesTerm(originalAttributes) === \"Not Allowed\",\n viewerIsParentOwner: viewerIsOwner,\n dealAvailable: !!getService(parentCollection?.service),\n });\n\n const [imageFile, setImageFile] = useState<File | null>(null);\n const [imagePreview, setImagePreview] = useState<string | null>(null);\n const [name, setName] = useState(\"\");\n const [description, setDescription] = useState(\"\");\n const [collectionKey, setCollectionKey] = useState(\"\");\n const [ipType, setIpType] = useState<string>(\"Art\");\n const [licenseType, setLicenseType] = useState(\"CC BY\");\n const [commercial, setCommercial] = useState(false);\n const [derivatives, setDerivatives] = useState(true);\n const [royalty, setRoyalty] = useState(\"\");\n const [advancedOpen, setAdvancedOpen] = useState(false);\n const [formError, setFormError] = useState<string | null>(null);\n const [remixHref, setRemixHref] = useState<string | null>(null);\n const previewUrlRef = useRef<string | null>(null);\n const fileInputRef = useRef<HTMLInputElement | null>(null);\n\n useEffect(() => {\n if (token && !name) setName(`Remix of ${originalName}`);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- runs once when the token loads; name is guarded by the check above\n }, [token]);\n\n const getCollectionKey = (c: (typeof eligibleCollections)[number]) => c.collectionId ?? c.contractAddress;\n\n useEffect(() => {\n if (eligibleCollections.length > 0 && !collectionKey) {\n const match = eligibleCollections.find((c) => normalizeAddress(\"STARKNET\", c.contractAddress) === normalizeAddress(\"STARKNET\", contract));\n setCollectionKey(getCollectionKey(match ?? eligibleCollections[0]!));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- runs once when the eligible collections first load\n }, [eligibleCollections.length]);\n\n useEffect(() => {\n return () => {\n if (previewUrlRef.current) URL.revokeObjectURL(previewUrlRef.current);\n };\n }, []);\n\n const redirected = useRef(false);\n useEffect(() => {\n if (!token || remixPolicy.canRemixDirect || redirected.current) return;\n redirected.current = true;\n router.replace(assetHref(\"STARKNET\", contract, tokenId));\n }, [token, remixPolicy.canRemixDirect, router, contract, tokenId]);\n\n const handleLicenseChange = (value: string) => {\n setLicenseType(value);\n const preset = LICENSE_TYPES.find((l) => l.value === value);\n if (preset) {\n setCommercial(preset.commercialUse === \"Yes\");\n setDerivatives(preset.derivatives !== \"Not Allowed\");\n }\n };\n\n const handleImageChange = (file: File) => {\n const fileError = uploadError(file, \"image\");\n if (fileError) {\n setFormError(fileError);\n return;\n }\n setFormError(null);\n if (previewUrlRef.current) URL.revokeObjectURL(previewUrlRef.current);\n const url = URL.createObjectURL(file);\n previewUrlRef.current = url;\n setImageFile(file);\n setImagePreview(url);\n };\n\n const handleSubmit = () => {\n if (!name.trim()) return setFormError(\"Remix name is required\");\n if (!collectionKey) return setFormError(\"Select a collection\");\n if (!walletAddress) return;\n setFormError(null);\n void tx.run(async (signer) => {\n await app.ensureSignedIn?.();\n const client = app.getClient();\n const api = client.api;\n const selected = eligibleCollections.find((c) => getCollectionKey(c) === collectionKey);\n if (!selected) throw new Error(\"Collection not found\");\n\n let tokenUri: string;\n if (imageFile) {\n tokenUri = (\n await pinAssetMetadata(api, {\n imageFile,\n name: name.trim(),\n description: description.trim() || `Remix of ${originalName}`,\n creator: walletAddress,\n ipType,\n licenseType,\n commercialUse: commercial ? \"Yes\" : \"No\",\n derivatives: derivatives ? \"Allowed\" : \"Not Allowed\",\n attribution: \"Required\",\n geographicScope: \"Worldwide\",\n aiPolicy: \"Not Allowed\",\n royalty: royalty || \"0\",\n templateTraits: [\n { traitType: \"Parent Contract\", value: contract },\n { traitType: \"Parent Token ID\", value: tokenId },\n ],\n })\n ).uri;\n } else {\n tokenUri = await uploadJsonToIpfs(api, {\n name: name.trim(),\n description: description.trim() || `Remix of ${originalName}`,\n image: token?.metadata?.image ?? \"\",\n attributes: [\n { trait_type: \"Parent Contract\", value: contract },\n { trait_type: \"Parent Token ID\", value: tokenId },\n { trait_type: \"Remix Type\", value: \"Derivative\" },\n { trait_type: \"IP Type\", value: ipType },\n { trait_type: \"License\", value: licenseType },\n { trait_type: \"Commercial Use\", value: commercial ? \"Yes\" : \"No\" },\n { trait_type: \"Derivatives\", value: derivatives ? \"Allowed\" : \"Not Allowed\" },\n ...(royalty ? [{ trait_type: \"Royalty\", value: `${royalty}%` }] : []),\n { trait_type: \"Creator\", value: walletAddress },\n ],\n });\n }\n\n const { txHash } = await runIntentCalls(signer, () =>\n api.intents.create(\n \"mint\",\n selected.standard === \"ERC1155\"\n ? { owner: walletAddress, recipient: walletAddress, collectionContract: selected.contractAddress, tokenUri, value: \"1\" }\n : { owner: walletAddress, collectionId: selected.collectionId!, recipient: walletAddress, tokenUri, royaltyBps: 0 },\n ),\n );\n const receipt = await assertTransactionSucceeded(client.provider, txHash);\n const remixTokenId = mintedTokenIdFromReceipt(receipt, selected.contractAddress);\n if (!remixTokenId) throw new Error(\"Minted, but could not read the new token id from the receipt\");\n await api.remix.confirmSelf({\n originalContract: contract,\n originalTokenId: tokenId,\n remixContract: selected.contractAddress,\n remixTokenId,\n txHash,\n licenseType,\n commercial,\n derivatives,\n });\n setRemixHref(assetHref(\"STARKNET\", selected.contractAddress, remixTokenId));\n invalidatePortfolioCache(walletAddress);\n });\n };\n\n const handleAgain = () => {\n tx.reset();\n setRemixHref(null);\n };\n\n const gate = { icon: GitBranch, title: \"Connect to create a remix\", description: \"Connect to mint a derivative of this asset.\" };\n\n if (tokenLoading) {\n return (\n <WalletRequired {...gate}>\n <div className=\"max-w-5xl mx-auto px-4 pt-14 pb-8 space-y-6\">\n <Skeleton className=\"h-8 w-48\" />\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_340px] gap-8\">\n <div className=\"space-y-4\">{[1, 2, 3, 4].map((i) => <Skeleton key={i} className=\"h-32 w-full rounded-xl\" />)}</div>\n <Skeleton className=\"h-80 w-full rounded-xl\" />\n </div>\n </div>\n </WalletRequired>\n );\n }\n\n if (!token) {\n return (\n <div className=\"max-w-5xl mx-auto px-4 py-24 text-center space-y-4\">\n <p className=\"text-2xl font-bold\">Asset not found</p>\n <Button asChild variant=\"outline\"><Link href=\"/\">Go home</Link></Button>\n </div>\n );\n }\n\n return (\n <WalletRequired {...gate}>\n <TransactionDialog tx={tx} title=\"Mint a remix\" workingLabel=\"Minting your remix…\" firstStepLabel=\"Upload to IPFS\">\n <CreationSuccess\n name={name}\n image={imagePreview ?? originalImage ?? null}\n caption=\"Your remix is live\"\n primary={remixHref ? { href: remixHref, label: \"View remix\" } : { href: \"/portfolio/assets\", label: \"View portfolio\" }}\n secondary={remixHref ? { href: \"/portfolio/assets\", label: \"View portfolio\" } : undefined}\n onAgain={handleAgain}\n againLabel=\"Close\"\n >\n <RewardEarned actionType=\"mint_asset\" />\n </CreationSuccess>\n </TransactionDialog>\n\n <div className=\"max-w-5xl mx-auto px-4 pt-14 pb-12 space-y-6\">\n <div className=\"space-y-3\">\n <Link href={assetHref(\"STARKNET\", contract, tokenId)} className=\"inline-flex items-center gap-1.5 text-sm text-muted-foreground hover:text-foreground transition-colors\">\n <ChevronLeft className=\"h-4 w-4\" />\n Back to asset\n </Link>\n <div className=\"flex items-center gap-2 text-primary\">\n <GitBranch className=\"h-5 w-5\" />\n <span className=\"text-sm font-semibold\">Create Remix</span>\n </div>\n <h1 className=\"text-3xl font-bold\">Mint a Remix</h1>\n <p className=\"text-muted-foreground max-w-xl\">Mint a derivative work based on this asset. The parent attribution is embedded in the IPFS metadata.</p>\n </div>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_320px] gap-8 items-start\">\n <div className=\"space-y-4\">\n <Section title=\"Remix Artwork\" icon={<ImagePlus className=\"h-4 w-4\" />}>\n <div\n className={cn(\"relative group rounded-xl border-2 border-dashed border-border transition-colors cursor-pointer overflow-hidden\", \"hover:border-primary/50 hover:bg-muted/30\")}\n onClick={() => fileInputRef.current?.click()}\n >\n <input ref={fileInputRef} type=\"file\" accept={acceptFor(\"image\")} className=\"hidden\" onChange={(e) => { const f = e.target.files?.[0]; if (f) handleImageChange(f); }} />\n {imagePreview ? (\n <div className=\"relative aspect-square w-full\">\n <Image src={imagePreview} alt=\"Remix preview\" fill unoptimized className=\"object-cover\" />\n <div className=\"absolute inset-0 bg-black/50 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center\">\n <p className=\"text-white text-sm font-medium flex items-center gap-2\"><Upload className=\"h-4 w-4\" /> Change image</p>\n </div>\n </div>\n ) : (\n <div className=\"aspect-square flex flex-col items-center justify-center gap-3 text-muted-foreground p-8\">\n {originalImage && (\n <div className=\"relative h-20 w-20 rounded-xl overflow-hidden opacity-40 mb-1 ring-2 ring-border\">\n <Image src={originalImage} alt=\"\" fill unoptimized className=\"object-cover\" />\n </div>\n )}\n <Upload className=\"h-8 w-8\" />\n <div className=\"text-center\">\n <p className=\"text-sm font-medium\">Upload remix artwork</p>\n <p className=\"text-xs mt-0.5\">{originalImage ? \"Leave empty to inherit original artwork\" : \"PNG, JPG, GIF, WebP up to 10MB\"}</p>\n </div>\n </div>\n )}\n </div>\n </Section>\n\n <Section title=\"Remix Details\" icon={<GitBranch className=\"h-4 w-4\" />}>\n <div className=\"space-y-1.5\">\n <Label>Remix Name *</Label>\n <Input value={name} onChange={(e) => setName(e.target.value)} placeholder={`Remix of ${originalName}`} />\n </div>\n <div className=\"space-y-1.5\">\n <Label>Description</Label>\n <Textarea value={description} onChange={(e) => setDescription(e.target.value)} placeholder=\"Describe your remix, the creative changes you're making, or your vision for it…\" rows={3} className=\"resize-none\" />\n </div>\n </Section>\n\n <Section title=\"Collection\" icon={<Boxes className=\"h-4 w-4\" />}>\n {collectionsLoading ? (\n <Skeleton className=\"h-10 w-full rounded-md\" />\n ) : eligibleCollections.length === 0 ? (\n <div className=\"rounded-lg border border-dashed border-border p-4 text-center space-y-2\">\n <p className=\"text-sm text-muted-foreground\">No eligible collections. Create one first.</p>\n <Button size=\"sm\" variant=\"outline\" asChild>\n <Link href=\"/launchpad/single-editions/collection\"><Plus className=\"h-3.5 w-3.5 mr-1.5\" />Create collection</Link>\n </Button>\n </div>\n ) : (\n <Select value={collectionKey} onValueChange={setCollectionKey}>\n <SelectTrigger><SelectValue placeholder=\"Select a collection\" /></SelectTrigger>\n <SelectContent>\n {eligibleCollections.map((c) => (\n <SelectItem key={getCollectionKey(c)} value={getCollectionKey(c)}>\n <span className=\"flex items-center gap-2\">\n {c.name ?? c.contractAddress.slice(0, 14) + \"…\"}\n {c.standard && <span className=\"text-2xs tabular-nums text-muted-foreground\">{c.standard}</span>}\n </span>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n </Section>\n\n <Section title=\"IP Type\" icon={<Info className=\"h-4 w-4\" />}>\n <Select value={ipType} onValueChange={setIpType}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>{IP_TYPES.map((t) => <SelectItem key={t} value={t}>{t}</SelectItem>)}</SelectContent>\n </Select>\n </Section>\n\n <Section title=\"License Terms\" icon={<Shield className=\"h-4 w-4\" />}>\n <div className=\"space-y-1.5\">\n <Label>License Type</Label>\n <Select value={licenseType} onValueChange={handleLicenseChange}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>{LICENSE_TYPES.map((l) => <SelectItem key={l.value} value={l.value}>{l.value}</SelectItem>)}</SelectContent>\n </Select>\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs text-muted-foreground uppercase tracking-wide\">Commercial Use</Label>\n <ToggleGroup value={commercial ? \"Yes\" : \"No\"} options={[\"Yes\", \"No\"]} onChange={(v) => setCommercial(v === \"Yes\")} />\n </div>\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs text-muted-foreground uppercase tracking-wide\">Derivatives</Label>\n <ToggleGroup value={derivatives ? \"Allowed\" : \"Not Allowed\"} options={[\"Allowed\", \"Not Allowed\"]} onChange={(v) => setDerivatives(v === \"Allowed\")} />\n </div>\n </div>\n <Collapsible open={advancedOpen} onOpenChange={setAdvancedOpen}>\n <CollapsibleTrigger asChild>\n <button type=\"button\" className=\"flex items-center gap-1.5 text-xs text-muted-foreground hover:text-foreground transition-colors\">\n <ChevronDown className={cn(\"h-3.5 w-3.5 transition-transform\", advancedOpen && \"rotate-180\")} />\n Royalty & advanced\n </button>\n </CollapsibleTrigger>\n <CollapsibleContent className=\"pt-3 space-y-3\">\n <div className=\"space-y-1.5\">\n <Label className=\"flex items-center gap-1.5\"><Percent className=\"h-3.5 w-3.5\" />Royalty %</Label>\n <Input type=\"number\" min=\"0\" max=\"50\" step=\"1\" placeholder=\"0\" value={royalty} onChange={(e) => setRoyalty(e.target.value)} />\n <p className=\"text-xs text-muted-foreground\">Percentage of future sales sent back to you (0–50%)</p>\n </div>\n </CollapsibleContent>\n </Collapsible>\n </Section>\n\n {formError && <p role=\"alert\" className=\"text-sm text-destructive\">{formError}</p>}\n\n <div className=\"btn-border-animated p-[1px] rounded-xl\">\n <button\n type=\"button\"\n disabled={tx.phase !== \"idle\"}\n onClick={handleSubmit}\n className=\"w-full h-12 rounded-[11px] flex items-center justify-center gap-2 text-base font-semibold text-white transition-all hover:brightness-110 active:scale-[0.98] bg-brand-rose disabled:opacity-50\"\n >\n <GitBranch className=\"h-5 w-5\" />\n Mint Remix\n </button>\n </div>\n <p className=\"text-xs text-center text-muted-foreground\">Two operations: IPFS metadata upload + on-chain mint. Gas is free.</p>\n </div>\n\n <div className=\"space-y-4 lg:sticky lg:top-16\">\n <div className=\"rounded-xl border border-border overflow-hidden bg-card\">\n <div className=\"relative aspect-square w-full bg-muted\">\n {originalImage && <Image src={originalImage} alt={originalName} fill unoptimized className=\"object-cover\" />}\n <div className=\"absolute top-2 left-2\">\n <Badge variant=\"secondary\" className=\"text-2xs gap-1\"><GitBranch className=\"h-3 w-3\" />Original</Badge>\n </div>\n </div>\n <div className=\"p-4 space-y-3\">\n <div>\n <p className=\"font-semibold truncate\">{originalName}</p>\n {token.metadata?.description && <p className=\"text-xs text-muted-foreground line-clamp-2 mt-0.5\">{token.metadata.description}</p>}\n </div>\n {(attr(\"License\") || attr(\"Commercial Use\") || attr(\"Derivatives\")) && (\n <div className=\"rounded-lg bg-muted/40 p-3 space-y-1.5 text-xs\">\n <p className=\"text-2xs font-semibold text-muted-foreground\">Original License</p>\n {attr(\"License\") && <div className=\"flex justify-between\"><span className=\"text-muted-foreground\">License</span><span className=\"font-medium\">{attr(\"License\")}</span></div>}\n {attr(\"Commercial Use\") && <div className=\"flex justify-between\"><span className=\"text-muted-foreground\">Commercial</span><span className=\"font-medium\">{attr(\"Commercial Use\")}</span></div>}\n {attr(\"Derivatives\") && <div className=\"flex justify-between\"><span className=\"text-muted-foreground\">Derivatives</span><span className=\"font-medium\">{attr(\"Derivatives\")}</span></div>}\n </div>\n )}\n </div>\n </div>\n <div className=\"rounded-xl border border-primary/20 bg-primary/5 p-4 space-y-3 text-sm\">\n <p className=\"font-semibold flex items-center gap-2\"><Info className=\"h-4 w-4 text-primary\" />What happens next</p>\n <ol className=\"space-y-2 text-muted-foreground text-xs list-decimal list-inside\">\n <li>Your artwork and metadata are uploaded to IPFS</li>\n <li>A new NFT is minted in the selected collection</li>\n <li>Parent attribution is embedded on-chain permanently</li>\n </ol>\n </div>\n </div>\n </div>\n </div>\n </WalletRequired>\n );\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/launchpad/remix-mint.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { Boxes, ChevronDown, ChevronLeft, GitBranch, ImagePlus, Info, Percent, Plus, Shield, Upload } from \"lucide-react\";\nimport { assetHref, getDerivativesTerm, getService, normalizeAddress, resolveRemixPolicy } from \"@medialane/sdk\";\nimport { acceptFor, uploadError } from \"../../utils/upload-limits.js\";\nimport { assertTransactionSucceeded, mintedTokenIdFromReceipt } from \"@medialane/sdk/starknet\";\nimport Image from \"../image.js\";\nimport Link from \"../link.js\";\nimport { useRouter } from \"../router.js\";\nimport { Badge } from \"../badge.js\";\nimport { Button } from \"../button.js\";\nimport { Input } from \"../input.js\";\nimport { Label } from \"../label.js\";\nimport { Skeleton } from \"../skeleton.js\";\nimport { Textarea } from \"../textarea.js\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../select.js\";\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"../collapsible.js\";\nimport { Section, ToggleGroup } from \"../create-form-primitives.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 { IP_TYPES, LICENSE_TYPES } from \"../../data/ip.js\";\nimport { cn } from \"../../utils/cn.js\";\nimport { pinAssetMetadata, uploadJsonToIpfs } from \"../../utils/ipfs-upload.js\";\nimport { runIntentCalls } from \"../../utils/run-intent-calls.js\";\nimport { checkIsOwner } from \"../../utils/ownership.js\";\nimport { useCollection, useCollectionsByOwner } from \"../../utils/use-collections.js\";\nimport { useToken, useTokenBalance } from \"../../utils/use-tokens.js\";\nimport { useImageUrl } from \"../../utils/use-image-url.js\";\nimport { useTransaction } from \"../../utils/use-transaction.js\";\nimport { invalidatePortfolioCache } from \"../../utils/portfolio-cache.js\";\n\nexport function RemixMint({ contract, tokenId }: { contract: string; tokenId: string }) {\n const app = useMedialaneApp();\n const router = useRouter();\n const resolveImage = useImageUrl();\n const walletAddress = app.walletAddress;\n const tx = useTransaction();\n const { token, isLoading: tokenLoading } = useToken(contract, tokenId);\n const { collection: parentCollection } = useCollection(contract);\n const { collections: allCollections, isLoading: collectionsLoading } = useCollectionsByOwner(walletAddress ?? null);\n const eligibleCollections = allCollections.filter(\n (c) => getService(c.service)?.id === \"mip-erc1155\" || (getService(c.service)?.id === \"mip-erc721\" && c.collectionId != null),\n );\n const { amount: walletBalance } = useTokenBalance(contract, tokenId, walletAddress);\n const viewerIsOwner = checkIsOwner(token, walletAddress, walletBalance);\n\n const originalName = token?.metadata?.name ?? `Token #${tokenId}`;\n const originalImage = resolveImage(token?.metadata?.image);\n const originalAttributes = Array.isArray(token?.metadata?.attributes)\n ? (token!.metadata!.attributes as { trait_type?: string; value?: string }[])\n : [];\n const attr = (t: string) => originalAttributes.find((a) => a.trait_type === t)?.value;\n\n const remixPolicy = resolveRemixPolicy({\n parentNoDerivatives: getDerivativesTerm(originalAttributes) === \"Not Allowed\",\n viewerIsParentOwner: viewerIsOwner,\n dealAvailable: !!getService(parentCollection?.service),\n });\n\n const [imageFile, setImageFile] = useState<File | null>(null);\n const [imagePreview, setImagePreview] = useState<string | null>(null);\n const [name, setName] = useState(\"\");\n const [description, setDescription] = useState(\"\");\n const [collectionKey, setCollectionKey] = useState(\"\");\n const [ipType, setIpType] = useState<string>(\"Art\");\n const [licenseType, setLicenseType] = useState(\"CC BY\");\n const [commercial, setCommercial] = useState(false);\n const [derivatives, setDerivatives] = useState(true);\n const [royalty, setRoyalty] = useState(\"\");\n const [advancedOpen, setAdvancedOpen] = useState(false);\n const [formError, setFormError] = useState<string | null>(null);\n const [remixHref, setRemixHref] = useState<string | null>(null);\n const previewUrlRef = useRef<string | null>(null);\n const fileInputRef = useRef<HTMLInputElement | null>(null);\n\n useEffect(() => {\n if (token && !name) setName(`Remix of ${originalName}`);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- runs once when the token loads; name is guarded by the check above\n }, [token]);\n\n const getCollectionKey = (c: (typeof eligibleCollections)[number]) => c.collectionId ?? c.contractAddress;\n\n useEffect(() => {\n if (eligibleCollections.length > 0 && !collectionKey) {\n const match = eligibleCollections.find((c) => normalizeAddress(\"STARKNET\", c.contractAddress) === normalizeAddress(\"STARKNET\", contract));\n setCollectionKey(getCollectionKey(match ?? eligibleCollections[0]!));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- runs once when the eligible collections first load\n }, [eligibleCollections.length]);\n\n useEffect(() => {\n return () => {\n if (previewUrlRef.current) URL.revokeObjectURL(previewUrlRef.current);\n };\n }, []);\n\n const redirected = useRef(false);\n useEffect(() => {\n if (!token || remixPolicy.canRemixDirect || redirected.current) return;\n redirected.current = true;\n router.replace(assetHref(\"STARKNET\", contract, tokenId));\n }, [token, remixPolicy.canRemixDirect, router, contract, tokenId]);\n\n const handleLicenseChange = (value: string) => {\n setLicenseType(value);\n const preset = LICENSE_TYPES.find((l) => l.value === value);\n if (preset) {\n setCommercial(preset.commercialUse === \"Yes\");\n setDerivatives(preset.derivatives !== \"Not Allowed\");\n }\n };\n\n const handleImageChange = (file: File) => {\n const fileError = uploadError(file, \"image\");\n if (fileError) {\n setFormError(fileError);\n return;\n }\n setFormError(null);\n if (previewUrlRef.current) URL.revokeObjectURL(previewUrlRef.current);\n const url = URL.createObjectURL(file);\n previewUrlRef.current = url;\n setImageFile(file);\n setImagePreview(url);\n };\n\n const handleSubmit = () => {\n if (!name.trim()) return setFormError(\"Remix name is required\");\n if (!collectionKey) return setFormError(\"Select a collection\");\n if (!walletAddress) return;\n setFormError(null);\n void tx.run(async (signer) => {\n await app.ensureSignedIn?.();\n const client = app.getClient();\n const api = client.api;\n const selected = eligibleCollections.find((c) => getCollectionKey(c) === collectionKey);\n if (!selected) throw new Error(\"Collection not found\");\n\n let tokenUri: string;\n if (imageFile) {\n tokenUri = (\n await pinAssetMetadata(api, {\n imageFile,\n name: name.trim(),\n description: description.trim() || `Remix of ${originalName}`,\n creator: walletAddress,\n ipType,\n licenseType,\n commercialUse: commercial ? \"Yes\" : \"No\",\n derivatives: derivatives ? \"Allowed\" : \"Not Allowed\",\n attribution: \"Required\",\n geographicScope: \"Worldwide\",\n aiPolicy: \"Not Allowed\",\n royalty: royalty || \"0\",\n templateTraits: [\n { traitType: \"Parent Contract\", value: contract },\n { traitType: \"Parent Token ID\", value: tokenId },\n ],\n })\n ).uri;\n } else {\n tokenUri = await uploadJsonToIpfs(api, {\n name: name.trim(),\n description: description.trim() || `Remix of ${originalName}`,\n image: token?.metadata?.image ?? \"\",\n attributes: [\n { trait_type: \"Parent Contract\", value: contract },\n { trait_type: \"Parent Token ID\", value: tokenId },\n { trait_type: \"Remix Type\", value: \"Derivative\" },\n { trait_type: \"IP Type\", value: ipType },\n { trait_type: \"License\", value: licenseType },\n { trait_type: \"Commercial Use\", value: commercial ? \"Yes\" : \"No\" },\n { trait_type: \"Derivatives\", value: derivatives ? \"Allowed\" : \"Not Allowed\" },\n ...(royalty ? [{ trait_type: \"Royalty\", value: `${royalty}%` }] : []),\n { trait_type: \"Creator\", value: walletAddress },\n ],\n });\n }\n\n const { txHash } = await runIntentCalls(signer, () =>\n api.intents.create(\n \"mint\",\n selected.standard === \"ERC1155\"\n ? { owner: walletAddress, recipient: walletAddress, collectionContract: selected.contractAddress, tokenUri, value: \"1\" }\n : { owner: walletAddress, collectionId: selected.collectionId!, recipient: walletAddress, tokenUri, royaltyBps: 0 },\n ),\n );\n const receipt = await assertTransactionSucceeded(client.provider, txHash);\n const remixTokenId = mintedTokenIdFromReceipt(receipt, selected.contractAddress);\n if (!remixTokenId) throw new Error(\"Minted, but could not read the new token id from the receipt\");\n await api.remix.confirmSelf({\n originalContract: contract,\n originalTokenId: tokenId,\n remixContract: selected.contractAddress,\n remixTokenId,\n txHash,\n licenseType,\n commercial,\n derivatives,\n });\n setRemixHref(assetHref(\"STARKNET\", selected.contractAddress, remixTokenId));\n invalidatePortfolioCache(walletAddress);\n });\n };\n\n const handleAgain = () => {\n tx.reset();\n setRemixHref(null);\n };\n\n const gate = { icon: GitBranch, title: \"Connect to create a remix\", description: \"Connect to mint a derivative of this asset.\" };\n\n if (tokenLoading) {\n return (\n <WalletRequired {...gate}>\n <div className=\"max-w-5xl mx-auto px-4 pt-14 pb-8 space-y-6\">\n <Skeleton className=\"h-8 w-48\" />\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_340px] gap-8\">\n <div className=\"space-y-4\">{[1, 2, 3, 4].map((i) => <Skeleton key={i} className=\"h-32 w-full rounded-xl\" />)}</div>\n <Skeleton className=\"h-80 w-full rounded-xl\" />\n </div>\n </div>\n </WalletRequired>\n );\n }\n\n if (!token) {\n return (\n <div className=\"max-w-5xl mx-auto px-4 py-24 text-center space-y-4\">\n <p className=\"text-2xl font-bold\">Asset not found</p>\n <Button asChild variant=\"outline\"><Link href=\"/\">Go home</Link></Button>\n </div>\n );\n }\n\n return (\n <WalletRequired {...gate}>\n <TransactionDialog tx={tx} title=\"Mint a remix\" workingLabel=\"Minting your remix…\" firstStepLabel=\"Upload to IPFS\">\n <TransactionSuccess\n name={name}\n image={imagePreview ?? originalImage ?? null}\n title=\"Remix minted\"\n description=\"It is registered as a remix of the original asset and carries its own license terms.\"\n actions={[\n ...(remixHref ? [{ href: remixHref, label: \"View remix\" }] : []),\n { href: \"/portfolio/assets\", label: \"View portfolio\" },\n { label: \"Close\", onClick: handleAgain },\n ]}\n >\n <RewardEarned actionType=\"mint_asset\" />\n </TransactionSuccess>\n </TransactionDialog>\n\n <div className=\"max-w-5xl mx-auto px-4 pt-14 pb-12 space-y-6\">\n <div className=\"space-y-3\">\n <Link href={assetHref(\"STARKNET\", contract, tokenId)} className=\"inline-flex items-center gap-1.5 text-sm text-muted-foreground hover:text-foreground transition-colors\">\n <ChevronLeft className=\"h-4 w-4\" />\n Back to asset\n </Link>\n <div className=\"flex items-center gap-2 text-primary\">\n <GitBranch className=\"h-5 w-5\" />\n <span className=\"text-sm font-semibold\">Create Remix</span>\n </div>\n <h1 className=\"text-3xl font-bold\">Mint a Remix</h1>\n <p className=\"text-muted-foreground max-w-xl\">Mint a derivative work based on this asset. The parent attribution is embedded in the IPFS metadata.</p>\n </div>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_320px] gap-8 items-start\">\n <div className=\"space-y-4\">\n <Section title=\"Remix Artwork\" icon={<ImagePlus className=\"h-4 w-4\" />}>\n <div\n className={cn(\"relative group rounded-xl border-2 border-dashed border-border transition-colors cursor-pointer overflow-hidden\", \"hover:border-primary/50 hover:bg-muted/30\")}\n onClick={() => fileInputRef.current?.click()}\n >\n <input ref={fileInputRef} type=\"file\" accept={acceptFor(\"image\")} className=\"hidden\" onChange={(e) => { const f = e.target.files?.[0]; if (f) handleImageChange(f); }} />\n {imagePreview ? (\n <div className=\"relative aspect-square w-full\">\n <Image src={imagePreview} alt=\"Remix preview\" fill unoptimized className=\"object-cover\" />\n <div className=\"absolute inset-0 bg-black/50 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center\">\n <p className=\"text-white text-sm font-medium flex items-center gap-2\"><Upload className=\"h-4 w-4\" /> Change image</p>\n </div>\n </div>\n ) : (\n <div className=\"aspect-square flex flex-col items-center justify-center gap-3 text-muted-foreground p-8\">\n {originalImage && (\n <div className=\"relative h-20 w-20 rounded-xl overflow-hidden opacity-40 mb-1 ring-2 ring-border\">\n <Image src={originalImage} alt=\"\" fill unoptimized className=\"object-cover\" />\n </div>\n )}\n <Upload className=\"h-8 w-8\" />\n <div className=\"text-center\">\n <p className=\"text-sm font-medium\">Upload remix artwork</p>\n <p className=\"text-xs mt-0.5\">{originalImage ? \"Leave empty to inherit original artwork\" : \"PNG, JPG, GIF, WebP up to 10MB\"}</p>\n </div>\n </div>\n )}\n </div>\n </Section>\n\n <Section title=\"Remix Details\" icon={<GitBranch className=\"h-4 w-4\" />}>\n <div className=\"space-y-1.5\">\n <Label>Remix Name *</Label>\n <Input value={name} onChange={(e) => setName(e.target.value)} placeholder={`Remix of ${originalName}`} />\n </div>\n <div className=\"space-y-1.5\">\n <Label>Description</Label>\n <Textarea value={description} onChange={(e) => setDescription(e.target.value)} placeholder=\"Describe your remix, the creative changes you're making, or your vision for it…\" rows={3} className=\"resize-none\" />\n </div>\n </Section>\n\n <Section title=\"Collection\" icon={<Boxes className=\"h-4 w-4\" />}>\n {collectionsLoading ? (\n <Skeleton className=\"h-10 w-full rounded-md\" />\n ) : eligibleCollections.length === 0 ? (\n <div className=\"rounded-lg border border-dashed border-border p-4 text-center space-y-2\">\n <p className=\"text-sm text-muted-foreground\">No eligible collections. Create one first.</p>\n <Button size=\"sm\" variant=\"outline\" asChild>\n <Link href=\"/launchpad/single-editions/collection\"><Plus className=\"h-3.5 w-3.5 mr-1.5\" />Create collection</Link>\n </Button>\n </div>\n ) : (\n <Select value={collectionKey} onValueChange={setCollectionKey}>\n <SelectTrigger><SelectValue placeholder=\"Select a collection\" /></SelectTrigger>\n <SelectContent>\n {eligibleCollections.map((c) => (\n <SelectItem key={getCollectionKey(c)} value={getCollectionKey(c)}>\n <span className=\"flex items-center gap-2\">\n {c.name ?? c.contractAddress.slice(0, 14) + \"…\"}\n {c.standard && <span className=\"text-2xs tabular-nums text-muted-foreground\">{c.standard}</span>}\n </span>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n </Section>\n\n <Section title=\"IP Type\" icon={<Info className=\"h-4 w-4\" />}>\n <Select value={ipType} onValueChange={setIpType}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>{IP_TYPES.map((t) => <SelectItem key={t} value={t}>{t}</SelectItem>)}</SelectContent>\n </Select>\n </Section>\n\n <Section title=\"License Terms\" icon={<Shield className=\"h-4 w-4\" />}>\n <div className=\"space-y-1.5\">\n <Label>License Type</Label>\n <Select value={licenseType} onValueChange={handleLicenseChange}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>{LICENSE_TYPES.map((l) => <SelectItem key={l.value} value={l.value}>{l.value}</SelectItem>)}</SelectContent>\n </Select>\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs text-muted-foreground uppercase tracking-wide\">Commercial Use</Label>\n <ToggleGroup value={commercial ? \"Yes\" : \"No\"} options={[\"Yes\", \"No\"]} onChange={(v) => setCommercial(v === \"Yes\")} />\n </div>\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs text-muted-foreground uppercase tracking-wide\">Derivatives</Label>\n <ToggleGroup value={derivatives ? \"Allowed\" : \"Not Allowed\"} options={[\"Allowed\", \"Not Allowed\"]} onChange={(v) => setDerivatives(v === \"Allowed\")} />\n </div>\n </div>\n <Collapsible open={advancedOpen} onOpenChange={setAdvancedOpen}>\n <CollapsibleTrigger asChild>\n <button type=\"button\" className=\"flex items-center gap-1.5 text-xs text-muted-foreground hover:text-foreground transition-colors\">\n <ChevronDown className={cn(\"h-3.5 w-3.5 transition-transform\", advancedOpen && \"rotate-180\")} />\n Royalty & advanced\n </button>\n </CollapsibleTrigger>\n <CollapsibleContent className=\"pt-3 space-y-3\">\n <div className=\"space-y-1.5\">\n <Label className=\"flex items-center gap-1.5\"><Percent className=\"h-3.5 w-3.5\" />Royalty %</Label>\n <Input type=\"number\" min=\"0\" max=\"50\" step=\"1\" placeholder=\"0\" value={royalty} onChange={(e) => setRoyalty(e.target.value)} />\n <p className=\"text-xs text-muted-foreground\">Percentage of future sales sent back to you (0–50%)</p>\n </div>\n </CollapsibleContent>\n </Collapsible>\n </Section>\n\n {formError && <p role=\"alert\" className=\"text-sm text-destructive\">{formError}</p>}\n\n <div className=\"btn-border-animated p-[1px] rounded-xl\">\n <button\n type=\"button\"\n disabled={tx.phase !== \"idle\"}\n onClick={handleSubmit}\n className=\"w-full h-12 rounded-[11px] flex items-center justify-center gap-2 text-base font-semibold text-white transition-all hover:brightness-110 active:scale-[0.98] bg-brand-rose disabled:opacity-50\"\n >\n <GitBranch className=\"h-5 w-5\" />\n Mint Remix\n </button>\n </div>\n <p className=\"text-xs text-center text-muted-foreground\">Two operations: IPFS metadata upload + on-chain mint. Gas is free.</p>\n </div>\n\n <div className=\"space-y-4 lg:sticky lg:top-16\">\n <div className=\"rounded-xl border border-border overflow-hidden bg-card\">\n <div className=\"relative aspect-square w-full bg-muted\">\n {originalImage && <Image src={originalImage} alt={originalName} fill unoptimized className=\"object-cover\" />}\n <div className=\"absolute top-2 left-2\">\n <Badge variant=\"secondary\" className=\"text-2xs gap-1\"><GitBranch className=\"h-3 w-3\" />Original</Badge>\n </div>\n </div>\n <div className=\"p-4 space-y-3\">\n <div>\n <p className=\"font-semibold truncate\">{originalName}</p>\n {token.metadata?.description && <p className=\"text-xs text-muted-foreground line-clamp-2 mt-0.5\">{token.metadata.description}</p>}\n </div>\n {(attr(\"License\") || attr(\"Commercial Use\") || attr(\"Derivatives\")) && (\n <div className=\"rounded-lg bg-muted/40 p-3 space-y-1.5 text-xs\">\n <p className=\"text-2xs font-semibold text-muted-foreground\">Original License</p>\n {attr(\"License\") && <div className=\"flex justify-between\"><span className=\"text-muted-foreground\">License</span><span className=\"font-medium\">{attr(\"License\")}</span></div>}\n {attr(\"Commercial Use\") && <div className=\"flex justify-between\"><span className=\"text-muted-foreground\">Commercial</span><span className=\"font-medium\">{attr(\"Commercial Use\")}</span></div>}\n {attr(\"Derivatives\") && <div className=\"flex justify-between\"><span className=\"text-muted-foreground\">Derivatives</span><span className=\"font-medium\">{attr(\"Derivatives\")}</span></div>}\n </div>\n )}\n </div>\n </div>\n <div className=\"rounded-xl border border-primary/20 bg-primary/5 p-4 space-y-3 text-sm\">\n <p className=\"font-semibold flex items-center gap-2\"><Info className=\"h-4 w-4 text-primary\" />What happens next</p>\n <ol className=\"space-y-2 text-muted-foreground text-xs list-decimal list-inside\">\n <li>Your artwork and metadata are uploaded to IPFS</li>\n <li>A new NFT is minted in the selected collection</li>\n <li>Parent attribution is embedded on-chain permanently</li>\n </ol>\n </div>\n </div>\n </div>\n </div>\n </WalletRequired>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -52,7 +52,7 @@ var import_form = require("../form.js");
|
|
|
52
52
|
var import_create_form_primitives = require("../create-form-primitives.js");
|
|
53
53
|
var import_ip_type_fields = require("../ip-type-fields.js");
|
|
54
54
|
var import_claim_route_shell = require("../claim-route-shell.js");
|
|
55
|
-
var
|
|
55
|
+
var import_transaction_success = require("../transaction-success.js");
|
|
56
56
|
var import_medialane_collection_card = require("../medialane-collection-card.js");
|
|
57
57
|
var import_transaction_dialog = require("../transaction-dialog.js");
|
|
58
58
|
var import_wallet_required = require("../wallet-required.js");
|
|
@@ -194,15 +194,17 @@ function SingleEditionMint({ aside }) {
|
|
|
194
194
|
description: "Publish your creative work as a single-copy NFT in a collection you own.",
|
|
195
195
|
children: [
|
|
196
196
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_transaction_dialog.TransactionDialog, { tx, title: "Mint NFT", workingLabel: "Minting your work\u2026", firstStepLabel: "Upload to IPFS", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
197
|
-
|
|
197
|
+
import_transaction_success.TransactionSuccess,
|
|
198
198
|
{
|
|
199
199
|
name: form.getValues("name") || "Your asset",
|
|
200
200
|
image: imagePreview,
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
201
|
+
title: "Asset minted",
|
|
202
|
+
description: "Your wallet is the owner. The license terms and royalty are recorded in its metadata.",
|
|
203
|
+
actions: [
|
|
204
|
+
...mintedHref ? [{ href: mintedHref, label: "View asset" }] : [],
|
|
205
|
+
{ href: "/portfolio/assets", label: "View portfolio" },
|
|
206
|
+
{ label: "Mint another", onClick: handleAgain }
|
|
207
|
+
],
|
|
206
208
|
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_reward_earned.RewardEarned, { actionType: "mint_asset" })
|
|
207
209
|
}
|
|
208
210
|
) }),
|