@mdigital_ui/ui 0.1.1 → 0.1.2
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/breadcrumbs/index.js +7 -0
- package/dist/breadcrumbs/index.js.map +1 -0
- package/dist/button-group/index.js +4 -0
- package/dist/button-group/index.js.map +1 -0
- package/dist/chunk-56IXGP5C.js +56 -0
- package/dist/chunk-56IXGP5C.js.map +1 -0
- package/dist/chunk-7PKVBUGL.js +38 -0
- package/dist/chunk-7PKVBUGL.js.map +1 -0
- package/dist/chunk-HUVXKOJC.js +198 -0
- package/dist/chunk-HUVXKOJC.js.map +1 -0
- package/dist/chunk-I5ANSIDK.js +561 -0
- package/dist/chunk-I5ANSIDK.js.map +1 -0
- package/dist/chunk-RMGIO27V.js +111 -0
- package/dist/chunk-RMGIO27V.js.map +1 -0
- package/dist/clipboard/index.js +4 -0
- package/dist/clipboard/index.js.map +1 -0
- package/dist/grid/index.js +4 -0
- package/dist/grid/index.js.map +1 -0
- package/dist/index.js +30 -949
- package/dist/index.js.map +1 -1
- package/dist/upload/index.js +4 -0
- package/dist/upload/index.js.map +1 -0
- package/package.json +6 -1
|
@@ -0,0 +1,561 @@
|
|
|
1
|
+
import { getValidationStatus, cn, statusMessageVariants, iconSizes } from './chunk-YNNAOXU5.js';
|
|
2
|
+
import { Image, Upload as Upload$1, File, X, Loader2, CheckCircle, AlertCircle } from 'lucide-react';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { cva } from 'class-variance-authority';
|
|
5
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
var uploadButtonVariants = cva(
|
|
8
|
+
"inline-flex cursor-pointer outline-none border items-center justify-center gap-2 font-medium rounded-md disabled:opacity-50 disabled:cursor-not-allowed transition-colors",
|
|
9
|
+
{
|
|
10
|
+
variants: {
|
|
11
|
+
color: {
|
|
12
|
+
primary: "border-primary text-white bg-primary hover:bg-primary/90",
|
|
13
|
+
secondary: "border-secondary text-white bg-secondary hover:bg-secondary/90",
|
|
14
|
+
success: "border-success text-white bg-success hover:bg-success/90",
|
|
15
|
+
error: "border-error text-white bg-error hover:bg-error/90",
|
|
16
|
+
accent: "border-accent text-white bg-accent hover:bg-accent/90",
|
|
17
|
+
warning: "border-warning text-white bg-warning hover:bg-warning/90",
|
|
18
|
+
info: "border-info text-white bg-info hover:bg-info/90"
|
|
19
|
+
},
|
|
20
|
+
size: {
|
|
21
|
+
xs: "h-[var(--button-height-xs)] px-[var(--button-padding-x-xs)] text-xs",
|
|
22
|
+
sm: "h-[var(--button-height-sm)] px-[var(--button-padding-x-sm)] text-sm",
|
|
23
|
+
md: "h-[var(--button-height-md)] px-[var(--button-padding-x-md)] text-base",
|
|
24
|
+
lg: "h-[var(--button-height-lg)] px-[var(--button-padding-x-lg)] text-lg"
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
defaultVariants: {
|
|
28
|
+
color: "primary",
|
|
29
|
+
size: "md"
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
);
|
|
33
|
+
var uploadDropzoneVariants = cva(
|
|
34
|
+
"relative border-2 border-dashed rounded-lg transition-all duration-200 cursor-pointer",
|
|
35
|
+
{
|
|
36
|
+
variants: {
|
|
37
|
+
status: {
|
|
38
|
+
default: "border-border bg-surface/50 hover:border-primary hover:bg-primary/5",
|
|
39
|
+
dragActive: "border-primary bg-primary/10",
|
|
40
|
+
error: "border-error bg-error/5",
|
|
41
|
+
disabled: "border-border bg-surface/30 cursor-not-allowed opacity-50"
|
|
42
|
+
},
|
|
43
|
+
size: {
|
|
44
|
+
xs: "p-2",
|
|
45
|
+
sm: "p-4",
|
|
46
|
+
md: "p-6",
|
|
47
|
+
lg: "p-8"
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
defaultVariants: {
|
|
51
|
+
status: "default",
|
|
52
|
+
size: "md"
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
);
|
|
56
|
+
var uploadDraggerVariants = cva(
|
|
57
|
+
"relative border-2 border-dashed rounded-lg transition-all duration-200 cursor-pointer flex flex-col items-center justify-center gap-2",
|
|
58
|
+
{
|
|
59
|
+
variants: {
|
|
60
|
+
status: {
|
|
61
|
+
default: "border-border bg-surface/50 hover:border-primary hover:bg-primary/5",
|
|
62
|
+
dragActive: "border-primary bg-primary/10 scale-[1.02]",
|
|
63
|
+
error: "border-error bg-error/5",
|
|
64
|
+
disabled: "border-border bg-surface/30 cursor-not-allowed opacity-50"
|
|
65
|
+
},
|
|
66
|
+
size: {
|
|
67
|
+
xs: "min-h-[100px] p-3",
|
|
68
|
+
sm: "min-h-[120px] p-4",
|
|
69
|
+
md: "min-h-[160px] p-6",
|
|
70
|
+
lg: "min-h-[200px] p-8"
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
defaultVariants: {
|
|
74
|
+
status: "default",
|
|
75
|
+
size: "md"
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
);
|
|
79
|
+
var uploadAvatarVariants = cva(
|
|
80
|
+
"relative overflow-hidden rounded-full border-2 border-dashed cursor-pointer transition-all duration-200 flex items-center justify-center",
|
|
81
|
+
{
|
|
82
|
+
variants: {
|
|
83
|
+
status: {
|
|
84
|
+
default: "border-border bg-surface/50 hover:border-primary",
|
|
85
|
+
dragActive: "border-primary bg-primary/10",
|
|
86
|
+
error: "border-error bg-error/5",
|
|
87
|
+
disabled: "border-border bg-surface/30 cursor-not-allowed opacity-50"
|
|
88
|
+
},
|
|
89
|
+
size: {
|
|
90
|
+
xs: "w-12 h-12",
|
|
91
|
+
sm: "w-16 h-16",
|
|
92
|
+
md: "w-24 h-24",
|
|
93
|
+
lg: "w-32 h-32"
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
defaultVariants: {
|
|
97
|
+
status: "default",
|
|
98
|
+
size: "md"
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
);
|
|
102
|
+
var uploadPictureVariants = cva(
|
|
103
|
+
"relative overflow-hidden rounded-md border-2 border-dashed cursor-pointer transition-all duration-200 flex items-center justify-center",
|
|
104
|
+
{
|
|
105
|
+
variants: {
|
|
106
|
+
status: {
|
|
107
|
+
default: "border-border bg-surface/50 hover:border-primary",
|
|
108
|
+
dragActive: "border-primary bg-primary/10",
|
|
109
|
+
error: "border-error bg-error/5",
|
|
110
|
+
disabled: "border-border bg-surface/30 cursor-not-allowed opacity-50"
|
|
111
|
+
},
|
|
112
|
+
size: {
|
|
113
|
+
xs: "w-16 h-16",
|
|
114
|
+
sm: "w-24 h-24",
|
|
115
|
+
md: "w-32 h-32",
|
|
116
|
+
lg: "w-40 h-40"
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
defaultVariants: {
|
|
120
|
+
status: "default",
|
|
121
|
+
size: "md"
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
);
|
|
125
|
+
var formatFileSize = (bytes) => {
|
|
126
|
+
if (bytes === 0) return "0 Bytes";
|
|
127
|
+
const k = 1024;
|
|
128
|
+
const sizes = ["Bytes", "KB", "MB", "GB"];
|
|
129
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
130
|
+
return Math.round(bytes / Math.pow(k, i) * 100) / 100 + " " + sizes[i];
|
|
131
|
+
};
|
|
132
|
+
var isImageFile = (file) => {
|
|
133
|
+
const type = file.type || "";
|
|
134
|
+
return type.startsWith("image/");
|
|
135
|
+
};
|
|
136
|
+
var generateUID = () => {
|
|
137
|
+
return `upload-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
138
|
+
};
|
|
139
|
+
var Upload = React.memo(
|
|
140
|
+
({
|
|
141
|
+
variant = "button",
|
|
142
|
+
size = "md",
|
|
143
|
+
color = "primary",
|
|
144
|
+
label,
|
|
145
|
+
helperText,
|
|
146
|
+
error,
|
|
147
|
+
warning,
|
|
148
|
+
info,
|
|
149
|
+
success,
|
|
150
|
+
accept,
|
|
151
|
+
multiple = false,
|
|
152
|
+
maxSize,
|
|
153
|
+
maxCount,
|
|
154
|
+
fileList,
|
|
155
|
+
defaultFileList = [],
|
|
156
|
+
showUploadList = true,
|
|
157
|
+
listType = "text",
|
|
158
|
+
disabled = false,
|
|
159
|
+
buttonText = "Upload File",
|
|
160
|
+
dragText = "Click or drag file to this area to upload",
|
|
161
|
+
dragHint = "Support for a single or bulk upload",
|
|
162
|
+
onChange,
|
|
163
|
+
onRemove,
|
|
164
|
+
beforeUpload,
|
|
165
|
+
customRequest,
|
|
166
|
+
onError,
|
|
167
|
+
className,
|
|
168
|
+
ref,
|
|
169
|
+
...props
|
|
170
|
+
}) => {
|
|
171
|
+
const [internalFileList, setInternalFileList] = React.useState(defaultFileList);
|
|
172
|
+
const [dragActive, setDragActive] = React.useState(false);
|
|
173
|
+
const inputRef = React.useRef(null);
|
|
174
|
+
const currentFileList = fileList !== void 0 ? fileList : internalFileList;
|
|
175
|
+
const { status, message: helperMessage } = getValidationStatus({
|
|
176
|
+
error,
|
|
177
|
+
warning,
|
|
178
|
+
info,
|
|
179
|
+
success,
|
|
180
|
+
helperText
|
|
181
|
+
});
|
|
182
|
+
const validateFile = React.useCallback(
|
|
183
|
+
(file) => {
|
|
184
|
+
if (maxSize && file.size > maxSize) {
|
|
185
|
+
return `File size exceeds ${formatFileSize(maxSize)}`;
|
|
186
|
+
}
|
|
187
|
+
if (maxCount && currentFileList.length >= maxCount) {
|
|
188
|
+
return `Maximum ${maxCount} file${maxCount > 1 ? "s" : ""} allowed`;
|
|
189
|
+
}
|
|
190
|
+
return null;
|
|
191
|
+
},
|
|
192
|
+
[maxSize, maxCount, currentFileList.length]
|
|
193
|
+
);
|
|
194
|
+
const handleFiles = React.useCallback(
|
|
195
|
+
async (files) => {
|
|
196
|
+
if (!files || files.length === 0) return;
|
|
197
|
+
const newFiles = [];
|
|
198
|
+
for (let i = 0; i < files.length; i++) {
|
|
199
|
+
const file = files[i];
|
|
200
|
+
if (!file) continue;
|
|
201
|
+
const validationError = validateFile(file);
|
|
202
|
+
if (validationError) {
|
|
203
|
+
onError?.(validationError, file);
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
if (beforeUpload) {
|
|
207
|
+
const shouldUpload = await beforeUpload(file);
|
|
208
|
+
if (!shouldUpload) continue;
|
|
209
|
+
}
|
|
210
|
+
const uploadFile = {
|
|
211
|
+
uid: generateUID(),
|
|
212
|
+
name: file.name,
|
|
213
|
+
size: file.size,
|
|
214
|
+
type: file.type,
|
|
215
|
+
status: "uploading",
|
|
216
|
+
percent: 0
|
|
217
|
+
};
|
|
218
|
+
newFiles.push(uploadFile);
|
|
219
|
+
if (customRequest) {
|
|
220
|
+
customRequest({
|
|
221
|
+
file,
|
|
222
|
+
onProgress: (percent) => {
|
|
223
|
+
setInternalFileList(
|
|
224
|
+
(prev) => prev.map(
|
|
225
|
+
(f) => f.uid === uploadFile.uid ? { ...f, percent } : f
|
|
226
|
+
)
|
|
227
|
+
);
|
|
228
|
+
},
|
|
229
|
+
onSuccess: (response) => {
|
|
230
|
+
setInternalFileList(
|
|
231
|
+
(prev) => prev.map(
|
|
232
|
+
(f) => f.uid === uploadFile.uid ? {
|
|
233
|
+
...f,
|
|
234
|
+
status: "done",
|
|
235
|
+
percent: 100,
|
|
236
|
+
response
|
|
237
|
+
} : f
|
|
238
|
+
)
|
|
239
|
+
);
|
|
240
|
+
},
|
|
241
|
+
onError: (err) => {
|
|
242
|
+
setInternalFileList(
|
|
243
|
+
(prev) => prev.map(
|
|
244
|
+
(f) => f.uid === uploadFile.uid ? { ...f, status: "error", error: err } : f
|
|
245
|
+
)
|
|
246
|
+
);
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
} else {
|
|
250
|
+
if (file && isImageFile(file)) {
|
|
251
|
+
uploadFile.thumbUrl = URL.createObjectURL(file);
|
|
252
|
+
}
|
|
253
|
+
uploadFile.status = "done";
|
|
254
|
+
uploadFile.percent = 100;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
const updatedList = multiple ? [...currentFileList, ...newFiles] : newFiles;
|
|
258
|
+
if (fileList === void 0) {
|
|
259
|
+
setInternalFileList(updatedList);
|
|
260
|
+
}
|
|
261
|
+
onChange?.(updatedList);
|
|
262
|
+
},
|
|
263
|
+
[
|
|
264
|
+
validateFile,
|
|
265
|
+
beforeUpload,
|
|
266
|
+
customRequest,
|
|
267
|
+
onError,
|
|
268
|
+
multiple,
|
|
269
|
+
currentFileList,
|
|
270
|
+
fileList,
|
|
271
|
+
onChange
|
|
272
|
+
]
|
|
273
|
+
);
|
|
274
|
+
const handleInputChange = React.useCallback(
|
|
275
|
+
(e) => {
|
|
276
|
+
handleFiles(e.target.files);
|
|
277
|
+
e.target.value = "";
|
|
278
|
+
},
|
|
279
|
+
[handleFiles]
|
|
280
|
+
);
|
|
281
|
+
const handleRemove = React.useCallback(
|
|
282
|
+
(file) => {
|
|
283
|
+
const updatedList = currentFileList.filter((f) => f.uid !== file.uid);
|
|
284
|
+
if (fileList === void 0) {
|
|
285
|
+
setInternalFileList(updatedList);
|
|
286
|
+
}
|
|
287
|
+
onRemove?.(file);
|
|
288
|
+
onChange?.(updatedList);
|
|
289
|
+
},
|
|
290
|
+
[currentFileList, fileList, onRemove, onChange]
|
|
291
|
+
);
|
|
292
|
+
const handleClick = React.useCallback(() => {
|
|
293
|
+
if (!disabled) {
|
|
294
|
+
inputRef.current?.click();
|
|
295
|
+
}
|
|
296
|
+
}, [disabled]);
|
|
297
|
+
const handleDragEnter = React.useCallback((e) => {
|
|
298
|
+
e.preventDefault();
|
|
299
|
+
e.stopPropagation();
|
|
300
|
+
setDragActive(true);
|
|
301
|
+
}, []);
|
|
302
|
+
const handleDragLeave = React.useCallback((e) => {
|
|
303
|
+
e.preventDefault();
|
|
304
|
+
e.stopPropagation();
|
|
305
|
+
setDragActive(false);
|
|
306
|
+
}, []);
|
|
307
|
+
const handleDragOver = React.useCallback((e) => {
|
|
308
|
+
e.preventDefault();
|
|
309
|
+
e.stopPropagation();
|
|
310
|
+
}, []);
|
|
311
|
+
const handleDrop = React.useCallback(
|
|
312
|
+
(e) => {
|
|
313
|
+
e.preventDefault();
|
|
314
|
+
e.stopPropagation();
|
|
315
|
+
setDragActive(false);
|
|
316
|
+
if (!disabled) {
|
|
317
|
+
handleFiles(e.dataTransfer.files);
|
|
318
|
+
}
|
|
319
|
+
},
|
|
320
|
+
[disabled, handleFiles]
|
|
321
|
+
);
|
|
322
|
+
const renderFileList = () => {
|
|
323
|
+
if (!showUploadList || currentFileList.length === 0) return null;
|
|
324
|
+
if (listType === "picture-card") {
|
|
325
|
+
return /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-2 mt-2", children: currentFileList.map((file) => /* @__PURE__ */ jsxs(
|
|
326
|
+
"div",
|
|
327
|
+
{
|
|
328
|
+
className: "relative w-24 h-24 rounded-md border border-border overflow-hidden group",
|
|
329
|
+
children: [
|
|
330
|
+
file.thumbUrl ? /* @__PURE__ */ jsx(
|
|
331
|
+
"img",
|
|
332
|
+
{
|
|
333
|
+
src: file.thumbUrl,
|
|
334
|
+
alt: file.name,
|
|
335
|
+
className: "w-full h-full object-cover"
|
|
336
|
+
}
|
|
337
|
+
) : /* @__PURE__ */ jsx("div", { className: "w-full h-full flex items-center justify-center bg-surface", children: /* @__PURE__ */ jsx(File, { className: "w-8 h-8 text-text-muted" }) }),
|
|
338
|
+
/* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-black/50 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center", children: /* @__PURE__ */ jsx(
|
|
339
|
+
"button",
|
|
340
|
+
{
|
|
341
|
+
type: "button",
|
|
342
|
+
onClick: () => handleRemove(file),
|
|
343
|
+
className: "text-white hover:text-error transition-colors",
|
|
344
|
+
children: /* @__PURE__ */ jsx(X, { className: iconSizes[size] })
|
|
345
|
+
}
|
|
346
|
+
) }),
|
|
347
|
+
file.status === "uploading" && /* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-black/30 flex items-center justify-center", children: /* @__PURE__ */ jsx(Loader2, { className: "w-6 h-6 text-white animate-spin" }) })
|
|
348
|
+
]
|
|
349
|
+
},
|
|
350
|
+
file.uid
|
|
351
|
+
)) });
|
|
352
|
+
}
|
|
353
|
+
return /* @__PURE__ */ jsx("div", { className: "mt-2 space-y-1", children: currentFileList.map((file) => /* @__PURE__ */ jsxs(
|
|
354
|
+
"div",
|
|
355
|
+
{
|
|
356
|
+
className: "flex items-center justify-between p-2 rounded-md bg-surface hover:bg-surface/80 transition-colors",
|
|
357
|
+
children: [
|
|
358
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 flex-1 min-w-0", children: [
|
|
359
|
+
listType === "picture" && file.thumbUrl ? /* @__PURE__ */ jsx(
|
|
360
|
+
"img",
|
|
361
|
+
{
|
|
362
|
+
src: file.thumbUrl,
|
|
363
|
+
alt: file.name,
|
|
364
|
+
className: "w-8 h-8 rounded object-cover"
|
|
365
|
+
}
|
|
366
|
+
) : /* @__PURE__ */ jsx(
|
|
367
|
+
File,
|
|
368
|
+
{
|
|
369
|
+
className: cn("text-text-muted shrink-0", iconSizes[size])
|
|
370
|
+
}
|
|
371
|
+
),
|
|
372
|
+
/* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0", children: [
|
|
373
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm text-text-primary truncate", children: file.name }),
|
|
374
|
+
/* @__PURE__ */ jsxs("p", { className: "text-xs text-text-muted", children: [
|
|
375
|
+
formatFileSize(file.size),
|
|
376
|
+
file.status === "uploading" && file.percent !== void 0 && /* @__PURE__ */ jsxs("span", { children: [
|
|
377
|
+
" - ",
|
|
378
|
+
file.percent,
|
|
379
|
+
"%"
|
|
380
|
+
] })
|
|
381
|
+
] })
|
|
382
|
+
] })
|
|
383
|
+
] }),
|
|
384
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
385
|
+
file.status === "uploading" && /* @__PURE__ */ jsx(
|
|
386
|
+
Loader2,
|
|
387
|
+
{
|
|
388
|
+
className: cn("text-primary animate-spin", iconSizes[size])
|
|
389
|
+
}
|
|
390
|
+
),
|
|
391
|
+
file.status === "done" && /* @__PURE__ */ jsx(
|
|
392
|
+
CheckCircle,
|
|
393
|
+
{
|
|
394
|
+
className: cn("text-success", iconSizes[size])
|
|
395
|
+
}
|
|
396
|
+
),
|
|
397
|
+
file.status === "error" && /* @__PURE__ */ jsx(AlertCircle, { className: cn("text-error", iconSizes[size]) }),
|
|
398
|
+
/* @__PURE__ */ jsx(
|
|
399
|
+
"button",
|
|
400
|
+
{
|
|
401
|
+
type: "button",
|
|
402
|
+
onClick: () => handleRemove(file),
|
|
403
|
+
className: "text-text-muted hover:text-error transition-colors",
|
|
404
|
+
children: /* @__PURE__ */ jsx(X, { className: iconSizes[size] })
|
|
405
|
+
}
|
|
406
|
+
)
|
|
407
|
+
] })
|
|
408
|
+
]
|
|
409
|
+
},
|
|
410
|
+
file.uid
|
|
411
|
+
)) });
|
|
412
|
+
};
|
|
413
|
+
const currentFile = currentFileList[0];
|
|
414
|
+
const renderUploadArea = () => {
|
|
415
|
+
const dragStatus = dragActive ? "dragActive" : disabled ? "disabled" : status === "error" ? "error" : "default";
|
|
416
|
+
switch (variant) {
|
|
417
|
+
case "button":
|
|
418
|
+
return /* @__PURE__ */ jsxs(
|
|
419
|
+
"button",
|
|
420
|
+
{
|
|
421
|
+
type: "button",
|
|
422
|
+
onClick: handleClick,
|
|
423
|
+
disabled,
|
|
424
|
+
className: cn(uploadButtonVariants({ color, size }), className),
|
|
425
|
+
children: [
|
|
426
|
+
/* @__PURE__ */ jsx(Upload$1, { className: iconSizes[size] }),
|
|
427
|
+
buttonText
|
|
428
|
+
]
|
|
429
|
+
}
|
|
430
|
+
);
|
|
431
|
+
case "dropzone":
|
|
432
|
+
return /* @__PURE__ */ jsx(
|
|
433
|
+
"div",
|
|
434
|
+
{
|
|
435
|
+
onClick: handleClick,
|
|
436
|
+
onDragEnter: handleDragEnter,
|
|
437
|
+
onDragLeave: handleDragLeave,
|
|
438
|
+
onDragOver: handleDragOver,
|
|
439
|
+
onDrop: handleDrop,
|
|
440
|
+
className: cn(
|
|
441
|
+
uploadDropzoneVariants({ status: dragStatus, size }),
|
|
442
|
+
className
|
|
443
|
+
),
|
|
444
|
+
children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
445
|
+
/* @__PURE__ */ jsx(
|
|
446
|
+
Upload$1,
|
|
447
|
+
{
|
|
448
|
+
className: cn("text-text-muted", iconSizes[size])
|
|
449
|
+
}
|
|
450
|
+
),
|
|
451
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
452
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm text-text-primary font-medium", children: dragText }),
|
|
453
|
+
dragHint && /* @__PURE__ */ jsx("p", { className: "text-xs text-text-muted mt-0.5", children: dragHint })
|
|
454
|
+
] })
|
|
455
|
+
] })
|
|
456
|
+
}
|
|
457
|
+
);
|
|
458
|
+
case "dragger":
|
|
459
|
+
return /* @__PURE__ */ jsxs(
|
|
460
|
+
"div",
|
|
461
|
+
{
|
|
462
|
+
onClick: handleClick,
|
|
463
|
+
onDragEnter: handleDragEnter,
|
|
464
|
+
onDragLeave: handleDragLeave,
|
|
465
|
+
onDragOver: handleDragOver,
|
|
466
|
+
onDrop: handleDrop,
|
|
467
|
+
className: cn(
|
|
468
|
+
uploadDraggerVariants({ status: dragStatus, size }),
|
|
469
|
+
className
|
|
470
|
+
),
|
|
471
|
+
children: [
|
|
472
|
+
/* @__PURE__ */ jsx(Upload$1, { className: "w-10 h-10 text-primary" }),
|
|
473
|
+
/* @__PURE__ */ jsx("p", { className: "text-base font-medium text-text-primary", children: dragText }),
|
|
474
|
+
dragHint && /* @__PURE__ */ jsx("p", { className: "text-sm text-text-muted", children: dragHint })
|
|
475
|
+
]
|
|
476
|
+
}
|
|
477
|
+
);
|
|
478
|
+
case "avatar":
|
|
479
|
+
return /* @__PURE__ */ jsx(
|
|
480
|
+
"div",
|
|
481
|
+
{
|
|
482
|
+
onClick: handleClick,
|
|
483
|
+
onDragEnter: handleDragEnter,
|
|
484
|
+
onDragLeave: handleDragLeave,
|
|
485
|
+
onDragOver: handleDragOver,
|
|
486
|
+
onDrop: handleDrop,
|
|
487
|
+
className: cn(
|
|
488
|
+
uploadAvatarVariants({ status: dragStatus, size }),
|
|
489
|
+
className
|
|
490
|
+
),
|
|
491
|
+
children: currentFile?.thumbUrl ? /* @__PURE__ */ jsx(
|
|
492
|
+
"img",
|
|
493
|
+
{
|
|
494
|
+
src: currentFile.thumbUrl,
|
|
495
|
+
alt: "avatar",
|
|
496
|
+
className: "w-full h-full object-cover"
|
|
497
|
+
}
|
|
498
|
+
) : /* @__PURE__ */ jsx(Image, { className: "w-8 h-8 text-text-muted" })
|
|
499
|
+
}
|
|
500
|
+
);
|
|
501
|
+
case "picture":
|
|
502
|
+
return /* @__PURE__ */ jsx(
|
|
503
|
+
"div",
|
|
504
|
+
{
|
|
505
|
+
onClick: handleClick,
|
|
506
|
+
onDragEnter: handleDragEnter,
|
|
507
|
+
onDragLeave: handleDragLeave,
|
|
508
|
+
onDragOver: handleDragOver,
|
|
509
|
+
onDrop: handleDrop,
|
|
510
|
+
className: cn(
|
|
511
|
+
uploadPictureVariants({ status: dragStatus, size }),
|
|
512
|
+
className
|
|
513
|
+
),
|
|
514
|
+
children: currentFile?.thumbUrl ? /* @__PURE__ */ jsx(
|
|
515
|
+
"img",
|
|
516
|
+
{
|
|
517
|
+
src: currentFile.thumbUrl,
|
|
518
|
+
alt: "preview",
|
|
519
|
+
className: "w-full h-full object-cover"
|
|
520
|
+
}
|
|
521
|
+
) : /* @__PURE__ */ jsx(Image, { className: "w-8 h-8 text-text-muted" })
|
|
522
|
+
}
|
|
523
|
+
);
|
|
524
|
+
default:
|
|
525
|
+
return null;
|
|
526
|
+
}
|
|
527
|
+
};
|
|
528
|
+
return /* @__PURE__ */ jsxs(
|
|
529
|
+
"div",
|
|
530
|
+
{
|
|
531
|
+
ref,
|
|
532
|
+
className: "w-full",
|
|
533
|
+
children: [
|
|
534
|
+
/* @__PURE__ */ jsx(
|
|
535
|
+
"input",
|
|
536
|
+
{
|
|
537
|
+
ref: inputRef,
|
|
538
|
+
type: "file",
|
|
539
|
+
accept,
|
|
540
|
+
multiple,
|
|
541
|
+
onChange: handleInputChange,
|
|
542
|
+
disabled,
|
|
543
|
+
className: "hidden",
|
|
544
|
+
...props
|
|
545
|
+
}
|
|
546
|
+
),
|
|
547
|
+
label && /* @__PURE__ */ jsx("label", { className: "block mb-1", children: /* @__PURE__ */ jsx("span", { className: "text-sm font-medium text-text-muted", children: label }) }),
|
|
548
|
+
renderUploadArea(),
|
|
549
|
+
renderFileList(),
|
|
550
|
+
helperMessage && /* @__PURE__ */ jsx("p", { className: cn(statusMessageVariants({ status }), "mt-1"), children: helperMessage })
|
|
551
|
+
]
|
|
552
|
+
}
|
|
553
|
+
);
|
|
554
|
+
}
|
|
555
|
+
);
|
|
556
|
+
Upload.displayName = "Upload";
|
|
557
|
+
var upload_default = Upload;
|
|
558
|
+
|
|
559
|
+
export { upload_default };
|
|
560
|
+
//# sourceMappingURL=chunk-I5ANSIDK.js.map
|
|
561
|
+
//# sourceMappingURL=chunk-I5ANSIDK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/upload/utils.ts","../src/upload/index.tsx"],"names":["UploadIcon","ImageIcon"],"mappings":"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","file":"chunk-I5ANSIDK.js","sourcesContent":["import { cva } from 'class-variance-authority'\n\nimport { UploadFile } from './types'\n\nexport const uploadButtonVariants = cva(\n 'inline-flex cursor-pointer outline-none border items-center justify-center gap-2 font-medium rounded-md disabled:opacity-50 disabled:cursor-not-allowed transition-colors',\n {\n variants: {\n color: {\n primary: 'border-primary text-white bg-primary hover:bg-primary/90',\n secondary:\n 'border-secondary text-white bg-secondary hover:bg-secondary/90',\n success: 'border-success text-white bg-success hover:bg-success/90',\n error: 'border-error text-white bg-error hover:bg-error/90',\n accent: 'border-accent text-white bg-accent hover:bg-accent/90',\n warning: 'border-warning text-white bg-warning hover:bg-warning/90',\n info: 'border-info text-white bg-info hover:bg-info/90',\n },\n size: {\n xs: 'h-[var(--button-height-xs)] px-[var(--button-padding-x-xs)] text-xs',\n sm: 'h-[var(--button-height-sm)] px-[var(--button-padding-x-sm)] text-sm',\n md: 'h-[var(--button-height-md)] px-[var(--button-padding-x-md)] text-base',\n lg: 'h-[var(--button-height-lg)] px-[var(--button-padding-x-lg)] text-lg',\n },\n },\n defaultVariants: {\n color: 'primary',\n size: 'md',\n },\n },\n)\n\nexport const uploadDropzoneVariants = cva(\n 'relative border-2 border-dashed rounded-lg transition-all duration-200 cursor-pointer',\n {\n variants: {\n status: {\n default:\n 'border-border bg-surface/50 hover:border-primary hover:bg-primary/5',\n dragActive: 'border-primary bg-primary/10',\n error: 'border-error bg-error/5',\n disabled: 'border-border bg-surface/30 cursor-not-allowed opacity-50',\n },\n size: {\n xs: 'p-2',\n sm: 'p-4',\n md: 'p-6',\n lg: 'p-8',\n },\n },\n defaultVariants: {\n status: 'default',\n size: 'md',\n },\n },\n)\n\nexport const uploadDraggerVariants = cva(\n 'relative border-2 border-dashed rounded-lg transition-all duration-200 cursor-pointer flex flex-col items-center justify-center gap-2',\n {\n variants: {\n status: {\n default:\n 'border-border bg-surface/50 hover:border-primary hover:bg-primary/5',\n dragActive: 'border-primary bg-primary/10 scale-[1.02]',\n error: 'border-error bg-error/5',\n disabled: 'border-border bg-surface/30 cursor-not-allowed opacity-50',\n },\n size: {\n xs: 'min-h-[100px] p-3',\n sm: 'min-h-[120px] p-4',\n md: 'min-h-[160px] p-6',\n lg: 'min-h-[200px] p-8',\n },\n },\n defaultVariants: {\n status: 'default',\n size: 'md',\n },\n },\n)\n\nexport const uploadAvatarVariants = cva(\n 'relative overflow-hidden rounded-full border-2 border-dashed cursor-pointer transition-all duration-200 flex items-center justify-center',\n {\n variants: {\n status: {\n default: 'border-border bg-surface/50 hover:border-primary',\n dragActive: 'border-primary bg-primary/10',\n error: 'border-error bg-error/5',\n disabled: 'border-border bg-surface/30 cursor-not-allowed opacity-50',\n },\n size: {\n xs: 'w-12 h-12',\n sm: 'w-16 h-16',\n md: 'w-24 h-24',\n lg: 'w-32 h-32',\n },\n },\n defaultVariants: {\n status: 'default',\n size: 'md',\n },\n },\n)\n\nexport const uploadPictureVariants = cva(\n 'relative overflow-hidden rounded-md border-2 border-dashed cursor-pointer transition-all duration-200 flex items-center justify-center',\n {\n variants: {\n status: {\n default: 'border-border bg-surface/50 hover:border-primary',\n dragActive: 'border-primary bg-primary/10',\n error: 'border-error bg-error/5',\n disabled: 'border-border bg-surface/30 cursor-not-allowed opacity-50',\n },\n size: {\n xs: 'w-16 h-16',\n sm: 'w-24 h-24',\n md: 'w-32 h-32',\n lg: 'w-40 h-40',\n },\n },\n defaultVariants: {\n status: 'default',\n size: 'md',\n },\n },\n)\n\nexport const formatFileSize = (bytes: number): string => {\n if (bytes === 0) return '0 Bytes'\n const k = 1024\n const sizes = ['Bytes', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return Math.round((bytes / Math.pow(k, i)) * 100) / 100 + ' ' + sizes[i]\n}\n\nexport const getFileExtension = (filename: string): string => {\n return filename.slice(((filename.lastIndexOf('.') - 1) >>> 0) + 2)\n}\n\nexport const isImageFile = (file: File | UploadFile): boolean => {\n const type = file.type || ''\n return type.startsWith('image/')\n}\n\nexport const generateUID = (): string => {\n return `upload-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n}\n","import {\n AlertCircle,\n CheckCircle,\n File,\n Image as ImageIcon,\n Loader2,\n Upload as UploadIcon,\n X,\n} from 'lucide-react'\nimport React from 'react'\n\nimport {\n cn,\n getValidationStatus,\n iconSizes,\n statusMessageVariants,\n} from '../utils'\nimport type { UploadFile, UploadProps } from './types'\nimport {\n formatFileSize,\n generateUID,\n isImageFile,\n uploadAvatarVariants,\n uploadButtonVariants,\n uploadDraggerVariants,\n uploadDropzoneVariants,\n uploadPictureVariants,\n} from './utils'\n\nconst Upload = React.memo<UploadProps>(\n ({\n variant = 'button',\n size = 'md',\n color = 'primary',\n label,\n helperText,\n error,\n warning,\n info,\n success,\n accept,\n multiple = false,\n maxSize,\n maxCount,\n fileList,\n defaultFileList = [],\n showUploadList = true,\n listType = 'text',\n disabled = false,\n buttonText = 'Upload File',\n dragText = 'Click or drag file to this area to upload',\n dragHint = 'Support for a single or bulk upload',\n onChange,\n onRemove,\n beforeUpload,\n customRequest,\n onError,\n className,\n ref,\n ...props\n }) => {\n const [internalFileList, setInternalFileList] =\n React.useState<UploadFile[]>(defaultFileList)\n const [dragActive, setDragActive] = React.useState(false)\n const inputRef = React.useRef<HTMLInputElement>(null)\n\n const currentFileList = fileList !== undefined ? fileList : internalFileList\n\n const { status, message: helperMessage } = getValidationStatus({\n error,\n warning,\n info,\n success,\n helperText,\n })\n\n const validateFile = React.useCallback(\n (file: File): string | null => {\n if (maxSize && file.size > maxSize) {\n return `File size exceeds ${formatFileSize(maxSize)}`\n }\n if (maxCount && currentFileList.length >= maxCount) {\n return `Maximum ${maxCount} file${maxCount > 1 ? 's' : ''} allowed`\n }\n return null\n },\n [maxSize, maxCount, currentFileList.length],\n )\n\n const handleFiles = React.useCallback(\n async (files: FileList | null) => {\n if (!files || files.length === 0) return\n\n const newFiles: UploadFile[] = []\n\n for (let i = 0; i < files.length; i++) {\n const file = files[i]\n if (!file) continue\n\n // Validate file\n const validationError = validateFile(file)\n if (validationError) {\n onError?.(validationError, file)\n continue\n }\n\n // Check beforeUpload\n if (beforeUpload) {\n const shouldUpload = await beforeUpload(file)\n if (!shouldUpload) continue\n }\n\n const uploadFile: UploadFile = {\n uid: generateUID(),\n name: file.name,\n size: file.size,\n type: file.type,\n status: 'uploading',\n percent: 0,\n }\n\n // Add to list\n newFiles.push(uploadFile)\n\n // Handle upload\n if (customRequest) {\n customRequest({\n file,\n onProgress: (percent) => {\n setInternalFileList((prev) =>\n prev.map((f) =>\n f.uid === uploadFile.uid ? { ...f, percent } : f,\n ),\n )\n },\n onSuccess: (response) => {\n setInternalFileList((prev) =>\n prev.map((f) =>\n f.uid === uploadFile.uid\n ? {\n ...f,\n status: 'done' as const,\n percent: 100,\n response,\n }\n : f,\n ),\n )\n },\n onError: (err) => {\n setInternalFileList((prev) =>\n prev.map((f) =>\n f.uid === uploadFile.uid\n ? { ...f, status: 'error' as const, error: err }\n : f,\n ),\n )\n },\n })\n } else {\n // Create preview URL for images\n if (file && isImageFile(file)) {\n uploadFile.thumbUrl = URL.createObjectURL(file)\n }\n uploadFile.status = 'done'\n uploadFile.percent = 100\n }\n }\n\n const updatedList = multiple\n ? [...currentFileList, ...newFiles]\n : newFiles\n\n if (fileList === undefined) {\n setInternalFileList(updatedList)\n }\n onChange?.(updatedList)\n },\n [\n validateFile,\n beforeUpload,\n customRequest,\n onError,\n multiple,\n currentFileList,\n fileList,\n onChange,\n ],\n )\n\n const handleInputChange = React.useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n handleFiles(e.target.files)\n // Reset input value to allow uploading the same file again\n e.target.value = ''\n },\n [handleFiles],\n )\n\n const handleRemove = React.useCallback(\n (file: UploadFile) => {\n const updatedList = currentFileList.filter((f) => f.uid !== file.uid)\n if (fileList === undefined) {\n setInternalFileList(updatedList)\n }\n onRemove?.(file)\n onChange?.(updatedList)\n },\n [currentFileList, fileList, onRemove, onChange],\n )\n\n const handleClick = React.useCallback(() => {\n if (!disabled) {\n inputRef.current?.click()\n }\n }, [disabled])\n\n const handleDragEnter = React.useCallback((e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setDragActive(true)\n }, [])\n\n const handleDragLeave = React.useCallback((e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setDragActive(false)\n }, [])\n\n const handleDragOver = React.useCallback((e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n }, [])\n\n const handleDrop = React.useCallback(\n (e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setDragActive(false)\n\n if (!disabled) {\n handleFiles(e.dataTransfer.files)\n }\n },\n [disabled, handleFiles],\n )\n\n const renderFileList = () => {\n if (!showUploadList || currentFileList.length === 0) return null\n\n if (listType === 'picture-card') {\n return (\n <div className=\"flex flex-wrap gap-2 mt-2\">\n {currentFileList.map((file) => (\n <div\n key={file.uid}\n className=\"relative w-24 h-24 rounded-md border border-border overflow-hidden group\"\n >\n {file.thumbUrl ? (\n <img\n src={file.thumbUrl}\n alt={file.name}\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <div className=\"w-full h-full flex items-center justify-center bg-surface\">\n <File className=\"w-8 h-8 text-text-muted\" />\n </div>\n )}\n <div className=\"absolute inset-0 bg-black/50 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center\">\n <button\n type=\"button\"\n onClick={() => handleRemove(file)}\n className=\"text-white hover:text-error transition-colors\"\n >\n <X className={iconSizes[size]} />\n </button>\n </div>\n {file.status === 'uploading' && (\n <div className=\"absolute inset-0 bg-black/30 flex items-center justify-center\">\n <Loader2 className=\"w-6 h-6 text-white animate-spin\" />\n </div>\n )}\n </div>\n ))}\n </div>\n )\n }\n\n return (\n <div className=\"mt-2 space-y-1\">\n {currentFileList.map((file) => (\n <div\n key={file.uid}\n className=\"flex items-center justify-between p-2 rounded-md bg-surface hover:bg-surface/80 transition-colors\"\n >\n <div className=\"flex items-center gap-2 flex-1 min-w-0\">\n {listType === 'picture' && file.thumbUrl ? (\n <img\n src={file.thumbUrl}\n alt={file.name}\n className=\"w-8 h-8 rounded object-cover\"\n />\n ) : (\n <File\n className={cn('text-text-muted shrink-0', iconSizes[size])}\n />\n )}\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm text-text-primary truncate\">\n {file.name}\n </p>\n <p className=\"text-xs text-text-muted\">\n {formatFileSize(file.size)}\n {file.status === 'uploading' &&\n file.percent !== undefined && (\n <span> - {file.percent}%</span>\n )}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n {file.status === 'uploading' && (\n <Loader2\n className={cn('text-primary animate-spin', iconSizes[size])}\n />\n )}\n {file.status === 'done' && (\n <CheckCircle\n className={cn('text-success', iconSizes[size])}\n />\n )}\n {file.status === 'error' && (\n <AlertCircle className={cn('text-error', iconSizes[size])} />\n )}\n <button\n type=\"button\"\n onClick={() => handleRemove(file)}\n className=\"text-text-muted hover:text-error transition-colors\"\n >\n <X className={iconSizes[size]} />\n </button>\n </div>\n </div>\n ))}\n </div>\n )\n }\n\n const currentFile = currentFileList[0]\n\n const renderUploadArea = () => {\n const dragStatus = dragActive\n ? 'dragActive'\n : disabled\n ? 'disabled'\n : status === 'error'\n ? 'error'\n : 'default'\n\n switch (variant) {\n case 'button':\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled}\n className={cn(uploadButtonVariants({ color, size }), className)}\n >\n <UploadIcon className={iconSizes[size]} />\n {buttonText}\n </button>\n )\n\n case 'dropzone':\n return (\n <div\n onClick={handleClick}\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n className={cn(\n uploadDropzoneVariants({ status: dragStatus, size }),\n className,\n )}\n >\n <div className=\"flex items-center gap-3\">\n <UploadIcon\n className={cn('text-text-muted', iconSizes[size])}\n />\n <div>\n <p className=\"text-sm text-text-primary font-medium\">\n {dragText}\n </p>\n {dragHint && (\n <p className=\"text-xs text-text-muted mt-0.5\">{dragHint}</p>\n )}\n </div>\n </div>\n </div>\n )\n\n case 'dragger':\n return (\n <div\n onClick={handleClick}\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n className={cn(\n uploadDraggerVariants({ status: dragStatus, size }),\n className,\n )}\n >\n <UploadIcon className=\"w-10 h-10 text-primary\" />\n <p className=\"text-base font-medium text-text-primary\">\n {dragText}\n </p>\n {dragHint && (\n <p className=\"text-sm text-text-muted\">{dragHint}</p>\n )}\n </div>\n )\n\n case 'avatar':\n return (\n <div\n onClick={handleClick}\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n className={cn(\n uploadAvatarVariants({ status: dragStatus, size }),\n className,\n )}\n >\n {currentFile?.thumbUrl ? (\n <img\n src={currentFile.thumbUrl}\n alt=\"avatar\"\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <ImageIcon className=\"w-8 h-8 text-text-muted\" />\n )}\n </div>\n )\n\n case 'picture':\n return (\n <div\n onClick={handleClick}\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n className={cn(\n uploadPictureVariants({ status: dragStatus, size }),\n className,\n )}\n >\n {currentFile?.thumbUrl ? (\n <img\n src={currentFile.thumbUrl}\n alt=\"preview\"\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <ImageIcon className=\"w-8 h-8 text-text-muted\" />\n )}\n </div>\n )\n\n default:\n return null\n }\n }\n\n return (\n <div\n ref={ref}\n className=\"w-full\"\n >\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n onChange={handleInputChange}\n disabled={disabled}\n className=\"hidden\"\n {...props}\n />\n\n {label && (\n <label className=\"block mb-1\">\n <span className=\"text-sm font-medium text-text-muted\">{label}</span>\n </label>\n )}\n\n {renderUploadArea()}\n {renderFileList()}\n\n {helperMessage && (\n <p className={cn(statusMessageVariants({ status }), 'mt-1')}>\n {helperMessage}\n </p>\n )}\n </div>\n )\n },\n)\n\nUpload.displayName = 'Upload'\n\nexport type * from './types'\nexport default Upload\n"]}
|