@medialane/ui 0.183.0 → 0.184.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/drop/create/artwork-section.cjs +115 -0
- package/dist/components/drop/create/artwork-section.cjs.map +1 -0
- package/dist/components/drop/create/artwork-section.d.cts +23 -0
- package/dist/components/drop/create/artwork-section.d.ts +23 -0
- package/dist/components/drop/create/artwork-section.js +79 -0
- package/dist/components/drop/create/artwork-section.js.map +1 -0
- package/dist/components/drop/create/details-section.cjs +110 -0
- package/dist/components/drop/create/details-section.cjs.map +1 -0
- package/dist/components/drop/create/details-section.d.cts +11 -0
- package/dist/components/drop/create/details-section.d.ts +11 -0
- package/dist/components/drop/create/details-section.js +86 -0
- package/dist/components/drop/create/details-section.js.map +1 -0
- package/dist/components/drop/create/drop-create.cjs +112 -0
- package/dist/components/drop/create/drop-create.cjs.map +1 -0
- package/dist/components/drop/create/drop-create.d.cts +22 -0
- package/dist/components/drop/create/drop-create.d.ts +22 -0
- package/dist/components/drop/create/drop-create.js +77 -0
- package/dist/components/drop/create/drop-create.js.map +1 -0
- package/dist/components/drop/create/exclusive-fields.cjs +45 -0
- package/dist/components/drop/create/exclusive-fields.cjs.map +1 -0
- package/dist/components/drop/create/exclusive-fields.d.cts +14 -0
- package/dist/components/drop/create/exclusive-fields.d.ts +14 -0
- package/dist/components/drop/create/exclusive-fields.js +21 -0
- package/dist/components/drop/create/exclusive-fields.js.map +1 -0
- package/dist/components/drop/create/launch-dialog.cjs +193 -0
- package/dist/components/drop/create/launch-dialog.cjs.map +1 -0
- package/dist/components/drop/create/launch-dialog.d.cts +21 -0
- package/dist/components/drop/create/launch-dialog.d.ts +21 -0
- package/dist/components/drop/create/launch-dialog.js +168 -0
- package/dist/components/drop/create/launch-dialog.js.map +1 -0
- package/dist/components/drop/create/list-section.cjs +67 -0
- package/dist/components/drop/create/list-section.cjs.map +1 -0
- package/dist/components/drop/create/list-section.d.cts +11 -0
- package/dist/components/drop/create/list-section.d.ts +11 -0
- package/dist/components/drop/create/list-section.js +43 -0
- package/dist/components/drop/create/list-section.js.map +1 -0
- package/dist/components/drop/create/sale-section.cjs +78 -0
- package/dist/components/drop/create/sale-section.cjs.map +1 -0
- package/dist/components/drop/create/sale-section.d.cts +13 -0
- package/dist/components/drop/create/sale-section.d.ts +13 -0
- package/dist/components/drop/create/sale-section.js +54 -0
- package/dist/components/drop/create/sale-section.js.map +1 -0
- package/dist/components/drop/drop-card.cjs +81 -0
- package/dist/components/drop/drop-card.cjs.map +1 -0
- package/dist/components/drop/drop-card.d.cts +18 -0
- package/dist/components/drop/drop-card.d.ts +18 -0
- package/dist/components/drop/drop-card.js +45 -0
- package/dist/components/drop/drop-card.js.map +1 -0
- package/dist/components/drop/drop-listing.cjs +79 -0
- package/dist/components/drop/drop-listing.cjs.map +1 -0
- package/dist/components/drop/drop-listing.d.cts +10 -0
- package/dist/components/drop/drop-listing.d.ts +10 -0
- package/dist/components/drop/drop-listing.js +45 -0
- package/dist/components/drop/drop-listing.js.map +1 -0
- package/dist/components/drop/drop-token-link.cjs +63 -0
- package/dist/components/drop/drop-token-link.cjs.map +1 -0
- package/dist/components/drop/drop-token-link.d.cts +9 -0
- package/dist/components/drop/drop-token-link.d.ts +9 -0
- package/dist/components/drop/drop-token-link.js +29 -0
- package/dist/components/drop/drop-token-link.js.map +1 -0
- package/dist/components/drop/my-drops.cjs +71 -0
- package/dist/components/drop/my-drops.cjs.map +1 -0
- package/dist/components/drop/my-drops.d.cts +12 -0
- package/dist/components/drop/my-drops.d.ts +12 -0
- package/dist/components/drop/my-drops.js +37 -0
- package/dist/components/drop/my-drops.js.map +1 -0
- package/dist/components/drop/page/drop-action-box.cjs +63 -0
- package/dist/components/drop/page/drop-action-box.cjs.map +1 -0
- package/dist/components/drop/page/drop-action-box.d.cts +16 -0
- package/dist/components/drop/page/drop-action-box.d.ts +16 -0
- package/dist/components/drop/page/drop-action-box.js +39 -0
- package/dist/components/drop/page/drop-action-box.js.map +1 -0
- package/dist/components/drop/page/drop-activity.cjs +42 -0
- package/dist/components/drop/page/drop-activity.cjs.map +1 -0
- package/dist/components/drop/page/drop-activity.d.cts +8 -0
- package/dist/components/drop/page/drop-activity.d.ts +8 -0
- package/dist/components/drop/page/drop-activity.js +18 -0
- package/dist/components/drop/page/drop-activity.js.map +1 -0
- package/dist/components/drop/page/drop-manage.cjs +161 -0
- package/dist/components/drop/page/drop-manage.cjs.map +1 -0
- package/dist/components/drop/page/drop-manage.d.cts +24 -0
- package/dist/components/drop/page/drop-manage.d.ts +24 -0
- package/dist/components/drop/page/drop-manage.js +137 -0
- package/dist/components/drop/page/drop-manage.js.map +1 -0
- package/dist/components/drop/page/drop-mint-dialog.cjs +97 -0
- package/dist/components/drop/page/drop-mint-dialog.cjs.map +1 -0
- package/dist/components/drop/page/drop-mint-dialog.d.cts +15 -0
- package/dist/components/drop/page/drop-mint-dialog.d.ts +15 -0
- package/dist/components/drop/page/drop-mint-dialog.js +73 -0
- package/dist/components/drop/page/drop-mint-dialog.js.map +1 -0
- package/dist/components/drop/page/drop-page.cjs +165 -0
- package/dist/components/drop/page/drop-page.cjs.map +1 -0
- package/dist/components/drop/page/drop-page.d.cts +16 -0
- package/dist/components/drop/page/drop-page.d.ts +16 -0
- package/dist/components/drop/page/drop-page.js +131 -0
- package/dist/components/drop/page/drop-page.js.map +1 -0
- package/dist/components/drop-status-display.cjs +7 -38
- package/dist/components/drop-status-display.cjs.map +1 -1
- package/dist/components/drop-status-display.d.cts +6 -7
- package/dist/components/drop-status-display.d.ts +6 -7
- package/dist/components/drop-status-display.js +7 -37
- package/dist/components/drop-status-display.js.map +1 -1
- package/dist/components/image.d.cts +2 -0
- package/dist/components/image.d.ts +2 -0
- package/dist/index.cjs +46 -27
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +20 -11
- package/dist/index.d.ts +20 -11
- package/dist/index.js +31 -25
- package/dist/index.js.map +1 -1
- package/dist/utils/drop/actions.cjs +76 -0
- package/dist/utils/drop/actions.cjs.map +1 -0
- package/dist/utils/drop/actions.d.cts +46 -0
- package/dist/utils/drop/actions.d.ts +46 -0
- package/dist/utils/drop/actions.js +49 -0
- package/dist/utils/drop/actions.js.map +1 -0
- package/dist/utils/drop/allowlist.cjs +50 -0
- package/dist/utils/drop/allowlist.cjs.map +1 -0
- package/dist/utils/drop/allowlist.d.cts +10 -0
- package/dist/utils/drop/allowlist.d.ts +10 -0
- package/dist/utils/drop/allowlist.js +26 -0
- package/dist/utils/drop/allowlist.js.map +1 -0
- package/dist/utils/drop/chain.cjs +37 -0
- package/dist/utils/drop/chain.cjs.map +1 -0
- package/dist/utils/drop/chain.d.cts +5 -0
- package/dist/utils/drop/chain.d.ts +5 -0
- package/dist/utils/drop/chain.js +13 -0
- package/dist/utils/drop/chain.js.map +1 -0
- package/dist/utils/drop/claim-proof.cjs +48 -0
- package/dist/utils/drop/claim-proof.cjs.map +1 -0
- package/dist/utils/drop/claim-proof.d.cts +9 -0
- package/dist/utils/drop/claim-proof.d.ts +9 -0
- package/dist/utils/drop/claim-proof.js +24 -0
- package/dist/utils/drop/claim-proof.js.map +1 -0
- package/dist/utils/drop/draft.cjs +87 -0
- package/dist/utils/drop/draft.cjs.map +1 -0
- package/dist/utils/drop/draft.d.cts +32 -0
- package/dist/utils/drop/draft.d.ts +32 -0
- package/dist/utils/drop/draft.js +61 -0
- package/dist/utils/drop/draft.js.map +1 -0
- package/dist/utils/drop/metadata.cjs +70 -0
- package/dist/utils/drop/metadata.cjs.map +1 -0
- package/dist/utils/drop/metadata.d.cts +34 -0
- package/dist/utils/drop/metadata.d.ts +34 -0
- package/dist/utils/drop/metadata.js +43 -0
- package/dist/utils/drop/metadata.js.map +1 -0
- package/dist/utils/{drop-status.cjs → drop/preview.cjs} +14 -14
- package/dist/utils/drop/preview.cjs.map +1 -0
- package/dist/utils/drop/preview.d.cts +4 -0
- package/dist/utils/drop/preview.d.ts +4 -0
- package/dist/utils/drop/preview.js +13 -0
- package/dist/utils/drop/preview.js.map +1 -0
- package/dist/utils/drop/receipt.cjs +39 -0
- package/dist/utils/drop/receipt.cjs.map +1 -0
- package/dist/utils/drop/receipt.d.cts +6 -0
- package/dist/utils/drop/receipt.d.ts +6 -0
- package/dist/utils/drop/receipt.js +15 -0
- package/dist/utils/drop/receipt.js.map +1 -0
- package/dist/utils/drop/sale.cjs +108 -0
- package/dist/utils/drop/sale.cjs.map +1 -0
- package/dist/utils/drop/sale.d.cts +52 -0
- package/dist/utils/drop/sale.d.ts +52 -0
- package/dist/utils/drop/sale.js +78 -0
- package/dist/utils/drop/sale.js.map +1 -0
- package/dist/utils/drop/types.cjs +17 -0
- package/dist/utils/drop/types.cjs.map +1 -0
- package/dist/utils/drop/types.d.cts +20 -0
- package/dist/utils/drop/types.d.ts +20 -0
- package/dist/utils/drop/types.js +1 -0
- package/dist/utils/drop/types.js.map +1 -0
- package/dist/utils/drop/upload.cjs +48 -0
- package/dist/utils/drop/upload.cjs.map +1 -0
- package/dist/utils/drop/upload.d.cts +11 -0
- package/dist/utils/drop/upload.d.ts +11 -0
- package/dist/utils/drop/upload.js +24 -0
- package/dist/utils/drop/upload.js.map +1 -0
- package/dist/utils/drop/use-now.cjs +38 -0
- package/dist/utils/drop/use-now.cjs.map +1 -0
- package/dist/utils/drop/use-now.d.cts +4 -0
- package/dist/utils/drop/use-now.d.ts +4 -0
- package/dist/utils/drop/use-now.js +14 -0
- package/dist/utils/drop/use-now.js.map +1 -0
- package/dist/utils/drop/view.cjs +89 -0
- package/dist/utils/drop/view.cjs.map +1 -0
- package/dist/utils/drop/view.d.cts +34 -0
- package/dist/utils/drop/view.d.ts +34 -0
- package/dist/utils/drop/view.js +64 -0
- package/dist/utils/drop/view.js.map +1 -0
- package/dist/utils/launchpad-defaults.cjs +0 -22
- package/dist/utils/launchpad-defaults.cjs.map +1 -1
- package/dist/utils/launchpad-defaults.d.cts +1 -7
- package/dist/utils/launchpad-defaults.d.ts +1 -7
- package/dist/utils/launchpad-defaults.js +0 -21
- package/dist/utils/launchpad-defaults.js.map +1 -1
- package/dist/utils/use-drops.cjs +41 -45
- package/dist/utils/use-drops.cjs.map +1 -1
- package/dist/utils/use-drops.d.cts +31 -23
- package/dist/utils/use-drops.d.ts +31 -23
- package/dist/utils/use-drops.js +35 -40
- package/dist/utils/use-drops.js.map +1 -1
- package/package.json +3 -3
- package/dist/components/account/account.test.cjs +0 -86
- package/dist/components/account/account.test.cjs.map +0 -1
- package/dist/components/account/account.test.d.cts +0 -2
- package/dist/components/account/account.test.d.ts +0 -2
- package/dist/components/account/account.test.js +0 -85
- package/dist/components/account/account.test.js.map +0 -1
- package/dist/components/drop-create-form.cjs +0 -341
- package/dist/components/drop-create-form.cjs.map +0 -1
- package/dist/components/drop-create-form.d.cts +0 -39
- package/dist/components/drop-create-form.d.ts +0 -39
- package/dist/components/drop-create-form.js +0 -322
- package/dist/components/drop-create-form.js.map +0 -1
- package/dist/components/drop-preview-card.cjs +0 -106
- package/dist/components/drop-preview-card.cjs.map +0 -1
- package/dist/components/drop-preview-card.d.cts +0 -17
- package/dist/components/drop-preview-card.d.ts +0 -17
- package/dist/components/drop-preview-card.js +0 -82
- package/dist/components/drop-preview-card.js.map +0 -1
- package/dist/components/drop-preview-card.test.cjs +0 -84
- package/dist/components/drop-preview-card.test.cjs.map +0 -1
- package/dist/components/drop-preview-card.test.d.cts +0 -3
- package/dist/components/drop-preview-card.test.d.ts +0 -3
- package/dist/components/drop-preview-card.test.js +0 -83
- package/dist/components/drop-preview-card.test.js.map +0 -1
- package/dist/components/drop-status-display.test.cjs +0 -29
- package/dist/components/drop-status-display.test.cjs.map +0 -1
- package/dist/components/drop-status-display.test.d.cts +0 -2
- package/dist/components/drop-status-display.test.d.ts +0 -2
- package/dist/components/drop-status-display.test.js +0 -28
- package/dist/components/drop-status-display.test.js.map +0 -1
- package/dist/components/exclusive-content-section.cjs +0 -88
- package/dist/components/exclusive-content-section.cjs.map +0 -1
- package/dist/components/exclusive-content-section.d.cts +0 -10
- package/dist/components/exclusive-content-section.d.ts +0 -10
- package/dist/components/exclusive-content-section.js +0 -64
- package/dist/components/exclusive-content-section.js.map +0 -1
- package/dist/data/drop-create-schema.cjs +0 -92
- package/dist/data/drop-create-schema.cjs.map +0 -1
- package/dist/data/drop-create-schema.d.cts +0 -131
- package/dist/data/drop-create-schema.d.ts +0 -131
- package/dist/data/drop-create-schema.js +0 -58
- package/dist/data/drop-create-schema.js.map +0 -1
- package/dist/utils/drop-status.cjs.map +0 -1
- package/dist/utils/drop-status.d.cts +0 -12
- package/dist/utils/drop-status.d.ts +0 -12
- package/dist/utils/drop-status.js +0 -13
- 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 & 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 };
|