@medialane/ui 0.183.0 → 0.185.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 (259) hide show
  1. package/dist/components/drop/create/artwork-section.cjs +115 -0
  2. package/dist/components/drop/create/artwork-section.cjs.map +1 -0
  3. package/dist/components/drop/create/artwork-section.d.cts +23 -0
  4. package/dist/components/drop/create/artwork-section.d.ts +23 -0
  5. package/dist/components/drop/create/artwork-section.js +79 -0
  6. package/dist/components/drop/create/artwork-section.js.map +1 -0
  7. package/dist/components/drop/create/details-section.cjs +110 -0
  8. package/dist/components/drop/create/details-section.cjs.map +1 -0
  9. package/dist/components/drop/create/details-section.d.cts +11 -0
  10. package/dist/components/drop/create/details-section.d.ts +11 -0
  11. package/dist/components/drop/create/details-section.js +86 -0
  12. package/dist/components/drop/create/details-section.js.map +1 -0
  13. package/dist/components/drop/create/drop-create.cjs +114 -0
  14. package/dist/components/drop/create/drop-create.cjs.map +1 -0
  15. package/dist/components/drop/create/drop-create.d.cts +20 -0
  16. package/dist/components/drop/create/drop-create.d.ts +20 -0
  17. package/dist/components/drop/create/drop-create.js +79 -0
  18. package/dist/components/drop/create/drop-create.js.map +1 -0
  19. package/dist/components/drop/create/exclusive-fields.cjs +45 -0
  20. package/dist/components/drop/create/exclusive-fields.cjs.map +1 -0
  21. package/dist/components/drop/create/exclusive-fields.d.cts +14 -0
  22. package/dist/components/drop/create/exclusive-fields.d.ts +14 -0
  23. package/dist/components/drop/create/exclusive-fields.js +21 -0
  24. package/dist/components/drop/create/exclusive-fields.js.map +1 -0
  25. package/dist/components/drop/create/launch-dialog.cjs +196 -0
  26. package/dist/components/drop/create/launch-dialog.cjs.map +1 -0
  27. package/dist/components/drop/create/launch-dialog.d.cts +21 -0
  28. package/dist/components/drop/create/launch-dialog.d.ts +21 -0
  29. package/dist/components/drop/create/launch-dialog.js +171 -0
  30. package/dist/components/drop/create/launch-dialog.js.map +1 -0
  31. package/dist/components/drop/create/list-section.cjs +67 -0
  32. package/dist/components/drop/create/list-section.cjs.map +1 -0
  33. package/dist/components/drop/create/list-section.d.cts +11 -0
  34. package/dist/components/drop/create/list-section.d.ts +11 -0
  35. package/dist/components/drop/create/list-section.js +43 -0
  36. package/dist/components/drop/create/list-section.js.map +1 -0
  37. package/dist/components/drop/create/sale-section.cjs +78 -0
  38. package/dist/components/drop/create/sale-section.cjs.map +1 -0
  39. package/dist/components/drop/create/sale-section.d.cts +13 -0
  40. package/dist/components/drop/create/sale-section.d.ts +13 -0
  41. package/dist/components/drop/create/sale-section.js +54 -0
  42. package/dist/components/drop/create/sale-section.js.map +1 -0
  43. package/dist/components/drop/drop-card.cjs +81 -0
  44. package/dist/components/drop/drop-card.cjs.map +1 -0
  45. package/dist/components/drop/drop-card.d.cts +18 -0
  46. package/dist/components/drop/drop-card.d.ts +18 -0
  47. package/dist/components/drop/drop-card.js +45 -0
  48. package/dist/components/drop/drop-card.js.map +1 -0
  49. package/dist/components/drop/drop-features.cjs +44 -0
  50. package/dist/components/drop/drop-features.cjs.map +1 -0
  51. package/dist/components/drop/drop-features.d.cts +5 -0
  52. package/dist/components/drop/drop-features.d.ts +5 -0
  53. package/dist/components/drop/drop-features.js +20 -0
  54. package/dist/components/drop/drop-features.js.map +1 -0
  55. package/dist/components/drop/drop-listing.cjs +79 -0
  56. package/dist/components/drop/drop-listing.cjs.map +1 -0
  57. package/dist/components/drop/drop-listing.d.cts +10 -0
  58. package/dist/components/drop/drop-listing.d.ts +10 -0
  59. package/dist/components/drop/drop-listing.js +45 -0
  60. package/dist/components/drop/drop-listing.js.map +1 -0
  61. package/dist/components/{drop-status-display.cjs → drop/drop-status.cjs} +12 -43
  62. package/dist/components/drop/drop-status.cjs.map +1 -0
  63. package/dist/components/drop/drop-status.d.cts +13 -0
  64. package/dist/components/drop/drop-status.d.ts +13 -0
  65. package/dist/components/drop/drop-status.js +47 -0
  66. package/dist/components/drop/drop-status.js.map +1 -0
  67. package/dist/components/drop/drop-token-link.cjs +63 -0
  68. package/dist/components/drop/drop-token-link.cjs.map +1 -0
  69. package/dist/components/drop/drop-token-link.d.cts +9 -0
  70. package/dist/components/drop/drop-token-link.d.ts +9 -0
  71. package/dist/components/drop/drop-token-link.js +29 -0
  72. package/dist/components/drop/drop-token-link.js.map +1 -0
  73. package/dist/components/drop/my-drops.cjs +71 -0
  74. package/dist/components/drop/my-drops.cjs.map +1 -0
  75. package/dist/components/drop/my-drops.d.cts +12 -0
  76. package/dist/components/drop/my-drops.d.ts +12 -0
  77. package/dist/components/drop/my-drops.js +37 -0
  78. package/dist/components/drop/my-drops.js.map +1 -0
  79. package/dist/components/drop/page/drop-action-box.cjs +63 -0
  80. package/dist/components/drop/page/drop-action-box.cjs.map +1 -0
  81. package/dist/components/drop/page/drop-action-box.d.cts +15 -0
  82. package/dist/components/drop/page/drop-action-box.d.ts +15 -0
  83. package/dist/components/drop/page/drop-action-box.js +39 -0
  84. package/dist/components/drop/page/drop-action-box.js.map +1 -0
  85. package/dist/components/drop/page/drop-activity.cjs +42 -0
  86. package/dist/components/drop/page/drop-activity.cjs.map +1 -0
  87. package/dist/components/drop/page/drop-activity.d.cts +8 -0
  88. package/dist/components/drop/page/drop-activity.d.ts +8 -0
  89. package/dist/components/drop/page/drop-activity.js +18 -0
  90. package/dist/components/drop/page/drop-activity.js.map +1 -0
  91. package/dist/components/drop/page/drop-manage.cjs +161 -0
  92. package/dist/components/drop/page/drop-manage.cjs.map +1 -0
  93. package/dist/components/drop/page/drop-manage.d.cts +24 -0
  94. package/dist/components/drop/page/drop-manage.d.ts +24 -0
  95. package/dist/components/drop/page/drop-manage.js +137 -0
  96. package/dist/components/drop/page/drop-manage.js.map +1 -0
  97. package/dist/components/drop/page/drop-mint-dialog.cjs +97 -0
  98. package/dist/components/drop/page/drop-mint-dialog.cjs.map +1 -0
  99. package/dist/components/drop/page/drop-mint-dialog.d.cts +15 -0
  100. package/dist/components/drop/page/drop-mint-dialog.d.ts +15 -0
  101. package/dist/components/drop/page/drop-mint-dialog.js +73 -0
  102. package/dist/components/drop/page/drop-mint-dialog.js.map +1 -0
  103. package/dist/components/drop/page/drop-page.cjs +167 -0
  104. package/dist/components/drop/page/drop-page.cjs.map +1 -0
  105. package/dist/components/drop/page/drop-page.d.cts +15 -0
  106. package/dist/components/drop/page/drop-page.d.ts +15 -0
  107. package/dist/components/drop/page/drop-page.js +133 -0
  108. package/dist/components/drop/page/drop-page.js.map +1 -0
  109. package/dist/components/image.d.cts +2 -0
  110. package/dist/components/image.d.ts +2 -0
  111. package/dist/index.cjs +54 -30
  112. package/dist/index.cjs.map +1 -1
  113. package/dist/index.d.cts +21 -11
  114. package/dist/index.d.ts +21 -11
  115. package/dist/index.js +34 -25
  116. package/dist/index.js.map +1 -1
  117. package/dist/utils/drop/actions.cjs +76 -0
  118. package/dist/utils/drop/actions.cjs.map +1 -0
  119. package/dist/utils/drop/actions.d.cts +46 -0
  120. package/dist/utils/drop/actions.d.ts +46 -0
  121. package/dist/utils/drop/actions.js +49 -0
  122. package/dist/utils/drop/actions.js.map +1 -0
  123. package/dist/utils/drop/allowlist.cjs +50 -0
  124. package/dist/utils/drop/allowlist.cjs.map +1 -0
  125. package/dist/utils/drop/allowlist.d.cts +10 -0
  126. package/dist/utils/drop/allowlist.d.ts +10 -0
  127. package/dist/utils/drop/allowlist.js +26 -0
  128. package/dist/utils/drop/allowlist.js.map +1 -0
  129. package/dist/utils/drop/chain.cjs +37 -0
  130. package/dist/utils/drop/chain.cjs.map +1 -0
  131. package/dist/utils/drop/chain.d.cts +5 -0
  132. package/dist/utils/drop/chain.d.ts +5 -0
  133. package/dist/utils/drop/chain.js +13 -0
  134. package/dist/utils/drop/chain.js.map +1 -0
  135. package/dist/utils/drop/claim-proof.cjs +48 -0
  136. package/dist/utils/drop/claim-proof.cjs.map +1 -0
  137. package/dist/utils/drop/claim-proof.d.cts +9 -0
  138. package/dist/utils/drop/claim-proof.d.ts +9 -0
  139. package/dist/utils/drop/claim-proof.js +24 -0
  140. package/dist/utils/drop/claim-proof.js.map +1 -0
  141. package/dist/utils/drop/draft.cjs +87 -0
  142. package/dist/utils/drop/draft.cjs.map +1 -0
  143. package/dist/utils/drop/draft.d.cts +32 -0
  144. package/dist/utils/drop/draft.d.ts +32 -0
  145. package/dist/utils/drop/draft.js +61 -0
  146. package/dist/utils/drop/draft.js.map +1 -0
  147. package/dist/utils/drop/metadata.cjs +70 -0
  148. package/dist/utils/drop/metadata.cjs.map +1 -0
  149. package/dist/utils/drop/metadata.d.cts +34 -0
  150. package/dist/utils/drop/metadata.d.ts +34 -0
  151. package/dist/utils/drop/metadata.js +43 -0
  152. package/dist/utils/drop/metadata.js.map +1 -0
  153. package/dist/utils/{drop-status.cjs → drop/preview.cjs} +14 -14
  154. package/dist/utils/drop/preview.cjs.map +1 -0
  155. package/dist/utils/drop/preview.d.cts +4 -0
  156. package/dist/utils/drop/preview.d.ts +4 -0
  157. package/dist/utils/drop/preview.js +13 -0
  158. package/dist/utils/drop/preview.js.map +1 -0
  159. package/dist/utils/drop/receipt.cjs +39 -0
  160. package/dist/utils/drop/receipt.cjs.map +1 -0
  161. package/dist/utils/drop/receipt.d.cts +6 -0
  162. package/dist/utils/drop/receipt.d.ts +6 -0
  163. package/dist/utils/drop/receipt.js +15 -0
  164. package/dist/utils/drop/receipt.js.map +1 -0
  165. package/dist/utils/drop/sale.cjs +108 -0
  166. package/dist/utils/drop/sale.cjs.map +1 -0
  167. package/dist/utils/drop/sale.d.cts +52 -0
  168. package/dist/utils/drop/sale.d.ts +52 -0
  169. package/dist/utils/drop/sale.js +78 -0
  170. package/dist/utils/drop/sale.js.map +1 -0
  171. package/dist/utils/drop/types.cjs +17 -0
  172. package/dist/utils/drop/types.cjs.map +1 -0
  173. package/dist/utils/drop/types.d.cts +20 -0
  174. package/dist/utils/drop/types.d.ts +20 -0
  175. package/dist/utils/drop/types.js +1 -0
  176. package/dist/utils/drop/types.js.map +1 -0
  177. package/dist/utils/drop/upload.cjs +48 -0
  178. package/dist/utils/drop/upload.cjs.map +1 -0
  179. package/dist/utils/drop/upload.d.cts +11 -0
  180. package/dist/utils/drop/upload.d.ts +11 -0
  181. package/dist/utils/drop/upload.js +24 -0
  182. package/dist/utils/drop/upload.js.map +1 -0
  183. package/dist/utils/drop/use-now.cjs +38 -0
  184. package/dist/utils/drop/use-now.cjs.map +1 -0
  185. package/dist/utils/drop/use-now.d.cts +4 -0
  186. package/dist/utils/drop/use-now.d.ts +4 -0
  187. package/dist/utils/drop/use-now.js +14 -0
  188. package/dist/utils/drop/use-now.js.map +1 -0
  189. package/dist/utils/drop/view.cjs +89 -0
  190. package/dist/utils/drop/view.cjs.map +1 -0
  191. package/dist/utils/drop/view.d.cts +34 -0
  192. package/dist/utils/drop/view.d.ts +34 -0
  193. package/dist/utils/drop/view.js +64 -0
  194. package/dist/utils/drop/view.js.map +1 -0
  195. package/dist/utils/launchpad-defaults.cjs +0 -22
  196. package/dist/utils/launchpad-defaults.cjs.map +1 -1
  197. package/dist/utils/launchpad-defaults.d.cts +1 -7
  198. package/dist/utils/launchpad-defaults.d.ts +1 -7
  199. package/dist/utils/launchpad-defaults.js +0 -21
  200. package/dist/utils/launchpad-defaults.js.map +1 -1
  201. package/dist/utils/use-drops.cjs +48 -45
  202. package/dist/utils/use-drops.cjs.map +1 -1
  203. package/dist/utils/use-drops.d.cts +33 -23
  204. package/dist/utils/use-drops.d.ts +33 -23
  205. package/dist/utils/use-drops.js +41 -40
  206. package/dist/utils/use-drops.js.map +1 -1
  207. package/package.json +3 -3
  208. package/dist/components/account/account.test.cjs +0 -86
  209. package/dist/components/account/account.test.cjs.map +0 -1
  210. package/dist/components/account/account.test.d.cts +0 -2
  211. package/dist/components/account/account.test.d.ts +0 -2
  212. package/dist/components/account/account.test.js +0 -85
  213. package/dist/components/account/account.test.js.map +0 -1
  214. package/dist/components/drop-create-form.cjs +0 -341
  215. package/dist/components/drop-create-form.cjs.map +0 -1
  216. package/dist/components/drop-create-form.d.cts +0 -39
  217. package/dist/components/drop-create-form.d.ts +0 -39
  218. package/dist/components/drop-create-form.js +0 -322
  219. package/dist/components/drop-create-form.js.map +0 -1
  220. package/dist/components/drop-preview-card.cjs +0 -106
  221. package/dist/components/drop-preview-card.cjs.map +0 -1
  222. package/dist/components/drop-preview-card.d.cts +0 -17
  223. package/dist/components/drop-preview-card.d.ts +0 -17
  224. package/dist/components/drop-preview-card.js +0 -82
  225. package/dist/components/drop-preview-card.js.map +0 -1
  226. package/dist/components/drop-preview-card.test.cjs +0 -84
  227. package/dist/components/drop-preview-card.test.cjs.map +0 -1
  228. package/dist/components/drop-preview-card.test.d.cts +0 -3
  229. package/dist/components/drop-preview-card.test.d.ts +0 -3
  230. package/dist/components/drop-preview-card.test.js +0 -83
  231. package/dist/components/drop-preview-card.test.js.map +0 -1
  232. package/dist/components/drop-status-display.cjs.map +0 -1
  233. package/dist/components/drop-status-display.d.cts +0 -15
  234. package/dist/components/drop-status-display.d.ts +0 -15
  235. package/dist/components/drop-status-display.js +0 -77
  236. package/dist/components/drop-status-display.js.map +0 -1
  237. package/dist/components/drop-status-display.test.cjs +0 -29
  238. package/dist/components/drop-status-display.test.cjs.map +0 -1
  239. package/dist/components/drop-status-display.test.d.cts +0 -2
  240. package/dist/components/drop-status-display.test.d.ts +0 -2
  241. package/dist/components/drop-status-display.test.js +0 -28
  242. package/dist/components/drop-status-display.test.js.map +0 -1
  243. package/dist/components/exclusive-content-section.cjs +0 -88
  244. package/dist/components/exclusive-content-section.cjs.map +0 -1
  245. package/dist/components/exclusive-content-section.d.cts +0 -10
  246. package/dist/components/exclusive-content-section.d.ts +0 -10
  247. package/dist/components/exclusive-content-section.js +0 -64
  248. package/dist/components/exclusive-content-section.js.map +0 -1
  249. package/dist/data/drop-create-schema.cjs +0 -92
  250. package/dist/data/drop-create-schema.cjs.map +0 -1
  251. package/dist/data/drop-create-schema.d.cts +0 -131
  252. package/dist/data/drop-create-schema.d.ts +0 -131
  253. package/dist/data/drop-create-schema.js +0 -58
  254. package/dist/data/drop-create-schema.js.map +0 -1
  255. package/dist/utils/drop-status.cjs.map +0 -1
  256. package/dist/utils/drop-status.d.cts +0 -12
  257. package/dist/utils/drop-status.d.ts +0 -12
  258. package/dist/utils/drop-status.js +0 -13
  259. package/dist/utils/drop-status.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/drop/page/drop-activity.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ApiDropMint } from \"@medialane/sdk\";\nimport { AddressDisplay } from \"../../address-display.js\";\nimport { timeAgo } from \"../../../utils/time.js\";\n\nexport function DropActivityList({ mints }: { mints: ApiDropMint[] }) {\n if (mints.length === 0) return <p className=\"py-8 text-center text-sm text-muted-foreground\">No mints yet.</p>;\n return (\n <ul className=\"divide-y divide-border/60\">\n {mints.map((m) => (\n <li key={`${m.txHash}-${m.firstTokenId}`} className=\"flex items-center justify-between gap-3 py-3 text-sm\">\n <span className=\"flex min-w-0 items-center gap-1.5\">\n <AddressDisplay address={m.wallet} chars={4} showCopy={false} />\n <span className=\"text-muted-foreground\">{m.kind === \"claim\" ? `minted ${m.quantity}` : `received ${m.quantity} as a gift`}</span>\n </span>\n <span className=\"shrink-0 text-xs text-muted-foreground\">{timeAgo(m.createdAt)}</span>\n </li>\n ))}\n </ul>\n );\n}\n"],"mappings":";AAOiC,cAKvB,YALuB;AAJjC,SAAS,sBAAsB;AAC/B,SAAS,eAAe;AAEjB,SAAS,iBAAiB,EAAE,MAAM,GAA6B;AACpE,MAAI,MAAM,WAAW,EAAG,QAAO,oBAAC,OAAE,WAAU,kDAAiD,2BAAa;AAC1G,SACE,oBAAC,QAAG,WAAU,6BACX,gBAAM,IAAI,CAAC,MACV,qBAAC,QAAyC,WAAU,wDAClD;AAAA,yBAAC,UAAK,WAAU,qCACd;AAAA,0BAAC,kBAAe,SAAS,EAAE,QAAQ,OAAO,GAAG,UAAU,OAAO;AAAA,MAC9D,oBAAC,UAAK,WAAU,yBAAyB,YAAE,SAAS,UAAU,UAAU,EAAE,QAAQ,KAAK,YAAY,EAAE,QAAQ,cAAa;AAAA,OAC5H;AAAA,IACA,oBAAC,UAAK,WAAU,0CAA0C,kBAAQ,EAAE,SAAS,GAAE;AAAA,OALxE,GAAG,EAAE,MAAM,IAAI,EAAE,YAAY,EAMtC,CACD,GACH;AAEJ;","names":[]}
@@ -0,0 +1,161 @@
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 drop_manage_exports = {};
21
+ __export(drop_manage_exports, {
22
+ DropManage: () => DropManage
23
+ });
24
+ module.exports = __toCommonJS(drop_manage_exports);
25
+ var import_jsx_runtime = require("react/jsx-runtime");
26
+ var import_react = require("react");
27
+ var import_starknet = require("@medialane/sdk/starknet");
28
+ var import_sdk = require("@medialane/sdk");
29
+ var import_action_dialog = require("../../action-dialog.js");
30
+ var import_button = require("../../button.js");
31
+ var import_input = require("../../input.js");
32
+ var import_textarea = require("../../textarea.js");
33
+ var import_share_button = require("../../share-button.js");
34
+ var import_stat_tile = require("../../stat-tile.js");
35
+ var import_drop_activity = require("./drop-activity.js");
36
+ var import_exclusive_fields = require("../create/exclusive-fields.js");
37
+ var import_launch_dialog = require("../create/launch-dialog.js");
38
+ var import_describe_error = require("../../../utils/describe-error.js");
39
+ var import_allowlist = require("../../../utils/drop/allowlist.js");
40
+ var import_sale = require("../../../utils/drop/sale.js");
41
+ function DropManage({ contract, indexed, onchain, mints, run, saveExclusive }) {
42
+ const [pending, setPending] = (0, import_react.useState)(null);
43
+ const [busy, setBusy] = (0, import_react.useState)(false);
44
+ const [message, setMessage] = (0, import_react.useState)(null);
45
+ const [listText, setListText] = (0, import_react.useState)("");
46
+ const [links, setLinks] = (0, import_react.useState)([]);
47
+ const [gift, setGift] = (0, import_react.useState)({ to: "", quantity: "1" });
48
+ const [exclusive, setExclusive] = (0, import_react.useState)({ title: "", url: "", type: "" });
49
+ const listed = BigInt(onchain.allowlistRoot) !== 0n;
50
+ const left = onchain.maxSupply === 0n ? null : onchain.maxSupply - onchain.totalMinted;
51
+ const shareUrl = typeof window === "undefined" ? (0, import_sdk.dropHref)(contract) : `${window.location.origin}${(0, import_sdk.dropHref)(contract)}`;
52
+ const confirm = async () => {
53
+ if (!pending) return;
54
+ setBusy(true);
55
+ try {
56
+ await pending.act();
57
+ setMessage(`${pending.title} \u2014 done.`);
58
+ } catch (err) {
59
+ setMessage((0, import_describe_error.describeError)(err, "That didn't go through. Please try again.").message);
60
+ } finally {
61
+ setBusy(false);
62
+ setPending(null);
63
+ }
64
+ };
65
+ const parsed = (0, import_allowlist.parseAllowlist)(listText);
66
+ const list = parsed.addresses.length > 0 ? (0, import_starknet.buildPopAllowlist)(parsed.addresses) : null;
67
+ const sameList = list !== null && BigInt(list.root) === BigInt(onchain.allowlistRoot);
68
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-8", children: [
69
+ message && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "rounded-lg bg-muted/50 px-3 py-2 text-sm", children: message }),
70
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { className: "space-y-3", children: [
71
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h3", { className: "text-sm font-semibold", children: "Overview" }),
72
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "grid grid-cols-2 gap-3 sm:grid-cols-3", children: [
73
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_stat_tile.StatTile, { label: "Minted", value: (0, import_sale.supplyLabel)(onchain.totalMinted.toString(), onchain.maxSupply.toString()) }),
74
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_stat_tile.StatTile, { label: "Revenue", value: (0, import_sale.priceLabel)(indexed?.revenue ?? "0", onchain.paymentToken) }),
75
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_stat_tile.StatTile, { label: "Collectors", value: indexed?.collectors ?? 0 })
76
+ ] }),
77
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_drop_activity.DropActivityList, { mints })
78
+ ] }),
79
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { className: "space-y-3", children: [
80
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h3", { className: "text-sm font-semibold", children: "Who can mint" }),
81
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm text-muted-foreground", children: listed ? "Only wallets on your list can mint." : "Everyone can mint." }),
82
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_textarea.Textarea, { rows: 5, placeholder: "Paste wallet addresses, one per line", value: listText, onChange: (e) => {
83
+ setListText(e.target.value);
84
+ setLinks([]);
85
+ } }),
86
+ parsed.invalid.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", { className: "text-xs text-destructive", children: [
87
+ parsed.invalid.length,
88
+ " line(s) aren't wallet addresses: ",
89
+ parsed.invalid.slice(0, 3).join(", ")
90
+ ] }),
91
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-wrap gap-2", children: [
92
+ list && sameList && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_button.Button, { variant: "outline", onClick: () => setLinks((0, import_starknet.dropClaimLinks)(window.location.origin, contract, list)), children: "This is your current list \u2014 get its claim links" }),
93
+ list && !sameList && parsed.invalid.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_button.Button, { onClick: () => setPending({
94
+ title: "List published",
95
+ body: `Only these ${parsed.addresses.length} wallets will be able to mint. Claim links for your previous list stop working for wallets not on this one.`,
96
+ act: async () => {
97
+ await run({ action: "set_allowlist_root", root: list.root });
98
+ setLinks((0, import_starknet.dropClaimLinks)(window.location.origin, contract, list));
99
+ }
100
+ }), children: "Publish this list" }),
101
+ listed && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_button.Button, { variant: "outline", onClick: () => setPending({
102
+ title: "Drop opened to everyone",
103
+ body: "Anyone will be able to mint, with or without a claim link.",
104
+ act: () => run({ action: "set_allowlist_root", root: "0x0" })
105
+ }), children: "Open to everyone" }),
106
+ links.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_button.Button, { variant: "outline", onClick: () => (0, import_launch_dialog.downloadCsv)((0, import_starknet.popClaimLinksCsv)(links), "claim-links.csv"), children: "Download claim links" })
107
+ ] })
108
+ ] }),
109
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { className: "space-y-3", children: [
110
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h3", { className: "text-sm font-semibold", children: "Gift" }),
111
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", { className: "text-sm text-muted-foreground", children: [
112
+ "Mint free tokens to a wallet",
113
+ left !== null ? ` \xB7 ${left.toString()} left` : "",
114
+ ". Gifts don't count toward that wallet's limit."
115
+ ] }),
116
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex gap-2", children: [
117
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_input.Input, { placeholder: "Wallet address", value: gift.to, onChange: (e) => setGift({ ...gift, to: e.target.value.trim() }) }),
118
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_input.Input, { className: "w-20", inputMode: "numeric", value: gift.quantity, onChange: (e) => setGift({ ...gift, quantity: e.target.value.trim() }) })
119
+ ] }),
120
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
121
+ import_button.Button,
122
+ {
123
+ disabled: (0, import_allowlist.parseAllowlist)(gift.to).addresses.length !== 1 || !/^[1-9]\d*$/.test(gift.quantity),
124
+ onClick: () => setPending({
125
+ title: "Gift sent",
126
+ body: `Mint ${gift.quantity} free token(s) to ${gift.to}.`,
127
+ act: () => run({ action: "issue", recipient: gift.to, quantity: gift.quantity })
128
+ }),
129
+ children: "Send gift"
130
+ }
131
+ )
132
+ ] }),
133
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { className: "space-y-3", children: [
134
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h3", { className: "text-sm font-semibold", children: "Share" }),
135
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex gap-2", children: [
136
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_input.Input, { readOnly: true, value: shareUrl }),
137
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_share_button.ShareButton, { title: indexed?.name ?? "Drop", url: shareUrl, variant: "outline" })
138
+ ] })
139
+ ] }),
140
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { className: "space-y-3", children: [
141
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h3", { className: "text-sm font-semibold", children: "Exclusive content" }),
142
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_exclusive_fields.ExclusiveFields, { value: exclusive, onChange: setExclusive }),
143
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex gap-2", children: [
144
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_button.Button, { disabled: !/^https:\/\//.test(exclusive.url), onClick: () => setPending({ title: "Exclusive content saved", body: "Holders will see this link.", act: () => saveExclusive(exclusive) }), children: "Save" }),
145
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_button.Button, { variant: "outline", onClick: () => setPending({ title: "Exclusive content removed", body: "Holders will no longer see a link.", act: () => saveExclusive(null) }), children: "Remove" })
146
+ ] })
147
+ ] }),
148
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_action_dialog.ActionDialog, { open: pending !== null, onClose: () => !busy && setPending(null), width: 460, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-4 p-6", children: [
149
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm", children: pending?.body }),
150
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex justify-end gap-2", children: [
151
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_button.Button, { variant: "outline", disabled: busy, onClick: () => setPending(null), children: "Cancel" }),
152
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_button.Button, { disabled: busy, onClick: () => void confirm(), children: busy ? "Working\u2026" : "Confirm" })
153
+ ] })
154
+ ] }) })
155
+ ] });
156
+ }
157
+ // Annotate the CommonJS export names for ESM import in node:
158
+ 0 && (module.exports = {
159
+ DropManage
160
+ });
161
+ //# sourceMappingURL=drop-manage.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/drop/page/drop-manage.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { buildPopAllowlist, dropClaimLinks, popClaimLinksCsv, type DropOnchain } from \"@medialane/sdk/starknet\";\nimport { dropHref, type ApiDrop, type ApiDropMint } from \"@medialane/sdk\";\nimport { ActionDialog } from \"../../action-dialog.js\";\nimport { Button } from \"../../button.js\";\nimport { Input } from \"../../input.js\";\nimport { Textarea } from \"../../textarea.js\";\nimport { ShareButton } from \"../../share-button.js\";\nimport { StatTile } from \"../../stat-tile.js\";\nimport { DropActivityList } from \"./drop-activity.js\";\nimport { ExclusiveFields, type ExclusiveValue } from \"../create/exclusive-fields.js\";\nimport { downloadCsv } from \"../create/launch-dialog.js\";\nimport { describeError } from \"../../../utils/describe-error.js\";\nimport { parseAllowlist } from \"../../../utils/drop/allowlist.js\";\nimport { priceLabel, supplyLabel } from \"../../../utils/drop/sale.js\";\n\nexport interface DropManageProps {\n contract: string;\n indexed: ApiDrop | null;\n onchain: DropOnchain;\n mints: ApiDropMint[];\n /** Runs a manage action as one transaction; resolves when confirmed. */\n run: (params: { action: \"issue\"; recipient: string; quantity: string } | { action: \"set_allowlist_root\"; root: string }) => Promise<void>;\n saveExclusive: (value: ExclusiveValue | null) => Promise<void>;\n}\n\ntype Pending = { title: string; body: string; act: () => Promise<void> } | null;\n\nexport function DropManage({ contract, indexed, onchain, mints, run, saveExclusive }: DropManageProps) {\n const [pending, setPending] = useState<Pending>(null);\n const [busy, setBusy] = useState(false);\n const [message, setMessage] = useState<string | null>(null);\n const [listText, setListText] = useState(\"\");\n const [links, setLinks] = useState<ReturnType<typeof dropClaimLinks>>([]);\n const [gift, setGift] = useState({ to: \"\", quantity: \"1\" });\n const [exclusive, setExclusive] = useState<ExclusiveValue>({ title: \"\", url: \"\", type: \"\" });\n const listed = BigInt(onchain.allowlistRoot) !== 0n;\n const left = onchain.maxSupply === 0n ? null : onchain.maxSupply - onchain.totalMinted;\n const shareUrl = typeof window === \"undefined\" ? dropHref(contract) : `${window.location.origin}${dropHref(contract)}`;\n\n const confirm = async () => {\n if (!pending) return;\n setBusy(true);\n try {\n await pending.act();\n setMessage(`${pending.title} — done.`);\n } catch (err) {\n setMessage(describeError(err, \"That didn't go through. Please try again.\").message);\n } finally {\n setBusy(false);\n setPending(null);\n }\n };\n\n const parsed = parseAllowlist(listText);\n const list = parsed.addresses.length > 0 ? buildPopAllowlist(parsed.addresses) : null;\n const sameList = list !== null && BigInt(list.root) === BigInt(onchain.allowlistRoot);\n\n return (\n <div className=\"space-y-8\">\n {message && <p className=\"rounded-lg bg-muted/50 px-3 py-2 text-sm\">{message}</p>}\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold\">Overview</h3>\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-3\">\n <StatTile label=\"Minted\" value={supplyLabel(onchain.totalMinted.toString(), onchain.maxSupply.toString())} />\n <StatTile label=\"Revenue\" value={priceLabel(indexed?.revenue ?? \"0\", onchain.paymentToken)} />\n <StatTile label=\"Collectors\" value={indexed?.collectors ?? 0} />\n </div>\n <DropActivityList mints={mints} />\n </section>\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold\">Who can mint</h3>\n <p className=\"text-sm text-muted-foreground\">{listed ? \"Only wallets on your list can mint.\" : \"Everyone can mint.\"}</p>\n <Textarea rows={5} placeholder=\"Paste wallet addresses, one per line\" value={listText} onChange={(e) => { setListText(e.target.value); setLinks([]); }} />\n {parsed.invalid.length > 0 && <p className=\"text-xs text-destructive\">{parsed.invalid.length} line(s) aren't wallet addresses: {parsed.invalid.slice(0, 3).join(\", \")}</p>}\n <div className=\"flex flex-wrap gap-2\">\n {list && sameList && (\n <Button variant=\"outline\" onClick={() => setLinks(dropClaimLinks(window.location.origin, contract, list))}>This is your current list — get its claim links</Button>\n )}\n {list && !sameList && parsed.invalid.length === 0 && (\n <Button onClick={() => setPending({\n title: \"List published\",\n body: `Only these ${parsed.addresses.length} wallets will be able to mint. Claim links for your previous list stop working for wallets not on this one.`,\n act: async () => { await run({ action: \"set_allowlist_root\", root: list.root }); setLinks(dropClaimLinks(window.location.origin, contract, list)); },\n })}>Publish this list</Button>\n )}\n {listed && (\n <Button variant=\"outline\" onClick={() => setPending({\n title: \"Drop opened to everyone\",\n body: \"Anyone will be able to mint, with or without a claim link.\",\n act: () => run({ action: \"set_allowlist_root\", root: \"0x0\" }),\n })}>Open to everyone</Button>\n )}\n {links.length > 0 && <Button variant=\"outline\" onClick={() => downloadCsv(popClaimLinksCsv(links), \"claim-links.csv\")}>Download claim links</Button>}\n </div>\n </section>\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold\">Gift</h3>\n <p className=\"text-sm text-muted-foreground\">\n Mint free tokens to a wallet{left !== null ? ` · ${left.toString()} left` : \"\"}. Gifts don't count toward that wallet's limit.\n </p>\n <div className=\"flex gap-2\">\n <Input placeholder=\"Wallet address\" value={gift.to} onChange={(e) => setGift({ ...gift, to: e.target.value.trim() })} />\n <Input className=\"w-20\" inputMode=\"numeric\" value={gift.quantity} onChange={(e) => setGift({ ...gift, quantity: e.target.value.trim() })} />\n </div>\n <Button\n disabled={parseAllowlist(gift.to).addresses.length !== 1 || !/^[1-9]\\d*$/.test(gift.quantity)}\n onClick={() => setPending({\n title: \"Gift sent\",\n body: `Mint ${gift.quantity} free token(s) to ${gift.to}.`,\n act: () => run({ action: \"issue\", recipient: gift.to, quantity: gift.quantity }),\n })}\n >Send gift</Button>\n </section>\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold\">Share</h3>\n <div className=\"flex gap-2\">\n <Input readOnly value={shareUrl} />\n <ShareButton title={indexed?.name ?? \"Drop\"} url={shareUrl} variant=\"outline\" />\n </div>\n </section>\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold\">Exclusive content</h3>\n <ExclusiveFields value={exclusive} onChange={setExclusive} />\n <div className=\"flex gap-2\">\n <Button disabled={!/^https:\\/\\//.test(exclusive.url)} onClick={() => setPending({ title: \"Exclusive content saved\", body: \"Holders will see this link.\", act: () => saveExclusive(exclusive) })}>Save</Button>\n <Button variant=\"outline\" onClick={() => setPending({ title: \"Exclusive content removed\", body: \"Holders will no longer see a link.\", act: () => saveExclusive(null) })}>Remove</Button>\n </div>\n </section>\n\n <ActionDialog open={pending !== null} onClose={() => !busy && setPending(null)} width={460}>\n <div className=\"space-y-4 p-6\">\n <p className=\"text-sm\">{pending?.body}</p>\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"outline\" disabled={busy} onClick={() => setPending(null)}>Cancel</Button>\n <Button disabled={busy} onClick={() => void confirm()}>{busy ? \"Working…\" : \"Confirm\"}</Button>\n </div>\n </div>\n </ActionDialog>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,24 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { DropOnchain } from '@medialane/sdk/starknet';
3
+ import { ApiDrop, ApiDropMint } from '@medialane/sdk';
4
+ import { ExclusiveValue } from '../create/exclusive-fields.cjs';
5
+
6
+ interface DropManageProps {
7
+ contract: string;
8
+ indexed: ApiDrop | null;
9
+ onchain: DropOnchain;
10
+ mints: ApiDropMint[];
11
+ /** Runs a manage action as one transaction; resolves when confirmed. */
12
+ run: (params: {
13
+ action: "issue";
14
+ recipient: string;
15
+ quantity: string;
16
+ } | {
17
+ action: "set_allowlist_root";
18
+ root: string;
19
+ }) => Promise<void>;
20
+ saveExclusive: (value: ExclusiveValue | null) => Promise<void>;
21
+ }
22
+ declare function DropManage({ contract, indexed, onchain, mints, run, saveExclusive }: DropManageProps): react_jsx_runtime.JSX.Element;
23
+
24
+ export { DropManage, type DropManageProps };
@@ -0,0 +1,24 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { DropOnchain } from '@medialane/sdk/starknet';
3
+ import { ApiDrop, ApiDropMint } from '@medialane/sdk';
4
+ import { ExclusiveValue } from '../create/exclusive-fields.js';
5
+
6
+ interface DropManageProps {
7
+ contract: string;
8
+ indexed: ApiDrop | null;
9
+ onchain: DropOnchain;
10
+ mints: ApiDropMint[];
11
+ /** Runs a manage action as one transaction; resolves when confirmed. */
12
+ run: (params: {
13
+ action: "issue";
14
+ recipient: string;
15
+ quantity: string;
16
+ } | {
17
+ action: "set_allowlist_root";
18
+ root: string;
19
+ }) => Promise<void>;
20
+ saveExclusive: (value: ExclusiveValue | null) => Promise<void>;
21
+ }
22
+ declare function DropManage({ contract, indexed, onchain, mints, run, saveExclusive }: DropManageProps): react_jsx_runtime.JSX.Element;
23
+
24
+ export { DropManage, type DropManageProps };
@@ -0,0 +1,137 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { useState } from "react";
4
+ import { buildPopAllowlist, dropClaimLinks, popClaimLinksCsv } from "@medialane/sdk/starknet";
5
+ import { dropHref } from "@medialane/sdk";
6
+ import { ActionDialog } from "../../action-dialog.js";
7
+ import { Button } from "../../button.js";
8
+ import { Input } from "../../input.js";
9
+ import { Textarea } from "../../textarea.js";
10
+ import { ShareButton } from "../../share-button.js";
11
+ import { StatTile } from "../../stat-tile.js";
12
+ import { DropActivityList } from "./drop-activity.js";
13
+ import { ExclusiveFields } from "../create/exclusive-fields.js";
14
+ import { downloadCsv } from "../create/launch-dialog.js";
15
+ import { describeError } from "../../../utils/describe-error.js";
16
+ import { parseAllowlist } from "../../../utils/drop/allowlist.js";
17
+ import { priceLabel, supplyLabel } from "../../../utils/drop/sale.js";
18
+ function DropManage({ contract, indexed, onchain, mints, run, saveExclusive }) {
19
+ const [pending, setPending] = useState(null);
20
+ const [busy, setBusy] = useState(false);
21
+ const [message, setMessage] = useState(null);
22
+ const [listText, setListText] = useState("");
23
+ const [links, setLinks] = useState([]);
24
+ const [gift, setGift] = useState({ to: "", quantity: "1" });
25
+ const [exclusive, setExclusive] = useState({ title: "", url: "", type: "" });
26
+ const listed = BigInt(onchain.allowlistRoot) !== 0n;
27
+ const left = onchain.maxSupply === 0n ? null : onchain.maxSupply - onchain.totalMinted;
28
+ const shareUrl = typeof window === "undefined" ? dropHref(contract) : `${window.location.origin}${dropHref(contract)}`;
29
+ const confirm = async () => {
30
+ if (!pending) return;
31
+ setBusy(true);
32
+ try {
33
+ await pending.act();
34
+ setMessage(`${pending.title} \u2014 done.`);
35
+ } catch (err) {
36
+ setMessage(describeError(err, "That didn't go through. Please try again.").message);
37
+ } finally {
38
+ setBusy(false);
39
+ setPending(null);
40
+ }
41
+ };
42
+ const parsed = parseAllowlist(listText);
43
+ const list = parsed.addresses.length > 0 ? buildPopAllowlist(parsed.addresses) : null;
44
+ const sameList = list !== null && BigInt(list.root) === BigInt(onchain.allowlistRoot);
45
+ return /* @__PURE__ */ jsxs("div", { className: "space-y-8", children: [
46
+ message && /* @__PURE__ */ jsx("p", { className: "rounded-lg bg-muted/50 px-3 py-2 text-sm", children: message }),
47
+ /* @__PURE__ */ jsxs("section", { className: "space-y-3", children: [
48
+ /* @__PURE__ */ jsx("h3", { className: "text-sm font-semibold", children: "Overview" }),
49
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-3 sm:grid-cols-3", children: [
50
+ /* @__PURE__ */ jsx(StatTile, { label: "Minted", value: supplyLabel(onchain.totalMinted.toString(), onchain.maxSupply.toString()) }),
51
+ /* @__PURE__ */ jsx(StatTile, { label: "Revenue", value: priceLabel(indexed?.revenue ?? "0", onchain.paymentToken) }),
52
+ /* @__PURE__ */ jsx(StatTile, { label: "Collectors", value: indexed?.collectors ?? 0 })
53
+ ] }),
54
+ /* @__PURE__ */ jsx(DropActivityList, { mints })
55
+ ] }),
56
+ /* @__PURE__ */ jsxs("section", { className: "space-y-3", children: [
57
+ /* @__PURE__ */ jsx("h3", { className: "text-sm font-semibold", children: "Who can mint" }),
58
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: listed ? "Only wallets on your list can mint." : "Everyone can mint." }),
59
+ /* @__PURE__ */ jsx(Textarea, { rows: 5, placeholder: "Paste wallet addresses, one per line", value: listText, onChange: (e) => {
60
+ setListText(e.target.value);
61
+ setLinks([]);
62
+ } }),
63
+ parsed.invalid.length > 0 && /* @__PURE__ */ jsxs("p", { className: "text-xs text-destructive", children: [
64
+ parsed.invalid.length,
65
+ " line(s) aren't wallet addresses: ",
66
+ parsed.invalid.slice(0, 3).join(", ")
67
+ ] }),
68
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-2", children: [
69
+ list && sameList && /* @__PURE__ */ jsx(Button, { variant: "outline", onClick: () => setLinks(dropClaimLinks(window.location.origin, contract, list)), children: "This is your current list \u2014 get its claim links" }),
70
+ list && !sameList && parsed.invalid.length === 0 && /* @__PURE__ */ jsx(Button, { onClick: () => setPending({
71
+ title: "List published",
72
+ body: `Only these ${parsed.addresses.length} wallets will be able to mint. Claim links for your previous list stop working for wallets not on this one.`,
73
+ act: async () => {
74
+ await run({ action: "set_allowlist_root", root: list.root });
75
+ setLinks(dropClaimLinks(window.location.origin, contract, list));
76
+ }
77
+ }), children: "Publish this list" }),
78
+ listed && /* @__PURE__ */ jsx(Button, { variant: "outline", onClick: () => setPending({
79
+ title: "Drop opened to everyone",
80
+ body: "Anyone will be able to mint, with or without a claim link.",
81
+ act: () => run({ action: "set_allowlist_root", root: "0x0" })
82
+ }), children: "Open to everyone" }),
83
+ links.length > 0 && /* @__PURE__ */ jsx(Button, { variant: "outline", onClick: () => downloadCsv(popClaimLinksCsv(links), "claim-links.csv"), children: "Download claim links" })
84
+ ] })
85
+ ] }),
86
+ /* @__PURE__ */ jsxs("section", { className: "space-y-3", children: [
87
+ /* @__PURE__ */ jsx("h3", { className: "text-sm font-semibold", children: "Gift" }),
88
+ /* @__PURE__ */ jsxs("p", { className: "text-sm text-muted-foreground", children: [
89
+ "Mint free tokens to a wallet",
90
+ left !== null ? ` \xB7 ${left.toString()} left` : "",
91
+ ". Gifts don't count toward that wallet's limit."
92
+ ] }),
93
+ /* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
94
+ /* @__PURE__ */ jsx(Input, { placeholder: "Wallet address", value: gift.to, onChange: (e) => setGift({ ...gift, to: e.target.value.trim() }) }),
95
+ /* @__PURE__ */ jsx(Input, { className: "w-20", inputMode: "numeric", value: gift.quantity, onChange: (e) => setGift({ ...gift, quantity: e.target.value.trim() }) })
96
+ ] }),
97
+ /* @__PURE__ */ jsx(
98
+ Button,
99
+ {
100
+ disabled: parseAllowlist(gift.to).addresses.length !== 1 || !/^[1-9]\d*$/.test(gift.quantity),
101
+ onClick: () => setPending({
102
+ title: "Gift sent",
103
+ body: `Mint ${gift.quantity} free token(s) to ${gift.to}.`,
104
+ act: () => run({ action: "issue", recipient: gift.to, quantity: gift.quantity })
105
+ }),
106
+ children: "Send gift"
107
+ }
108
+ )
109
+ ] }),
110
+ /* @__PURE__ */ jsxs("section", { className: "space-y-3", children: [
111
+ /* @__PURE__ */ jsx("h3", { className: "text-sm font-semibold", children: "Share" }),
112
+ /* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
113
+ /* @__PURE__ */ jsx(Input, { readOnly: true, value: shareUrl }),
114
+ /* @__PURE__ */ jsx(ShareButton, { title: indexed?.name ?? "Drop", url: shareUrl, variant: "outline" })
115
+ ] })
116
+ ] }),
117
+ /* @__PURE__ */ jsxs("section", { className: "space-y-3", children: [
118
+ /* @__PURE__ */ jsx("h3", { className: "text-sm font-semibold", children: "Exclusive content" }),
119
+ /* @__PURE__ */ jsx(ExclusiveFields, { value: exclusive, onChange: setExclusive }),
120
+ /* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
121
+ /* @__PURE__ */ jsx(Button, { disabled: !/^https:\/\//.test(exclusive.url), onClick: () => setPending({ title: "Exclusive content saved", body: "Holders will see this link.", act: () => saveExclusive(exclusive) }), children: "Save" }),
122
+ /* @__PURE__ */ jsx(Button, { variant: "outline", onClick: () => setPending({ title: "Exclusive content removed", body: "Holders will no longer see a link.", act: () => saveExclusive(null) }), children: "Remove" })
123
+ ] })
124
+ ] }),
125
+ /* @__PURE__ */ jsx(ActionDialog, { open: pending !== null, onClose: () => !busy && setPending(null), width: 460, children: /* @__PURE__ */ jsxs("div", { className: "space-y-4 p-6", children: [
126
+ /* @__PURE__ */ jsx("p", { className: "text-sm", children: pending?.body }),
127
+ /* @__PURE__ */ jsxs("div", { className: "flex justify-end gap-2", children: [
128
+ /* @__PURE__ */ jsx(Button, { variant: "outline", disabled: busy, onClick: () => setPending(null), children: "Cancel" }),
129
+ /* @__PURE__ */ jsx(Button, { disabled: busy, onClick: () => void confirm(), children: busy ? "Working\u2026" : "Confirm" })
130
+ ] })
131
+ ] }) })
132
+ ] });
133
+ }
134
+ export {
135
+ DropManage
136
+ };
137
+ //# sourceMappingURL=drop-manage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/drop/page/drop-manage.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { buildPopAllowlist, dropClaimLinks, popClaimLinksCsv, type DropOnchain } from \"@medialane/sdk/starknet\";\nimport { dropHref, type ApiDrop, type ApiDropMint } from \"@medialane/sdk\";\nimport { ActionDialog } from \"../../action-dialog.js\";\nimport { Button } from \"../../button.js\";\nimport { Input } from \"../../input.js\";\nimport { Textarea } from \"../../textarea.js\";\nimport { ShareButton } from \"../../share-button.js\";\nimport { StatTile } from \"../../stat-tile.js\";\nimport { DropActivityList } from \"./drop-activity.js\";\nimport { ExclusiveFields, type ExclusiveValue } from \"../create/exclusive-fields.js\";\nimport { downloadCsv } from \"../create/launch-dialog.js\";\nimport { describeError } from \"../../../utils/describe-error.js\";\nimport { parseAllowlist } from \"../../../utils/drop/allowlist.js\";\nimport { priceLabel, supplyLabel } from \"../../../utils/drop/sale.js\";\n\nexport interface DropManageProps {\n contract: string;\n indexed: ApiDrop | null;\n onchain: DropOnchain;\n mints: ApiDropMint[];\n /** Runs a manage action as one transaction; resolves when confirmed. */\n run: (params: { action: \"issue\"; recipient: string; quantity: string } | { action: \"set_allowlist_root\"; root: string }) => Promise<void>;\n saveExclusive: (value: ExclusiveValue | null) => Promise<void>;\n}\n\ntype Pending = { title: string; body: string; act: () => Promise<void> } | null;\n\nexport function DropManage({ contract, indexed, onchain, mints, run, saveExclusive }: DropManageProps) {\n const [pending, setPending] = useState<Pending>(null);\n const [busy, setBusy] = useState(false);\n const [message, setMessage] = useState<string | null>(null);\n const [listText, setListText] = useState(\"\");\n const [links, setLinks] = useState<ReturnType<typeof dropClaimLinks>>([]);\n const [gift, setGift] = useState({ to: \"\", quantity: \"1\" });\n const [exclusive, setExclusive] = useState<ExclusiveValue>({ title: \"\", url: \"\", type: \"\" });\n const listed = BigInt(onchain.allowlistRoot) !== 0n;\n const left = onchain.maxSupply === 0n ? null : onchain.maxSupply - onchain.totalMinted;\n const shareUrl = typeof window === \"undefined\" ? dropHref(contract) : `${window.location.origin}${dropHref(contract)}`;\n\n const confirm = async () => {\n if (!pending) return;\n setBusy(true);\n try {\n await pending.act();\n setMessage(`${pending.title} — done.`);\n } catch (err) {\n setMessage(describeError(err, \"That didn't go through. Please try again.\").message);\n } finally {\n setBusy(false);\n setPending(null);\n }\n };\n\n const parsed = parseAllowlist(listText);\n const list = parsed.addresses.length > 0 ? buildPopAllowlist(parsed.addresses) : null;\n const sameList = list !== null && BigInt(list.root) === BigInt(onchain.allowlistRoot);\n\n return (\n <div className=\"space-y-8\">\n {message && <p className=\"rounded-lg bg-muted/50 px-3 py-2 text-sm\">{message}</p>}\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold\">Overview</h3>\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-3\">\n <StatTile label=\"Minted\" value={supplyLabel(onchain.totalMinted.toString(), onchain.maxSupply.toString())} />\n <StatTile label=\"Revenue\" value={priceLabel(indexed?.revenue ?? \"0\", onchain.paymentToken)} />\n <StatTile label=\"Collectors\" value={indexed?.collectors ?? 0} />\n </div>\n <DropActivityList mints={mints} />\n </section>\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold\">Who can mint</h3>\n <p className=\"text-sm text-muted-foreground\">{listed ? \"Only wallets on your list can mint.\" : \"Everyone can mint.\"}</p>\n <Textarea rows={5} placeholder=\"Paste wallet addresses, one per line\" value={listText} onChange={(e) => { setListText(e.target.value); setLinks([]); }} />\n {parsed.invalid.length > 0 && <p className=\"text-xs text-destructive\">{parsed.invalid.length} line(s) aren't wallet addresses: {parsed.invalid.slice(0, 3).join(\", \")}</p>}\n <div className=\"flex flex-wrap gap-2\">\n {list && sameList && (\n <Button variant=\"outline\" onClick={() => setLinks(dropClaimLinks(window.location.origin, contract, list))}>This is your current list — get its claim links</Button>\n )}\n {list && !sameList && parsed.invalid.length === 0 && (\n <Button onClick={() => setPending({\n title: \"List published\",\n body: `Only these ${parsed.addresses.length} wallets will be able to mint. Claim links for your previous list stop working for wallets not on this one.`,\n act: async () => { await run({ action: \"set_allowlist_root\", root: list.root }); setLinks(dropClaimLinks(window.location.origin, contract, list)); },\n })}>Publish this list</Button>\n )}\n {listed && (\n <Button variant=\"outline\" onClick={() => setPending({\n title: \"Drop opened to everyone\",\n body: \"Anyone will be able to mint, with or without a claim link.\",\n act: () => run({ action: \"set_allowlist_root\", root: \"0x0\" }),\n })}>Open to everyone</Button>\n )}\n {links.length > 0 && <Button variant=\"outline\" onClick={() => downloadCsv(popClaimLinksCsv(links), \"claim-links.csv\")}>Download claim links</Button>}\n </div>\n </section>\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold\">Gift</h3>\n <p className=\"text-sm text-muted-foreground\">\n Mint free tokens to a wallet{left !== null ? ` · ${left.toString()} left` : \"\"}. Gifts don't count toward that wallet's limit.\n </p>\n <div className=\"flex gap-2\">\n <Input placeholder=\"Wallet address\" value={gift.to} onChange={(e) => setGift({ ...gift, to: e.target.value.trim() })} />\n <Input className=\"w-20\" inputMode=\"numeric\" value={gift.quantity} onChange={(e) => setGift({ ...gift, quantity: e.target.value.trim() })} />\n </div>\n <Button\n disabled={parseAllowlist(gift.to).addresses.length !== 1 || !/^[1-9]\\d*$/.test(gift.quantity)}\n onClick={() => setPending({\n title: \"Gift sent\",\n body: `Mint ${gift.quantity} free token(s) to ${gift.to}.`,\n act: () => run({ action: \"issue\", recipient: gift.to, quantity: gift.quantity }),\n })}\n >Send gift</Button>\n </section>\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold\">Share</h3>\n <div className=\"flex gap-2\">\n <Input readOnly value={shareUrl} />\n <ShareButton title={indexed?.name ?? \"Drop\"} url={shareUrl} variant=\"outline\" />\n </div>\n </section>\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold\">Exclusive content</h3>\n <ExclusiveFields value={exclusive} onChange={setExclusive} />\n <div className=\"flex gap-2\">\n <Button disabled={!/^https:\\/\\//.test(exclusive.url)} onClick={() => setPending({ title: \"Exclusive content saved\", body: \"Holders will see this link.\", act: () => saveExclusive(exclusive) })}>Save</Button>\n <Button variant=\"outline\" onClick={() => setPending({ title: \"Exclusive content removed\", body: \"Holders will no longer see a link.\", act: () => saveExclusive(null) })}>Remove</Button>\n </div>\n </section>\n\n <ActionDialog open={pending !== null} onClose={() => !busy && setPending(null)} width={460}>\n <div className=\"space-y-4 p-6\">\n <p className=\"text-sm\">{pending?.body}</p>\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"outline\" disabled={busy} onClick={() => setPending(null)}>Cancel</Button>\n <Button disabled={busy} onClick={() => void confirm()}>{busy ? \"Working…\" : \"Confirm\"}</Button>\n </div>\n </div>\n </ActionDialog>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,97 @@
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 drop_mint_dialog_exports = {};
21
+ __export(drop_mint_dialog_exports, {
22
+ DropMintDialog: () => DropMintDialog
23
+ });
24
+ module.exports = __toCommonJS(drop_mint_dialog_exports);
25
+ var import_jsx_runtime = require("react/jsx-runtime");
26
+ var import_react = require("react");
27
+ var import_lucide_react = require("lucide-react");
28
+ var import_action_dialog = require("../../action-dialog.js");
29
+ var import_gradient_button = require("../../gradient-button.js");
30
+ var import_button = require("../../button.js");
31
+ var import_describe_error = require("../../../utils/describe-error.js");
32
+ function DropMintDialog({
33
+ open,
34
+ onClose,
35
+ name,
36
+ quantity,
37
+ totalText,
38
+ onMint,
39
+ portfolioHref
40
+ }) {
41
+ const [step, setStep] = (0, import_react.useState)({ kind: "confirm" });
42
+ const mint = async () => {
43
+ setStep({ kind: "minting" });
44
+ try {
45
+ setStep({ kind: "done", tokenIds: (await onMint()).tokenIds });
46
+ } catch (err) {
47
+ setStep({ kind: "error", message: (0, import_describe_error.describeError)(err, "The mint didn't go through. Please try again.").message });
48
+ }
49
+ };
50
+ const close = () => {
51
+ if (step.kind === "minting") return;
52
+ setStep({ kind: "confirm" });
53
+ onClose();
54
+ };
55
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_action_dialog.ActionDialog, { open, onClose: close, width: 460, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-5 p-6", children: [
56
+ step.kind === "confirm" && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
57
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("h2", { className: "text-lg font-semibold", children: [
58
+ "Mint ",
59
+ quantity.toString(),
60
+ " from ",
61
+ name
62
+ ] }),
63
+ totalText && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm text-muted-foreground", children: totalText }),
64
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_gradient_button.GradientButton, { big: true, onClick: () => void mint(), children: "Confirm mint" })
65
+ ] }),
66
+ step.kind === "minting" && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("h2", { className: "flex items-center gap-2 text-lg font-semibold", children: [
67
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Loader2, { className: "h-4 w-4 animate-spin" }),
68
+ "Minting\u2026"
69
+ ] }),
70
+ step.kind === "done" && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
71
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("h2", { className: "flex items-center gap-2 text-lg font-semibold", children: [
72
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.CheckCircle2, { className: "h-5 w-5 text-green-500" }),
73
+ "Minted"
74
+ ] }),
75
+ step.tokenIds.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", { className: "text-sm text-muted-foreground", children: [
76
+ "Token",
77
+ step.tokenIds.length > 1 ? "s" : "",
78
+ " #",
79
+ step.tokenIds.join(", #")
80
+ ] }),
81
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_button.Button, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("a", { href: portfolioHref, children: "View in portfolio" }) })
82
+ ] }),
83
+ step.kind === "error" && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
84
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("h2", { className: "flex items-center gap-2 text-lg font-semibold", children: [
85
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.XCircle, { className: "h-4 w-4 text-destructive" }),
86
+ "Not minted"
87
+ ] }),
88
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm text-muted-foreground", children: step.message }),
89
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_button.Button, { onClick: () => void mint(), children: "Try again" })
90
+ ] })
91
+ ] }) });
92
+ }
93
+ // Annotate the CommonJS export names for ESM import in node:
94
+ 0 && (module.exports = {
95
+ DropMintDialog
96
+ });
97
+ //# sourceMappingURL=drop-mint-dialog.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/drop/page/drop-mint-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { CheckCircle2, Loader2, XCircle } from \"lucide-react\";\nimport { ActionDialog } from \"../../action-dialog.js\";\nimport { GradientButton } from \"../../gradient-button.js\";\nimport { Button } from \"../../button.js\";\nimport { describeError } from \"../../../utils/describe-error.js\";\n\ntype Step = { kind: \"confirm\" } | { kind: \"minting\" } | { kind: \"done\"; tokenIds: string[] } | { kind: \"error\"; message: string };\n\nexport function DropMintDialog({\n open, onClose, name, quantity, totalText, onMint, portfolioHref,\n}: {\n open: boolean;\n onClose: () => void;\n name: string;\n quantity: bigint;\n totalText: string | null;\n onMint: () => Promise<{ tokenIds: string[] }>;\n portfolioHref: string;\n}) {\n const [step, setStep] = useState<Step>({ kind: \"confirm\" });\n const mint = async () => {\n setStep({ kind: \"minting\" });\n try {\n setStep({ kind: \"done\", tokenIds: (await onMint()).tokenIds });\n } catch (err) {\n setStep({ kind: \"error\", message: describeError(err, \"The mint didn't go through. Please try again.\").message });\n }\n };\n const close = () => {\n if (step.kind === \"minting\") return;\n setStep({ kind: \"confirm\" });\n onClose();\n };\n return (\n <ActionDialog open={open} onClose={close} width={460}>\n <div className=\"space-y-5 p-6\">\n {step.kind === \"confirm\" && (\n <>\n <h2 className=\"text-lg font-semibold\">Mint {quantity.toString()} from {name}</h2>\n {totalText && <p className=\"text-sm text-muted-foreground\">{totalText}</p>}\n <GradientButton big onClick={() => void mint()}>Confirm mint</GradientButton>\n </>\n )}\n {step.kind === \"minting\" && <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><Loader2 className=\"h-4 w-4 animate-spin\" />Minting…</h2>}\n {step.kind === \"done\" && (\n <>\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><CheckCircle2 className=\"h-5 w-5 text-green-500\" />Minted</h2>\n {step.tokenIds.length > 0 && <p className=\"text-sm text-muted-foreground\">Token{step.tokenIds.length > 1 ? \"s\" : \"\"} #{step.tokenIds.join(\", #\")}</p>}\n <Button asChild><a href={portfolioHref}>View in portfolio</a></Button>\n </>\n )}\n {step.kind === \"error\" && (\n <>\n <h2 className=\"flex items-center gap-2 text-lg font-semibold\"><XCircle className=\"h-4 w-4 text-destructive\" />Not minted</h2>\n <p className=\"text-sm text-muted-foreground\">{step.message}</p>\n <Button onClick={() => void mint()}>Try again</Button>\n </>\n )}\n </div>\n </ActionDialog>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAwCU;AAtCV,mBAAyB;AACzB,0BAA+C;AAC/C,2BAA6B;AAC7B,6BAA+B;AAC/B,oBAAuB;AACvB,4BAA8B;AAIvB,SAAS,eAAe;AAAA,EAC7B;AAAA,EAAM;AAAA,EAAS;AAAA,EAAM;AAAA,EAAU;AAAA,EAAW;AAAA,EAAQ;AACpD,GAQG;AACD,QAAM,CAAC,MAAM,OAAO,QAAI,uBAAe,EAAE,MAAM,UAAU,CAAC;AAC1D,QAAM,OAAO,YAAY;AACvB,YAAQ,EAAE,MAAM,UAAU,CAAC;AAC3B,QAAI;AACF,cAAQ,EAAE,MAAM,QAAQ,WAAW,MAAM,OAAO,GAAG,SAAS,CAAC;AAAA,IAC/D,SAAS,KAAK;AACZ,cAAQ,EAAE,MAAM,SAAS,aAAS,qCAAc,KAAK,+CAA+C,EAAE,QAAQ,CAAC;AAAA,IACjH;AAAA,EACF;AACA,QAAM,QAAQ,MAAM;AAClB,QAAI,KAAK,SAAS,UAAW;AAC7B,YAAQ,EAAE,MAAM,UAAU,CAAC;AAC3B,YAAQ;AAAA,EACV;AACA,SACE,4CAAC,qCAAa,MAAY,SAAS,OAAO,OAAO,KAC/C,uDAAC,SAAI,WAAU,iBACZ;AAAA,SAAK,SAAS,aACb,4EACE;AAAA,mDAAC,QAAG,WAAU,yBAAwB;AAAA;AAAA,QAAM,SAAS,SAAS;AAAA,QAAE;AAAA,QAAO;AAAA,SAAK;AAAA,MAC3E,aAAa,4CAAC,OAAE,WAAU,iCAAiC,qBAAU;AAAA,MACtE,4CAAC,yCAAe,KAAG,MAAC,SAAS,MAAM,KAAK,KAAK,GAAG,0BAAY;AAAA,OAC9D;AAAA,IAED,KAAK,SAAS,aAAa,6CAAC,QAAG,WAAU,iDAAgD;AAAA,kDAAC,+BAAQ,WAAU,wBAAuB;AAAA,MAAE;AAAA,OAAQ;AAAA,IAC7I,KAAK,SAAS,UACb,4EACE;AAAA,mDAAC,QAAG,WAAU,iDAAgD;AAAA,oDAAC,oCAAa,WAAU,0BAAyB;AAAA,QAAE;AAAA,SAAM;AAAA,MACtH,KAAK,SAAS,SAAS,KAAK,6CAAC,OAAE,WAAU,iCAAgC;AAAA;AAAA,QAAM,KAAK,SAAS,SAAS,IAAI,MAAM;AAAA,QAAG;AAAA,QAAG,KAAK,SAAS,KAAK,KAAK;AAAA,SAAE;AAAA,MACjJ,4CAAC,wBAAO,SAAO,MAAC,sDAAC,OAAE,MAAM,eAAe,+BAAiB,GAAI;AAAA,OAC/D;AAAA,IAED,KAAK,SAAS,WACb,4EACE;AAAA,mDAAC,QAAG,WAAU,iDAAgD;AAAA,oDAAC,+BAAQ,WAAU,4BAA2B;AAAA,QAAE;AAAA,SAAU;AAAA,MACxH,4CAAC,OAAE,WAAU,iCAAiC,eAAK,SAAQ;AAAA,MAC3D,4CAAC,wBAAO,SAAS,MAAM,KAAK,KAAK,GAAG,uBAAS;AAAA,OAC/C;AAAA,KAEJ,GACF;AAEJ;","names":[]}
@@ -0,0 +1,15 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare function DropMintDialog({ open, onClose, name, quantity, totalText, onMint, portfolioHref, }: {
4
+ open: boolean;
5
+ onClose: () => void;
6
+ name: string;
7
+ quantity: bigint;
8
+ totalText: string | null;
9
+ onMint: () => Promise<{
10
+ tokenIds: string[];
11
+ }>;
12
+ portfolioHref: string;
13
+ }): react_jsx_runtime.JSX.Element;
14
+
15
+ export { DropMintDialog };
@@ -0,0 +1,15 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare function DropMintDialog({ open, onClose, name, quantity, totalText, onMint, portfolioHref, }: {
4
+ open: boolean;
5
+ onClose: () => void;
6
+ name: string;
7
+ quantity: bigint;
8
+ totalText: string | null;
9
+ onMint: () => Promise<{
10
+ tokenIds: string[];
11
+ }>;
12
+ portfolioHref: string;
13
+ }): react_jsx_runtime.JSX.Element;
14
+
15
+ export { DropMintDialog };