@medialane/ui 0.313.0 → 0.314.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/approve-mint-dialog.cjs +1 -1
- package/dist/components/approve-mint-dialog.cjs.map +1 -1
- package/dist/components/approve-mint-dialog.js +1 -1
- package/dist/components/approve-mint-dialog.js.map +1 -1
- package/dist/components/asset-marketplace-panel.cjs +1 -1
- package/dist/components/asset-marketplace-panel.cjs.map +1 -1
- package/dist/components/asset-marketplace-panel.js +1 -1
- package/dist/components/asset-marketplace-panel.js.map +1 -1
- package/dist/components/fast-mint/success-view.cjs +1 -1
- package/dist/components/fast-mint/success-view.cjs.map +1 -1
- package/dist/components/fast-mint/success-view.js +1 -1
- package/dist/components/fast-mint/success-view.js.map +1 -1
- package/dist/components/home-page.cjs +1 -1
- package/dist/components/home-page.cjs.map +1 -1
- package/dist/components/home-page.js +1 -1
- package/dist/components/home-page.js.map +1 -1
- package/dist/components/launchpad/tier-mint-presets.cjs +3 -3
- package/dist/components/launchpad/tier-mint-presets.cjs.map +1 -1
- package/dist/components/launchpad/tier-mint-presets.js +3 -3
- package/dist/components/launchpad/tier-mint-presets.js.map +1 -1
- package/dist/components/listings-grid.cjs +1 -1
- package/dist/components/listings-grid.cjs.map +1 -1
- package/dist/components/listings-grid.js +1 -1
- package/dist/components/listings-grid.js.map +1 -1
- package/dist/components/portfolio-orders.cjs +1 -1
- package/dist/components/portfolio-orders.cjs.map +1 -1
- package/dist/components/portfolio-orders.js +1 -1
- package/dist/components/portfolio-orders.js.map +1 -1
- package/dist/components/rewards/rewards-dashboard.cjs +2 -2
- package/dist/components/rewards/rewards-dashboard.cjs.map +1 -1
- package/dist/components/rewards/rewards-dashboard.js +2 -2
- package/dist/components/rewards/rewards-dashboard.js.map +1 -1
- package/dist/components/route-error.cjs +2 -6
- package/dist/components/route-error.cjs.map +1 -1
- package/dist/components/route-error.d.cts +1 -2
- package/dist/components/route-error.d.ts +1 -2
- package/dist/components/route-error.js +2 -6
- package/dist/components/route-error.js.map +1 -1
- package/package.json +1 -1
|
@@ -65,7 +65,7 @@ function ApproveMintDialog({ offer, open, onOpenChange, collections, footerNote,
|
|
|
65
65
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.GitBranch, { className: "h-4 w-4 text-primary shrink-0" }),
|
|
66
66
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dialog.DialogTitle, { className: "text-base font-bold", children: "Grant license & mint" })
|
|
67
67
|
] }),
|
|
68
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dialog.DialogDescription, { className: "sr-only", children: "Mint the derivative into one of your collections and
|
|
68
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dialog.DialogDescription, { className: "sr-only", children: "Mint the derivative into one of your collections and sell it to the requester." }),
|
|
69
69
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
70
70
|
import_transaction_dialog_states.TransactionDialogStates,
|
|
71
71
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/approve-mint-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { AlertCircle, GitBranch, Loader2 } from \"lucide-react\";\nimport type { ApiCollection, ApiRemixOffer } from \"@medialane/sdk\";\nimport { Dialog, DialogContent, DialogDescription, DialogTitle } from \"./dialog.js\";\nimport { Input } from \"./input.js\";\nimport { Label } from \"./label.js\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"./select.js\";\nimport { Alert, AlertDescription } from \"./alert.js\";\nimport { TransactionDialogStates } from \"./transaction-dialog-states.js\";\nimport { isBusyPhase, type TransactionPhase } from \"../utils/use-transaction.js\";\nimport { formatDisplayPrice } from \"../utils/format.js\";\nimport { successMessages } from \"../utils/success-messages.js\";\n\nexport interface ApproveMintDialogProps {\n offer: ApiRemixOffer | null;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n collections: ApiCollection[];\n footerNote: string;\n newAssetHref?: string | null;\n tx: {\n phase: TransactionPhase;\n txHash: string | null;\n error: string | null;\n retryable?: boolean;\n reset: () => void;\n };\n onApprove: (collection: ApiCollection, name: string) => void;\n}\n\nconst keyOf = (c: ApiCollection) => c.collectionId ?? c.contractAddress;\n\nexport function ApproveMintDialog({ offer, open, onOpenChange, collections, footerNote, newAssetHref, tx, onApprove }: ApproveMintDialogProps) {\n const { phase, txHash, error, retryable = true, reset } = tx;\n const busy = isBusyPhase(phase);\n const [selectedKey, setSelectedKey] = useState<string | null>(null);\n const [remixName, setRemixName] = useState(\"\");\n\n const defaultCollection = collections.find((c) => c.contractAddress === offer?.originalContract) ?? collections[0];\n const effectiveKey = selectedKey ?? (defaultCollection ? keyOf(defaultCollection) : null);\n const selected = collections.find((c) => keyOf(c) === effectiveKey);\n const effectiveName = remixName.trim() || `Remix of Token #${offer?.originalTokenId}`;\n const priceDisplay = offer?.price ? `${formatDisplayPrice(offer.price.formatted)} ${offer.price.currency}` : \"—\";\n\n const clear = () => {\n setSelectedKey(null);\n setRemixName(\"\");\n reset();\n };\n\n useEffect(() => {\n if (open) clear();\n }, [open]);\n\n const close = () => {\n clear();\n onOpenChange(false);\n };\n\n const handleOpenChange = (value: boolean) => {\n if (!value && !busy) close();\n };\n\n return (\n <Dialog open={open} onOpenChange={handleOpenChange}>\n <DialogContent className=\"w-full max-w-sm p-0 overflow-hidden gap-0 flex flex-col max-h-[90svh]\">\n <div className=\"flex items-center gap-2 pr-10 pl-5 py-4 border-b border-border/60\">\n <GitBranch className=\"h-4 w-4 text-primary shrink-0\" />\n <DialogTitle className=\"text-base font-bold\">Grant license & mint</DialogTitle>\n </div>\n <DialogDescription className=\"sr-only\">Mint the derivative into one of your collections and list it for the requester.</DialogDescription>\n\n <TransactionDialogStates\n phase={phase}\n asset={{ name: effectiveName }}\n statusMessage=\"Minting and listing…\"\n txHash={txHash}\n error={error}\n success={successMessages.licenseGranted({ price: priceDisplay })}\n successActions={[\n { label: \"Done\", onClick: close },\n ...(newAssetHref ? [{ label: \"View new asset\", href: newAssetHref }] : []),\n ]}\n errorTitle=\"Minting failed\"\n errorDescription=\"The transaction was submitted, but the remix could not be completed.\"\n onRetry={retryable ? reset : undefined}\n onDone={close}\n >\n <div className=\"flex-1 overflow-y-auto px-5 py-4 space-y-5\">\n {error && (\n <Alert variant=\"destructive\">\n <AlertCircle className=\"h-4 w-4\" />\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n )}\n {offer && (\n <div className=\"rounded-xl border border-border bg-muted/30 p-3 text-sm space-y-1\">\n <p><span className=\"text-muted-foreground\">License</span> {offer.licenseType}</p>\n <p><span className=\"text-muted-foreground\">Price</span> {priceDisplay}</p>\n {offer.message && <p className=\"text-muted-foreground italic\">"{offer.message}"</p>}\n </div>\n )}\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"remix-name\">Remix Name</Label>\n <Input id=\"remix-name\" placeholder={effectiveName} value={remixName} onChange={(e) => setRemixName(e.target.value)} />\n </div>\n\n <div className=\"space-y-1.5\">\n <Label>Mint into collection</Label>\n {collections.length === 0 ? (\n <p className=\"text-xs text-destructive\">No eligible collections.</p>\n ) : (\n <Select value={effectiveKey ?? \"\"} onValueChange={setSelectedKey}>\n <SelectTrigger>\n <SelectValue placeholder=\"Select collection\" />\n </SelectTrigger>\n <SelectContent>\n {collections.map((c) => (\n <SelectItem key={keyOf(c)} value={keyOf(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 </div>\n </div>\n\n <div className=\"px-5 pt-3 pb-5 border-t border-border/60 space-y-3\">\n <button\n className=\"w-full h-11 rounded-[11px] bg-brand-purple text-white text-sm font-semibold flex items-center justify-center gap-2 hover:brightness-110 active:scale-[0.98] transition-all disabled:opacity-50\"\n onClick={() => { if (selected) onApprove(selected, effectiveName); }}\n disabled={busy || !selected}\n >\n {busy ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <GitBranch className=\"h-4 w-4\" />}\n Grant license & mint\n </button>\n <p className=\"text-2xs text-center text-muted-foreground\">{footerNote}</p>\n </div>\n </TransactionDialogStates>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/components/approve-mint-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { AlertCircle, GitBranch, Loader2 } from \"lucide-react\";\nimport type { ApiCollection, ApiRemixOffer } from \"@medialane/sdk\";\nimport { Dialog, DialogContent, DialogDescription, DialogTitle } from \"./dialog.js\";\nimport { Input } from \"./input.js\";\nimport { Label } from \"./label.js\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"./select.js\";\nimport { Alert, AlertDescription } from \"./alert.js\";\nimport { TransactionDialogStates } from \"./transaction-dialog-states.js\";\nimport { isBusyPhase, type TransactionPhase } from \"../utils/use-transaction.js\";\nimport { formatDisplayPrice } from \"../utils/format.js\";\nimport { successMessages } from \"../utils/success-messages.js\";\n\nexport interface ApproveMintDialogProps {\n offer: ApiRemixOffer | null;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n collections: ApiCollection[];\n footerNote: string;\n newAssetHref?: string | null;\n tx: {\n phase: TransactionPhase;\n txHash: string | null;\n error: string | null;\n retryable?: boolean;\n reset: () => void;\n };\n onApprove: (collection: ApiCollection, name: string) => void;\n}\n\nconst keyOf = (c: ApiCollection) => c.collectionId ?? c.contractAddress;\n\nexport function ApproveMintDialog({ offer, open, onOpenChange, collections, footerNote, newAssetHref, tx, onApprove }: ApproveMintDialogProps) {\n const { phase, txHash, error, retryable = true, reset } = tx;\n const busy = isBusyPhase(phase);\n const [selectedKey, setSelectedKey] = useState<string | null>(null);\n const [remixName, setRemixName] = useState(\"\");\n\n const defaultCollection = collections.find((c) => c.contractAddress === offer?.originalContract) ?? collections[0];\n const effectiveKey = selectedKey ?? (defaultCollection ? keyOf(defaultCollection) : null);\n const selected = collections.find((c) => keyOf(c) === effectiveKey);\n const effectiveName = remixName.trim() || `Remix of Token #${offer?.originalTokenId}`;\n const priceDisplay = offer?.price ? `${formatDisplayPrice(offer.price.formatted)} ${offer.price.currency}` : \"—\";\n\n const clear = () => {\n setSelectedKey(null);\n setRemixName(\"\");\n reset();\n };\n\n useEffect(() => {\n if (open) clear();\n }, [open]);\n\n const close = () => {\n clear();\n onOpenChange(false);\n };\n\n const handleOpenChange = (value: boolean) => {\n if (!value && !busy) close();\n };\n\n return (\n <Dialog open={open} onOpenChange={handleOpenChange}>\n <DialogContent className=\"w-full max-w-sm p-0 overflow-hidden gap-0 flex flex-col max-h-[90svh]\">\n <div className=\"flex items-center gap-2 pr-10 pl-5 py-4 border-b border-border/60\">\n <GitBranch className=\"h-4 w-4 text-primary shrink-0\" />\n <DialogTitle className=\"text-base font-bold\">Grant license & mint</DialogTitle>\n </div>\n <DialogDescription className=\"sr-only\">Mint the derivative into one of your collections and sell it to the requester.</DialogDescription>\n\n <TransactionDialogStates\n phase={phase}\n asset={{ name: effectiveName }}\n statusMessage=\"Minting and listing…\"\n txHash={txHash}\n error={error}\n success={successMessages.licenseGranted({ price: priceDisplay })}\n successActions={[\n { label: \"Done\", onClick: close },\n ...(newAssetHref ? [{ label: \"View new asset\", href: newAssetHref }] : []),\n ]}\n errorTitle=\"Minting failed\"\n errorDescription=\"The transaction was submitted, but the remix could not be completed.\"\n onRetry={retryable ? reset : undefined}\n onDone={close}\n >\n <div className=\"flex-1 overflow-y-auto px-5 py-4 space-y-5\">\n {error && (\n <Alert variant=\"destructive\">\n <AlertCircle className=\"h-4 w-4\" />\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n )}\n {offer && (\n <div className=\"rounded-xl border border-border bg-muted/30 p-3 text-sm space-y-1\">\n <p><span className=\"text-muted-foreground\">License</span> {offer.licenseType}</p>\n <p><span className=\"text-muted-foreground\">Price</span> {priceDisplay}</p>\n {offer.message && <p className=\"text-muted-foreground italic\">"{offer.message}"</p>}\n </div>\n )}\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"remix-name\">Remix Name</Label>\n <Input id=\"remix-name\" placeholder={effectiveName} value={remixName} onChange={(e) => setRemixName(e.target.value)} />\n </div>\n\n <div className=\"space-y-1.5\">\n <Label>Mint into collection</Label>\n {collections.length === 0 ? (\n <p className=\"text-xs text-destructive\">No eligible collections.</p>\n ) : (\n <Select value={effectiveKey ?? \"\"} onValueChange={setSelectedKey}>\n <SelectTrigger>\n <SelectValue placeholder=\"Select collection\" />\n </SelectTrigger>\n <SelectContent>\n {collections.map((c) => (\n <SelectItem key={keyOf(c)} value={keyOf(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 </div>\n </div>\n\n <div className=\"px-5 pt-3 pb-5 border-t border-border/60 space-y-3\">\n <button\n className=\"w-full h-11 rounded-[11px] bg-brand-purple text-white text-sm font-semibold flex items-center justify-center gap-2 hover:brightness-110 active:scale-[0.98] transition-all disabled:opacity-50\"\n onClick={() => { if (selected) onApprove(selected, effectiveName); }}\n disabled={busy || !selected}\n >\n {busy ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <GitBranch className=\"h-4 w-4\" />}\n Grant license & mint\n </button>\n <p className=\"text-2xs text-center text-muted-foreground\">{footerNote}</p>\n </div>\n </TransactionDialogStates>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -42,7 +42,7 @@ function ApproveMintDialog({ offer, open, onOpenChange, collections, footerNote,
|
|
|
42
42
|
/* @__PURE__ */ jsx(GitBranch, { className: "h-4 w-4 text-primary shrink-0" }),
|
|
43
43
|
/* @__PURE__ */ jsx(DialogTitle, { className: "text-base font-bold", children: "Grant license & mint" })
|
|
44
44
|
] }),
|
|
45
|
-
/* @__PURE__ */ jsx(DialogDescription, { className: "sr-only", children: "Mint the derivative into one of your collections and
|
|
45
|
+
/* @__PURE__ */ jsx(DialogDescription, { className: "sr-only", children: "Mint the derivative into one of your collections and sell it to the requester." }),
|
|
46
46
|
/* @__PURE__ */ jsxs(
|
|
47
47
|
TransactionDialogStates,
|
|
48
48
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/approve-mint-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { AlertCircle, GitBranch, Loader2 } from \"lucide-react\";\nimport type { ApiCollection, ApiRemixOffer } from \"@medialane/sdk\";\nimport { Dialog, DialogContent, DialogDescription, DialogTitle } from \"./dialog.js\";\nimport { Input } from \"./input.js\";\nimport { Label } from \"./label.js\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"./select.js\";\nimport { Alert, AlertDescription } from \"./alert.js\";\nimport { TransactionDialogStates } from \"./transaction-dialog-states.js\";\nimport { isBusyPhase, type TransactionPhase } from \"../utils/use-transaction.js\";\nimport { formatDisplayPrice } from \"../utils/format.js\";\nimport { successMessages } from \"../utils/success-messages.js\";\n\nexport interface ApproveMintDialogProps {\n offer: ApiRemixOffer | null;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n collections: ApiCollection[];\n footerNote: string;\n newAssetHref?: string | null;\n tx: {\n phase: TransactionPhase;\n txHash: string | null;\n error: string | null;\n retryable?: boolean;\n reset: () => void;\n };\n onApprove: (collection: ApiCollection, name: string) => void;\n}\n\nconst keyOf = (c: ApiCollection) => c.collectionId ?? c.contractAddress;\n\nexport function ApproveMintDialog({ offer, open, onOpenChange, collections, footerNote, newAssetHref, tx, onApprove }: ApproveMintDialogProps) {\n const { phase, txHash, error, retryable = true, reset } = tx;\n const busy = isBusyPhase(phase);\n const [selectedKey, setSelectedKey] = useState<string | null>(null);\n const [remixName, setRemixName] = useState(\"\");\n\n const defaultCollection = collections.find((c) => c.contractAddress === offer?.originalContract) ?? collections[0];\n const effectiveKey = selectedKey ?? (defaultCollection ? keyOf(defaultCollection) : null);\n const selected = collections.find((c) => keyOf(c) === effectiveKey);\n const effectiveName = remixName.trim() || `Remix of Token #${offer?.originalTokenId}`;\n const priceDisplay = offer?.price ? `${formatDisplayPrice(offer.price.formatted)} ${offer.price.currency}` : \"—\";\n\n const clear = () => {\n setSelectedKey(null);\n setRemixName(\"\");\n reset();\n };\n\n useEffect(() => {\n if (open) clear();\n }, [open]);\n\n const close = () => {\n clear();\n onOpenChange(false);\n };\n\n const handleOpenChange = (value: boolean) => {\n if (!value && !busy) close();\n };\n\n return (\n <Dialog open={open} onOpenChange={handleOpenChange}>\n <DialogContent className=\"w-full max-w-sm p-0 overflow-hidden gap-0 flex flex-col max-h-[90svh]\">\n <div className=\"flex items-center gap-2 pr-10 pl-5 py-4 border-b border-border/60\">\n <GitBranch className=\"h-4 w-4 text-primary shrink-0\" />\n <DialogTitle className=\"text-base font-bold\">Grant license & mint</DialogTitle>\n </div>\n <DialogDescription className=\"sr-only\">Mint the derivative into one of your collections and list it for the requester.</DialogDescription>\n\n <TransactionDialogStates\n phase={phase}\n asset={{ name: effectiveName }}\n statusMessage=\"Minting and listing…\"\n txHash={txHash}\n error={error}\n success={successMessages.licenseGranted({ price: priceDisplay })}\n successActions={[\n { label: \"Done\", onClick: close },\n ...(newAssetHref ? [{ label: \"View new asset\", href: newAssetHref }] : []),\n ]}\n errorTitle=\"Minting failed\"\n errorDescription=\"The transaction was submitted, but the remix could not be completed.\"\n onRetry={retryable ? reset : undefined}\n onDone={close}\n >\n <div className=\"flex-1 overflow-y-auto px-5 py-4 space-y-5\">\n {error && (\n <Alert variant=\"destructive\">\n <AlertCircle className=\"h-4 w-4\" />\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n )}\n {offer && (\n <div className=\"rounded-xl border border-border bg-muted/30 p-3 text-sm space-y-1\">\n <p><span className=\"text-muted-foreground\">License</span> {offer.licenseType}</p>\n <p><span className=\"text-muted-foreground\">Price</span> {priceDisplay}</p>\n {offer.message && <p className=\"text-muted-foreground italic\">"{offer.message}"</p>}\n </div>\n )}\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"remix-name\">Remix Name</Label>\n <Input id=\"remix-name\" placeholder={effectiveName} value={remixName} onChange={(e) => setRemixName(e.target.value)} />\n </div>\n\n <div className=\"space-y-1.5\">\n <Label>Mint into collection</Label>\n {collections.length === 0 ? (\n <p className=\"text-xs text-destructive\">No eligible collections.</p>\n ) : (\n <Select value={effectiveKey ?? \"\"} onValueChange={setSelectedKey}>\n <SelectTrigger>\n <SelectValue placeholder=\"Select collection\" />\n </SelectTrigger>\n <SelectContent>\n {collections.map((c) => (\n <SelectItem key={keyOf(c)} value={keyOf(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 </div>\n </div>\n\n <div className=\"px-5 pt-3 pb-5 border-t border-border/60 space-y-3\">\n <button\n className=\"w-full h-11 rounded-[11px] bg-brand-purple text-white text-sm font-semibold flex items-center justify-center gap-2 hover:brightness-110 active:scale-[0.98] transition-all disabled:opacity-50\"\n onClick={() => { if (selected) onApprove(selected, effectiveName); }}\n disabled={busy || !selected}\n >\n {busy ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <GitBranch className=\"h-4 w-4\" />}\n Grant license & mint\n </button>\n <p className=\"text-2xs text-center text-muted-foreground\">{footerNote}</p>\n </div>\n </TransactionDialogStates>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/components/approve-mint-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { AlertCircle, GitBranch, Loader2 } from \"lucide-react\";\nimport type { ApiCollection, ApiRemixOffer } from \"@medialane/sdk\";\nimport { Dialog, DialogContent, DialogDescription, DialogTitle } from \"./dialog.js\";\nimport { Input } from \"./input.js\";\nimport { Label } from \"./label.js\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"./select.js\";\nimport { Alert, AlertDescription } from \"./alert.js\";\nimport { TransactionDialogStates } from \"./transaction-dialog-states.js\";\nimport { isBusyPhase, type TransactionPhase } from \"../utils/use-transaction.js\";\nimport { formatDisplayPrice } from \"../utils/format.js\";\nimport { successMessages } from \"../utils/success-messages.js\";\n\nexport interface ApproveMintDialogProps {\n offer: ApiRemixOffer | null;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n collections: ApiCollection[];\n footerNote: string;\n newAssetHref?: string | null;\n tx: {\n phase: TransactionPhase;\n txHash: string | null;\n error: string | null;\n retryable?: boolean;\n reset: () => void;\n };\n onApprove: (collection: ApiCollection, name: string) => void;\n}\n\nconst keyOf = (c: ApiCollection) => c.collectionId ?? c.contractAddress;\n\nexport function ApproveMintDialog({ offer, open, onOpenChange, collections, footerNote, newAssetHref, tx, onApprove }: ApproveMintDialogProps) {\n const { phase, txHash, error, retryable = true, reset } = tx;\n const busy = isBusyPhase(phase);\n const [selectedKey, setSelectedKey] = useState<string | null>(null);\n const [remixName, setRemixName] = useState(\"\");\n\n const defaultCollection = collections.find((c) => c.contractAddress === offer?.originalContract) ?? collections[0];\n const effectiveKey = selectedKey ?? (defaultCollection ? keyOf(defaultCollection) : null);\n const selected = collections.find((c) => keyOf(c) === effectiveKey);\n const effectiveName = remixName.trim() || `Remix of Token #${offer?.originalTokenId}`;\n const priceDisplay = offer?.price ? `${formatDisplayPrice(offer.price.formatted)} ${offer.price.currency}` : \"—\";\n\n const clear = () => {\n setSelectedKey(null);\n setRemixName(\"\");\n reset();\n };\n\n useEffect(() => {\n if (open) clear();\n }, [open]);\n\n const close = () => {\n clear();\n onOpenChange(false);\n };\n\n const handleOpenChange = (value: boolean) => {\n if (!value && !busy) close();\n };\n\n return (\n <Dialog open={open} onOpenChange={handleOpenChange}>\n <DialogContent className=\"w-full max-w-sm p-0 overflow-hidden gap-0 flex flex-col max-h-[90svh]\">\n <div className=\"flex items-center gap-2 pr-10 pl-5 py-4 border-b border-border/60\">\n <GitBranch className=\"h-4 w-4 text-primary shrink-0\" />\n <DialogTitle className=\"text-base font-bold\">Grant license & mint</DialogTitle>\n </div>\n <DialogDescription className=\"sr-only\">Mint the derivative into one of your collections and sell it to the requester.</DialogDescription>\n\n <TransactionDialogStates\n phase={phase}\n asset={{ name: effectiveName }}\n statusMessage=\"Minting and listing…\"\n txHash={txHash}\n error={error}\n success={successMessages.licenseGranted({ price: priceDisplay })}\n successActions={[\n { label: \"Done\", onClick: close },\n ...(newAssetHref ? [{ label: \"View new asset\", href: newAssetHref }] : []),\n ]}\n errorTitle=\"Minting failed\"\n errorDescription=\"The transaction was submitted, but the remix could not be completed.\"\n onRetry={retryable ? reset : undefined}\n onDone={close}\n >\n <div className=\"flex-1 overflow-y-auto px-5 py-4 space-y-5\">\n {error && (\n <Alert variant=\"destructive\">\n <AlertCircle className=\"h-4 w-4\" />\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n )}\n {offer && (\n <div className=\"rounded-xl border border-border bg-muted/30 p-3 text-sm space-y-1\">\n <p><span className=\"text-muted-foreground\">License</span> {offer.licenseType}</p>\n <p><span className=\"text-muted-foreground\">Price</span> {priceDisplay}</p>\n {offer.message && <p className=\"text-muted-foreground italic\">"{offer.message}"</p>}\n </div>\n )}\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"remix-name\">Remix Name</Label>\n <Input id=\"remix-name\" placeholder={effectiveName} value={remixName} onChange={(e) => setRemixName(e.target.value)} />\n </div>\n\n <div className=\"space-y-1.5\">\n <Label>Mint into collection</Label>\n {collections.length === 0 ? (\n <p className=\"text-xs text-destructive\">No eligible collections.</p>\n ) : (\n <Select value={effectiveKey ?? \"\"} onValueChange={setSelectedKey}>\n <SelectTrigger>\n <SelectValue placeholder=\"Select collection\" />\n </SelectTrigger>\n <SelectContent>\n {collections.map((c) => (\n <SelectItem key={keyOf(c)} value={keyOf(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 </div>\n </div>\n\n <div className=\"px-5 pt-3 pb-5 border-t border-border/60 space-y-3\">\n <button\n className=\"w-full h-11 rounded-[11px] bg-brand-purple text-white text-sm font-semibold flex items-center justify-center gap-2 hover:brightness-110 active:scale-[0.98] transition-all disabled:opacity-50\"\n onClick={() => { if (selected) onApprove(selected, effectiveName); }}\n disabled={busy || !selected}\n >\n {busy ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <GitBranch className=\"h-4 w-4\" />}\n Grant license & mint\n </button>\n <p className=\"text-2xs text-center text-muted-foreground\">{footerNote}</p>\n </div>\n </TransactionDialogStates>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -128,7 +128,7 @@ function AssetMarketplacePanel({
|
|
|
128
128
|
]
|
|
129
129
|
}
|
|
130
130
|
) : null,
|
|
131
|
-
!liveMyListing || isERC1155 && canListMoreEditions !== false ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_action_button.ActionButton, { tone: "blue", icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Tag, { className: "h-4 w-4" }), onClick: onOpenListing, children: liveMyListing ? "
|
|
131
|
+
!liveMyListing || isERC1155 && canListMoreEditions !== false ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_action_button.ActionButton, { tone: "blue", icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Tag, { className: "h-4 w-4" }), onClick: onOpenListing, children: liveMyListing ? "Sell more" : "Sell" }) : null,
|
|
132
132
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_action_button.ActionButton, { tone: "orange", icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ArrowRightLeft, { className: "h-4 w-4" }), onClick: onOpenTransfer, children: "Transfer" }),
|
|
133
133
|
remixButton,
|
|
134
134
|
showSponsorSolicitOption && onOpenSponsorSolicit ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/asset-marketplace-panel.tsx"],"sourcesContent":["\"use client\";\n\nimport { Children, type ReactNode } from \"react\";\nimport {\n ArrowRightLeft, CheckCircle, Clock, GitBranch, HandCoins, Handshake, Loader2,\n Tag, X,\n} from \"lucide-react\";\nimport { CurrencyIcon, CurrencyAmount } from \"./currency-icon.js\";\nimport { AddressDisplay } from \"./address-display.js\";\nimport { ActionButton } from \"./action-button.js\";\nimport { formatDisplayPrice } from \"../utils/format.js\";\nimport { isExpired, timeUntil } from \"../utils/time.js\";\nimport { isSameAddress } from \"../utils/same-address.js\";\nimport { cn } from \"../utils/cn.js\";\nimport { HelpIcon } from \"./help-icon.js\";\nimport { AssetAccessButtons, CompanionAppButton } from \"./asset-access-cards.js\";\nimport { useMedialaneApp, type AssetRef } from \"./medialane-app.js\";\n\nexport interface ApiOrderLike {\n orderHash: string;\n offerer: string;\n endTime: string;\n price: { formatted: string | null; currency: string | null };\n}\n\nexport interface AssetMarketplacePanelProps<T extends ApiOrderLike = ApiOrderLike> {\n asset: AssetRef;\n compact?: boolean;\n cheapest?: T;\n isOwner: boolean;\n isProcessing: boolean;\n isERC1155: boolean;\n canListMoreEditions?: boolean;\n isMarketLoading?: boolean;\n myListing: T | null;\n activeBids: T[];\n remixEnabled?: boolean;\n showDealOption?: boolean;\n\n usdValue?: string | null;\n\n onCancelClick: (order: T) => void;\n onAcceptBid: (order: T) => void;\n onOpenListing: () => void;\n onOpenTransfer: () => void;\n onOpenPurchase: (order: T) => void;\n onOpenOffer: () => void;\n onOpenRemix?: () => void;\n onProposeDeal?: () => void;\n\n showSponsorOption?: boolean;\n onOpenSponsorProposal?: () => void;\n\n showSponsorSolicitOption?: boolean;\n onOpenSponsorSolicit?: () => void;\n\n\n}\n\nfunction ActionRow({ children }: { children: ReactNode }) {\n const odd = Children.toArray(children).length % 2 === 1;\n return <div className={cn(\"grid grid-cols-2 gap-2 sm:flex sm:flex-wrap sm:[&>*]:min-w-36\", odd && \"[&>*:first-child]:col-span-2\")}>{children}</div>;\n}\n\nfunction PriceBlock({ order, usdValue }: { order: ApiOrderLike; usdValue?: string | null }) {\n return (\n <div className=\"flex flex-wrap items-center gap-x-2 gap-y-1\">\n <CurrencyAmount amount={formatDisplayPrice(order.price.formatted)} symbol={order.price.currency ?? \"\"} iconSize={26} amountClassName=\"text-3xl font-bold text-foreground tabular-nums\" />\n <span className=\"text-lg font-semibold text-foreground\">{order.price.currency}</span>\n {usdValue ? <span className=\"text-sm tabular-nums text-muted-foreground\">{usdValue}</span> : null}\n <HelpIcon content={`Expires ${timeUntil(order.endTime)}`} />\n </div>\n );\n}\n\nexport function AssetMarketplacePanel<T extends ApiOrderLike = ApiOrderLike>({\n asset,\n compact = false,\n cheapest,\n isOwner,\n isProcessing,\n isERC1155,\n canListMoreEditions,\n isMarketLoading = false,\n myListing,\n activeBids,\n remixEnabled = false,\n showDealOption = false,\n showSponsorOption = false,\n onOpenSponsorProposal,\n showSponsorSolicitOption = false,\n onOpenSponsorSolicit,\n usdValue,\n onCancelClick,\n onAcceptBid,\n onOpenListing,\n onOpenTransfer,\n onOpenPurchase,\n onOpenOffer,\n onOpenRemix,\n onProposeDeal,\n}: AssetMarketplacePanelProps<T>) {\n const { walletAddress } = useMedialaneApp();\n const isSignedIn = !!walletAddress;\n const liveBids = activeBids.filter((bid) => !isExpired(bid.endTime));\n const liveCheapest = cheapest && !isExpired(cheapest.endTime) ? cheapest : undefined;\n const liveMyListing = myListing && !isExpired(myListing.endTime) ? myListing : null;\n\n const myBid = !isOwner && walletAddress\n ? liveBids.find((bid) => isSameAddress(bid.offerer, walletAddress)) ?? null\n : null;\n\n const canBuyMore =\n isERC1155 && isOwner && !!liveCheapest && !!walletAddress &&\n !isSameAddress(liveCheapest.offerer, walletAddress);\n\n if (isMarketLoading && !liveCheapest) {\n return (\n <div className=\"space-y-4\">\n <div className=\"h-9 w-32 rounded-md bg-muted animate-pulse\" />\n <div className=\"h-12 w-full rounded-2xl bg-muted animate-pulse\" />\n </div>\n );\n }\n\n const remixButton = remixEnabled && onOpenRemix ? (\n <ActionButton\n action=\"remix\"\n icon={<GitBranch className=\"h-4 w-4\" />}\n onClick={onOpenRemix}\n helpContent=\"Create your own attributed derivative of this work.\"\n >\n Remix\n </ActionButton>\n ) : null;\n\n const offerButton = (\n <ActionButton action=\"offer\" icon={<HandCoins className=\"h-4 w-4\" />} onClick={onOpenOffer}>\n Make offer\n </ActionButton>\n );\n\n const buyButton = liveCheapest && (!isOwner || canBuyMore) ? (\n isOwner ? (\n <ActionButton action=\"buy\" onClick={() => onOpenPurchase(liveCheapest)}>\n <span>Buy</span>\n <CurrencyAmount amount={formatDisplayPrice(liveCheapest.price.formatted)} symbol={liveCheapest.price.currency ?? \"\"} iconSize={14} amountClassName=\"tabular-nums\" />\n {usdValue ? <span className=\"font-normal text-muted-foreground tabular-nums\">· {usdValue}</span> : null}\n </ActionButton>\n ) : (\n <ActionButton action=\"buy\" onClick={() => onOpenPurchase(liveCheapest)}>\n Buy now\n </ActionButton>\n )\n ) : null;\n\n const listedPrice = !isOwner && liveCheapest ? <PriceBlock order={liveCheapest} usdValue={usdValue} /> : null;\n\n return (\n <div className=\"relative\">\n\n <div className=\"relative space-y-4\">\n {isOwner ? (\n <div className=\"space-y-3\">\n <ActionRow>\n {liveMyListing ? (\n <ActionButton\n icon={isProcessing ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <X className=\"h-4 w-4\" />}\n onClick={() => onCancelClick(liveMyListing)}\n disabled={isProcessing}\n tone=\"red\"\n helpContent={`Expires ${timeUntil(liveMyListing.endTime)}`}\n >\n <span>Cancel listing</span>\n <CurrencyAmount amount={formatDisplayPrice(liveMyListing.price.formatted)} symbol={liveMyListing.price.currency ?? \"\"} iconSize={14} amountClassName=\"tabular-nums\" />\n {liveMyListing.orderHash === liveCheapest?.orderHash && usdValue ? <span className=\"font-normal text-muted-foreground tabular-nums\">· {usdValue}</span> : null}\n </ActionButton>\n ) : null}\n {!liveMyListing || (isERC1155 && canListMoreEditions !== false) ? (\n <ActionButton tone=\"blue\" icon={<Tag className=\"h-4 w-4\" />} onClick={onOpenListing}>\n {liveMyListing ? \"List more\" : \"List for sale\"}\n </ActionButton>\n ) : null}\n <ActionButton tone=\"orange\" icon={<ArrowRightLeft className=\"h-4 w-4\" />} onClick={onOpenTransfer}>Transfer</ActionButton>\n {remixButton}\n {showSponsorSolicitOption && onOpenSponsorSolicit ? (\n <ActionButton\n tone=\"blue\"\n icon={<Handshake className=\"h-4 w-4\" />}\n onClick={onOpenSponsorSolicit}\n helpContent=\"Let sponsors bid on a license for this asset.\"\n >\n Open for sponsorship\n </ActionButton>\n ) : null}\n </ActionRow>\n {buyButton ? <ActionRow>{buyButton}</ActionRow> : null}\n </div>\n ) : (\n <div className=\"space-y-4\">\n {listedPrice}\n {isSignedIn ? (\n <ActionRow>\n {buyButton}\n {offerButton}\n {remixButton}\n {showDealOption && onProposeDeal ? (\n <ActionButton\n action=\"license\"\n icon={<HandCoins className=\"h-4 w-4\" />}\n onClick={onProposeDeal}\n helpContent=\"Propose a license deal to the creator to use this work.\"\n >\n License\n </ActionButton>\n ) : null}\n {showSponsorOption && onOpenSponsorProposal ? (\n <ActionButton\n tone=\"blue\"\n icon={<Handshake className=\"h-4 w-4\" />}\n onClick={onOpenSponsorProposal}\n helpContent=\"Propose to sponsor this creator's work — pay them directly for a license, no escrow.\"\n >\n Sponsor\n </ActionButton>\n ) : null}\n </ActionRow>\n ) : (\n <AssetAccessButtons asset={asset} stacked={compact} />\n )}\n </div>\n )}\n\n {myBid ? (\n <div className=\"rounded-xl bg-amber-500/8 px-4 py-3 flex items-center justify-between gap-3\">\n <div className=\"min-w-0 flex items-center gap-2.5\">\n <HandCoins className=\"h-4 w-4 text-amber-500 shrink-0\" />\n <div className=\"min-w-0\">\n <p className=\"text-xs font-semibold text-amber-500\">Your active offer</p>\n <p className=\"text-xs text-muted-foreground flex items-center gap-1.5 mt-0.5\">\n <span className=\"font-bold text-foreground inline-flex items-center gap-1\">\n {formatDisplayPrice(myBid.price.formatted)}\n <CurrencyIcon symbol={myBid.price.currency ?? \"\"} size={12} />\n </span>\n <span>·</span>\n <Clock className=\"h-3 w-3\" />\n {timeUntil(myBid.endTime)}\n </p>\n </div>\n </div>\n <button\n className=\"shrink-0 text-xs font-semibold text-red-400 hover:text-red-300 transition-colors flex items-center gap-1\"\n onClick={() => onCancelClick(myBid)}\n >\n <X className=\"h-3.5 w-3.5\" />\n Cancel\n </button>\n </div>\n ) : null}\n\n {isOwner && liveBids.length > 0 ? (\n <div className=\"space-y-2\">\n <p className=\"text-xs font-semibold text-muted-foreground\">\n Incoming offers ({liveBids.length})\n </p>\n <div className=\"divide-y divide-border/40\">\n {liveBids.map((bid) => (\n <div key={bid.orderHash} className=\"flex items-center justify-between gap-3 py-2.5\">\n <div className=\"min-w-0\">\n <p className=\"text-sm font-bold\">\n <span className=\"inline-flex items-center gap-1.5\">\n {formatDisplayPrice(bid.price.formatted)}\n <CurrencyIcon symbol={bid.price.currency ?? \"\"} size={14} />\n </span>\n </p>\n <div className=\"flex items-center gap-2 mt-0.5\">\n <AddressDisplay address={bid.offerer} chars={4} showCopy={false} className=\"text-xs text-muted-foreground\" />\n <span className=\"text-xs text-muted-foreground\">·</span>\n <div className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Clock className=\"h-3 w-3\" />\n {timeUntil(bid.endTime)}\n </div>\n </div>\n </div>\n <button\n disabled={isProcessing}\n onClick={() => onAcceptBid(bid)}\n className=\"inline-flex items-center gap-1.5 rounded-lg bg-primary px-3 py-1.5 text-xs font-semibold text-primary-foreground disabled:opacity-50\"\n >\n <CheckCircle className=\"h-3.5 w-3.5\" />\n Accept\n </button>\n </div>\n ))}\n </div>\n </div>\n ) : null}\n\n {isSignedIn ? <CompanionAppButton asset={asset} variant=\"link\" /> : null}\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/components/asset-marketplace-panel.tsx"],"sourcesContent":["\"use client\";\n\nimport { Children, type ReactNode } from \"react\";\nimport {\n ArrowRightLeft, CheckCircle, Clock, GitBranch, HandCoins, Handshake, Loader2,\n Tag, X,\n} from \"lucide-react\";\nimport { CurrencyIcon, CurrencyAmount } from \"./currency-icon.js\";\nimport { AddressDisplay } from \"./address-display.js\";\nimport { ActionButton } from \"./action-button.js\";\nimport { formatDisplayPrice } from \"../utils/format.js\";\nimport { isExpired, timeUntil } from \"../utils/time.js\";\nimport { isSameAddress } from \"../utils/same-address.js\";\nimport { cn } from \"../utils/cn.js\";\nimport { HelpIcon } from \"./help-icon.js\";\nimport { AssetAccessButtons, CompanionAppButton } from \"./asset-access-cards.js\";\nimport { useMedialaneApp, type AssetRef } from \"./medialane-app.js\";\n\nexport interface ApiOrderLike {\n orderHash: string;\n offerer: string;\n endTime: string;\n price: { formatted: string | null; currency: string | null };\n}\n\nexport interface AssetMarketplacePanelProps<T extends ApiOrderLike = ApiOrderLike> {\n asset: AssetRef;\n compact?: boolean;\n cheapest?: T;\n isOwner: boolean;\n isProcessing: boolean;\n isERC1155: boolean;\n canListMoreEditions?: boolean;\n isMarketLoading?: boolean;\n myListing: T | null;\n activeBids: T[];\n remixEnabled?: boolean;\n showDealOption?: boolean;\n\n usdValue?: string | null;\n\n onCancelClick: (order: T) => void;\n onAcceptBid: (order: T) => void;\n onOpenListing: () => void;\n onOpenTransfer: () => void;\n onOpenPurchase: (order: T) => void;\n onOpenOffer: () => void;\n onOpenRemix?: () => void;\n onProposeDeal?: () => void;\n\n showSponsorOption?: boolean;\n onOpenSponsorProposal?: () => void;\n\n showSponsorSolicitOption?: boolean;\n onOpenSponsorSolicit?: () => void;\n\n\n}\n\nfunction ActionRow({ children }: { children: ReactNode }) {\n const odd = Children.toArray(children).length % 2 === 1;\n return <div className={cn(\"grid grid-cols-2 gap-2 sm:flex sm:flex-wrap sm:[&>*]:min-w-36\", odd && \"[&>*:first-child]:col-span-2\")}>{children}</div>;\n}\n\nfunction PriceBlock({ order, usdValue }: { order: ApiOrderLike; usdValue?: string | null }) {\n return (\n <div className=\"flex flex-wrap items-center gap-x-2 gap-y-1\">\n <CurrencyAmount amount={formatDisplayPrice(order.price.formatted)} symbol={order.price.currency ?? \"\"} iconSize={26} amountClassName=\"text-3xl font-bold text-foreground tabular-nums\" />\n <span className=\"text-lg font-semibold text-foreground\">{order.price.currency}</span>\n {usdValue ? <span className=\"text-sm tabular-nums text-muted-foreground\">{usdValue}</span> : null}\n <HelpIcon content={`Expires ${timeUntil(order.endTime)}`} />\n </div>\n );\n}\n\nexport function AssetMarketplacePanel<T extends ApiOrderLike = ApiOrderLike>({\n asset,\n compact = false,\n cheapest,\n isOwner,\n isProcessing,\n isERC1155,\n canListMoreEditions,\n isMarketLoading = false,\n myListing,\n activeBids,\n remixEnabled = false,\n showDealOption = false,\n showSponsorOption = false,\n onOpenSponsorProposal,\n showSponsorSolicitOption = false,\n onOpenSponsorSolicit,\n usdValue,\n onCancelClick,\n onAcceptBid,\n onOpenListing,\n onOpenTransfer,\n onOpenPurchase,\n onOpenOffer,\n onOpenRemix,\n onProposeDeal,\n}: AssetMarketplacePanelProps<T>) {\n const { walletAddress } = useMedialaneApp();\n const isSignedIn = !!walletAddress;\n const liveBids = activeBids.filter((bid) => !isExpired(bid.endTime));\n const liveCheapest = cheapest && !isExpired(cheapest.endTime) ? cheapest : undefined;\n const liveMyListing = myListing && !isExpired(myListing.endTime) ? myListing : null;\n\n const myBid = !isOwner && walletAddress\n ? liveBids.find((bid) => isSameAddress(bid.offerer, walletAddress)) ?? null\n : null;\n\n const canBuyMore =\n isERC1155 && isOwner && !!liveCheapest && !!walletAddress &&\n !isSameAddress(liveCheapest.offerer, walletAddress);\n\n if (isMarketLoading && !liveCheapest) {\n return (\n <div className=\"space-y-4\">\n <div className=\"h-9 w-32 rounded-md bg-muted animate-pulse\" />\n <div className=\"h-12 w-full rounded-2xl bg-muted animate-pulse\" />\n </div>\n );\n }\n\n const remixButton = remixEnabled && onOpenRemix ? (\n <ActionButton\n action=\"remix\"\n icon={<GitBranch className=\"h-4 w-4\" />}\n onClick={onOpenRemix}\n helpContent=\"Create your own attributed derivative of this work.\"\n >\n Remix\n </ActionButton>\n ) : null;\n\n const offerButton = (\n <ActionButton action=\"offer\" icon={<HandCoins className=\"h-4 w-4\" />} onClick={onOpenOffer}>\n Make offer\n </ActionButton>\n );\n\n const buyButton = liveCheapest && (!isOwner || canBuyMore) ? (\n isOwner ? (\n <ActionButton action=\"buy\" onClick={() => onOpenPurchase(liveCheapest)}>\n <span>Buy</span>\n <CurrencyAmount amount={formatDisplayPrice(liveCheapest.price.formatted)} symbol={liveCheapest.price.currency ?? \"\"} iconSize={14} amountClassName=\"tabular-nums\" />\n {usdValue ? <span className=\"font-normal text-muted-foreground tabular-nums\">· {usdValue}</span> : null}\n </ActionButton>\n ) : (\n <ActionButton action=\"buy\" onClick={() => onOpenPurchase(liveCheapest)}>\n Buy now\n </ActionButton>\n )\n ) : null;\n\n const listedPrice = !isOwner && liveCheapest ? <PriceBlock order={liveCheapest} usdValue={usdValue} /> : null;\n\n return (\n <div className=\"relative\">\n\n <div className=\"relative space-y-4\">\n {isOwner ? (\n <div className=\"space-y-3\">\n <ActionRow>\n {liveMyListing ? (\n <ActionButton\n icon={isProcessing ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <X className=\"h-4 w-4\" />}\n onClick={() => onCancelClick(liveMyListing)}\n disabled={isProcessing}\n tone=\"red\"\n helpContent={`Expires ${timeUntil(liveMyListing.endTime)}`}\n >\n <span>Cancel listing</span>\n <CurrencyAmount amount={formatDisplayPrice(liveMyListing.price.formatted)} symbol={liveMyListing.price.currency ?? \"\"} iconSize={14} amountClassName=\"tabular-nums\" />\n {liveMyListing.orderHash === liveCheapest?.orderHash && usdValue ? <span className=\"font-normal text-muted-foreground tabular-nums\">· {usdValue}</span> : null}\n </ActionButton>\n ) : null}\n {!liveMyListing || (isERC1155 && canListMoreEditions !== false) ? (\n <ActionButton tone=\"blue\" icon={<Tag className=\"h-4 w-4\" />} onClick={onOpenListing}>\n {liveMyListing ? \"Sell more\" : \"Sell\"}\n </ActionButton>\n ) : null}\n <ActionButton tone=\"orange\" icon={<ArrowRightLeft className=\"h-4 w-4\" />} onClick={onOpenTransfer}>Transfer</ActionButton>\n {remixButton}\n {showSponsorSolicitOption && onOpenSponsorSolicit ? (\n <ActionButton\n tone=\"blue\"\n icon={<Handshake className=\"h-4 w-4\" />}\n onClick={onOpenSponsorSolicit}\n helpContent=\"Let sponsors bid on a license for this asset.\"\n >\n Open for sponsorship\n </ActionButton>\n ) : null}\n </ActionRow>\n {buyButton ? <ActionRow>{buyButton}</ActionRow> : null}\n </div>\n ) : (\n <div className=\"space-y-4\">\n {listedPrice}\n {isSignedIn ? (\n <ActionRow>\n {buyButton}\n {offerButton}\n {remixButton}\n {showDealOption && onProposeDeal ? (\n <ActionButton\n action=\"license\"\n icon={<HandCoins className=\"h-4 w-4\" />}\n onClick={onProposeDeal}\n helpContent=\"Propose a license deal to the creator to use this work.\"\n >\n License\n </ActionButton>\n ) : null}\n {showSponsorOption && onOpenSponsorProposal ? (\n <ActionButton\n tone=\"blue\"\n icon={<Handshake className=\"h-4 w-4\" />}\n onClick={onOpenSponsorProposal}\n helpContent=\"Propose to sponsor this creator's work — pay them directly for a license, no escrow.\"\n >\n Sponsor\n </ActionButton>\n ) : null}\n </ActionRow>\n ) : (\n <AssetAccessButtons asset={asset} stacked={compact} />\n )}\n </div>\n )}\n\n {myBid ? (\n <div className=\"rounded-xl bg-amber-500/8 px-4 py-3 flex items-center justify-between gap-3\">\n <div className=\"min-w-0 flex items-center gap-2.5\">\n <HandCoins className=\"h-4 w-4 text-amber-500 shrink-0\" />\n <div className=\"min-w-0\">\n <p className=\"text-xs font-semibold text-amber-500\">Your active offer</p>\n <p className=\"text-xs text-muted-foreground flex items-center gap-1.5 mt-0.5\">\n <span className=\"font-bold text-foreground inline-flex items-center gap-1\">\n {formatDisplayPrice(myBid.price.formatted)}\n <CurrencyIcon symbol={myBid.price.currency ?? \"\"} size={12} />\n </span>\n <span>·</span>\n <Clock className=\"h-3 w-3\" />\n {timeUntil(myBid.endTime)}\n </p>\n </div>\n </div>\n <button\n className=\"shrink-0 text-xs font-semibold text-red-400 hover:text-red-300 transition-colors flex items-center gap-1\"\n onClick={() => onCancelClick(myBid)}\n >\n <X className=\"h-3.5 w-3.5\" />\n Cancel\n </button>\n </div>\n ) : null}\n\n {isOwner && liveBids.length > 0 ? (\n <div className=\"space-y-2\">\n <p className=\"text-xs font-semibold text-muted-foreground\">\n Incoming offers ({liveBids.length})\n </p>\n <div className=\"divide-y divide-border/40\">\n {liveBids.map((bid) => (\n <div key={bid.orderHash} className=\"flex items-center justify-between gap-3 py-2.5\">\n <div className=\"min-w-0\">\n <p className=\"text-sm font-bold\">\n <span className=\"inline-flex items-center gap-1.5\">\n {formatDisplayPrice(bid.price.formatted)}\n <CurrencyIcon symbol={bid.price.currency ?? \"\"} size={14} />\n </span>\n </p>\n <div className=\"flex items-center gap-2 mt-0.5\">\n <AddressDisplay address={bid.offerer} chars={4} showCopy={false} className=\"text-xs text-muted-foreground\" />\n <span className=\"text-xs text-muted-foreground\">·</span>\n <div className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Clock className=\"h-3 w-3\" />\n {timeUntil(bid.endTime)}\n </div>\n </div>\n </div>\n <button\n disabled={isProcessing}\n onClick={() => onAcceptBid(bid)}\n className=\"inline-flex items-center gap-1.5 rounded-lg bg-primary px-3 py-1.5 text-xs font-semibold text-primary-foreground disabled:opacity-50\"\n >\n <CheckCircle className=\"h-3.5 w-3.5\" />\n Accept\n </button>\n </div>\n ))}\n </div>\n </div>\n ) : null}\n\n {isSignedIn ? <CompanionAppButton asset={asset} variant=\"link\" /> : null}\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -115,7 +115,7 @@ function AssetMarketplacePanel({
|
|
|
115
115
|
]
|
|
116
116
|
}
|
|
117
117
|
) : null,
|
|
118
|
-
!liveMyListing || isERC1155 && canListMoreEditions !== false ? /* @__PURE__ */ jsx(ActionButton, { tone: "blue", icon: /* @__PURE__ */ jsx(Tag, { className: "h-4 w-4" }), onClick: onOpenListing, children: liveMyListing ? "
|
|
118
|
+
!liveMyListing || isERC1155 && canListMoreEditions !== false ? /* @__PURE__ */ jsx(ActionButton, { tone: "blue", icon: /* @__PURE__ */ jsx(Tag, { className: "h-4 w-4" }), onClick: onOpenListing, children: liveMyListing ? "Sell more" : "Sell" }) : null,
|
|
119
119
|
/* @__PURE__ */ jsx(ActionButton, { tone: "orange", icon: /* @__PURE__ */ jsx(ArrowRightLeft, { className: "h-4 w-4" }), onClick: onOpenTransfer, children: "Transfer" }),
|
|
120
120
|
remixButton,
|
|
121
121
|
showSponsorSolicitOption && onOpenSponsorSolicit ? /* @__PURE__ */ jsx(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/asset-marketplace-panel.tsx"],"sourcesContent":["\"use client\";\n\nimport { Children, type ReactNode } from \"react\";\nimport {\n ArrowRightLeft, CheckCircle, Clock, GitBranch, HandCoins, Handshake, Loader2,\n Tag, X,\n} from \"lucide-react\";\nimport { CurrencyIcon, CurrencyAmount } from \"./currency-icon.js\";\nimport { AddressDisplay } from \"./address-display.js\";\nimport { ActionButton } from \"./action-button.js\";\nimport { formatDisplayPrice } from \"../utils/format.js\";\nimport { isExpired, timeUntil } from \"../utils/time.js\";\nimport { isSameAddress } from \"../utils/same-address.js\";\nimport { cn } from \"../utils/cn.js\";\nimport { HelpIcon } from \"./help-icon.js\";\nimport { AssetAccessButtons, CompanionAppButton } from \"./asset-access-cards.js\";\nimport { useMedialaneApp, type AssetRef } from \"./medialane-app.js\";\n\nexport interface ApiOrderLike {\n orderHash: string;\n offerer: string;\n endTime: string;\n price: { formatted: string | null; currency: string | null };\n}\n\nexport interface AssetMarketplacePanelProps<T extends ApiOrderLike = ApiOrderLike> {\n asset: AssetRef;\n compact?: boolean;\n cheapest?: T;\n isOwner: boolean;\n isProcessing: boolean;\n isERC1155: boolean;\n canListMoreEditions?: boolean;\n isMarketLoading?: boolean;\n myListing: T | null;\n activeBids: T[];\n remixEnabled?: boolean;\n showDealOption?: boolean;\n\n usdValue?: string | null;\n\n onCancelClick: (order: T) => void;\n onAcceptBid: (order: T) => void;\n onOpenListing: () => void;\n onOpenTransfer: () => void;\n onOpenPurchase: (order: T) => void;\n onOpenOffer: () => void;\n onOpenRemix?: () => void;\n onProposeDeal?: () => void;\n\n showSponsorOption?: boolean;\n onOpenSponsorProposal?: () => void;\n\n showSponsorSolicitOption?: boolean;\n onOpenSponsorSolicit?: () => void;\n\n\n}\n\nfunction ActionRow({ children }: { children: ReactNode }) {\n const odd = Children.toArray(children).length % 2 === 1;\n return <div className={cn(\"grid grid-cols-2 gap-2 sm:flex sm:flex-wrap sm:[&>*]:min-w-36\", odd && \"[&>*:first-child]:col-span-2\")}>{children}</div>;\n}\n\nfunction PriceBlock({ order, usdValue }: { order: ApiOrderLike; usdValue?: string | null }) {\n return (\n <div className=\"flex flex-wrap items-center gap-x-2 gap-y-1\">\n <CurrencyAmount amount={formatDisplayPrice(order.price.formatted)} symbol={order.price.currency ?? \"\"} iconSize={26} amountClassName=\"text-3xl font-bold text-foreground tabular-nums\" />\n <span className=\"text-lg font-semibold text-foreground\">{order.price.currency}</span>\n {usdValue ? <span className=\"text-sm tabular-nums text-muted-foreground\">{usdValue}</span> : null}\n <HelpIcon content={`Expires ${timeUntil(order.endTime)}`} />\n </div>\n );\n}\n\nexport function AssetMarketplacePanel<T extends ApiOrderLike = ApiOrderLike>({\n asset,\n compact = false,\n cheapest,\n isOwner,\n isProcessing,\n isERC1155,\n canListMoreEditions,\n isMarketLoading = false,\n myListing,\n activeBids,\n remixEnabled = false,\n showDealOption = false,\n showSponsorOption = false,\n onOpenSponsorProposal,\n showSponsorSolicitOption = false,\n onOpenSponsorSolicit,\n usdValue,\n onCancelClick,\n onAcceptBid,\n onOpenListing,\n onOpenTransfer,\n onOpenPurchase,\n onOpenOffer,\n onOpenRemix,\n onProposeDeal,\n}: AssetMarketplacePanelProps<T>) {\n const { walletAddress } = useMedialaneApp();\n const isSignedIn = !!walletAddress;\n const liveBids = activeBids.filter((bid) => !isExpired(bid.endTime));\n const liveCheapest = cheapest && !isExpired(cheapest.endTime) ? cheapest : undefined;\n const liveMyListing = myListing && !isExpired(myListing.endTime) ? myListing : null;\n\n const myBid = !isOwner && walletAddress\n ? liveBids.find((bid) => isSameAddress(bid.offerer, walletAddress)) ?? null\n : null;\n\n const canBuyMore =\n isERC1155 && isOwner && !!liveCheapest && !!walletAddress &&\n !isSameAddress(liveCheapest.offerer, walletAddress);\n\n if (isMarketLoading && !liveCheapest) {\n return (\n <div className=\"space-y-4\">\n <div className=\"h-9 w-32 rounded-md bg-muted animate-pulse\" />\n <div className=\"h-12 w-full rounded-2xl bg-muted animate-pulse\" />\n </div>\n );\n }\n\n const remixButton = remixEnabled && onOpenRemix ? (\n <ActionButton\n action=\"remix\"\n icon={<GitBranch className=\"h-4 w-4\" />}\n onClick={onOpenRemix}\n helpContent=\"Create your own attributed derivative of this work.\"\n >\n Remix\n </ActionButton>\n ) : null;\n\n const offerButton = (\n <ActionButton action=\"offer\" icon={<HandCoins className=\"h-4 w-4\" />} onClick={onOpenOffer}>\n Make offer\n </ActionButton>\n );\n\n const buyButton = liveCheapest && (!isOwner || canBuyMore) ? (\n isOwner ? (\n <ActionButton action=\"buy\" onClick={() => onOpenPurchase(liveCheapest)}>\n <span>Buy</span>\n <CurrencyAmount amount={formatDisplayPrice(liveCheapest.price.formatted)} symbol={liveCheapest.price.currency ?? \"\"} iconSize={14} amountClassName=\"tabular-nums\" />\n {usdValue ? <span className=\"font-normal text-muted-foreground tabular-nums\">· {usdValue}</span> : null}\n </ActionButton>\n ) : (\n <ActionButton action=\"buy\" onClick={() => onOpenPurchase(liveCheapest)}>\n Buy now\n </ActionButton>\n )\n ) : null;\n\n const listedPrice = !isOwner && liveCheapest ? <PriceBlock order={liveCheapest} usdValue={usdValue} /> : null;\n\n return (\n <div className=\"relative\">\n\n <div className=\"relative space-y-4\">\n {isOwner ? (\n <div className=\"space-y-3\">\n <ActionRow>\n {liveMyListing ? (\n <ActionButton\n icon={isProcessing ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <X className=\"h-4 w-4\" />}\n onClick={() => onCancelClick(liveMyListing)}\n disabled={isProcessing}\n tone=\"red\"\n helpContent={`Expires ${timeUntil(liveMyListing.endTime)}`}\n >\n <span>Cancel listing</span>\n <CurrencyAmount amount={formatDisplayPrice(liveMyListing.price.formatted)} symbol={liveMyListing.price.currency ?? \"\"} iconSize={14} amountClassName=\"tabular-nums\" />\n {liveMyListing.orderHash === liveCheapest?.orderHash && usdValue ? <span className=\"font-normal text-muted-foreground tabular-nums\">· {usdValue}</span> : null}\n </ActionButton>\n ) : null}\n {!liveMyListing || (isERC1155 && canListMoreEditions !== false) ? (\n <ActionButton tone=\"blue\" icon={<Tag className=\"h-4 w-4\" />} onClick={onOpenListing}>\n {liveMyListing ? \"List more\" : \"List for sale\"}\n </ActionButton>\n ) : null}\n <ActionButton tone=\"orange\" icon={<ArrowRightLeft className=\"h-4 w-4\" />} onClick={onOpenTransfer}>Transfer</ActionButton>\n {remixButton}\n {showSponsorSolicitOption && onOpenSponsorSolicit ? (\n <ActionButton\n tone=\"blue\"\n icon={<Handshake className=\"h-4 w-4\" />}\n onClick={onOpenSponsorSolicit}\n helpContent=\"Let sponsors bid on a license for this asset.\"\n >\n Open for sponsorship\n </ActionButton>\n ) : null}\n </ActionRow>\n {buyButton ? <ActionRow>{buyButton}</ActionRow> : null}\n </div>\n ) : (\n <div className=\"space-y-4\">\n {listedPrice}\n {isSignedIn ? (\n <ActionRow>\n {buyButton}\n {offerButton}\n {remixButton}\n {showDealOption && onProposeDeal ? (\n <ActionButton\n action=\"license\"\n icon={<HandCoins className=\"h-4 w-4\" />}\n onClick={onProposeDeal}\n helpContent=\"Propose a license deal to the creator to use this work.\"\n >\n License\n </ActionButton>\n ) : null}\n {showSponsorOption && onOpenSponsorProposal ? (\n <ActionButton\n tone=\"blue\"\n icon={<Handshake className=\"h-4 w-4\" />}\n onClick={onOpenSponsorProposal}\n helpContent=\"Propose to sponsor this creator's work — pay them directly for a license, no escrow.\"\n >\n Sponsor\n </ActionButton>\n ) : null}\n </ActionRow>\n ) : (\n <AssetAccessButtons asset={asset} stacked={compact} />\n )}\n </div>\n )}\n\n {myBid ? (\n <div className=\"rounded-xl bg-amber-500/8 px-4 py-3 flex items-center justify-between gap-3\">\n <div className=\"min-w-0 flex items-center gap-2.5\">\n <HandCoins className=\"h-4 w-4 text-amber-500 shrink-0\" />\n <div className=\"min-w-0\">\n <p className=\"text-xs font-semibold text-amber-500\">Your active offer</p>\n <p className=\"text-xs text-muted-foreground flex items-center gap-1.5 mt-0.5\">\n <span className=\"font-bold text-foreground inline-flex items-center gap-1\">\n {formatDisplayPrice(myBid.price.formatted)}\n <CurrencyIcon symbol={myBid.price.currency ?? \"\"} size={12} />\n </span>\n <span>·</span>\n <Clock className=\"h-3 w-3\" />\n {timeUntil(myBid.endTime)}\n </p>\n </div>\n </div>\n <button\n className=\"shrink-0 text-xs font-semibold text-red-400 hover:text-red-300 transition-colors flex items-center gap-1\"\n onClick={() => onCancelClick(myBid)}\n >\n <X className=\"h-3.5 w-3.5\" />\n Cancel\n </button>\n </div>\n ) : null}\n\n {isOwner && liveBids.length > 0 ? (\n <div className=\"space-y-2\">\n <p className=\"text-xs font-semibold text-muted-foreground\">\n Incoming offers ({liveBids.length})\n </p>\n <div className=\"divide-y divide-border/40\">\n {liveBids.map((bid) => (\n <div key={bid.orderHash} className=\"flex items-center justify-between gap-3 py-2.5\">\n <div className=\"min-w-0\">\n <p className=\"text-sm font-bold\">\n <span className=\"inline-flex items-center gap-1.5\">\n {formatDisplayPrice(bid.price.formatted)}\n <CurrencyIcon symbol={bid.price.currency ?? \"\"} size={14} />\n </span>\n </p>\n <div className=\"flex items-center gap-2 mt-0.5\">\n <AddressDisplay address={bid.offerer} chars={4} showCopy={false} className=\"text-xs text-muted-foreground\" />\n <span className=\"text-xs text-muted-foreground\">·</span>\n <div className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Clock className=\"h-3 w-3\" />\n {timeUntil(bid.endTime)}\n </div>\n </div>\n </div>\n <button\n disabled={isProcessing}\n onClick={() => onAcceptBid(bid)}\n className=\"inline-flex items-center gap-1.5 rounded-lg bg-primary px-3 py-1.5 text-xs font-semibold text-primary-foreground disabled:opacity-50\"\n >\n <CheckCircle className=\"h-3.5 w-3.5\" />\n Accept\n </button>\n </div>\n ))}\n </div>\n </div>\n ) : null}\n\n {isSignedIn ? <CompanionAppButton asset={asset} variant=\"link\" /> : null}\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/components/asset-marketplace-panel.tsx"],"sourcesContent":["\"use client\";\n\nimport { Children, type ReactNode } from \"react\";\nimport {\n ArrowRightLeft, CheckCircle, Clock, GitBranch, HandCoins, Handshake, Loader2,\n Tag, X,\n} from \"lucide-react\";\nimport { CurrencyIcon, CurrencyAmount } from \"./currency-icon.js\";\nimport { AddressDisplay } from \"./address-display.js\";\nimport { ActionButton } from \"./action-button.js\";\nimport { formatDisplayPrice } from \"../utils/format.js\";\nimport { isExpired, timeUntil } from \"../utils/time.js\";\nimport { isSameAddress } from \"../utils/same-address.js\";\nimport { cn } from \"../utils/cn.js\";\nimport { HelpIcon } from \"./help-icon.js\";\nimport { AssetAccessButtons, CompanionAppButton } from \"./asset-access-cards.js\";\nimport { useMedialaneApp, type AssetRef } from \"./medialane-app.js\";\n\nexport interface ApiOrderLike {\n orderHash: string;\n offerer: string;\n endTime: string;\n price: { formatted: string | null; currency: string | null };\n}\n\nexport interface AssetMarketplacePanelProps<T extends ApiOrderLike = ApiOrderLike> {\n asset: AssetRef;\n compact?: boolean;\n cheapest?: T;\n isOwner: boolean;\n isProcessing: boolean;\n isERC1155: boolean;\n canListMoreEditions?: boolean;\n isMarketLoading?: boolean;\n myListing: T | null;\n activeBids: T[];\n remixEnabled?: boolean;\n showDealOption?: boolean;\n\n usdValue?: string | null;\n\n onCancelClick: (order: T) => void;\n onAcceptBid: (order: T) => void;\n onOpenListing: () => void;\n onOpenTransfer: () => void;\n onOpenPurchase: (order: T) => void;\n onOpenOffer: () => void;\n onOpenRemix?: () => void;\n onProposeDeal?: () => void;\n\n showSponsorOption?: boolean;\n onOpenSponsorProposal?: () => void;\n\n showSponsorSolicitOption?: boolean;\n onOpenSponsorSolicit?: () => void;\n\n\n}\n\nfunction ActionRow({ children }: { children: ReactNode }) {\n const odd = Children.toArray(children).length % 2 === 1;\n return <div className={cn(\"grid grid-cols-2 gap-2 sm:flex sm:flex-wrap sm:[&>*]:min-w-36\", odd && \"[&>*:first-child]:col-span-2\")}>{children}</div>;\n}\n\nfunction PriceBlock({ order, usdValue }: { order: ApiOrderLike; usdValue?: string | null }) {\n return (\n <div className=\"flex flex-wrap items-center gap-x-2 gap-y-1\">\n <CurrencyAmount amount={formatDisplayPrice(order.price.formatted)} symbol={order.price.currency ?? \"\"} iconSize={26} amountClassName=\"text-3xl font-bold text-foreground tabular-nums\" />\n <span className=\"text-lg font-semibold text-foreground\">{order.price.currency}</span>\n {usdValue ? <span className=\"text-sm tabular-nums text-muted-foreground\">{usdValue}</span> : null}\n <HelpIcon content={`Expires ${timeUntil(order.endTime)}`} />\n </div>\n );\n}\n\nexport function AssetMarketplacePanel<T extends ApiOrderLike = ApiOrderLike>({\n asset,\n compact = false,\n cheapest,\n isOwner,\n isProcessing,\n isERC1155,\n canListMoreEditions,\n isMarketLoading = false,\n myListing,\n activeBids,\n remixEnabled = false,\n showDealOption = false,\n showSponsorOption = false,\n onOpenSponsorProposal,\n showSponsorSolicitOption = false,\n onOpenSponsorSolicit,\n usdValue,\n onCancelClick,\n onAcceptBid,\n onOpenListing,\n onOpenTransfer,\n onOpenPurchase,\n onOpenOffer,\n onOpenRemix,\n onProposeDeal,\n}: AssetMarketplacePanelProps<T>) {\n const { walletAddress } = useMedialaneApp();\n const isSignedIn = !!walletAddress;\n const liveBids = activeBids.filter((bid) => !isExpired(bid.endTime));\n const liveCheapest = cheapest && !isExpired(cheapest.endTime) ? cheapest : undefined;\n const liveMyListing = myListing && !isExpired(myListing.endTime) ? myListing : null;\n\n const myBid = !isOwner && walletAddress\n ? liveBids.find((bid) => isSameAddress(bid.offerer, walletAddress)) ?? null\n : null;\n\n const canBuyMore =\n isERC1155 && isOwner && !!liveCheapest && !!walletAddress &&\n !isSameAddress(liveCheapest.offerer, walletAddress);\n\n if (isMarketLoading && !liveCheapest) {\n return (\n <div className=\"space-y-4\">\n <div className=\"h-9 w-32 rounded-md bg-muted animate-pulse\" />\n <div className=\"h-12 w-full rounded-2xl bg-muted animate-pulse\" />\n </div>\n );\n }\n\n const remixButton = remixEnabled && onOpenRemix ? (\n <ActionButton\n action=\"remix\"\n icon={<GitBranch className=\"h-4 w-4\" />}\n onClick={onOpenRemix}\n helpContent=\"Create your own attributed derivative of this work.\"\n >\n Remix\n </ActionButton>\n ) : null;\n\n const offerButton = (\n <ActionButton action=\"offer\" icon={<HandCoins className=\"h-4 w-4\" />} onClick={onOpenOffer}>\n Make offer\n </ActionButton>\n );\n\n const buyButton = liveCheapest && (!isOwner || canBuyMore) ? (\n isOwner ? (\n <ActionButton action=\"buy\" onClick={() => onOpenPurchase(liveCheapest)}>\n <span>Buy</span>\n <CurrencyAmount amount={formatDisplayPrice(liveCheapest.price.formatted)} symbol={liveCheapest.price.currency ?? \"\"} iconSize={14} amountClassName=\"tabular-nums\" />\n {usdValue ? <span className=\"font-normal text-muted-foreground tabular-nums\">· {usdValue}</span> : null}\n </ActionButton>\n ) : (\n <ActionButton action=\"buy\" onClick={() => onOpenPurchase(liveCheapest)}>\n Buy now\n </ActionButton>\n )\n ) : null;\n\n const listedPrice = !isOwner && liveCheapest ? <PriceBlock order={liveCheapest} usdValue={usdValue} /> : null;\n\n return (\n <div className=\"relative\">\n\n <div className=\"relative space-y-4\">\n {isOwner ? (\n <div className=\"space-y-3\">\n <ActionRow>\n {liveMyListing ? (\n <ActionButton\n icon={isProcessing ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <X className=\"h-4 w-4\" />}\n onClick={() => onCancelClick(liveMyListing)}\n disabled={isProcessing}\n tone=\"red\"\n helpContent={`Expires ${timeUntil(liveMyListing.endTime)}`}\n >\n <span>Cancel listing</span>\n <CurrencyAmount amount={formatDisplayPrice(liveMyListing.price.formatted)} symbol={liveMyListing.price.currency ?? \"\"} iconSize={14} amountClassName=\"tabular-nums\" />\n {liveMyListing.orderHash === liveCheapest?.orderHash && usdValue ? <span className=\"font-normal text-muted-foreground tabular-nums\">· {usdValue}</span> : null}\n </ActionButton>\n ) : null}\n {!liveMyListing || (isERC1155 && canListMoreEditions !== false) ? (\n <ActionButton tone=\"blue\" icon={<Tag className=\"h-4 w-4\" />} onClick={onOpenListing}>\n {liveMyListing ? \"Sell more\" : \"Sell\"}\n </ActionButton>\n ) : null}\n <ActionButton tone=\"orange\" icon={<ArrowRightLeft className=\"h-4 w-4\" />} onClick={onOpenTransfer}>Transfer</ActionButton>\n {remixButton}\n {showSponsorSolicitOption && onOpenSponsorSolicit ? (\n <ActionButton\n tone=\"blue\"\n icon={<Handshake className=\"h-4 w-4\" />}\n onClick={onOpenSponsorSolicit}\n helpContent=\"Let sponsors bid on a license for this asset.\"\n >\n Open for sponsorship\n </ActionButton>\n ) : null}\n </ActionRow>\n {buyButton ? <ActionRow>{buyButton}</ActionRow> : null}\n </div>\n ) : (\n <div className=\"space-y-4\">\n {listedPrice}\n {isSignedIn ? (\n <ActionRow>\n {buyButton}\n {offerButton}\n {remixButton}\n {showDealOption && onProposeDeal ? (\n <ActionButton\n action=\"license\"\n icon={<HandCoins className=\"h-4 w-4\" />}\n onClick={onProposeDeal}\n helpContent=\"Propose a license deal to the creator to use this work.\"\n >\n License\n </ActionButton>\n ) : null}\n {showSponsorOption && onOpenSponsorProposal ? (\n <ActionButton\n tone=\"blue\"\n icon={<Handshake className=\"h-4 w-4\" />}\n onClick={onOpenSponsorProposal}\n helpContent=\"Propose to sponsor this creator's work — pay them directly for a license, no escrow.\"\n >\n Sponsor\n </ActionButton>\n ) : null}\n </ActionRow>\n ) : (\n <AssetAccessButtons asset={asset} stacked={compact} />\n )}\n </div>\n )}\n\n {myBid ? (\n <div className=\"rounded-xl bg-amber-500/8 px-4 py-3 flex items-center justify-between gap-3\">\n <div className=\"min-w-0 flex items-center gap-2.5\">\n <HandCoins className=\"h-4 w-4 text-amber-500 shrink-0\" />\n <div className=\"min-w-0\">\n <p className=\"text-xs font-semibold text-amber-500\">Your active offer</p>\n <p className=\"text-xs text-muted-foreground flex items-center gap-1.5 mt-0.5\">\n <span className=\"font-bold text-foreground inline-flex items-center gap-1\">\n {formatDisplayPrice(myBid.price.formatted)}\n <CurrencyIcon symbol={myBid.price.currency ?? \"\"} size={12} />\n </span>\n <span>·</span>\n <Clock className=\"h-3 w-3\" />\n {timeUntil(myBid.endTime)}\n </p>\n </div>\n </div>\n <button\n className=\"shrink-0 text-xs font-semibold text-red-400 hover:text-red-300 transition-colors flex items-center gap-1\"\n onClick={() => onCancelClick(myBid)}\n >\n <X className=\"h-3.5 w-3.5\" />\n Cancel\n </button>\n </div>\n ) : null}\n\n {isOwner && liveBids.length > 0 ? (\n <div className=\"space-y-2\">\n <p className=\"text-xs font-semibold text-muted-foreground\">\n Incoming offers ({liveBids.length})\n </p>\n <div className=\"divide-y divide-border/40\">\n {liveBids.map((bid) => (\n <div key={bid.orderHash} className=\"flex items-center justify-between gap-3 py-2.5\">\n <div className=\"min-w-0\">\n <p className=\"text-sm font-bold\">\n <span className=\"inline-flex items-center gap-1.5\">\n {formatDisplayPrice(bid.price.formatted)}\n <CurrencyIcon symbol={bid.price.currency ?? \"\"} size={14} />\n </span>\n </p>\n <div className=\"flex items-center gap-2 mt-0.5\">\n <AddressDisplay address={bid.offerer} chars={4} showCopy={false} className=\"text-xs text-muted-foreground\" />\n <span className=\"text-xs text-muted-foreground\">·</span>\n <div className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Clock className=\"h-3 w-3\" />\n {timeUntil(bid.endTime)}\n </div>\n </div>\n </div>\n <button\n disabled={isProcessing}\n onClick={() => onAcceptBid(bid)}\n className=\"inline-flex items-center gap-1.5 rounded-lg bg-primary px-3 py-1.5 text-xs font-semibold text-primary-foreground disabled:opacity-50\"\n >\n <CheckCircle className=\"h-3.5 w-3.5\" />\n Accept\n </button>\n </div>\n ))}\n </div>\n </div>\n ) : null}\n\n {isSignedIn ? <CompanionAppButton asset={asset} variant=\"link\" /> : null}\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -76,7 +76,7 @@ function SuccessView({
|
|
|
76
76
|
className: "flex items-center gap-2 rounded-xl border border-border px-4 py-3 text-sm font-semibold hover:bg-muted/40 transition-colors",
|
|
77
77
|
children: [
|
|
78
78
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Tag, { className: "h-4 w-4 text-muted-foreground" }),
|
|
79
|
-
"
|
|
79
|
+
"Sell on marketplace"
|
|
80
80
|
]
|
|
81
81
|
}
|
|
82
82
|
),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/fast-mint/success-view.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport Link from \"../link.js\";\nimport { CheckCircle2, Eye, Tag, ArrowRightLeft, GitBranch } from \"lucide-react\";\nimport { cn } from \"../../utils/cn.js\";\nimport { Button } from \"../button.js\";\nimport { MedialaneCollectionCard } from \"../medialane-collection-card.js\";\nimport type { MintedAsset } from \"./types.js\";\n\nexport interface SuccessViewProps {\n presentation?: \"inline\" | \"dialog\";\n previewImage: string | null;\n name: string;\n collectionLabel?: string;\n mintedAsset: MintedAsset | null;\n onPublishAnother: () => void;\n footer?: ReactNode;\n}\n\nexport function SuccessView({\n presentation = \"inline\",\n previewImage,\n name,\n collectionLabel,\n mintedAsset,\n footer,\n onPublishAnother,\n}: SuccessViewProps) {\n return (\n <section className={cn(presentation === \"dialog\" ? \"\" : \"rounded-2xl border border-border p-6 sm:p-8\")}>\n <div className=\"grid grid-cols-1 sm:grid-cols-[220px_1fr] gap-6 items-start\">\n <MedialaneCollectionCard image={previewImage} name={name} collection={collectionLabel} />\n <div className=\"space-y-5\">\n <div className=\"space-y-1.5\">\n <div className=\"flex items-center gap-2 text-green-500\">\n <CheckCircle2 className=\"h-5 w-5\" />\n <p className=\"text-sm font-semibold\">Asset published</p>\n </div>\n <p className=\"text-sm text-muted-foreground\">\n It is recorded onchain with your wallet as owner.\n </p>\n </div>\n\n {mintedAsset && (\n <div className=\"grid grid-cols-2 gap-2.5\">\n <Link\n href={`/asset/STARKNET/${mintedAsset.contract}/${mintedAsset.tokenId}`}\n className=\"flex items-center gap-2 rounded-xl border border-border px-4 py-3 text-sm font-semibold hover:bg-muted/40 transition-colors\"\n >\n <Eye className=\"h-4 w-4 text-muted-foreground\" />\n View asset\n </Link>\n <Link\n href={`/asset/STARKNET/${mintedAsset.contract}/${mintedAsset.tokenId}?action=list`}\n className=\"flex items-center gap-2 rounded-xl border border-border px-4 py-3 text-sm font-semibold hover:bg-muted/40 transition-colors\"\n >\n <Tag className=\"h-4 w-4 text-muted-foreground\" />\n
|
|
1
|
+
{"version":3,"sources":["../../../src/components/fast-mint/success-view.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport Link from \"../link.js\";\nimport { CheckCircle2, Eye, Tag, ArrowRightLeft, GitBranch } from \"lucide-react\";\nimport { cn } from \"../../utils/cn.js\";\nimport { Button } from \"../button.js\";\nimport { MedialaneCollectionCard } from \"../medialane-collection-card.js\";\nimport type { MintedAsset } from \"./types.js\";\n\nexport interface SuccessViewProps {\n presentation?: \"inline\" | \"dialog\";\n previewImage: string | null;\n name: string;\n collectionLabel?: string;\n mintedAsset: MintedAsset | null;\n onPublishAnother: () => void;\n footer?: ReactNode;\n}\n\nexport function SuccessView({\n presentation = \"inline\",\n previewImage,\n name,\n collectionLabel,\n mintedAsset,\n footer,\n onPublishAnother,\n}: SuccessViewProps) {\n return (\n <section className={cn(presentation === \"dialog\" ? \"\" : \"rounded-2xl border border-border p-6 sm:p-8\")}>\n <div className=\"grid grid-cols-1 sm:grid-cols-[220px_1fr] gap-6 items-start\">\n <MedialaneCollectionCard image={previewImage} name={name} collection={collectionLabel} />\n <div className=\"space-y-5\">\n <div className=\"space-y-1.5\">\n <div className=\"flex items-center gap-2 text-green-500\">\n <CheckCircle2 className=\"h-5 w-5\" />\n <p className=\"text-sm font-semibold\">Asset published</p>\n </div>\n <p className=\"text-sm text-muted-foreground\">\n It is recorded onchain with your wallet as owner.\n </p>\n </div>\n\n {mintedAsset && (\n <div className=\"grid grid-cols-2 gap-2.5\">\n <Link\n href={`/asset/STARKNET/${mintedAsset.contract}/${mintedAsset.tokenId}`}\n className=\"flex items-center gap-2 rounded-xl border border-border px-4 py-3 text-sm font-semibold hover:bg-muted/40 transition-colors\"\n >\n <Eye className=\"h-4 w-4 text-muted-foreground\" />\n View asset\n </Link>\n <Link\n href={`/asset/STARKNET/${mintedAsset.contract}/${mintedAsset.tokenId}?action=list`}\n className=\"flex items-center gap-2 rounded-xl border border-border px-4 py-3 text-sm font-semibold hover:bg-muted/40 transition-colors\"\n >\n <Tag className=\"h-4 w-4 text-muted-foreground\" />\n Sell on marketplace\n </Link>\n <Link\n href={`/asset/STARKNET/${mintedAsset.contract}/${mintedAsset.tokenId}?action=transfer`}\n className=\"flex items-center gap-2 rounded-xl border border-border px-4 py-3 text-sm font-semibold hover:bg-muted/40 transition-colors\"\n >\n <ArrowRightLeft className=\"h-4 w-4 text-muted-foreground\" />\n Transfer\n </Link>\n <Link\n href={`/create/remix/${mintedAsset.contract}/${mintedAsset.tokenId}`}\n className=\"flex items-center gap-2 rounded-xl border border-border px-4 py-3 text-sm font-semibold hover:bg-muted/40 transition-colors\"\n >\n <GitBranch className=\"h-4 w-4 text-muted-foreground\" />\n Create a remix\n </Link>\n </div>\n )}\n\n {footer}\n\n <Button variant=\"outline\" onClick={onPublishAnother} className=\"w-full sm:w-auto\">\n Publish another\n </Button>\n </div>\n </div>\n </section>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAgCQ;AA7BR,kBAAiB;AACjB,0BAAkE;AAClE,gBAAmB;AACnB,oBAAuB;AACvB,uCAAwC;AAajC,SAAS,YAAY;AAAA,EAC1B,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAqB;AACnB,SACE,4CAAC,aAAQ,eAAW,cAAG,iBAAiB,WAAW,KAAK,6CAA6C,GACnG,uDAAC,SAAI,WAAU,+DACb;AAAA,gDAAC,4DAAwB,OAAO,cAAc,MAAY,YAAY,iBAAiB;AAAA,IACvF,6CAAC,SAAI,WAAU,aACb;AAAA,mDAAC,SAAI,WAAU,eACb;AAAA,qDAAC,SAAI,WAAU,0CACb;AAAA,sDAAC,oCAAa,WAAU,WAAU;AAAA,UAClC,4CAAC,OAAE,WAAU,yBAAwB,6BAAe;AAAA,WACtD;AAAA,QACA,4CAAC,OAAE,WAAU,iCAAgC,+DAE7C;AAAA,SACF;AAAA,MAEC,eACC,6CAAC,SAAI,WAAU,4BACb;AAAA;AAAA,UAAC,YAAAA;AAAA,UAAA;AAAA,YACC,MAAM,mBAAmB,YAAY,QAAQ,IAAI,YAAY,OAAO;AAAA,YACpE,WAAU;AAAA,YAEV;AAAA,0DAAC,2BAAI,WAAU,iCAAgC;AAAA,cAAE;AAAA;AAAA;AAAA,QAEnD;AAAA,QACA;AAAA,UAAC,YAAAA;AAAA,UAAA;AAAA,YACC,MAAM,mBAAmB,YAAY,QAAQ,IAAI,YAAY,OAAO;AAAA,YACpE,WAAU;AAAA,YAEV;AAAA,0DAAC,2BAAI,WAAU,iCAAgC;AAAA,cAAE;AAAA;AAAA;AAAA,QAEnD;AAAA,QACA;AAAA,UAAC,YAAAA;AAAA,UAAA;AAAA,YACC,MAAM,mBAAmB,YAAY,QAAQ,IAAI,YAAY,OAAO;AAAA,YACpE,WAAU;AAAA,YAEV;AAAA,0DAAC,sCAAe,WAAU,iCAAgC;AAAA,cAAE;AAAA;AAAA;AAAA,QAE9D;AAAA,QACA;AAAA,UAAC,YAAAA;AAAA,UAAA;AAAA,YACC,MAAM,iBAAiB,YAAY,QAAQ,IAAI,YAAY,OAAO;AAAA,YAClE,WAAU;AAAA,YAEV;AAAA,0DAAC,iCAAU,WAAU,iCAAgC;AAAA,cAAE;AAAA;AAAA;AAAA,QAEzD;AAAA,SACF;AAAA,MAGD;AAAA,MAED,4CAAC,wBAAO,SAAQ,WAAU,SAAS,kBAAkB,WAAU,oBAAmB,6BAElF;AAAA,OACF;AAAA,KACF,GACF;AAEJ;","names":["Link"]}
|
|
@@ -43,7 +43,7 @@ function SuccessView({
|
|
|
43
43
|
className: "flex items-center gap-2 rounded-xl border border-border px-4 py-3 text-sm font-semibold hover:bg-muted/40 transition-colors",
|
|
44
44
|
children: [
|
|
45
45
|
/* @__PURE__ */ jsx(Tag, { className: "h-4 w-4 text-muted-foreground" }),
|
|
46
|
-
"
|
|
46
|
+
"Sell on marketplace"
|
|
47
47
|
]
|
|
48
48
|
}
|
|
49
49
|
),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/fast-mint/success-view.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport Link from \"../link.js\";\nimport { CheckCircle2, Eye, Tag, ArrowRightLeft, GitBranch } from \"lucide-react\";\nimport { cn } from \"../../utils/cn.js\";\nimport { Button } from \"../button.js\";\nimport { MedialaneCollectionCard } from \"../medialane-collection-card.js\";\nimport type { MintedAsset } from \"./types.js\";\n\nexport interface SuccessViewProps {\n presentation?: \"inline\" | \"dialog\";\n previewImage: string | null;\n name: string;\n collectionLabel?: string;\n mintedAsset: MintedAsset | null;\n onPublishAnother: () => void;\n footer?: ReactNode;\n}\n\nexport function SuccessView({\n presentation = \"inline\",\n previewImage,\n name,\n collectionLabel,\n mintedAsset,\n footer,\n onPublishAnother,\n}: SuccessViewProps) {\n return (\n <section className={cn(presentation === \"dialog\" ? \"\" : \"rounded-2xl border border-border p-6 sm:p-8\")}>\n <div className=\"grid grid-cols-1 sm:grid-cols-[220px_1fr] gap-6 items-start\">\n <MedialaneCollectionCard image={previewImage} name={name} collection={collectionLabel} />\n <div className=\"space-y-5\">\n <div className=\"space-y-1.5\">\n <div className=\"flex items-center gap-2 text-green-500\">\n <CheckCircle2 className=\"h-5 w-5\" />\n <p className=\"text-sm font-semibold\">Asset published</p>\n </div>\n <p className=\"text-sm text-muted-foreground\">\n It is recorded onchain with your wallet as owner.\n </p>\n </div>\n\n {mintedAsset && (\n <div className=\"grid grid-cols-2 gap-2.5\">\n <Link\n href={`/asset/STARKNET/${mintedAsset.contract}/${mintedAsset.tokenId}`}\n className=\"flex items-center gap-2 rounded-xl border border-border px-4 py-3 text-sm font-semibold hover:bg-muted/40 transition-colors\"\n >\n <Eye className=\"h-4 w-4 text-muted-foreground\" />\n View asset\n </Link>\n <Link\n href={`/asset/STARKNET/${mintedAsset.contract}/${mintedAsset.tokenId}?action=list`}\n className=\"flex items-center gap-2 rounded-xl border border-border px-4 py-3 text-sm font-semibold hover:bg-muted/40 transition-colors\"\n >\n <Tag className=\"h-4 w-4 text-muted-foreground\" />\n
|
|
1
|
+
{"version":3,"sources":["../../../src/components/fast-mint/success-view.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport Link from \"../link.js\";\nimport { CheckCircle2, Eye, Tag, ArrowRightLeft, GitBranch } from \"lucide-react\";\nimport { cn } from \"../../utils/cn.js\";\nimport { Button } from \"../button.js\";\nimport { MedialaneCollectionCard } from \"../medialane-collection-card.js\";\nimport type { MintedAsset } from \"./types.js\";\n\nexport interface SuccessViewProps {\n presentation?: \"inline\" | \"dialog\";\n previewImage: string | null;\n name: string;\n collectionLabel?: string;\n mintedAsset: MintedAsset | null;\n onPublishAnother: () => void;\n footer?: ReactNode;\n}\n\nexport function SuccessView({\n presentation = \"inline\",\n previewImage,\n name,\n collectionLabel,\n mintedAsset,\n footer,\n onPublishAnother,\n}: SuccessViewProps) {\n return (\n <section className={cn(presentation === \"dialog\" ? \"\" : \"rounded-2xl border border-border p-6 sm:p-8\")}>\n <div className=\"grid grid-cols-1 sm:grid-cols-[220px_1fr] gap-6 items-start\">\n <MedialaneCollectionCard image={previewImage} name={name} collection={collectionLabel} />\n <div className=\"space-y-5\">\n <div className=\"space-y-1.5\">\n <div className=\"flex items-center gap-2 text-green-500\">\n <CheckCircle2 className=\"h-5 w-5\" />\n <p className=\"text-sm font-semibold\">Asset published</p>\n </div>\n <p className=\"text-sm text-muted-foreground\">\n It is recorded onchain with your wallet as owner.\n </p>\n </div>\n\n {mintedAsset && (\n <div className=\"grid grid-cols-2 gap-2.5\">\n <Link\n href={`/asset/STARKNET/${mintedAsset.contract}/${mintedAsset.tokenId}`}\n className=\"flex items-center gap-2 rounded-xl border border-border px-4 py-3 text-sm font-semibold hover:bg-muted/40 transition-colors\"\n >\n <Eye className=\"h-4 w-4 text-muted-foreground\" />\n View asset\n </Link>\n <Link\n href={`/asset/STARKNET/${mintedAsset.contract}/${mintedAsset.tokenId}?action=list`}\n className=\"flex items-center gap-2 rounded-xl border border-border px-4 py-3 text-sm font-semibold hover:bg-muted/40 transition-colors\"\n >\n <Tag className=\"h-4 w-4 text-muted-foreground\" />\n Sell on marketplace\n </Link>\n <Link\n href={`/asset/STARKNET/${mintedAsset.contract}/${mintedAsset.tokenId}?action=transfer`}\n className=\"flex items-center gap-2 rounded-xl border border-border px-4 py-3 text-sm font-semibold hover:bg-muted/40 transition-colors\"\n >\n <ArrowRightLeft className=\"h-4 w-4 text-muted-foreground\" />\n Transfer\n </Link>\n <Link\n href={`/create/remix/${mintedAsset.contract}/${mintedAsset.tokenId}`}\n className=\"flex items-center gap-2 rounded-xl border border-border px-4 py-3 text-sm font-semibold hover:bg-muted/40 transition-colors\"\n >\n <GitBranch className=\"h-4 w-4 text-muted-foreground\" />\n Create a remix\n </Link>\n </div>\n )}\n\n {footer}\n\n <Button variant=\"outline\" onClick={onPublishAnother} className=\"w-full sm:w-auto\">\n Publish another\n </Button>\n </div>\n </div>\n </section>\n );\n}\n"],"mappings":";AAgCQ,cAGI,YAHJ;AA7BR,OAAO,UAAU;AACjB,SAAS,cAAc,KAAK,KAAK,gBAAgB,iBAAiB;AAClE,SAAS,UAAU;AACnB,SAAS,cAAc;AACvB,SAAS,+BAA+B;AAajC,SAAS,YAAY;AAAA,EAC1B,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAqB;AACnB,SACE,oBAAC,aAAQ,WAAW,GAAG,iBAAiB,WAAW,KAAK,6CAA6C,GACnG,+BAAC,SAAI,WAAU,+DACb;AAAA,wBAAC,2BAAwB,OAAO,cAAc,MAAY,YAAY,iBAAiB;AAAA,IACvF,qBAAC,SAAI,WAAU,aACb;AAAA,2BAAC,SAAI,WAAU,eACb;AAAA,6BAAC,SAAI,WAAU,0CACb;AAAA,8BAAC,gBAAa,WAAU,WAAU;AAAA,UAClC,oBAAC,OAAE,WAAU,yBAAwB,6BAAe;AAAA,WACtD;AAAA,QACA,oBAAC,OAAE,WAAU,iCAAgC,+DAE7C;AAAA,SACF;AAAA,MAEC,eACC,qBAAC,SAAI,WAAU,4BACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,mBAAmB,YAAY,QAAQ,IAAI,YAAY,OAAO;AAAA,YACpE,WAAU;AAAA,YAEV;AAAA,kCAAC,OAAI,WAAU,iCAAgC;AAAA,cAAE;AAAA;AAAA;AAAA,QAEnD;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,mBAAmB,YAAY,QAAQ,IAAI,YAAY,OAAO;AAAA,YACpE,WAAU;AAAA,YAEV;AAAA,kCAAC,OAAI,WAAU,iCAAgC;AAAA,cAAE;AAAA;AAAA;AAAA,QAEnD;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,mBAAmB,YAAY,QAAQ,IAAI,YAAY,OAAO;AAAA,YACpE,WAAU;AAAA,YAEV;AAAA,kCAAC,kBAAe,WAAU,iCAAgC;AAAA,cAAE;AAAA;AAAA;AAAA,QAE9D;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,iBAAiB,YAAY,QAAQ,IAAI,YAAY,OAAO;AAAA,YAClE,WAAU;AAAA,YAEV;AAAA,kCAAC,aAAU,WAAU,iCAAgC;AAAA,cAAE;AAAA;AAAA;AAAA,QAEzD;AAAA,SACF;AAAA,MAGD;AAAA,MAED,oBAAC,UAAO,SAAQ,WAAU,SAAS,kBAAkB,WAAU,oBAAmB,6BAElF;AAAA,OACF;AAAA,KACF,GACF;AAEJ;","names":[]}
|
|
@@ -72,7 +72,7 @@ function NewListings({ market }) {
|
|
|
72
72
|
title: "New listings",
|
|
73
73
|
href: "/marketplace",
|
|
74
74
|
linkLabel: "Marketplace",
|
|
75
|
-
children: isLoading ? Array.from({ length: 8 }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "w-72 shrink-0 snap-start", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_listing_card.ListingCardSkeleton, {}) }, i)) : listings.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "py-4 text-sm text-muted-foreground", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: "/launchpad/single-editions", className: "text-primary hover:underline", children: "
|
|
75
|
+
children: isLoading ? Array.from({ length: 8 }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "w-72 shrink-0 snap-start", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_listing_card.ListingCardSkeleton, {}) }, i)) : listings.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "py-4 text-sm text-muted-foreground", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: "/launchpad/single-editions", className: "text-primary hover:underline", children: "Sell the first asset" }) }) : listings.map((order) => {
|
|
76
76
|
const own = !!walletAddress && (0, import_same_address.isSameAddress)(order.offerer, walletAddress);
|
|
77
77
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "w-72 shrink-0 snap-start", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
78
78
|
import_listing_card.ListingCard,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/home-page.tsx"],"sourcesContent":["\"use client\";\n\nimport { assetHref, collectionHref, type ApiCollection } from \"@medialane/sdk\";\nimport { Tag, TrendingUp } from \"lucide-react\";\nimport Link from \"./link.js\";\nimport { PageContainer } from \"./page-container.js\";\nimport { HeroSlider } from \"./hero-slider.js\";\nimport { ActivityTicker } from \"./activity-ticker.js\";\nimport { ScrollSection } from \"./scroll-section.js\";\nimport { ListingCard, ListingCardSkeleton } from \"./listing-card.js\";\nimport { ListingCardMenu } from \"./listing-card-menu.js\";\nimport { CollectionCard, CollectionCardSkeleton } from \"./collection-card.js\";\nimport { RewardsSection } from \"./rewards-section.js\";\nimport { LaunchpadStrip } from \"./launchpad-strip.js\";\nimport { useMedialaneApp } from \"./medialane-app.js\";\nimport type { CollectionMarketActions } from \"./collection-page.js\";\nimport { useOrders } from \"../utils/use-orders.js\";\nimport { useCollections } from \"../utils/use-collections.js\";\nimport { useUsdPrices } from \"../utils/use-usd-prices.js\";\nimport { orderUsd } from \"../utils/order-usd.js\";\nimport { isSameAddress } from \"../utils/same-address.js\";\n\nconst LAUNCHPAD_HREFS = {\n nfts: \"/launchpad/single-editions\",\n \"limited-editions\": \"/launchpad/nfteditions\",\n \"collection-drop\": \"/launchpad/drop\",\n \"pop-protocol\": \"/launchpad/pop\",\n \"ip-tickets\": \"/launchpad/tickets\",\n \"creator-coins\": \"/launchpad/coin/create\",\n};\n\nfunction NewListings({ market }: { market: CollectionMarketActions }) {\n const { walletAddress } = useMedialaneApp();\n const { orders, isLoading } = useOrders({ status: \"ACTIVE\", limit: 10, page: 1 });\n const prices = useUsdPrices();\n const listings = orders.filter((o) => o.offer.itemType === \"ERC721\" || o.offer.itemType === \"ERC1155\").slice(0, 10);\n return (\n <ScrollSection\n icon={<Tag className=\"h-3.5 w-3.5 text-white\" />}\n iconBg=\"bg-gradient-to-br from-brand-rose to-brand-rose shadow-md shadow-brand-rose/20\"\n title=\"New listings\"\n href=\"/marketplace\"\n linkLabel=\"Marketplace\"\n >\n {isLoading\n ? Array.from({ length: 8 }).map((_, i) => (\n <div key={i} className=\"w-72 shrink-0 snap-start\"><ListingCardSkeleton /></div>\n ))\n : listings.length === 0\n ? (\n <p className=\"py-4 text-sm text-muted-foreground\">\n <Link href=\"/launchpad/single-editions\" className=\"text-primary hover:underline\">
|
|
1
|
+
{"version":3,"sources":["../../src/components/home-page.tsx"],"sourcesContent":["\"use client\";\n\nimport { assetHref, collectionHref, type ApiCollection } from \"@medialane/sdk\";\nimport { Tag, TrendingUp } from \"lucide-react\";\nimport Link from \"./link.js\";\nimport { PageContainer } from \"./page-container.js\";\nimport { HeroSlider } from \"./hero-slider.js\";\nimport { ActivityTicker } from \"./activity-ticker.js\";\nimport { ScrollSection } from \"./scroll-section.js\";\nimport { ListingCard, ListingCardSkeleton } from \"./listing-card.js\";\nimport { ListingCardMenu } from \"./listing-card-menu.js\";\nimport { CollectionCard, CollectionCardSkeleton } from \"./collection-card.js\";\nimport { RewardsSection } from \"./rewards-section.js\";\nimport { LaunchpadStrip } from \"./launchpad-strip.js\";\nimport { useMedialaneApp } from \"./medialane-app.js\";\nimport type { CollectionMarketActions } from \"./collection-page.js\";\nimport { useOrders } from \"../utils/use-orders.js\";\nimport { useCollections } from \"../utils/use-collections.js\";\nimport { useUsdPrices } from \"../utils/use-usd-prices.js\";\nimport { orderUsd } from \"../utils/order-usd.js\";\nimport { isSameAddress } from \"../utils/same-address.js\";\n\nconst LAUNCHPAD_HREFS = {\n nfts: \"/launchpad/single-editions\",\n \"limited-editions\": \"/launchpad/nfteditions\",\n \"collection-drop\": \"/launchpad/drop\",\n \"pop-protocol\": \"/launchpad/pop\",\n \"ip-tickets\": \"/launchpad/tickets\",\n \"creator-coins\": \"/launchpad/coin/create\",\n};\n\nfunction NewListings({ market }: { market: CollectionMarketActions }) {\n const { walletAddress } = useMedialaneApp();\n const { orders, isLoading } = useOrders({ status: \"ACTIVE\", limit: 10, page: 1 });\n const prices = useUsdPrices();\n const listings = orders.filter((o) => o.offer.itemType === \"ERC721\" || o.offer.itemType === \"ERC1155\").slice(0, 10);\n return (\n <ScrollSection\n icon={<Tag className=\"h-3.5 w-3.5 text-white\" />}\n iconBg=\"bg-gradient-to-br from-brand-rose to-brand-rose shadow-md shadow-brand-rose/20\"\n title=\"New listings\"\n href=\"/marketplace\"\n linkLabel=\"Marketplace\"\n >\n {isLoading\n ? Array.from({ length: 8 }).map((_, i) => (\n <div key={i} className=\"w-72 shrink-0 snap-start\"><ListingCardSkeleton /></div>\n ))\n : listings.length === 0\n ? (\n <p className=\"py-4 text-sm text-muted-foreground\">\n <Link href=\"/launchpad/single-editions\" className=\"text-primary hover:underline\">Sell the first asset</Link>\n </p>\n )\n : listings.map((order) => {\n const own = !!walletAddress && isSameAddress(order.offerer, walletAddress);\n return (\n <div key={order.orderHash} className=\"w-72 shrink-0 snap-start\">\n <ListingCard\n order={order}\n onBuy={own ? undefined : () => market.buy(order)}\n overflowMenu={<ListingCardMenu order={order} />}\n usdValue={orderUsd(order.price, prices)}\n />\n </div>\n );\n })}\n </ScrollSection>\n );\n}\n\nfunction CollectionsStrip() {\n const { collections, isLoading } = useCollections(1, 10, undefined, \"recent\");\n return (\n <ScrollSection\n icon={<TrendingUp className=\"h-3.5 w-3.5 text-white\" />}\n iconBg=\"bg-gradient-to-br from-brand-purple to-brand-maeve shadow-md shadow-brand-purple/20\"\n title=\"Collections\"\n href=\"/collections\"\n linkLabel=\"See all\"\n >\n {isLoading\n ? Array.from({ length: 5 }).map((_, i) => (\n <div key={i} className=\"w-56 shrink-0 snap-start sm:w-64\"><CollectionCardSkeleton /></div>\n ))\n : collections.map((col) => (\n <div key={col.contractAddress} className=\"w-64 shrink-0 snap-start\"><CollectionCard collection={col} /></div>\n ))}\n </ScrollSection>\n );\n}\n\nexport interface HomePageProps {\n useMarketActions: () => CollectionMarketActions;\n initialFeatured?: ApiCollection[];\n}\n\nexport function HomePage({ useMarketActions, initialFeatured }: HomePageProps) {\n const market = useMarketActions();\n const { collections: featured, isLoading: featuredLoading } = useCollections(1, 3, true, \"recent\", true, undefined, undefined, initialFeatured);\n const { orders: tickerOrders } = useOrders({ status: \"ACTIVE\", sort: \"recent\", limit: 14 });\n return (\n <div className=\"pb-20\">\n <HeroSlider collections={featured} isLoading={featuredLoading} getHref={(c) => collectionHref(\"STARKNET\", c.contractAddress)} />\n <PageContainer className=\"box-border max-w-full pt-6 pb-0\">\n <ActivityTicker orders={tickerOrders} minItems={3} getHref={(o) => assetHref(\"STARKNET\", o.nftContract, o.nftTokenId)} />\n </PageContainer>\n <PageContainer className=\"mt-16 box-border max-w-full space-y-10 pt-0 pb-0 sm:space-y-16 lg:space-y-20\">\n <NewListings market={market} />\n <CollectionsStrip />\n <RewardsSection rewardsHref=\"/rewards\" />\n <LaunchpadStrip hrefs={LAUNCHPAD_HREFS} marketplaceHref=\"/marketplace\" launchpadHref=\"/launchpad\" />\n </PageContainer>\n {market.dialogs}\n </div>\n );\n}\n"],"mappings":"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","names":["Link"]}
|
|
@@ -39,7 +39,7 @@ function NewListings({ market }) {
|
|
|
39
39
|
title: "New listings",
|
|
40
40
|
href: "/marketplace",
|
|
41
41
|
linkLabel: "Marketplace",
|
|
42
|
-
children: isLoading ? Array.from({ length: 8 }).map((_, i) => /* @__PURE__ */ jsx("div", { className: "w-72 shrink-0 snap-start", children: /* @__PURE__ */ jsx(ListingCardSkeleton, {}) }, i)) : listings.length === 0 ? /* @__PURE__ */ jsx("p", { className: "py-4 text-sm text-muted-foreground", children: /* @__PURE__ */ jsx(Link, { href: "/launchpad/single-editions", className: "text-primary hover:underline", children: "
|
|
42
|
+
children: isLoading ? Array.from({ length: 8 }).map((_, i) => /* @__PURE__ */ jsx("div", { className: "w-72 shrink-0 snap-start", children: /* @__PURE__ */ jsx(ListingCardSkeleton, {}) }, i)) : listings.length === 0 ? /* @__PURE__ */ jsx("p", { className: "py-4 text-sm text-muted-foreground", children: /* @__PURE__ */ jsx(Link, { href: "/launchpad/single-editions", className: "text-primary hover:underline", children: "Sell the first asset" }) }) : listings.map((order) => {
|
|
43
43
|
const own = !!walletAddress && isSameAddress(order.offerer, walletAddress);
|
|
44
44
|
return /* @__PURE__ */ jsx("div", { className: "w-72 shrink-0 snap-start", children: /* @__PURE__ */ jsx(
|
|
45
45
|
ListingCard,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/home-page.tsx"],"sourcesContent":["\"use client\";\n\nimport { assetHref, collectionHref, type ApiCollection } from \"@medialane/sdk\";\nimport { Tag, TrendingUp } from \"lucide-react\";\nimport Link from \"./link.js\";\nimport { PageContainer } from \"./page-container.js\";\nimport { HeroSlider } from \"./hero-slider.js\";\nimport { ActivityTicker } from \"./activity-ticker.js\";\nimport { ScrollSection } from \"./scroll-section.js\";\nimport { ListingCard, ListingCardSkeleton } from \"./listing-card.js\";\nimport { ListingCardMenu } from \"./listing-card-menu.js\";\nimport { CollectionCard, CollectionCardSkeleton } from \"./collection-card.js\";\nimport { RewardsSection } from \"./rewards-section.js\";\nimport { LaunchpadStrip } from \"./launchpad-strip.js\";\nimport { useMedialaneApp } from \"./medialane-app.js\";\nimport type { CollectionMarketActions } from \"./collection-page.js\";\nimport { useOrders } from \"../utils/use-orders.js\";\nimport { useCollections } from \"../utils/use-collections.js\";\nimport { useUsdPrices } from \"../utils/use-usd-prices.js\";\nimport { orderUsd } from \"../utils/order-usd.js\";\nimport { isSameAddress } from \"../utils/same-address.js\";\n\nconst LAUNCHPAD_HREFS = {\n nfts: \"/launchpad/single-editions\",\n \"limited-editions\": \"/launchpad/nfteditions\",\n \"collection-drop\": \"/launchpad/drop\",\n \"pop-protocol\": \"/launchpad/pop\",\n \"ip-tickets\": \"/launchpad/tickets\",\n \"creator-coins\": \"/launchpad/coin/create\",\n};\n\nfunction NewListings({ market }: { market: CollectionMarketActions }) {\n const { walletAddress } = useMedialaneApp();\n const { orders, isLoading } = useOrders({ status: \"ACTIVE\", limit: 10, page: 1 });\n const prices = useUsdPrices();\n const listings = orders.filter((o) => o.offer.itemType === \"ERC721\" || o.offer.itemType === \"ERC1155\").slice(0, 10);\n return (\n <ScrollSection\n icon={<Tag className=\"h-3.5 w-3.5 text-white\" />}\n iconBg=\"bg-gradient-to-br from-brand-rose to-brand-rose shadow-md shadow-brand-rose/20\"\n title=\"New listings\"\n href=\"/marketplace\"\n linkLabel=\"Marketplace\"\n >\n {isLoading\n ? Array.from({ length: 8 }).map((_, i) => (\n <div key={i} className=\"w-72 shrink-0 snap-start\"><ListingCardSkeleton /></div>\n ))\n : listings.length === 0\n ? (\n <p className=\"py-4 text-sm text-muted-foreground\">\n <Link href=\"/launchpad/single-editions\" className=\"text-primary hover:underline\">
|
|
1
|
+
{"version":3,"sources":["../../src/components/home-page.tsx"],"sourcesContent":["\"use client\";\n\nimport { assetHref, collectionHref, type ApiCollection } from \"@medialane/sdk\";\nimport { Tag, TrendingUp } from \"lucide-react\";\nimport Link from \"./link.js\";\nimport { PageContainer } from \"./page-container.js\";\nimport { HeroSlider } from \"./hero-slider.js\";\nimport { ActivityTicker } from \"./activity-ticker.js\";\nimport { ScrollSection } from \"./scroll-section.js\";\nimport { ListingCard, ListingCardSkeleton } from \"./listing-card.js\";\nimport { ListingCardMenu } from \"./listing-card-menu.js\";\nimport { CollectionCard, CollectionCardSkeleton } from \"./collection-card.js\";\nimport { RewardsSection } from \"./rewards-section.js\";\nimport { LaunchpadStrip } from \"./launchpad-strip.js\";\nimport { useMedialaneApp } from \"./medialane-app.js\";\nimport type { CollectionMarketActions } from \"./collection-page.js\";\nimport { useOrders } from \"../utils/use-orders.js\";\nimport { useCollections } from \"../utils/use-collections.js\";\nimport { useUsdPrices } from \"../utils/use-usd-prices.js\";\nimport { orderUsd } from \"../utils/order-usd.js\";\nimport { isSameAddress } from \"../utils/same-address.js\";\n\nconst LAUNCHPAD_HREFS = {\n nfts: \"/launchpad/single-editions\",\n \"limited-editions\": \"/launchpad/nfteditions\",\n \"collection-drop\": \"/launchpad/drop\",\n \"pop-protocol\": \"/launchpad/pop\",\n \"ip-tickets\": \"/launchpad/tickets\",\n \"creator-coins\": \"/launchpad/coin/create\",\n};\n\nfunction NewListings({ market }: { market: CollectionMarketActions }) {\n const { walletAddress } = useMedialaneApp();\n const { orders, isLoading } = useOrders({ status: \"ACTIVE\", limit: 10, page: 1 });\n const prices = useUsdPrices();\n const listings = orders.filter((o) => o.offer.itemType === \"ERC721\" || o.offer.itemType === \"ERC1155\").slice(0, 10);\n return (\n <ScrollSection\n icon={<Tag className=\"h-3.5 w-3.5 text-white\" />}\n iconBg=\"bg-gradient-to-br from-brand-rose to-brand-rose shadow-md shadow-brand-rose/20\"\n title=\"New listings\"\n href=\"/marketplace\"\n linkLabel=\"Marketplace\"\n >\n {isLoading\n ? Array.from({ length: 8 }).map((_, i) => (\n <div key={i} className=\"w-72 shrink-0 snap-start\"><ListingCardSkeleton /></div>\n ))\n : listings.length === 0\n ? (\n <p className=\"py-4 text-sm text-muted-foreground\">\n <Link href=\"/launchpad/single-editions\" className=\"text-primary hover:underline\">Sell the first asset</Link>\n </p>\n )\n : listings.map((order) => {\n const own = !!walletAddress && isSameAddress(order.offerer, walletAddress);\n return (\n <div key={order.orderHash} className=\"w-72 shrink-0 snap-start\">\n <ListingCard\n order={order}\n onBuy={own ? undefined : () => market.buy(order)}\n overflowMenu={<ListingCardMenu order={order} />}\n usdValue={orderUsd(order.price, prices)}\n />\n </div>\n );\n })}\n </ScrollSection>\n );\n}\n\nfunction CollectionsStrip() {\n const { collections, isLoading } = useCollections(1, 10, undefined, \"recent\");\n return (\n <ScrollSection\n icon={<TrendingUp className=\"h-3.5 w-3.5 text-white\" />}\n iconBg=\"bg-gradient-to-br from-brand-purple to-brand-maeve shadow-md shadow-brand-purple/20\"\n title=\"Collections\"\n href=\"/collections\"\n linkLabel=\"See all\"\n >\n {isLoading\n ? Array.from({ length: 5 }).map((_, i) => (\n <div key={i} className=\"w-56 shrink-0 snap-start sm:w-64\"><CollectionCardSkeleton /></div>\n ))\n : collections.map((col) => (\n <div key={col.contractAddress} className=\"w-64 shrink-0 snap-start\"><CollectionCard collection={col} /></div>\n ))}\n </ScrollSection>\n );\n}\n\nexport interface HomePageProps {\n useMarketActions: () => CollectionMarketActions;\n initialFeatured?: ApiCollection[];\n}\n\nexport function HomePage({ useMarketActions, initialFeatured }: HomePageProps) {\n const market = useMarketActions();\n const { collections: featured, isLoading: featuredLoading } = useCollections(1, 3, true, \"recent\", true, undefined, undefined, initialFeatured);\n const { orders: tickerOrders } = useOrders({ status: \"ACTIVE\", sort: \"recent\", limit: 14 });\n return (\n <div className=\"pb-20\">\n <HeroSlider collections={featured} isLoading={featuredLoading} getHref={(c) => collectionHref(\"STARKNET\", c.contractAddress)} />\n <PageContainer className=\"box-border max-w-full pt-6 pb-0\">\n <ActivityTicker orders={tickerOrders} minItems={3} getHref={(o) => assetHref(\"STARKNET\", o.nftContract, o.nftTokenId)} />\n </PageContainer>\n <PageContainer className=\"mt-16 box-border max-w-full space-y-10 pt-0 pb-0 sm:space-y-16 lg:space-y-20\">\n <NewListings market={market} />\n <CollectionsStrip />\n <RewardsSection rewardsHref=\"/rewards\" />\n <LaunchpadStrip hrefs={LAUNCHPAD_HREFS} marketplaceHref=\"/marketplace\" launchpadHref=\"/launchpad\" />\n </PageContainer>\n {market.dialogs}\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -38,10 +38,10 @@ const CLUB_TIER_PRESET = {
|
|
|
38
38
|
back: { href: "/launchpad/club", label: "\u2190 Back" },
|
|
39
39
|
notOwner: { message: "You don't own this club.", back: { href: "/launchpad/club", label: "\u2190 Back to clubs" } },
|
|
40
40
|
dialog: { title: "Create membership", workingLabel: "Creating your membership\u2026", firstStepLabel: "Upload membership metadata" },
|
|
41
|
-
success: { title: "Membership created", description: "The supply is minted to your wallet and ready to
|
|
41
|
+
success: { title: "Membership created", description: "The supply is minted to your wallet and ready to sell.", againLabel: "Create another membership" },
|
|
42
42
|
shell: {
|
|
43
43
|
title: "Create Membership",
|
|
44
|
-
subtitle: (name) => `Add a new membership tier to ${name ?? "your club"} and mint its supply to your wallet, ready to
|
|
44
|
+
subtitle: (name) => `Add a new membership tier to ${name ?? "your club"} and mint its supply to your wallet, ready to sell.`
|
|
45
45
|
},
|
|
46
46
|
cardFallbackSymbol: "Club",
|
|
47
47
|
copy: {
|
|
@@ -73,7 +73,7 @@ const TICKETS_TIER_PRESET = {
|
|
|
73
73
|
success: { title: "Tickets minted", description: "Each ticket is recorded onchain under your wallet.", againLabel: "Mint another ticket" },
|
|
74
74
|
shell: {
|
|
75
75
|
title: "Mint Tickets",
|
|
76
|
-
subtitle: (name) => `Add a new ticket type to ${name ?? "your collection"} and mint its supply to your wallet, ready to
|
|
76
|
+
subtitle: (name) => `Add a new ticket type to ${name ?? "your collection"} and mint its supply to your wallet, ready to sell.`
|
|
77
77
|
},
|
|
78
78
|
cardFallbackSymbol: "Tickets",
|
|
79
79
|
copy: {
|