@oneplatformdev/ui 0.1.99-beta.305 → 0.1.99-beta.306
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/ColorInput/useSavedColors.js.map +1 -1
- package/Dropzone/Dropzone.d.ts.map +1 -1
- package/Dropzone/Dropzone.js +137 -137
- package/Dropzone/Dropzone.js.map +1 -1
- package/FormColorInput/FormColorInput.js.map +1 -1
- package/FormColorInput/FormColorInput.stories.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSavedColors.js","sources":["../../src/ColorInput/useSavedColors.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from 'react';\n\nexport const DEFAULT_SAVED_COLORS_STORAGE_KEY = 'op-color-input-saved-colors';\n\nconst read = (key: string): string[] => {\n if (typeof window === 'undefined') return [];\n try {\n const raw = window.localStorage.getItem(key);\n if (!raw) return [];\n const parsed = JSON.parse(raw);\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n};\n\nconst write = (key: string, next: string[]) => {\n if (typeof window === 'undefined') return;\n try {\n window.localStorage.setItem(key, JSON.stringify(next));\n } catch {\n /* ignore quota / privacy-mode failures */\n }\n};\n\n/**\n * Saved-colors palette persisted to localStorage (empty by default). Used by\n * `ColorInput` when the consumer doesn't pass a controlled\n * `savedColors`/`onAddSavedColor` pair.\n */\nexport const useSavedColors = (\n storageKey: string = DEFAULT_SAVED_COLORS_STORAGE_KEY,\n) => {\n const [colors, setColors] = useState<string[]>(() => read(storageKey));\n\n useEffect(() => {\n setColors(read(storageKey));\n }, [storageKey]);\n\n const setSavedColors = useCallback(\n (next: string[]) => {\n setColors(next);\n write(storageKey, next);\n },\n [storageKey],\n );\n\n const addColor = useCallback(\n (hex: string) => {\n setColors((prev) => {\n const lower = hex.toLowerCase();\n if (prev.some((c) => c.toLowerCase() === lower)) return prev;\n const next = [...prev, hex];\n write(storageKey, next);\n return next;\n });\n },\n [storageKey],\n );\n\n const removeColor = useCallback(\n (hex: string) => {\n setColors((prev) => {\n const lower = hex.toLowerCase();\n const next = prev.filter((c) => c.toLowerCase() !== lower);\n write(storageKey, next);\n return next;\n });\n },\n [storageKey],\n );\n\n return { savedColors: colors, addColor, removeColor, setSavedColors };\n};\n"],"names":["DEFAULT_SAVED_COLORS_STORAGE_KEY","read","key","raw","parsed","write","next","useSavedColors","storageKey","colors","setColors","useState","useEffect","setSavedColors","useCallback","addColor","hex","prev","lower","c","removeColor"],"mappings":";AAEO,MAAMA,IAAmC,+BAE1CC,IAAO,CAACC,MAA0B;AACtC,MAAI,OAAO,SAAW,IAAa,QAAO,CAAA;AAC1C,MAAI;AACF,UAAMC,IAAM,OAAO,aAAa,QAAQD,CAAG;AAC3C,QAAI,CAACC,EAAK,QAAO,CAAA;AACjB,UAAMC,IAAS,KAAK,MAAMD,CAAG;AAC7B,WAAO,MAAM,QAAQC,CAAM,IAAIA,IAAS,CAAA;AAAA,EAC1C,QAAQ;AACN,WAAO,CAAA;AAAA,EACT;AACF,GAEMC,IAAQ,CAACH,GAAaI,MAAmB;AAC7C,MAAI,SAAO,SAAW;AACtB,QAAI;AACF,aAAO,aAAa,QAAQJ,GAAK,KAAK,UAAUI,CAAI,CAAC;AAAA,IACvD,QAAQ;AAAA,IAER;AACF,GAOaC,IAAiB,CAC5BC,IAAqBR,MAClB;AACH,QAAM,CAACS,GAAQC,CAAS,IAAIC,EAAmB,MAAMV,EAAKO,CAAU,CAAC;AAErE,EAAAI,EAAU,MAAM;AACd,IAAAF,EAAUT,EAAKO,CAAU,CAAC;AAAA,EAC5B,GAAG,CAACA,CAAU,CAAC;AAEf,QAAMK,IAAiBC;AAAA,IACrB,CAACR,MAAmB;AAClB,MAAAI,EAAUJ,CAAI,GACdD,EAAMG,GAAYF,CAAI;AAAA,IACxB;AAAA,IACA,CAACE,CAAU;AAAA,EAAA,GAGPO,IAAWD;AAAA,IACf,CAACE,MAAgB;AACf,MAAAN,EAAU,CAACO,MAAS;AAClB,cAAMC,IAAQF,EAAI,YAAA;AAClB,YAAIC,EAAK,KAAK,CAACE,MAAMA,EAAE,YAAA,MAAkBD,CAAK,EAAG,QAAOD;AACxD,cAAMX,IAAO,CAAC,GAAGW,GAAMD,CAAG;AAC1B,eAAAX,EAAMG,GAAYF,CAAI,GACfA;AAAA,MACT,CAAC;AAAA,IACH;AAAA,IACA,CAACE,CAAU;AAAA,EAAA,GAGPY,IAAcN;AAAA,IAClB,CAACE,MAAgB;AACf,MAAAN,EAAU,CAACO,MAAS;AAClB,cAAMC,IAAQF,EAAI,YAAA,GACZV,IAAOW,EAAK,OAAO,CAACE,MAAMA,EAAE,YAAA,MAAkBD,CAAK;AACzD,eAAAb,EAAMG,GAAYF,CAAI,GACfA;AAAA,MACT,CAAC;AAAA,IACH;AAAA,IACA,CAACE,CAAU;AAAA,EAAA;AAGb,SAAO,EAAE,aAAaC,GAAQ,UAAAM,GAAU,aAAAK,GAAa,gBAAAP,EAAA;AACvD;"}
|
|
1
|
+
{"version":3,"file":"useSavedColors.js","sources":["../../src/ColorInput/useSavedColors.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from 'react';\r\n\r\nexport const DEFAULT_SAVED_COLORS_STORAGE_KEY = 'op-color-input-saved-colors';\r\n\r\nconst read = (key: string): string[] => {\r\n if (typeof window === 'undefined') return [];\r\n try {\r\n const raw = window.localStorage.getItem(key);\r\n if (!raw) return [];\r\n const parsed = JSON.parse(raw);\r\n return Array.isArray(parsed) ? parsed : [];\r\n } catch {\r\n return [];\r\n }\r\n};\r\n\r\nconst write = (key: string, next: string[]) => {\r\n if (typeof window === 'undefined') return;\r\n try {\r\n window.localStorage.setItem(key, JSON.stringify(next));\r\n } catch {\r\n /* ignore quota / privacy-mode failures */\r\n }\r\n};\r\n\r\n/**\r\n * Saved-colors palette persisted to localStorage (empty by default). Used by\r\n * `ColorInput` when the consumer doesn't pass a controlled\r\n * `savedColors`/`onAddSavedColor` pair.\r\n */\r\nexport const useSavedColors = (\r\n storageKey: string = DEFAULT_SAVED_COLORS_STORAGE_KEY,\r\n) => {\r\n const [colors, setColors] = useState<string[]>(() => read(storageKey));\r\n\r\n useEffect(() => {\r\n setColors(read(storageKey));\r\n }, [storageKey]);\r\n\r\n const setSavedColors = useCallback(\r\n (next: string[]) => {\r\n setColors(next);\r\n write(storageKey, next);\r\n },\r\n [storageKey],\r\n );\r\n\r\n const addColor = useCallback(\r\n (hex: string) => {\r\n setColors((prev) => {\r\n const lower = hex.toLowerCase();\r\n if (prev.some((c) => c.toLowerCase() === lower)) return prev;\r\n const next = [...prev, hex];\r\n write(storageKey, next);\r\n return next;\r\n });\r\n },\r\n [storageKey],\r\n );\r\n\r\n const removeColor = useCallback(\r\n (hex: string) => {\r\n setColors((prev) => {\r\n const lower = hex.toLowerCase();\r\n const next = prev.filter((c) => c.toLowerCase() !== lower);\r\n write(storageKey, next);\r\n return next;\r\n });\r\n },\r\n [storageKey],\r\n );\r\n\r\n return { savedColors: colors, addColor, removeColor, setSavedColors };\r\n};\r\n"],"names":["DEFAULT_SAVED_COLORS_STORAGE_KEY","read","key","raw","parsed","write","next","useSavedColors","storageKey","colors","setColors","useState","useEffect","setSavedColors","useCallback","addColor","hex","prev","lower","c","removeColor"],"mappings":";AAEO,MAAMA,IAAmC,+BAE1CC,IAAO,CAACC,MAA0B;AACtC,MAAI,OAAO,SAAW,IAAa,QAAO,CAAA;AAC1C,MAAI;AACF,UAAMC,IAAM,OAAO,aAAa,QAAQD,CAAG;AAC3C,QAAI,CAACC,EAAK,QAAO,CAAA;AACjB,UAAMC,IAAS,KAAK,MAAMD,CAAG;AAC7B,WAAO,MAAM,QAAQC,CAAM,IAAIA,IAAS,CAAA;AAAA,EAC1C,QAAQ;AACN,WAAO,CAAA;AAAA,EACT;AACF,GAEMC,IAAQ,CAACH,GAAaI,MAAmB;AAC7C,MAAI,SAAO,SAAW;AACtB,QAAI;AACF,aAAO,aAAa,QAAQJ,GAAK,KAAK,UAAUI,CAAI,CAAC;AAAA,IACvD,QAAQ;AAAA,IAER;AACF,GAOaC,IAAiB,CAC5BC,IAAqBR,MAClB;AACH,QAAM,CAACS,GAAQC,CAAS,IAAIC,EAAmB,MAAMV,EAAKO,CAAU,CAAC;AAErE,EAAAI,EAAU,MAAM;AACd,IAAAF,EAAUT,EAAKO,CAAU,CAAC;AAAA,EAC5B,GAAG,CAACA,CAAU,CAAC;AAEf,QAAMK,IAAiBC;AAAA,IACrB,CAACR,MAAmB;AAClB,MAAAI,EAAUJ,CAAI,GACdD,EAAMG,GAAYF,CAAI;AAAA,IACxB;AAAA,IACA,CAACE,CAAU;AAAA,EAAA,GAGPO,IAAWD;AAAA,IACf,CAACE,MAAgB;AACf,MAAAN,EAAU,CAACO,MAAS;AAClB,cAAMC,IAAQF,EAAI,YAAA;AAClB,YAAIC,EAAK,KAAK,CAACE,MAAMA,EAAE,YAAA,MAAkBD,CAAK,EAAG,QAAOD;AACxD,cAAMX,IAAO,CAAC,GAAGW,GAAMD,CAAG;AAC1B,eAAAX,EAAMG,GAAYF,CAAI,GACfA;AAAA,MACT,CAAC;AAAA,IACH;AAAA,IACA,CAACE,CAAU;AAAA,EAAA,GAGPY,IAAcN;AAAA,IAClB,CAACE,MAAgB;AACf,MAAAN,EAAU,CAACO,MAAS;AAClB,cAAMC,IAAQF,EAAI,YAAA,GACZV,IAAOW,EAAK,OAAO,CAACE,MAAMA,EAAE,YAAA,MAAkBD,CAAK;AACzD,eAAAb,EAAMG,GAAYF,CAAI,GACfA;AAAA,MACT,CAAC;AAAA,IACH;AAAA,IACA,CAACE,CAAU;AAAA,EAAA;AAGb,SAAO,EAAE,aAAaC,GAAQ,UAAAM,GAAU,aAAAK,GAAa,gBAAAP,EAAA;AACvD;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dropzone.d.ts","sourceRoot":"","sources":["../../src/Dropzone/Dropzone.tsx"],"names":[],"mappings":"AAQA,OAAO,EAEL,eAAe,EACf,aAAa,EAEd,MAAM,kBAAkB,CAAC;AAgG1B;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,QAAQ,
|
|
1
|
+
{"version":3,"file":"Dropzone.d.ts","sourceRoot":"","sources":["../../src/Dropzone/Dropzone.tsx"],"names":[],"mappings":"AAQA,OAAO,EAEL,eAAe,EACf,aAAa,EAEd,MAAM,kBAAkB,CAAC;AAgG1B;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,QAAQ,2GAokBpB,CAAC"}
|
package/Dropzone/Dropzone.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { jsxs as
|
|
1
|
+
import { jsxs as r, jsx as t, Fragment as V } from "react/jsx-runtime";
|
|
2
2
|
import { X as M, Plus as ke, UploadIcon as We, FileTextIcon as ee, InfoIcon as te } from "lucide-react";
|
|
3
|
-
import { forwardRef as _e, useState as
|
|
3
|
+
import { forwardRef as _e, useState as re, useEffect as $e, useImperativeHandle as Le } from "react";
|
|
4
4
|
import { useDropzone as Ge } from "react-dropzone";
|
|
5
5
|
import { cn as x } from "@oneplatformdev/utils";
|
|
6
6
|
import { Card as Xe } from "../Card/Card.js";
|
|
7
7
|
import { DEFAULT_FILE_TYPES as Ke } from "./Dropzone.types.js";
|
|
8
|
-
import { DropzoneCoverPreview as
|
|
8
|
+
import { DropzoneCoverPreview as le } from "./DropzoneCoverPreview.js";
|
|
9
9
|
import { DropzoneFileCard as Oe } from "./DropzoneFileCard.js";
|
|
10
10
|
import { FilePreview as Te } from "./DropzoneFilePreview.js";
|
|
11
11
|
import { DropzoneSinglePickPreview as qe } from "./DropzoneSinglePickPreview.js";
|
|
@@ -13,62 +13,62 @@ import { isFile as F, isVideoUrl as He, extractName as oe } from "./DropzoneUtil
|
|
|
13
13
|
import Je from "./icons/file-csv.svg.js";
|
|
14
14
|
import Pe from "./icons/file-doc.svg.js";
|
|
15
15
|
import Ye from "./icons/file-docx.svg.js";
|
|
16
|
-
import
|
|
16
|
+
import ne from "./icons/file-jpg.svg.js";
|
|
17
17
|
import Ze from "./icons/file-pdf.svg.js";
|
|
18
18
|
import Qe from "./icons/file-png.svg.js";
|
|
19
19
|
import Ue from "./icons/file-ppt.svg.js";
|
|
20
20
|
import Ve from "./icons/file-pptx.svg.js";
|
|
21
21
|
import et from "./icons/file-rar.svg.js";
|
|
22
22
|
import tt from "./icons/file-svg.svg.js";
|
|
23
|
-
import
|
|
24
|
-
import
|
|
23
|
+
import rt from "./icons/file-webp.svg.js";
|
|
24
|
+
import lt from "./icons/file-xls.svg.js";
|
|
25
25
|
import ot from "./icons/file-xlsx.svg.js";
|
|
26
|
-
import
|
|
27
|
-
import { Button as
|
|
28
|
-
const z = (
|
|
29
|
-
if (!
|
|
30
|
-
const
|
|
31
|
-
if (
|
|
32
|
-
if (
|
|
33
|
-
const
|
|
34
|
-
return `${
|
|
26
|
+
import nt from "./icons/file-zip.svg.js";
|
|
27
|
+
import { Button as it } from "../Button/Button.js";
|
|
28
|
+
const z = (l = 0) => {
|
|
29
|
+
if (!l || l < 0) return "0 KB";
|
|
30
|
+
const c = 1024, d = c * 1024, f = d * 1024;
|
|
31
|
+
if (l >= f) return `${(l / f).toFixed(2)} GB`;
|
|
32
|
+
if (l >= d) {
|
|
33
|
+
const m = l / d;
|
|
34
|
+
return `${m >= 100 ? m.toFixed(0) : m.toFixed(2)} MB`;
|
|
35
35
|
}
|
|
36
|
-
return
|
|
36
|
+
return l >= c ? `${(l / c).toFixed(l / c >= 100 ? 0 : 1)} KB` : `${l} B`;
|
|
37
37
|
}, st = {
|
|
38
38
|
csv: Je,
|
|
39
39
|
doc: Pe,
|
|
40
40
|
docx: Ye,
|
|
41
|
-
jpg:
|
|
42
|
-
jpeg:
|
|
41
|
+
jpg: ne,
|
|
42
|
+
jpeg: ne,
|
|
43
43
|
pdf: Ze,
|
|
44
44
|
png: Qe,
|
|
45
45
|
ppt: Ue,
|
|
46
46
|
pptx: Ve,
|
|
47
47
|
rar: et,
|
|
48
48
|
svg: tt,
|
|
49
|
-
webp:
|
|
50
|
-
xls:
|
|
49
|
+
webp: rt,
|
|
50
|
+
xls: lt,
|
|
51
51
|
xlsx: ot,
|
|
52
|
-
zip:
|
|
53
|
-
}, ct = (
|
|
54
|
-
if (!
|
|
55
|
-
const
|
|
56
|
-
return
|
|
57
|
-
},
|
|
58
|
-
const
|
|
59
|
-
return st[
|
|
60
|
-
}, at = (
|
|
61
|
-
if (
|
|
62
|
-
if (
|
|
63
|
-
for (let d = 0; d <
|
|
64
|
-
const
|
|
65
|
-
if (
|
|
66
|
-
if (typeof
|
|
67
|
-
if (
|
|
52
|
+
zip: nt
|
|
53
|
+
}, ct = (l) => {
|
|
54
|
+
if (!l) return "";
|
|
55
|
+
const c = l.toLowerCase().split(".");
|
|
56
|
+
return c.length > 1 ? c[c.length - 1] : "";
|
|
57
|
+
}, ie = (l) => {
|
|
58
|
+
const c = ct(l);
|
|
59
|
+
return st[c] ?? null;
|
|
60
|
+
}, at = (l, c) => {
|
|
61
|
+
if (l === c) return !0;
|
|
62
|
+
if (l.length !== c.length) return !1;
|
|
63
|
+
for (let d = 0; d < l.length; d++) {
|
|
64
|
+
const f = l[d], m = c[d];
|
|
65
|
+
if (f !== m) {
|
|
66
|
+
if (typeof f == "string" && typeof m == "string") {
|
|
67
|
+
if (f !== m) return !1;
|
|
68
68
|
continue;
|
|
69
69
|
}
|
|
70
|
-
if (F(
|
|
71
|
-
if (
|
|
70
|
+
if (F(f) && F(m)) {
|
|
71
|
+
if (f.name !== m.name || f.size !== m.size || f.type !== m.type || f.lastModified !== m.lastModified)
|
|
72
72
|
return !1;
|
|
73
73
|
continue;
|
|
74
74
|
}
|
|
@@ -76,28 +76,28 @@ const z = (r = 0) => {
|
|
|
76
76
|
}
|
|
77
77
|
}
|
|
78
78
|
return !0;
|
|
79
|
-
},
|
|
79
|
+
}, mt = _e(
|
|
80
80
|
({
|
|
81
|
-
acceptTypes:
|
|
82
|
-
maxSizeMB:
|
|
81
|
+
acceptTypes: l = Ke,
|
|
82
|
+
maxSizeMB: c,
|
|
83
83
|
maxFiles: d = 1,
|
|
84
|
-
onErrors:
|
|
85
|
-
hideErrors:
|
|
86
|
-
disabled:
|
|
87
|
-
classNames:
|
|
88
|
-
value:
|
|
84
|
+
onErrors: f,
|
|
85
|
+
hideErrors: m = !1,
|
|
86
|
+
disabled: s = !1,
|
|
87
|
+
classNames: I,
|
|
88
|
+
value: b,
|
|
89
89
|
onChangeValue: q,
|
|
90
90
|
className: se,
|
|
91
91
|
labelDropzonePrompt: R = "Drop files here or click to select",
|
|
92
92
|
labelDropzoneSubPrompt: ce = "",
|
|
93
93
|
labelOrClickToSelect: ae = "Upload file",
|
|
94
|
-
labelSelectedFiles:
|
|
95
|
-
labelUploadErrors:
|
|
94
|
+
labelSelectedFiles: me = "Selected Files",
|
|
95
|
+
labelUploadErrors: de = "Upload Errors",
|
|
96
96
|
labelFileTooLarge: k = "File is too large",
|
|
97
97
|
labelInvalidFileType: y = "Invalid file type",
|
|
98
98
|
labelVideoUploaded: fe = "Uploaded",
|
|
99
99
|
labelVideoReplace: pe = "Replace",
|
|
100
|
-
singlePick:
|
|
100
|
+
singlePick: i = !1,
|
|
101
101
|
labelDropzoneClassname: xe,
|
|
102
102
|
labelDropzoneSubClassname: he,
|
|
103
103
|
isUploading: p = !1,
|
|
@@ -115,50 +115,50 @@ const z = (r = 0) => {
|
|
|
115
115
|
previewVariant: h = "default",
|
|
116
116
|
coverFirstItem: ze = !1,
|
|
117
117
|
...$
|
|
118
|
-
},
|
|
119
|
-
const [o, A] =
|
|
120
|
-
P(
|
|
121
|
-
const
|
|
122
|
-
A(
|
|
118
|
+
}, Ie) => {
|
|
119
|
+
const [o, A] = re(b ?? []), [u, P] = re([]), w = o[0], L = u[0]?.file, be = !!L?.type?.includes("image"), G = i && o.length > 0 && F(w), Ee = G && w.type.includes("image"), Y = G && w.type.includes("video") || i && o.length > 0 && typeof w == "string" && He(w), X = G && !Ee && !Y, Z = i && !o.length && !!L && !be, v = X ? w : L, S = ie(v?.name), j = i && Y, De = j, B = i && o.length > 0, ye = B && !X && !j, N = h === "file-list" && !i && o.length >= d, Ae = (e, a) => {
|
|
120
|
+
P(a), f?.(a);
|
|
121
|
+
const n = i ? e.slice(0, 1) : [...o, ...e].slice(0, d);
|
|
122
|
+
A(n), q?.(n);
|
|
123
123
|
};
|
|
124
124
|
$e(() => {
|
|
125
|
-
|
|
126
|
-
}, [o,
|
|
127
|
-
const E = (e,
|
|
128
|
-
if (
|
|
125
|
+
b && !at(o, b) && A(b);
|
|
126
|
+
}, [o, b]);
|
|
127
|
+
const E = (e, a) => {
|
|
128
|
+
if (s) return;
|
|
129
129
|
e.stopPropagation();
|
|
130
|
-
const
|
|
131
|
-
A(
|
|
130
|
+
const n = o.filter((g, C) => C !== a);
|
|
131
|
+
A(n), q?.(n);
|
|
132
132
|
}, { getRootProps: Se, getInputProps: je, isDragActive: Be, open: K } = Ge({
|
|
133
133
|
onDrop: Ae,
|
|
134
|
-
accept:
|
|
135
|
-
maxSize:
|
|
136
|
-
maxFiles:
|
|
137
|
-
disabled:
|
|
134
|
+
accept: l.reduce((e, a) => (e[a] = [], e), {}),
|
|
135
|
+
maxSize: c * 1024 * 1024,
|
|
136
|
+
maxFiles: i ? 1 : d,
|
|
137
|
+
disabled: s || p || N,
|
|
138
138
|
noClick: !0
|
|
139
139
|
});
|
|
140
|
-
Le(
|
|
140
|
+
Le(Ie, () => ({
|
|
141
141
|
setItems: A
|
|
142
142
|
}), []);
|
|
143
|
-
const D = ze && h === "image-grid" && !
|
|
144
|
-
h === "default" && /* @__PURE__ */
|
|
145
|
-
|
|
143
|
+
const D = ze && h === "image-grid" && !i && o.length > 0, O = !p && !i && _ && o.length > 0, T = D ? o.slice(1) : o, Q = !s && !i && h === "image-grid" && o.length > 0 && o.length < d, Me = !i && h === "image-grid" && (_ || o.length === 0), U = !p && !i && (T.length > 0 || Q) && /* @__PURE__ */ r("div", { className: x("w-full mt-2", I?.previewWrapper), children: [
|
|
144
|
+
h === "default" && /* @__PURE__ */ r("pre", { className: "font-semibold text-gray-600", children: [
|
|
145
|
+
me,
|
|
146
146
|
":"
|
|
147
147
|
] }),
|
|
148
|
-
h === "file-list" ? /* @__PURE__ */ t("div", { className: "mt-2 flex flex-col gap-2", children: T.map((e,
|
|
149
|
-
const
|
|
148
|
+
h === "file-list" ? /* @__PURE__ */ t("div", { className: "mt-2 flex flex-col gap-2", children: T.map((e, a) => {
|
|
149
|
+
const n = F(e) ? e.name : oe(e), g = F(e) ? z(e.size) : "";
|
|
150
150
|
return /* @__PURE__ */ t(
|
|
151
151
|
Oe,
|
|
152
152
|
{
|
|
153
|
-
name:
|
|
153
|
+
name: n,
|
|
154
154
|
sizeLabel: g,
|
|
155
|
-
iconSrc:
|
|
156
|
-
disabled:
|
|
157
|
-
onRemove: (C) => E(C,
|
|
155
|
+
iconSrc: ie(n),
|
|
156
|
+
disabled: s,
|
|
157
|
+
onRemove: (C) => E(C, a)
|
|
158
158
|
},
|
|
159
|
-
|
|
159
|
+
a
|
|
160
160
|
);
|
|
161
|
-
}) }) : /* @__PURE__ */
|
|
161
|
+
}) }) : /* @__PURE__ */ r(
|
|
162
162
|
"ul",
|
|
163
163
|
{
|
|
164
164
|
className: x(
|
|
@@ -166,9 +166,9 @@ const z = (r = 0) => {
|
|
|
166
166
|
h === "image-grid" ? "gap-2 justify-start" : "gap-4 justify-center"
|
|
167
167
|
),
|
|
168
168
|
children: [
|
|
169
|
-
T.map((e,
|
|
170
|
-
const
|
|
171
|
-
return /* @__PURE__ */
|
|
169
|
+
T.map((e, a) => {
|
|
170
|
+
const n = D ? a + 1 : a, g = F(e) ? e.name : oe(e), C = F(e) ? z(e.size) : "";
|
|
171
|
+
return /* @__PURE__ */ r(
|
|
172
172
|
"li",
|
|
173
173
|
{
|
|
174
174
|
className: x(
|
|
@@ -176,23 +176,23 @@ const z = (r = 0) => {
|
|
|
176
176
|
h === "image-grid" ? "w-[75px] h-[75px]" : "flex flex-col items-center gap-2"
|
|
177
177
|
),
|
|
178
178
|
children: [
|
|
179
|
-
/* @__PURE__ */
|
|
180
|
-
h === "image-grid" ? /* @__PURE__ */ t(
|
|
181
|
-
/* @__PURE__ */ t(
|
|
179
|
+
/* @__PURE__ */ r("div", { className: "relative w-full h-full", children: [
|
|
180
|
+
h === "image-grid" ? /* @__PURE__ */ t(le, { item: e, className: "rounded-[8px]" }) : /* @__PURE__ */ t(Te, { item: e, styles: I }),
|
|
181
|
+
!s && /* @__PURE__ */ t(
|
|
182
182
|
"div",
|
|
183
183
|
{
|
|
184
184
|
className: x(
|
|
185
185
|
"absolute top-0 right-0 z-20 cursor-pointer bg-gray-300 rounded-sm",
|
|
186
186
|
h === "image-grid" && "top-1 right-1 bg-white/90 rounded-full p-0.5"
|
|
187
187
|
),
|
|
188
|
-
onClick: (Re) => E(Re,
|
|
188
|
+
onClick: (Re) => E(Re, n),
|
|
189
189
|
children: /* @__PURE__ */ t(M, { size: 16, strokeWidth: 1, color: "black" })
|
|
190
190
|
}
|
|
191
191
|
)
|
|
192
192
|
] }),
|
|
193
|
-
h === "default" && /* @__PURE__ */
|
|
193
|
+
h === "default" && /* @__PURE__ */ r("span", { className: "inline-flex flex-col items-center", children: [
|
|
194
194
|
/* @__PURE__ */ t("span", { className: "max-w-[80px] text-ellipsis overflow-hidden whitespace-nowrap", children: g }),
|
|
195
|
-
C && /* @__PURE__ */
|
|
195
|
+
C && /* @__PURE__ */ r("span", { children: [
|
|
196
196
|
"(",
|
|
197
197
|
C,
|
|
198
198
|
")"
|
|
@@ -200,7 +200,7 @@ const z = (r = 0) => {
|
|
|
200
200
|
] })
|
|
201
201
|
]
|
|
202
202
|
},
|
|
203
|
-
|
|
203
|
+
n
|
|
204
204
|
);
|
|
205
205
|
}),
|
|
206
206
|
Q && /* @__PURE__ */ t(
|
|
@@ -208,7 +208,7 @@ const z = (r = 0) => {
|
|
|
208
208
|
{
|
|
209
209
|
className: "relative w-[75px] h-[75px] flex items-center justify-center rounded-[8px] border border-dashed border-[#9368FF80] bg-[#FCFCFC] cursor-pointer hover:bg-[#9368FF0F]",
|
|
210
210
|
onClick: (e) => {
|
|
211
|
-
e.stopPropagation(), !(
|
|
211
|
+
e.stopPropagation(), !(s || p) && K();
|
|
212
212
|
},
|
|
213
213
|
children: /* @__PURE__ */ t("div", { className: "flex size-6 items-center justify-center rounded-full bg-[#9368FF1F]", children: /* @__PURE__ */ t(ke, { size: 16, className: "text-[#9368FF]" }) })
|
|
214
214
|
},
|
|
@@ -218,14 +218,14 @@ const z = (r = 0) => {
|
|
|
218
218
|
}
|
|
219
219
|
)
|
|
220
220
|
] });
|
|
221
|
-
return /* @__PURE__ */
|
|
222
|
-
/* @__PURE__ */
|
|
221
|
+
return /* @__PURE__ */ r("div", { className: "w-full select-none", children: [
|
|
222
|
+
/* @__PURE__ */ r(
|
|
223
223
|
Xe,
|
|
224
224
|
{
|
|
225
225
|
...$,
|
|
226
226
|
...Se({
|
|
227
227
|
onClick: (e) => {
|
|
228
|
-
if (!(
|
|
228
|
+
if (!(s || p || N)) {
|
|
229
229
|
if (De) {
|
|
230
230
|
$.onClick?.(e);
|
|
231
231
|
return;
|
|
@@ -240,11 +240,11 @@ const z = (r = 0) => {
|
|
|
240
240
|
B && "min-h-0 border-0 bg-transparent p-0",
|
|
241
241
|
Me && "aspect-video h-auto",
|
|
242
242
|
D && "relative",
|
|
243
|
-
|
|
243
|
+
s && "border-[#E4E4E7] pointer-events-none",
|
|
244
244
|
u.length > 0 && !B && "border-red-500",
|
|
245
245
|
Be && "bg-gray-100",
|
|
246
|
-
|
|
247
|
-
|
|
246
|
+
i && "shadow-none!",
|
|
247
|
+
i && o.length > 0 && !j && "p-0! shadow-none!",
|
|
248
248
|
j && "h-auto! max-h-none! min-h-0! p-2!",
|
|
249
249
|
ye && "h-64",
|
|
250
250
|
N && O && "border-[#E4E4E7] bg-[#F5F5F5] cursor-default pointer-events-none",
|
|
@@ -252,22 +252,22 @@ const z = (r = 0) => {
|
|
|
252
252
|
),
|
|
253
253
|
children: [
|
|
254
254
|
/* @__PURE__ */ t("input", { ...je() }),
|
|
255
|
-
p && /* @__PURE__ */
|
|
255
|
+
p && /* @__PURE__ */ r(
|
|
256
256
|
"div",
|
|
257
257
|
{
|
|
258
258
|
className: "w-full h-full min-h-46 rounded-lg border border-[#E4E4E7] bg-[#FCFCFC] flex flex-col items-center justify-center gap-4 p-4",
|
|
259
259
|
onClick: (e) => e.stopPropagation(),
|
|
260
260
|
children: [
|
|
261
|
-
/* @__PURE__ */
|
|
261
|
+
/* @__PURE__ */ r("div", { className: "relative h-24 w-24", children: [
|
|
262
262
|
/* @__PURE__ */ t("svg", { className: "h-24 w-24", viewBox: "0 0 100 100", children: /* @__PURE__ */ t("circle", { cx: "50", cy: "50", r: "42", stroke: "#E6E1F5", strokeWidth: "8", fill: "none" }) }),
|
|
263
|
-
/* @__PURE__ */
|
|
263
|
+
/* @__PURE__ */ r("span", { className: "absolute inset-0 flex items-center justify-center text-lg font-semibold text-foreground", children: [
|
|
264
264
|
Math.max(0, Math.min(100, Math.round(H))),
|
|
265
265
|
"%"
|
|
266
266
|
] })
|
|
267
267
|
] }),
|
|
268
|
-
/* @__PURE__ */
|
|
268
|
+
/* @__PURE__ */ r("div", { className: "text-center", children: [
|
|
269
269
|
/* @__PURE__ */ t("p", { className: "text-xl font-semibold text-foreground", children: Ne }),
|
|
270
|
-
/* @__PURE__ */
|
|
270
|
+
/* @__PURE__ */ r("p", { className: "text-sm text-[#666A78]", children: [
|
|
271
271
|
z(ue),
|
|
272
272
|
" ",
|
|
273
273
|
ve,
|
|
@@ -297,14 +297,14 @@ const z = (r = 0) => {
|
|
|
297
297
|
]
|
|
298
298
|
}
|
|
299
299
|
),
|
|
300
|
-
!p && D && /* @__PURE__ */
|
|
300
|
+
!p && D && /* @__PURE__ */ r(
|
|
301
301
|
"div",
|
|
302
302
|
{
|
|
303
303
|
className: "absolute inset-0 rounded-[8px] overflow-hidden",
|
|
304
304
|
onClick: (e) => e.stopPropagation(),
|
|
305
305
|
children: [
|
|
306
|
-
/* @__PURE__ */ t(
|
|
307
|
-
/* @__PURE__ */ t(
|
|
306
|
+
/* @__PURE__ */ t(le, { item: o[0], className: "rounded-[8px]" }),
|
|
307
|
+
!s && /* @__PURE__ */ t(
|
|
308
308
|
"div",
|
|
309
309
|
{
|
|
310
310
|
className: "absolute top-2 right-2 z-20 cursor-pointer bg-white/90 rounded-full p-1",
|
|
@@ -315,12 +315,12 @@ const z = (r = 0) => {
|
|
|
315
315
|
]
|
|
316
316
|
}
|
|
317
317
|
),
|
|
318
|
-
!p && (o.length === 0 || !
|
|
318
|
+
!p && (o.length === 0 || !i && _) && (u.length === 0 || !i) && /* @__PURE__ */ r(
|
|
319
319
|
"div",
|
|
320
320
|
{
|
|
321
321
|
className: x(
|
|
322
322
|
"flex flex-col items-center gap-2 w-full",
|
|
323
|
-
|
|
323
|
+
I?.idleWrapper,
|
|
324
324
|
D && "invisible"
|
|
325
325
|
),
|
|
326
326
|
children: [
|
|
@@ -329,20 +329,20 @@ const z = (r = 0) => {
|
|
|
329
329
|
{
|
|
330
330
|
className: x(
|
|
331
331
|
"flex size-12 items-center justify-center rounded-full bg-[#9368FF1F]",
|
|
332
|
-
N && "bg-[#EDEDF0]"
|
|
332
|
+
(N || s) && "bg-[#EDEDF0]"
|
|
333
333
|
),
|
|
334
334
|
children: /* @__PURE__ */ t(
|
|
335
335
|
We,
|
|
336
336
|
{
|
|
337
337
|
className: x(
|
|
338
338
|
"size-6 text-[#9368FF]",
|
|
339
|
-
N && "text-[#A1A1AA]"
|
|
339
|
+
(N || s) && "text-[#A1A1AA]"
|
|
340
340
|
)
|
|
341
341
|
}
|
|
342
342
|
)
|
|
343
343
|
}
|
|
344
344
|
),
|
|
345
|
-
/* @__PURE__ */ t("div", { className: "flex flex-col items-center gap-1 w-full", children: !
|
|
345
|
+
/* @__PURE__ */ t("div", { className: "flex flex-col items-center gap-1 w-full", children: !s && /* @__PURE__ */ r(V, { children: [
|
|
346
346
|
/* @__PURE__ */ t(
|
|
347
347
|
"span",
|
|
348
348
|
{
|
|
@@ -365,8 +365,8 @@ const z = (r = 0) => {
|
|
|
365
365
|
}
|
|
366
366
|
)
|
|
367
367
|
] }) }),
|
|
368
|
-
!
|
|
369
|
-
|
|
368
|
+
!s && /* @__PURE__ */ t(
|
|
369
|
+
it,
|
|
370
370
|
{
|
|
371
371
|
type: "button",
|
|
372
372
|
size: "md",
|
|
@@ -377,31 +377,31 @@ const z = (r = 0) => {
|
|
|
377
377
|
]
|
|
378
378
|
}
|
|
379
379
|
),
|
|
380
|
-
!p &&
|
|
381
|
-
/* @__PURE__ */
|
|
382
|
-
|
|
380
|
+
!p && i && u.length > 0 && !Z && /* @__PURE__ */ r("div", { className: x("w-full mt-4", I?.errorWrapper), children: [
|
|
381
|
+
/* @__PURE__ */ r("span", { className: "font-semibold text-red-500", children: [
|
|
382
|
+
de,
|
|
383
383
|
":"
|
|
384
384
|
] }),
|
|
385
|
-
/* @__PURE__ */ t("ul", { className: "mt-2 text-sm text-red-500 list-disc list-inside", children: u.map((e,
|
|
385
|
+
/* @__PURE__ */ t("ul", { className: "mt-2 text-sm text-red-500 list-disc list-inside", children: u.map((e, a) => /* @__PURE__ */ r("li", { children: [
|
|
386
386
|
e.file.name,
|
|
387
387
|
" (",
|
|
388
388
|
z(e.file.size),
|
|
389
389
|
")",
|
|
390
|
-
!
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
390
|
+
!m && /* @__PURE__ */ t("ul", { className: "ml-4 list-disc list-inside", children: e.errors.map((n, g) => /* @__PURE__ */ r("li", { children: [
|
|
391
|
+
n.code === "file-too-large" && k,
|
|
392
|
+
n.code === "file-invalid-type" && y,
|
|
393
|
+
n.code !== "file-too-large" && n.code !== "file-invalid-type" && n.message
|
|
394
394
|
] }, g)) })
|
|
395
|
-
] },
|
|
395
|
+
] }, a)) })
|
|
396
396
|
] }),
|
|
397
|
-
!p && !!(
|
|
397
|
+
!p && !!(i && o.length) && /* @__PURE__ */ t(V, { children: X ? /* @__PURE__ */ r(
|
|
398
398
|
"div",
|
|
399
399
|
{
|
|
400
400
|
className: "w-full max-w-[502px] flex flex-col items-center gap-4",
|
|
401
401
|
onClick: (e) => e.stopPropagation(),
|
|
402
402
|
children: [
|
|
403
403
|
/* @__PURE__ */ t("p", { className: "w-full text-center text-[16px] leading-[130%] font-semibold text-[#06080D]", children: R }),
|
|
404
|
-
/* @__PURE__ */
|
|
404
|
+
/* @__PURE__ */ r("div", { className: "w-full min-h-[72px] rounded-[8px] bg-[#F5F5F5] p-4 flex items-center gap-4", children: [
|
|
405
405
|
S ? /* @__PURE__ */ t(
|
|
406
406
|
"img",
|
|
407
407
|
{
|
|
@@ -410,11 +410,11 @@ const z = (r = 0) => {
|
|
|
410
410
|
className: "size-10 shrink-0"
|
|
411
411
|
}
|
|
412
412
|
) : /* @__PURE__ */ t("div", { className: "size-10 rounded-[8px] bg-[#DC2626] text-white flex items-center justify-center shrink-0", children: /* @__PURE__ */ t(ee, { size: 20 }) }),
|
|
413
|
-
/* @__PURE__ */
|
|
413
|
+
/* @__PURE__ */ r("div", { className: "flex flex-col items-start text-left gap-1 min-w-0 flex-1", children: [
|
|
414
414
|
/* @__PURE__ */ t("span", { className: "w-full text-[14px] font-semibold leading-[125%] text-[#06080D] truncate", children: W?.name || v?.name }),
|
|
415
415
|
/* @__PURE__ */ t("span", { className: "w-full text-[12px] font-medium leading-[120%] text-[#666A78]", children: z(W?.size || v?.size) })
|
|
416
416
|
] }),
|
|
417
|
-
!
|
|
417
|
+
!s && /* @__PURE__ */ t(
|
|
418
418
|
"div",
|
|
419
419
|
{
|
|
420
420
|
className: "size-6 flex items-center justify-center cursor-pointer",
|
|
@@ -431,23 +431,23 @@ const z = (r = 0) => {
|
|
|
431
431
|
item: o[0],
|
|
432
432
|
onRemoveClick: (e) => E(e, 0),
|
|
433
433
|
onReplaceClick: (e) => {
|
|
434
|
-
e.stopPropagation(), !
|
|
434
|
+
e.stopPropagation(), !s && K();
|
|
435
435
|
},
|
|
436
436
|
labelUploaded: fe,
|
|
437
437
|
labelReplace: pe,
|
|
438
438
|
fileInfo: W,
|
|
439
|
-
disabled:
|
|
439
|
+
disabled: s,
|
|
440
440
|
playerTranslations: Ce
|
|
441
441
|
}
|
|
442
442
|
) }),
|
|
443
|
-
!p && Z && /* @__PURE__ */
|
|
443
|
+
!p && Z && /* @__PURE__ */ r(
|
|
444
444
|
"div",
|
|
445
445
|
{
|
|
446
446
|
className: "w-full max-w-[502px] flex flex-col items-center gap-4",
|
|
447
447
|
onClick: (e) => e.stopPropagation(),
|
|
448
448
|
children: [
|
|
449
449
|
/* @__PURE__ */ t("p", { className: "w-full text-center text-[16px] leading-[130%] font-semibold text-[#06080D]", children: R }),
|
|
450
|
-
/* @__PURE__ */
|
|
450
|
+
/* @__PURE__ */ r("div", { className: "w-full min-h-[72px] rounded-[8px] bg-[#F5F5F5] p-4 flex items-center gap-4", children: [
|
|
451
451
|
S ? /* @__PURE__ */ t(
|
|
452
452
|
"img",
|
|
453
453
|
{
|
|
@@ -456,11 +456,11 @@ const z = (r = 0) => {
|
|
|
456
456
|
className: "size-10 shrink-0"
|
|
457
457
|
}
|
|
458
458
|
) : /* @__PURE__ */ t("div", { className: "size-10 rounded-[8px] bg-[#DC2626] text-white flex items-center justify-center shrink-0", children: /* @__PURE__ */ t(ee, { size: 20 }) }),
|
|
459
|
-
/* @__PURE__ */
|
|
459
|
+
/* @__PURE__ */ r("div", { className: "flex flex-col items-start text-left gap-1 min-w-0 flex-1", children: [
|
|
460
460
|
/* @__PURE__ */ t("span", { className: "w-full text-[14px] font-semibold leading-[125%] text-[#06080D] truncate", children: v?.name }),
|
|
461
461
|
/* @__PURE__ */ t("span", { className: "w-full text-[12px] font-medium leading-[120%] text-[#666A78]", children: v ? `${(v.size / (1024 * 1024)).toFixed(0)} MB` : "" })
|
|
462
462
|
] }),
|
|
463
|
-
!
|
|
463
|
+
!s && /* @__PURE__ */ t(
|
|
464
464
|
"div",
|
|
465
465
|
{
|
|
466
466
|
className: "size-6 flex items-center justify-center cursor-pointer",
|
|
@@ -471,7 +471,7 @@ const z = (r = 0) => {
|
|
|
471
471
|
}
|
|
472
472
|
)
|
|
473
473
|
] }),
|
|
474
|
-
/* @__PURE__ */
|
|
474
|
+
/* @__PURE__ */ r("div", { className: "w-full bg-[#DC26260F] p-4 flex items-start gap-4", children: [
|
|
475
475
|
/* @__PURE__ */ t(te, { size: 20, color: "#DC2626" }),
|
|
476
476
|
/* @__PURE__ */ t("p", { className: "text-[12px] leading-[120%] font-medium text-[#DC2626] text-left", children: u[0]?.errors?.[0]?.code === "file-too-large" ? k : u[0]?.errors?.[0]?.message || y })
|
|
477
477
|
] })
|
|
@@ -483,26 +483,26 @@ const z = (r = 0) => {
|
|
|
483
483
|
}
|
|
484
484
|
),
|
|
485
485
|
O && /* @__PURE__ */ t("div", { className: "w-full", children: U }),
|
|
486
|
-
!p && !
|
|
486
|
+
!p && !i && u.length > 0 && /* @__PURE__ */ t(
|
|
487
487
|
"div",
|
|
488
488
|
{
|
|
489
|
-
className: x("w-full mt-4 flex flex-col gap-2",
|
|
490
|
-
children: u.map((e,
|
|
491
|
-
const
|
|
492
|
-
return /* @__PURE__ */
|
|
489
|
+
className: x("w-full mt-4 flex flex-col gap-2", I?.errorWrapper),
|
|
490
|
+
children: u.map((e, a) => {
|
|
491
|
+
const n = e.errors[0], g = n?.code === "file-too-large" ? k : n?.code === "file-invalid-type" ? y : n?.message || y;
|
|
492
|
+
return /* @__PURE__ */ r(
|
|
493
493
|
"div",
|
|
494
494
|
{
|
|
495
495
|
className: "w-full bg-[#DC26260F] p-4 flex items-start gap-4 rounded-[8px]",
|
|
496
496
|
children: [
|
|
497
497
|
/* @__PURE__ */ t(te, { size: 20, color: "#DC2626", className: "shrink-0" }),
|
|
498
|
-
/* @__PURE__ */
|
|
498
|
+
/* @__PURE__ */ r("p", { className: "text-[12px] leading-[120%] font-medium text-[#DC2626] text-left", children: [
|
|
499
499
|
/* @__PURE__ */ t("span", { className: "font-semibold", children: e.file.name }),
|
|
500
500
|
" — ",
|
|
501
501
|
g
|
|
502
502
|
] })
|
|
503
503
|
]
|
|
504
504
|
},
|
|
505
|
-
|
|
505
|
+
a
|
|
506
506
|
);
|
|
507
507
|
})
|
|
508
508
|
}
|
|
@@ -510,8 +510,8 @@ const z = (r = 0) => {
|
|
|
510
510
|
] });
|
|
511
511
|
}
|
|
512
512
|
);
|
|
513
|
-
|
|
513
|
+
mt.displayName = "Dropzone";
|
|
514
514
|
export {
|
|
515
|
-
|
|
515
|
+
mt as Dropzone
|
|
516
516
|
};
|
|
517
517
|
//# sourceMappingURL=Dropzone.js.map
|
package/Dropzone/Dropzone.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dropzone.js","sources":["../../src/Dropzone/Dropzone.tsx"],"sourcesContent":["import { FileTextIcon, InfoIcon, Plus, UploadIcon, X } from 'lucide-react';\r\nimport { forwardRef, useEffect, useImperativeHandle, useState } from 'react';\r\nimport { FileRejection, useDropzone } from 'react-dropzone';\r\n\r\nimport { cn } from '@oneplatformdev/utils';\r\n\r\nimport { Card } from '../Card/Card';\r\n\r\nimport {\r\n DEFAULT_FILE_TYPES,\r\n DropzoneControl,\r\n DropzoneProps,\r\n DropzoneValueItem\r\n} from './Dropzone.types';\r\nimport { DropzoneCoverPreview } from './DropzoneCoverPreview';\r\nimport { DropzoneFileCard } from './DropzoneFileCard';\r\nimport { FilePreview } from './DropzoneFilePreview';\r\nimport { DropzoneSinglePickPreview } from './DropzoneSinglePickPreview';\r\nimport { extractName, isFile, isVideoUrl } from './DropzoneUtils';\r\nimport { Button } from \"../Button\";\r\nimport fileCsvIcon from './icons/file-csv.svg';\r\nimport fileDocIcon from './icons/file-doc.svg';\r\nimport fileDocxIcon from './icons/file-docx.svg';\r\nimport fileJpgIcon from './icons/file-jpg.svg';\r\nimport filePdfIcon from './icons/file-pdf.svg';\r\nimport filePngIcon from './icons/file-png.svg';\r\nimport filePptIcon from './icons/file-ppt.svg';\r\nimport filePptxIcon from './icons/file-pptx.svg';\r\nimport fileRarIcon from './icons/file-rar.svg';\r\nimport fileSvgIcon from './icons/file-svg.svg';\r\nimport fileWebpIcon from './icons/file-webp.svg';\r\nimport fileXlsIcon from './icons/file-xls.svg';\r\nimport fileXlsxIcon from './icons/file-xlsx.svg';\r\nimport fileZipIcon from './icons/file-zip.svg';\r\n\r\nconst formatFileSize = (bytes = 0): string => {\r\n if (!bytes || bytes < 0) return '0 KB';\r\n const KB = 1024;\r\n const MB = KB * 1024;\r\n const GB = MB * 1024;\r\n if (bytes >= GB) return `${(bytes / GB).toFixed(2)} GB`;\r\n if (bytes >= MB) {\r\n const mb = bytes / MB;\r\n return `${mb >= 100 ? mb.toFixed(0) : mb.toFixed(2)} MB`;\r\n }\r\n if (bytes >= KB) return `${(bytes / KB).toFixed(bytes / KB >= 100 ? 0 : 1)} KB`;\r\n return `${bytes} B`;\r\n};\r\nconst FILE_EXT_ICON_MAP: Record<string, string> = {\r\n csv: fileCsvIcon,\r\n doc: fileDocIcon,\r\n docx: fileDocxIcon,\r\n jpg: fileJpgIcon,\r\n jpeg: fileJpgIcon,\r\n pdf: filePdfIcon,\r\n png: filePngIcon,\r\n ppt: filePptIcon,\r\n pptx: filePptxIcon,\r\n rar: fileRarIcon,\r\n svg: fileSvgIcon,\r\n webp: fileWebpIcon,\r\n xls: fileXlsIcon,\r\n xlsx: fileXlsxIcon,\r\n zip: fileZipIcon,\r\n};\r\n\r\nconst getFileExtension = (fileName?: string) => {\r\n if (!fileName) return '';\r\n const parts = fileName.toLowerCase().split('.');\r\n return parts.length > 1 ? parts[parts.length - 1] : '';\r\n};\r\n\r\nconst getFileTypeIconByName = (fileName?: string) => {\r\n const extension = getFileExtension(fileName);\r\n return FILE_EXT_ICON_MAP[extension] ?? null;\r\n};\r\nconst areItemsEqual = (a: DropzoneValueItem[], b: DropzoneValueItem[]) => {\r\n if (a === b) return true;\r\n if (a.length !== b.length) return false;\r\n\r\n for (let i = 0; i < a.length; i++) {\r\n const left = a[i];\r\n const right = b[i];\r\n\r\n if (left === right) continue;\r\n\r\n if (typeof left === 'string' && typeof right === 'string') {\r\n if (left !== right) return false;\r\n continue;\r\n }\r\n\r\n if (isFile(left) && isFile(right)) {\r\n if (\r\n left.name !== right.name ||\r\n left.size !== right.size ||\r\n left.type !== right.type ||\r\n left.lastModified !== right.lastModified\r\n ) {\r\n return false;\r\n }\r\n continue;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n return true;\r\n};\r\n\r\n/**\r\n * Dropzone component - A drag-and-drop file upload area with image previews, error handling, and localization.\r\n *\r\n * @component\r\n * @param {DropzoneProps} props - The props for the Dropzone component.\r\n * @param {string[]} [props.acceptTypes=DEFAULT_FILE_TYPES] - Allowed file MIME types.\r\n * @param {number} props.maxSizeMB - Maximum allowed file size in megabytes.\r\n * @param {number} [props.maxFiles=1] - Maximum number of files that can be uploaded.\r\n * @param {DropzoneTranslations} props.translations - Translations for text labels.\r\n * @param {(errors: FileRejection[]) => void} [props.onErrors] - Callback triggered when file errors occur.\r\n * @param {boolean} [props.hideErrors=false] - Whether to hide error messages.\r\n * @param {boolean} [props.disabled=false] - Whether the dropzone is disabled.\r\n * @param {DropzoneStyles} [props.classNames] - Custom classNames for different dropzone states.\r\n * @param {DropzoneValueItem[]} [props.value=[]] - Current selected files or URLs.\r\n * @param {(items: DropzoneValueItem[]) => void} [props.onChangeValue] - Callback triggered when file selection changes.\r\n * @param {string} [props.className] - Additional class names for styling.\r\n * @param {React.Ref<HTMLDivElement>} ref - Ref for the root dropzone container.\r\n * @returns {JSX.Element} The rendered Dropzone component.\r\n */\r\nexport const Dropzone = forwardRef<DropzoneControl, DropzoneProps>(\r\n (\r\n {\r\n acceptTypes = DEFAULT_FILE_TYPES,\r\n maxSizeMB,\r\n maxFiles = 1,\r\n onErrors,\r\n hideErrors = false,\r\n disabled = false,\r\n classNames,\r\n value,\r\n onChangeValue,\r\n className,\r\n labelDropzonePrompt = 'Drop files here or click to select',\r\n labelDropzoneSubPrompt = '',\r\n labelOrClickToSelect = 'Upload file',\r\n labelSelectedFiles = 'Selected Files',\r\n labelUploadErrors = 'Upload Errors',\r\n labelFileTooLarge = 'File is too large',\r\n labelInvalidFileType = 'Invalid file type',\r\n labelVideoUploaded = 'Uploaded',\r\n labelVideoReplace = 'Replace',\r\n singlePick = false,\r\n labelDropzoneClassname,\r\n labelDropzoneSubClassname,\r\n isUploading = false,\r\n uploadProgress = 0,\r\n uploadLoadedBytes = 0,\r\n uploadTotalBytes = 0,\r\n onCancelUpload,\r\n labelUploadingTitle = 'Uploading video...',\r\n labelUploadingHint = 'Please do not close this page',\r\n labelUploadingActionCancel = 'Cancel',\r\n labelUploadingOf = 'of',\r\n playerTranslations,\r\n singlePickFileInfo,\r\n persistentDropzone = false,\r\n previewVariant = 'default',\r\n coverFirstItem = false,\r\n ...restProps\r\n },\r\n ref\r\n ) => {\r\n const [items, setItems] = useState<DropzoneValueItem[]>(value ?? []);\r\n const [fileErrors, setFileErrors] = useState<FileRejection[]>([]);\r\n const firstItem = items[0];\r\n const firstRejectedFile = fileErrors[0]?.file;\r\n const isRejectedImage = Boolean(firstRejectedFile?.type?.includes('image'));\r\n const isSingleFile = singlePick && items.length > 0 && isFile(firstItem);\r\n const isSingleImage = isSingleFile && firstItem.type.includes('image');\r\n const isSingleVideo =\r\n (isSingleFile && firstItem.type.includes('video')) ||\r\n (singlePick && items.length > 0 && typeof firstItem === 'string' && isVideoUrl(firstItem));\r\n const isSingleDocument = isSingleFile && !isSingleImage && !isSingleVideo;\r\n const hasRejectedSingleFile = singlePick && !items.length && Boolean(firstRejectedFile);\r\n const hasRejectedSingleDocumentFile = hasRejectedSingleFile && !isRejectedImage;\r\n const singleFileCard = isSingleDocument ? firstItem : firstRejectedFile;\r\n const singleFileCardIcon = getFileTypeIconByName(singleFileCard?.name);\r\n const hasSingleVideoPreview =\r\n singlePick && isSingleVideo;\r\n const shouldBlockRootOpen = hasSingleVideoPreview;\r\n const isContentPreviewMode = singlePick && items.length > 0;\r\n const isSingleImagePreview =\r\n isContentPreviewMode && !isSingleDocument && !hasSingleVideoPreview;\r\n\r\n // Тільки для мультизавантаження списком (file-list): коли набрали ліміт —\r\n // робимо зону неактивною й сірою (картки нижче лишаються інтерактивними).\r\n const isFileListLimitReached =\r\n previewVariant === 'file-list' && !singlePick && items.length >= maxFiles;\r\n\r\n const onDrop = (acceptedFiles: File[], fileRejections: FileRejection[]) => {\r\n setFileErrors(fileRejections);\r\n onErrors?.(fileRejections);\r\n\r\n const newItems = singlePick\r\n ? acceptedFiles.slice(0, 1)\r\n : [...items, ...acceptedFiles].slice(0, maxFiles);\r\n\r\n setItems(newItems);\r\n onChangeValue?.(newItems);\r\n };\r\n\r\n useEffect(() => {\r\n if (value && !areItemsEqual(items, value)) {\r\n setItems(value);\r\n }\r\n }, [items, value]);\r\n\r\n const removeItem = (\r\n event: React.MouseEvent<HTMLDivElement>,\r\n index: number\r\n ) => {\r\n if (disabled) return;\r\n event.stopPropagation();\r\n\r\n const newItems = items.filter((_, i) => i !== index);\r\n setItems(newItems);\r\n onChangeValue?.(newItems);\r\n };\r\n\r\n const { getRootProps, getInputProps, isDragActive, open } = useDropzone({\r\n onDrop,\r\n accept: acceptTypes.reduce((acc, fileType) => {\r\n acc[fileType] = [];\r\n return acc;\r\n }, {} as Record<string, string[]>),\r\n maxSize: maxSizeMB * 1024 * 1024,\r\n maxFiles: singlePick ? 1 : maxFiles,\r\n disabled: disabled || isUploading || isFileListLimitReached,\r\n noClick: true,\r\n });\r\n\r\n useImperativeHandle(ref, () => {\r\n return {\r\n setItems,\r\n };\r\n }, []);\r\n\r\n const isCoverMode =\r\n coverFirstItem && previewVariant === 'image-grid' && !singlePick && items.length > 0;\r\n\r\n const shouldRenderDetachedPreview =\r\n !isUploading && !singlePick && persistentDropzone && items.length > 0;\r\n\r\n const restItemsForGrid = isCoverMode ? items.slice(1) : items;\r\n\r\n const showAddMoreTile =\r\n !disabled &&\r\n !singlePick &&\r\n previewVariant === 'image-grid' &&\r\n items.length > 0 &&\r\n items.length < maxFiles;\r\n\r\n // For multi image selection (image-grid) keep the drop area at a 16:9 ratio.\r\n // Use aspect-ratio (not a fixed height) so it follows whatever width the\r\n // consumer sets via className. Skipped when previews fill the card.\r\n const isImageGridDropArea =\r\n !singlePick &&\r\n previewVariant === 'image-grid' &&\r\n (persistentDropzone || items.length === 0);\r\n\r\n const previewBlock =\r\n !isUploading &&\r\n !singlePick &&\r\n (restItemsForGrid.length > 0 || showAddMoreTile) && (\r\n <div className={cn('w-full mt-2', classNames?.previewWrapper)}>\r\n {previewVariant === 'default' && (\r\n <pre className=\"font-semibold text-gray-600\">\r\n {labelSelectedFiles}:\r\n </pre>\r\n )}\r\n {previewVariant === 'file-list' ? (\r\n <div className=\"mt-2 flex flex-col gap-2\">\r\n {restItemsForGrid.map((item, index) => {\r\n const fileName = isFile(item) ? item.name : extractName(item);\r\n const sizeLabel = isFile(item) ? formatFileSize(item.size) : '';\r\n return (\r\n <DropzoneFileCard\r\n key={index}\r\n name={fileName}\r\n sizeLabel={sizeLabel}\r\n iconSrc={getFileTypeIconByName(fileName)}\r\n disabled={disabled}\r\n onRemove={(event) => removeItem(event, index)}\r\n />\r\n );\r\n })}\r\n </div>\r\n ) : (\r\n <ul\r\n className={cn(\r\n 'mt-2 text-sm text-gray-500 flex flex-wrap items-start',\r\n previewVariant === 'image-grid'\r\n ? 'gap-2 justify-start'\r\n : 'gap-4 justify-center'\r\n )}\r\n >\r\n {restItemsForGrid.map((item, gridIndex) => {\r\n const index = isCoverMode ? gridIndex + 1 : gridIndex;\r\n const fileName = isFile(item) ? item.name : extractName(item);\r\n const fileSize = isFile(item) ? formatFileSize(item.size) : '';\r\n\r\n return (\r\n <li\r\n key={index}\r\n className={cn(\r\n 'relative',\r\n previewVariant === 'image-grid'\r\n ? 'w-[75px] h-[75px]'\r\n : 'flex flex-col items-center gap-2'\r\n )}\r\n >\r\n <div className=\"relative w-full h-full\">\r\n {previewVariant === 'image-grid' ? (\r\n <DropzoneCoverPreview item={item} className=\"rounded-[8px]\" />\r\n ) : (\r\n <FilePreview item={item} styles={classNames} />\r\n )}\r\n <div\r\n className={cn(\r\n 'absolute top-0 right-0 z-20 cursor-pointer bg-gray-300 rounded-sm',\r\n previewVariant === 'image-grid' && 'top-1 right-1 bg-white/90 rounded-full p-0.5'\r\n )}\r\n onClick={(event) => removeItem(event, index)}\r\n >\r\n <X size={16} strokeWidth={1} color=\"black\" />\r\n </div>\r\n </div>\r\n {previewVariant === 'default' && (\r\n <span className=\"inline-flex flex-col items-center\">\r\n <span className=\"max-w-[80px] text-ellipsis overflow-hidden whitespace-nowrap\">\r\n {fileName}\r\n </span>\r\n {fileSize && <span>({fileSize})</span>}\r\n </span>\r\n )}\r\n </li>\r\n );\r\n })}\r\n {showAddMoreTile && (\r\n <li\r\n key=\"add-more\"\r\n className=\"relative w-[75px] h-[75px] flex items-center justify-center rounded-[8px] border border-dashed border-[#9368FF80] bg-[#FCFCFC] cursor-pointer hover:bg-[#9368FF0F]\"\r\n onClick={(event) => {\r\n event.stopPropagation();\r\n if (disabled || isUploading) return;\r\n open();\r\n }}\r\n >\r\n <div className=\"flex size-6 items-center justify-center rounded-full bg-[#9368FF1F]\">\r\n <Plus size={16} className=\"text-[#9368FF]\" />\r\n </div>\r\n </li>\r\n )}\r\n </ul>\r\n )}\r\n </div>\r\n );\r\n\r\n return (\r\n <div className=\"w-full select-none\">\r\n <Card\r\n {...restProps}\r\n {...getRootProps({\r\n onClick: (event) => {\r\n if (disabled || isUploading || isFileListLimitReached) return;\r\n if (shouldBlockRootOpen) {\r\n restProps.onClick?.(event);\r\n return;\r\n }\r\n open();\r\n restProps.onClick?.(event);\r\n },\r\n })}\r\n className={cn(\r\n `w-full text-center flex flex-col items-center justify-center gap-6 cursor-pointer`,\r\n !isContentPreviewMode &&\r\n 'border border-dashed border-[#9368FF80] rounded-[8px] bg-[#FCFCFC] p-4',\r\n isContentPreviewMode && 'min-h-0 border-0 bg-transparent p-0',\r\n isImageGridDropArea && 'aspect-video h-auto',\r\n isCoverMode && 'relative',\r\n disabled && 'border-[#E4E4E7] pointer-events-none',\r\n fileErrors.length > 0 && !isContentPreviewMode && 'border-red-500',\r\n isDragActive && 'bg-gray-100',\r\n singlePick && 'shadow-none!',\r\n singlePick && items.length > 0 && !hasSingleVideoPreview && 'p-0! shadow-none!',\r\n hasSingleVideoPreview && 'h-auto! max-h-none! min-h-0! p-2!',\r\n isSingleImagePreview && 'h-64',\r\n isFileListLimitReached &&\r\n shouldRenderDetachedPreview &&\r\n 'border-[#E4E4E7] bg-[#F5F5F5] cursor-default pointer-events-none',\r\n className\r\n )}\r\n >\r\n <input {...getInputProps()} />\r\n\r\n {isUploading && (\r\n <div\r\n className=\"w-full h-full min-h-46 rounded-lg border border-[#E4E4E7] bg-[#FCFCFC] flex flex-col items-center justify-center gap-4 p-4\"\r\n onClick={(event) => event.stopPropagation()}\r\n >\r\n <div className=\"relative h-24 w-24\">\r\n <svg className=\"h-24 w-24\" viewBox=\"0 0 100 100\">\r\n <circle cx=\"50\" cy=\"50\" r=\"42\" stroke=\"#E6E1F5\" strokeWidth=\"8\" fill=\"none\" />\r\n </svg>\r\n <span className=\"absolute inset-0 flex items-center justify-center text-lg font-semibold text-foreground\">\r\n {Math.max(0, Math.min(100, Math.round(uploadProgress)))}%\r\n </span>\r\n </div>\r\n\r\n <div className=\"text-center\">\r\n <p className=\"text-xl font-semibold text-foreground\">{labelUploadingTitle}</p>\r\n <p className=\"text-sm text-[#666A78]\">\r\n {formatFileSize(uploadLoadedBytes)} {labelUploadingOf} {formatFileSize(uploadTotalBytes)}\r\n </p>\r\n <p className=\"mt-2 text-sm text-[#666A78]\">{labelUploadingHint}</p>\r\n </div>\r\n\r\n <div className=\"w-full max-w-[520px] h-2 rounded-full bg-[#E6E1F5] overflow-hidden\">\r\n <div\r\n className=\"h-full bg-[#9368FF] transition-[width] duration-150 ease-linear\"\r\n style={{ width: `${Math.max(0, Math.min(100, uploadProgress))}%` }}\r\n />\r\n </div>\r\n\r\n {onCancelUpload && (\r\n <button\r\n type=\"button\"\r\n className=\"mt-1 h-10 min-w-36 rounded-md border border-[#E4E4E7] bg-white px-6 text-base font-medium text-foreground cursor-pointer\"\r\n onClick={(event) => {\r\n event.stopPropagation();\r\n onCancelUpload();\r\n }}\r\n >\r\n {labelUploadingActionCancel}\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n\r\n {!isUploading && isCoverMode && (\r\n <div\r\n className=\"absolute inset-0 rounded-[8px] overflow-hidden\"\r\n onClick={(event) => event.stopPropagation()}\r\n >\r\n <DropzoneCoverPreview item={items[0]} className=\"rounded-[8px]\" />\r\n <div\r\n className=\"absolute top-2 right-2 z-20 cursor-pointer bg-white/90 rounded-full p-1\"\r\n onClick={(event) => removeItem(event, 0)}\r\n >\r\n <X size={16} strokeWidth={1} color=\"black\" />\r\n </div>\r\n </div>\r\n )}\r\n\r\n {!isUploading &&\r\n (items.length === 0 || (!singlePick && persistentDropzone)) &&\r\n (fileErrors.length === 0 || !singlePick) && (\r\n <div\r\n className={cn(\r\n 'flex flex-col items-center gap-2 w-full',\r\n classNames?.idleWrapper,\r\n isCoverMode && 'invisible',\r\n )}\r\n >\r\n <div\r\n className={cn(\r\n 'flex size-12 items-center justify-center rounded-full bg-[#9368FF1F]',\r\n isFileListLimitReached && 'bg-[#EDEDF0]'\r\n )}\r\n >\r\n <UploadIcon\r\n className={cn(\r\n 'size-6 text-[#9368FF]',\r\n isFileListLimitReached && 'text-[#A1A1AA]'\r\n )}\r\n />\r\n </div>\r\n\r\n <div className=\"flex flex-col items-center gap-1 w-full\">\r\n {!disabled && (\r\n <>\r\n <span\r\n className={cn(\r\n \"font-semibold text-[14px] leading-[125%] text-[#06080D] text-center w-full whitespace-pre-line\",\r\n isFileListLimitReached && 'text-[#A1A1AA]',\r\n labelDropzoneClassname\r\n )}\r\n >\r\n {labelDropzonePrompt}\r\n </span>\r\n\r\n <span\r\n className={cn(\r\n \"font-medium text-[12px] leading-[120%] text-[#666A78] text-center w-full whitespace-pre-line\",\r\n labelDropzoneSubClassname\r\n )}\r\n >\r\n {labelDropzoneSubPrompt}\r\n </span>\r\n </>\r\n )}\r\n </div>\r\n\r\n {!disabled && (\r\n <Button\r\n type=\"button\"\r\n size=\"md\"\r\n disabled={isFileListLimitReached}\r\n >\r\n {labelOrClickToSelect}\r\n </Button>\r\n )}\r\n </div>\r\n )}\r\n\r\n {!isUploading && singlePick && fileErrors.length > 0 && !hasRejectedSingleDocumentFile && (\r\n <div className={cn('w-full mt-4', classNames?.errorWrapper)}>\r\n <span className=\"font-semibold text-red-500\">\r\n {labelUploadErrors}:\r\n </span>\r\n <ul className=\"mt-2 text-sm text-red-500 list-disc list-inside\">\r\n {fileErrors.map((fileRejection, index) => (\r\n <li key={index}>\r\n {fileRejection.file.name} (\r\n {formatFileSize(fileRejection.file.size)})\r\n {!hideErrors && (\r\n <ul className=\"ml-4 list-disc list-inside\">\r\n {fileRejection.errors.map((error, errorIndex) => (\r\n <li key={errorIndex}>\r\n {error.code === 'file-too-large' && labelFileTooLarge}\r\n {error.code === 'file-invalid-type' &&\r\n labelInvalidFileType}\r\n {error.code !== 'file-too-large' &&\r\n error.code !== 'file-invalid-type' &&\r\n error.message}\r\n </li>\r\n ))}\r\n </ul>\r\n )}\r\n </li>\r\n ))}\r\n </ul>\r\n </div>\r\n )}\r\n\r\n {!isUploading && Boolean(singlePick && items.length) && (\r\n <>\r\n {isSingleDocument ? (\r\n <div\r\n className=\"w-full max-w-[502px] flex flex-col items-center gap-4\"\r\n onClick={(event) => event.stopPropagation()}\r\n >\r\n <p className=\"w-full text-center text-[16px] leading-[130%] font-semibold text-[#06080D]\">\r\n {labelDropzonePrompt}\r\n </p>\r\n\r\n <div className=\"w-full min-h-[72px] rounded-[8px] bg-[#F5F5F5] p-4 flex items-center gap-4\">\r\n {singleFileCardIcon ? (\r\n <img\r\n src={singleFileCardIcon}\r\n alt=\"\"\r\n className=\"size-10 shrink-0\"\r\n />\r\n ) : (\r\n <div className=\"size-10 rounded-[8px] bg-[#DC2626] text-white flex items-center justify-center shrink-0\">\r\n <FileTextIcon size={20} />\r\n </div>\r\n )}\r\n <div className=\"flex flex-col items-start text-left gap-1 min-w-0 flex-1\">\r\n <span className=\"w-full text-[14px] font-semibold leading-[125%] text-[#06080D] truncate\">\r\n {singlePickFileInfo?.name || singleFileCard?.name}\r\n </span>\r\n <span className=\"w-full text-[12px] font-medium leading-[120%] text-[#666A78]\">\r\n {formatFileSize(singlePickFileInfo?.size || singleFileCard?.size)}\r\n </span>\r\n </div>\r\n {!disabled && (\r\n <div\r\n className=\"size-6 flex items-center justify-center cursor-pointer\"\r\n onClick={(event) => removeItem(event, 0)}\r\n >\r\n <X size={24} color=\"#06080D\" />\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n ) : (\r\n <DropzoneSinglePickPreview\r\n item={items[0]}\r\n onRemoveClick={(e) => removeItem(e, 0)}\r\n onReplaceClick={(e) => {\r\n e.stopPropagation();\r\n if (disabled) return;\r\n open();\r\n }}\r\n labelUploaded={labelVideoUploaded}\r\n labelReplace={labelVideoReplace}\r\n fileInfo={singlePickFileInfo}\r\n disabled={disabled}\r\n playerTranslations={playerTranslations}\r\n />\r\n )}\r\n </>\r\n )}\r\n\r\n {!isUploading && hasRejectedSingleDocumentFile && (\r\n <div\r\n className=\"w-full max-w-[502px] flex flex-col items-center gap-4\"\r\n onClick={(event) => event.stopPropagation()}\r\n >\r\n <p className=\"w-full text-center text-[16px] leading-[130%] font-semibold text-[#06080D]\">\r\n {labelDropzonePrompt}\r\n </p>\r\n\r\n <div className=\"w-full min-h-[72px] rounded-[8px] bg-[#F5F5F5] p-4 flex items-center gap-4\">\r\n {singleFileCardIcon ? (\r\n <img\r\n src={singleFileCardIcon}\r\n alt=\"\"\r\n className=\"size-10 shrink-0\"\r\n />\r\n ) : (\r\n <div className=\"size-10 rounded-[8px] bg-[#DC2626] text-white flex items-center justify-center shrink-0\">\r\n <FileTextIcon size={20} />\r\n </div>\r\n )}\r\n <div className=\"flex flex-col items-start text-left gap-1 min-w-0 flex-1\">\r\n <span className=\"w-full text-[14px] font-semibold leading-[125%] text-[#06080D] truncate\">\r\n {singleFileCard?.name}\r\n </span>\r\n <span className=\"w-full text-[12px] font-medium leading-[120%] text-[#666A78]\">\r\n {singleFileCard\r\n ? `${(singleFileCard.size / (1024 * 1024)).toFixed(0)} MB`\r\n : ''}\r\n </span>\r\n </div>\r\n {!disabled && (\r\n <div\r\n className=\"size-6 flex items-center justify-center cursor-pointer\"\r\n onClick={(event) => {\r\n event.stopPropagation();\r\n setFileErrors([]);\r\n }}\r\n >\r\n <X size={24} color=\"#06080D\" />\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div className=\"w-full bg-[#DC26260F] p-4 flex items-start gap-4\">\r\n <InfoIcon size={20} color=\"#DC2626\" />\r\n <p className=\"text-[12px] leading-[120%] font-medium text-[#DC2626] text-left\">\r\n {fileErrors[0]?.errors?.[0]?.code === 'file-too-large'\r\n ? labelFileTooLarge\r\n : fileErrors[0]?.errors?.[0]?.message || labelInvalidFileType}\r\n </p>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {!shouldRenderDetachedPreview && previewBlock}\r\n </Card>\r\n {shouldRenderDetachedPreview && <div className=\"w-full\">{previewBlock}</div>}\r\n {!isUploading && !singlePick && fileErrors.length > 0 && (\r\n <div\r\n className={cn('w-full mt-4 flex flex-col gap-2', classNames?.errorWrapper)}\r\n >\r\n {fileErrors.map((fileRejection, index) => {\r\n const firstError = fileRejection.errors[0];\r\n const errorText =\r\n firstError?.code === 'file-too-large'\r\n ? labelFileTooLarge\r\n : firstError?.code === 'file-invalid-type'\r\n ? labelInvalidFileType\r\n : firstError?.message || labelInvalidFileType;\r\n\r\n return (\r\n <div\r\n key={index}\r\n className=\"w-full bg-[#DC26260F] p-4 flex items-start gap-4 rounded-[8px]\"\r\n >\r\n <InfoIcon size={20} color=\"#DC2626\" className=\"shrink-0\" />\r\n <p className=\"text-[12px] leading-[120%] font-medium text-[#DC2626] text-left\">\r\n <span className=\"font-semibold\">{fileRejection.file.name}</span>\r\n {' — '}\r\n {errorText}\r\n </p>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nDropzone.displayName = 'Dropzone';\r\n\r\n"],"names":["formatFileSize","bytes","KB","MB","GB","mb","FILE_EXT_ICON_MAP","fileCsvIcon","fileDocIcon","fileDocxIcon","fileJpgIcon","filePdfIcon","filePngIcon","filePptIcon","filePptxIcon","fileRarIcon","fileSvgIcon","fileWebpIcon","fileXlsIcon","fileXlsxIcon","fileZipIcon","getFileExtension","fileName","parts","getFileTypeIconByName","extension","areItemsEqual","a","b","i","left","right","isFile","Dropzone","forwardRef","acceptTypes","DEFAULT_FILE_TYPES","maxSizeMB","maxFiles","onErrors","hideErrors","disabled","classNames","value","onChangeValue","className","labelDropzonePrompt","labelDropzoneSubPrompt","labelOrClickToSelect","labelSelectedFiles","labelUploadErrors","labelFileTooLarge","labelInvalidFileType","labelVideoUploaded","labelVideoReplace","singlePick","labelDropzoneClassname","labelDropzoneSubClassname","isUploading","uploadProgress","uploadLoadedBytes","uploadTotalBytes","onCancelUpload","labelUploadingTitle","labelUploadingHint","labelUploadingActionCancel","labelUploadingOf","playerTranslations","singlePickFileInfo","persistentDropzone","previewVariant","coverFirstItem","restProps","ref","items","setItems","useState","fileErrors","setFileErrors","firstItem","firstRejectedFile","isRejectedImage","isSingleFile","isSingleImage","isSingleVideo","isVideoUrl","isSingleDocument","hasRejectedSingleDocumentFile","singleFileCard","singleFileCardIcon","hasSingleVideoPreview","shouldBlockRootOpen","isContentPreviewMode","isSingleImagePreview","isFileListLimitReached","onDrop","acceptedFiles","fileRejections","newItems","useEffect","removeItem","event","index","_","getRootProps","getInputProps","isDragActive","open","useDropzone","acc","fileType","useImperativeHandle","isCoverMode","shouldRenderDetachedPreview","restItemsForGrid","showAddMoreTile","isImageGridDropArea","previewBlock","jsxs","cn","jsx","item","extractName","sizeLabel","DropzoneFileCard","gridIndex","fileSize","DropzoneCoverPreview","FilePreview","X","Plus","Card","UploadIcon","Fragment","Button","fileRejection","error","errorIndex","FileTextIcon","DropzoneSinglePickPreview","InfoIcon","firstError","errorText"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Dropzone.js","sources":["../../src/Dropzone/Dropzone.tsx"],"sourcesContent":["import { FileTextIcon, InfoIcon, Plus, UploadIcon, X } from 'lucide-react';\r\nimport { forwardRef, useEffect, useImperativeHandle, useState } from 'react';\r\nimport { FileRejection, useDropzone } from 'react-dropzone';\r\n\r\nimport { cn } from '@oneplatformdev/utils';\r\n\r\nimport { Card } from '../Card/Card';\r\n\r\nimport {\r\n DEFAULT_FILE_TYPES,\r\n DropzoneControl,\r\n DropzoneProps,\r\n DropzoneValueItem\r\n} from './Dropzone.types';\r\nimport { DropzoneCoverPreview } from './DropzoneCoverPreview';\r\nimport { DropzoneFileCard } from './DropzoneFileCard';\r\nimport { FilePreview } from './DropzoneFilePreview';\r\nimport { DropzoneSinglePickPreview } from './DropzoneSinglePickPreview';\r\nimport { extractName, isFile, isVideoUrl } from './DropzoneUtils';\r\nimport { Button } from \"../Button\";\r\nimport fileCsvIcon from './icons/file-csv.svg';\r\nimport fileDocIcon from './icons/file-doc.svg';\r\nimport fileDocxIcon from './icons/file-docx.svg';\r\nimport fileJpgIcon from './icons/file-jpg.svg';\r\nimport filePdfIcon from './icons/file-pdf.svg';\r\nimport filePngIcon from './icons/file-png.svg';\r\nimport filePptIcon from './icons/file-ppt.svg';\r\nimport filePptxIcon from './icons/file-pptx.svg';\r\nimport fileRarIcon from './icons/file-rar.svg';\r\nimport fileSvgIcon from './icons/file-svg.svg';\r\nimport fileWebpIcon from './icons/file-webp.svg';\r\nimport fileXlsIcon from './icons/file-xls.svg';\r\nimport fileXlsxIcon from './icons/file-xlsx.svg';\r\nimport fileZipIcon from './icons/file-zip.svg';\r\n\r\nconst formatFileSize = (bytes = 0): string => {\r\n if (!bytes || bytes < 0) return '0 KB';\r\n const KB = 1024;\r\n const MB = KB * 1024;\r\n const GB = MB * 1024;\r\n if (bytes >= GB) return `${(bytes / GB).toFixed(2)} GB`;\r\n if (bytes >= MB) {\r\n const mb = bytes / MB;\r\n return `${mb >= 100 ? mb.toFixed(0) : mb.toFixed(2)} MB`;\r\n }\r\n if (bytes >= KB) return `${(bytes / KB).toFixed(bytes / KB >= 100 ? 0 : 1)} KB`;\r\n return `${bytes} B`;\r\n};\r\nconst FILE_EXT_ICON_MAP: Record<string, string> = {\r\n csv: fileCsvIcon,\r\n doc: fileDocIcon,\r\n docx: fileDocxIcon,\r\n jpg: fileJpgIcon,\r\n jpeg: fileJpgIcon,\r\n pdf: filePdfIcon,\r\n png: filePngIcon,\r\n ppt: filePptIcon,\r\n pptx: filePptxIcon,\r\n rar: fileRarIcon,\r\n svg: fileSvgIcon,\r\n webp: fileWebpIcon,\r\n xls: fileXlsIcon,\r\n xlsx: fileXlsxIcon,\r\n zip: fileZipIcon,\r\n};\r\n\r\nconst getFileExtension = (fileName?: string) => {\r\n if (!fileName) return '';\r\n const parts = fileName.toLowerCase().split('.');\r\n return parts.length > 1 ? parts[parts.length - 1] : '';\r\n};\r\n\r\nconst getFileTypeIconByName = (fileName?: string) => {\r\n const extension = getFileExtension(fileName);\r\n return FILE_EXT_ICON_MAP[extension] ?? null;\r\n};\r\nconst areItemsEqual = (a: DropzoneValueItem[], b: DropzoneValueItem[]) => {\r\n if (a === b) return true;\r\n if (a.length !== b.length) return false;\r\n\r\n for (let i = 0; i < a.length; i++) {\r\n const left = a[i];\r\n const right = b[i];\r\n\r\n if (left === right) continue;\r\n\r\n if (typeof left === 'string' && typeof right === 'string') {\r\n if (left !== right) return false;\r\n continue;\r\n }\r\n\r\n if (isFile(left) && isFile(right)) {\r\n if (\r\n left.name !== right.name ||\r\n left.size !== right.size ||\r\n left.type !== right.type ||\r\n left.lastModified !== right.lastModified\r\n ) {\r\n return false;\r\n }\r\n continue;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n return true;\r\n};\r\n\r\n/**\r\n * Dropzone component - A drag-and-drop file upload area with image previews, error handling, and localization.\r\n *\r\n * @component\r\n * @param {DropzoneProps} props - The props for the Dropzone component.\r\n * @param {string[]} [props.acceptTypes=DEFAULT_FILE_TYPES] - Allowed file MIME types.\r\n * @param {number} props.maxSizeMB - Maximum allowed file size in megabytes.\r\n * @param {number} [props.maxFiles=1] - Maximum number of files that can be uploaded.\r\n * @param {DropzoneTranslations} props.translations - Translations for text labels.\r\n * @param {(errors: FileRejection[]) => void} [props.onErrors] - Callback triggered when file errors occur.\r\n * @param {boolean} [props.hideErrors=false] - Whether to hide error messages.\r\n * @param {boolean} [props.disabled=false] - Whether the dropzone is disabled.\r\n * @param {DropzoneStyles} [props.classNames] - Custom classNames for different dropzone states.\r\n * @param {DropzoneValueItem[]} [props.value=[]] - Current selected files or URLs.\r\n * @param {(items: DropzoneValueItem[]) => void} [props.onChangeValue] - Callback triggered when file selection changes.\r\n * @param {string} [props.className] - Additional class names for styling.\r\n * @param {React.Ref<HTMLDivElement>} ref - Ref for the root dropzone container.\r\n * @returns {JSX.Element} The rendered Dropzone component.\r\n */\r\nexport const Dropzone = forwardRef<DropzoneControl, DropzoneProps>(\r\n (\r\n {\r\n acceptTypes = DEFAULT_FILE_TYPES,\r\n maxSizeMB,\r\n maxFiles = 1,\r\n onErrors,\r\n hideErrors = false,\r\n disabled = false,\r\n classNames,\r\n value,\r\n onChangeValue,\r\n className,\r\n labelDropzonePrompt = 'Drop files here or click to select',\r\n labelDropzoneSubPrompt = '',\r\n labelOrClickToSelect = 'Upload file',\r\n labelSelectedFiles = 'Selected Files',\r\n labelUploadErrors = 'Upload Errors',\r\n labelFileTooLarge = 'File is too large',\r\n labelInvalidFileType = 'Invalid file type',\r\n labelVideoUploaded = 'Uploaded',\r\n labelVideoReplace = 'Replace',\r\n singlePick = false,\r\n labelDropzoneClassname,\r\n labelDropzoneSubClassname,\r\n isUploading = false,\r\n uploadProgress = 0,\r\n uploadLoadedBytes = 0,\r\n uploadTotalBytes = 0,\r\n onCancelUpload,\r\n labelUploadingTitle = 'Uploading video...',\r\n labelUploadingHint = 'Please do not close this page',\r\n labelUploadingActionCancel = 'Cancel',\r\n labelUploadingOf = 'of',\r\n playerTranslations,\r\n singlePickFileInfo,\r\n persistentDropzone = false,\r\n previewVariant = 'default',\r\n coverFirstItem = false,\r\n ...restProps\r\n },\r\n ref\r\n ) => {\r\n const [items, setItems] = useState<DropzoneValueItem[]>(value ?? []);\r\n const [fileErrors, setFileErrors] = useState<FileRejection[]>([]);\r\n const firstItem = items[0];\r\n const firstRejectedFile = fileErrors[0]?.file;\r\n const isRejectedImage = Boolean(firstRejectedFile?.type?.includes('image'));\r\n const isSingleFile = singlePick && items.length > 0 && isFile(firstItem);\r\n const isSingleImage = isSingleFile && firstItem.type.includes('image');\r\n const isSingleVideo =\r\n (isSingleFile && firstItem.type.includes('video')) ||\r\n (singlePick && items.length > 0 && typeof firstItem === 'string' && isVideoUrl(firstItem));\r\n const isSingleDocument = isSingleFile && !isSingleImage && !isSingleVideo;\r\n const hasRejectedSingleFile = singlePick && !items.length && Boolean(firstRejectedFile);\r\n const hasRejectedSingleDocumentFile = hasRejectedSingleFile && !isRejectedImage;\r\n const singleFileCard = isSingleDocument ? firstItem : firstRejectedFile;\r\n const singleFileCardIcon = getFileTypeIconByName(singleFileCard?.name);\r\n const hasSingleVideoPreview =\r\n singlePick && isSingleVideo;\r\n const shouldBlockRootOpen = hasSingleVideoPreview;\r\n const isContentPreviewMode = singlePick && items.length > 0;\r\n const isSingleImagePreview =\r\n isContentPreviewMode && !isSingleDocument && !hasSingleVideoPreview;\r\n\r\n // Тільки для мультизавантаження списком (file-list): коли набрали ліміт —\r\n // робимо зону неактивною й сірою (картки нижче лишаються інтерактивними).\r\n const isFileListLimitReached =\r\n previewVariant === 'file-list' && !singlePick && items.length >= maxFiles;\r\n\r\n const onDrop = (acceptedFiles: File[], fileRejections: FileRejection[]) => {\r\n setFileErrors(fileRejections);\r\n onErrors?.(fileRejections);\r\n\r\n const newItems = singlePick\r\n ? acceptedFiles.slice(0, 1)\r\n : [...items, ...acceptedFiles].slice(0, maxFiles);\r\n\r\n setItems(newItems);\r\n onChangeValue?.(newItems);\r\n };\r\n\r\n useEffect(() => {\r\n if (value && !areItemsEqual(items, value)) {\r\n setItems(value);\r\n }\r\n }, [items, value]);\r\n\r\n const removeItem = (\r\n event: React.MouseEvent<HTMLDivElement>,\r\n index: number\r\n ) => {\r\n if (disabled) return;\r\n event.stopPropagation();\r\n\r\n const newItems = items.filter((_, i) => i !== index);\r\n setItems(newItems);\r\n onChangeValue?.(newItems);\r\n };\r\n\r\n const { getRootProps, getInputProps, isDragActive, open } = useDropzone({\r\n onDrop,\r\n accept: acceptTypes.reduce((acc, fileType) => {\r\n acc[fileType] = [];\r\n return acc;\r\n }, {} as Record<string, string[]>),\r\n maxSize: maxSizeMB * 1024 * 1024,\r\n maxFiles: singlePick ? 1 : maxFiles,\r\n disabled: disabled || isUploading || isFileListLimitReached,\r\n noClick: true,\r\n });\r\n\r\n useImperativeHandle(ref, () => {\r\n return {\r\n setItems,\r\n };\r\n }, []);\r\n\r\n const isCoverMode =\r\n coverFirstItem && previewVariant === 'image-grid' && !singlePick && items.length > 0;\r\n\r\n const shouldRenderDetachedPreview =\r\n !isUploading && !singlePick && persistentDropzone && items.length > 0;\r\n\r\n const restItemsForGrid = isCoverMode ? items.slice(1) : items;\r\n\r\n const showAddMoreTile =\r\n !disabled &&\r\n !singlePick &&\r\n previewVariant === 'image-grid' &&\r\n items.length > 0 &&\r\n items.length < maxFiles;\r\n\r\n // For multi image selection (image-grid) keep the drop area at a 16:9 ratio.\r\n // Use aspect-ratio (not a fixed height) so it follows whatever width the\r\n // consumer sets via className. Skipped when previews fill the card.\r\n const isImageGridDropArea =\r\n !singlePick &&\r\n previewVariant === 'image-grid' &&\r\n (persistentDropzone || items.length === 0);\r\n\r\n const previewBlock =\r\n !isUploading &&\r\n !singlePick &&\r\n (restItemsForGrid.length > 0 || showAddMoreTile) && (\r\n <div className={cn('w-full mt-2', classNames?.previewWrapper)}>\r\n {previewVariant === 'default' && (\r\n <pre className=\"font-semibold text-gray-600\">\r\n {labelSelectedFiles}:\r\n </pre>\r\n )}\r\n {previewVariant === 'file-list' ? (\r\n <div className=\"mt-2 flex flex-col gap-2\">\r\n {restItemsForGrid.map((item, index) => {\r\n const fileName = isFile(item) ? item.name : extractName(item);\r\n const sizeLabel = isFile(item) ? formatFileSize(item.size) : '';\r\n return (\r\n <DropzoneFileCard\r\n key={index}\r\n name={fileName}\r\n sizeLabel={sizeLabel}\r\n iconSrc={getFileTypeIconByName(fileName)}\r\n disabled={disabled}\r\n onRemove={(event) => removeItem(event, index)}\r\n />\r\n );\r\n })}\r\n </div>\r\n ) : (\r\n <ul\r\n className={cn(\r\n 'mt-2 text-sm text-gray-500 flex flex-wrap items-start',\r\n previewVariant === 'image-grid'\r\n ? 'gap-2 justify-start'\r\n : 'gap-4 justify-center'\r\n )}\r\n >\r\n {restItemsForGrid.map((item, gridIndex) => {\r\n const index = isCoverMode ? gridIndex + 1 : gridIndex;\r\n const fileName = isFile(item) ? item.name : extractName(item);\r\n const fileSize = isFile(item) ? formatFileSize(item.size) : '';\r\n\r\n return (\r\n <li\r\n key={index}\r\n className={cn(\r\n 'relative',\r\n previewVariant === 'image-grid'\r\n ? 'w-[75px] h-[75px]'\r\n : 'flex flex-col items-center gap-2'\r\n )}\r\n >\r\n <div className=\"relative w-full h-full\">\r\n {previewVariant === 'image-grid' ? (\r\n <DropzoneCoverPreview item={item} className=\"rounded-[8px]\" />\r\n ) : (\r\n <FilePreview item={item} styles={classNames} />\r\n )}\r\n {!disabled && (\r\n <div\r\n className={cn(\r\n 'absolute top-0 right-0 z-20 cursor-pointer bg-gray-300 rounded-sm',\r\n previewVariant === 'image-grid' && 'top-1 right-1 bg-white/90 rounded-full p-0.5'\r\n )}\r\n onClick={(event) => removeItem(event, index)}\r\n >\r\n <X size={16} strokeWidth={1} color=\"black\" />\r\n </div>\r\n )}\r\n </div>\r\n {previewVariant === 'default' && (\r\n <span className=\"inline-flex flex-col items-center\">\r\n <span className=\"max-w-[80px] text-ellipsis overflow-hidden whitespace-nowrap\">\r\n {fileName}\r\n </span>\r\n {fileSize && <span>({fileSize})</span>}\r\n </span>\r\n )}\r\n </li>\r\n );\r\n })}\r\n {showAddMoreTile && (\r\n <li\r\n key=\"add-more\"\r\n className=\"relative w-[75px] h-[75px] flex items-center justify-center rounded-[8px] border border-dashed border-[#9368FF80] bg-[#FCFCFC] cursor-pointer hover:bg-[#9368FF0F]\"\r\n onClick={(event) => {\r\n event.stopPropagation();\r\n if (disabled || isUploading) return;\r\n open();\r\n }}\r\n >\r\n <div className=\"flex size-6 items-center justify-center rounded-full bg-[#9368FF1F]\">\r\n <Plus size={16} className=\"text-[#9368FF]\" />\r\n </div>\r\n </li>\r\n )}\r\n </ul>\r\n )}\r\n </div>\r\n );\r\n\r\n return (\r\n <div className=\"w-full select-none\">\r\n <Card\r\n {...restProps}\r\n {...getRootProps({\r\n onClick: (event) => {\r\n if (disabled || isUploading || isFileListLimitReached) return;\r\n if (shouldBlockRootOpen) {\r\n restProps.onClick?.(event);\r\n return;\r\n }\r\n open();\r\n restProps.onClick?.(event);\r\n },\r\n })}\r\n className={cn(\r\n `w-full text-center flex flex-col items-center justify-center gap-6 cursor-pointer`,\r\n !isContentPreviewMode &&\r\n 'border border-dashed border-[#9368FF80] rounded-[8px] bg-[#FCFCFC] p-4',\r\n isContentPreviewMode && 'min-h-0 border-0 bg-transparent p-0',\r\n isImageGridDropArea && 'aspect-video h-auto',\r\n isCoverMode && 'relative',\r\n disabled && 'border-[#E4E4E7] pointer-events-none',\r\n fileErrors.length > 0 && !isContentPreviewMode && 'border-red-500',\r\n isDragActive && 'bg-gray-100',\r\n singlePick && 'shadow-none!',\r\n singlePick && items.length > 0 && !hasSingleVideoPreview && 'p-0! shadow-none!',\r\n hasSingleVideoPreview && 'h-auto! max-h-none! min-h-0! p-2!',\r\n isSingleImagePreview && 'h-64',\r\n isFileListLimitReached &&\r\n shouldRenderDetachedPreview &&\r\n 'border-[#E4E4E7] bg-[#F5F5F5] cursor-default pointer-events-none',\r\n className\r\n )}\r\n >\r\n <input {...getInputProps()} />\r\n\r\n {isUploading && (\r\n <div\r\n className=\"w-full h-full min-h-46 rounded-lg border border-[#E4E4E7] bg-[#FCFCFC] flex flex-col items-center justify-center gap-4 p-4\"\r\n onClick={(event) => event.stopPropagation()}\r\n >\r\n <div className=\"relative h-24 w-24\">\r\n <svg className=\"h-24 w-24\" viewBox=\"0 0 100 100\">\r\n <circle cx=\"50\" cy=\"50\" r=\"42\" stroke=\"#E6E1F5\" strokeWidth=\"8\" fill=\"none\" />\r\n </svg>\r\n <span className=\"absolute inset-0 flex items-center justify-center text-lg font-semibold text-foreground\">\r\n {Math.max(0, Math.min(100, Math.round(uploadProgress)))}%\r\n </span>\r\n </div>\r\n\r\n <div className=\"text-center\">\r\n <p className=\"text-xl font-semibold text-foreground\">{labelUploadingTitle}</p>\r\n <p className=\"text-sm text-[#666A78]\">\r\n {formatFileSize(uploadLoadedBytes)} {labelUploadingOf} {formatFileSize(uploadTotalBytes)}\r\n </p>\r\n <p className=\"mt-2 text-sm text-[#666A78]\">{labelUploadingHint}</p>\r\n </div>\r\n\r\n <div className=\"w-full max-w-[520px] h-2 rounded-full bg-[#E6E1F5] overflow-hidden\">\r\n <div\r\n className=\"h-full bg-[#9368FF] transition-[width] duration-150 ease-linear\"\r\n style={{ width: `${Math.max(0, Math.min(100, uploadProgress))}%` }}\r\n />\r\n </div>\r\n\r\n {onCancelUpload && (\r\n <button\r\n type=\"button\"\r\n className=\"mt-1 h-10 min-w-36 rounded-md border border-[#E4E4E7] bg-white px-6 text-base font-medium text-foreground cursor-pointer\"\r\n onClick={(event) => {\r\n event.stopPropagation();\r\n onCancelUpload();\r\n }}\r\n >\r\n {labelUploadingActionCancel}\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n\r\n {!isUploading && isCoverMode && (\r\n <div\r\n className=\"absolute inset-0 rounded-[8px] overflow-hidden\"\r\n onClick={(event) => event.stopPropagation()}\r\n >\r\n <DropzoneCoverPreview item={items[0]} className=\"rounded-[8px]\" />\r\n {!disabled && (\r\n <div\r\n className=\"absolute top-2 right-2 z-20 cursor-pointer bg-white/90 rounded-full p-1\"\r\n onClick={(event) => removeItem(event, 0)}\r\n >\r\n <X size={16} strokeWidth={1} color=\"black\" />\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {!isUploading &&\r\n (items.length === 0 || (!singlePick && persistentDropzone)) &&\r\n (fileErrors.length === 0 || !singlePick) && (\r\n <div\r\n className={cn(\r\n 'flex flex-col items-center gap-2 w-full',\r\n classNames?.idleWrapper,\r\n isCoverMode && 'invisible',\r\n )}\r\n >\r\n <div\r\n className={cn(\r\n 'flex size-12 items-center justify-center rounded-full bg-[#9368FF1F]',\r\n (isFileListLimitReached || disabled) && 'bg-[#EDEDF0]'\r\n )}\r\n >\r\n <UploadIcon\r\n className={cn(\r\n 'size-6 text-[#9368FF]',\r\n (isFileListLimitReached || disabled) && 'text-[#A1A1AA]'\r\n )}\r\n />\r\n </div>\r\n\r\n <div className=\"flex flex-col items-center gap-1 w-full\">\r\n {!disabled && (\r\n <>\r\n <span\r\n className={cn(\r\n \"font-semibold text-[14px] leading-[125%] text-[#06080D] text-center w-full whitespace-pre-line\",\r\n isFileListLimitReached && 'text-[#A1A1AA]',\r\n labelDropzoneClassname\r\n )}\r\n >\r\n {labelDropzonePrompt}\r\n </span>\r\n\r\n <span\r\n className={cn(\r\n \"font-medium text-[12px] leading-[120%] text-[#666A78] text-center w-full whitespace-pre-line\",\r\n labelDropzoneSubClassname\r\n )}\r\n >\r\n {labelDropzoneSubPrompt}\r\n </span>\r\n </>\r\n )}\r\n </div>\r\n\r\n {!disabled && (\r\n <Button\r\n type=\"button\"\r\n size=\"md\"\r\n disabled={isFileListLimitReached}\r\n >\r\n {labelOrClickToSelect}\r\n </Button>\r\n )}\r\n </div>\r\n )}\r\n\r\n {!isUploading && singlePick && fileErrors.length > 0 && !hasRejectedSingleDocumentFile && (\r\n <div className={cn('w-full mt-4', classNames?.errorWrapper)}>\r\n <span className=\"font-semibold text-red-500\">\r\n {labelUploadErrors}:\r\n </span>\r\n <ul className=\"mt-2 text-sm text-red-500 list-disc list-inside\">\r\n {fileErrors.map((fileRejection, index) => (\r\n <li key={index}>\r\n {fileRejection.file.name} (\r\n {formatFileSize(fileRejection.file.size)})\r\n {!hideErrors && (\r\n <ul className=\"ml-4 list-disc list-inside\">\r\n {fileRejection.errors.map((error, errorIndex) => (\r\n <li key={errorIndex}>\r\n {error.code === 'file-too-large' && labelFileTooLarge}\r\n {error.code === 'file-invalid-type' &&\r\n labelInvalidFileType}\r\n {error.code !== 'file-too-large' &&\r\n error.code !== 'file-invalid-type' &&\r\n error.message}\r\n </li>\r\n ))}\r\n </ul>\r\n )}\r\n </li>\r\n ))}\r\n </ul>\r\n </div>\r\n )}\r\n\r\n {!isUploading && Boolean(singlePick && items.length) && (\r\n <>\r\n {isSingleDocument ? (\r\n <div\r\n className=\"w-full max-w-[502px] flex flex-col items-center gap-4\"\r\n onClick={(event) => event.stopPropagation()}\r\n >\r\n <p className=\"w-full text-center text-[16px] leading-[130%] font-semibold text-[#06080D]\">\r\n {labelDropzonePrompt}\r\n </p>\r\n\r\n <div className=\"w-full min-h-[72px] rounded-[8px] bg-[#F5F5F5] p-4 flex items-center gap-4\">\r\n {singleFileCardIcon ? (\r\n <img\r\n src={singleFileCardIcon}\r\n alt=\"\"\r\n className=\"size-10 shrink-0\"\r\n />\r\n ) : (\r\n <div className=\"size-10 rounded-[8px] bg-[#DC2626] text-white flex items-center justify-center shrink-0\">\r\n <FileTextIcon size={20} />\r\n </div>\r\n )}\r\n <div className=\"flex flex-col items-start text-left gap-1 min-w-0 flex-1\">\r\n <span className=\"w-full text-[14px] font-semibold leading-[125%] text-[#06080D] truncate\">\r\n {singlePickFileInfo?.name || singleFileCard?.name}\r\n </span>\r\n <span className=\"w-full text-[12px] font-medium leading-[120%] text-[#666A78]\">\r\n {formatFileSize(singlePickFileInfo?.size || singleFileCard?.size)}\r\n </span>\r\n </div>\r\n {!disabled && (\r\n <div\r\n className=\"size-6 flex items-center justify-center cursor-pointer\"\r\n onClick={(event) => removeItem(event, 0)}\r\n >\r\n <X size={24} color=\"#06080D\" />\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n ) : (\r\n <DropzoneSinglePickPreview\r\n item={items[0]}\r\n onRemoveClick={(e) => removeItem(e, 0)}\r\n onReplaceClick={(e) => {\r\n e.stopPropagation();\r\n if (disabled) return;\r\n open();\r\n }}\r\n labelUploaded={labelVideoUploaded}\r\n labelReplace={labelVideoReplace}\r\n fileInfo={singlePickFileInfo}\r\n disabled={disabled}\r\n playerTranslations={playerTranslations}\r\n />\r\n )}\r\n </>\r\n )}\r\n\r\n {!isUploading && hasRejectedSingleDocumentFile && (\r\n <div\r\n className=\"w-full max-w-[502px] flex flex-col items-center gap-4\"\r\n onClick={(event) => event.stopPropagation()}\r\n >\r\n <p className=\"w-full text-center text-[16px] leading-[130%] font-semibold text-[#06080D]\">\r\n {labelDropzonePrompt}\r\n </p>\r\n\r\n <div className=\"w-full min-h-[72px] rounded-[8px] bg-[#F5F5F5] p-4 flex items-center gap-4\">\r\n {singleFileCardIcon ? (\r\n <img\r\n src={singleFileCardIcon}\r\n alt=\"\"\r\n className=\"size-10 shrink-0\"\r\n />\r\n ) : (\r\n <div className=\"size-10 rounded-[8px] bg-[#DC2626] text-white flex items-center justify-center shrink-0\">\r\n <FileTextIcon size={20} />\r\n </div>\r\n )}\r\n <div className=\"flex flex-col items-start text-left gap-1 min-w-0 flex-1\">\r\n <span className=\"w-full text-[14px] font-semibold leading-[125%] text-[#06080D] truncate\">\r\n {singleFileCard?.name}\r\n </span>\r\n <span className=\"w-full text-[12px] font-medium leading-[120%] text-[#666A78]\">\r\n {singleFileCard\r\n ? `${(singleFileCard.size / (1024 * 1024)).toFixed(0)} MB`\r\n : ''}\r\n </span>\r\n </div>\r\n {!disabled && (\r\n <div\r\n className=\"size-6 flex items-center justify-center cursor-pointer\"\r\n onClick={(event) => {\r\n event.stopPropagation();\r\n setFileErrors([]);\r\n }}\r\n >\r\n <X size={24} color=\"#06080D\" />\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div className=\"w-full bg-[#DC26260F] p-4 flex items-start gap-4\">\r\n <InfoIcon size={20} color=\"#DC2626\" />\r\n <p className=\"text-[12px] leading-[120%] font-medium text-[#DC2626] text-left\">\r\n {fileErrors[0]?.errors?.[0]?.code === 'file-too-large'\r\n ? labelFileTooLarge\r\n : fileErrors[0]?.errors?.[0]?.message || labelInvalidFileType}\r\n </p>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {!shouldRenderDetachedPreview && previewBlock}\r\n </Card>\r\n {shouldRenderDetachedPreview && <div className=\"w-full\">{previewBlock}</div>}\r\n {!isUploading && !singlePick && fileErrors.length > 0 && (\r\n <div\r\n className={cn('w-full mt-4 flex flex-col gap-2', classNames?.errorWrapper)}\r\n >\r\n {fileErrors.map((fileRejection, index) => {\r\n const firstError = fileRejection.errors[0];\r\n const errorText =\r\n firstError?.code === 'file-too-large'\r\n ? labelFileTooLarge\r\n : firstError?.code === 'file-invalid-type'\r\n ? labelInvalidFileType\r\n : firstError?.message || labelInvalidFileType;\r\n\r\n return (\r\n <div\r\n key={index}\r\n className=\"w-full bg-[#DC26260F] p-4 flex items-start gap-4 rounded-[8px]\"\r\n >\r\n <InfoIcon size={20} color=\"#DC2626\" className=\"shrink-0\" />\r\n <p className=\"text-[12px] leading-[120%] font-medium text-[#DC2626] text-left\">\r\n <span className=\"font-semibold\">{fileRejection.file.name}</span>\r\n {' — '}\r\n {errorText}\r\n </p>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nDropzone.displayName = 'Dropzone';\r\n\r\n"],"names":["formatFileSize","bytes","KB","MB","GB","mb","FILE_EXT_ICON_MAP","fileCsvIcon","fileDocIcon","fileDocxIcon","fileJpgIcon","filePdfIcon","filePngIcon","filePptIcon","filePptxIcon","fileRarIcon","fileSvgIcon","fileWebpIcon","fileXlsIcon","fileXlsxIcon","fileZipIcon","getFileExtension","fileName","parts","getFileTypeIconByName","extension","areItemsEqual","a","b","i","left","right","isFile","Dropzone","forwardRef","acceptTypes","DEFAULT_FILE_TYPES","maxSizeMB","maxFiles","onErrors","hideErrors","disabled","classNames","value","onChangeValue","className","labelDropzonePrompt","labelDropzoneSubPrompt","labelOrClickToSelect","labelSelectedFiles","labelUploadErrors","labelFileTooLarge","labelInvalidFileType","labelVideoUploaded","labelVideoReplace","singlePick","labelDropzoneClassname","labelDropzoneSubClassname","isUploading","uploadProgress","uploadLoadedBytes","uploadTotalBytes","onCancelUpload","labelUploadingTitle","labelUploadingHint","labelUploadingActionCancel","labelUploadingOf","playerTranslations","singlePickFileInfo","persistentDropzone","previewVariant","coverFirstItem","restProps","ref","items","setItems","useState","fileErrors","setFileErrors","firstItem","firstRejectedFile","isRejectedImage","isSingleFile","isSingleImage","isSingleVideo","isVideoUrl","isSingleDocument","hasRejectedSingleDocumentFile","singleFileCard","singleFileCardIcon","hasSingleVideoPreview","shouldBlockRootOpen","isContentPreviewMode","isSingleImagePreview","isFileListLimitReached","onDrop","acceptedFiles","fileRejections","newItems","useEffect","removeItem","event","index","_","getRootProps","getInputProps","isDragActive","open","useDropzone","acc","fileType","useImperativeHandle","isCoverMode","shouldRenderDetachedPreview","restItemsForGrid","showAddMoreTile","isImageGridDropArea","previewBlock","jsxs","cn","jsx","item","extractName","sizeLabel","DropzoneFileCard","gridIndex","fileSize","DropzoneCoverPreview","FilePreview","X","Plus","Card","UploadIcon","Fragment","Button","fileRejection","error","errorIndex","FileTextIcon","DropzoneSinglePickPreview","InfoIcon","firstError","errorText"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormColorInput.js","sources":["../../src/FormColorInput/FormColorInput.tsx"],"sourcesContent":["import { forwardRef, ReactElement, Ref, RefObject } from 'react';\nimport { FieldValues } from 'react-hook-form';\n\nimport { ColorInput } from '../ColorInput';\nimport { FormControl, FormRenderControl } from '../Form';\nimport { FormColorInputProps } from './FormColorInput.types';\n\nfunction FormColorInputInner<Data extends FieldValues>(\n props: FormColorInputProps<Data>,\n ref: Ref<HTMLInputElement>,\n) {\n const { form, tooltip, tooltipProps, label, name, onBlur, ...rest } = props;\n return (\n <FormRenderControl\n form={form}\n name={name}\n tooltip={tooltip}\n tooltipProps={tooltipProps}\n label={label}\n render={({ field, fieldState }) => (\n <FormControl>\n <ColorInput\n {...rest}\n ref={(el) => {\n field.ref(el);\n if (typeof ref === 'function') {\n ref(el);\n } else if (ref) {\n (ref as RefObject<HTMLInputElement | null>).current = el;\n }\n }}\n error={!!fieldState.error}\n value={field.value || ''}\n onChange={(hex) => field.onChange(hex)}\n onBlur={(...args) => {\n field.onBlur?.();\n onBlur?.(...args);\n }}\n />\n </FormControl>\n )}\n />\n );\n}\n\nexport const FormColorInput = forwardRef(FormColorInputInner) as <\n Data extends FieldValues,\n>(\n props: FormColorInputProps<Data> & { ref?: Ref<HTMLInputElement> },\n) => ReactElement;\n"],"names":["FormColorInputInner","props","ref","form","tooltip","tooltipProps","label","name","onBlur","rest","jsx","FormRenderControl","field","fieldState","FormControl","ColorInput","el","hex","args","FormColorInput","forwardRef"],"mappings":";;;;;AAOA,SAASA,EACPC,GACAC,GACA;AACA,QAAM,EAAE,MAAAC,GAAM,SAAAC,GAAS,cAAAC,GAAc,OAAAC,GAAO,MAAAC,GAAM,QAAAC,GAAQ,GAAGC,EAAA,IAASR;AACtE,SACE,gBAAAS;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,MAAAR;AAAA,MACA,MAAAI;AAAA,MACA,SAAAH;AAAA,MACA,cAAAC;AAAA,MACA,OAAAC;AAAA,MACA,QAAQ,CAAC,EAAE,OAAAM,GAAO,YAAAC,EAAA,wBACfC,GAAA,EACC,UAAA,gBAAAJ;AAAA,QAACK;AAAA,QAAA;AAAA,UACE,GAAGN;AAAA,UACJ,KAAK,CAACO,MAAO;AACX,YAAAJ,EAAM,IAAII,CAAE,GACR,OAAOd,KAAQ,aACjBA,EAAIc,CAAE,IACGd,MACRA,EAA2C,UAAUc;AAAA,UAE1D;AAAA,UACA,OAAO,CAAC,CAACH,EAAW;AAAA,UACpB,OAAOD,EAAM,SAAS;AAAA,UACtB,UAAU,CAACK,MAAQL,EAAM,SAASK,CAAG;AAAA,UACrC,QAAQ,IAAIC,MAAS;AACnB,YAAAN,EAAM,SAAA,GACNJ,IAAS,GAAGU,CAAI;AAAA,UAClB;AAAA,QAAA;AAAA,MAAA,EACF,CACF;AAAA,IAAA;AAAA,EAAA;AAIR;AAEO,MAAMC,IAAiBC,EAAWpB,CAAmB;"}
|
|
1
|
+
{"version":3,"file":"FormColorInput.js","sources":["../../src/FormColorInput/FormColorInput.tsx"],"sourcesContent":["import { forwardRef, ReactElement, Ref, RefObject } from 'react';\r\nimport { FieldValues } from 'react-hook-form';\r\n\r\nimport { ColorInput } from '../ColorInput';\r\nimport { FormControl, FormRenderControl } from '../Form';\r\nimport { FormColorInputProps } from './FormColorInput.types';\r\n\r\nfunction FormColorInputInner<Data extends FieldValues>(\r\n props: FormColorInputProps<Data>,\r\n ref: Ref<HTMLInputElement>,\r\n) {\r\n const { form, tooltip, tooltipProps, label, name, onBlur, ...rest } = props;\r\n return (\r\n <FormRenderControl\r\n form={form}\r\n name={name}\r\n tooltip={tooltip}\r\n tooltipProps={tooltipProps}\r\n label={label}\r\n render={({ field, fieldState }) => (\r\n <FormControl>\r\n <ColorInput\r\n {...rest}\r\n ref={(el) => {\r\n field.ref(el);\r\n if (typeof ref === 'function') {\r\n ref(el);\r\n } else if (ref) {\r\n (ref as RefObject<HTMLInputElement | null>).current = el;\r\n }\r\n }}\r\n error={!!fieldState.error}\r\n value={field.value || ''}\r\n onChange={(hex) => field.onChange(hex)}\r\n onBlur={(...args) => {\r\n field.onBlur?.();\r\n onBlur?.(...args);\r\n }}\r\n />\r\n </FormControl>\r\n )}\r\n />\r\n );\r\n}\r\n\r\nexport const FormColorInput = forwardRef(FormColorInputInner) as <\r\n Data extends FieldValues,\r\n>(\r\n props: FormColorInputProps<Data> & { ref?: Ref<HTMLInputElement> },\r\n) => ReactElement;\r\n"],"names":["FormColorInputInner","props","ref","form","tooltip","tooltipProps","label","name","onBlur","rest","jsx","FormRenderControl","field","fieldState","FormControl","ColorInput","el","hex","args","FormColorInput","forwardRef"],"mappings":";;;;;AAOA,SAASA,EACPC,GACAC,GACA;AACA,QAAM,EAAE,MAAAC,GAAM,SAAAC,GAAS,cAAAC,GAAc,OAAAC,GAAO,MAAAC,GAAM,QAAAC,GAAQ,GAAGC,EAAA,IAASR;AACtE,SACE,gBAAAS;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,MAAAR;AAAA,MACA,MAAAI;AAAA,MACA,SAAAH;AAAA,MACA,cAAAC;AAAA,MACA,OAAAC;AAAA,MACA,QAAQ,CAAC,EAAE,OAAAM,GAAO,YAAAC,EAAA,wBACfC,GAAA,EACC,UAAA,gBAAAJ;AAAA,QAACK;AAAA,QAAA;AAAA,UACE,GAAGN;AAAA,UACJ,KAAK,CAACO,MAAO;AACX,YAAAJ,EAAM,IAAII,CAAE,GACR,OAAOd,KAAQ,aACjBA,EAAIc,CAAE,IACGd,MACRA,EAA2C,UAAUc;AAAA,UAE1D;AAAA,UACA,OAAO,CAAC,CAACH,EAAW;AAAA,UACpB,OAAOD,EAAM,SAAS;AAAA,UACtB,UAAU,CAACK,MAAQL,EAAM,SAASK,CAAG;AAAA,UACrC,QAAQ,IAAIC,MAAS;AACnB,YAAAN,EAAM,SAAA,GACNJ,IAAS,GAAGU,CAAI;AAAA,UAClB;AAAA,QAAA;AAAA,MAAA,EACF,CACF;AAAA,IAAA;AAAA,EAAA;AAIR;AAEO,MAAMC,IAAiBC,EAAWpB,CAAmB;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormColorInput.stories.js","sources":["../../src/FormColorInput/FormColorInput.stories.tsx"],"sourcesContent":["import React, { useEffect } from 'react';\nimport type { Meta, StoryObj } from '@storybook/react';\nimport { FormProvider, useForm } from 'react-hook-form';\n\nimport { FormColorInput } from './FormColorInput';\nimport { Button } from '../Button';\n\ntype FormValues = {\n color: string;\n};\n\ntype ControlledProps = Omit<\n React.ComponentProps<typeof FormColorInput<FormValues>>,\n 'form' | 'name'\n> & {\n initialValue?: string;\n};\n\nfunction ControlledFormColorInput({ initialValue = '#9368FF', ...args }: ControlledProps) {\n const form = useForm<FormValues>({ defaultValues: { color: initialValue } });\n const value = form.watch('color');\n\n return (\n <FormProvider {...form}>\n <div className=\"max-w-sm space-y-3\">\n <FormColorInput<FormValues>\n form={form}\n name=\"color\"\n label=\"Колір бокової панелі\"\n {...args}\n />\n <div className=\"text-xs text-muted-foreground\">\n value: <span className=\"font-mono\">{value}</span>\n </div>\n </div>\n </FormProvider>\n );\n}\n\nconst meta = {\n title: 'FormColorInput',\n component: FormColorInput,\n parameters: { layout: 'centered' },\n args: {\n label: 'Колір',\n withAlpha: false,\n },\n argTypes: {\n form: { control: false },\n name: { control: false },\n onChange: { control: false },\n onBlur: { control: false },\n },\n decorators: [\n (Story) => (\n <div className=\"p-6 w-[420px]\">\n <Story />\n </div>\n ),\n ],\n} satisfies Meta<typeof FormColorInput>;\n\nexport default meta;\n\ntype Story = StoryObj<typeof meta>;\n\nexport const Default: Story = {\n render: (args) => <ControlledFormColorInput {...args} />,\n};\n\nexport const WithAlpha: Story = {\n args: { withAlpha: true },\n render: (args) => <ControlledFormColorInput {...args} initialValue=\"#9368FFcc\" />,\n};\n\nfunction FormColorInputWithError(args: ControlledProps) {\n const form = useForm<FormValues>({ defaultValues: { color: '' } });\n\n useEffect(() => {\n form.setError('color', { message: 'Оберіть колір' });\n }, []);\n\n return (\n <FormProvider {...form}>\n <div className=\"max-w-sm\">\n <FormColorInput<FormValues>\n form={form}\n name=\"color\"\n label=\"Колір\"\n {...args}\n />\n </div>\n </FormProvider>\n );\n}\n\nexport const WithError: Story = {\n render: (args) => <FormColorInputWithError {...args} />,\n};\n\n// Валідація onTouched + disabled submit (стандарт feat/1856).\nconst resolver = (values: FormValues) => {\n const errors: Record<string, { type: string; message: string }> = {};\n if (!values.color?.trim()) {\n errors.color = { type: 'required', message: 'Обовʼязкове поле' };\n } else if (!/^#([0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(values.color.trim())) {\n errors.color = { type: 'pattern', message: 'Невірний формат кольору' };\n }\n return { values: Object.keys(errors).length ? {} : values, errors };\n};\n\nfunction HybridForm() {\n const form = useForm<FormValues>({\n mode: 'onTouched',\n resolver,\n defaultValues: { color: '' },\n });\n const { isValid, isSubmitting } = form.formState;\n\n return (\n <FormProvider {...form}>\n <form\n className=\"max-w-sm space-y-4\"\n onSubmit={form.handleSubmit(() => alert('Збережено ✅'))}\n >\n <FormColorInput<FormValues> form={form} name=\"color\" label=\"Колір\" />\n <Button type=\"submit\" disabled={!isValid || isSubmitting} className=\"w-full\">\n Зберегти\n </Button>\n </form>\n </FormProvider>\n );\n}\n\nexport const HybridValidation: Story = {\n render: () => <HybridForm />,\n};\n"],"names":["ControlledFormColorInput","initialValue","args","form","useForm","value","FormProvider","jsxs","jsx","FormColorInput","meta","Story","Default","WithAlpha","FormColorInputWithError","useEffect","WithError","resolver","values","errors","HybridForm","isValid","isSubmitting","Button","HybridValidation"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FormColorInput.stories.js","sources":["../../src/FormColorInput/FormColorInput.stories.tsx"],"sourcesContent":["import React, { useEffect } from 'react';\r\nimport type { Meta, StoryObj } from '@storybook/react';\r\nimport { FormProvider, useForm } from 'react-hook-form';\r\n\r\nimport { FormColorInput } from './FormColorInput';\r\nimport { Button } from '../Button';\r\n\r\ntype FormValues = {\r\n color: string;\r\n};\r\n\r\ntype ControlledProps = Omit<\r\n React.ComponentProps<typeof FormColorInput<FormValues>>,\r\n 'form' | 'name'\r\n> & {\r\n initialValue?: string;\r\n};\r\n\r\nfunction ControlledFormColorInput({ initialValue = '#9368FF', ...args }: ControlledProps) {\r\n const form = useForm<FormValues>({ defaultValues: { color: initialValue } });\r\n const value = form.watch('color');\r\n\r\n return (\r\n <FormProvider {...form}>\r\n <div className=\"max-w-sm space-y-3\">\r\n <FormColorInput<FormValues>\r\n form={form}\r\n name=\"color\"\r\n label=\"Колір бокової панелі\"\r\n {...args}\r\n />\r\n <div className=\"text-xs text-muted-foreground\">\r\n value: <span className=\"font-mono\">{value}</span>\r\n </div>\r\n </div>\r\n </FormProvider>\r\n );\r\n}\r\n\r\nconst meta = {\r\n title: 'FormColorInput',\r\n component: FormColorInput,\r\n parameters: { layout: 'centered' },\r\n args: {\r\n label: 'Колір',\r\n withAlpha: false,\r\n },\r\n argTypes: {\r\n form: { control: false },\r\n name: { control: false },\r\n onChange: { control: false },\r\n onBlur: { control: false },\r\n },\r\n decorators: [\r\n (Story) => (\r\n <div className=\"p-6 w-[420px]\">\r\n <Story />\r\n </div>\r\n ),\r\n ],\r\n} satisfies Meta<typeof FormColorInput>;\r\n\r\nexport default meta;\r\n\r\ntype Story = StoryObj<typeof meta>;\r\n\r\nexport const Default: Story = {\r\n render: (args) => <ControlledFormColorInput {...args} />,\r\n};\r\n\r\nexport const WithAlpha: Story = {\r\n args: { withAlpha: true },\r\n render: (args) => <ControlledFormColorInput {...args} initialValue=\"#9368FFcc\" />,\r\n};\r\n\r\nfunction FormColorInputWithError(args: ControlledProps) {\r\n const form = useForm<FormValues>({ defaultValues: { color: '' } });\r\n\r\n useEffect(() => {\r\n form.setError('color', { message: 'Оберіть колір' });\r\n }, []);\r\n\r\n return (\r\n <FormProvider {...form}>\r\n <div className=\"max-w-sm\">\r\n <FormColorInput<FormValues>\r\n form={form}\r\n name=\"color\"\r\n label=\"Колір\"\r\n {...args}\r\n />\r\n </div>\r\n </FormProvider>\r\n );\r\n}\r\n\r\nexport const WithError: Story = {\r\n render: (args) => <FormColorInputWithError {...args} />,\r\n};\r\n\r\n// Валідація onTouched + disabled submit (стандарт feat/1856).\r\nconst resolver = (values: FormValues) => {\r\n const errors: Record<string, { type: string; message: string }> = {};\r\n if (!values.color?.trim()) {\r\n errors.color = { type: 'required', message: 'Обовʼязкове поле' };\r\n } else if (!/^#([0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(values.color.trim())) {\r\n errors.color = { type: 'pattern', message: 'Невірний формат кольору' };\r\n }\r\n return { values: Object.keys(errors).length ? {} : values, errors };\r\n};\r\n\r\nfunction HybridForm() {\r\n const form = useForm<FormValues>({\r\n mode: 'onTouched',\r\n resolver,\r\n defaultValues: { color: '' },\r\n });\r\n const { isValid, isSubmitting } = form.formState;\r\n\r\n return (\r\n <FormProvider {...form}>\r\n <form\r\n className=\"max-w-sm space-y-4\"\r\n onSubmit={form.handleSubmit(() => alert('Збережено ✅'))}\r\n >\r\n <FormColorInput<FormValues> form={form} name=\"color\" label=\"Колір\" />\r\n <Button type=\"submit\" disabled={!isValid || isSubmitting} className=\"w-full\">\r\n Зберегти\r\n </Button>\r\n </form>\r\n </FormProvider>\r\n );\r\n}\r\n\r\nexport const HybridValidation: Story = {\r\n render: () => <HybridForm />,\r\n};\r\n"],"names":["ControlledFormColorInput","initialValue","args","form","useForm","value","FormProvider","jsxs","jsx","FormColorInput","meta","Story","Default","WithAlpha","FormColorInputWithError","useEffect","WithError","resolver","values","errors","HybridForm","isValid","isSubmitting","Button","HybridValidation"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oneplatformdev/ui",
|
|
3
|
-
"version": "0.1.99-beta.
|
|
3
|
+
"version": "0.1.99-beta.306",
|
|
4
4
|
"description": "UI component library for OnePlatform",
|
|
5
5
|
"author": "One Platform Development Team",
|
|
6
6
|
"keywords": [
|
|
@@ -110,8 +110,8 @@
|
|
|
110
110
|
"sonner": "^2.0.7",
|
|
111
111
|
"vaul": "^1.1.2",
|
|
112
112
|
"@oneplatformdev/tokens": "^0.1.99-beta.304",
|
|
113
|
-
"@oneplatformdev/
|
|
114
|
-
"@oneplatformdev/
|
|
113
|
+
"@oneplatformdev/hooks": "^0.1.99-beta.304",
|
|
114
|
+
"@oneplatformdev/utils": "^0.1.99-beta.304"
|
|
115
115
|
},
|
|
116
116
|
"scripts": {
|
|
117
117
|
"chromatic": "chromatic"
|