@medialane/ui 0.145.0 → 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 (71) 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/data/launchpad-services.cjs +4 -4
  56. package/dist/data/launchpad-services.cjs.map +1 -1
  57. package/dist/data/launchpad-services.js +4 -4
  58. package/dist/data/launchpad-services.js.map +1 -1
  59. package/dist/index.cjs +27 -0
  60. package/dist/index.cjs.map +1 -1
  61. package/dist/index.d.cts +8 -1
  62. package/dist/index.d.ts +8 -1
  63. package/dist/index.js +17 -0
  64. package/dist/index.js.map +1 -1
  65. package/dist/utils/drop-status.cjs +37 -0
  66. package/dist/utils/drop-status.cjs.map +1 -0
  67. package/dist/utils/drop-status.d.cts +12 -0
  68. package/dist/utils/drop-status.d.ts +12 -0
  69. package/dist/utils/drop-status.js +13 -0
  70. package/dist/utils/drop-status.js.map +1 -0
  71. package/package.json +1 -1
@@ -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.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 };
@@ -0,0 +1,322 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import { useEffect, useRef, useState } from "react";
4
+ import { ChevronDown, Layers, Loader2, Package, ShieldCheck, Sparkles, Upload, Users } from "lucide-react";
5
+ import { Input } from "./input.js";
6
+ import { Textarea } from "./textarea.js";
7
+ import { FormControl, FormField, FormItem, FormLabel, FormMessage, FormDescription } from "./form.js";
8
+ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "./select.js";
9
+ import { CollapsibleSection } from "./collapsible-section.js";
10
+ import { ToggleGroup, Section } from "./create-form-primitives.js";
11
+ import { IPTypeFields } from "./ip-type-fields.js";
12
+ import { DropItemList } from "./drop-item-list.js";
13
+ import { ExclusiveContentSection } from "./exclusive-content-section.js";
14
+ import { cn } from "../utils/cn.js";
15
+ import {
16
+ IP_TYPES,
17
+ LICENSE_TYPES,
18
+ AI_POLICIES,
19
+ DERIVATIVES_OPTIONS
20
+ } from "../data/ip.js";
21
+ function DropCreateForm({
22
+ form,
23
+ imagePreview,
24
+ imageUploading,
25
+ isSubmitting,
26
+ priceFree,
27
+ isPublic,
28
+ paymentTokens,
29
+ selectedToken,
30
+ tokenDropdownOpen,
31
+ fileInputRef,
32
+ items,
33
+ onImageSelect,
34
+ onSetPriceFree,
35
+ onSetTokenDropdownOpen,
36
+ onSelectToken,
37
+ onSetPublic,
38
+ onAddItemFiles,
39
+ onRemoveItem,
40
+ onEditItem,
41
+ onMetadataFieldsChange,
42
+ uploadDocument
43
+ }) {
44
+ const tokenDropdownRef = useRef(null);
45
+ const collectionName = form.watch("name");
46
+ const whitelistEnabled = form.watch("whitelistEnabled");
47
+ const [licensingOpen, setLicensingOpen] = useState(false);
48
+ const [advancedOpen, setAdvancedOpen] = useState(false);
49
+ useEffect(() => {
50
+ if (!tokenDropdownOpen) return;
51
+ const onPointer = (e) => {
52
+ if (!tokenDropdownRef.current?.contains(e.target)) onSetTokenDropdownOpen(false);
53
+ };
54
+ const onEsc = (e) => {
55
+ if (e.key === "Escape") onSetTokenDropdownOpen(false);
56
+ };
57
+ document.addEventListener("mousedown", onPointer);
58
+ document.addEventListener("keydown", onEsc);
59
+ return () => {
60
+ document.removeEventListener("mousedown", onPointer);
61
+ document.removeEventListener("keydown", onEsc);
62
+ };
63
+ }, [onSetTokenDropdownOpen, tokenDropdownOpen]);
64
+ const handleLicenseChange = (value) => {
65
+ form.setValue("licenseType", value);
66
+ const def = LICENSE_TYPES.find((l) => l.value === value);
67
+ if (def) {
68
+ form.setValue("commercialUse", def.commercialUse);
69
+ form.setValue("derivatives", def.derivatives);
70
+ form.setValue("attribution", def.attribution);
71
+ }
72
+ };
73
+ return /* @__PURE__ */ jsxs("div", { className: "space-y-5", children: [
74
+ /* @__PURE__ */ jsxs(Section, { title: "Collection Details", icon: /* @__PURE__ */ jsx(Package, { className: "h-4 w-4" }), children: [
75
+ /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
76
+ /* @__PURE__ */ jsxs("label", { className: "text-sm font-medium", children: [
77
+ "Cover image ",
78
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground font-normal", children: "(optional)" })
79
+ ] }),
80
+ /* @__PURE__ */ jsxs(
81
+ "div",
82
+ {
83
+ className: "border-2 border-dashed border-border rounded-xl p-8 text-center cursor-pointer hover:border-primary/50 transition-colors",
84
+ role: "button",
85
+ tabIndex: 0,
86
+ "aria-label": "Upload cover image",
87
+ onClick: () => !imageUploading && fileInputRef.current?.click(),
88
+ onKeyDown: (e) => {
89
+ if (e.key === "Enter" || e.key === " ") {
90
+ e.preventDefault();
91
+ fileInputRef.current?.click();
92
+ }
93
+ },
94
+ onDragOver: (e) => e.preventDefault(),
95
+ onDrop: (e) => {
96
+ e.preventDefault();
97
+ const file = e.dataTransfer.files?.[0];
98
+ if (file && !imageUploading) onImageSelect(file);
99
+ },
100
+ children: [
101
+ imagePreview ? /* @__PURE__ */ jsx("img", { src: imagePreview, alt: "Cover preview", className: "mx-auto max-h-48 rounded-lg object-contain" }) : /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-2 text-muted-foreground", children: [
102
+ imageUploading ? /* @__PURE__ */ jsx(Loader2, { className: "h-8 w-8 animate-spin" }) : /* @__PURE__ */ jsx(Upload, { className: "h-8 w-8" }),
103
+ /* @__PURE__ */ jsx("p", { className: "text-sm", children: imageUploading ? "Uploading\u2026" : "Drag in a cover image, or click to browse" }),
104
+ /* @__PURE__ */ jsx("p", { className: "text-xs", children: "JPG, PNG, GIF, SVG, WebP \xB7 max 10 MB \xB7 shown on the drop card" })
105
+ ] }),
106
+ /* @__PURE__ */ jsx(
107
+ "input",
108
+ {
109
+ ref: fileInputRef,
110
+ type: "file",
111
+ accept: "image/*",
112
+ className: "hidden",
113
+ onChange: (e) => {
114
+ const file = e.target.files?.[0];
115
+ if (file) onImageSelect(file);
116
+ }
117
+ }
118
+ )
119
+ ]
120
+ }
121
+ )
122
+ ] }),
123
+ /* @__PURE__ */ jsx(FormField, { control: form.control, name: "name", render: ({ field }) => /* @__PURE__ */ jsxs(FormItem, { children: [
124
+ /* @__PURE__ */ jsx(FormLabel, { children: "Collection name *" }),
125
+ /* @__PURE__ */ jsx(FormControl, { children: /* @__PURE__ */ jsx(Input, { placeholder: "Genesis Series", ...field }) }),
126
+ /* @__PURE__ */ jsx(FormDescription, { children: "Shown across the drop page, wallet, and marketplace." }),
127
+ /* @__PURE__ */ jsx(FormMessage, {})
128
+ ] }) }),
129
+ /* @__PURE__ */ jsx(FormField, { control: form.control, name: "symbol", render: ({ field }) => /* @__PURE__ */ jsxs(FormItem, { children: [
130
+ /* @__PURE__ */ jsx(FormLabel, { children: "Symbol *" }),
131
+ /* @__PURE__ */ jsx(FormControl, { children: /* @__PURE__ */ jsx(Input, { placeholder: "GEN", ...field, onChange: (e) => field.onChange(e.target.value.toUpperCase()), className: "max-w-[160px]" }) }),
132
+ /* @__PURE__ */ jsx(FormDescription, { children: "Short ticker shown in wallets and explorers." }),
133
+ /* @__PURE__ */ jsx(FormMessage, {})
134
+ ] }) })
135
+ ] }),
136
+ /* @__PURE__ */ jsxs(Section, { title: "NFTs", icon: /* @__PURE__ */ jsx(Layers, { className: "h-4 w-4" }), children: [
137
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: "Each image becomes a unique, individually-licensed NFT. Supply equals the number of NFTs." }),
138
+ /* @__PURE__ */ jsx(DropItemList, { items, collectionName, onAddFiles: onAddItemFiles, onRemove: onRemoveItem, onEdit: onEditItem })
139
+ ] }),
140
+ /* @__PURE__ */ jsxs(
141
+ CollapsibleSection,
142
+ {
143
+ open: licensingOpen,
144
+ onOpenChange: setLicensingOpen,
145
+ icon: /* @__PURE__ */ jsx(ShieldCheck, { className: "h-4 w-4 text-primary" }),
146
+ label: "License Terms",
147
+ hint: "Applied to every NFT \xB7 Berne Convention",
148
+ children: [
149
+ /* @__PURE__ */ 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." }),
150
+ /* @__PURE__ */ jsx(FormField, { control: form.control, name: "licenseType", render: ({ field }) => /* @__PURE__ */ jsxs(FormItem, { children: [
151
+ /* @__PURE__ */ jsx(FormLabel, { children: "License" }),
152
+ /* @__PURE__ */ jsxs(Select, { value: field.value, onValueChange: handleLicenseChange, children: [
153
+ /* @__PURE__ */ jsx(FormControl, { children: /* @__PURE__ */ jsx(SelectTrigger, { children: /* @__PURE__ */ jsx(SelectValue, {}) }) }),
154
+ /* @__PURE__ */ jsx(SelectContent, { children: LICENSE_TYPES.map((l) => /* @__PURE__ */ jsx(SelectItem, { value: l.value, children: l.label ?? l.value }, l.value)) })
155
+ ] }),
156
+ /* @__PURE__ */ jsx(FormMessage, {})
157
+ ] }) }),
158
+ /* @__PURE__ */ jsx(FormField, { control: form.control, name: "commercialUse", render: ({ field }) => /* @__PURE__ */ jsxs(FormItem, { children: [
159
+ /* @__PURE__ */ jsx(FormLabel, { children: "Commercial Use" }),
160
+ /* @__PURE__ */ jsx(ToggleGroup, { value: field.value, options: ["Yes", "No"], onChange: field.onChange })
161
+ ] }) }),
162
+ /* @__PURE__ */ jsx(FormField, { control: form.control, name: "derivatives", render: ({ field }) => /* @__PURE__ */ jsxs(FormItem, { children: [
163
+ /* @__PURE__ */ jsx(FormLabel, { children: "Derivatives" }),
164
+ /* @__PURE__ */ jsx(ToggleGroup, { value: field.value, options: DERIVATIVES_OPTIONS, onChange: field.onChange })
165
+ ] }) }),
166
+ /* @__PURE__ */ jsx(FormField, { control: form.control, name: "attribution", render: ({ field }) => /* @__PURE__ */ jsxs(FormItem, { children: [
167
+ /* @__PURE__ */ jsx(FormLabel, { children: "Attribution" }),
168
+ /* @__PURE__ */ jsx(ToggleGroup, { value: field.value, options: ["Required", "Not Required"], onChange: field.onChange })
169
+ ] }) }),
170
+ /* @__PURE__ */ jsx(FormField, { control: form.control, name: "ipType", render: ({ field }) => /* @__PURE__ */ jsxs(FormItem, { children: [
171
+ /* @__PURE__ */ jsx(FormLabel, { children: "IP Type" }),
172
+ /* @__PURE__ */ jsxs(Select, { onValueChange: field.onChange, value: field.value, children: [
173
+ /* @__PURE__ */ jsx(FormControl, { children: /* @__PURE__ */ jsx(SelectTrigger, { children: /* @__PURE__ */ jsx(SelectValue, {}) }) }),
174
+ /* @__PURE__ */ jsx(SelectContent, { children: IP_TYPES.map((t) => /* @__PURE__ */ jsx(SelectItem, { value: t, children: t }, t)) })
175
+ ] })
176
+ ] }) }),
177
+ /* @__PURE__ */ jsx(IPTypeFields, { ipType: form.watch("ipType"), onChange: onMetadataFieldsChange, uploadDocument }),
178
+ /* @__PURE__ */ jsxs(
179
+ "button",
180
+ {
181
+ type: "button",
182
+ onClick: () => setAdvancedOpen((o) => !o),
183
+ className: "flex items-center gap-1.5 text-xs text-muted-foreground hover:text-foreground transition-colors",
184
+ children: [
185
+ /* @__PURE__ */ jsx(ChevronDown, { className: cn("h-3.5 w-3.5 transition-transform", advancedOpen && "rotate-180") }),
186
+ "Advanced options"
187
+ ]
188
+ }
189
+ ),
190
+ advancedOpen && /* @__PURE__ */ jsxs("div", { className: "space-y-4 pt-1", children: [
191
+ /* @__PURE__ */ jsx(FormField, { control: form.control, name: "geographicScope", render: ({ field }) => /* @__PURE__ */ jsxs(FormItem, { children: [
192
+ /* @__PURE__ */ jsx(FormLabel, { children: "Territory" }),
193
+ /* @__PURE__ */ jsx(FormControl, { children: /* @__PURE__ */ jsx(Input, { placeholder: "Worldwide", ...field }) })
194
+ ] }) }),
195
+ /* @__PURE__ */ jsx(FormField, { control: form.control, name: "aiPolicy", render: ({ field }) => /* @__PURE__ */ jsxs(FormItem, { children: [
196
+ /* @__PURE__ */ jsx(FormLabel, { children: "AI & Data Mining" }),
197
+ /* @__PURE__ */ jsx(ToggleGroup, { value: field.value, options: AI_POLICIES, onChange: field.onChange })
198
+ ] }) }),
199
+ /* @__PURE__ */ jsx(FormField, { control: form.control, name: "royalty", render: ({ field }) => /* @__PURE__ */ jsxs(FormItem, { children: [
200
+ /* @__PURE__ */ jsx(FormLabel, { children: "Royalty % (0\u201350)" }),
201
+ /* @__PURE__ */ jsx(FormControl, { children: /* @__PURE__ */ jsx(Input, { type: "number", min: 0, max: 50, step: 0.5, placeholder: "0", ...field, onChange: (e) => field.onChange(parseFloat(e.target.value) || 0) }) }),
202
+ /* @__PURE__ */ jsx(FormMessage, {})
203
+ ] }) })
204
+ ] })
205
+ ]
206
+ }
207
+ ),
208
+ /* @__PURE__ */ jsxs(Section, { title: "Drop Settings", icon: /* @__PURE__ */ jsx(Sparkles, { className: "h-4 w-4" }), children: [
209
+ /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
210
+ /* @__PURE__ */ jsx("label", { className: "text-sm font-medium", children: "Mint price" }),
211
+ /* @__PURE__ */ jsx(ToggleGroup, { value: priceFree ? "Free" : "Paid", options: ["Free", "Paid"], onChange: (v) => onSetPriceFree(v === "Free") }),
212
+ !priceFree && /* @__PURE__ */ jsxs("div", { className: "flex gap-2 items-start pt-1", children: [
213
+ /* @__PURE__ */ jsx(FormField, { control: form.control, name: "priceAmount", render: ({ field }) => /* @__PURE__ */ jsxs(FormItem, { className: "flex-1", children: [
214
+ /* @__PURE__ */ jsx(FormControl, { children: /* @__PURE__ */ jsx(Input, { type: "number", placeholder: "0.01", step: "any", min: 0, ...field }) }),
215
+ /* @__PURE__ */ jsx(FormMessage, {})
216
+ ] }) }),
217
+ /* @__PURE__ */ jsxs("div", { ref: tokenDropdownRef, className: "relative", children: [
218
+ /* @__PURE__ */ jsxs(
219
+ "button",
220
+ {
221
+ type: "button",
222
+ onClick: () => onSetTokenDropdownOpen(!tokenDropdownOpen),
223
+ "aria-haspopup": "listbox",
224
+ "aria-expanded": tokenDropdownOpen,
225
+ 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",
226
+ children: [
227
+ selectedToken.symbol,
228
+ /* @__PURE__ */ jsx(ChevronDown, { className: "h-3.5 w-3.5 text-muted-foreground" })
229
+ ]
230
+ }
231
+ ),
232
+ tokenDropdownOpen && /* @__PURE__ */ 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__ */ jsx(
233
+ "button",
234
+ {
235
+ type: "button",
236
+ role: "option",
237
+ "aria-selected": selectedToken.address === t.address,
238
+ onClick: () => onSelectToken(t),
239
+ 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"),
240
+ children: t.symbol
241
+ },
242
+ t.address
243
+ )) })
244
+ ] })
245
+ ] }),
246
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: "A free claim, or a fixed price per token." })
247
+ ] }),
248
+ /* @__PURE__ */ jsx(FormField, { control: form.control, name: "maxPerWallet", render: ({ field }) => /* @__PURE__ */ jsxs(FormItem, { children: [
249
+ /* @__PURE__ */ jsx(FormLabel, { children: "Max per wallet" }),
250
+ /* @__PURE__ */ jsx(FormControl, { children: /* @__PURE__ */ jsx(Input, { type: "number", min: 1, max: 1e4, className: "max-w-[120px]", ...field }) }),
251
+ /* @__PURE__ */ jsx(FormMessage, {})
252
+ ] }) }),
253
+ /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
254
+ /* @__PURE__ */ jsx("label", { className: "text-sm font-medium", children: "Mint window *" }),
255
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4", children: [
256
+ /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
257
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: "Opens" }),
258
+ /* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
259
+ /* @__PURE__ */ jsx(FormField, { control: form.control, name: "startDate", render: ({ field }) => /* @__PURE__ */ jsxs(FormItem, { className: "flex-1", children: [
260
+ /* @__PURE__ */ jsx(FormControl, { children: /* @__PURE__ */ jsx(Input, { type: "date", ...field }) }),
261
+ /* @__PURE__ */ jsx(FormMessage, {})
262
+ ] }) }),
263
+ /* @__PURE__ */ jsx(FormField, { control: form.control, name: "startTime", render: ({ field }) => /* @__PURE__ */ jsx(FormItem, { className: "w-28", children: /* @__PURE__ */ jsx(FormControl, { children: /* @__PURE__ */ jsx(Input, { type: "time", ...field }) }) }) })
264
+ ] })
265
+ ] }),
266
+ /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
267
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: "Closes" }),
268
+ /* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
269
+ /* @__PURE__ */ jsx(FormField, { control: form.control, name: "endDate", render: ({ field }) => /* @__PURE__ */ jsxs(FormItem, { className: "flex-1", children: [
270
+ /* @__PURE__ */ jsx(FormControl, { children: /* @__PURE__ */ jsx(Input, { type: "date", ...field }) }),
271
+ /* @__PURE__ */ jsx(FormMessage, {})
272
+ ] }) }),
273
+ /* @__PURE__ */ jsx(FormField, { control: form.control, name: "endTime", render: ({ field }) => /* @__PURE__ */ jsx(FormItem, { className: "w-28", children: /* @__PURE__ */ jsx(FormControl, { children: /* @__PURE__ */ jsx(Input, { type: "time", ...field }) }) }) })
274
+ ] })
275
+ ] })
276
+ ] })
277
+ ] }),
278
+ /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
279
+ /* @__PURE__ */ jsx("label", { className: "text-sm font-medium", children: "Listing visibility" }),
280
+ /* @__PURE__ */ jsx(ToggleGroup, { value: isPublic ? "Public" : "Hidden", options: ["Public", "Hidden"], onChange: (v) => onSetPublic(v === "Public") }),
281
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: isPublic ? "Listed on the Drop launchpad." : "Hidden \u2014 only reachable by direct link." })
282
+ ] })
283
+ ] }),
284
+ /* @__PURE__ */ jsx(
285
+ CollapsibleSection,
286
+ {
287
+ open: whitelistEnabled,
288
+ onOpenChange: (o) => form.setValue("whitelistEnabled", o),
289
+ icon: /* @__PURE__ */ jsx(Users, { className: "h-4 w-4 text-primary" }),
290
+ label: "Whitelist",
291
+ hint: whitelistEnabled ? "Only listed addresses can mint" : "Optional \xB7 restrict who can mint",
292
+ contentSpacing: "space-y-3",
293
+ children: /* @__PURE__ */ jsx(FormField, { control: form.control, name: "allowlistAddresses", render: ({ field }) => /* @__PURE__ */ jsxs(FormItem, { children: [
294
+ /* @__PURE__ */ jsx(FormControl, { children: /* @__PURE__ */ jsx(Textarea, { placeholder: "Paste Starknet addresses, one per line:\n0x04a\u2026\n0x06b\u2026", rows: 5, ...field, className: "tabular-nums text-xs resize-none" }) }),
295
+ /* @__PURE__ */ jsx(FormDescription, { className: "text-xs", children: "Only these wallets can mint. You can open it to everyone later from Manage." }),
296
+ /* @__PURE__ */ jsx(FormMessage, {})
297
+ ] }) })
298
+ }
299
+ ),
300
+ /* @__PURE__ */ jsx(ExclusiveContentSection, { form }),
301
+ /* @__PURE__ */ jsx(
302
+ "button",
303
+ {
304
+ type: "submit",
305
+ disabled: isSubmitting || imageUploading,
306
+ 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"),
307
+ children: isSubmitting ? /* @__PURE__ */ jsxs(Fragment, { children: [
308
+ /* @__PURE__ */ jsx(Loader2, { className: "h-4 w-4 animate-spin" }),
309
+ "Launching\u2026"
310
+ ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
311
+ /* @__PURE__ */ jsx(Package, { className: "h-4 w-4" }),
312
+ "Launch Drop"
313
+ ] })
314
+ }
315
+ ),
316
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-center text-muted-foreground", children: "Supply equals the number of NFTs you add. Zero platform fees to launch." })
317
+ ] });
318
+ }
319
+ export {
320
+ DropCreateForm
321
+ };
322
+ //# sourceMappingURL=drop-create-form.js.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,79 @@
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_preview_card_exports = {};
21
+ __export(drop_preview_card_exports, {
22
+ DropPreviewCard: () => DropPreviewCard
23
+ });
24
+ module.exports = __toCommonJS(drop_preview_card_exports);
25
+ var import_jsx_runtime = require("react/jsx-runtime");
26
+ var import_lucide_react = require("lucide-react");
27
+ var import_medialane_collection_card = require("./medialane-collection-card.js");
28
+ var import_drop_status_display = require("./drop-status-display.js");
29
+ var import_drop_countdown = require("./drop-countdown.js");
30
+ var import_drop_status = require("../utils/drop-status.js");
31
+ function DropPreviewCard({
32
+ coverImage,
33
+ name,
34
+ symbol,
35
+ creatorAddress,
36
+ creatorHref,
37
+ itemCount,
38
+ conditions,
39
+ whitelistEnabled,
40
+ gatedContentEnabled
41
+ }) {
42
+ const status = (0, import_drop_status.getDropStatus)(conditions, 0);
43
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-3", children: [
44
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
45
+ import_medialane_collection_card.MedialaneCollectionCard,
46
+ {
47
+ image: coverImage,
48
+ name,
49
+ collection: symbol || "Drop",
50
+ creator: creatorAddress,
51
+ creatorHref
52
+ }
53
+ ),
54
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "bento-cell p-4 space-y-3", children: [
55
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2 flex-wrap", children: [
56
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_drop_status_display.DropStatusBadge, { status }),
57
+ whitelistEnabled && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "inline-flex items-center gap-1 text-[10px] font-bold uppercase tracking-widest text-brand-orange bg-brand-orange/10 rounded-full px-2 py-0.5", children: [
58
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Users, { className: "h-3 w-3" }),
59
+ "Whitelist"
60
+ ] }),
61
+ gatedContentEnabled && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "inline-flex items-center gap-1 text-[10px] font-bold uppercase tracking-widest text-primary bg-primary/10 rounded-full px-2 py-0.5", children: [
62
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Lock, { className: "h-3 w-3" }),
63
+ "Exclusive content"
64
+ ] })
65
+ ] }),
66
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_drop_status_display.DropSupplyProgress, { minted: 0, max: itemCount }),
67
+ conditions && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2 text-sm", children: [
68
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ShieldCheck, { className: "h-3.5 w-3.5 text-muted-foreground" }),
69
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_drop_status_display.DropPriceDisplay, { conditions })
70
+ ] }),
71
+ conditions && status === "upcoming" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_drop_countdown.DropCountdown, { targetTs: conditions.startTime, label: whitelistEnabled ? "Whitelist opens in" : "Mint opens in" })
72
+ ] })
73
+ ] });
74
+ }
75
+ // Annotate the CommonJS export names for ESM import in node:
76
+ 0 && (module.exports = {
77
+ DropPreviewCard
78
+ });
79
+ //# sourceMappingURL=drop-preview-card.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/drop-preview-card.tsx"],"sourcesContent":["\"use client\";\n\nimport { Lock, ShieldCheck, Users } from \"lucide-react\";\nimport { MedialaneCollectionCard } from \"./medialane-collection-card.js\";\nimport { DropStatusBadge, DropSupplyProgress, DropPriceDisplay } from \"./drop-status-display.js\";\nimport { DropCountdown } from \"./drop-countdown.js\";\nimport { getDropStatus, type DropConditions } from \"../utils/drop-status.js\";\n\nexport interface DropPreviewCardProps {\n coverImage: string | null;\n name: string;\n symbol: string;\n creatorAddress?: string;\n creatorHref?: string;\n itemCount: number;\n conditions: DropConditions | null;\n whitelistEnabled: boolean;\n gatedContentEnabled: boolean;\n}\n\nexport function DropPreviewCard({\n coverImage, name, symbol, creatorAddress, creatorHref,\n itemCount, conditions, whitelistEnabled, gatedContentEnabled,\n}: DropPreviewCardProps) {\n const status = getDropStatus(conditions, 0);\n\n return (\n <div className=\"space-y-3\">\n <MedialaneCollectionCard\n image={coverImage}\n name={name}\n collection={symbol || \"Drop\"}\n creator={creatorAddress}\n creatorHref={creatorHref}\n />\n\n <div className=\"bento-cell p-4 space-y-3\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <DropStatusBadge status={status} />\n {whitelistEnabled && (\n <span className=\"inline-flex items-center gap-1 text-[10px] font-bold uppercase tracking-widest text-brand-orange bg-brand-orange/10 rounded-full px-2 py-0.5\">\n <Users className=\"h-3 w-3\" />\n Whitelist\n </span>\n )}\n {gatedContentEnabled && (\n <span className=\"inline-flex items-center gap-1 text-[10px] font-bold uppercase tracking-widest text-primary bg-primary/10 rounded-full px-2 py-0.5\">\n <Lock className=\"h-3 w-3\" />\n Exclusive content\n </span>\n )}\n </div>\n\n <DropSupplyProgress minted={0} max={itemCount} />\n\n {conditions && (\n <div className=\"flex items-center gap-2 text-sm\">\n <ShieldCheck className=\"h-3.5 w-3.5 text-muted-foreground\" />\n <DropPriceDisplay conditions={conditions} />\n </div>\n )}\n\n {conditions && status === \"upcoming\" && (\n <DropCountdown targetTs={conditions.startTime} label={whitelistEnabled ? \"Whitelist opens in\" : \"Mint opens in\"} />\n )}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA4BM;AA1BN,0BAAyC;AACzC,uCAAwC;AACxC,iCAAsE;AACtE,4BAA8B;AAC9B,yBAAmD;AAc5C,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EAAY;AAAA,EAAM;AAAA,EAAQ;AAAA,EAAgB;AAAA,EAC1C;AAAA,EAAW;AAAA,EAAY;AAAA,EAAkB;AAC3C,GAAyB;AACvB,QAAM,aAAS,kCAAc,YAAY,CAAC;AAE1C,SACE,6CAAC,SAAI,WAAU,aACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,QACP;AAAA,QACA,YAAY,UAAU;AAAA,QACtB,SAAS;AAAA,QACT;AAAA;AAAA,IACF;AAAA,IAEA,6CAAC,SAAI,WAAU,4BACb;AAAA,mDAAC,SAAI,WAAU,qCACb;AAAA,oDAAC,8CAAgB,QAAgB;AAAA,QAChC,oBACC,6CAAC,UAAK,WAAU,gJACd;AAAA,sDAAC,6BAAM,WAAU,WAAU;AAAA,UAAE;AAAA,WAE/B;AAAA,QAED,uBACC,6CAAC,UAAK,WAAU,sIACd;AAAA,sDAAC,4BAAK,WAAU,WAAU;AAAA,UAAE;AAAA,WAE9B;AAAA,SAEJ;AAAA,MAEA,4CAAC,iDAAmB,QAAQ,GAAG,KAAK,WAAW;AAAA,MAE9C,cACC,6CAAC,SAAI,WAAU,mCACb;AAAA,oDAAC,mCAAY,WAAU,qCAAoC;AAAA,QAC3D,4CAAC,+CAAiB,YAAwB;AAAA,SAC5C;AAAA,MAGD,cAAc,WAAW,cACxB,4CAAC,uCAAc,UAAU,WAAW,WAAW,OAAO,mBAAmB,uBAAuB,iBAAiB;AAAA,OAErH;AAAA,KACF;AAEJ;","names":[]}
@@ -0,0 +1,17 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { DropConditions } from '../utils/drop-status.cjs';
3
+
4
+ interface DropPreviewCardProps {
5
+ coverImage: string | null;
6
+ name: string;
7
+ symbol: string;
8
+ creatorAddress?: string;
9
+ creatorHref?: string;
10
+ itemCount: number;
11
+ conditions: DropConditions | null;
12
+ whitelistEnabled: boolean;
13
+ gatedContentEnabled: boolean;
14
+ }
15
+ declare function DropPreviewCard({ coverImage, name, symbol, creatorAddress, creatorHref, itemCount, conditions, whitelistEnabled, gatedContentEnabled, }: DropPreviewCardProps): react_jsx_runtime.JSX.Element;
16
+
17
+ export { DropPreviewCard, type DropPreviewCardProps };
@@ -0,0 +1,17 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { DropConditions } from '../utils/drop-status.js';
3
+
4
+ interface DropPreviewCardProps {
5
+ coverImage: string | null;
6
+ name: string;
7
+ symbol: string;
8
+ creatorAddress?: string;
9
+ creatorHref?: string;
10
+ itemCount: number;
11
+ conditions: DropConditions | null;
12
+ whitelistEnabled: boolean;
13
+ gatedContentEnabled: boolean;
14
+ }
15
+ declare function DropPreviewCard({ coverImage, name, symbol, creatorAddress, creatorHref, itemCount, conditions, whitelistEnabled, gatedContentEnabled, }: DropPreviewCardProps): react_jsx_runtime.JSX.Element;
16
+
17
+ export { DropPreviewCard, type DropPreviewCardProps };
@@ -0,0 +1,55 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { Lock, ShieldCheck, Users } from "lucide-react";
4
+ import { MedialaneCollectionCard } from "./medialane-collection-card.js";
5
+ import { DropStatusBadge, DropSupplyProgress, DropPriceDisplay } from "./drop-status-display.js";
6
+ import { DropCountdown } from "./drop-countdown.js";
7
+ import { getDropStatus } from "../utils/drop-status.js";
8
+ function DropPreviewCard({
9
+ coverImage,
10
+ name,
11
+ symbol,
12
+ creatorAddress,
13
+ creatorHref,
14
+ itemCount,
15
+ conditions,
16
+ whitelistEnabled,
17
+ gatedContentEnabled
18
+ }) {
19
+ const status = getDropStatus(conditions, 0);
20
+ return /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
21
+ /* @__PURE__ */ jsx(
22
+ MedialaneCollectionCard,
23
+ {
24
+ image: coverImage,
25
+ name,
26
+ collection: symbol || "Drop",
27
+ creator: creatorAddress,
28
+ creatorHref
29
+ }
30
+ ),
31
+ /* @__PURE__ */ jsxs("div", { className: "bento-cell p-4 space-y-3", children: [
32
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 flex-wrap", children: [
33
+ /* @__PURE__ */ jsx(DropStatusBadge, { status }),
34
+ whitelistEnabled && /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1 text-[10px] font-bold uppercase tracking-widest text-brand-orange bg-brand-orange/10 rounded-full px-2 py-0.5", children: [
35
+ /* @__PURE__ */ jsx(Users, { className: "h-3 w-3" }),
36
+ "Whitelist"
37
+ ] }),
38
+ gatedContentEnabled && /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1 text-[10px] font-bold uppercase tracking-widest text-primary bg-primary/10 rounded-full px-2 py-0.5", children: [
39
+ /* @__PURE__ */ jsx(Lock, { className: "h-3 w-3" }),
40
+ "Exclusive content"
41
+ ] })
42
+ ] }),
43
+ /* @__PURE__ */ jsx(DropSupplyProgress, { minted: 0, max: itemCount }),
44
+ conditions && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-sm", children: [
45
+ /* @__PURE__ */ jsx(ShieldCheck, { className: "h-3.5 w-3.5 text-muted-foreground" }),
46
+ /* @__PURE__ */ jsx(DropPriceDisplay, { conditions })
47
+ ] }),
48
+ conditions && status === "upcoming" && /* @__PURE__ */ jsx(DropCountdown, { targetTs: conditions.startTime, label: whitelistEnabled ? "Whitelist opens in" : "Mint opens in" })
49
+ ] })
50
+ ] });
51
+ }
52
+ export {
53
+ DropPreviewCard
54
+ };
55
+ //# sourceMappingURL=drop-preview-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/drop-preview-card.tsx"],"sourcesContent":["\"use client\";\n\nimport { Lock, ShieldCheck, Users } from \"lucide-react\";\nimport { MedialaneCollectionCard } from \"./medialane-collection-card.js\";\nimport { DropStatusBadge, DropSupplyProgress, DropPriceDisplay } from \"./drop-status-display.js\";\nimport { DropCountdown } from \"./drop-countdown.js\";\nimport { getDropStatus, type DropConditions } from \"../utils/drop-status.js\";\n\nexport interface DropPreviewCardProps {\n coverImage: string | null;\n name: string;\n symbol: string;\n creatorAddress?: string;\n creatorHref?: string;\n itemCount: number;\n conditions: DropConditions | null;\n whitelistEnabled: boolean;\n gatedContentEnabled: boolean;\n}\n\nexport function DropPreviewCard({\n coverImage, name, symbol, creatorAddress, creatorHref,\n itemCount, conditions, whitelistEnabled, gatedContentEnabled,\n}: DropPreviewCardProps) {\n const status = getDropStatus(conditions, 0);\n\n return (\n <div className=\"space-y-3\">\n <MedialaneCollectionCard\n image={coverImage}\n name={name}\n collection={symbol || \"Drop\"}\n creator={creatorAddress}\n creatorHref={creatorHref}\n />\n\n <div className=\"bento-cell p-4 space-y-3\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <DropStatusBadge status={status} />\n {whitelistEnabled && (\n <span className=\"inline-flex items-center gap-1 text-[10px] font-bold uppercase tracking-widest text-brand-orange bg-brand-orange/10 rounded-full px-2 py-0.5\">\n <Users className=\"h-3 w-3\" />\n Whitelist\n </span>\n )}\n {gatedContentEnabled && (\n <span className=\"inline-flex items-center gap-1 text-[10px] font-bold uppercase tracking-widest text-primary bg-primary/10 rounded-full px-2 py-0.5\">\n <Lock className=\"h-3 w-3\" />\n Exclusive content\n </span>\n )}\n </div>\n\n <DropSupplyProgress minted={0} max={itemCount} />\n\n {conditions && (\n <div className=\"flex items-center gap-2 text-sm\">\n <ShieldCheck className=\"h-3.5 w-3.5 text-muted-foreground\" />\n <DropPriceDisplay conditions={conditions} />\n </div>\n )}\n\n {conditions && status === \"upcoming\" && (\n <DropCountdown targetTs={conditions.startTime} label={whitelistEnabled ? \"Whitelist opens in\" : \"Mint opens in\"} />\n )}\n </div>\n </div>\n );\n}\n"],"mappings":";AA4BM,cAYM,YAZN;AA1BN,SAAS,MAAM,aAAa,aAAa;AACzC,SAAS,+BAA+B;AACxC,SAAS,iBAAiB,oBAAoB,wBAAwB;AACtE,SAAS,qBAAqB;AAC9B,SAAS,qBAA0C;AAc5C,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EAAY;AAAA,EAAM;AAAA,EAAQ;AAAA,EAAgB;AAAA,EAC1C;AAAA,EAAW;AAAA,EAAY;AAAA,EAAkB;AAC3C,GAAyB;AACvB,QAAM,SAAS,cAAc,YAAY,CAAC;AAE1C,SACE,qBAAC,SAAI,WAAU,aACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,QACP;AAAA,QACA,YAAY,UAAU;AAAA,QACtB,SAAS;AAAA,QACT;AAAA;AAAA,IACF;AAAA,IAEA,qBAAC,SAAI,WAAU,4BACb;AAAA,2BAAC,SAAI,WAAU,qCACb;AAAA,4BAAC,mBAAgB,QAAgB;AAAA,QAChC,oBACC,qBAAC,UAAK,WAAU,gJACd;AAAA,8BAAC,SAAM,WAAU,WAAU;AAAA,UAAE;AAAA,WAE/B;AAAA,QAED,uBACC,qBAAC,UAAK,WAAU,sIACd;AAAA,8BAAC,QAAK,WAAU,WAAU;AAAA,UAAE;AAAA,WAE9B;AAAA,SAEJ;AAAA,MAEA,oBAAC,sBAAmB,QAAQ,GAAG,KAAK,WAAW;AAAA,MAE9C,cACC,qBAAC,SAAI,WAAU,mCACb;AAAA,4BAAC,eAAY,WAAU,qCAAoC;AAAA,QAC3D,oBAAC,oBAAiB,YAAwB;AAAA,SAC5C;AAAA,MAGD,cAAc,WAAW,cACxB,oBAAC,iBAAc,UAAU,WAAW,WAAW,OAAO,mBAAmB,uBAAuB,iBAAiB;AAAA,OAErH;AAAA,KACF;AAEJ;","names":[]}