@medialane/ui 0.295.0 → 0.297.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist/components/asset-page.cjs +10 -0
  2. package/dist/components/asset-page.cjs.map +1 -1
  3. package/dist/components/asset-page.js +10 -0
  4. package/dist/components/asset-page.js.map +1 -1
  5. package/dist/components/fast-mint/asset-form-parts.cjs +194 -0
  6. package/dist/components/fast-mint/asset-form-parts.cjs.map +1 -0
  7. package/dist/components/fast-mint/asset-form-parts.d.cts +33 -0
  8. package/dist/components/fast-mint/asset-form-parts.d.ts +33 -0
  9. package/dist/components/fast-mint/asset-form-parts.js +158 -0
  10. package/dist/components/fast-mint/asset-form-parts.js.map +1 -0
  11. package/dist/components/fast-mint/collection-section.cjs +211 -0
  12. package/dist/components/fast-mint/collection-section.cjs.map +1 -0
  13. package/dist/components/fast-mint/collection-section.d.cts +27 -0
  14. package/dist/components/fast-mint/collection-section.d.ts +27 -0
  15. package/dist/components/fast-mint/collection-section.js +176 -0
  16. package/dist/components/fast-mint/collection-section.js.map +1 -0
  17. package/dist/components/fast-mint/fast-mint.cjs +116 -653
  18. package/dist/components/fast-mint/fast-mint.cjs.map +1 -1
  19. package/dist/components/fast-mint/fast-mint.js +115 -661
  20. package/dist/components/fast-mint/fast-mint.js.map +1 -1
  21. package/dist/components/fast-mint/form.cjs +40 -0
  22. package/dist/components/fast-mint/form.cjs.map +1 -0
  23. package/dist/components/fast-mint/form.d.cts +15 -0
  24. package/dist/components/fast-mint/form.d.ts +15 -0
  25. package/dist/components/fast-mint/form.js +16 -0
  26. package/dist/components/fast-mint/form.js.map +1 -0
  27. package/dist/components/fast-mint/ip-type-section.cjs +76 -0
  28. package/dist/components/fast-mint/ip-type-section.cjs.map +1 -0
  29. package/dist/components/fast-mint/ip-type-section.d.cts +17 -0
  30. package/dist/components/fast-mint/ip-type-section.d.ts +17 -0
  31. package/dist/components/fast-mint/ip-type-section.js +52 -0
  32. package/dist/components/fast-mint/ip-type-section.js.map +1 -0
  33. package/dist/components/fast-mint/licensing-section.cjs +124 -0
  34. package/dist/components/fast-mint/licensing-section.cjs.map +1 -0
  35. package/dist/components/fast-mint/licensing-section.d.cts +14 -0
  36. package/dist/components/fast-mint/licensing-section.d.ts +14 -0
  37. package/dist/components/fast-mint/licensing-section.js +99 -0
  38. package/dist/components/fast-mint/licensing-section.js.map +1 -0
  39. package/dist/components/fast-mint/media-kind.cjs +48 -0
  40. package/dist/components/fast-mint/media-kind.cjs.map +1 -0
  41. package/dist/components/fast-mint/media-kind.d.cts +12 -0
  42. package/dist/components/fast-mint/media-kind.d.ts +12 -0
  43. package/dist/components/fast-mint/media-kind.js +22 -0
  44. package/dist/components/fast-mint/media-kind.js.map +1 -0
  45. package/dist/components/fast-mint/mint-asset.cjs +124 -0
  46. package/dist/components/fast-mint/mint-asset.cjs.map +1 -0
  47. package/dist/components/fast-mint/mint-asset.d.cts +41 -0
  48. package/dist/components/fast-mint/mint-asset.d.ts +41 -0
  49. package/dist/components/fast-mint/mint-asset.js +100 -0
  50. package/dist/components/fast-mint/mint-asset.js.map +1 -0
  51. package/dist/components/fast-mint/use-ipfs-upload.cjs +64 -0
  52. package/dist/components/fast-mint/use-ipfs-upload.cjs.map +1 -0
  53. package/dist/components/fast-mint/use-ipfs-upload.d.cts +9 -0
  54. package/dist/components/fast-mint/use-ipfs-upload.d.ts +9 -0
  55. package/dist/components/fast-mint/use-ipfs-upload.js +40 -0
  56. package/dist/components/fast-mint/use-ipfs-upload.js.map +1 -0
  57. package/dist/components/fast-mint/use-new-collection-draft.cjs +66 -0
  58. package/dist/components/fast-mint/use-new-collection-draft.cjs.map +1 -0
  59. package/dist/components/fast-mint/use-new-collection-draft.d.cts +13 -0
  60. package/dist/components/fast-mint/use-new-collection-draft.d.ts +13 -0
  61. package/dist/components/fast-mint/use-new-collection-draft.js +42 -0
  62. package/dist/components/fast-mint/use-new-collection-draft.js.map +1 -0
  63. package/dist/components/soulbound-card.cjs +70 -0
  64. package/dist/components/soulbound-card.cjs.map +1 -0
  65. package/dist/components/soulbound-card.d.cts +13 -0
  66. package/dist/components/soulbound-card.d.ts +13 -0
  67. package/dist/components/soulbound-card.js +35 -0
  68. package/dist/components/soulbound-card.js.map +1 -0
  69. package/dist/index.cjs +5 -0
  70. package/dist/index.cjs.map +1 -1
  71. package/dist/index.d.cts +1 -0
  72. package/dist/index.d.ts +1 -0
  73. package/dist/index.js +3 -0
  74. package/dist/index.js.map +1 -1
  75. package/package.json +1 -1
@@ -0,0 +1,41 @@
1
+ import { ApiCollection } from '@medialane/sdk';
2
+ import { MedialaneClient } from '@medialane/sdk/starknet';
3
+ import { IPType } from '../../data/ip.js';
4
+ import { MetadataField } from '../ip-type-fields.js';
5
+ import { FormValues } from './form.js';
6
+ import { FastMintSigner, MediaKind, MintedAsset } from './types.js';
7
+ import { MintAssetType } from './mintable-collections.js';
8
+ import 'react/jsx-runtime';
9
+ import 'react';
10
+ import 'starknet';
11
+
12
+ type MintDestination = {
13
+ mode: "existing";
14
+ collectionId: string;
15
+ collectionContract: string;
16
+ } | {
17
+ mode: "new";
18
+ name: string;
19
+ symbol: string;
20
+ description: string;
21
+ };
22
+ interface MintAssetInput {
23
+ client: MedialaneClient;
24
+ signer: FastMintSigner;
25
+ walletAddress: string;
26
+ values: FormValues;
27
+ ipType: IPType;
28
+ templateFields: MetadataField[];
29
+ mediaKind: MediaKind;
30
+ mediaUri: string;
31
+ featureUri: string | null;
32
+ assetType: MintAssetType;
33
+ editionCount: string;
34
+ destination: MintDestination;
35
+ singleCollections: ApiCollection[];
36
+ refetchCollections: () => Promise<ApiCollection[]>;
37
+ getUploadToken: () => Promise<string | null>;
38
+ }
39
+ declare function mintAsset(input: MintAssetInput): Promise<MintedAsset | null>;
40
+
41
+ export { type MintAssetInput, type MintDestination, mintAsset };
@@ -0,0 +1,100 @@
1
+ import { buildAssetMetadata } from "@medialane/sdk";
2
+ import { executeIntent, deployedCollectionFromReceipt, mintedTokenIdFromReceipt } from "@medialane/sdk/starknet";
3
+ import { uploadJsonToIpfs } from "../../utils/ipfs-upload.js";
4
+ async function pollForNewCollection(refetchCollections, name, symbol) {
5
+ for (let attempt = 0; attempt < 8; attempt++) {
6
+ const list = await refetchCollections();
7
+ const match = list.find((c) => c.name === name && c.symbol === symbol);
8
+ if (match?.collectionId) return match;
9
+ await new Promise((r) => setTimeout(r, 1500));
10
+ }
11
+ return null;
12
+ }
13
+ async function mintAsset(input) {
14
+ const { client, signer, walletAddress, values, destination } = input;
15
+ const image = input.mediaKind === "image" ? input.mediaUri : input.featureUri;
16
+ const built = buildAssetMetadata({
17
+ name: values.name,
18
+ description: values.description || "",
19
+ externalUrl: values.external_url || "",
20
+ imageUri: image,
21
+ creator: walletAddress,
22
+ ipType: input.ipType,
23
+ licenseType: values.licenseType,
24
+ commercialUse: values.commercialUse,
25
+ derivatives: values.derivatives,
26
+ attribution: values.attribution,
27
+ geographicScope: values.geographicScope,
28
+ aiPolicy: values.aiPolicy,
29
+ royalty: String(values.royalty),
30
+ templateTraits: input.templateFields.filter(({ traitType, value }) => traitType.trim() && value.trim()).map(({ traitType, value }) => ({ traitType, value }))
31
+ });
32
+ const metadata = { ...built };
33
+ if (input.mediaKind !== "image") metadata.animation_url = input.mediaUri;
34
+ const uploadToken = await input.getUploadToken();
35
+ if (!uploadToken) throw new Error("Sign in first");
36
+ const tokenUri = await uploadJsonToIpfs(client.api, metadata);
37
+ const royaltyBps = Math.round(values.royalty * 100);
38
+ let contractAddress;
39
+ let tokenId;
40
+ if (input.assetType === "single") {
41
+ let collectionId = destination.mode === "existing" ? destination.collectionId : "";
42
+ contractAddress = destination.mode === "existing" ? input.singleCollections.find((c) => c.collectionId === destination.collectionId)?.contractAddress ?? null : null;
43
+ if (destination.mode === "new") {
44
+ const created = await client.api.intents.create("create-collection", {
45
+ owner: walletAddress,
46
+ name: destination.name,
47
+ symbol: destination.symbol,
48
+ description: destination.description || void 0,
49
+ image
50
+ });
51
+ await executeIntent(signer, client, created);
52
+ const found = await pollForNewCollection(input.refetchCollections, destination.name, destination.symbol);
53
+ if (!found) throw new Error("Collection created, but it's still indexing \u2014 try minting again in a moment from My Collections.");
54
+ collectionId = found.collectionId;
55
+ contractAddress = found.contractAddress ?? null;
56
+ }
57
+ const minted = await client.api.intents.create("mint", {
58
+ owner: walletAddress,
59
+ collectionId,
60
+ recipient: walletAddress,
61
+ tokenUri,
62
+ royaltyBps
63
+ });
64
+ const result = await executeIntent(signer, client, minted);
65
+ tokenId = contractAddress ? mintedTokenIdFromReceipt(result.receipt, contractAddress) : null;
66
+ } else {
67
+ let collectionContract = destination.mode === "existing" ? destination.collectionContract : "";
68
+ if (destination.mode === "new") {
69
+ const created = await client.api.intents.create("create-collection", {
70
+ owner: walletAddress,
71
+ name: destination.name,
72
+ symbol: destination.symbol,
73
+ description: destination.description || void 0,
74
+ image,
75
+ baseUri: "",
76
+ service: "mip-erc1155"
77
+ });
78
+ const deployResult = await executeIntent(signer, client, created);
79
+ const deployed = deployedCollectionFromReceipt(deployResult.receipt, "mip-erc1155");
80
+ if (!deployed) throw new Error("Collection deployed, but its address couldn't be read \u2014 check My Collections to mint into it.");
81
+ collectionContract = deployed;
82
+ }
83
+ const minted = await client.api.intents.create("mint", {
84
+ owner: walletAddress,
85
+ recipient: walletAddress,
86
+ collectionContract,
87
+ tokenUri,
88
+ value: input.editionCount,
89
+ royaltyBps
90
+ });
91
+ const result = await executeIntent(signer, client, minted);
92
+ contractAddress = collectionContract;
93
+ tokenId = mintedTokenIdFromReceipt(result.receipt, collectionContract);
94
+ }
95
+ return contractAddress && tokenId ? { contract: contractAddress, tokenId, image } : null;
96
+ }
97
+ export {
98
+ mintAsset
99
+ };
100
+ //# sourceMappingURL=mint-asset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/fast-mint/mint-asset.ts"],"sourcesContent":["import { buildAssetMetadata, type ApiCollection } from \"@medialane/sdk\";\nimport { executeIntent, deployedCollectionFromReceipt, mintedTokenIdFromReceipt, type MedialaneClient } from \"@medialane/sdk/starknet\";\nimport type { IPType } from \"../../data/ip.js\";\nimport type { MetadataField } from \"../ip-type-fields.js\";\nimport { uploadJsonToIpfs } from \"../../utils/ipfs-upload.js\";\nimport type { FormValues } from \"./form.js\";\nimport type { FastMintSigner, MediaKind, MintedAsset } from \"./types.js\";\nimport type { MintAssetType } from \"./mintable-collections.js\";\n\nexport type MintDestination =\n | { mode: \"existing\"; collectionId: string; collectionContract: string }\n | { mode: \"new\"; name: string; symbol: string; description: string };\n\nexport interface MintAssetInput {\n client: MedialaneClient;\n signer: FastMintSigner;\n walletAddress: string;\n values: FormValues;\n ipType: IPType;\n templateFields: MetadataField[];\n mediaKind: MediaKind;\n mediaUri: string;\n featureUri: string | null;\n assetType: MintAssetType;\n editionCount: string;\n destination: MintDestination;\n singleCollections: ApiCollection[];\n refetchCollections: () => Promise<ApiCollection[]>;\n getUploadToken: () => Promise<string | null>;\n}\n\nasync function pollForNewCollection(\n refetchCollections: () => Promise<ApiCollection[]>,\n name: string,\n symbol: string,\n): Promise<ApiCollection | null> {\n for (let attempt = 0; attempt < 8; attempt++) {\n const list = await refetchCollections();\n const match = list.find((c) => c.name === name && c.symbol === symbol);\n if (match?.collectionId) return match;\n await new Promise((r) => setTimeout(r, 1500));\n }\n return null;\n}\n\nexport async function mintAsset(input: MintAssetInput): Promise<MintedAsset | null> {\n const { client, signer, walletAddress, values, destination } = input;\n\n const image = input.mediaKind === \"image\" ? input.mediaUri : input.featureUri!;\n const built = buildAssetMetadata({\n name: values.name,\n description: values.description || \"\",\n externalUrl: values.external_url || \"\",\n imageUri: image,\n creator: walletAddress,\n ipType: input.ipType,\n licenseType: values.licenseType,\n commercialUse: values.commercialUse,\n derivatives: values.derivatives,\n attribution: values.attribution,\n geographicScope: values.geographicScope,\n aiPolicy: values.aiPolicy,\n royalty: String(values.royalty),\n templateTraits: input.templateFields\n .filter(({ traitType, value }) => traitType.trim() && value.trim())\n .map(({ traitType, value }) => ({ traitType, value })),\n });\n const metadata: Record<string, unknown> = { ...built };\n if (input.mediaKind !== \"image\") metadata.animation_url = input.mediaUri;\n\n const uploadToken = await input.getUploadToken();\n if (!uploadToken) throw new Error(\"Sign in first\");\n const tokenUri = await uploadJsonToIpfs(client.api, metadata);\n\n const royaltyBps = Math.round(values.royalty * 100);\n let contractAddress: string | null;\n let tokenId: string | null;\n\n if (input.assetType === \"single\") {\n let collectionId = destination.mode === \"existing\" ? destination.collectionId : \"\";\n contractAddress = destination.mode === \"existing\"\n ? input.singleCollections.find((c) => c.collectionId === destination.collectionId)?.contractAddress ?? null\n : null;\n\n if (destination.mode === \"new\") {\n const created = await client.api.intents.create(\"create-collection\", {\n owner: walletAddress,\n name: destination.name,\n symbol: destination.symbol,\n description: destination.description || undefined,\n image,\n });\n await executeIntent(signer, client, created);\n\n const found = await pollForNewCollection(input.refetchCollections, destination.name, destination.symbol);\n if (!found) throw new Error(\"Collection created, but it's still indexing — try minting again in a moment from My Collections.\");\n collectionId = found.collectionId!;\n contractAddress = found.contractAddress ?? null;\n }\n\n const minted = await client.api.intents.create(\"mint\", {\n owner: walletAddress,\n collectionId,\n recipient: walletAddress,\n tokenUri,\n royaltyBps,\n });\n const result = await executeIntent(signer, client, minted);\n tokenId = contractAddress ? mintedTokenIdFromReceipt(result.receipt, contractAddress) : null;\n } else {\n let collectionContract = destination.mode === \"existing\" ? destination.collectionContract : \"\";\n\n if (destination.mode === \"new\") {\n const created = await client.api.intents.create(\"create-collection\", {\n owner: walletAddress,\n name: destination.name,\n symbol: destination.symbol,\n description: destination.description || undefined,\n image,\n baseUri: \"\",\n service: \"mip-erc1155\",\n });\n const deployResult = await executeIntent(signer, client, created);\n\n const deployed = deployedCollectionFromReceipt(deployResult.receipt, \"mip-erc1155\");\n if (!deployed) throw new Error(\"Collection deployed, but its address couldn't be read — check My Collections to mint into it.\");\n collectionContract = deployed;\n }\n\n const minted = await client.api.intents.create(\"mint\", {\n owner: walletAddress,\n recipient: walletAddress,\n collectionContract,\n tokenUri,\n value: input.editionCount,\n royaltyBps,\n });\n const result = await executeIntent(signer, client, minted);\n contractAddress = collectionContract;\n tokenId = mintedTokenIdFromReceipt(result.receipt, collectionContract);\n }\n\n return contractAddress && tokenId ? { contract: contractAddress, tokenId, image } : null;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ "use client";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+ var use_ipfs_upload_exports = {};
21
+ __export(use_ipfs_upload_exports, {
22
+ useIpfsUpload: () => useIpfsUpload
23
+ });
24
+ module.exports = __toCommonJS(use_ipfs_upload_exports);
25
+ var import_react = require("react");
26
+ var import_ipfs_upload = require("../../utils/ipfs-upload.js");
27
+ function useIpfsUpload() {
28
+ const [preview, setPreview] = (0, import_react.useState)(null);
29
+ const [uri, setUri] = (0, import_react.useState)(null);
30
+ const [uploading, setUploading] = (0, import_react.useState)(false);
31
+ const previewRef = (0, import_react.useRef)(null);
32
+ const revoke = () => {
33
+ if (previewRef.current) URL.revokeObjectURL(previewRef.current);
34
+ previewRef.current = null;
35
+ };
36
+ (0, import_react.useEffect)(() => revoke, []);
37
+ const start = async (file, upload, onError) => {
38
+ revoke();
39
+ const objectUrl = URL.createObjectURL(file);
40
+ previewRef.current = objectUrl;
41
+ setPreview(objectUrl);
42
+ setUri(null);
43
+ setUploading(true);
44
+ try {
45
+ setUri(await upload(file));
46
+ } catch (err) {
47
+ const toast = (0, import_ipfs_upload.uploadFailureToast)(err);
48
+ onError(toast.description ?? toast.title);
49
+ } finally {
50
+ setUploading(false);
51
+ }
52
+ };
53
+ const clear = () => {
54
+ revoke();
55
+ setPreview(null);
56
+ setUri(null);
57
+ };
58
+ return { preview, uri, uploading, start, clear };
59
+ }
60
+ // Annotate the CommonJS export names for ESM import in node:
61
+ 0 && (module.exports = {
62
+ useIpfsUpload
63
+ });
64
+ //# sourceMappingURL=use-ipfs-upload.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/fast-mint/use-ipfs-upload.ts"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { uploadFailureToast } from \"../../utils/ipfs-upload.js\";\n\nexport function useIpfsUpload() {\n const [preview, setPreview] = useState<string | null>(null);\n const [uri, setUri] = useState<string | null>(null);\n const [uploading, setUploading] = useState(false);\n const previewRef = useRef<string | null>(null);\n\n const revoke = () => {\n if (previewRef.current) URL.revokeObjectURL(previewRef.current);\n previewRef.current = null;\n };\n\n useEffect(() => revoke, []);\n\n const start = async (file: File, upload: (file: File) => Promise<string>, onError: (message: string) => void) => {\n revoke();\n const objectUrl = URL.createObjectURL(file);\n previewRef.current = objectUrl;\n setPreview(objectUrl);\n setUri(null);\n setUploading(true);\n try {\n setUri(await upload(file));\n } catch (err) {\n const toast = uploadFailureToast(err);\n onError(toast.description ?? toast.title);\n } finally {\n setUploading(false);\n }\n };\n\n const clear = () => {\n revoke();\n setPreview(null);\n setUri(null);\n };\n\n return { preview, uri, uploading, start, clear };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,mBAA4C;AAC5C,yBAAmC;AAE5B,SAAS,gBAAgB;AAC9B,QAAM,CAAC,SAAS,UAAU,QAAI,uBAAwB,IAAI;AAC1D,QAAM,CAAC,KAAK,MAAM,QAAI,uBAAwB,IAAI;AAClD,QAAM,CAAC,WAAW,YAAY,QAAI,uBAAS,KAAK;AAChD,QAAM,iBAAa,qBAAsB,IAAI;AAE7C,QAAM,SAAS,MAAM;AACnB,QAAI,WAAW,QAAS,KAAI,gBAAgB,WAAW,OAAO;AAC9D,eAAW,UAAU;AAAA,EACvB;AAEA,8BAAU,MAAM,QAAQ,CAAC,CAAC;AAE1B,QAAM,QAAQ,OAAO,MAAY,QAAyC,YAAuC;AAC/G,WAAO;AACP,UAAM,YAAY,IAAI,gBAAgB,IAAI;AAC1C,eAAW,UAAU;AACrB,eAAW,SAAS;AACpB,WAAO,IAAI;AACX,iBAAa,IAAI;AACjB,QAAI;AACF,aAAO,MAAM,OAAO,IAAI,CAAC;AAAA,IAC3B,SAAS,KAAK;AACZ,YAAM,YAAQ,uCAAmB,GAAG;AACpC,cAAQ,MAAM,eAAe,MAAM,KAAK;AAAA,IAC1C,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,QAAQ,MAAM;AAClB,WAAO;AACP,eAAW,IAAI;AACf,WAAO,IAAI;AAAA,EACb;AAEA,SAAO,EAAE,SAAS,KAAK,WAAW,OAAO,MAAM;AACjD;","names":[]}
@@ -0,0 +1,9 @@
1
+ declare function useIpfsUpload(): {
2
+ preview: string | null;
3
+ uri: string | null;
4
+ uploading: boolean;
5
+ start: (file: File, upload: (file: File) => Promise<string>, onError: (message: string) => void) => Promise<void>;
6
+ clear: () => void;
7
+ };
8
+
9
+ export { useIpfsUpload };
@@ -0,0 +1,9 @@
1
+ declare function useIpfsUpload(): {
2
+ preview: string | null;
3
+ uri: string | null;
4
+ uploading: boolean;
5
+ start: (file: File, upload: (file: File) => Promise<string>, onError: (message: string) => void) => Promise<void>;
6
+ clear: () => void;
7
+ };
8
+
9
+ export { useIpfsUpload };
@@ -0,0 +1,40 @@
1
+ "use client";
2
+ import { useEffect, useRef, useState } from "react";
3
+ import { uploadFailureToast } from "../../utils/ipfs-upload.js";
4
+ function useIpfsUpload() {
5
+ const [preview, setPreview] = useState(null);
6
+ const [uri, setUri] = useState(null);
7
+ const [uploading, setUploading] = useState(false);
8
+ const previewRef = useRef(null);
9
+ const revoke = () => {
10
+ if (previewRef.current) URL.revokeObjectURL(previewRef.current);
11
+ previewRef.current = null;
12
+ };
13
+ useEffect(() => revoke, []);
14
+ const start = async (file, upload, onError) => {
15
+ revoke();
16
+ const objectUrl = URL.createObjectURL(file);
17
+ previewRef.current = objectUrl;
18
+ setPreview(objectUrl);
19
+ setUri(null);
20
+ setUploading(true);
21
+ try {
22
+ setUri(await upload(file));
23
+ } catch (err) {
24
+ const toast = uploadFailureToast(err);
25
+ onError(toast.description ?? toast.title);
26
+ } finally {
27
+ setUploading(false);
28
+ }
29
+ };
30
+ const clear = () => {
31
+ revoke();
32
+ setPreview(null);
33
+ setUri(null);
34
+ };
35
+ return { preview, uri, uploading, start, clear };
36
+ }
37
+ export {
38
+ useIpfsUpload
39
+ };
40
+ //# sourceMappingURL=use-ipfs-upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/fast-mint/use-ipfs-upload.ts"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { uploadFailureToast } from \"../../utils/ipfs-upload.js\";\n\nexport function useIpfsUpload() {\n const [preview, setPreview] = useState<string | null>(null);\n const [uri, setUri] = useState<string | null>(null);\n const [uploading, setUploading] = useState(false);\n const previewRef = useRef<string | null>(null);\n\n const revoke = () => {\n if (previewRef.current) URL.revokeObjectURL(previewRef.current);\n previewRef.current = null;\n };\n\n useEffect(() => revoke, []);\n\n const start = async (file: File, upload: (file: File) => Promise<string>, onError: (message: string) => void) => {\n revoke();\n const objectUrl = URL.createObjectURL(file);\n previewRef.current = objectUrl;\n setPreview(objectUrl);\n setUri(null);\n setUploading(true);\n try {\n setUri(await upload(file));\n } catch (err) {\n const toast = uploadFailureToast(err);\n onError(toast.description ?? toast.title);\n } finally {\n setUploading(false);\n }\n };\n\n const clear = () => {\n revoke();\n setPreview(null);\n setUri(null);\n };\n\n return { preview, uri, uploading, start, clear };\n}\n"],"mappings":";AAEA,SAAS,WAAW,QAAQ,gBAAgB;AAC5C,SAAS,0BAA0B;AAE5B,SAAS,gBAAgB;AAC9B,QAAM,CAAC,SAAS,UAAU,IAAI,SAAwB,IAAI;AAC1D,QAAM,CAAC,KAAK,MAAM,IAAI,SAAwB,IAAI;AAClD,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAChD,QAAM,aAAa,OAAsB,IAAI;AAE7C,QAAM,SAAS,MAAM;AACnB,QAAI,WAAW,QAAS,KAAI,gBAAgB,WAAW,OAAO;AAC9D,eAAW,UAAU;AAAA,EACvB;AAEA,YAAU,MAAM,QAAQ,CAAC,CAAC;AAE1B,QAAM,QAAQ,OAAO,MAAY,QAAyC,YAAuC;AAC/G,WAAO;AACP,UAAM,YAAY,IAAI,gBAAgB,IAAI;AAC1C,eAAW,UAAU;AACrB,eAAW,SAAS;AACpB,WAAO,IAAI;AACX,iBAAa,IAAI;AACjB,QAAI;AACF,aAAO,MAAM,OAAO,IAAI,CAAC;AAAA,IAC3B,SAAS,KAAK;AACZ,YAAM,QAAQ,mBAAmB,GAAG;AACpC,cAAQ,MAAM,eAAe,MAAM,KAAK;AAAA,IAC1C,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,QAAQ,MAAM;AAClB,WAAO;AACP,eAAW,IAAI;AACf,WAAO,IAAI;AAAA,EACb;AAEA,SAAO,EAAE,SAAS,KAAK,WAAW,OAAO,MAAM;AACjD;","names":[]}
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ "use client";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+ var use_new_collection_draft_exports = {};
21
+ __export(use_new_collection_draft_exports, {
22
+ useNewCollectionDraft: () => useNewCollectionDraft
23
+ });
24
+ module.exports = __toCommonJS(use_new_collection_draft_exports);
25
+ var import_react = require("react");
26
+ var import_launchpad_defaults = require("../../utils/launchpad-defaults.js");
27
+ function useNewCollectionDraft(assetName, assetDescription) {
28
+ const [name, setName] = (0, import_react.useState)("");
29
+ const [symbol, setSymbol] = (0, import_react.useState)("");
30
+ const [description, setDescription] = (0, import_react.useState)("");
31
+ const [autoSymbol, setAutoSymbol] = (0, import_react.useState)("");
32
+ const [autoName, setAutoName] = (0, import_react.useState)("");
33
+ const [autoDescription, setAutoDescription] = (0, import_react.useState)("");
34
+ (0, import_react.useEffect)(() => {
35
+ const suggested = (0, import_launchpad_defaults.suggestLaunchpadSymbol)(assetName);
36
+ if (!suggested) return;
37
+ if (!symbol || symbol === autoSymbol) {
38
+ setSymbol(suggested);
39
+ setAutoSymbol(suggested);
40
+ }
41
+ if (!name || name === autoName) {
42
+ setName(assetName);
43
+ setAutoName(assetName);
44
+ }
45
+ }, [assetName, autoSymbol, autoName, symbol, name]);
46
+ (0, import_react.useEffect)(() => {
47
+ if (!description || description === autoDescription) {
48
+ setDescription(assetDescription);
49
+ setAutoDescription(assetDescription);
50
+ }
51
+ }, [assetDescription, autoDescription, description]);
52
+ const reset = () => {
53
+ setName("");
54
+ setSymbol("");
55
+ setDescription("");
56
+ setAutoSymbol("");
57
+ setAutoName("");
58
+ setAutoDescription("");
59
+ };
60
+ return { name, symbol, description, setName, setSymbol, setDescription, reset };
61
+ }
62
+ // Annotate the CommonJS export names for ESM import in node:
63
+ 0 && (module.exports = {
64
+ useNewCollectionDraft
65
+ });
66
+ //# sourceMappingURL=use-new-collection-draft.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/fast-mint/use-new-collection-draft.ts"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { suggestLaunchpadSymbol } from \"../../utils/launchpad-defaults.js\";\n\nexport function useNewCollectionDraft(assetName: string, assetDescription: string) {\n const [name, setName] = useState(\"\");\n const [symbol, setSymbol] = useState(\"\");\n const [description, setDescription] = useState(\"\");\n const [autoSymbol, setAutoSymbol] = useState(\"\");\n const [autoName, setAutoName] = useState(\"\");\n const [autoDescription, setAutoDescription] = useState(\"\");\n\n useEffect(() => {\n const suggested = suggestLaunchpadSymbol(assetName);\n if (!suggested) return;\n if (!symbol || symbol === autoSymbol) {\n setSymbol(suggested);\n setAutoSymbol(suggested);\n }\n if (!name || name === autoName) {\n setName(assetName);\n setAutoName(assetName);\n }\n }, [assetName, autoSymbol, autoName, symbol, name]);\n\n useEffect(() => {\n if (!description || description === autoDescription) {\n setDescription(assetDescription);\n setAutoDescription(assetDescription);\n }\n }, [assetDescription, autoDescription, description]);\n\n const reset = () => {\n setName(\"\");\n setSymbol(\"\");\n setDescription(\"\");\n setAutoSymbol(\"\");\n setAutoName(\"\");\n setAutoDescription(\"\");\n };\n\n return { name, symbol, description, setName, setSymbol, setDescription, reset };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,mBAAoC;AACpC,gCAAuC;AAEhC,SAAS,sBAAsB,WAAmB,kBAA0B;AACjF,QAAM,CAAC,MAAM,OAAO,QAAI,uBAAS,EAAE;AACnC,QAAM,CAAC,QAAQ,SAAS,QAAI,uBAAS,EAAE;AACvC,QAAM,CAAC,aAAa,cAAc,QAAI,uBAAS,EAAE;AACjD,QAAM,CAAC,YAAY,aAAa,QAAI,uBAAS,EAAE;AAC/C,QAAM,CAAC,UAAU,WAAW,QAAI,uBAAS,EAAE;AAC3C,QAAM,CAAC,iBAAiB,kBAAkB,QAAI,uBAAS,EAAE;AAEzD,8BAAU,MAAM;AACd,UAAM,gBAAY,kDAAuB,SAAS;AAClD,QAAI,CAAC,UAAW;AAChB,QAAI,CAAC,UAAU,WAAW,YAAY;AACpC,gBAAU,SAAS;AACnB,oBAAc,SAAS;AAAA,IACzB;AACA,QAAI,CAAC,QAAQ,SAAS,UAAU;AAC9B,cAAQ,SAAS;AACjB,kBAAY,SAAS;AAAA,IACvB;AAAA,EACF,GAAG,CAAC,WAAW,YAAY,UAAU,QAAQ,IAAI,CAAC;AAElD,8BAAU,MAAM;AACd,QAAI,CAAC,eAAe,gBAAgB,iBAAiB;AACnD,qBAAe,gBAAgB;AAC/B,yBAAmB,gBAAgB;AAAA,IACrC;AAAA,EACF,GAAG,CAAC,kBAAkB,iBAAiB,WAAW,CAAC;AAEnD,QAAM,QAAQ,MAAM;AAClB,YAAQ,EAAE;AACV,cAAU,EAAE;AACZ,mBAAe,EAAE;AACjB,kBAAc,EAAE;AAChB,gBAAY,EAAE;AACd,uBAAmB,EAAE;AAAA,EACvB;AAEA,SAAO,EAAE,MAAM,QAAQ,aAAa,SAAS,WAAW,gBAAgB,MAAM;AAChF;","names":[]}
@@ -0,0 +1,13 @@
1
+ import * as React from 'react';
2
+
3
+ declare function useNewCollectionDraft(assetName: string, assetDescription: string): {
4
+ name: string;
5
+ symbol: string;
6
+ description: string;
7
+ setName: React.Dispatch<React.SetStateAction<string>>;
8
+ setSymbol: React.Dispatch<React.SetStateAction<string>>;
9
+ setDescription: React.Dispatch<React.SetStateAction<string>>;
10
+ reset: () => void;
11
+ };
12
+
13
+ export { useNewCollectionDraft };
@@ -0,0 +1,13 @@
1
+ import * as React from 'react';
2
+
3
+ declare function useNewCollectionDraft(assetName: string, assetDescription: string): {
4
+ name: string;
5
+ symbol: string;
6
+ description: string;
7
+ setName: React.Dispatch<React.SetStateAction<string>>;
8
+ setSymbol: React.Dispatch<React.SetStateAction<string>>;
9
+ setDescription: React.Dispatch<React.SetStateAction<string>>;
10
+ reset: () => void;
11
+ };
12
+
13
+ export { useNewCollectionDraft };
@@ -0,0 +1,42 @@
1
+ "use client";
2
+ import { useEffect, useState } from "react";
3
+ import { suggestLaunchpadSymbol } from "../../utils/launchpad-defaults.js";
4
+ function useNewCollectionDraft(assetName, assetDescription) {
5
+ const [name, setName] = useState("");
6
+ const [symbol, setSymbol] = useState("");
7
+ const [description, setDescription] = useState("");
8
+ const [autoSymbol, setAutoSymbol] = useState("");
9
+ const [autoName, setAutoName] = useState("");
10
+ const [autoDescription, setAutoDescription] = useState("");
11
+ useEffect(() => {
12
+ const suggested = suggestLaunchpadSymbol(assetName);
13
+ if (!suggested) return;
14
+ if (!symbol || symbol === autoSymbol) {
15
+ setSymbol(suggested);
16
+ setAutoSymbol(suggested);
17
+ }
18
+ if (!name || name === autoName) {
19
+ setName(assetName);
20
+ setAutoName(assetName);
21
+ }
22
+ }, [assetName, autoSymbol, autoName, symbol, name]);
23
+ useEffect(() => {
24
+ if (!description || description === autoDescription) {
25
+ setDescription(assetDescription);
26
+ setAutoDescription(assetDescription);
27
+ }
28
+ }, [assetDescription, autoDescription, description]);
29
+ const reset = () => {
30
+ setName("");
31
+ setSymbol("");
32
+ setDescription("");
33
+ setAutoSymbol("");
34
+ setAutoName("");
35
+ setAutoDescription("");
36
+ };
37
+ return { name, symbol, description, setName, setSymbol, setDescription, reset };
38
+ }
39
+ export {
40
+ useNewCollectionDraft
41
+ };
42
+ //# sourceMappingURL=use-new-collection-draft.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/fast-mint/use-new-collection-draft.ts"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { suggestLaunchpadSymbol } from \"../../utils/launchpad-defaults.js\";\n\nexport function useNewCollectionDraft(assetName: string, assetDescription: string) {\n const [name, setName] = useState(\"\");\n const [symbol, setSymbol] = useState(\"\");\n const [description, setDescription] = useState(\"\");\n const [autoSymbol, setAutoSymbol] = useState(\"\");\n const [autoName, setAutoName] = useState(\"\");\n const [autoDescription, setAutoDescription] = useState(\"\");\n\n useEffect(() => {\n const suggested = suggestLaunchpadSymbol(assetName);\n if (!suggested) return;\n if (!symbol || symbol === autoSymbol) {\n setSymbol(suggested);\n setAutoSymbol(suggested);\n }\n if (!name || name === autoName) {\n setName(assetName);\n setAutoName(assetName);\n }\n }, [assetName, autoSymbol, autoName, symbol, name]);\n\n useEffect(() => {\n if (!description || description === autoDescription) {\n setDescription(assetDescription);\n setAutoDescription(assetDescription);\n }\n }, [assetDescription, autoDescription, description]);\n\n const reset = () => {\n setName(\"\");\n setSymbol(\"\");\n setDescription(\"\");\n setAutoSymbol(\"\");\n setAutoName(\"\");\n setAutoDescription(\"\");\n };\n\n return { name, symbol, description, setName, setSymbol, setDescription, reset };\n}\n"],"mappings":";AAEA,SAAS,WAAW,gBAAgB;AACpC,SAAS,8BAA8B;AAEhC,SAAS,sBAAsB,WAAmB,kBAA0B;AACjF,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,EAAE;AACnC,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,EAAE;AACvC,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,EAAE;AACjD,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,EAAE;AAC/C,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,EAAE;AAC3C,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAS,EAAE;AAEzD,YAAU,MAAM;AACd,UAAM,YAAY,uBAAuB,SAAS;AAClD,QAAI,CAAC,UAAW;AAChB,QAAI,CAAC,UAAU,WAAW,YAAY;AACpC,gBAAU,SAAS;AACnB,oBAAc,SAAS;AAAA,IACzB;AACA,QAAI,CAAC,QAAQ,SAAS,UAAU;AAC9B,cAAQ,SAAS;AACjB,kBAAY,SAAS;AAAA,IACvB;AAAA,EACF,GAAG,CAAC,WAAW,YAAY,UAAU,QAAQ,IAAI,CAAC;AAElD,YAAU,MAAM;AACd,QAAI,CAAC,eAAe,gBAAgB,iBAAiB;AACnD,qBAAe,gBAAgB;AAC/B,yBAAmB,gBAAgB;AAAA,IACrC;AAAA,EACF,GAAG,CAAC,kBAAkB,iBAAiB,WAAW,CAAC;AAEnD,QAAM,QAAQ,MAAM;AAClB,YAAQ,EAAE;AACV,cAAU,EAAE;AACZ,mBAAe,EAAE;AACjB,kBAAc,EAAE;AAChB,gBAAY,EAAE;AACd,uBAAmB,EAAE;AAAA,EACvB;AAEA,SAAO,EAAE,MAAM,QAAQ,aAAa,SAAS,WAAW,gBAAgB,MAAM;AAChF;","names":[]}
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ "use client";
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __export = (target, all) => {
10
+ for (var name in all)
11
+ __defProp(target, name, { get: all[name], enumerable: true });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from))
16
+ if (!__hasOwnProp.call(to, key) && key !== except)
17
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
18
+ }
19
+ return to;
20
+ };
21
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
22
+ // If the importer is in node compatibility mode or this is not an ESM
23
+ // file that has been converted to a CommonJS file using a Babel-
24
+ // compatible transform (i.e. "__esModule" has not been set), then set
25
+ // "default" to the CommonJS "module.exports" for node compatibility.
26
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
27
+ mod
28
+ ));
29
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
+ var soulbound_card_exports = {};
31
+ __export(soulbound_card_exports, {
32
+ SoulboundCard: () => SoulboundCard,
33
+ issuedAt: () => issuedAt
34
+ });
35
+ module.exports = __toCommonJS(soulbound_card_exports);
36
+ var import_jsx_runtime = require("react/jsx-runtime");
37
+ var import_image = __toESM(require("next/image"), 1);
38
+ var import_lucide_react = require("lucide-react");
39
+ var import_brand = require("../data/brand.js");
40
+ var import_address_display = require("./address-display.js");
41
+ var import_link = __toESM(require("./link.js"), 1);
42
+ function issuedAt(history) {
43
+ const times = history.filter((event) => event.type === "mint").map((event) => new Date(event.timestamp).getTime()).filter((time) => Number.isFinite(time));
44
+ if (times.length === 0) return null;
45
+ return new Date(Math.min(...times)).toLocaleDateString("en-US", { day: "numeric", month: "short", year: "numeric" });
46
+ }
47
+ function SoulboundCard({ image, ownerAddress, ownerHref, history = [] }) {
48
+ const issued = issuedAt(history);
49
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("section", { "aria-label": "Soulbound asset", className: "rounded-2xl p-px", style: { background: import_brand.BRAND_GRADIENT }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-4 rounded-[15px] bg-card p-5", children: [
50
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
51
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h3", { className: "text-sm font-semibold text-foreground", children: "Soulbound asset" }),
52
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "mt-0.5 text-xs text-muted-foreground", children: "Permanently linked to the wallet it was issued to, verifiable on-chain." })
53
+ ] }),
54
+ ownerAddress ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-3", children: [
55
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "relative h-12 w-12 shrink-0 overflow-hidden rounded-xl bg-muted", children: image ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_image.default, { src: image, alt: "", fill: true, className: "object-cover", unoptimized: true }) : null }),
56
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "relative h-px min-w-6 flex-1", style: { background: import_brand.BRAND_GRADIENT }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "absolute left-1/2 top-1/2 flex h-8 w-8 -translate-x-1/2 -translate-y-1/2 items-center justify-center rounded-full border border-border bg-card shadow-[0_0_18px_hsl(var(--brand-purple)/0.45)] animate-pulse-glow", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Lock, { className: "h-3.5 w-3.5 text-brand-purple" }) }) }),
57
+ ownerHref ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: ownerHref, className: "shrink-0 rounded-full border border-border px-3 py-1.5 text-xs font-medium transition-colors hover:text-primary", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_address_display.AddressDisplay, { address: ownerAddress }) }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "shrink-0 rounded-full border border-border px-3 py-1.5 text-xs font-medium", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_address_display.AddressDisplay, { address: ownerAddress }) })
58
+ ] }) : null,
59
+ issued ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", { className: "text-2xs text-muted-foreground", children: [
60
+ "Issued ",
61
+ issued
62
+ ] }) : null
63
+ ] }) });
64
+ }
65
+ // Annotate the CommonJS export names for ESM import in node:
66
+ 0 && (module.exports = {
67
+ SoulboundCard,
68
+ issuedAt
69
+ });
70
+ //# sourceMappingURL=soulbound-card.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/soulbound-card.tsx"],"sourcesContent":["\"use client\";\n\nimport Image from \"next/image\";\nimport { Lock } from \"lucide-react\";\nimport type { ApiActivity } from \"@medialane/sdk\";\nimport { BRAND_GRADIENT } from \"../data/brand.js\";\nimport { AddressDisplay } from \"./address-display.js\";\nimport Link from \"./link.js\";\n\nexport function issuedAt(history: readonly ApiActivity[]): string | null {\n const times = history\n .filter((event) => event.type === \"mint\")\n .map((event) => new Date(event.timestamp).getTime())\n .filter((time) => Number.isFinite(time));\n if (times.length === 0) return null;\n return new Date(Math.min(...times)).toLocaleDateString(\"en-US\", { day: \"numeric\", month: \"short\", year: \"numeric\" });\n}\n\nexport interface SoulboundCardProps {\n image?: string | null;\n ownerAddress?: string | null;\n ownerHref?: string;\n history?: readonly ApiActivity[];\n}\n\nexport function SoulboundCard({ image, ownerAddress, ownerHref, history = [] }: SoulboundCardProps) {\n const issued = issuedAt(history);\n return (\n <section aria-label=\"Soulbound asset\" className=\"rounded-2xl p-px\" style={{ background: BRAND_GRADIENT }}>\n <div className=\"space-y-4 rounded-[15px] bg-card p-5\">\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">Soulbound asset</h3>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">Permanently linked to the wallet it was issued to, verifiable on-chain.</p>\n </div>\n\n {ownerAddress ? (\n <div className=\"flex items-center gap-3\">\n <div className=\"relative h-12 w-12 shrink-0 overflow-hidden rounded-xl bg-muted\">\n {image ? <Image src={image} alt=\"\" fill className=\"object-cover\" unoptimized /> : null}\n </div>\n <div className=\"relative h-px min-w-6 flex-1\" style={{ background: BRAND_GRADIENT }}>\n <span className=\"absolute left-1/2 top-1/2 flex h-8 w-8 -translate-x-1/2 -translate-y-1/2 items-center justify-center rounded-full border border-border bg-card shadow-[0_0_18px_hsl(var(--brand-purple)/0.45)] animate-pulse-glow\">\n <Lock className=\"h-3.5 w-3.5 text-brand-purple\" />\n </span>\n </div>\n {ownerHref ? (\n <Link href={ownerHref} className=\"shrink-0 rounded-full border border-border px-3 py-1.5 text-xs font-medium transition-colors hover:text-primary\">\n <AddressDisplay address={ownerAddress} />\n </Link>\n ) : (\n <span className=\"shrink-0 rounded-full border border-border px-3 py-1.5 text-xs font-medium\">\n <AddressDisplay address={ownerAddress} />\n </span>\n )}\n </div>\n ) : null}\n\n {issued ? <p className=\"text-2xs text-muted-foreground\">Issued {issued}</p> : null}\n </div>\n </section>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8BQ;AA5BR,mBAAkB;AAClB,0BAAqB;AAErB,mBAA+B;AAC/B,6BAA+B;AAC/B,kBAAiB;AAEV,SAAS,SAAS,SAAgD;AACvE,QAAM,QAAQ,QACX,OAAO,CAAC,UAAU,MAAM,SAAS,MAAM,EACvC,IAAI,CAAC,UAAU,IAAI,KAAK,MAAM,SAAS,EAAE,QAAQ,CAAC,EAClD,OAAO,CAAC,SAAS,OAAO,SAAS,IAAI,CAAC;AACzC,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,SAAO,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,CAAC,EAAE,mBAAmB,SAAS,EAAE,KAAK,WAAW,OAAO,SAAS,MAAM,UAAU,CAAC;AACrH;AASO,SAAS,cAAc,EAAE,OAAO,cAAc,WAAW,UAAU,CAAC,EAAE,GAAuB;AAClG,QAAM,SAAS,SAAS,OAAO;AAC/B,SACE,4CAAC,aAAQ,cAAW,mBAAkB,WAAU,oBAAmB,OAAO,EAAE,YAAY,4BAAe,GACrG,uDAAC,SAAI,WAAU,wCACb;AAAA,iDAAC,SACC;AAAA,kDAAC,QAAG,WAAU,yCAAwC,6BAAe;AAAA,MACrE,4CAAC,OAAE,WAAU,wCAAuC,qFAAuE;AAAA,OAC7H;AAAA,IAEC,eACC,6CAAC,SAAI,WAAU,2BACb;AAAA,kDAAC,SAAI,WAAU,mEACZ,kBAAQ,4CAAC,aAAAA,SAAA,EAAM,KAAK,OAAO,KAAI,IAAG,MAAI,MAAC,WAAU,gBAAe,aAAW,MAAC,IAAK,MACpF;AAAA,MACA,4CAAC,SAAI,WAAU,gCAA+B,OAAO,EAAE,YAAY,4BAAe,GAChF,sDAAC,UAAK,WAAU,qNACd,sDAAC,4BAAK,WAAU,iCAAgC,GAClD,GACF;AAAA,MACC,YACC,4CAAC,YAAAC,SAAA,EAAK,MAAM,WAAW,WAAU,mHAC/B,sDAAC,yCAAe,SAAS,cAAc,GACzC,IAEA,4CAAC,UAAK,WAAU,8EACd,sDAAC,yCAAe,SAAS,cAAc,GACzC;AAAA,OAEJ,IACE;AAAA,IAEH,SAAS,6CAAC,OAAE,WAAU,kCAAiC;AAAA;AAAA,MAAQ;AAAA,OAAO,IAAO;AAAA,KAChF,GACF;AAEJ;","names":["Image","Link"]}
@@ -0,0 +1,13 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ApiActivity } from '@medialane/sdk';
3
+
4
+ declare function issuedAt(history: readonly ApiActivity[]): string | null;
5
+ interface SoulboundCardProps {
6
+ image?: string | null;
7
+ ownerAddress?: string | null;
8
+ ownerHref?: string;
9
+ history?: readonly ApiActivity[];
10
+ }
11
+ declare function SoulboundCard({ image, ownerAddress, ownerHref, history }: SoulboundCardProps): react_jsx_runtime.JSX.Element;
12
+
13
+ export { SoulboundCard, type SoulboundCardProps, issuedAt };
@@ -0,0 +1,13 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ApiActivity } from '@medialane/sdk';
3
+
4
+ declare function issuedAt(history: readonly ApiActivity[]): string | null;
5
+ interface SoulboundCardProps {
6
+ image?: string | null;
7
+ ownerAddress?: string | null;
8
+ ownerHref?: string;
9
+ history?: readonly ApiActivity[];
10
+ }
11
+ declare function SoulboundCard({ image, ownerAddress, ownerHref, history }: SoulboundCardProps): react_jsx_runtime.JSX.Element;
12
+
13
+ export { SoulboundCard, type SoulboundCardProps, issuedAt };
@@ -0,0 +1,35 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import Image from "next/image";
4
+ import { Lock } from "lucide-react";
5
+ import { BRAND_GRADIENT } from "../data/brand.js";
6
+ import { AddressDisplay } from "./address-display.js";
7
+ import Link from "./link.js";
8
+ function issuedAt(history) {
9
+ const times = history.filter((event) => event.type === "mint").map((event) => new Date(event.timestamp).getTime()).filter((time) => Number.isFinite(time));
10
+ if (times.length === 0) return null;
11
+ return new Date(Math.min(...times)).toLocaleDateString("en-US", { day: "numeric", month: "short", year: "numeric" });
12
+ }
13
+ function SoulboundCard({ image, ownerAddress, ownerHref, history = [] }) {
14
+ const issued = issuedAt(history);
15
+ return /* @__PURE__ */ jsx("section", { "aria-label": "Soulbound asset", className: "rounded-2xl p-px", style: { background: BRAND_GRADIENT }, children: /* @__PURE__ */ jsxs("div", { className: "space-y-4 rounded-[15px] bg-card p-5", children: [
16
+ /* @__PURE__ */ jsxs("div", { children: [
17
+ /* @__PURE__ */ jsx("h3", { className: "text-sm font-semibold text-foreground", children: "Soulbound asset" }),
18
+ /* @__PURE__ */ jsx("p", { className: "mt-0.5 text-xs text-muted-foreground", children: "Permanently linked to the wallet it was issued to, verifiable on-chain." })
19
+ ] }),
20
+ ownerAddress ? /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
21
+ /* @__PURE__ */ jsx("div", { className: "relative h-12 w-12 shrink-0 overflow-hidden rounded-xl bg-muted", children: image ? /* @__PURE__ */ jsx(Image, { src: image, alt: "", fill: true, className: "object-cover", unoptimized: true }) : null }),
22
+ /* @__PURE__ */ jsx("div", { className: "relative h-px min-w-6 flex-1", style: { background: BRAND_GRADIENT }, children: /* @__PURE__ */ jsx("span", { className: "absolute left-1/2 top-1/2 flex h-8 w-8 -translate-x-1/2 -translate-y-1/2 items-center justify-center rounded-full border border-border bg-card shadow-[0_0_18px_hsl(var(--brand-purple)/0.45)] animate-pulse-glow", children: /* @__PURE__ */ jsx(Lock, { className: "h-3.5 w-3.5 text-brand-purple" }) }) }),
23
+ ownerHref ? /* @__PURE__ */ jsx(Link, { href: ownerHref, className: "shrink-0 rounded-full border border-border px-3 py-1.5 text-xs font-medium transition-colors hover:text-primary", children: /* @__PURE__ */ jsx(AddressDisplay, { address: ownerAddress }) }) : /* @__PURE__ */ jsx("span", { className: "shrink-0 rounded-full border border-border px-3 py-1.5 text-xs font-medium", children: /* @__PURE__ */ jsx(AddressDisplay, { address: ownerAddress }) })
24
+ ] }) : null,
25
+ issued ? /* @__PURE__ */ jsxs("p", { className: "text-2xs text-muted-foreground", children: [
26
+ "Issued ",
27
+ issued
28
+ ] }) : null
29
+ ] }) });
30
+ }
31
+ export {
32
+ SoulboundCard,
33
+ issuedAt
34
+ };
35
+ //# sourceMappingURL=soulbound-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/soulbound-card.tsx"],"sourcesContent":["\"use client\";\n\nimport Image from \"next/image\";\nimport { Lock } from \"lucide-react\";\nimport type { ApiActivity } from \"@medialane/sdk\";\nimport { BRAND_GRADIENT } from \"../data/brand.js\";\nimport { AddressDisplay } from \"./address-display.js\";\nimport Link from \"./link.js\";\n\nexport function issuedAt(history: readonly ApiActivity[]): string | null {\n const times = history\n .filter((event) => event.type === \"mint\")\n .map((event) => new Date(event.timestamp).getTime())\n .filter((time) => Number.isFinite(time));\n if (times.length === 0) return null;\n return new Date(Math.min(...times)).toLocaleDateString(\"en-US\", { day: \"numeric\", month: \"short\", year: \"numeric\" });\n}\n\nexport interface SoulboundCardProps {\n image?: string | null;\n ownerAddress?: string | null;\n ownerHref?: string;\n history?: readonly ApiActivity[];\n}\n\nexport function SoulboundCard({ image, ownerAddress, ownerHref, history = [] }: SoulboundCardProps) {\n const issued = issuedAt(history);\n return (\n <section aria-label=\"Soulbound asset\" className=\"rounded-2xl p-px\" style={{ background: BRAND_GRADIENT }}>\n <div className=\"space-y-4 rounded-[15px] bg-card p-5\">\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">Soulbound asset</h3>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">Permanently linked to the wallet it was issued to, verifiable on-chain.</p>\n </div>\n\n {ownerAddress ? (\n <div className=\"flex items-center gap-3\">\n <div className=\"relative h-12 w-12 shrink-0 overflow-hidden rounded-xl bg-muted\">\n {image ? <Image src={image} alt=\"\" fill className=\"object-cover\" unoptimized /> : null}\n </div>\n <div className=\"relative h-px min-w-6 flex-1\" style={{ background: BRAND_GRADIENT }}>\n <span className=\"absolute left-1/2 top-1/2 flex h-8 w-8 -translate-x-1/2 -translate-y-1/2 items-center justify-center rounded-full border border-border bg-card shadow-[0_0_18px_hsl(var(--brand-purple)/0.45)] animate-pulse-glow\">\n <Lock className=\"h-3.5 w-3.5 text-brand-purple\" />\n </span>\n </div>\n {ownerHref ? (\n <Link href={ownerHref} className=\"shrink-0 rounded-full border border-border px-3 py-1.5 text-xs font-medium transition-colors hover:text-primary\">\n <AddressDisplay address={ownerAddress} />\n </Link>\n ) : (\n <span className=\"shrink-0 rounded-full border border-border px-3 py-1.5 text-xs font-medium\">\n <AddressDisplay address={ownerAddress} />\n </span>\n )}\n </div>\n ) : null}\n\n {issued ? <p className=\"text-2xs text-muted-foreground\">Issued {issued}</p> : null}\n </div>\n </section>\n );\n}\n"],"mappings":";AA8BQ,SACE,KADF;AA5BR,OAAO,WAAW;AAClB,SAAS,YAAY;AAErB,SAAS,sBAAsB;AAC/B,SAAS,sBAAsB;AAC/B,OAAO,UAAU;AAEV,SAAS,SAAS,SAAgD;AACvE,QAAM,QAAQ,QACX,OAAO,CAAC,UAAU,MAAM,SAAS,MAAM,EACvC,IAAI,CAAC,UAAU,IAAI,KAAK,MAAM,SAAS,EAAE,QAAQ,CAAC,EAClD,OAAO,CAAC,SAAS,OAAO,SAAS,IAAI,CAAC;AACzC,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,SAAO,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,CAAC,EAAE,mBAAmB,SAAS,EAAE,KAAK,WAAW,OAAO,SAAS,MAAM,UAAU,CAAC;AACrH;AASO,SAAS,cAAc,EAAE,OAAO,cAAc,WAAW,UAAU,CAAC,EAAE,GAAuB;AAClG,QAAM,SAAS,SAAS,OAAO;AAC/B,SACE,oBAAC,aAAQ,cAAW,mBAAkB,WAAU,oBAAmB,OAAO,EAAE,YAAY,eAAe,GACrG,+BAAC,SAAI,WAAU,wCACb;AAAA,yBAAC,SACC;AAAA,0BAAC,QAAG,WAAU,yCAAwC,6BAAe;AAAA,MACrE,oBAAC,OAAE,WAAU,wCAAuC,qFAAuE;AAAA,OAC7H;AAAA,IAEC,eACC,qBAAC,SAAI,WAAU,2BACb;AAAA,0BAAC,SAAI,WAAU,mEACZ,kBAAQ,oBAAC,SAAM,KAAK,OAAO,KAAI,IAAG,MAAI,MAAC,WAAU,gBAAe,aAAW,MAAC,IAAK,MACpF;AAAA,MACA,oBAAC,SAAI,WAAU,gCAA+B,OAAO,EAAE,YAAY,eAAe,GAChF,8BAAC,UAAK,WAAU,qNACd,8BAAC,QAAK,WAAU,iCAAgC,GAClD,GACF;AAAA,MACC,YACC,oBAAC,QAAK,MAAM,WAAW,WAAU,mHAC/B,8BAAC,kBAAe,SAAS,cAAc,GACzC,IAEA,oBAAC,UAAK,WAAU,8EACd,8BAAC,kBAAe,SAAS,cAAc,GACzC;AAAA,OAEJ,IACE;AAAA,IAEH,SAAS,qBAAC,OAAE,WAAU,kCAAiC;AAAA;AAAA,MAAQ;AAAA,OAAO,IAAO;AAAA,KAChF,GACF;AAEJ;","names":[]}