@medialane/ui 0.145.1 → 0.146.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 (67) hide show
  1. package/dist/components/collapsible-section.cjs +69 -0
  2. package/dist/components/collapsible-section.cjs.map +1 -0
  3. package/dist/components/collapsible-section.d.cts +15 -0
  4. package/dist/components/collapsible-section.d.ts +15 -0
  5. package/dist/components/collapsible-section.js +45 -0
  6. package/dist/components/collapsible-section.js.map +1 -0
  7. package/dist/components/drop-create-form.cjs +341 -0
  8. package/dist/components/drop-create-form.cjs.map +1 -0
  9. package/dist/components/drop-create-form.d.cts +39 -0
  10. package/dist/components/drop-create-form.d.ts +39 -0
  11. package/dist/components/drop-create-form.js +322 -0
  12. package/dist/components/drop-create-form.js.map +1 -0
  13. package/dist/components/drop-preview-card.cjs +79 -0
  14. package/dist/components/drop-preview-card.cjs.map +1 -0
  15. package/dist/components/drop-preview-card.d.cts +17 -0
  16. package/dist/components/drop-preview-card.d.ts +17 -0
  17. package/dist/components/drop-preview-card.js +55 -0
  18. package/dist/components/drop-preview-card.js.map +1 -0
  19. package/dist/components/drop-preview-card.test.cjs +57 -0
  20. package/dist/components/drop-preview-card.test.cjs.map +1 -0
  21. package/dist/components/drop-preview-card.test.d.cts +2 -0
  22. package/dist/components/drop-preview-card.test.d.ts +2 -0
  23. package/dist/components/drop-preview-card.test.js +56 -0
  24. package/dist/components/drop-preview-card.test.js.map +1 -0
  25. package/dist/components/drop-status-display.cjs +103 -0
  26. package/dist/components/drop-status-display.cjs.map +1 -0
  27. package/dist/components/drop-status-display.d.cts +15 -0
  28. package/dist/components/drop-status-display.d.ts +15 -0
  29. package/dist/components/drop-status-display.js +77 -0
  30. package/dist/components/drop-status-display.js.map +1 -0
  31. package/dist/components/drop-status-display.test.cjs +29 -0
  32. package/dist/components/drop-status-display.test.cjs.map +1 -0
  33. package/dist/components/drop-status-display.test.d.cts +2 -0
  34. package/dist/components/drop-status-display.test.d.ts +2 -0
  35. package/dist/components/drop-status-display.test.js +28 -0
  36. package/dist/components/drop-status-display.test.js.map +1 -0
  37. package/dist/components/exclusive-content-section.cjs +88 -0
  38. package/dist/components/exclusive-content-section.cjs.map +1 -0
  39. package/dist/components/exclusive-content-section.d.cts +10 -0
  40. package/dist/components/exclusive-content-section.d.ts +10 -0
  41. package/dist/components/exclusive-content-section.js +64 -0
  42. package/dist/components/exclusive-content-section.js.map +1 -0
  43. package/dist/data/drop-create-schema.cjs +8 -1
  44. package/dist/data/drop-create-schema.cjs.map +1 -1
  45. package/dist/data/drop-create-schema.d.cts +20 -0
  46. package/dist/data/drop-create-schema.d.ts +20 -0
  47. package/dist/data/drop-create-schema.js +8 -1
  48. package/dist/data/drop-create-schema.js.map +1 -1
  49. package/dist/data/gated-content-types.cjs +39 -0
  50. package/dist/data/gated-content-types.cjs.map +1 -0
  51. package/dist/data/gated-content-types.d.cts +12 -0
  52. package/dist/data/gated-content-types.d.ts +12 -0
  53. package/dist/data/gated-content-types.js +14 -0
  54. package/dist/data/gated-content-types.js.map +1 -0
  55. package/dist/index.cjs +27 -0
  56. package/dist/index.cjs.map +1 -1
  57. package/dist/index.d.cts +8 -1
  58. package/dist/index.d.ts +8 -1
  59. package/dist/index.js +17 -0
  60. package/dist/index.js.map +1 -1
  61. package/dist/utils/drop-status.cjs +37 -0
  62. package/dist/utils/drop-status.cjs.map +1 -0
  63. package/dist/utils/drop-status.d.cts +12 -0
  64. package/dist/utils/drop-status.d.ts +12 -0
  65. package/dist/utils/drop-status.js +13 -0
  66. package/dist/utils/drop-status.js.map +1 -0
  67. package/package.json +1 -1
@@ -0,0 +1,69 @@
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 collapsible_section_exports = {};
21
+ __export(collapsible_section_exports, {
22
+ CollapsibleSection: () => CollapsibleSection
23
+ });
24
+ module.exports = __toCommonJS(collapsible_section_exports);
25
+ var import_jsx_runtime = require("react/jsx-runtime");
26
+ var import_lucide_react = require("lucide-react");
27
+ var import_cn = require("../utils/cn.js");
28
+ var import_collapsible = require("./collapsible.js");
29
+ function CollapsibleSection({
30
+ open,
31
+ onOpenChange,
32
+ icon,
33
+ label,
34
+ hint,
35
+ contentSpacing = "space-y-4",
36
+ children
37
+ }) {
38
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_collapsible.Collapsible, { open, onOpenChange, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "sm:overflow-hidden sm:rounded-xl sm:border sm:border-border", children: [
39
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_collapsible.CollapsibleTrigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
40
+ "button",
41
+ {
42
+ type: "button",
43
+ className: "w-full flex items-center justify-between px-0 py-3 sm:px-5 sm:py-4 hover:bg-muted/30 transition-colors",
44
+ children: [
45
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2", children: [
46
+ icon,
47
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-sm font-semibold", children: label }),
48
+ hint && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-xs text-muted-foreground font-normal", children: hint })
49
+ ] }),
50
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
51
+ import_lucide_react.ChevronDown,
52
+ {
53
+ className: (0, import_cn.cn)(
54
+ "h-4 w-4 text-muted-foreground transition-transform",
55
+ open && "rotate-180"
56
+ )
57
+ }
58
+ )
59
+ ]
60
+ }
61
+ ) }),
62
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_collapsible.CollapsibleContent, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: (0, import_cn.cn)("px-0 pb-4 sm:px-5 sm:pb-5 border-t border-border/60 pt-4", contentSpacing), children }) })
63
+ ] }) });
64
+ }
65
+ // Annotate the CommonJS export names for ESM import in node:
66
+ 0 && (module.exports = {
67
+ CollapsibleSection
68
+ });
69
+ //# sourceMappingURL=collapsible-section.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/collapsible-section.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { ChevronDown } from \"lucide-react\";\nimport { cn } from \"../utils/cn.js\";\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"./collapsible.js\";\n\ninterface CollapsibleSectionProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n icon: ReactNode;\n label: ReactNode;\n hint?: ReactNode;\n contentSpacing?: string;\n children: ReactNode;\n}\n\nexport function CollapsibleSection({\n open,\n onOpenChange,\n icon,\n label,\n hint,\n contentSpacing = \"space-y-4\",\n children,\n}: CollapsibleSectionProps) {\n return (\n <Collapsible open={open} onOpenChange={onOpenChange}>\n <div className=\"sm:overflow-hidden sm:rounded-xl sm:border sm:border-border\">\n <CollapsibleTrigger asChild>\n <button\n type=\"button\"\n className=\"w-full flex items-center justify-between px-0 py-3 sm:px-5 sm:py-4 hover:bg-muted/30 transition-colors\"\n >\n <div className=\"flex items-center gap-2\">\n {icon}\n <span className=\"text-sm font-semibold\">{label}</span>\n {hint && <span className=\"text-xs text-muted-foreground font-normal\">{hint}</span>}\n </div>\n <ChevronDown\n className={cn(\n \"h-4 w-4 text-muted-foreground transition-transform\",\n open && \"rotate-180\"\n )}\n />\n </button>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className={cn(\"px-0 pb-4 sm:px-5 sm:pb-5 border-t border-border/60 pt-4\", contentSpacing)}>\n {children}\n </div>\n </CollapsibleContent>\n </div>\n </Collapsible>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAkCY;AA/BZ,0BAA4B;AAC5B,gBAAmB;AACnB,yBAAoE;AAY7D,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB;AACF,GAA4B;AAC1B,SACE,4CAAC,kCAAY,MAAY,cACvB,uDAAC,SAAI,WAAU,+DACb;AAAA,gDAAC,yCAAmB,SAAO,MACzB;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QAEV;AAAA,uDAAC,SAAI,WAAU,2BACZ;AAAA;AAAA,YACD,4CAAC,UAAK,WAAU,yBAAyB,iBAAM;AAAA,YAC9C,QAAQ,4CAAC,UAAK,WAAU,6CAA6C,gBAAK;AAAA,aAC7E;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,eAAW;AAAA,gBACT;AAAA,gBACA,QAAQ;AAAA,cACV;AAAA;AAAA,UACF;AAAA;AAAA;AAAA,IACF,GACF;AAAA,IACA,4CAAC,yCACC,sDAAC,SAAI,eAAW,cAAG,4DAA4D,cAAc,GAC1F,UACH,GACF;AAAA,KACF,GACF;AAEJ;","names":[]}
@@ -0,0 +1,15 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode } from 'react';
3
+
4
+ interface CollapsibleSectionProps {
5
+ open: boolean;
6
+ onOpenChange: (open: boolean) => void;
7
+ icon: ReactNode;
8
+ label: ReactNode;
9
+ hint?: ReactNode;
10
+ contentSpacing?: string;
11
+ children: ReactNode;
12
+ }
13
+ declare function CollapsibleSection({ open, onOpenChange, icon, label, hint, contentSpacing, children, }: CollapsibleSectionProps): react_jsx_runtime.JSX.Element;
14
+
15
+ export { CollapsibleSection };
@@ -0,0 +1,15 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode } from 'react';
3
+
4
+ interface CollapsibleSectionProps {
5
+ open: boolean;
6
+ onOpenChange: (open: boolean) => void;
7
+ icon: ReactNode;
8
+ label: ReactNode;
9
+ hint?: ReactNode;
10
+ contentSpacing?: string;
11
+ children: ReactNode;
12
+ }
13
+ declare function CollapsibleSection({ open, onOpenChange, icon, label, hint, contentSpacing, children, }: CollapsibleSectionProps): react_jsx_runtime.JSX.Element;
14
+
15
+ export { CollapsibleSection };
@@ -0,0 +1,45 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { ChevronDown } from "lucide-react";
4
+ import { cn } from "../utils/cn.js";
5
+ import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "./collapsible.js";
6
+ function CollapsibleSection({
7
+ open,
8
+ onOpenChange,
9
+ icon,
10
+ label,
11
+ hint,
12
+ contentSpacing = "space-y-4",
13
+ children
14
+ }) {
15
+ return /* @__PURE__ */ jsx(Collapsible, { open, onOpenChange, children: /* @__PURE__ */ jsxs("div", { className: "sm:overflow-hidden sm:rounded-xl sm:border sm:border-border", children: [
16
+ /* @__PURE__ */ jsx(CollapsibleTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
17
+ "button",
18
+ {
19
+ type: "button",
20
+ className: "w-full flex items-center justify-between px-0 py-3 sm:px-5 sm:py-4 hover:bg-muted/30 transition-colors",
21
+ children: [
22
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
23
+ icon,
24
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-semibold", children: label }),
25
+ hint && /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground font-normal", children: hint })
26
+ ] }),
27
+ /* @__PURE__ */ jsx(
28
+ ChevronDown,
29
+ {
30
+ className: cn(
31
+ "h-4 w-4 text-muted-foreground transition-transform",
32
+ open && "rotate-180"
33
+ )
34
+ }
35
+ )
36
+ ]
37
+ }
38
+ ) }),
39
+ /* @__PURE__ */ jsx(CollapsibleContent, { children: /* @__PURE__ */ jsx("div", { className: cn("px-0 pb-4 sm:px-5 sm:pb-5 border-t border-border/60 pt-4", contentSpacing), children }) })
40
+ ] }) });
41
+ }
42
+ export {
43
+ CollapsibleSection
44
+ };
45
+ //# sourceMappingURL=collapsible-section.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/collapsible-section.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { ChevronDown } from \"lucide-react\";\nimport { cn } from \"../utils/cn.js\";\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"./collapsible.js\";\n\ninterface CollapsibleSectionProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n icon: ReactNode;\n label: ReactNode;\n hint?: ReactNode;\n contentSpacing?: string;\n children: ReactNode;\n}\n\nexport function CollapsibleSection({\n open,\n onOpenChange,\n icon,\n label,\n hint,\n contentSpacing = \"space-y-4\",\n children,\n}: CollapsibleSectionProps) {\n return (\n <Collapsible open={open} onOpenChange={onOpenChange}>\n <div className=\"sm:overflow-hidden sm:rounded-xl sm:border sm:border-border\">\n <CollapsibleTrigger asChild>\n <button\n type=\"button\"\n className=\"w-full flex items-center justify-between px-0 py-3 sm:px-5 sm:py-4 hover:bg-muted/30 transition-colors\"\n >\n <div className=\"flex items-center gap-2\">\n {icon}\n <span className=\"text-sm font-semibold\">{label}</span>\n {hint && <span className=\"text-xs text-muted-foreground font-normal\">{hint}</span>}\n </div>\n <ChevronDown\n className={cn(\n \"h-4 w-4 text-muted-foreground transition-transform\",\n open && \"rotate-180\"\n )}\n />\n </button>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className={cn(\"px-0 pb-4 sm:px-5 sm:pb-5 border-t border-border/60 pt-4\", contentSpacing)}>\n {children}\n </div>\n </CollapsibleContent>\n </div>\n </Collapsible>\n );\n}\n"],"mappings":";AAkCY,SAEE,KAFF;AA/BZ,SAAS,mBAAmB;AAC5B,SAAS,UAAU;AACnB,SAAS,aAAa,oBAAoB,0BAA0B;AAY7D,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB;AACF,GAA4B;AAC1B,SACE,oBAAC,eAAY,MAAY,cACvB,+BAAC,SAAI,WAAU,+DACb;AAAA,wBAAC,sBAAmB,SAAO,MACzB;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QAEV;AAAA,+BAAC,SAAI,WAAU,2BACZ;AAAA;AAAA,YACD,oBAAC,UAAK,WAAU,yBAAyB,iBAAM;AAAA,YAC9C,QAAQ,oBAAC,UAAK,WAAU,6CAA6C,gBAAK;AAAA,aAC7E;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA,QAAQ;AAAA,cACV;AAAA;AAAA,UACF;AAAA;AAAA;AAAA,IACF,GACF;AAAA,IACA,oBAAC,sBACC,8BAAC,SAAI,WAAW,GAAG,4DAA4D,cAAc,GAC1F,UACH,GACF;AAAA,KACF,GACF;AAEJ;","names":[]}
@@ -0,0 +1,341 @@
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
@@ -0,0 +1 @@
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":[]}
@@ -0,0 +1,39 @@
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 };