@medialane/ui 0.295.0 → 0.296.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 (69) hide show
  1. package/dist/components/account/input-otp.d.cts +2 -2
  2. package/dist/components/account/input-otp.d.ts +2 -2
  3. package/dist/components/badge.d.cts +1 -1
  4. package/dist/components/badge.d.ts +1 -1
  5. package/dist/components/button.d.cts +2 -2
  6. package/dist/components/button.d.ts +2 -2
  7. package/dist/components/fast-mint/asset-form-parts.cjs +194 -0
  8. package/dist/components/fast-mint/asset-form-parts.cjs.map +1 -0
  9. package/dist/components/fast-mint/asset-form-parts.d.cts +33 -0
  10. package/dist/components/fast-mint/asset-form-parts.d.ts +33 -0
  11. package/dist/components/fast-mint/asset-form-parts.js +158 -0
  12. package/dist/components/fast-mint/asset-form-parts.js.map +1 -0
  13. package/dist/components/fast-mint/collection-section.cjs +211 -0
  14. package/dist/components/fast-mint/collection-section.cjs.map +1 -0
  15. package/dist/components/fast-mint/collection-section.d.cts +27 -0
  16. package/dist/components/fast-mint/collection-section.d.ts +27 -0
  17. package/dist/components/fast-mint/collection-section.js +176 -0
  18. package/dist/components/fast-mint/collection-section.js.map +1 -0
  19. package/dist/components/fast-mint/fast-mint.cjs +116 -653
  20. package/dist/components/fast-mint/fast-mint.cjs.map +1 -1
  21. package/dist/components/fast-mint/fast-mint.d.cts +2 -2
  22. package/dist/components/fast-mint/fast-mint.d.ts +2 -2
  23. package/dist/components/fast-mint/fast-mint.js +115 -661
  24. package/dist/components/fast-mint/fast-mint.js.map +1 -1
  25. package/dist/components/fast-mint/form.cjs +40 -0
  26. package/dist/components/fast-mint/form.cjs.map +1 -0
  27. package/dist/components/fast-mint/form.d.cts +15 -0
  28. package/dist/components/fast-mint/form.d.ts +15 -0
  29. package/dist/components/fast-mint/form.js +16 -0
  30. package/dist/components/fast-mint/form.js.map +1 -0
  31. package/dist/components/fast-mint/ip-type-section.cjs +76 -0
  32. package/dist/components/fast-mint/ip-type-section.cjs.map +1 -0
  33. package/dist/components/fast-mint/ip-type-section.d.cts +17 -0
  34. package/dist/components/fast-mint/ip-type-section.d.ts +17 -0
  35. package/dist/components/fast-mint/ip-type-section.js +52 -0
  36. package/dist/components/fast-mint/ip-type-section.js.map +1 -0
  37. package/dist/components/fast-mint/licensing-section.cjs +124 -0
  38. package/dist/components/fast-mint/licensing-section.cjs.map +1 -0
  39. package/dist/components/fast-mint/licensing-section.d.cts +14 -0
  40. package/dist/components/fast-mint/licensing-section.d.ts +14 -0
  41. package/dist/components/fast-mint/licensing-section.js +99 -0
  42. package/dist/components/fast-mint/licensing-section.js.map +1 -0
  43. package/dist/components/fast-mint/media-kind.cjs +48 -0
  44. package/dist/components/fast-mint/media-kind.cjs.map +1 -0
  45. package/dist/components/fast-mint/media-kind.d.cts +12 -0
  46. package/dist/components/fast-mint/media-kind.d.ts +12 -0
  47. package/dist/components/fast-mint/media-kind.js +22 -0
  48. package/dist/components/fast-mint/media-kind.js.map +1 -0
  49. package/dist/components/fast-mint/mint-asset.cjs +124 -0
  50. package/dist/components/fast-mint/mint-asset.cjs.map +1 -0
  51. package/dist/components/fast-mint/mint-asset.d.cts +41 -0
  52. package/dist/components/fast-mint/mint-asset.d.ts +41 -0
  53. package/dist/components/fast-mint/mint-asset.js +100 -0
  54. package/dist/components/fast-mint/mint-asset.js.map +1 -0
  55. package/dist/components/fast-mint/use-ipfs-upload.cjs +64 -0
  56. package/dist/components/fast-mint/use-ipfs-upload.cjs.map +1 -0
  57. package/dist/components/fast-mint/use-ipfs-upload.d.cts +9 -0
  58. package/dist/components/fast-mint/use-ipfs-upload.d.ts +9 -0
  59. package/dist/components/fast-mint/use-ipfs-upload.js +40 -0
  60. package/dist/components/fast-mint/use-ipfs-upload.js.map +1 -0
  61. package/dist/components/fast-mint/use-new-collection-draft.cjs +66 -0
  62. package/dist/components/fast-mint/use-new-collection-draft.cjs.map +1 -0
  63. package/dist/components/fast-mint/use-new-collection-draft.d.cts +13 -0
  64. package/dist/components/fast-mint/use-new-collection-draft.d.ts +13 -0
  65. package/dist/components/fast-mint/use-new-collection-draft.js +42 -0
  66. package/dist/components/fast-mint/use-new-collection-draft.js.map +1 -0
  67. package/dist/components/sheet.d.cts +1 -1
  68. package/dist/components/sheet.d.ts +1 -1
  69. package/package.json +1 -1
@@ -0,0 +1,211 @@
1
+ "use strict";
2
+ "use client";
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __export = (target, all) => {
10
+ for (var name in all)
11
+ __defProp(target, name, { get: all[name], enumerable: true });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from))
16
+ if (!__hasOwnProp.call(to, key) && key !== except)
17
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
18
+ }
19
+ return to;
20
+ };
21
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
22
+ // If the importer is in node compatibility mode or this is not an ESM
23
+ // file that has been converted to a CommonJS file using a Babel-
24
+ // compatible transform (i.e. "__esModule" has not been set), then set
25
+ // "default" to the CommonJS "module.exports" for node compatibility.
26
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
27
+ mod
28
+ ));
29
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
+ var collection_section_exports = {};
31
+ __export(collection_section_exports, {
32
+ CollectionPicker: () => CollectionPicker,
33
+ CollectionSection: () => CollectionSection
34
+ });
35
+ module.exports = __toCommonJS(collection_section_exports);
36
+ var import_jsx_runtime = require("react/jsx-runtime");
37
+ var import_react = require("react");
38
+ var import_image = __toESM(require("next/image"), 1);
39
+ var import_lucide_react = require("lucide-react");
40
+ var import_input = require("../input.js");
41
+ var import_textarea = require("../textarea.js");
42
+ var import_popover = require("../popover.js");
43
+ var import_cn = require("../../utils/cn.js");
44
+ var import_use_image_url = require("../../utils/use-image-url.js");
45
+ var import_mintable_collections = require("./mintable-collections.js");
46
+ function collectionDisplayLabel(col) {
47
+ return col.name || col.symbol || `Collection #${col.collectionId}`;
48
+ }
49
+ function CollectionThumb({ image }) {
50
+ const resolveImage = (0, import_use_image_url.useImageUrl)();
51
+ const imageUrl = resolveImage(image);
52
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "relative h-10 w-10 rounded-lg overflow-hidden bg-muted shrink-0", children: imageUrl ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_image.default, { src: imageUrl, alt: "", fill: true, className: "object-cover", unoptimized: true }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "absolute inset-0 flex items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Boxes, { className: "h-4 w-4 text-muted-foreground/40" }) }) });
53
+ }
54
+ function CollectionPicker({
55
+ collections,
56
+ value,
57
+ onChange,
58
+ valueOf
59
+ }) {
60
+ const [open, setOpen] = (0, import_react.useState)(false);
61
+ const selected = value ? collections.find((c) => valueOf(c) === value) ?? null : null;
62
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_popover.Popover, { open, onOpenChange: setOpen, children: [
63
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_popover.PopoverTrigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
64
+ "button",
65
+ {
66
+ type: "button",
67
+ "aria-expanded": open,
68
+ className: "flex w-full items-center gap-3 rounded-xl border border-border p-3 text-left transition-colors hover:bg-muted/40",
69
+ children: [
70
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CollectionThumb, { image: selected?.image }),
71
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "min-w-0 flex-1", children: [
72
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm font-semibold truncate", children: selected ? collectionDisplayLabel(selected) : collections.length ? "Choose a collection" : "No collections yet" }),
73
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-xs text-muted-foreground", children: selected ? `${selected.totalSupply ?? 0} work${selected.totalSupply === 1 ? "" : "s"}` : "Where this work will live" })
74
+ ] }),
75
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ChevronDown, { className: "h-3.5 w-3.5 text-muted-foreground shrink-0" })
76
+ ]
77
+ }
78
+ ) }),
79
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_popover.PopoverContent, { className: "w-[var(--radix-popover-trigger-width)] p-0", align: "start", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "max-h-64 overflow-y-auto p-1", children: collections.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "px-3 py-4 text-center text-sm text-muted-foreground", children: "No collections yet \u2014 create one instead." }) : collections.map((col) => {
80
+ const id = valueOf(col);
81
+ const isSelected = !!id && value === id;
82
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
83
+ "button",
84
+ {
85
+ type: "button",
86
+ disabled: !id,
87
+ onClick: () => {
88
+ if (!id) return;
89
+ onChange(id);
90
+ setOpen(false);
91
+ },
92
+ className: "flex w-full items-center gap-2.5 rounded-lg px-2 py-2 text-left transition-colors hover:bg-muted/60",
93
+ children: [
94
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CollectionThumb, { image: col.image }),
95
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "min-w-0 flex-1", children: [
96
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm font-medium truncate", children: collectionDisplayLabel(col) }),
97
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", { className: "text-xs text-muted-foreground", children: [
98
+ col.totalSupply ?? 0,
99
+ " work",
100
+ col.totalSupply === 1 ? "" : "s"
101
+ ] })
102
+ ] }),
103
+ isSelected && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Check, { className: "h-4 w-4 text-brand-blue shrink-0" })
104
+ ]
105
+ },
106
+ id ?? col.contractAddress ?? col.name
107
+ );
108
+ }) }) })
109
+ ] });
110
+ }
111
+ function CollectionSection({
112
+ assetType,
113
+ mode,
114
+ onModeChange,
115
+ collections,
116
+ existingId,
117
+ existingContract,
118
+ onExistingId,
119
+ onExistingContract,
120
+ draft,
121
+ previewImage
122
+ }) {
123
+ const single = assetType === "single";
124
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-2", children: [
125
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center justify-between", children: [
126
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("label", { className: "text-sm font-medium flex items-center gap-1.5", children: [
127
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Boxes, { className: "h-4 w-4" }),
128
+ "Collection *"
129
+ ] }),
130
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex rounded-lg border border-border overflow-hidden", children: [
131
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
132
+ "button",
133
+ {
134
+ type: "button",
135
+ onClick: () => onModeChange("existing"),
136
+ className: (0, import_cn.cn)(
137
+ "px-3 h-7 text-xs font-medium transition-colors",
138
+ mode === "existing" ? "bg-primary text-primary-foreground" : "bg-background hover:bg-muted text-muted-foreground"
139
+ ),
140
+ children: "Existing"
141
+ }
142
+ ),
143
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
144
+ "button",
145
+ {
146
+ type: "button",
147
+ onClick: () => onModeChange("new"),
148
+ className: (0, import_cn.cn)(
149
+ "px-3 h-7 text-xs font-medium border-l border-border transition-colors flex items-center gap-1",
150
+ mode === "new" ? "bg-primary text-primary-foreground" : "bg-background hover:bg-muted text-muted-foreground"
151
+ ),
152
+ children: [
153
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Plus, { className: "h-3 w-3" }),
154
+ "New"
155
+ ]
156
+ }
157
+ )
158
+ ] })
159
+ ] }),
160
+ mode === "existing" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
161
+ CollectionPicker,
162
+ {
163
+ collections,
164
+ value: single ? existingId : existingContract,
165
+ onChange: single ? onExistingId : onExistingContract,
166
+ valueOf: (0, import_mintable_collections.collectionKey)(assetType)
167
+ }
168
+ ) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex gap-3 rounded-xl border border-border p-3", children: [
169
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "relative h-16 w-16 rounded-lg overflow-hidden bg-muted shrink-0", children: previewImage ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_image.default, { src: previewImage, alt: "", fill: true, className: "object-cover", unoptimized: true }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "absolute inset-0 flex items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Boxes, { className: "h-5 w-5 text-muted-foreground/40" }) }) }),
170
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "min-w-0 flex-1 space-y-2", children: [
171
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "grid grid-cols-[1fr_100px] gap-2", children: [
172
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
173
+ import_input.Input,
174
+ {
175
+ value: draft.name,
176
+ onChange: (e) => draft.setName(e.target.value),
177
+ placeholder: "Collection name",
178
+ className: "h-9 text-sm"
179
+ }
180
+ ),
181
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
182
+ import_input.Input,
183
+ {
184
+ value: draft.symbol,
185
+ onChange: (e) => draft.setSymbol(e.target.value.toUpperCase()),
186
+ placeholder: "SYMBOL",
187
+ className: "h-9 text-sm"
188
+ }
189
+ )
190
+ ] }),
191
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
192
+ import_textarea.Textarea,
193
+ {
194
+ value: draft.description,
195
+ onChange: (e) => draft.setDescription(e.target.value),
196
+ placeholder: "Describe this collection\u2026",
197
+ rows: 2,
198
+ className: "text-sm resize-none"
199
+ }
200
+ ),
201
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-2xs text-muted-foreground", children: "Prefilled from your asset \u2014 edit anything above." })
202
+ ] })
203
+ ] })
204
+ ] });
205
+ }
206
+ // Annotate the CommonJS export names for ESM import in node:
207
+ 0 && (module.exports = {
208
+ CollectionPicker,
209
+ CollectionSection
210
+ });
211
+ //# sourceMappingURL=collection-section.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/fast-mint/collection-section.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport Image from \"next/image\";\nimport type { ApiCollection } from \"@medialane/sdk\";\nimport { Boxes, Check, ChevronDown, Plus } from \"lucide-react\";\nimport { Input } from \"../input.js\";\nimport { Textarea } from \"../textarea.js\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../popover.js\";\nimport { cn } from \"../../utils/cn.js\";\nimport { useImageUrl } from \"../../utils/use-image-url.js\";\nimport { collectionKey, type MintAssetType } from \"./mintable-collections.js\";\nimport type { useNewCollectionDraft } from \"./use-new-collection-draft.js\";\n\nfunction collectionDisplayLabel(col: ApiCollection) {\n return col.name || col.symbol || `Collection #${col.collectionId}`;\n}\n\nfunction CollectionThumb({ image }: { image: string | null | undefined }) {\n const resolveImage = useImageUrl();\n const imageUrl = resolveImage(image);\n return (\n <div className=\"relative h-10 w-10 rounded-lg overflow-hidden bg-muted shrink-0\">\n {imageUrl ? (\n <Image src={imageUrl} alt=\"\" fill className=\"object-cover\" unoptimized />\n ) : (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <Boxes className=\"h-4 w-4 text-muted-foreground/40\" />\n </div>\n )}\n </div>\n );\n}\n\nexport function CollectionPicker({\n collections, value, onChange, valueOf,\n}: {\n collections: ApiCollection[];\n value: string;\n onChange: (id: string) => void;\n valueOf: (c: ApiCollection) => string | null | undefined;\n}) {\n const [open, setOpen] = useState(false);\n const selected = value\n ? collections.find((c) => valueOf(c) === value) ?? null\n : null;\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-expanded={open}\n className=\"flex w-full items-center gap-3 rounded-xl border border-border p-3 text-left transition-colors hover:bg-muted/40\"\n >\n <CollectionThumb image={selected?.image} />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-semibold truncate\">\n {selected ? collectionDisplayLabel(selected) : collections.length ? \"Choose a collection\" : \"No collections yet\"}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {selected ? `${selected.totalSupply ?? 0} work${selected.totalSupply === 1 ? \"\" : \"s\"}` : \"Where this work will live\"}\n </p>\n </div>\n <ChevronDown className=\"h-3.5 w-3.5 text-muted-foreground shrink-0\" />\n </button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[var(--radix-popover-trigger-width)] p-0\" align=\"start\">\n <div className=\"max-h-64 overflow-y-auto p-1\">\n {collections.length === 0 ? (\n <p className=\"px-3 py-4 text-center text-sm text-muted-foreground\">No collections yet — create one instead.</p>\n ) : (\n collections.map((col) => {\n const id = valueOf(col);\n const isSelected = !!id && value === id;\n return (\n <button\n key={id ?? col.contractAddress ?? col.name}\n type=\"button\"\n disabled={!id}\n onClick={() => { if (!id) return; onChange(id); setOpen(false); }}\n className=\"flex w-full items-center gap-2.5 rounded-lg px-2 py-2 text-left transition-colors hover:bg-muted/60\"\n >\n <CollectionThumb image={col.image} />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium truncate\">{collectionDisplayLabel(col)}</p>\n <p className=\"text-xs text-muted-foreground\">{col.totalSupply ?? 0} work{col.totalSupply === 1 ? \"\" : \"s\"}</p>\n </div>\n {isSelected && <Check className=\"h-4 w-4 text-brand-blue shrink-0\" />}\n </button>\n );\n })\n )}\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n\n\nexport type CollectionMode = \"existing\" | \"new\";\n\nexport function CollectionSection({\n assetType, mode, onModeChange, collections, existingId, existingContract, onExistingId, onExistingContract, draft, previewImage,\n}: {\n assetType: MintAssetType;\n mode: CollectionMode;\n onModeChange: (mode: CollectionMode) => void;\n collections: ApiCollection[];\n existingId: string;\n existingContract: string;\n onExistingId: (id: string) => void;\n onExistingContract: (contract: string) => void;\n draft: ReturnType<typeof useNewCollectionDraft>;\n previewImage: string | null;\n}) {\n const single = assetType === \"single\";\n return (\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <label className=\"text-sm font-medium flex items-center gap-1.5\">\n <Boxes className=\"h-4 w-4\" />\n Collection *\n </label>\n <div className=\"flex rounded-lg border border-border overflow-hidden\">\n <button\n type=\"button\"\n onClick={() => onModeChange(\"existing\")}\n className={cn(\"px-3 h-7 text-xs font-medium transition-colors\",\n mode === \"existing\" ? \"bg-primary text-primary-foreground\" : \"bg-background hover:bg-muted text-muted-foreground\")}\n >\n Existing\n </button>\n <button\n type=\"button\"\n onClick={() => onModeChange(\"new\")}\n className={cn(\"px-3 h-7 text-xs font-medium border-l border-border transition-colors flex items-center gap-1\",\n mode === \"new\" ? \"bg-primary text-primary-foreground\" : \"bg-background hover:bg-muted text-muted-foreground\")}\n >\n <Plus className=\"h-3 w-3\" />New\n </button>\n </div>\n </div>\n\n {mode === \"existing\" ? (\n <CollectionPicker\n collections={collections}\n value={single ? existingId : existingContract}\n onChange={single ? onExistingId : onExistingContract}\n valueOf={collectionKey(assetType)}\n />\n ) : (\n <div className=\"flex gap-3 rounded-xl border border-border p-3\">\n <div className=\"relative h-16 w-16 rounded-lg overflow-hidden bg-muted shrink-0\">\n {previewImage ? (\n <Image src={previewImage} alt=\"\" fill className=\"object-cover\" unoptimized />\n ) : (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <Boxes className=\"h-5 w-5 text-muted-foreground/40\" />\n </div>\n )}\n </div>\n <div className=\"min-w-0 flex-1 space-y-2\">\n <div className=\"grid grid-cols-[1fr_100px] gap-2\">\n <Input\n value={draft.name}\n onChange={(e) => draft.setName(e.target.value)}\n placeholder=\"Collection name\"\n className=\"h-9 text-sm\"\n />\n <Input\n value={draft.symbol}\n onChange={(e) => draft.setSymbol(e.target.value.toUpperCase())}\n placeholder=\"SYMBOL\"\n className=\"h-9 text-sm\"\n />\n </div>\n <Textarea\n value={draft.description}\n onChange={(e) => draft.setDescription(e.target.value)}\n placeholder=\"Describe this collection…\"\n rows={2}\n className=\"text-sm resize-none\"\n />\n <p className=\"text-2xs text-muted-foreground\">Prefilled from your asset — edit anything above.</p>\n </div>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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","names":["Image"]}
@@ -0,0 +1,27 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ApiCollection } from '@medialane/sdk';
3
+ import { MintAssetType } from './mintable-collections.cjs';
4
+ import { useNewCollectionDraft } from './use-new-collection-draft.cjs';
5
+ import 'react';
6
+
7
+ declare function CollectionPicker({ collections, value, onChange, valueOf, }: {
8
+ collections: ApiCollection[];
9
+ value: string;
10
+ onChange: (id: string) => void;
11
+ valueOf: (c: ApiCollection) => string | null | undefined;
12
+ }): react_jsx_runtime.JSX.Element;
13
+ type CollectionMode = "existing" | "new";
14
+ declare function CollectionSection({ assetType, mode, onModeChange, collections, existingId, existingContract, onExistingId, onExistingContract, draft, previewImage, }: {
15
+ assetType: MintAssetType;
16
+ mode: CollectionMode;
17
+ onModeChange: (mode: CollectionMode) => void;
18
+ collections: ApiCollection[];
19
+ existingId: string;
20
+ existingContract: string;
21
+ onExistingId: (id: string) => void;
22
+ onExistingContract: (contract: string) => void;
23
+ draft: ReturnType<typeof useNewCollectionDraft>;
24
+ previewImage: string | null;
25
+ }): react_jsx_runtime.JSX.Element;
26
+
27
+ export { type CollectionMode, CollectionPicker, CollectionSection };
@@ -0,0 +1,27 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ApiCollection } from '@medialane/sdk';
3
+ import { MintAssetType } from './mintable-collections.js';
4
+ import { useNewCollectionDraft } from './use-new-collection-draft.js';
5
+ import 'react';
6
+
7
+ declare function CollectionPicker({ collections, value, onChange, valueOf, }: {
8
+ collections: ApiCollection[];
9
+ value: string;
10
+ onChange: (id: string) => void;
11
+ valueOf: (c: ApiCollection) => string | null | undefined;
12
+ }): react_jsx_runtime.JSX.Element;
13
+ type CollectionMode = "existing" | "new";
14
+ declare function CollectionSection({ assetType, mode, onModeChange, collections, existingId, existingContract, onExistingId, onExistingContract, draft, previewImage, }: {
15
+ assetType: MintAssetType;
16
+ mode: CollectionMode;
17
+ onModeChange: (mode: CollectionMode) => void;
18
+ collections: ApiCollection[];
19
+ existingId: string;
20
+ existingContract: string;
21
+ onExistingId: (id: string) => void;
22
+ onExistingContract: (contract: string) => void;
23
+ draft: ReturnType<typeof useNewCollectionDraft>;
24
+ previewImage: string | null;
25
+ }): react_jsx_runtime.JSX.Element;
26
+
27
+ export { type CollectionMode, CollectionPicker, CollectionSection };
@@ -0,0 +1,176 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { useState } from "react";
4
+ import Image from "next/image";
5
+ import { Boxes, Check, ChevronDown, Plus } from "lucide-react";
6
+ import { Input } from "../input.js";
7
+ import { Textarea } from "../textarea.js";
8
+ import { Popover, PopoverContent, PopoverTrigger } from "../popover.js";
9
+ import { cn } from "../../utils/cn.js";
10
+ import { useImageUrl } from "../../utils/use-image-url.js";
11
+ import { collectionKey } from "./mintable-collections.js";
12
+ function collectionDisplayLabel(col) {
13
+ return col.name || col.symbol || `Collection #${col.collectionId}`;
14
+ }
15
+ function CollectionThumb({ image }) {
16
+ const resolveImage = useImageUrl();
17
+ const imageUrl = resolveImage(image);
18
+ return /* @__PURE__ */ jsx("div", { className: "relative h-10 w-10 rounded-lg overflow-hidden bg-muted shrink-0", children: imageUrl ? /* @__PURE__ */ jsx(Image, { src: imageUrl, alt: "", fill: true, className: "object-cover", unoptimized: true }) : /* @__PURE__ */ jsx("div", { className: "absolute inset-0 flex items-center justify-center", children: /* @__PURE__ */ jsx(Boxes, { className: "h-4 w-4 text-muted-foreground/40" }) }) });
19
+ }
20
+ function CollectionPicker({
21
+ collections,
22
+ value,
23
+ onChange,
24
+ valueOf
25
+ }) {
26
+ const [open, setOpen] = useState(false);
27
+ const selected = value ? collections.find((c) => valueOf(c) === value) ?? null : null;
28
+ return /* @__PURE__ */ jsxs(Popover, { open, onOpenChange: setOpen, children: [
29
+ /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
30
+ "button",
31
+ {
32
+ type: "button",
33
+ "aria-expanded": open,
34
+ className: "flex w-full items-center gap-3 rounded-xl border border-border p-3 text-left transition-colors hover:bg-muted/40",
35
+ children: [
36
+ /* @__PURE__ */ jsx(CollectionThumb, { image: selected?.image }),
37
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
38
+ /* @__PURE__ */ jsx("p", { className: "text-sm font-semibold truncate", children: selected ? collectionDisplayLabel(selected) : collections.length ? "Choose a collection" : "No collections yet" }),
39
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: selected ? `${selected.totalSupply ?? 0} work${selected.totalSupply === 1 ? "" : "s"}` : "Where this work will live" })
40
+ ] }),
41
+ /* @__PURE__ */ jsx(ChevronDown, { className: "h-3.5 w-3.5 text-muted-foreground shrink-0" })
42
+ ]
43
+ }
44
+ ) }),
45
+ /* @__PURE__ */ jsx(PopoverContent, { className: "w-[var(--radix-popover-trigger-width)] p-0", align: "start", children: /* @__PURE__ */ jsx("div", { className: "max-h-64 overflow-y-auto p-1", children: collections.length === 0 ? /* @__PURE__ */ jsx("p", { className: "px-3 py-4 text-center text-sm text-muted-foreground", children: "No collections yet \u2014 create one instead." }) : collections.map((col) => {
46
+ const id = valueOf(col);
47
+ const isSelected = !!id && value === id;
48
+ return /* @__PURE__ */ jsxs(
49
+ "button",
50
+ {
51
+ type: "button",
52
+ disabled: !id,
53
+ onClick: () => {
54
+ if (!id) return;
55
+ onChange(id);
56
+ setOpen(false);
57
+ },
58
+ className: "flex w-full items-center gap-2.5 rounded-lg px-2 py-2 text-left transition-colors hover:bg-muted/60",
59
+ children: [
60
+ /* @__PURE__ */ jsx(CollectionThumb, { image: col.image }),
61
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
62
+ /* @__PURE__ */ jsx("p", { className: "text-sm font-medium truncate", children: collectionDisplayLabel(col) }),
63
+ /* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground", children: [
64
+ col.totalSupply ?? 0,
65
+ " work",
66
+ col.totalSupply === 1 ? "" : "s"
67
+ ] })
68
+ ] }),
69
+ isSelected && /* @__PURE__ */ jsx(Check, { className: "h-4 w-4 text-brand-blue shrink-0" })
70
+ ]
71
+ },
72
+ id ?? col.contractAddress ?? col.name
73
+ );
74
+ }) }) })
75
+ ] });
76
+ }
77
+ function CollectionSection({
78
+ assetType,
79
+ mode,
80
+ onModeChange,
81
+ collections,
82
+ existingId,
83
+ existingContract,
84
+ onExistingId,
85
+ onExistingContract,
86
+ draft,
87
+ previewImage
88
+ }) {
89
+ const single = assetType === "single";
90
+ return /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
91
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
92
+ /* @__PURE__ */ jsxs("label", { className: "text-sm font-medium flex items-center gap-1.5", children: [
93
+ /* @__PURE__ */ jsx(Boxes, { className: "h-4 w-4" }),
94
+ "Collection *"
95
+ ] }),
96
+ /* @__PURE__ */ jsxs("div", { className: "flex rounded-lg border border-border overflow-hidden", children: [
97
+ /* @__PURE__ */ jsx(
98
+ "button",
99
+ {
100
+ type: "button",
101
+ onClick: () => onModeChange("existing"),
102
+ className: cn(
103
+ "px-3 h-7 text-xs font-medium transition-colors",
104
+ mode === "existing" ? "bg-primary text-primary-foreground" : "bg-background hover:bg-muted text-muted-foreground"
105
+ ),
106
+ children: "Existing"
107
+ }
108
+ ),
109
+ /* @__PURE__ */ jsxs(
110
+ "button",
111
+ {
112
+ type: "button",
113
+ onClick: () => onModeChange("new"),
114
+ className: cn(
115
+ "px-3 h-7 text-xs font-medium border-l border-border transition-colors flex items-center gap-1",
116
+ mode === "new" ? "bg-primary text-primary-foreground" : "bg-background hover:bg-muted text-muted-foreground"
117
+ ),
118
+ children: [
119
+ /* @__PURE__ */ jsx(Plus, { className: "h-3 w-3" }),
120
+ "New"
121
+ ]
122
+ }
123
+ )
124
+ ] })
125
+ ] }),
126
+ mode === "existing" ? /* @__PURE__ */ jsx(
127
+ CollectionPicker,
128
+ {
129
+ collections,
130
+ value: single ? existingId : existingContract,
131
+ onChange: single ? onExistingId : onExistingContract,
132
+ valueOf: collectionKey(assetType)
133
+ }
134
+ ) : /* @__PURE__ */ jsxs("div", { className: "flex gap-3 rounded-xl border border-border p-3", children: [
135
+ /* @__PURE__ */ jsx("div", { className: "relative h-16 w-16 rounded-lg overflow-hidden bg-muted shrink-0", children: previewImage ? /* @__PURE__ */ jsx(Image, { src: previewImage, alt: "", fill: true, className: "object-cover", unoptimized: true }) : /* @__PURE__ */ jsx("div", { className: "absolute inset-0 flex items-center justify-center", children: /* @__PURE__ */ jsx(Boxes, { className: "h-5 w-5 text-muted-foreground/40" }) }) }),
136
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1 space-y-2", children: [
137
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-[1fr_100px] gap-2", children: [
138
+ /* @__PURE__ */ jsx(
139
+ Input,
140
+ {
141
+ value: draft.name,
142
+ onChange: (e) => draft.setName(e.target.value),
143
+ placeholder: "Collection name",
144
+ className: "h-9 text-sm"
145
+ }
146
+ ),
147
+ /* @__PURE__ */ jsx(
148
+ Input,
149
+ {
150
+ value: draft.symbol,
151
+ onChange: (e) => draft.setSymbol(e.target.value.toUpperCase()),
152
+ placeholder: "SYMBOL",
153
+ className: "h-9 text-sm"
154
+ }
155
+ )
156
+ ] }),
157
+ /* @__PURE__ */ jsx(
158
+ Textarea,
159
+ {
160
+ value: draft.description,
161
+ onChange: (e) => draft.setDescription(e.target.value),
162
+ placeholder: "Describe this collection\u2026",
163
+ rows: 2,
164
+ className: "text-sm resize-none"
165
+ }
166
+ ),
167
+ /* @__PURE__ */ jsx("p", { className: "text-2xs text-muted-foreground", children: "Prefilled from your asset \u2014 edit anything above." })
168
+ ] })
169
+ ] })
170
+ ] });
171
+ }
172
+ export {
173
+ CollectionPicker,
174
+ CollectionSection
175
+ };
176
+ //# sourceMappingURL=collection-section.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/fast-mint/collection-section.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport Image from \"next/image\";\nimport type { ApiCollection } from \"@medialane/sdk\";\nimport { Boxes, Check, ChevronDown, Plus } from \"lucide-react\";\nimport { Input } from \"../input.js\";\nimport { Textarea } from \"../textarea.js\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../popover.js\";\nimport { cn } from \"../../utils/cn.js\";\nimport { useImageUrl } from \"../../utils/use-image-url.js\";\nimport { collectionKey, type MintAssetType } from \"./mintable-collections.js\";\nimport type { useNewCollectionDraft } from \"./use-new-collection-draft.js\";\n\nfunction collectionDisplayLabel(col: ApiCollection) {\n return col.name || col.symbol || `Collection #${col.collectionId}`;\n}\n\nfunction CollectionThumb({ image }: { image: string | null | undefined }) {\n const resolveImage = useImageUrl();\n const imageUrl = resolveImage(image);\n return (\n <div className=\"relative h-10 w-10 rounded-lg overflow-hidden bg-muted shrink-0\">\n {imageUrl ? (\n <Image src={imageUrl} alt=\"\" fill className=\"object-cover\" unoptimized />\n ) : (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <Boxes className=\"h-4 w-4 text-muted-foreground/40\" />\n </div>\n )}\n </div>\n );\n}\n\nexport function CollectionPicker({\n collections, value, onChange, valueOf,\n}: {\n collections: ApiCollection[];\n value: string;\n onChange: (id: string) => void;\n valueOf: (c: ApiCollection) => string | null | undefined;\n}) {\n const [open, setOpen] = useState(false);\n const selected = value\n ? collections.find((c) => valueOf(c) === value) ?? null\n : null;\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-expanded={open}\n className=\"flex w-full items-center gap-3 rounded-xl border border-border p-3 text-left transition-colors hover:bg-muted/40\"\n >\n <CollectionThumb image={selected?.image} />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-semibold truncate\">\n {selected ? collectionDisplayLabel(selected) : collections.length ? \"Choose a collection\" : \"No collections yet\"}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {selected ? `${selected.totalSupply ?? 0} work${selected.totalSupply === 1 ? \"\" : \"s\"}` : \"Where this work will live\"}\n </p>\n </div>\n <ChevronDown className=\"h-3.5 w-3.5 text-muted-foreground shrink-0\" />\n </button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[var(--radix-popover-trigger-width)] p-0\" align=\"start\">\n <div className=\"max-h-64 overflow-y-auto p-1\">\n {collections.length === 0 ? (\n <p className=\"px-3 py-4 text-center text-sm text-muted-foreground\">No collections yet — create one instead.</p>\n ) : (\n collections.map((col) => {\n const id = valueOf(col);\n const isSelected = !!id && value === id;\n return (\n <button\n key={id ?? col.contractAddress ?? col.name}\n type=\"button\"\n disabled={!id}\n onClick={() => { if (!id) return; onChange(id); setOpen(false); }}\n className=\"flex w-full items-center gap-2.5 rounded-lg px-2 py-2 text-left transition-colors hover:bg-muted/60\"\n >\n <CollectionThumb image={col.image} />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium truncate\">{collectionDisplayLabel(col)}</p>\n <p className=\"text-xs text-muted-foreground\">{col.totalSupply ?? 0} work{col.totalSupply === 1 ? \"\" : \"s\"}</p>\n </div>\n {isSelected && <Check className=\"h-4 w-4 text-brand-blue shrink-0\" />}\n </button>\n );\n })\n )}\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n\n\nexport type CollectionMode = \"existing\" | \"new\";\n\nexport function CollectionSection({\n assetType, mode, onModeChange, collections, existingId, existingContract, onExistingId, onExistingContract, draft, previewImage,\n}: {\n assetType: MintAssetType;\n mode: CollectionMode;\n onModeChange: (mode: CollectionMode) => void;\n collections: ApiCollection[];\n existingId: string;\n existingContract: string;\n onExistingId: (id: string) => void;\n onExistingContract: (contract: string) => void;\n draft: ReturnType<typeof useNewCollectionDraft>;\n previewImage: string | null;\n}) {\n const single = assetType === \"single\";\n return (\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <label className=\"text-sm font-medium flex items-center gap-1.5\">\n <Boxes className=\"h-4 w-4\" />\n Collection *\n </label>\n <div className=\"flex rounded-lg border border-border overflow-hidden\">\n <button\n type=\"button\"\n onClick={() => onModeChange(\"existing\")}\n className={cn(\"px-3 h-7 text-xs font-medium transition-colors\",\n mode === \"existing\" ? \"bg-primary text-primary-foreground\" : \"bg-background hover:bg-muted text-muted-foreground\")}\n >\n Existing\n </button>\n <button\n type=\"button\"\n onClick={() => onModeChange(\"new\")}\n className={cn(\"px-3 h-7 text-xs font-medium border-l border-border transition-colors flex items-center gap-1\",\n mode === \"new\" ? \"bg-primary text-primary-foreground\" : \"bg-background hover:bg-muted text-muted-foreground\")}\n >\n <Plus className=\"h-3 w-3\" />New\n </button>\n </div>\n </div>\n\n {mode === \"existing\" ? (\n <CollectionPicker\n collections={collections}\n value={single ? existingId : existingContract}\n onChange={single ? onExistingId : onExistingContract}\n valueOf={collectionKey(assetType)}\n />\n ) : (\n <div className=\"flex gap-3 rounded-xl border border-border p-3\">\n <div className=\"relative h-16 w-16 rounded-lg overflow-hidden bg-muted shrink-0\">\n {previewImage ? (\n <Image src={previewImage} alt=\"\" fill className=\"object-cover\" unoptimized />\n ) : (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <Boxes className=\"h-5 w-5 text-muted-foreground/40\" />\n </div>\n )}\n </div>\n <div className=\"min-w-0 flex-1 space-y-2\">\n <div className=\"grid grid-cols-[1fr_100px] gap-2\">\n <Input\n value={draft.name}\n onChange={(e) => draft.setName(e.target.value)}\n placeholder=\"Collection name\"\n className=\"h-9 text-sm\"\n />\n <Input\n value={draft.symbol}\n onChange={(e) => draft.setSymbol(e.target.value.toUpperCase())}\n placeholder=\"SYMBOL\"\n className=\"h-9 text-sm\"\n />\n </div>\n <Textarea\n value={draft.description}\n onChange={(e) => draft.setDescription(e.target.value)}\n placeholder=\"Describe this collection…\"\n rows={2}\n className=\"text-sm resize-none\"\n />\n <p className=\"text-2xs text-muted-foreground\">Prefilled from your asset — edit anything above.</p>\n </div>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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","names":[]}