@medialane/ui 0.105.0 → 0.106.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/asset-lightbox.cjs +66 -0
- package/dist/components/asset-lightbox.cjs.map +1 -0
- package/dist/components/asset-lightbox.d.cts +11 -0
- package/dist/components/asset-lightbox.d.ts +11 -0
- package/dist/components/asset-lightbox.js +42 -0
- package/dist/components/asset-lightbox.js.map +1 -0
- package/dist/components/club-owner-actions.cjs +56 -0
- package/dist/components/club-owner-actions.cjs.map +1 -0
- package/dist/components/club-owner-actions.d.cts +11 -0
- package/dist/components/club-owner-actions.d.ts +11 -0
- package/dist/components/club-owner-actions.js +22 -0
- package/dist/components/club-owner-actions.js.map +1 -0
- package/dist/components/create-form-primitives.cjs +61 -0
- package/dist/components/create-form-primitives.cjs.map +1 -0
- package/dist/components/create-form-primitives.d.cts +16 -0
- package/dist/components/create-form-primitives.d.ts +16 -0
- package/dist/components/create-form-primitives.js +36 -0
- package/dist/components/create-form-primitives.js.map +1 -0
- package/dist/components/creation-record.cjs +86 -0
- package/dist/components/creation-record.cjs.map +1 -0
- package/dist/components/creation-record.d.cts +14 -0
- package/dist/components/creation-record.d.ts +14 -0
- package/dist/components/creation-record.js +52 -0
- package/dist/components/creation-record.js.map +1 -0
- package/dist/components/dialog.d.cts +9 -9
- package/dist/components/dialog.d.ts +9 -9
- package/dist/components/ip-type-fields.cjs +307 -0
- package/dist/components/ip-type-fields.cjs.map +1 -0
- package/dist/components/ip-type-fields.d.cts +17 -0
- package/dist/components/ip-type-fields.d.ts +17 -0
- package/dist/components/ip-type-fields.js +293 -0
- package/dist/components/ip-type-fields.js.map +1 -0
- package/dist/components/json-ld.cjs +39 -0
- package/dist/components/json-ld.cjs.map +1 -0
- package/dist/components/json-ld.d.cts +8 -0
- package/dist/components/json-ld.d.ts +8 -0
- package/dist/components/json-ld.js +15 -0
- package/dist/components/json-ld.js.map +1 -0
- package/dist/components/nav-theme-toggle.cjs +66 -0
- package/dist/components/nav-theme-toggle.cjs.map +1 -0
- package/dist/components/nav-theme-toggle.d.cts +9 -0
- package/dist/components/nav-theme-toggle.d.ts +9 -0
- package/dist/components/nav-theme-toggle.js +42 -0
- package/dist/components/nav-theme-toggle.js.map +1 -0
- package/dist/components/order-sort-control.cjs +58 -0
- package/dist/components/order-sort-control.cjs.map +1 -0
- package/dist/components/order-sort-control.d.cts +13 -0
- package/dist/components/order-sort-control.d.ts +13 -0
- package/dist/components/order-sort-control.js +39 -0
- package/dist/components/order-sort-control.js.map +1 -0
- package/dist/components/price-history-chart.cjs +130 -0
- package/dist/components/price-history-chart.cjs.map +1 -0
- package/dist/components/price-history-chart.d.cts +9 -0
- package/dist/components/price-history-chart.d.ts +9 -0
- package/dist/components/price-history-chart.js +114 -0
- package/dist/components/price-history-chart.js.map +1 -0
- package/dist/components/sheet.cjs +160 -0
- package/dist/components/sheet.cjs.map +1 -0
- package/dist/components/sheet.d.cts +30 -0
- package/dist/components/sheet.d.ts +30 -0
- package/dist/components/sheet.js +117 -0
- package/dist/components/sheet.js.map +1 -0
- package/dist/components/textarea.cjs +57 -0
- package/dist/components/textarea.cjs.map +1 -0
- package/dist/components/textarea.d.cts +6 -0
- package/dist/components/textarea.d.ts +6 -0
- package/dist/components/textarea.js +23 -0
- package/dist/components/textarea.js.map +1 -0
- package/dist/index.cjs +67 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +14 -1
- package/dist/index.d.ts +14 -1
- package/dist/index.js +56 -0
- package/dist/index.js.map +1 -1
- package/dist/utils/format-activity.cjs +143 -0
- package/dist/utils/format-activity.cjs.map +1 -0
- package/dist/utils/format-activity.d.cts +14 -0
- package/dist/utils/format-activity.d.ts +14 -0
- package/dist/utils/format-activity.js +116 -0
- package/dist/utils/format-activity.js.map +1 -0
- package/dist/utils/proxy-body.cjs +60 -0
- package/dist/utils/proxy-body.cjs.map +1 -0
- package/dist/utils/proxy-body.d.cts +22 -0
- package/dist/utils/proxy-body.d.ts +22 -0
- package/dist/utils/proxy-body.js +36 -0
- package/dist/utils/proxy-body.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
import * as React from 'react';
|
|
3
|
-
import * as
|
|
3
|
+
import * as SheetPrimitive from '@radix-ui/react-dialog';
|
|
4
4
|
|
|
5
|
-
declare const Dialog: React.FC<
|
|
6
|
-
declare const DialogTrigger: React.ForwardRefExoticComponent<
|
|
7
|
-
declare const DialogPortal: React.FC<
|
|
8
|
-
declare const DialogClose: React.ForwardRefExoticComponent<
|
|
9
|
-
declare const DialogOverlay: React.ForwardRefExoticComponent<Omit<
|
|
10
|
-
interface DialogContentProps extends React.ComponentPropsWithoutRef<typeof
|
|
5
|
+
declare const Dialog: React.FC<SheetPrimitive.DialogProps>;
|
|
6
|
+
declare const DialogTrigger: React.ForwardRefExoticComponent<SheetPrimitive.DialogTriggerProps & React.RefAttributes<HTMLButtonElement>>;
|
|
7
|
+
declare const DialogPortal: React.FC<SheetPrimitive.DialogPortalProps>;
|
|
8
|
+
declare const DialogClose: React.ForwardRefExoticComponent<SheetPrimitive.DialogCloseProps & React.RefAttributes<HTMLButtonElement>>;
|
|
9
|
+
declare const DialogOverlay: React.ForwardRefExoticComponent<Omit<SheetPrimitive.DialogOverlayProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
10
|
+
interface DialogContentProps extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content> {
|
|
11
11
|
hideClose?: boolean;
|
|
12
12
|
}
|
|
13
13
|
declare const DialogContent: React.ForwardRefExoticComponent<DialogContentProps & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -19,7 +19,7 @@ declare const DialogFooter: {
|
|
|
19
19
|
({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): react_jsx_runtime.JSX.Element;
|
|
20
20
|
displayName: string;
|
|
21
21
|
};
|
|
22
|
-
declare const DialogTitle: React.ForwardRefExoticComponent<Omit<
|
|
23
|
-
declare const DialogDescription: React.ForwardRefExoticComponent<Omit<
|
|
22
|
+
declare const DialogTitle: React.ForwardRefExoticComponent<Omit<SheetPrimitive.DialogTitleProps & React.RefAttributes<HTMLHeadingElement>, "ref"> & React.RefAttributes<HTMLHeadingElement>>;
|
|
23
|
+
declare const DialogDescription: React.ForwardRefExoticComponent<Omit<SheetPrimitive.DialogDescriptionProps & React.RefAttributes<HTMLParagraphElement>, "ref"> & React.RefAttributes<HTMLParagraphElement>>;
|
|
24
24
|
|
|
25
25
|
export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger };
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
import * as React from 'react';
|
|
3
|
-
import * as
|
|
3
|
+
import * as SheetPrimitive from '@radix-ui/react-dialog';
|
|
4
4
|
|
|
5
|
-
declare const Dialog: React.FC<
|
|
6
|
-
declare const DialogTrigger: React.ForwardRefExoticComponent<
|
|
7
|
-
declare const DialogPortal: React.FC<
|
|
8
|
-
declare const DialogClose: React.ForwardRefExoticComponent<
|
|
9
|
-
declare const DialogOverlay: React.ForwardRefExoticComponent<Omit<
|
|
10
|
-
interface DialogContentProps extends React.ComponentPropsWithoutRef<typeof
|
|
5
|
+
declare const Dialog: React.FC<SheetPrimitive.DialogProps>;
|
|
6
|
+
declare const DialogTrigger: React.ForwardRefExoticComponent<SheetPrimitive.DialogTriggerProps & React.RefAttributes<HTMLButtonElement>>;
|
|
7
|
+
declare const DialogPortal: React.FC<SheetPrimitive.DialogPortalProps>;
|
|
8
|
+
declare const DialogClose: React.ForwardRefExoticComponent<SheetPrimitive.DialogCloseProps & React.RefAttributes<HTMLButtonElement>>;
|
|
9
|
+
declare const DialogOverlay: React.ForwardRefExoticComponent<Omit<SheetPrimitive.DialogOverlayProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
10
|
+
interface DialogContentProps extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content> {
|
|
11
11
|
hideClose?: boolean;
|
|
12
12
|
}
|
|
13
13
|
declare const DialogContent: React.ForwardRefExoticComponent<DialogContentProps & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -19,7 +19,7 @@ declare const DialogFooter: {
|
|
|
19
19
|
({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): react_jsx_runtime.JSX.Element;
|
|
20
20
|
displayName: string;
|
|
21
21
|
};
|
|
22
|
-
declare const DialogTitle: React.ForwardRefExoticComponent<Omit<
|
|
23
|
-
declare const DialogDescription: React.ForwardRefExoticComponent<Omit<
|
|
22
|
+
declare const DialogTitle: React.ForwardRefExoticComponent<Omit<SheetPrimitive.DialogTitleProps & React.RefAttributes<HTMLHeadingElement>, "ref"> & React.RefAttributes<HTMLHeadingElement>>;
|
|
23
|
+
declare const DialogDescription: React.ForwardRefExoticComponent<Omit<SheetPrimitive.DialogDescriptionProps & React.RefAttributes<HTMLParagraphElement>, "ref"> & React.RefAttributes<HTMLParagraphElement>>;
|
|
24
24
|
|
|
25
25
|
export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger };
|
|
@@ -0,0 +1,307 @@
|
|
|
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 ip_type_fields_exports = {};
|
|
21
|
+
__export(ip_type_fields_exports, {
|
|
22
|
+
IPTypeFields: () => IPTypeFields
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(ip_type_fields_exports);
|
|
25
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
26
|
+
var import_react = require("react");
|
|
27
|
+
var import_ip_templates = require("../data/ip-templates.js");
|
|
28
|
+
var import_label = require("./label.js");
|
|
29
|
+
var import_input = require("./input.js");
|
|
30
|
+
var import_button = require("./button.js");
|
|
31
|
+
var import_select = require("./select.js");
|
|
32
|
+
var import_lucide_react = require("lucide-react");
|
|
33
|
+
const createId = () => globalThis.crypto?.randomUUID?.() ?? `trait-${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
|
34
|
+
const looksLikeUrl = (v) => /^https?:\/\/\S+/i.test(v.trim());
|
|
35
|
+
function IPTypeFields({ ipType, onChange, uploadDocument }) {
|
|
36
|
+
const template = ipType ? import_ip_templates.IP_TEMPLATES[ipType] : null;
|
|
37
|
+
const [embedValues, setEmbedValues] = (0, import_react.useState)({});
|
|
38
|
+
const [socialValues, setSocialValues] = (0, import_react.useState)({});
|
|
39
|
+
const [traits, setTraits] = (0, import_react.useState)([]);
|
|
40
|
+
const [docUri, setDocUri] = (0, import_react.useState)(null);
|
|
41
|
+
const [docName, setDocName] = (0, import_react.useState)(null);
|
|
42
|
+
const [docUploading, setDocUploading] = (0, import_react.useState)(false);
|
|
43
|
+
const [docError, setDocError] = (0, import_react.useState)(null);
|
|
44
|
+
const docInputRef = (0, import_react.useRef)(null);
|
|
45
|
+
(0, import_react.useEffect)(() => {
|
|
46
|
+
setEmbedValues({});
|
|
47
|
+
setSocialValues({});
|
|
48
|
+
setDocUri(null);
|
|
49
|
+
setDocName(null);
|
|
50
|
+
setDocError(null);
|
|
51
|
+
}, [ipType]);
|
|
52
|
+
const docTraitType = template?.docUpload?.traitType ?? null;
|
|
53
|
+
const metadataFields = (0, import_react.useMemo)(() => {
|
|
54
|
+
const fields = [];
|
|
55
|
+
const seen = /* @__PURE__ */ new Set();
|
|
56
|
+
const add = (traitType, value) => {
|
|
57
|
+
const t = traitType.trim();
|
|
58
|
+
const v = value.trim();
|
|
59
|
+
const k = t.toLowerCase();
|
|
60
|
+
if (!t || !v || seen.has(k)) return;
|
|
61
|
+
seen.add(k);
|
|
62
|
+
fields.push({ traitType: t, value: v });
|
|
63
|
+
};
|
|
64
|
+
if (docTraitType && docUri) add(docTraitType, docUri);
|
|
65
|
+
Object.entries(embedValues).forEach(([key, value]) => add(key, value));
|
|
66
|
+
Object.entries(socialValues).forEach(([key, value]) => add(key, value));
|
|
67
|
+
traits.forEach((row) => add(row.key, row.value));
|
|
68
|
+
return fields;
|
|
69
|
+
}, [embedValues, socialValues, traits, docTraitType, docUri]);
|
|
70
|
+
(0, import_react.useEffect)(() => {
|
|
71
|
+
onChange(metadataFields);
|
|
72
|
+
}, [metadataFields, onChange]);
|
|
73
|
+
const addedKeys = (0, import_react.useMemo)(
|
|
74
|
+
() => new Set(traits.map((t) => t.key.trim().toLowerCase())),
|
|
75
|
+
[traits]
|
|
76
|
+
);
|
|
77
|
+
const addSuggestion = (s) => {
|
|
78
|
+
setTraits((cur) => [
|
|
79
|
+
...cur,
|
|
80
|
+
{ id: createId(), key: s.key, value: "", options: s.options }
|
|
81
|
+
]);
|
|
82
|
+
};
|
|
83
|
+
const addCustomTrait = () => setTraits((cur) => [...cur, { id: createId(), key: "", value: "" }]);
|
|
84
|
+
const updateTrait = (id, patch) => setTraits((cur) => cur.map((t) => t.id === id ? { ...t, ...patch } : t));
|
|
85
|
+
const removeTrait = (id) => setTraits((cur) => cur.filter((t) => t.id !== id));
|
|
86
|
+
if (!template) return null;
|
|
87
|
+
const Icon = template.icon;
|
|
88
|
+
const docUpload = template.docUpload;
|
|
89
|
+
const handleDocPick = async (file) => {
|
|
90
|
+
if (!uploadDocument || !docUpload) return;
|
|
91
|
+
if (file.size > docUpload.maxMb * 1024 * 1024) {
|
|
92
|
+
setDocError(`File must be under ${docUpload.maxMb} MB`);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
setDocError(null);
|
|
96
|
+
setDocUploading(true);
|
|
97
|
+
try {
|
|
98
|
+
const uri = await uploadDocument(file);
|
|
99
|
+
setDocUri(uri);
|
|
100
|
+
setDocName(file.name);
|
|
101
|
+
} catch (err) {
|
|
102
|
+
setDocError(err instanceof Error ? err.message : "Document upload failed");
|
|
103
|
+
} finally {
|
|
104
|
+
setDocUploading(false);
|
|
105
|
+
if (docInputRef.current) docInputRef.current.value = "";
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
const clearDoc = () => {
|
|
109
|
+
setDocUri(null);
|
|
110
|
+
setDocName(null);
|
|
111
|
+
setDocError(null);
|
|
112
|
+
};
|
|
113
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-5", children: [
|
|
114
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
115
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Icon, { className: `h-4 w-4 ${template.color.text}` }),
|
|
116
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", { className: "text-sm font-semibold", children: [
|
|
117
|
+
template.label,
|
|
118
|
+
" Details"
|
|
119
|
+
] })
|
|
120
|
+
] }),
|
|
121
|
+
docUpload && uploadDocument && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { className: "space-y-2", children: [
|
|
122
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-[11px] font-semibold text-muted-foreground", children: "Document" }),
|
|
123
|
+
docUri ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-3 rounded-xl border border-emerald-500/30 bg-emerald-500/5 px-4 py-3", children: [
|
|
124
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.FileText, { className: "h-5 w-5 text-emerald-500 shrink-0" }),
|
|
125
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "min-w-0 flex-1", children: [
|
|
126
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm font-medium truncate", children: docName }),
|
|
127
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-xs text-muted-foreground truncate", children: docUri })
|
|
128
|
+
] }),
|
|
129
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
130
|
+
import_button.Button,
|
|
131
|
+
{
|
|
132
|
+
type: "button",
|
|
133
|
+
variant: "ghost",
|
|
134
|
+
size: "icon",
|
|
135
|
+
className: "h-8 w-8 shrink-0 text-muted-foreground hover:text-destructive",
|
|
136
|
+
onClick: clearDoc,
|
|
137
|
+
"aria-label": "Remove document",
|
|
138
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.X, { className: "h-4 w-4" })
|
|
139
|
+
}
|
|
140
|
+
)
|
|
141
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-1.5", children: [
|
|
142
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
143
|
+
"input",
|
|
144
|
+
{
|
|
145
|
+
ref: docInputRef,
|
|
146
|
+
type: "file",
|
|
147
|
+
accept: docUpload.accept,
|
|
148
|
+
className: "hidden",
|
|
149
|
+
onChange: (e) => {
|
|
150
|
+
const f = e.target.files?.[0];
|
|
151
|
+
if (f) void handleDocPick(f);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
),
|
|
155
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
156
|
+
import_button.Button,
|
|
157
|
+
{
|
|
158
|
+
type: "button",
|
|
159
|
+
variant: "outline",
|
|
160
|
+
size: "sm",
|
|
161
|
+
disabled: docUploading,
|
|
162
|
+
onClick: () => docInputRef.current?.click(),
|
|
163
|
+
children: docUploading ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
164
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Loader2, { className: "mr-1.5 h-3.5 w-3.5 animate-spin" }),
|
|
165
|
+
"Uploading\u2026"
|
|
166
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
167
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.FileUp, { className: "mr-1.5 h-3.5 w-3.5" }),
|
|
168
|
+
"Upload document"
|
|
169
|
+
] })
|
|
170
|
+
}
|
|
171
|
+
),
|
|
172
|
+
docError && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-xs text-destructive", children: docError }),
|
|
173
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-xs text-muted-foreground leading-relaxed", children: docUpload.hint })
|
|
174
|
+
] })
|
|
175
|
+
] }),
|
|
176
|
+
template.embeds && template.embeds.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { className: "space-y-3", children: [
|
|
177
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-[11px] font-semibold text-muted-foreground", children: "Embeds" }),
|
|
178
|
+
template.embeds.map((platform) => {
|
|
179
|
+
const meta = import_ip_templates.EMBED_PLATFORM_META[platform];
|
|
180
|
+
const PIcon = meta.icon;
|
|
181
|
+
const value = embedValues[meta.traitKey] ?? "";
|
|
182
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-1.5", children: [
|
|
183
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_label.Label, { className: "flex items-center gap-1.5 text-xs text-muted-foreground", children: [
|
|
184
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(PIcon, { className: "h-3.5 w-3.5" }),
|
|
185
|
+
meta.label,
|
|
186
|
+
looksLikeUrl(value) && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "ml-1 inline-flex items-center gap-0.5 text-[10px] font-medium text-emerald-400", children: [
|
|
187
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Check, { className: "h-3 w-3" }),
|
|
188
|
+
" connected"
|
|
189
|
+
] })
|
|
190
|
+
] }),
|
|
191
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
192
|
+
import_input.Input,
|
|
193
|
+
{
|
|
194
|
+
type: "url",
|
|
195
|
+
inputMode: "url",
|
|
196
|
+
placeholder: meta.placeholder,
|
|
197
|
+
value,
|
|
198
|
+
onChange: (e) => setEmbedValues((cur) => ({ ...cur, [meta.traitKey]: e.target.value })),
|
|
199
|
+
className: "h-10 text-sm"
|
|
200
|
+
}
|
|
201
|
+
)
|
|
202
|
+
] }, platform);
|
|
203
|
+
})
|
|
204
|
+
] }),
|
|
205
|
+
template.socials && template.socials.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { className: "space-y-3", children: [
|
|
206
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-[11px] font-semibold text-muted-foreground", children: "Social links" }),
|
|
207
|
+
template.socials.map((platform) => {
|
|
208
|
+
const meta = import_ip_templates.SOCIAL_PLATFORM_META[platform];
|
|
209
|
+
const PIcon = meta.icon;
|
|
210
|
+
const value = socialValues[meta.traitKey] ?? "";
|
|
211
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-1.5", children: [
|
|
212
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_label.Label, { className: "flex items-center gap-1.5 text-xs text-muted-foreground", children: [
|
|
213
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(PIcon, { className: "h-3.5 w-3.5" }),
|
|
214
|
+
meta.label
|
|
215
|
+
] }),
|
|
216
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
217
|
+
import_input.Input,
|
|
218
|
+
{
|
|
219
|
+
type: "url",
|
|
220
|
+
inputMode: "url",
|
|
221
|
+
placeholder: meta.placeholder,
|
|
222
|
+
value,
|
|
223
|
+
onChange: (e) => setSocialValues((cur) => ({ ...cur, [meta.traitKey]: e.target.value })),
|
|
224
|
+
className: "h-10 text-sm"
|
|
225
|
+
}
|
|
226
|
+
)
|
|
227
|
+
] }, platform);
|
|
228
|
+
})
|
|
229
|
+
] }),
|
|
230
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { className: "space-y-3 border-t border-border/60 pt-4", children: [
|
|
231
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm font-semibold", children: "Traits" }),
|
|
232
|
+
template.traitSuggestions && template.traitSuggestions.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex flex-wrap gap-2", children: template.traitSuggestions.filter((s) => !addedKeys.has(s.key.toLowerCase())).map((s) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
233
|
+
"button",
|
|
234
|
+
{
|
|
235
|
+
type: "button",
|
|
236
|
+
onClick: () => addSuggestion(s),
|
|
237
|
+
className: "inline-flex items-center gap-1 rounded-full border border-border bg-muted/40 px-3 py-1 text-xs font-medium text-muted-foreground transition-colors hover:border-primary/40 hover:text-foreground",
|
|
238
|
+
children: [
|
|
239
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Plus, { className: "h-3 w-3" }),
|
|
240
|
+
s.key
|
|
241
|
+
]
|
|
242
|
+
},
|
|
243
|
+
s.key
|
|
244
|
+
)) }),
|
|
245
|
+
traits.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "space-y-2", children: traits.map((row) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
246
|
+
"div",
|
|
247
|
+
{
|
|
248
|
+
className: "grid grid-cols-[1fr_1fr_auto] items-center gap-2",
|
|
249
|
+
children: [
|
|
250
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
251
|
+
import_input.Input,
|
|
252
|
+
{
|
|
253
|
+
value: row.key,
|
|
254
|
+
onChange: (e) => updateTrait(row.id, { key: e.target.value }),
|
|
255
|
+
placeholder: "Trait name",
|
|
256
|
+
className: "h-9 text-sm",
|
|
257
|
+
maxLength: 64
|
|
258
|
+
}
|
|
259
|
+
),
|
|
260
|
+
row.options ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
261
|
+
import_select.Select,
|
|
262
|
+
{
|
|
263
|
+
value: row.value,
|
|
264
|
+
onValueChange: (v) => updateTrait(row.id, { value: v }),
|
|
265
|
+
children: [
|
|
266
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_select.SelectTrigger, { className: "h-9 text-sm", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_select.SelectValue, { placeholder: "Value" }) }),
|
|
267
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_select.SelectContent, { children: row.options.map((opt) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_select.SelectItem, { value: opt, children: opt }, opt)) })
|
|
268
|
+
]
|
|
269
|
+
}
|
|
270
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
271
|
+
import_input.Input,
|
|
272
|
+
{
|
|
273
|
+
value: row.value,
|
|
274
|
+
onChange: (e) => updateTrait(row.id, { value: e.target.value }),
|
|
275
|
+
placeholder: "Value",
|
|
276
|
+
className: "h-9 text-sm",
|
|
277
|
+
maxLength: 512
|
|
278
|
+
}
|
|
279
|
+
),
|
|
280
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
281
|
+
import_button.Button,
|
|
282
|
+
{
|
|
283
|
+
type: "button",
|
|
284
|
+
variant: "ghost",
|
|
285
|
+
size: "icon",
|
|
286
|
+
className: "h-9 w-9 shrink-0 text-muted-foreground hover:text-destructive",
|
|
287
|
+
onClick: () => removeTrait(row.id),
|
|
288
|
+
"aria-label": "Remove trait",
|
|
289
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Trash2, { className: "h-4 w-4" })
|
|
290
|
+
}
|
|
291
|
+
)
|
|
292
|
+
]
|
|
293
|
+
},
|
|
294
|
+
row.id
|
|
295
|
+
)) }),
|
|
296
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_button.Button, { type: "button", variant: "outline", size: "sm", onClick: addCustomTrait, children: [
|
|
297
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Plus, { className: "mr-1.5 h-3.5 w-3.5" }),
|
|
298
|
+
"Add custom trait"
|
|
299
|
+
] })
|
|
300
|
+
] })
|
|
301
|
+
] });
|
|
302
|
+
}
|
|
303
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
304
|
+
0 && (module.exports = {
|
|
305
|
+
IPTypeFields
|
|
306
|
+
});
|
|
307
|
+
//# sourceMappingURL=ip-type-fields.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/ip-type-fields.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport type { IPType } from \"../data/ip.js\";\nimport {\n IP_TEMPLATES,\n EMBED_PLATFORM_META,\n SOCIAL_PLATFORM_META,\n type TraitSuggestion,\n} from \"../data/ip-templates.js\";\nimport { Label } from \"./label.js\";\nimport { Input } from \"./input.js\";\nimport { Button } from \"./button.js\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"./select.js\";\nimport { Check, FileText, FileUp, Loader2, Plus, Trash2, X } from \"lucide-react\";\n\nexport type MetadataField = {\n traitType: string;\n value: string;\n};\n\ntype TraitRow = {\n id: string;\n key: string;\n value: string;\n options?: string[];\n};\n\nconst createId = () =>\n globalThis.crypto?.randomUUID?.() ?? `trait-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\nconst looksLikeUrl = (v: string) => /^https?:\\/\\/\\S+/i.test(v.trim());\n\nexport interface IPTypeFieldsProps {\n ipType: IPType | null;\n onChange: (fields: MetadataField[]) => void;\n /** Uploads a document file to IPFS, resolving to its ipfs:// URI.\n * Enables the document upload field for types with template.docUpload. */\n uploadDocument?: (file: File) => Promise<string>;\n}\n\nexport function IPTypeFields({ ipType, onChange, uploadDocument }: IPTypeFieldsProps) {\n const template = ipType ? IP_TEMPLATES[ipType] : null;\n\n // URL inputs keyed by their stored trait_type (e.g. \"Spotify URL\", \"X\").\n const [embedValues, setEmbedValues] = useState<Record<string, string>>({});\n const [socialValues, setSocialValues] = useState<Record<string, string>>({});\n // One unified, ordered list of traits (suggestions pre-fill rows; custom = blank).\n const [traits, setTraits] = useState<TraitRow[]>([]);\n // Document pinned to IPFS (Documents / Patents / Publications / Software).\n const [docUri, setDocUri] = useState<string | null>(null);\n const [docName, setDocName] = useState<string | null>(null);\n const [docUploading, setDocUploading] = useState(false);\n const [docError, setDocError] = useState<string | null>(null);\n const docInputRef = useRef<HTMLInputElement>(null);\n\n // Embeds, socials & document are type-specific — reset them when the IP type\n // changes. Trait rows are generic key/value and persist across type switches.\n useEffect(() => {\n setEmbedValues({});\n setSocialValues({});\n setDocUri(null);\n setDocName(null);\n setDocError(null);\n }, [ipType]);\n\n const docTraitType = template?.docUpload?.traitType ?? null;\n\n const metadataFields = useMemo(() => {\n const fields: MetadataField[] = [];\n const seen = new Set<string>();\n const add = (traitType: string, value: string) => {\n const t = traitType.trim();\n const v = value.trim();\n const k = t.toLowerCase();\n if (!t || !v || seen.has(k)) return;\n seen.add(k);\n fields.push({ traitType: t, value: v });\n };\n if (docTraitType && docUri) add(docTraitType, docUri);\n Object.entries(embedValues).forEach(([key, value]) => add(key, value));\n Object.entries(socialValues).forEach(([key, value]) => add(key, value));\n traits.forEach((row) => add(row.key, row.value));\n return fields;\n }, [embedValues, socialValues, traits, docTraitType, docUri]);\n\n useEffect(() => {\n onChange(metadataFields);\n }, [metadataFields, onChange]);\n\n const addedKeys = useMemo(\n () => new Set(traits.map((t) => t.key.trim().toLowerCase())),\n [traits]\n );\n\n const addSuggestion = (s: TraitSuggestion) => {\n setTraits((cur) => [\n ...cur,\n { id: createId(), key: s.key, value: \"\", options: s.options },\n ]);\n };\n const addCustomTrait = () =>\n setTraits((cur) => [...cur, { id: createId(), key: \"\", value: \"\" }]);\n const updateTrait = (id: string, patch: Partial<TraitRow>) =>\n setTraits((cur) => cur.map((t) => (t.id === id ? { ...t, ...patch } : t)));\n const removeTrait = (id: string) =>\n setTraits((cur) => cur.filter((t) => t.id !== id));\n\n if (!template) return null;\n\n const Icon = template.icon;\n const docUpload = template.docUpload;\n\n const handleDocPick = async (file: File) => {\n if (!uploadDocument || !docUpload) return;\n if (file.size > docUpload.maxMb * 1024 * 1024) {\n setDocError(`File must be under ${docUpload.maxMb} MB`);\n return;\n }\n setDocError(null);\n setDocUploading(true);\n try {\n const uri = await uploadDocument(file);\n setDocUri(uri);\n setDocName(file.name);\n } catch (err) {\n setDocError(err instanceof Error ? err.message : \"Document upload failed\");\n } finally {\n setDocUploading(false);\n if (docInputRef.current) docInputRef.current.value = \"\";\n }\n };\n\n const clearDoc = () => {\n setDocUri(null);\n setDocName(null);\n setDocError(null);\n };\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2\">\n <Icon className={`h-4 w-4 ${template.color.text}`} />\n <p className=\"text-sm font-semibold\">{template.label} Details</p>\n </div>\n\n {/* ── Document file → IPFS (Documents / Patents / Publications / Software) ── */}\n {docUpload && uploadDocument && (\n <section className=\"space-y-2\">\n <p className=\"text-[11px] font-semibold text-muted-foreground\">\n Document\n </p>\n {docUri ? (\n <div className=\"flex items-center gap-3 rounded-xl border border-emerald-500/30 bg-emerald-500/5 px-4 py-3\">\n <FileText className=\"h-5 w-5 text-emerald-500 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium truncate\">{docName}</p>\n <p className=\"text-xs text-muted-foreground truncate\">{docUri}</p>\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0 text-muted-foreground hover:text-destructive\"\n onClick={clearDoc}\n aria-label=\"Remove document\"\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n ) : (\n <div className=\"space-y-1.5\">\n <input\n ref={docInputRef}\n type=\"file\"\n accept={docUpload.accept}\n className=\"hidden\"\n onChange={(e) => {\n const f = e.target.files?.[0];\n if (f) void handleDocPick(f);\n }}\n />\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n disabled={docUploading}\n onClick={() => docInputRef.current?.click()}\n >\n {docUploading ? (\n <>\n <Loader2 className=\"mr-1.5 h-3.5 w-3.5 animate-spin\" />\n Uploading…\n </>\n ) : (\n <>\n <FileUp className=\"mr-1.5 h-3.5 w-3.5\" />\n Upload document\n </>\n )}\n </Button>\n {docError && <p className=\"text-xs text-destructive\">{docError}</p>}\n <p className=\"text-xs text-muted-foreground leading-relaxed\">{docUpload.hint}</p>\n </div>\n )}\n </section>\n )}\n\n {/* ── Embeds (inline players) ─────────────────────────────── */}\n {template.embeds && template.embeds.length > 0 && (\n <section className=\"space-y-3\">\n <p className=\"text-[11px] font-semibold text-muted-foreground\">Embeds</p>\n {template.embeds.map((platform) => {\n const meta = EMBED_PLATFORM_META[platform];\n const PIcon = meta.icon;\n const value = embedValues[meta.traitKey] ?? \"\";\n return (\n <div key={platform} className=\"space-y-1.5\">\n <Label className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n <PIcon className=\"h-3.5 w-3.5\" />\n {meta.label}\n {looksLikeUrl(value) && (\n <span className=\"ml-1 inline-flex items-center gap-0.5 text-[10px] font-medium text-emerald-400\">\n <Check className=\"h-3 w-3\" /> connected\n </span>\n )}\n </Label>\n <Input\n type=\"url\"\n inputMode=\"url\"\n placeholder={meta.placeholder}\n value={value}\n onChange={(e) =>\n setEmbedValues((cur) => ({ ...cur, [meta.traitKey]: e.target.value }))\n }\n className=\"h-10 text-sm\"\n />\n </div>\n );\n })}\n </section>\n )}\n\n {/* ── Social links (icon chips on the asset page) ─────────── */}\n {template.socials && template.socials.length > 0 && (\n <section className=\"space-y-3\">\n <p className=\"text-[11px] font-semibold text-muted-foreground\">Social links</p>\n {template.socials.map((platform) => {\n const meta = SOCIAL_PLATFORM_META[platform];\n const PIcon = meta.icon;\n const value = socialValues[meta.traitKey] ?? \"\";\n return (\n <div key={platform} className=\"space-y-1.5\">\n <Label className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n <PIcon className=\"h-3.5 w-3.5\" />\n {meta.label}\n </Label>\n <Input\n type=\"url\"\n inputMode=\"url\"\n placeholder={meta.placeholder}\n value={value}\n onChange={(e) =>\n setSocialValues((cur) => ({ ...cur, [meta.traitKey]: e.target.value }))\n }\n className=\"h-10 text-sm\"\n />\n </div>\n );\n })}\n </section>\n )}\n\n {/* ── Traits ───────────────────────────────────────────────── */}\n <section className=\"space-y-3 border-t border-border/60 pt-4\">\n <p className=\"text-sm font-semibold\">Traits</p>\n\n {/* Suggestion chips */}\n {template.traitSuggestions && template.traitSuggestions.length > 0 && (\n <div className=\"flex flex-wrap gap-2\">\n {template.traitSuggestions\n .filter((s) => !addedKeys.has(s.key.toLowerCase()))\n .map((s) => (\n <button\n key={s.key}\n type=\"button\"\n onClick={() => addSuggestion(s)}\n className=\"inline-flex items-center gap-1 rounded-full border border-border bg-muted/40 px-3 py-1 text-xs font-medium text-muted-foreground transition-colors hover:border-primary/40 hover:text-foreground\"\n >\n <Plus className=\"h-3 w-3\" />\n {s.key}\n </button>\n ))}\n </div>\n )}\n\n {/* Trait rows — one trait per card, inputs stacked (mobile-first) */}\n {traits.length > 0 && (\n <div className=\"space-y-2\">\n {traits.map((row) => (\n <div\n key={row.id}\n className=\"grid grid-cols-[1fr_1fr_auto] items-center gap-2\"\n >\n <Input\n value={row.key}\n onChange={(e) => updateTrait(row.id, { key: e.target.value })}\n placeholder=\"Trait name\"\n className=\"h-9 text-sm\"\n maxLength={64}\n />\n {row.options ? (\n <Select\n value={row.value}\n onValueChange={(v) => updateTrait(row.id, { value: v })}\n >\n <SelectTrigger className=\"h-9 text-sm\">\n <SelectValue placeholder=\"Value\" />\n </SelectTrigger>\n <SelectContent>\n {row.options.map((opt) => (\n <SelectItem key={opt} value={opt}>{opt}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : (\n <Input\n value={row.value}\n onChange={(e) => updateTrait(row.id, { value: e.target.value })}\n placeholder=\"Value\"\n className=\"h-9 text-sm\"\n maxLength={512}\n />\n )}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-9 w-9 shrink-0 text-muted-foreground hover:text-destructive\"\n onClick={() => removeTrait(row.id)}\n aria-label=\"Remove trait\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </div>\n ))}\n </div>\n )}\n\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={addCustomTrait}>\n <Plus className=\"mr-1.5 h-3.5 w-3.5\" />\n Add custom trait\n </Button>\n </section>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { IPType } from '../data/ip.cjs';
|
|
3
|
+
|
|
4
|
+
type MetadataField = {
|
|
5
|
+
traitType: string;
|
|
6
|
+
value: string;
|
|
7
|
+
};
|
|
8
|
+
interface IPTypeFieldsProps {
|
|
9
|
+
ipType: IPType | null;
|
|
10
|
+
onChange: (fields: MetadataField[]) => void;
|
|
11
|
+
/** Uploads a document file to IPFS, resolving to its ipfs:// URI.
|
|
12
|
+
* Enables the document upload field for types with template.docUpload. */
|
|
13
|
+
uploadDocument?: (file: File) => Promise<string>;
|
|
14
|
+
}
|
|
15
|
+
declare function IPTypeFields({ ipType, onChange, uploadDocument }: IPTypeFieldsProps): react_jsx_runtime.JSX.Element | null;
|
|
16
|
+
|
|
17
|
+
export { IPTypeFields, type IPTypeFieldsProps, type MetadataField };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { IPType } from '../data/ip.js';
|
|
3
|
+
|
|
4
|
+
type MetadataField = {
|
|
5
|
+
traitType: string;
|
|
6
|
+
value: string;
|
|
7
|
+
};
|
|
8
|
+
interface IPTypeFieldsProps {
|
|
9
|
+
ipType: IPType | null;
|
|
10
|
+
onChange: (fields: MetadataField[]) => void;
|
|
11
|
+
/** Uploads a document file to IPFS, resolving to its ipfs:// URI.
|
|
12
|
+
* Enables the document upload field for types with template.docUpload. */
|
|
13
|
+
uploadDocument?: (file: File) => Promise<string>;
|
|
14
|
+
}
|
|
15
|
+
declare function IPTypeFields({ ipType, onChange, uploadDocument }: IPTypeFieldsProps): react_jsx_runtime.JSX.Element | null;
|
|
16
|
+
|
|
17
|
+
export { IPTypeFields, type IPTypeFieldsProps, type MetadataField };
|