@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
@@ -1,85 +0,0 @@
1
- import { jsx } from "react/jsx-runtime";
2
- import { describe, expect, test } from "bun:test";
3
- import { renderToStaticMarkup } from "react-dom/server";
4
- import { Shield } from "lucide-react";
5
- import { AccountSection } from "./account-section.js";
6
- import { EmailCodeEntry } from "./email-code-entry.js";
7
- import { DevicesSection } from "./devices-section.js";
8
- import { GuardianRecoverySection } from "./guardian-recovery-section.js";
9
- import { initialEmailCodeState } from "../../utils/email-code.js";
10
- const emailCode = (state) => ({
11
- state: { ...initialEmailCodeState, ...state },
12
- setCode: () => {
13
- },
14
- send: async () => true,
15
- fail: () => {
16
- },
17
- verify: async () => true,
18
- markReady: () => {
19
- }
20
- });
21
- const wallet = {
22
- getOwners: async () => [],
23
- addDevice: async () => "",
24
- removeDevice: async () => "",
25
- getGuardians: async () => [],
26
- getEscape: async () => ({ escapeType: "None", status: "None", readyAt: 0 }),
27
- setFirstGuardian: async () => "",
28
- cancelEscape: async () => ""
29
- };
30
- describe("an account section", () => {
31
- test("shows its title, description and content", () => {
32
- const html = renderToStaticMarkup(
33
- /* @__PURE__ */ jsx(AccountSection, { icon: Shield, title: "Devices", description: "Who can sign", children: /* @__PURE__ */ jsx("p", { children: "content" }) })
34
- );
35
- expect(html).toContain("Devices");
36
- expect(html).toContain("Who can sign");
37
- expect(html).toContain("content");
38
- });
39
- });
40
- describe("the email code entry", () => {
41
- test("says the code is being sent", () => {
42
- expect(renderToStaticMarkup(/* @__PURE__ */ jsx(EmailCodeEntry, { emailCode: emailCode({ status: "sending" }), onVerify: () => {
43
- } }))).toContain("Sending code");
44
- });
45
- test("shows an error", () => {
46
- const html = renderToStaticMarkup(/* @__PURE__ */ jsx(EmailCodeEntry, { emailCode: emailCode({ status: "ready", error: "Incorrect code" }), onVerify: () => {
47
- } }));
48
- expect(html).toContain("Incorrect code");
49
- });
50
- test("counts down before the code can be sent again", () => {
51
- const html = renderToStaticMarkup(/* @__PURE__ */ jsx(EmailCodeEntry, { emailCode: emailCode({ status: "ready", cooldown: 30 }), onVerify: () => {
52
- } }));
53
- expect(html).toContain("resend in 30s");
54
- expect(html).not.toContain("resend the code");
55
- });
56
- test("offers a resend once the cooldown is over, and keeps verify off until six digits", () => {
57
- const html = renderToStaticMarkup(/* @__PURE__ */ jsx(EmailCodeEntry, { emailCode: emailCode({ status: "ready", cooldown: 0, code: "123" }), onVerify: () => {
58
- } }));
59
- expect(html).toContain("resend the code");
60
- expect(html).toMatch(/<button[^>]*disabled[^>]*>[^<]*Verify/);
61
- });
62
- });
63
- describe("the devices section", () => {
64
- test("starts with its heading and the add button while devices load", () => {
65
- const html = renderToStaticMarkup(/* @__PURE__ */ jsx(DevicesSection, { walletAddress: "0x1", wallet, loadSealed: () => null }));
66
- expect(html).toContain("Your devices");
67
- expect(html).toContain("Add");
68
- });
69
- });
70
- describe("the guardian recovery section", () => {
71
- test("links to the app's recovery page", () => {
72
- const html = renderToStaticMarkup(
73
- /* @__PURE__ */ jsx(GuardianRecoverySection, { walletAddress: "0x1", wallet, loadSealed: () => null, guardianRecoveryAvailable: true, recoverHref: "/settings/recovery" })
74
- );
75
- expect(html).toContain("Guardian recovery");
76
- expect(html).toContain('href="/settings/recovery"');
77
- });
78
- test("defaults the recovery link to /recover", () => {
79
- const html = renderToStaticMarkup(
80
- /* @__PURE__ */ jsx(GuardianRecoverySection, { walletAddress: "0x1", wallet, loadSealed: () => null, guardianRecoveryAvailable: false })
81
- );
82
- expect(html).toContain('href="/recover"');
83
- });
84
- });
85
- //# sourceMappingURL=account.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/components/account/account.test.tsx"],"sourcesContent":["import { describe, expect, test } from \"bun:test\";\nimport { renderToStaticMarkup } from \"react-dom/server\";\nimport { Shield } from \"lucide-react\";\nimport { AccountSection } from \"./account-section.js\";\nimport { EmailCodeEntry } from \"./email-code-entry.js\";\nimport { DevicesSection } from \"./devices-section.js\";\nimport { GuardianRecoverySection } from \"./guardian-recovery-section.js\";\nimport { initialEmailCodeState, type EmailCodeState } from \"../../utils/email-code.js\";\nimport type { EmailCode } from \"../../utils/use-email-code.js\";\n\nconst emailCode = (state: Partial<EmailCodeState>): EmailCode => ({\n state: { ...initialEmailCodeState, ...state },\n setCode: () => {},\n send: async () => true,\n fail: () => {},\n verify: async () => true,\n markReady: () => {},\n});\n\nconst wallet = {\n getOwners: async () => [],\n addDevice: async () => \"\",\n removeDevice: async () => \"\",\n getGuardians: async () => [],\n getEscape: async () => ({ escapeType: \"None\", status: \"None\", readyAt: 0 }),\n setFirstGuardian: async () => \"\",\n cancelEscape: async () => \"\",\n} as never;\n\ndescribe(\"an account section\", () => {\n test(\"shows its title, description and content\", () => {\n const html = renderToStaticMarkup(\n <AccountSection icon={Shield} title=\"Devices\" description=\"Who can sign\">\n <p>content</p>\n </AccountSection>,\n );\n expect(html).toContain(\"Devices\");\n expect(html).toContain(\"Who can sign\");\n expect(html).toContain(\"content\");\n });\n});\n\ndescribe(\"the email code entry\", () => {\n test(\"says the code is being sent\", () => {\n expect(renderToStaticMarkup(<EmailCodeEntry emailCode={emailCode({ status: \"sending\" })} onVerify={() => {}} />)).toContain(\"Sending code\");\n });\n\n test(\"shows an error\", () => {\n const html = renderToStaticMarkup(<EmailCodeEntry emailCode={emailCode({ status: \"ready\", error: \"Incorrect code\" })} onVerify={() => {}} />);\n expect(html).toContain(\"Incorrect code\");\n });\n\n test(\"counts down before the code can be sent again\", () => {\n const html = renderToStaticMarkup(<EmailCodeEntry emailCode={emailCode({ status: \"ready\", cooldown: 30 })} onVerify={() => {}} />);\n expect(html).toContain(\"resend in 30s\");\n expect(html).not.toContain(\"resend the code\");\n });\n\n test(\"offers a resend once the cooldown is over, and keeps verify off until six digits\", () => {\n const html = renderToStaticMarkup(<EmailCodeEntry emailCode={emailCode({ status: \"ready\", cooldown: 0, code: \"123\" })} onVerify={() => {}} />);\n expect(html).toContain(\"resend the code\");\n expect(html).toMatch(/<button[^>]*disabled[^>]*>[^<]*Verify/);\n });\n});\n\ndescribe(\"the devices section\", () => {\n test(\"starts with its heading and the add button while devices load\", () => {\n const html = renderToStaticMarkup(<DevicesSection walletAddress=\"0x1\" wallet={wallet} loadSealed={() => null} />);\n expect(html).toContain(\"Your devices\");\n expect(html).toContain(\"Add\");\n });\n});\n\ndescribe(\"the guardian recovery section\", () => {\n test(\"links to the app's recovery page\", () => {\n const html = renderToStaticMarkup(\n <GuardianRecoverySection walletAddress=\"0x1\" wallet={wallet} loadSealed={() => null} guardianRecoveryAvailable recoverHref=\"/settings/recovery\" />,\n );\n expect(html).toContain(\"Guardian recovery\");\n expect(html).toContain('href=\"/settings/recovery\"');\n });\n\n test(\"defaults the recovery link to /recover\", () => {\n const html = renderToStaticMarkup(\n <GuardianRecoverySection walletAddress=\"0x1\" wallet={wallet} loadSealed={() => null} guardianRecoveryAvailable={false} />,\n );\n expect(html).toContain('href=\"/recover\"');\n });\n});\n"],"mappings":"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","names":[]}
@@ -1,341 +0,0 @@
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_create_form_exports = {};
21
- __export(drop_create_form_exports, {
22
- DropCreateForm: () => DropCreateForm
23
- });
24
- module.exports = __toCommonJS(drop_create_form_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_input = require("./input.js");
29
- var import_textarea = require("./textarea.js");
30
- var import_form = require("./form.js");
31
- var import_select = require("./select.js");
32
- var import_collapsible_section = require("./collapsible-section.js");
33
- var import_create_form_primitives = require("./create-form-primitives.js");
34
- var import_ip_type_fields = require("./ip-type-fields.js");
35
- var import_drop_item_list = require("./drop-item-list.js");
36
- var import_exclusive_content_section = require("./exclusive-content-section.js");
37
- var import_cn = require("../utils/cn.js");
38
- var import_ip = require("../data/ip.js");
39
- function DropCreateForm({
40
- form,
41
- imagePreview,
42
- imageUploading,
43
- isSubmitting,
44
- priceFree,
45
- isPublic,
46
- paymentTokens,
47
- selectedToken,
48
- tokenDropdownOpen,
49
- fileInputRef,
50
- items,
51
- onImageSelect,
52
- onSetPriceFree,
53
- onSetTokenDropdownOpen,
54
- onSelectToken,
55
- onSetPublic,
56
- onAddItemFiles,
57
- onRemoveItem,
58
- onEditItem,
59
- onMetadataFieldsChange,
60
- uploadDocument
61
- }) {
62
- const tokenDropdownRef = (0, import_react.useRef)(null);
63
- const collectionName = form.watch("name");
64
- const whitelistEnabled = form.watch("whitelistEnabled");
65
- const [licensingOpen, setLicensingOpen] = (0, import_react.useState)(false);
66
- const [advancedOpen, setAdvancedOpen] = (0, import_react.useState)(false);
67
- (0, import_react.useEffect)(() => {
68
- if (!tokenDropdownOpen) return;
69
- const onPointer = (e) => {
70
- if (!tokenDropdownRef.current?.contains(e.target)) onSetTokenDropdownOpen(false);
71
- };
72
- const onEsc = (e) => {
73
- if (e.key === "Escape") onSetTokenDropdownOpen(false);
74
- };
75
- document.addEventListener("mousedown", onPointer);
76
- document.addEventListener("keydown", onEsc);
77
- return () => {
78
- document.removeEventListener("mousedown", onPointer);
79
- document.removeEventListener("keydown", onEsc);
80
- };
81
- }, [onSetTokenDropdownOpen, tokenDropdownOpen]);
82
- const handleLicenseChange = (value) => {
83
- form.setValue("licenseType", value);
84
- const def = import_ip.LICENSE_TYPES.find((l) => l.value === value);
85
- if (def) {
86
- form.setValue("commercialUse", def.commercialUse);
87
- form.setValue("derivatives", def.derivatives);
88
- form.setValue("attribution", def.attribution);
89
- }
90
- };
91
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-5", children: [
92
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_create_form_primitives.Section, { title: "Collection Details", icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Package, { className: "h-4 w-4" }), children: [
93
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-2", children: [
94
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("label", { className: "text-sm font-medium", children: [
95
- "Cover image ",
96
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-muted-foreground font-normal", children: "(optional)" })
97
- ] }),
98
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
99
- "div",
100
- {
101
- className: "border-2 border-dashed border-border rounded-xl p-8 text-center cursor-pointer hover:border-primary/50 transition-colors",
102
- role: "button",
103
- tabIndex: 0,
104
- "aria-label": "Upload cover image",
105
- onClick: () => !imageUploading && fileInputRef.current?.click(),
106
- onKeyDown: (e) => {
107
- if (e.key === "Enter" || e.key === " ") {
108
- e.preventDefault();
109
- fileInputRef.current?.click();
110
- }
111
- },
112
- onDragOver: (e) => e.preventDefault(),
113
- onDrop: (e) => {
114
- e.preventDefault();
115
- const file = e.dataTransfer.files?.[0];
116
- if (file && !imageUploading) onImageSelect(file);
117
- },
118
- children: [
119
- imagePreview ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("img", { src: imagePreview, alt: "Cover preview", className: "mx-auto max-h-48 rounded-lg object-contain" }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-col items-center gap-2 text-muted-foreground", children: [
120
- imageUploading ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Loader2, { className: "h-8 w-8 animate-spin" }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Upload, { className: "h-8 w-8" }),
121
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm", children: imageUploading ? "Uploading\u2026" : "Drag in a cover image, or click to browse" }),
122
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-xs", children: "JPG, PNG, GIF, SVG, WebP \xB7 max 10 MB \xB7 shown on the drop card" })
123
- ] }),
124
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
125
- "input",
126
- {
127
- ref: fileInputRef,
128
- type: "file",
129
- accept: "image/*",
130
- className: "hidden",
131
- onChange: (e) => {
132
- const file = e.target.files?.[0];
133
- if (file) onImageSelect(file);
134
- }
135
- }
136
- )
137
- ]
138
- }
139
- )
140
- ] }),
141
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormField, { control: form.control, name: "name", render: ({ field }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_form.FormItem, { children: [
142
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormLabel, { children: "Collection name *" }),
143
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormControl, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_input.Input, { placeholder: "Genesis Series", ...field }) }),
144
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormDescription, { children: "Shown across the drop page, wallet, and marketplace." }),
145
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormMessage, {})
146
- ] }) }),
147
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormField, { control: form.control, name: "symbol", render: ({ field }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_form.FormItem, { children: [
148
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormLabel, { children: "Symbol *" }),
149
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormControl, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_input.Input, { placeholder: "GEN", ...field, onChange: (e) => field.onChange(e.target.value.toUpperCase()), className: "max-w-[160px]" }) }),
150
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormDescription, { children: "Short ticker shown in wallets and explorers." }),
151
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormMessage, {})
152
- ] }) })
153
- ] }),
154
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_create_form_primitives.Section, { title: "NFTs", icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Layers, { className: "h-4 w-4" }), children: [
155
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-xs text-muted-foreground", children: "Each image becomes a unique, individually-licensed NFT. Supply equals the number of NFTs." }),
156
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_drop_item_list.DropItemList, { items, collectionName, onAddFiles: onAddItemFiles, onRemove: onRemoveItem, onEdit: onEditItem })
157
- ] }),
158
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
159
- import_collapsible_section.CollapsibleSection,
160
- {
161
- open: licensingOpen,
162
- onOpenChange: setLicensingOpen,
163
- icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ShieldCheck, { className: "h-4 w-4 text-primary" }),
164
- label: "License Terms",
165
- hint: "Applied to every NFT \xB7 Berne Convention",
166
- children: [
167
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-xs text-muted-foreground", children: "These license terms are saved permanently with every NFT in the drop. CC BY-SA by default." }),
168
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormField, { control: form.control, name: "licenseType", render: ({ field }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_form.FormItem, { children: [
169
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormLabel, { children: "License" }),
170
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_select.Select, { value: field.value, onValueChange: handleLicenseChange, children: [
171
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormControl, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_select.SelectTrigger, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_select.SelectValue, {}) }) }),
172
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_select.SelectContent, { children: import_ip.LICENSE_TYPES.map((l) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_select.SelectItem, { value: l.value, children: l.label ?? l.value }, l.value)) })
173
- ] }),
174
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormMessage, {})
175
- ] }) }),
176
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormField, { control: form.control, name: "commercialUse", render: ({ field }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_form.FormItem, { children: [
177
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormLabel, { children: "Commercial Use" }),
178
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_create_form_primitives.ToggleGroup, { value: field.value, options: ["Yes", "No"], onChange: field.onChange })
179
- ] }) }),
180
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormField, { control: form.control, name: "derivatives", render: ({ field }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_form.FormItem, { children: [
181
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormLabel, { children: "Derivatives" }),
182
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_create_form_primitives.ToggleGroup, { value: field.value, options: import_ip.DERIVATIVES_OPTIONS, onChange: field.onChange })
183
- ] }) }),
184
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormField, { control: form.control, name: "attribution", render: ({ field }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_form.FormItem, { children: [
185
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormLabel, { children: "Attribution" }),
186
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_create_form_primitives.ToggleGroup, { value: field.value, options: ["Required", "Not Required"], onChange: field.onChange })
187
- ] }) }),
188
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormField, { control: form.control, name: "ipType", render: ({ field }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_form.FormItem, { children: [
189
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormLabel, { children: "IP Type" }),
190
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_select.Select, { onValueChange: field.onChange, value: field.value, children: [
191
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormControl, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_select.SelectTrigger, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_select.SelectValue, {}) }) }),
192
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_select.SelectContent, { children: import_ip.IP_TYPES.map((t) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_select.SelectItem, { value: t, children: t }, t)) })
193
- ] })
194
- ] }) }),
195
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ip_type_fields.IPTypeFields, { ipType: form.watch("ipType"), onChange: onMetadataFieldsChange, uploadDocument }),
196
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
197
- "button",
198
- {
199
- type: "button",
200
- onClick: () => setAdvancedOpen((o) => !o),
201
- className: "flex items-center gap-1.5 text-xs text-muted-foreground hover:text-foreground transition-colors",
202
- children: [
203
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ChevronDown, { className: (0, import_cn.cn)("h-3.5 w-3.5 transition-transform", advancedOpen && "rotate-180") }),
204
- "Advanced options"
205
- ]
206
- }
207
- ),
208
- advancedOpen && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-4 pt-1", children: [
209
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormField, { control: form.control, name: "geographicScope", render: ({ field }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_form.FormItem, { children: [
210
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormLabel, { children: "Territory" }),
211
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormControl, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_input.Input, { placeholder: "Worldwide", ...field }) })
212
- ] }) }),
213
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormField, { control: form.control, name: "aiPolicy", render: ({ field }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_form.FormItem, { children: [
214
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormLabel, { children: "AI & Data Mining" }),
215
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_create_form_primitives.ToggleGroup, { value: field.value, options: import_ip.AI_POLICIES, onChange: field.onChange })
216
- ] }) }),
217
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormField, { control: form.control, name: "royalty", render: ({ field }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_form.FormItem, { children: [
218
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormLabel, { children: "Royalty % (0\u201350)" }),
219
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormControl, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_input.Input, { type: "number", min: 0, max: 50, step: 0.5, placeholder: "0", ...field, onChange: (e) => field.onChange(parseFloat(e.target.value) || 0) }) }),
220
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormMessage, {})
221
- ] }) })
222
- ] })
223
- ]
224
- }
225
- ),
226
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_create_form_primitives.Section, { title: "Drop Settings", icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Sparkles, { className: "h-4 w-4" }), children: [
227
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-2", children: [
228
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("label", { className: "text-sm font-medium", children: "Mint price" }),
229
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_create_form_primitives.ToggleGroup, { value: priceFree ? "Free" : "Paid", options: ["Free", "Paid"], onChange: (v) => onSetPriceFree(v === "Free") }),
230
- !priceFree && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex gap-2 items-start pt-1", children: [
231
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormField, { control: form.control, name: "priceAmount", render: ({ field }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_form.FormItem, { className: "flex-1", children: [
232
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormControl, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_input.Input, { type: "number", placeholder: "0.01", step: "any", min: 0, ...field }) }),
233
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormMessage, {})
234
- ] }) }),
235
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { ref: tokenDropdownRef, className: "relative", children: [
236
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
237
- "button",
238
- {
239
- type: "button",
240
- onClick: () => onSetTokenDropdownOpen(!tokenDropdownOpen),
241
- "aria-haspopup": "listbox",
242
- "aria-expanded": tokenDropdownOpen,
243
- className: "flex items-center gap-1.5 h-10 px-3 rounded-md border border-border bg-muted/30 text-sm font-semibold hover:border-primary/50 transition-colors",
244
- children: [
245
- selectedToken.symbol,
246
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ChevronDown, { className: "h-3.5 w-3.5 text-muted-foreground" })
247
- ]
248
- }
249
- ),
250
- tokenDropdownOpen && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { role: "listbox", className: "absolute top-11 right-0 z-50 w-28 rounded-lg border border-border bg-background shadow-lg py-1", children: paymentTokens.map((t) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
251
- "button",
252
- {
253
- type: "button",
254
- role: "option",
255
- "aria-selected": selectedToken.address === t.address,
256
- onClick: () => onSelectToken(t),
257
- className: (0, import_cn.cn)("w-full text-left px-3 py-1.5 text-sm hover:bg-muted transition-colors", selectedToken.address === t.address && "text-primary font-semibold"),
258
- children: t.symbol
259
- },
260
- t.address
261
- )) })
262
- ] })
263
- ] }),
264
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-xs text-muted-foreground", children: "A free claim, or a fixed price per token." })
265
- ] }),
266
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormField, { control: form.control, name: "maxPerWallet", render: ({ field }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_form.FormItem, { children: [
267
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormLabel, { children: "Max per wallet" }),
268
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormControl, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_input.Input, { type: "number", min: 1, max: 1e4, className: "max-w-[120px]", ...field }) }),
269
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormMessage, {})
270
- ] }) }),
271
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-2", children: [
272
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("label", { className: "text-sm font-medium", children: "Mint window *" }),
273
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4", children: [
274
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-1.5", children: [
275
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-xs text-muted-foreground", children: "Opens" }),
276
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex gap-2", children: [
277
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormField, { control: form.control, name: "startDate", render: ({ field }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_form.FormItem, { className: "flex-1", children: [
278
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormControl, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_input.Input, { type: "date", ...field }) }),
279
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormMessage, {})
280
- ] }) }),
281
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormField, { control: form.control, name: "startTime", render: ({ field }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormItem, { className: "w-28", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormControl, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_input.Input, { type: "time", ...field }) }) }) })
282
- ] })
283
- ] }),
284
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-1.5", children: [
285
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-xs text-muted-foreground", children: "Closes" }),
286
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex gap-2", children: [
287
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormField, { control: form.control, name: "endDate", render: ({ field }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_form.FormItem, { className: "flex-1", children: [
288
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormControl, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_input.Input, { type: "date", ...field }) }),
289
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormMessage, {})
290
- ] }) }),
291
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormField, { control: form.control, name: "endTime", render: ({ field }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormItem, { className: "w-28", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormControl, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_input.Input, { type: "time", ...field }) }) }) })
292
- ] })
293
- ] })
294
- ] })
295
- ] }),
296
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-2", children: [
297
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("label", { className: "text-sm font-medium", children: "Listing visibility" }),
298
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_create_form_primitives.ToggleGroup, { value: isPublic ? "Public" : "Hidden", options: ["Public", "Hidden"], onChange: (v) => onSetPublic(v === "Public") }),
299
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-xs text-muted-foreground", children: isPublic ? "Listed on the Drop launchpad." : "Hidden \u2014 only reachable by direct link." })
300
- ] })
301
- ] }),
302
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
303
- import_collapsible_section.CollapsibleSection,
304
- {
305
- open: whitelistEnabled,
306
- onOpenChange: (o) => form.setValue("whitelistEnabled", o),
307
- icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Users, { className: "h-4 w-4 text-primary" }),
308
- label: "Whitelist",
309
- hint: whitelistEnabled ? "Only listed addresses can mint" : "Optional \xB7 restrict who can mint",
310
- contentSpacing: "space-y-3",
311
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormField, { control: form.control, name: "allowlistAddresses", render: ({ field }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_form.FormItem, { children: [
312
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormControl, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_textarea.Textarea, { placeholder: "Paste Starknet addresses, one per line:\n0x04a\u2026\n0x06b\u2026", rows: 5, ...field, className: "tabular-nums text-xs resize-none" }) }),
313
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormDescription, { className: "text-xs", children: "Only these wallets can mint. You can open it to everyone later from Manage." }),
314
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form.FormMessage, {})
315
- ] }) })
316
- }
317
- ),
318
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_exclusive_content_section.ExclusiveContentSection, { form }),
319
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
320
- "button",
321
- {
322
- type: "submit",
323
- disabled: isSubmitting || imageUploading,
324
- className: (0, import_cn.cn)("w-full h-12 text-base font-semibold text-white rounded-xl flex items-center justify-center gap-2 transition-all hover:brightness-110 active:scale-[0.98] bg-brand-blue", (isSubmitting || imageUploading) && "opacity-40 pointer-events-none"),
325
- children: isSubmitting ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
326
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Loader2, { className: "h-4 w-4 animate-spin" }),
327
- "Launching\u2026"
328
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
329
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Package, { className: "h-4 w-4" }),
330
- "Launch Drop"
331
- ] })
332
- }
333
- ),
334
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-xs text-center text-muted-foreground", children: "Supply equals the number of NFTs you add. Zero platform fees to launch." })
335
- ] });
336
- }
337
- // Annotate the CommonJS export names for ESM import in node:
338
- 0 && (module.exports = {
339
- DropCreateForm
340
- });
341
- //# sourceMappingURL=drop-create-form.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/components/drop-create-form.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport type { RefObject } from \"react\";\nimport type { UseFormReturn } from \"react-hook-form\";\nimport { ChevronDown, Layers, Loader2, Package, ShieldCheck, Sparkles, Upload, Users } from \"lucide-react\";\nimport { Input } from \"./input.js\";\nimport { Textarea } from \"./textarea.js\";\nimport { FormControl, FormField, FormItem, FormLabel, FormMessage, FormDescription } from \"./form.js\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"./select.js\";\nimport { CollapsibleSection } from \"./collapsible-section.js\";\nimport { ToggleGroup, Section } from \"./create-form-primitives.js\";\nimport { IPTypeFields, type MetadataField } from \"./ip-type-fields.js\";\nimport { DropItemList, type DraftItem } from \"./drop-item-list.js\";\nimport { ExclusiveContentSection } from \"./exclusive-content-section.js\";\nimport { cn } from \"../utils/cn.js\";\nimport {\n IP_TYPES, LICENSE_TYPES, AI_POLICIES, DERIVATIVES_OPTIONS, type IPType,\n} from \"../data/ip.js\";\nimport type { DropCreateFormValues } from \"../data/drop-create-schema.js\";\n\nexport interface PaymentTokenOption {\n symbol: string;\n address: string;\n}\n\ninterface DropCreateFormProps {\n form: UseFormReturn<DropCreateFormValues>;\n imagePreview: string | null;\n imageUploading: boolean;\n isSubmitting: boolean;\n priceFree: boolean;\n isPublic: boolean;\n paymentTokens: PaymentTokenOption[];\n selectedToken: PaymentTokenOption;\n tokenDropdownOpen: boolean;\n fileInputRef: RefObject<HTMLInputElement | null>;\n items: DraftItem[];\n onImageSelect: (file: File) => void;\n onSetPriceFree: (value: boolean) => void;\n onSetTokenDropdownOpen: (open: boolean) => void;\n onSelectToken: (token: PaymentTokenOption) => void;\n onSetPublic: (value: boolean) => void;\n onAddItemFiles: (files: File[]) => void;\n onRemoveItem: (id: string) => void;\n onEditItem: (id: string, patch: Partial<Pick<DraftItem, \"name\" | \"description\">>) => void;\n onMetadataFieldsChange: (fields: MetadataField[]) => void;\n uploadDocument: (file: File) => Promise<string>;\n}\n\nexport function DropCreateForm({\n form, imagePreview, imageUploading, isSubmitting, priceFree, isPublic,\n paymentTokens, selectedToken, tokenDropdownOpen, fileInputRef, items,\n onImageSelect, onSetPriceFree, onSetTokenDropdownOpen, onSelectToken, onSetPublic,\n onAddItemFiles, onRemoveItem, onEditItem, onMetadataFieldsChange,\n uploadDocument,\n}: DropCreateFormProps) {\n const tokenDropdownRef = useRef<HTMLDivElement | null>(null);\n const collectionName = form.watch(\"name\");\n const whitelistEnabled = form.watch(\"whitelistEnabled\");\n const [licensingOpen, setLicensingOpen] = useState(false);\n const [advancedOpen, setAdvancedOpen] = useState(false);\n\n useEffect(() => {\n if (!tokenDropdownOpen) return;\n const onPointer = (e: MouseEvent) => { if (!tokenDropdownRef.current?.contains(e.target as Node)) onSetTokenDropdownOpen(false); };\n const onEsc = (e: KeyboardEvent) => { if (e.key === \"Escape\") onSetTokenDropdownOpen(false); };\n document.addEventListener(\"mousedown\", onPointer);\n document.addEventListener(\"keydown\", onEsc);\n return () => { document.removeEventListener(\"mousedown\", onPointer); document.removeEventListener(\"keydown\", onEsc); };\n }, [onSetTokenDropdownOpen, tokenDropdownOpen]);\n\n const handleLicenseChange = (value: string) => {\n form.setValue(\"licenseType\", value);\n const def = LICENSE_TYPES.find((l) => l.value === value);\n if (def) {\n form.setValue(\"commercialUse\", def.commercialUse);\n form.setValue(\"derivatives\", def.derivatives);\n form.setValue(\"attribution\", def.attribution);\n }\n };\n\n return (\n <div className=\"space-y-5\">\n\n <Section title=\"Collection Details\" icon={<Package className=\"h-4 w-4\" />}>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Cover image <span className=\"text-muted-foreground font-normal\">(optional)</span></label>\n <div\n className=\"border-2 border-dashed border-border rounded-xl p-8 text-center cursor-pointer hover:border-primary/50 transition-colors\"\n role=\"button\" tabIndex={0} aria-label=\"Upload cover image\"\n onClick={() => !imageUploading && fileInputRef.current?.click()}\n onKeyDown={(e) => { if (e.key === \"Enter\" || e.key === \" \") { e.preventDefault(); fileInputRef.current?.click(); } }}\n onDragOver={(e) => e.preventDefault()}\n onDrop={(e) => { e.preventDefault(); const file = e.dataTransfer.files?.[0]; if (file && !imageUploading) onImageSelect(file); }}\n >\n {imagePreview ? (\n <img src={imagePreview} alt=\"Cover preview\" className=\"mx-auto max-h-48 rounded-lg object-contain\" />\n ) : (\n <div className=\"flex flex-col items-center gap-2 text-muted-foreground\">\n {imageUploading ? <Loader2 className=\"h-8 w-8 animate-spin\" /> : <Upload className=\"h-8 w-8\" />}\n <p className=\"text-sm\">{imageUploading ? \"Uploading…\" : \"Drag in a cover image, or click to browse\"}</p>\n <p className=\"text-xs\">JPG, PNG, GIF, SVG, WebP · max 10 MB · shown on the drop card</p>\n </div>\n )}\n <input\n ref={fileInputRef} type=\"file\" accept=\"image/*\" className=\"hidden\"\n onChange={(e) => { const file = e.target.files?.[0]; if (file) onImageSelect(file); }}\n />\n </div>\n </div>\n\n <FormField control={form.control} name=\"name\" render={({ field }) => (\n <FormItem>\n <FormLabel>Collection name *</FormLabel>\n <FormControl><Input placeholder=\"Genesis Series\" {...field} /></FormControl>\n <FormDescription>Shown across the drop page, wallet, and marketplace.</FormDescription>\n <FormMessage />\n </FormItem>\n )} />\n\n <FormField control={form.control} name=\"symbol\" render={({ field }) => (\n <FormItem>\n <FormLabel>Symbol *</FormLabel>\n <FormControl>\n <Input placeholder=\"GEN\" {...field} onChange={(e) => field.onChange(e.target.value.toUpperCase())} className=\"max-w-[160px]\" />\n </FormControl>\n <FormDescription>Short ticker shown in wallets and explorers.</FormDescription>\n <FormMessage />\n </FormItem>\n )} />\n </Section>\n\n <Section title=\"NFTs\" icon={<Layers className=\"h-4 w-4\" />}>\n <p className=\"text-xs text-muted-foreground\">\n Each image becomes a unique, individually-licensed NFT. Supply equals the number of NFTs.\n </p>\n <DropItemList items={items} collectionName={collectionName} onAddFiles={onAddItemFiles} onRemove={onRemoveItem} onEdit={onEditItem} />\n </Section>\n\n <CollapsibleSection\n open={licensingOpen} onOpenChange={setLicensingOpen}\n icon={<ShieldCheck className=\"h-4 w-4 text-primary\" />}\n label=\"License Terms\"\n hint=\"Applied to every NFT · Berne Convention\"\n >\n <p className=\"text-xs text-muted-foreground\">\n These license terms are saved permanently with every NFT in the drop. CC BY-SA by default.\n </p>\n <FormField control={form.control} name=\"licenseType\" render={({ field }) => (\n <FormItem>\n <FormLabel>License</FormLabel>\n <Select value={field.value} onValueChange={handleLicenseChange}>\n <FormControl><SelectTrigger><SelectValue /></SelectTrigger></FormControl>\n <SelectContent>\n {LICENSE_TYPES.map((l) => <SelectItem key={l.value} value={l.value}>{l.label ?? l.value}</SelectItem>)}\n </SelectContent>\n </Select>\n <FormMessage />\n </FormItem>\n )} />\n <FormField control={form.control} name=\"commercialUse\" render={({ field }) => (\n <FormItem><FormLabel>Commercial Use</FormLabel><ToggleGroup value={field.value} options={[\"Yes\", \"No\"]} onChange={field.onChange} /></FormItem>\n )} />\n <FormField control={form.control} name=\"derivatives\" render={({ field }) => (\n <FormItem><FormLabel>Derivatives</FormLabel><ToggleGroup value={field.value} options={DERIVATIVES_OPTIONS} onChange={field.onChange} /></FormItem>\n )} />\n <FormField control={form.control} name=\"attribution\" render={({ field }) => (\n <FormItem><FormLabel>Attribution</FormLabel><ToggleGroup value={field.value} options={[\"Required\", \"Not Required\"]} onChange={field.onChange} /></FormItem>\n )} />\n\n <FormField control={form.control} name=\"ipType\" render={({ field }) => (\n <FormItem>\n <FormLabel>IP Type</FormLabel>\n <Select onValueChange={field.onChange} value={field.value}>\n <FormControl><SelectTrigger><SelectValue /></SelectTrigger></FormControl>\n <SelectContent>{IP_TYPES.map((t) => <SelectItem key={t} value={t}>{t}</SelectItem>)}</SelectContent>\n </Select>\n </FormItem>\n )} />\n <IPTypeFields ipType={form.watch(\"ipType\") as IPType} onChange={onMetadataFieldsChange} uploadDocument={uploadDocument} />\n\n <button\n type=\"button\"\n onClick={() => setAdvancedOpen((o) => !o)}\n className=\"flex items-center gap-1.5 text-xs text-muted-foreground hover:text-foreground transition-colors\"\n >\n <ChevronDown className={cn(\"h-3.5 w-3.5 transition-transform\", advancedOpen && \"rotate-180\")} />\n Advanced options\n </button>\n {advancedOpen && (\n <div className=\"space-y-4 pt-1\">\n <FormField control={form.control} name=\"geographicScope\" render={({ field }) => (\n <FormItem><FormLabel>Territory</FormLabel><FormControl><Input placeholder=\"Worldwide\" {...field} /></FormControl></FormItem>\n )} />\n <FormField control={form.control} name=\"aiPolicy\" render={({ field }) => (\n <FormItem><FormLabel>AI &amp; Data Mining</FormLabel><ToggleGroup value={field.value} options={AI_POLICIES} onChange={field.onChange} /></FormItem>\n )} />\n <FormField control={form.control} name=\"royalty\" render={({ field }) => (\n <FormItem>\n <FormLabel>Royalty % (0–50)</FormLabel>\n <FormControl><Input type=\"number\" min={0} max={50} step={0.5} placeholder=\"0\" {...field} onChange={(e) => field.onChange(parseFloat(e.target.value) || 0)} /></FormControl>\n <FormMessage />\n </FormItem>\n )} />\n </div>\n )}\n </CollapsibleSection>\n\n <Section title=\"Drop Settings\" icon={<Sparkles className=\"h-4 w-4\" />}>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Mint price</label>\n <ToggleGroup value={priceFree ? \"Free\" : \"Paid\"} options={[\"Free\", \"Paid\"]} onChange={(v) => onSetPriceFree(v === \"Free\")} />\n {!priceFree && (\n <div className=\"flex gap-2 items-start pt-1\">\n <FormField control={form.control} name=\"priceAmount\" render={({ field }) => (\n <FormItem className=\"flex-1\">\n <FormControl><Input type=\"number\" placeholder=\"0.01\" step=\"any\" min={0} {...field} /></FormControl>\n <FormMessage />\n </FormItem>\n )} />\n <div ref={tokenDropdownRef} className=\"relative\">\n <button type=\"button\" onClick={() => onSetTokenDropdownOpen(!tokenDropdownOpen)} aria-haspopup=\"listbox\" aria-expanded={tokenDropdownOpen}\n className=\"flex items-center gap-1.5 h-10 px-3 rounded-md border border-border bg-muted/30 text-sm font-semibold hover:border-primary/50 transition-colors\">\n {selectedToken.symbol}<ChevronDown className=\"h-3.5 w-3.5 text-muted-foreground\" />\n </button>\n {tokenDropdownOpen && (\n <div role=\"listbox\" className=\"absolute top-11 right-0 z-50 w-28 rounded-lg border border-border bg-background shadow-lg py-1\">\n {paymentTokens.map((t) => (\n <button key={t.address} type=\"button\" role=\"option\" aria-selected={selectedToken.address === t.address} onClick={() => onSelectToken(t)}\n className={cn(\"w-full text-left px-3 py-1.5 text-sm hover:bg-muted transition-colors\", selectedToken.address === t.address && \"text-primary font-semibold\")}>\n {t.symbol}\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n )}\n <p className=\"text-xs text-muted-foreground\">A free claim, or a fixed price per token.</p>\n </div>\n\n <FormField control={form.control} name=\"maxPerWallet\" render={({ field }) => (\n <FormItem>\n <FormLabel>Max per wallet</FormLabel>\n <FormControl><Input type=\"number\" min={1} max={10000} className=\"max-w-[120px]\" {...field} /></FormControl>\n <FormMessage />\n </FormItem>\n )} />\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Mint window *</label>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n <div className=\"space-y-1.5\">\n <p className=\"text-xs text-muted-foreground\">Opens</p>\n <div className=\"flex gap-2\">\n <FormField control={form.control} name=\"startDate\" render={({ field }) => (<FormItem className=\"flex-1\"><FormControl><Input type=\"date\" {...field} /></FormControl><FormMessage /></FormItem>)} />\n <FormField control={form.control} name=\"startTime\" render={({ field }) => (<FormItem className=\"w-28\"><FormControl><Input type=\"time\" {...field} /></FormControl></FormItem>)} />\n </div>\n </div>\n <div className=\"space-y-1.5\">\n <p className=\"text-xs text-muted-foreground\">Closes</p>\n <div className=\"flex gap-2\">\n <FormField control={form.control} name=\"endDate\" render={({ field }) => (<FormItem className=\"flex-1\"><FormControl><Input type=\"date\" {...field} /></FormControl><FormMessage /></FormItem>)} />\n <FormField control={form.control} name=\"endTime\" render={({ field }) => (<FormItem className=\"w-28\"><FormControl><Input type=\"time\" {...field} /></FormControl></FormItem>)} />\n </div>\n </div>\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Listing visibility</label>\n <ToggleGroup value={isPublic ? \"Public\" : \"Hidden\"} options={[\"Public\", \"Hidden\"]} onChange={(v) => onSetPublic(v === \"Public\")} />\n <p className=\"text-xs text-muted-foreground\">{isPublic ? \"Listed on the Drop launchpad.\" : \"Hidden — only reachable by direct link.\"}</p>\n </div>\n </Section>\n\n <CollapsibleSection\n open={whitelistEnabled} onOpenChange={(o) => form.setValue(\"whitelistEnabled\", o)}\n icon={<Users className=\"h-4 w-4 text-primary\" />}\n label=\"Whitelist\"\n hint={whitelistEnabled ? \"Only listed addresses can mint\" : \"Optional · restrict who can mint\"}\n contentSpacing=\"space-y-3\"\n >\n <FormField control={form.control} name=\"allowlistAddresses\" render={({ field }) => (\n <FormItem>\n <FormControl><Textarea placeholder={\"Paste Starknet addresses, one per line:\\n0x04a…\\n0x06b…\"} rows={5} {...field} className=\"tabular-nums text-xs resize-none\" /></FormControl>\n <FormDescription className=\"text-xs\">Only these wallets can mint. You can open it to everyone later from Manage.</FormDescription>\n <FormMessage />\n </FormItem>\n )} />\n </CollapsibleSection>\n\n <ExclusiveContentSection form={form} />\n\n <button\n type=\"submit\"\n disabled={isSubmitting || imageUploading}\n className={cn(\"w-full h-12 text-base font-semibold text-white rounded-xl flex items-center justify-center gap-2 transition-all hover:brightness-110 active:scale-[0.98] bg-brand-blue\", (isSubmitting || imageUploading) && \"opacity-40 pointer-events-none\")}\n >\n {isSubmitting ? (<><Loader2 className=\"h-4 w-4 animate-spin\" />Launching…</>) : (<><Package className=\"h-4 w-4\" />Launch Drop</>)}\n </button>\n <p className=\"text-xs text-center text-muted-foreground\">Supply equals the number of NFTs you add. Zero platform fees to launch.</p>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
@@ -1,39 +0,0 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { RefObject } from 'react';
3
- import { UseFormReturn } from 'react-hook-form';
4
- import { MetadataField } from './ip-type-fields.cjs';
5
- import { DraftItem } from './drop-item-list.cjs';
6
- import { DropCreateFormValues } from '../data/drop-create-schema.cjs';
7
- import '../data/ip.cjs';
8
- import 'zod';
9
-
10
- interface PaymentTokenOption {
11
- symbol: string;
12
- address: string;
13
- }
14
- interface DropCreateFormProps {
15
- form: UseFormReturn<DropCreateFormValues>;
16
- imagePreview: string | null;
17
- imageUploading: boolean;
18
- isSubmitting: boolean;
19
- priceFree: boolean;
20
- isPublic: boolean;
21
- paymentTokens: PaymentTokenOption[];
22
- selectedToken: PaymentTokenOption;
23
- tokenDropdownOpen: boolean;
24
- fileInputRef: RefObject<HTMLInputElement | null>;
25
- items: DraftItem[];
26
- onImageSelect: (file: File) => void;
27
- onSetPriceFree: (value: boolean) => void;
28
- onSetTokenDropdownOpen: (open: boolean) => void;
29
- onSelectToken: (token: PaymentTokenOption) => void;
30
- onSetPublic: (value: boolean) => void;
31
- onAddItemFiles: (files: File[]) => void;
32
- onRemoveItem: (id: string) => void;
33
- onEditItem: (id: string, patch: Partial<Pick<DraftItem, "name" | "description">>) => void;
34
- onMetadataFieldsChange: (fields: MetadataField[]) => void;
35
- uploadDocument: (file: File) => Promise<string>;
36
- }
37
- declare function DropCreateForm({ form, imagePreview, imageUploading, isSubmitting, priceFree, isPublic, paymentTokens, selectedToken, tokenDropdownOpen, fileInputRef, items, onImageSelect, onSetPriceFree, onSetTokenDropdownOpen, onSelectToken, onSetPublic, onAddItemFiles, onRemoveItem, onEditItem, onMetadataFieldsChange, uploadDocument, }: DropCreateFormProps): react_jsx_runtime.JSX.Element;
38
-
39
- export { DropCreateForm, type PaymentTokenOption };
@@ -1,39 +0,0 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { RefObject } from 'react';
3
- import { UseFormReturn } from 'react-hook-form';
4
- import { MetadataField } from './ip-type-fields.js';
5
- import { DraftItem } from './drop-item-list.js';
6
- import { DropCreateFormValues } from '../data/drop-create-schema.js';
7
- import '../data/ip.js';
8
- import 'zod';
9
-
10
- interface PaymentTokenOption {
11
- symbol: string;
12
- address: string;
13
- }
14
- interface DropCreateFormProps {
15
- form: UseFormReturn<DropCreateFormValues>;
16
- imagePreview: string | null;
17
- imageUploading: boolean;
18
- isSubmitting: boolean;
19
- priceFree: boolean;
20
- isPublic: boolean;
21
- paymentTokens: PaymentTokenOption[];
22
- selectedToken: PaymentTokenOption;
23
- tokenDropdownOpen: boolean;
24
- fileInputRef: RefObject<HTMLInputElement | null>;
25
- items: DraftItem[];
26
- onImageSelect: (file: File) => void;
27
- onSetPriceFree: (value: boolean) => void;
28
- onSetTokenDropdownOpen: (open: boolean) => void;
29
- onSelectToken: (token: PaymentTokenOption) => void;
30
- onSetPublic: (value: boolean) => void;
31
- onAddItemFiles: (files: File[]) => void;
32
- onRemoveItem: (id: string) => void;
33
- onEditItem: (id: string, patch: Partial<Pick<DraftItem, "name" | "description">>) => void;
34
- onMetadataFieldsChange: (fields: MetadataField[]) => void;
35
- uploadDocument: (file: File) => Promise<string>;
36
- }
37
- declare function DropCreateForm({ form, imagePreview, imageUploading, isSubmitting, priceFree, isPublic, paymentTokens, selectedToken, tokenDropdownOpen, fileInputRef, items, onImageSelect, onSetPriceFree, onSetTokenDropdownOpen, onSelectToken, onSetPublic, onAddItemFiles, onRemoveItem, onEditItem, onMetadataFieldsChange, uploadDocument, }: DropCreateFormProps): react_jsx_runtime.JSX.Element;
38
-
39
- export { DropCreateForm, type PaymentTokenOption };