brd-ui-kit 0.1.72 → 0.1.73
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/brd-ui-kit.css +1 -1
- package/dist/components/files-uploader/files-uploader.d.ts +8 -6
- package/dist/components/ui/textarea/textarea.d.ts +2 -2
- package/dist/components/ui/toggle/index.d.ts +3 -0
- package/dist/components/ui/toggle/toggle.d.ts +5 -0
- package/dist/components/ui/toggle/toggle.styles.d.ts +9 -0
- package/dist/components/ui/toggle-group/index.d.ts +1 -0
- package/dist/components/ui/toggle-group/toggle-group.d.ts +12 -0
- package/dist/components/ui/toggle-group/toggle-group.styles.d.ts +8 -0
- package/dist/components/ui/toggle-group.d.ts +2 -0
- package/dist/components/ui/toggle.d.ts +2 -0
- package/dist/components-avatar-uploader-avatar-uploader.cjs +1 -1
- package/dist/components-avatar-uploader-avatar-uploader.cjs.map +1 -1
- package/dist/components-avatar-uploader-avatar-uploader.js +4 -2
- package/dist/components-avatar-uploader-avatar-uploader.js.map +1 -1
- package/dist/components-basic-avatar-basic-avatar.cjs +2 -2
- package/dist/components-basic-avatar-basic-avatar.cjs.map +1 -1
- package/dist/components-basic-avatar-basic-avatar.js +4 -2
- package/dist/components-basic-avatar-basic-avatar.js.map +1 -1
- package/dist/components-files-uploader-files-uploader.cjs +6 -6
- package/dist/components-files-uploader-files-uploader.cjs.map +1 -1
- package/dist/components-files-uploader-files-uploader.js +108 -109
- package/dist/components-files-uploader-files-uploader.js.map +1 -1
- package/dist/components-input-contact-input-contact.cjs +1 -1
- package/dist/components-input-contact-input-contact.cjs.map +1 -1
- package/dist/components-input-contact-input-contact.js +4 -2
- package/dist/components-input-contact-input-contact.js.map +1 -1
- package/dist/components-input-password-input-password.cjs +1 -1
- package/dist/components-input-password-input-password.cjs.map +1 -1
- package/dist/components-input-password-input-password.js +4 -2
- package/dist/components-input-password-input-password.js.map +1 -1
- package/dist/components-ui-field-field.js +4 -4
- package/dist/components-ui-textarea-textarea.cjs +1 -1
- package/dist/components-ui-textarea-textarea.cjs.map +1 -1
- package/dist/components-ui-textarea-textarea.js +2 -3
- package/dist/components-ui-textarea-textarea.js.map +1 -1
- package/dist/components-ui-textarea-textarea.styles.cjs +1 -1
- package/dist/components-ui-textarea-textarea.styles.cjs.map +1 -1
- package/dist/components-ui-textarea-textarea.styles.js +1 -1
- package/dist/components-ui-textarea-textarea.styles.js.map +1 -1
- package/dist/components-ui-toggle-group-toggle-group.cjs +2 -0
- package/dist/components-ui-toggle-group-toggle-group.cjs.map +1 -0
- package/dist/components-ui-toggle-group-toggle-group.js +112 -0
- package/dist/components-ui-toggle-group-toggle-group.js.map +1 -0
- package/dist/components-ui-toggle-group-toggle-group.styles.cjs +18 -0
- package/dist/components-ui-toggle-group-toggle-group.styles.cjs.map +1 -0
- package/dist/components-ui-toggle-group-toggle-group.styles.js +58 -0
- package/dist/components-ui-toggle-group-toggle-group.styles.js.map +1 -0
- package/dist/components-ui-toggle-group.cjs +2 -0
- package/dist/components-ui-toggle-group.cjs.map +1 -0
- package/dist/components-ui-toggle-group.js +6 -0
- package/dist/components-ui-toggle-group.js.map +1 -0
- package/dist/components-ui-toggle-toggle.cjs +2 -0
- package/dist/components-ui-toggle-toggle.cjs.map +1 -0
- package/dist/components-ui-toggle-toggle.js +57 -0
- package/dist/components-ui-toggle-toggle.js.map +1 -0
- package/dist/components-ui-toggle-toggle.styles.cjs +12 -0
- package/dist/components-ui-toggle-toggle.styles.cjs.map +1 -0
- package/dist/components-ui-toggle-toggle.styles.js +35 -0
- package/dist/components-ui-toggle-toggle.styles.js.map +1 -0
- package/dist/components-ui-toggle.cjs +2 -0
- package/dist/components-ui-toggle.cjs.map +1 -0
- package/dist/components-ui-toggle.js +7 -0
- package/dist/components-ui-toggle.js.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +153 -152
- package/dist/index.js.map +1 -1
- package/package.json +19 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components-avatar-uploader-avatar-uploader.cjs","sources":["../src/components/avatar-uploader/avatar-uploader.tsx"],"sourcesContent":["import { cn } from \"@/index\";\nimport { useMemo } from \"react\";\nimport { useDropzone } from \"react-dropzone\";\nimport { BasicAvatar, type BasicAvatarProps } from \"../basic-avatar\";\nimport { Typography } from \"../ui/typography\";\n\ntype Props = {\n maxFiles?: number;\n src?: string;\n fullName: string;\n accept?: string[];\n avatarProps?: BasicAvatarProps;\n containerClassName?: string;\n onChange?: (src: string | null) => void;\n};\n\nconst DEFAULT_MAX_FILES = 1;\nconst DEFAULT_ACCEPT = [\".jpg\", \".png\"];\n\nexport const AvatarUpload = ({\n src,\n fullName,\n maxFiles = DEFAULT_MAX_FILES,\n accept = DEFAULT_ACCEPT,\n avatarProps,\n containerClassName,\n onChange,\n}: Props) => {\n const initials = useMemo(() => {\n const [firstName, lastName] = fullName?.split(\" \");\n const first = firstName?.charAt(0) || \"\";\n const last = lastName?.charAt(0) || \"\";\n\n return (first + last).toUpperCase() || \"?\";\n }, [fullName]);\n\n const { getRootProps, getInputProps } = useDropzone({\n accept: { \"image/*\": accept },\n maxFiles,\n onDrop: (files) => {\n const file = files[0];\n if (file) {\n const previewUrl = URL.createObjectURL(file);\n onChange?.(previewUrl);\n }\n },\n });\n\n const removeAvatar = (e: React.MouseEvent<HTMLDivElement>) => {\n e.stopPropagation();\n onChange?.(\"\");\n };\n\n return (\n <div\n {...getRootProps()}\n className={cn(\n `bg-info-new-bg flex h-18 w-18 cursor-pointer items-center justify-center\n overflow-hidden rounded-full transition-colors`,\n containerClassName,\n )}\n >\n <input {...getInputProps()} />\n {src ? (\n <BasicAvatar\n {...avatarProps}\n image={{\n src,\n }}\n initials={{ text: initials }}\n hasBadge\n onClick={removeAvatar}\n />\n ) : (\n <Typography\n variant=\"body-xxl-medium\"\n className=\"text-info-new-text flex items-center justify-center\"\n >\n {initials}\n </Typography>\n )}\n </div>\n );\n};\n\nexport type { Props as AvatarUploadProps };\n"],"names":["DEFAULT_MAX_FILES","DEFAULT_ACCEPT","AvatarUpload","src","fullName","maxFiles","accept","avatarProps","containerClassName","onChange","initials","useMemo","firstName","lastName","first","last","getRootProps","getInputProps","useDropzone","files","file","previewUrl","removeAvatar","jsxs","cn","jsx","BasicAvatar","Typography"],"mappings":"
|
|
1
|
+
{"version":3,"file":"components-avatar-uploader-avatar-uploader.cjs","sources":["../src/components/avatar-uploader/avatar-uploader.tsx"],"sourcesContent":["import { cn } from \"@/index\";\nimport { useMemo } from \"react\";\nimport { useDropzone } from \"react-dropzone\";\nimport { BasicAvatar, type BasicAvatarProps } from \"../basic-avatar\";\nimport { Typography } from \"../ui/typography\";\n\ntype Props = {\n maxFiles?: number;\n src?: string;\n fullName: string;\n accept?: string[];\n avatarProps?: BasicAvatarProps;\n containerClassName?: string;\n onChange?: (src: string | null) => void;\n};\n\nconst DEFAULT_MAX_FILES = 1;\nconst DEFAULT_ACCEPT = [\".jpg\", \".png\"];\n\nexport const AvatarUpload = ({\n src,\n fullName,\n maxFiles = DEFAULT_MAX_FILES,\n accept = DEFAULT_ACCEPT,\n avatarProps,\n containerClassName,\n onChange,\n}: Props) => {\n const initials = useMemo(() => {\n const [firstName, lastName] = fullName?.split(\" \");\n const first = firstName?.charAt(0) || \"\";\n const last = lastName?.charAt(0) || \"\";\n\n return (first + last).toUpperCase() || \"?\";\n }, [fullName]);\n\n const { getRootProps, getInputProps } = useDropzone({\n accept: { \"image/*\": accept },\n maxFiles,\n onDrop: (files) => {\n const file = files[0];\n if (file) {\n const previewUrl = URL.createObjectURL(file);\n onChange?.(previewUrl);\n }\n },\n });\n\n const removeAvatar = (e: React.MouseEvent<HTMLDivElement>) => {\n e.stopPropagation();\n onChange?.(\"\");\n };\n\n return (\n <div\n {...getRootProps()}\n className={cn(\n `bg-info-new-bg flex h-18 w-18 cursor-pointer items-center justify-center\n overflow-hidden rounded-full transition-colors`,\n containerClassName,\n )}\n >\n <input {...getInputProps()} />\n {src ? (\n <BasicAvatar\n {...avatarProps}\n image={{\n src,\n }}\n initials={{ text: initials }}\n hasBadge\n onClick={removeAvatar}\n />\n ) : (\n <Typography\n variant=\"body-xxl-medium\"\n className=\"text-info-new-text flex items-center justify-center\"\n >\n {initials}\n </Typography>\n )}\n </div>\n );\n};\n\nexport type { Props as AvatarUploadProps };\n"],"names":["DEFAULT_MAX_FILES","DEFAULT_ACCEPT","AvatarUpload","src","fullName","maxFiles","accept","avatarProps","containerClassName","onChange","initials","useMemo","firstName","lastName","first","last","getRootProps","getInputProps","useDropzone","files","file","previewUrl","removeAvatar","jsxs","cn","jsx","BasicAvatar","Typography"],"mappings":"ujEAgBA,MAAMA,EAAoB,EACpBC,EAAiB,CAAC,OAAQ,MAAM,EAEzBC,EAAe,CAAC,CAC3B,IAAAC,EACA,SAAAC,EACA,SAAAC,EAAWL,EACX,OAAAM,EAASL,EACT,YAAAM,EACA,mBAAAC,EACA,SAAAC,CACF,IAAa,CACX,MAAMC,EAAWC,EAAAA,QAAQ,IAAM,CAC7B,KAAM,CAACC,EAAWC,CAAQ,EAAIT,GAAU,MAAM,GAAG,EAC3CU,EAAQF,GAAW,OAAO,CAAC,GAAK,GAChCG,EAAOF,GAAU,OAAO,CAAC,GAAK,GAEpC,OAAQC,EAAQC,GAAM,YAAA,GAAiB,GACzC,EAAG,CAACX,CAAQ,CAAC,EAEP,CAAE,aAAAY,EAAc,cAAAC,CAAA,EAAkBC,cAAY,CAClD,OAAQ,CAAE,UAAWZ,CAAA,EACrB,SAAAD,EACA,OAASc,GAAU,CACjB,MAAMC,EAAOD,EAAM,CAAC,EACpB,GAAIC,EAAM,CACR,MAAMC,EAAa,IAAI,gBAAgBD,CAAI,EAC3CX,IAAWY,CAAU,CACvB,CACF,CAAA,CACD,EAEKC,EAAgB,GAAwC,CAC5D,EAAE,gBAAA,EACFb,IAAW,EAAE,CACf,EAEA,OACEc,EAAAA,KAAC,MAAA,CACE,GAAGP,EAAA,EACJ,UAAWQ,EAAAA,GACT;AAAA,wDAEAhB,CAAA,EAGF,SAAA,CAAAiB,EAAAA,IAAC,QAAA,CAAO,GAAGR,EAAA,CAAc,CAAG,EAC3Bd,EACCsB,EAAAA,IAACC,EAAAA,YAAA,CACE,GAAGnB,EACJ,MAAO,CACL,IAAAJ,CAAA,EAEF,SAAU,CAAE,KAAMO,CAAA,EAClB,SAAQ,GACR,QAASY,CAAA,CAAA,EAGXG,EAAAA,IAACE,EAAAA,WAAA,CACC,QAAQ,kBACR,UAAU,sDAET,SAAAjB,CAAA,CAAA,CACH,CAAA,CAAA,CAIR"}
|
|
@@ -22,6 +22,8 @@ import "./components-ui-pagination-pagination.js";
|
|
|
22
22
|
import "./components-ui-progress-progress.js";
|
|
23
23
|
import "./components-ui-radio-group-radio-group.js";
|
|
24
24
|
import "./components-ui-switch-switch.js";
|
|
25
|
+
import "./components-ui-toggle-toggle.styles.js";
|
|
26
|
+
import "./components-ui-toggle-group-toggle-group.js";
|
|
25
27
|
import "./components-ui-table-table.js";
|
|
26
28
|
import "./components-ui-tabs-tabs.js";
|
|
27
29
|
import "./components-ui-tooltip-tooltip.js";
|
|
@@ -38,7 +40,7 @@ import "./index-C6N9aMq_.js";
|
|
|
38
40
|
import { u as j } from "./index-CVlBIwtP.js";
|
|
39
41
|
import "./components-input-phone-input-phone.js";
|
|
40
42
|
import "./components-ui-calendar-calendar.styles.js";
|
|
41
|
-
const w = 1, y = [".jpg", ".png"],
|
|
43
|
+
const w = 1, y = [".jpg", ".png"], ft = ({
|
|
42
44
|
src: p,
|
|
43
45
|
fullName: m,
|
|
44
46
|
maxFiles: n = w,
|
|
@@ -98,6 +100,6 @@ const w = 1, y = [".jpg", ".png"], ct = ({
|
|
|
98
100
|
);
|
|
99
101
|
};
|
|
100
102
|
export {
|
|
101
|
-
|
|
103
|
+
ft as AvatarUpload
|
|
102
104
|
};
|
|
103
105
|
//# sourceMappingURL=components-avatar-uploader-avatar-uploader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components-avatar-uploader-avatar-uploader.js","sources":["../src/components/avatar-uploader/avatar-uploader.tsx"],"sourcesContent":["import { cn } from \"@/index\";\nimport { useMemo } from \"react\";\nimport { useDropzone } from \"react-dropzone\";\nimport { BasicAvatar, type BasicAvatarProps } from \"../basic-avatar\";\nimport { Typography } from \"../ui/typography\";\n\ntype Props = {\n maxFiles?: number;\n src?: string;\n fullName: string;\n accept?: string[];\n avatarProps?: BasicAvatarProps;\n containerClassName?: string;\n onChange?: (src: string | null) => void;\n};\n\nconst DEFAULT_MAX_FILES = 1;\nconst DEFAULT_ACCEPT = [\".jpg\", \".png\"];\n\nexport const AvatarUpload = ({\n src,\n fullName,\n maxFiles = DEFAULT_MAX_FILES,\n accept = DEFAULT_ACCEPT,\n avatarProps,\n containerClassName,\n onChange,\n}: Props) => {\n const initials = useMemo(() => {\n const [firstName, lastName] = fullName?.split(\" \");\n const first = firstName?.charAt(0) || \"\";\n const last = lastName?.charAt(0) || \"\";\n\n return (first + last).toUpperCase() || \"?\";\n }, [fullName]);\n\n const { getRootProps, getInputProps } = useDropzone({\n accept: { \"image/*\": accept },\n maxFiles,\n onDrop: (files) => {\n const file = files[0];\n if (file) {\n const previewUrl = URL.createObjectURL(file);\n onChange?.(previewUrl);\n }\n },\n });\n\n const removeAvatar = (e: React.MouseEvent<HTMLDivElement>) => {\n e.stopPropagation();\n onChange?.(\"\");\n };\n\n return (\n <div\n {...getRootProps()}\n className={cn(\n `bg-info-new-bg flex h-18 w-18 cursor-pointer items-center justify-center\n overflow-hidden rounded-full transition-colors`,\n containerClassName,\n )}\n >\n <input {...getInputProps()} />\n {src ? (\n <BasicAvatar\n {...avatarProps}\n image={{\n src,\n }}\n initials={{ text: initials }}\n hasBadge\n onClick={removeAvatar}\n />\n ) : (\n <Typography\n variant=\"body-xxl-medium\"\n className=\"text-info-new-text flex items-center justify-center\"\n >\n {initials}\n </Typography>\n )}\n </div>\n );\n};\n\nexport type { Props as AvatarUploadProps };\n"],"names":["DEFAULT_MAX_FILES","DEFAULT_ACCEPT","AvatarUpload","src","fullName","maxFiles","accept","avatarProps","containerClassName","onChange","initials","useMemo","firstName","lastName","first","last","getRootProps","getInputProps","useDropzone","files","file","previewUrl","removeAvatar","e","jsxs","cn","jsx","BasicAvatar","Typography"],"mappings":"
|
|
1
|
+
{"version":3,"file":"components-avatar-uploader-avatar-uploader.js","sources":["../src/components/avatar-uploader/avatar-uploader.tsx"],"sourcesContent":["import { cn } from \"@/index\";\nimport { useMemo } from \"react\";\nimport { useDropzone } from \"react-dropzone\";\nimport { BasicAvatar, type BasicAvatarProps } from \"../basic-avatar\";\nimport { Typography } from \"../ui/typography\";\n\ntype Props = {\n maxFiles?: number;\n src?: string;\n fullName: string;\n accept?: string[];\n avatarProps?: BasicAvatarProps;\n containerClassName?: string;\n onChange?: (src: string | null) => void;\n};\n\nconst DEFAULT_MAX_FILES = 1;\nconst DEFAULT_ACCEPT = [\".jpg\", \".png\"];\n\nexport const AvatarUpload = ({\n src,\n fullName,\n maxFiles = DEFAULT_MAX_FILES,\n accept = DEFAULT_ACCEPT,\n avatarProps,\n containerClassName,\n onChange,\n}: Props) => {\n const initials = useMemo(() => {\n const [firstName, lastName] = fullName?.split(\" \");\n const first = firstName?.charAt(0) || \"\";\n const last = lastName?.charAt(0) || \"\";\n\n return (first + last).toUpperCase() || \"?\";\n }, [fullName]);\n\n const { getRootProps, getInputProps } = useDropzone({\n accept: { \"image/*\": accept },\n maxFiles,\n onDrop: (files) => {\n const file = files[0];\n if (file) {\n const previewUrl = URL.createObjectURL(file);\n onChange?.(previewUrl);\n }\n },\n });\n\n const removeAvatar = (e: React.MouseEvent<HTMLDivElement>) => {\n e.stopPropagation();\n onChange?.(\"\");\n };\n\n return (\n <div\n {...getRootProps()}\n className={cn(\n `bg-info-new-bg flex h-18 w-18 cursor-pointer items-center justify-center\n overflow-hidden rounded-full transition-colors`,\n containerClassName,\n )}\n >\n <input {...getInputProps()} />\n {src ? (\n <BasicAvatar\n {...avatarProps}\n image={{\n src,\n }}\n initials={{ text: initials }}\n hasBadge\n onClick={removeAvatar}\n />\n ) : (\n <Typography\n variant=\"body-xxl-medium\"\n className=\"text-info-new-text flex items-center justify-center\"\n >\n {initials}\n </Typography>\n )}\n </div>\n );\n};\n\nexport type { Props as AvatarUploadProps };\n"],"names":["DEFAULT_MAX_FILES","DEFAULT_ACCEPT","AvatarUpload","src","fullName","maxFiles","accept","avatarProps","containerClassName","onChange","initials","useMemo","firstName","lastName","first","last","getRootProps","getInputProps","useDropzone","files","file","previewUrl","removeAvatar","e","jsxs","cn","jsx","BasicAvatar","Typography"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBA,MAAMA,IAAoB,GACpBC,IAAiB,CAAC,QAAQ,MAAM,GAEzBC,KAAe,CAAC;AAAA,EAC3B,KAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC,IAAWL;AAAA,EACX,QAAAM,IAASL;AAAA,EACT,aAAAM;AAAA,EACA,oBAAAC;AAAA,EACA,UAAAC;AACF,MAAa;AACX,QAAMC,IAAWC,EAAQ,MAAM;AAC7B,UAAM,CAACC,GAAWC,CAAQ,IAAIT,GAAU,MAAM,GAAG,GAC3CU,IAAQF,GAAW,OAAO,CAAC,KAAK,IAChCG,IAAOF,GAAU,OAAO,CAAC,KAAK;AAEpC,YAAQC,IAAQC,GAAM,YAAA,KAAiB;AAAA,EACzC,GAAG,CAACX,CAAQ,CAAC,GAEP,EAAE,cAAAY,GAAc,eAAAC,EAAA,IAAkBC,EAAY;AAAA,IAClD,QAAQ,EAAE,WAAWZ,EAAA;AAAA,IACrB,UAAAD;AAAA,IACA,QAAQ,CAACc,MAAU;AACjB,YAAMC,IAAOD,EAAM,CAAC;AACpB,UAAIC,GAAM;AACR,cAAMC,IAAa,IAAI,gBAAgBD,CAAI;AAC3C,QAAAX,IAAWY,CAAU;AAAA,MACvB;AAAA,IACF;AAAA,EAAA,CACD,GAEKC,IAAe,CAACC,MAAwC;AAC5D,IAAAA,EAAE,gBAAA,GACFd,IAAW,EAAE;AAAA,EACf;AAEA,SACE,gBAAAe;AAAA,IAAC;AAAA,IAAA;AAAA,MACE,GAAGR,EAAA;AAAA,MACJ,WAAWS;AAAA,QACT;AAAA;AAAA,QAEAjB;AAAA,MAAA;AAAA,MAGF,UAAA;AAAA,QAAA,gBAAAkB,EAAC,SAAA,EAAO,GAAGT,EAAA,EAAc,CAAG;AAAA,QAC3Bd,IACC,gBAAAuB;AAAA,UAACC;AAAA,UAAA;AAAA,YACE,GAAGpB;AAAA,YACJ,OAAO;AAAA,cACL,KAAAJ;AAAA,YAAA;AAAA,YAEF,UAAU,EAAE,MAAMO,EAAA;AAAA,YAClB,UAAQ;AAAA,YACR,SAASY;AAAA,UAAA;AAAA,QAAA,IAGX,gBAAAI;AAAA,UAACE;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,WAAU;AAAA,YAET,UAAAlB;AAAA,UAAA;AAAA,QAAA;AAAA,MACH;AAAA,IAAA;AAAA,EAAA;AAIR;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require('./brd-ui-kit.css');const e=require("react/jsx-runtime");;/* empty css */const r=require("./lib-utils.cjs");require("class-variance-authority");require("react");require("./components-ui-badge-badge.styles.cjs");require("./components-ui-button-button.cjs");require("./components-ui-button-button.styles.cjs");require("./components-ui-card-card.cjs");require("./components-ui-checkbox-checkbox.cjs");const p=require("./components-ui-icon-icon.cjs");require("./components-ui-combobox-combobox.cjs");require("./components-ui-dialog-dialog.cjs");require("./components-ui-label-label.cjs");require("./components-ui-separator-separator.cjs");require("./components-ui-field-field.styles.cjs");require("./components-ui-input-input.styles.cjs");require("./components-ui-textarea-textarea.cjs");require("./components-ui-input-group-input-group.styles.cjs");require("./components-ui-navigation-item-navigation-item.styles.cjs");require("./components-ui-navigation-menu-navigation-menu.styles.cjs");require("./components-ui-pagination-pagination.cjs");require("./components-ui-progress-progress.cjs");require("./components-ui-radio-group-radio-group.cjs");require("./components-ui-switch-switch.cjs");require("./components-ui-table-table.cjs");require("./components-ui-tabs-tabs.cjs");require("./components-ui-tooltip-tooltip.cjs");const m=require("./components-ui-typography-typography.cjs");require("./components-ui-typography-typography.styles.cjs");const i=require("./components-ui-avatar-avatar.cjs");require("./components-app-pagination-app-pagination.styles.cjs");require("./components-app-sidebar-app-sidebar.styles.cjs");require("./components-select-field-select-field.cjs");require("./lodash-kqhtUJfz.cjs");require("./chart-CgVfpT_X.cjs");require("./index-DGxwh2Ms.cjs");require("./index-fTTv8YY8.cjs");require("./components-input-phone-input-phone.cjs");require("./components-ui-calendar-calendar.styles.cjs");const x=({initials:u,avatar:t,fallback:n,image:a,icon:c,showDeleteOnHover:
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require('./brd-ui-kit.css');const e=require("react/jsx-runtime");;/* empty css */const r=require("./lib-utils.cjs");require("class-variance-authority");require("react");require("./components-ui-badge-badge.styles.cjs");require("./components-ui-button-button.cjs");require("./components-ui-button-button.styles.cjs");require("./components-ui-card-card.cjs");require("./components-ui-checkbox-checkbox.cjs");const p=require("./components-ui-icon-icon.cjs");require("./components-ui-combobox-combobox.cjs");require("./components-ui-dialog-dialog.cjs");require("./components-ui-label-label.cjs");require("./components-ui-separator-separator.cjs");require("./components-ui-field-field.styles.cjs");require("./components-ui-input-input.styles.cjs");require("./components-ui-textarea-textarea.cjs");require("./components-ui-input-group-input-group.styles.cjs");require("./components-ui-navigation-item-navigation-item.styles.cjs");require("./components-ui-navigation-menu-navigation-menu.styles.cjs");require("./components-ui-pagination-pagination.cjs");require("./components-ui-progress-progress.cjs");require("./components-ui-radio-group-radio-group.cjs");require("./components-ui-switch-switch.cjs");require("./components-ui-toggle-toggle.styles.cjs");require("./components-ui-toggle-group-toggle-group.cjs");require("./components-ui-table-table.cjs");require("./components-ui-tabs-tabs.cjs");require("./components-ui-tooltip-tooltip.cjs");const m=require("./components-ui-typography-typography.cjs");require("./components-ui-typography-typography.styles.cjs");const i=require("./components-ui-avatar-avatar.cjs");require("./components-app-pagination-app-pagination.styles.cjs");require("./components-app-sidebar-app-sidebar.styles.cjs");require("./components-select-field-select-field.cjs");require("./lodash-kqhtUJfz.cjs");require("./chart-CgVfpT_X.cjs");require("./index-DGxwh2Ms.cjs");require("./index-fTTv8YY8.cjs");require("./components-input-phone-input-phone.cjs");require("./components-ui-calendar-calendar.styles.cjs");const x=({initials:u,avatar:t,fallback:n,image:a,icon:c,showDeleteOnHover:q=!0,onClick:o=()=>{}})=>{const s=e.jsxs(i.Avatar,{...t,className:r.cn("h-18 w-18",t?.className),children:[e.jsx(i.AvatarImage,{...a,alt:"avatar",className:r.cn("h-full w-full border-0",a?.className)}),e.jsx(i.AvatarFallback,{...n,children:e.jsx(m.Typography,{variant:"body-xxl-medium",className:r.cn("text-info-new-text",u?.className),children:u?.text})})]});return q?e.jsxs("div",{className:"relative inline-block",children:[s,e.jsx("div",{className:`text-primary-bg bg-primary-inverse-bg/50 absolute inset-0 flex
|
|
2
2
|
cursor-pointer items-center justify-center rounded-full opacity-0
|
|
3
|
-
transition-opacity hover:opacity-100`,onClick:l=>l.stopPropagation(),children:e.jsx(p.Icon,{...c,type:"x",onClick:
|
|
3
|
+
transition-opacity hover:opacity-100`,onClick:l=>l.stopPropagation(),children:e.jsx(p.Icon,{...c,type:"x",onClick:o})})]}):s};exports.BasicAvatar=x;
|
|
4
4
|
//# sourceMappingURL=components-basic-avatar-basic-avatar.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components-basic-avatar-basic-avatar.cjs","sources":["../src/components/basic-avatar/basic-avatar.tsx"],"sourcesContent":["import { Icon, Typography, cn } from \"@/index\";\nimport { Avatar as AvatarPrimitive } from \"radix-ui\";\nimport { Avatar, AvatarFallback, AvatarImage } from \"../ui/avatar\";\nimport type { IconProps } from \"../ui/icon\";\n\ntype AvatarProps = React.ComponentProps<typeof AvatarPrimitive.Root> & {\n size?: \"default\" | \"sm\" | \"lg\";\n};\ntype AvatarFallbackProps = React.ComponentProps<typeof AvatarPrimitive.Fallback>;\ntype AvatarImageProps = React.ComponentProps<typeof AvatarPrimitive.Image>;\n\ntype Props = {\n initials?: {\n text?: string;\n className?: string;\n };\n hasBadge?: boolean;\n avatar?: AvatarProps;\n fallback?: AvatarFallbackProps;\n image?: AvatarImageProps;\n showDeleteOnHover?: boolean;\n icon?: IconProps;\n onClick?: (e: React.MouseEvent<HTMLDivElement>) => void;\n};\n\nexport const BasicAvatar = ({\n initials,\n avatar,\n fallback,\n image,\n icon,\n showDeleteOnHover = true,\n onClick = () => {},\n}: Props) => {\n const content = (\n <Avatar\n {...avatar}\n className={cn(\"h-18 w-18\", avatar?.className)}\n >\n <AvatarImage\n {...image}\n alt=\"avatar\"\n className={cn(\"h-full w-full border-0\", image?.className)}\n />\n <AvatarFallback {...fallback}>\n <Typography\n variant=\"body-xxl-medium\"\n className={cn(\"text-info-new-text\", initials?.className)}\n >\n {initials?.text}\n </Typography>\n </AvatarFallback>\n </Avatar>\n );\n\n if (!showDeleteOnHover) {\n return content;\n }\n\n return (\n <div className=\"relative inline-block\">\n {content}\n <div\n className=\"text-primary-bg bg-primary-inverse-bg/50 absolute inset-0 flex\n cursor-pointer items-center justify-center rounded-full opacity-0\n transition-opacity hover:opacity-100\"\n onClick={(e) => e.stopPropagation()}\n >\n <Icon\n {...icon}\n type=\"x\"\n onClick={onClick}\n />\n </div>\n </div>\n );\n};\n\nexport type {\n AvatarFallbackProps,\n AvatarImageProps,\n AvatarProps,\n Props as BasicAvatarProps,\n};\n"],"names":["BasicAvatar","initials","avatar","fallback","image","icon","showDeleteOnHover","onClick","content","jsxs","Avatar","cn","jsx","AvatarImage","AvatarFallback","Typography","e","Icon"],"mappings":"
|
|
1
|
+
{"version":3,"file":"components-basic-avatar-basic-avatar.cjs","sources":["../src/components/basic-avatar/basic-avatar.tsx"],"sourcesContent":["import { Icon, Typography, cn } from \"@/index\";\nimport { Avatar as AvatarPrimitive } from \"radix-ui\";\nimport { Avatar, AvatarFallback, AvatarImage } from \"../ui/avatar\";\nimport type { IconProps } from \"../ui/icon\";\n\ntype AvatarProps = React.ComponentProps<typeof AvatarPrimitive.Root> & {\n size?: \"default\" | \"sm\" | \"lg\";\n};\ntype AvatarFallbackProps = React.ComponentProps<typeof AvatarPrimitive.Fallback>;\ntype AvatarImageProps = React.ComponentProps<typeof AvatarPrimitive.Image>;\n\ntype Props = {\n initials?: {\n text?: string;\n className?: string;\n };\n hasBadge?: boolean;\n avatar?: AvatarProps;\n fallback?: AvatarFallbackProps;\n image?: AvatarImageProps;\n showDeleteOnHover?: boolean;\n icon?: IconProps;\n onClick?: (e: React.MouseEvent<HTMLDivElement>) => void;\n};\n\nexport const BasicAvatar = ({\n initials,\n avatar,\n fallback,\n image,\n icon,\n showDeleteOnHover = true,\n onClick = () => {},\n}: Props) => {\n const content = (\n <Avatar\n {...avatar}\n className={cn(\"h-18 w-18\", avatar?.className)}\n >\n <AvatarImage\n {...image}\n alt=\"avatar\"\n className={cn(\"h-full w-full border-0\", image?.className)}\n />\n <AvatarFallback {...fallback}>\n <Typography\n variant=\"body-xxl-medium\"\n className={cn(\"text-info-new-text\", initials?.className)}\n >\n {initials?.text}\n </Typography>\n </AvatarFallback>\n </Avatar>\n );\n\n if (!showDeleteOnHover) {\n return content;\n }\n\n return (\n <div className=\"relative inline-block\">\n {content}\n <div\n className=\"text-primary-bg bg-primary-inverse-bg/50 absolute inset-0 flex\n cursor-pointer items-center justify-center rounded-full opacity-0\n transition-opacity hover:opacity-100\"\n onClick={(e) => e.stopPropagation()}\n >\n <Icon\n {...icon}\n type=\"x\"\n onClick={onClick}\n />\n </div>\n </div>\n );\n};\n\nexport type {\n AvatarFallbackProps,\n AvatarImageProps,\n AvatarProps,\n Props as BasicAvatarProps,\n};\n"],"names":["BasicAvatar","initials","avatar","fallback","image","icon","showDeleteOnHover","onClick","content","jsxs","Avatar","cn","jsx","AvatarImage","AvatarFallback","Typography","e","Icon"],"mappings":"+iEAyBO,MAAMA,EAAc,CAAC,CAC1B,SAAAC,EACA,OAAAC,EACA,SAAAC,EACA,MAAAC,EACA,KAAAC,EACA,kBAAAC,EAAoB,GACpB,QAAAC,EAAU,IAAM,CAAC,CACnB,IAAa,CACX,MAAMC,EACJC,EAAAA,KAACC,EAAAA,OAAA,CACE,GAAGR,EACJ,UAAWS,EAAAA,GAAG,YAAaT,GAAQ,SAAS,EAE5C,SAAA,CAAAU,EAAAA,IAACC,EAAAA,YAAA,CACE,GAAGT,EACJ,IAAI,SACJ,UAAWO,EAAAA,GAAG,yBAA0BP,GAAO,SAAS,CAAA,CAAA,EAE1DQ,EAAAA,IAACE,EAAAA,eAAA,CAAgB,GAAGX,EAClB,SAAAS,EAAAA,IAACG,EAAAA,WAAA,CACC,QAAQ,kBACR,UAAWJ,EAAAA,GAAG,qBAAsBV,GAAU,SAAS,EAEtD,SAAAA,GAAU,IAAA,CAAA,CACb,CACF,CAAA,CAAA,CAAA,EAIJ,OAAKK,EAKHG,EAAAA,KAAC,MAAA,CAAI,UAAU,wBACZ,SAAA,CAAAD,EACDI,EAAAA,IAAC,MAAA,CACC,UAAU;AAAA;AAAA,gDAGV,QAAUI,GAAMA,EAAE,gBAAA,EAElB,SAAAJ,EAAAA,IAACK,EAAAA,KAAA,CACE,GAAGZ,EACJ,KAAK,IACL,QAAAE,CAAA,CAAA,CACF,CAAA,CACF,EACF,EAlBOC,CAoBX"}
|
|
@@ -23,6 +23,8 @@ import "./components-ui-pagination-pagination.js";
|
|
|
23
23
|
import "./components-ui-progress-progress.js";
|
|
24
24
|
import "./components-ui-radio-group-radio-group.js";
|
|
25
25
|
import "./components-ui-switch-switch.js";
|
|
26
|
+
import "./components-ui-toggle-toggle.styles.js";
|
|
27
|
+
import "./components-ui-toggle-group-toggle-group.js";
|
|
26
28
|
import "./components-ui-table-table.js";
|
|
27
29
|
import "./components-ui-tabs-tabs.js";
|
|
28
30
|
import "./components-ui-tooltip-tooltip.js";
|
|
@@ -38,7 +40,7 @@ import "./index-C4iHL8Gs.js";
|
|
|
38
40
|
import "./index-C6N9aMq_.js";
|
|
39
41
|
import "./components-input-phone-input-phone.js";
|
|
40
42
|
import "./components-ui-calendar-calendar.styles.js";
|
|
41
|
-
const
|
|
43
|
+
const pr = ({
|
|
42
44
|
initials: o,
|
|
43
45
|
avatar: i,
|
|
44
46
|
fallback: a,
|
|
@@ -95,6 +97,6 @@ const ir = ({
|
|
|
95
97
|
] }) : p;
|
|
96
98
|
};
|
|
97
99
|
export {
|
|
98
|
-
|
|
100
|
+
pr as BasicAvatar
|
|
99
101
|
};
|
|
100
102
|
//# sourceMappingURL=components-basic-avatar-basic-avatar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components-basic-avatar-basic-avatar.js","sources":["../src/components/basic-avatar/basic-avatar.tsx"],"sourcesContent":["import { Icon, Typography, cn } from \"@/index\";\nimport { Avatar as AvatarPrimitive } from \"radix-ui\";\nimport { Avatar, AvatarFallback, AvatarImage } from \"../ui/avatar\";\nimport type { IconProps } from \"../ui/icon\";\n\ntype AvatarProps = React.ComponentProps<typeof AvatarPrimitive.Root> & {\n size?: \"default\" | \"sm\" | \"lg\";\n};\ntype AvatarFallbackProps = React.ComponentProps<typeof AvatarPrimitive.Fallback>;\ntype AvatarImageProps = React.ComponentProps<typeof AvatarPrimitive.Image>;\n\ntype Props = {\n initials?: {\n text?: string;\n className?: string;\n };\n hasBadge?: boolean;\n avatar?: AvatarProps;\n fallback?: AvatarFallbackProps;\n image?: AvatarImageProps;\n showDeleteOnHover?: boolean;\n icon?: IconProps;\n onClick?: (e: React.MouseEvent<HTMLDivElement>) => void;\n};\n\nexport const BasicAvatar = ({\n initials,\n avatar,\n fallback,\n image,\n icon,\n showDeleteOnHover = true,\n onClick = () => {},\n}: Props) => {\n const content = (\n <Avatar\n {...avatar}\n className={cn(\"h-18 w-18\", avatar?.className)}\n >\n <AvatarImage\n {...image}\n alt=\"avatar\"\n className={cn(\"h-full w-full border-0\", image?.className)}\n />\n <AvatarFallback {...fallback}>\n <Typography\n variant=\"body-xxl-medium\"\n className={cn(\"text-info-new-text\", initials?.className)}\n >\n {initials?.text}\n </Typography>\n </AvatarFallback>\n </Avatar>\n );\n\n if (!showDeleteOnHover) {\n return content;\n }\n\n return (\n <div className=\"relative inline-block\">\n {content}\n <div\n className=\"text-primary-bg bg-primary-inverse-bg/50 absolute inset-0 flex\n cursor-pointer items-center justify-center rounded-full opacity-0\n transition-opacity hover:opacity-100\"\n onClick={(e) => e.stopPropagation()}\n >\n <Icon\n {...icon}\n type=\"x\"\n onClick={onClick}\n />\n </div>\n </div>\n );\n};\n\nexport type {\n AvatarFallbackProps,\n AvatarImageProps,\n AvatarProps,\n Props as BasicAvatarProps,\n};\n"],"names":["BasicAvatar","initials","avatar","fallback","image","icon","showDeleteOnHover","onClick","content","jsxs","Avatar","cn","jsx","AvatarImage","AvatarFallback","Typography","e","Icon"],"mappings":"
|
|
1
|
+
{"version":3,"file":"components-basic-avatar-basic-avatar.js","sources":["../src/components/basic-avatar/basic-avatar.tsx"],"sourcesContent":["import { Icon, Typography, cn } from \"@/index\";\nimport { Avatar as AvatarPrimitive } from \"radix-ui\";\nimport { Avatar, AvatarFallback, AvatarImage } from \"../ui/avatar\";\nimport type { IconProps } from \"../ui/icon\";\n\ntype AvatarProps = React.ComponentProps<typeof AvatarPrimitive.Root> & {\n size?: \"default\" | \"sm\" | \"lg\";\n};\ntype AvatarFallbackProps = React.ComponentProps<typeof AvatarPrimitive.Fallback>;\ntype AvatarImageProps = React.ComponentProps<typeof AvatarPrimitive.Image>;\n\ntype Props = {\n initials?: {\n text?: string;\n className?: string;\n };\n hasBadge?: boolean;\n avatar?: AvatarProps;\n fallback?: AvatarFallbackProps;\n image?: AvatarImageProps;\n showDeleteOnHover?: boolean;\n icon?: IconProps;\n onClick?: (e: React.MouseEvent<HTMLDivElement>) => void;\n};\n\nexport const BasicAvatar = ({\n initials,\n avatar,\n fallback,\n image,\n icon,\n showDeleteOnHover = true,\n onClick = () => {},\n}: Props) => {\n const content = (\n <Avatar\n {...avatar}\n className={cn(\"h-18 w-18\", avatar?.className)}\n >\n <AvatarImage\n {...image}\n alt=\"avatar\"\n className={cn(\"h-full w-full border-0\", image?.className)}\n />\n <AvatarFallback {...fallback}>\n <Typography\n variant=\"body-xxl-medium\"\n className={cn(\"text-info-new-text\", initials?.className)}\n >\n {initials?.text}\n </Typography>\n </AvatarFallback>\n </Avatar>\n );\n\n if (!showDeleteOnHover) {\n return content;\n }\n\n return (\n <div className=\"relative inline-block\">\n {content}\n <div\n className=\"text-primary-bg bg-primary-inverse-bg/50 absolute inset-0 flex\n cursor-pointer items-center justify-center rounded-full opacity-0\n transition-opacity hover:opacity-100\"\n onClick={(e) => e.stopPropagation()}\n >\n <Icon\n {...icon}\n type=\"x\"\n onClick={onClick}\n />\n </div>\n </div>\n );\n};\n\nexport type {\n AvatarFallbackProps,\n AvatarImageProps,\n AvatarProps,\n Props as BasicAvatarProps,\n};\n"],"names":["BasicAvatar","initials","avatar","fallback","image","icon","showDeleteOnHover","onClick","content","jsxs","Avatar","cn","jsx","AvatarImage","AvatarFallback","Typography","e","Icon"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyBO,MAAMA,KAAc,CAAC;AAAA,EAC1B,UAAAC;AAAA,EACA,QAAAC;AAAA,EACA,UAAAC;AAAA,EACA,OAAAC;AAAA,EACA,MAAAC;AAAA,EACA,mBAAAC,IAAoB;AAAA,EACpB,SAAAC,IAAU,MAAM;AAAA,EAAC;AACnB,MAAa;AACX,QAAMC,IACJ,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACE,GAAGR;AAAA,MACJ,WAAWS,EAAG,aAAaT,GAAQ,SAAS;AAAA,MAE5C,UAAA;AAAA,QAAA,gBAAAU;AAAA,UAACC;AAAA,UAAA;AAAA,YACE,GAAGT;AAAA,YACJ,KAAI;AAAA,YACJ,WAAWO,EAAG,0BAA0BP,GAAO,SAAS;AAAA,UAAA;AAAA,QAAA;AAAA,QAE1D,gBAAAQ,EAACE,GAAA,EAAgB,GAAGX,GAClB,UAAA,gBAAAS;AAAA,UAACG;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,WAAWJ,EAAG,sBAAsBV,GAAU,SAAS;AAAA,YAEtD,UAAAA,GAAU;AAAA,UAAA;AAAA,QAAA,EACb,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIJ,SAAKK,IAKH,gBAAAG,EAAC,OAAA,EAAI,WAAU,yBACZ,UAAA;AAAA,IAAAD;AAAA,IACD,gBAAAI;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA;AAAA;AAAA,QAGV,SAAS,CAACI,MAAMA,EAAE,gBAAA;AAAA,QAElB,UAAA,gBAAAJ;AAAA,UAACK;AAAA,UAAA;AAAA,YACE,GAAGZ;AAAA,YACJ,MAAK;AAAA,YACL,SAAAE;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EACF,GACF,IAlBOC;AAoBX;"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),p=require("./lib-utils.cjs"),A=require("react"),X=require("./index-DJD-8LQA.cjs"),j=require("./components-ui-icon-icon.cjs"),M=require("./components-ui-typography-typography.cjs");require("./components-ui-typography-typography.styles.cjs");const G=["B","KB","MB","GB","TB"],f=1024,V=5*f*f,H=5,J=["all"],Q=800,W={image:{"image/*":[".jpg",".jpeg",".png",".webp"]},pdf:{"application/pdf":[".pdf"]},doc:{"application/msword":[".doc"],"application/vnd.openxmlformats-officedocument.wordprocessingml.document":[".docx"]},excel:{"application/vnd.ms-excel":[".xls"],"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":[".xlsx"]},text:{"text/plain":[".txt"]},all:{}},Y=e=>{if(!e)return"0 B";const t=Math.floor(Math.log(e)/Math.log(f));return`${(e/Math.pow(f,t)).toFixed(2)} ${G[t]}`},v=e=>`${e.name}:${e.size}`,ee=e=>e.reduce((t,o)=>({...t,...W[o]}),{}),te=(e,t)=>{const o=e.filter(n=>n.status==="uploaded"),l=e.filter(n=>n.status==="error"),a=Math.max(0,t-o.length);return[...o,...l.slice(0,a)]},w=(e,t,o)=>({url:URL.createObjectURL(e),name:e.name,size:Y(e.size),addedAt:new Date().toISOString(),status:t,error:o}),re=e=>e==="file-too-large"?"Файл слишком большой":"Неподдерживаемый формат",se=(e,t,o)=>{const l=new Set(o.map(v)),a=new Set(t.map(v));return e.filter(n=>{if(n.status!=="error")return!0;const g=v(n);return!l.has(g)&&!a.has(g)})},oe=e=>{const t=e.name.split(".").pop()?.toLowerCase();return t?["jpg","jpeg","png","webp"].includes(t)?"image":t==="pdf"?"pdf":["doc","docx"].includes(t)?"doc":["xls","xlsx"].includes(t)?"excel":t==="txt"?"text":"other":"other"},ne=({value:e=[],onChange:t,multiple:o=!1,maxFiles:l=H,disabled:a=!1,className:n,maxSize:g=V,variant:h="grid",accepts:U=J,icon:L,title:F,text:_,showFiles:$=!0,isErrorText:N=!1})=>{const[y,E]=A.useState(!1),[I,S]=A.useState(null),m=e,b=m.filter(r=>r.status==="uploaded").length,q=(r,c)=>{S(null);const u=Math.max(0,l-b),x=r.slice(0,u),Z=r.slice(u),d=[...c.map(i=>w(i.file,"error",re(i.errors[0]?.code))),...Z.map(i=>w(i,"error",`Максимальное количество файлов: ${l}`))];d.length&&S(d[0].error||"Ошибка загрузки"),!(!x.length&&!d.length)&&(E(!0),setTimeout(()=>{const i=x.map(K=>w(K,"uploaded")),k=se(m,i,d),T=o?te([...k,...i,...d],l):[...i,...d].slice(0,1);t?.(T.length?T:[]),E(!1)},Q))},{getRootProps:D,getInputProps:B,isDragActive:C}=X.useDropzone({onDrop:q,accept:ee(U),maxSize:g,multiple:o&&l>1,disabled:a||y}),R=r=>()=>{const c=m.filter((u,x)=>x!==r);t?.(c.length?c:[])},P=m.map((r,c)=>({file:r,index:c})).filter(({file:r})=>r.status==="uploaded"),z=b>=l,O={grid:"grid-cols-2 sm:grid-cols-3 md:grid-cols-4",list:"grid-cols-1",compact:"grid-cols-2 sm:grid-cols-3"};return s.jsxs("div",{className:p.cn("w-full space-y-4",n?.container),children:[s.jsxs("div",{className:p.cn("grid h-full w-full gap-4",h==="list"?"grid-cols-1":O[h]),children:[$&&P.map(({file:r,index:c})=>{const u=oe(r);return s.jsxs("div",{className:`group bg-primary-bg relative aspect-square h-full w-full
|
|
2
|
+
overflow-hidden rounded-lg`,children:[u==="image"?s.jsx("img",{src:r.url,className:"h-full w-full object-cover"}):s.jsx("div",{className:`flex h-full w-full items-center justify-center bg-gray-100
|
|
3
|
+
text-sm font-semibold`,children:r.name.split(".").pop()?.toUpperCase()}),s.jsx("div",{className:`bg-primary-inverse-bg/50 text-primary-bg absolute inset-0
|
|
4
|
+
flex items-center justify-center opacity-0 transition-opacity
|
|
5
|
+
hover:opacity-100`,children:s.jsx(j.Icon,{onClick:R(c),type:"x"})})]},`${r.url}-${r.addedAt}-${c}`)}),!z&&s.jsxs("div",{...D(),className:p.cn(`relative flex cursor-pointer flex-col items-center justify-center
|
|
6
6
|
rounded-lg border-2 border-dashed border-gray-300 bg-gray-50
|
|
7
|
-
transition-colors hover:bg-gray-100`,
|
|
7
|
+
transition-colors hover:bg-gray-100`,C&&"border-primary bg-primary/5",(a||y)&&"cursor-not-allowed opacity-50",h==="list"?"min-h-37.5":"aspect-square",n?.blockAdd),children:[s.jsx("input",{...B()}),y?s.jsx(j.Icon,{type:"spinner-gap",className:"text-sub-label-text h-8 w-8 animate-spin"}):s.jsxs("div",{className:"flex flex-col items-center space-y-2 p-4 text-center",children:[s.jsx(j.Icon,{type:L?.type??"plus",className:p.cn("text-sub-label-text h-8 w-8",n?.icon)}),s.jsx(M.Typography,{className:p.cn("text-sub-label-text",n?.title),children:o?`${F||"Добавить"} (${b}/${l})`:F||"Добавить"}),_&&s.jsx(M.Typography,{className:p.cn("text-sub-label-text",n?.text),children:_})]})]})]}),!N&&I&&s.jsx("div",{className:"rounded-lg bg-red-50 p-3 text-sm text-red-600",children:I})]})};exports.FilesUploader=ne;
|
|
8
8
|
//# sourceMappingURL=components-files-uploader-files-uploader.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components-files-uploader-files-uploader.cjs","sources":["../src/components/files-uploader/files-uploader.tsx"],"sourcesContent":["import { cn } from \"@/lib/utils\";\nimport { useCallback, useState } from \"react\";\nimport { type FileRejection, useDropzone } from \"react-dropzone\";\nimport { Icon, type IconProps } from \"../ui/icon\";\nimport { Typography } from \"../ui/typography\";\n\ntype Variant = \"grid\" | \"list\" | \"compact\";\ntype AcceptType = \"image\" | \"pdf\" | \"doc\" | \"excel\" | \"text\" | \"all\";\ntype UploadedFileData = {\n url: string;\n name: string;\n size: string;\n addedAt: string;\n};\ntype FilesUploaderValue = UploadedFileData | UploadedFileData[] | null;\n\ntype PropsFilesUploader = {\n value?: FilesUploaderValue;\n onChange?: (value: FilesUploaderValue) => void;\n multiple?: boolean;\n maxFiles?: number;\n disabled?: boolean;\n className?: {\n container?: string;\n blockAdd?: string;\n title?: string;\n text?: string;\n icon?: string;\n };\n displayFiles?: boolean;\n maxSize?: number;\n variant?: Variant;\n accepts?: AcceptType[];\n icon?: IconProps;\n title?: string;\n text?: string;\n showFiles?: boolean,\n \n};\nconst FILE_SIZE_UNITS = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\nconst FILE_SIZE_KB = 1024;\nconst DEFAULT_MAX_SIZE = 5 * FILE_SIZE_KB * FILE_SIZE_KB;\nconst DEFAULT_MAX_FILES = 5;\nconst DEFAULT_ACCEPT: AcceptType[] = [\"all\"];\nconst DEFAULT_TIMEOUT = 800;\n\nconst ACCEPT_MAP: Record<AcceptType, Record<string, string[]>> = {\n image: { \"image/*\": [\".jpg\", \".jpeg\", \".png\", \".webp\"] },\n pdf: { \"application/pdf\": [\".pdf\"] },\n doc: {\n \"application/msword\": [\".doc\"],\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\": [\".docx\"],\n },\n excel: {\n \"application/vnd.ms-excel\": [\".xls\"],\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\": [\".xlsx\"],\n },\n text: { \"text/plain\": [\".txt\"] },\n all: {},\n};\n\nconst formatFileSize = (bytes: number) => {\n if (bytes === 0) return \"0 B\";\n const i = Math.floor(Math.log(bytes) / Math.log(FILE_SIZE_KB));\n return `${(bytes / Math.pow(FILE_SIZE_KB, i)).toFixed(2)} ${FILE_SIZE_UNITS[i]}`;\n};\n\nconst fileAcceptMap = (accepts: AcceptType[]): Record<string, string[]> =>\n accepts.reduce((acc, t) => ({ ...acc, ...ACCEPT_MAP[t] }), {});\n\nconst getFileType = (file: UploadedFileData) => {\n const ext = file.name.split(\".\").pop()?.toLowerCase();\n\n if (!ext) return \"other\";\n\n if ([\"jpg\", \"jpeg\", \"png\", \"webp\"].includes(ext)) return \"image\";\n if (ext === \"pdf\") return \"pdf\";\n if ([\"doc\", \"docx\"].includes(ext)) return \"doc\";\n if ([\"xls\", \"xlsx\"].includes(ext)) return \"excel\";\n if (ext === \"txt\") return \"text\";\n\n return \"other\";\n};\n\nexport const FilesUploader = ({\n value = null,\n onChange,\n multiple = false,\n maxFiles = DEFAULT_MAX_FILES,\n disabled = false,\n className,\n maxSize = DEFAULT_MAX_SIZE,\n variant = \"grid\",\n accepts = DEFAULT_ACCEPT,\n icon,\n title,\n text,\n showFiles = true,\n}: PropsFilesUploader) => {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const files = Array.isArray(value) ? value : value ? [value] : [];\n \n\n const onDrop = useCallback(\n (acceptedFiles: File[], rejectedFiles: FileRejection[]) => {\n setError(null);\n\n if (files.length + acceptedFiles.length > maxFiles) {\n setError(`Максимальное количество файлов: ${maxFiles}`);\n return;\n }\n\n if (rejectedFiles.length > 0) {\n const rejection = rejectedFiles[0];\n const errorMessage =\n rejection.errors[0]?.code === \"file-too-large\"\n ? `Файл слишком большой. Максимальный размер: ${maxSize / 1024 / 1024}MB`\n : \"Неподдерживаемый формат файла\";\n setError(errorMessage);\n return;\n }\n\n setLoading(true);\n\n setTimeout(() => {\n const newFilesData: UploadedFileData[] = acceptedFiles.map((file) => ({\n url: URL.createObjectURL(file),\n name: file.name,\n size: formatFileSize(file.size),\n addedAt: new Date().toISOString(),\n }));\n\n if (multiple) {\n onChange?.([...files, ...newFilesData]);\n } else {\n if (files[0]?.url?.startsWith(\"blob:\")) URL.revokeObjectURL(files[0].url);\n onChange?.(newFilesData[0] ?? null);\n }\n\n setLoading(false);\n }, DEFAULT_TIMEOUT);\n },\n [files, maxFiles, maxSize, multiple, onChange],\n );\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n onDrop,\n accept: fileAcceptMap(accepts),\n maxSize,\n multiple: multiple && maxFiles > 1,\n disabled: disabled || loading,\n maxFiles: maxFiles - files.length,\n });\n\n const removeImage = (index: number) => {\n return () => {\n if (files[index]?.url?.startsWith(\"blob:\")) {\n URL.revokeObjectURL(files[index].url);\n }\n const newFiles = files.filter((_, i) => i !== index);\n onChange?.(multiple ? newFiles : newFiles[0] || null);\n };\n };\n\n const isMaxFilesReached = files.length >= maxFiles;\n\n // Варианты отображения\n const gridClasses = {\n grid: \"grid-cols-2 sm:grid-cols-3 md:grid-cols-4\",\n list: \"grid-cols-1\",\n compact: \"grid-cols-2 sm:grid-cols-3\",\n };\n\n return (\n <div className={cn(\"w-full space-y-4\", className?.container)}>\n {/* Предпросмотр с возможностью добавления новых */}\n <div\n className={cn(\n \"grid h-full w-full gap-4\",\n variant === \"list\" ? \"grid-cols-1\" : gridClasses[variant],\n )}\n >\n {showFiles && files.map((file, index) => {\n const type = getFileType(file);\n\n return (\n <div\n key={index}\n className=\"group bg-primary-bg relative aspect-square h-full w-full\n overflow-hidden rounded-lg\"\n >\n {type === \"image\" ? (\n <img\n src={file.url}\n alt={`Preview ${index + 1}`}\n className=\"h-full w-full object-cover\"\n />\n ) : (\n <div\n className=\"flex h-full w-full items-center justify-center bg-gray-100\n text-sm font-semibold\"\n >\n {file.name.split(\".\").pop()?.toUpperCase()}\n </div>\n )}\n\n <div\n className=\"text-primary-bg bg-primary-inverse-bg/50 absolute inset-0 flex\n cursor-pointer items-center justify-center rounded-lg opacity-0\n transition-opacity hover:opacity-100\"\n onClick={(e) => e.stopPropagation()}\n >\n <Icon\n type=\"x\"\n onClick={removeImage(index)}\n />\n </div>\n </div>\n );\n })}\n {/* Кнопка добавления нового изображения */}\n {(!isMaxFilesReached || !showFiles) && (\n <div\n {...getRootProps()}\n className={cn(\n `relative flex cursor-pointer flex-col items-center justify-center\n rounded-lg border-2 border-dashed border-gray-300 bg-gray-50\n transition-colors hover:bg-gray-100`,\n isDragActive && \"border-primary bg-primary/5\",\n (disabled || loading) && \"cursor-not-allowed opacity-50\",\n variant === \"list\" ? \"min-h-37.5\" : \"aspect-square\",\n className?.blockAdd,\n )}\n >\n <input {...getInputProps()} />\n\n {loading ? (\n <Icon\n type=\"spinner-gap\"\n className=\"text-sub-label-text h-8 w-8 animate-spin\"\n />\n ) : (\n <div className=\"flex flex-col items-center space-y-2 p-4 text-center\">\n <Icon\n type={icon?.type ?? \"plus\"}\n className={cn(\"text-sub-label-text h-8 w-8\", className?.icon)}\n />\n <Typography\n variant=\"body-md-medium\"\n className={cn(\"text-sub-label-text\", className?.title)}\n >\n {multiple\n ? `${title || \"Добавить\"} (${files.length}/${maxFiles})`\n : `${title || \"Добавить\"}`}\n </Typography>\n {text && (\n <Typography variant=\"body-xxs-medium\" className={cn(\"text-sub-label-text\", className?.text)}>\n {text}\n </Typography>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* Информация о количестве */}\n {/* {multiple && images.length > 0 && (\n <p className=\"text-xs text-gray-500\">\n Загружено {images.length} из {maxFiles} изображений\n </p>\n )} */}\n\n {/* Ошибка */}\n {error && (\n <div className=\"rounded-lg bg-red-50 p-3 text-sm text-red-600\">{error}</div>\n )}\n </div>\n );\n};\n\nexport type { PropsFilesUploader, UploadedFileData, FilesUploaderValue };\n"],"names":["FILE_SIZE_UNITS","FILE_SIZE_KB","DEFAULT_MAX_SIZE","DEFAULT_MAX_FILES","DEFAULT_ACCEPT","DEFAULT_TIMEOUT","ACCEPT_MAP","formatFileSize","bytes","i","fileAcceptMap","accepts","acc","t","getFileType","file","ext","FilesUploader","value","onChange","multiple","maxFiles","disabled","className","maxSize","variant","icon","title","text","showFiles","loading","setLoading","useState","error","setError","files","onDrop","useCallback","acceptedFiles","rejectedFiles","errorMessage","newFilesData","getRootProps","getInputProps","isDragActive","useDropzone","removeImage","index","newFiles","_","isMaxFilesReached","gridClasses","cn","jsxs","type","jsx","e","Icon","Typography"],"mappings":"qWAuCA,MAAMA,EAAkB,CAAC,IAAK,KAAM,KAAM,KAAM,IAAI,EAC9CC,EAAe,KACfC,EAAmB,EAAID,EAAeA,EACtCE,EAAoB,EACpBC,EAA+B,CAAC,KAAK,EACrCC,EAAkB,IAElBC,EAA2D,CAC/D,MAAO,CAAE,UAAW,CAAC,OAAQ,QAAS,OAAQ,OAAO,CAAA,EACrD,IAAK,CAAE,kBAAmB,CAAC,MAAM,CAAA,EACjC,IAAK,CACH,qBAAsB,CAAC,MAAM,EAC7B,0EAA2E,CAAC,OAAO,CAAA,EAErF,MAAO,CACL,2BAA4B,CAAC,MAAM,EACnC,oEAAqE,CAAC,OAAO,CAAA,EAE/E,KAAM,CAAE,aAAc,CAAC,MAAM,CAAA,EAC7B,IAAK,CAAA,CACP,EAEMC,EAAkBC,GAAkB,CACxC,GAAIA,IAAU,EAAG,MAAO,MACxB,MAAMC,EAAI,KAAK,MAAM,KAAK,IAAID,CAAK,EAAI,KAAK,IAAIP,CAAY,CAAC,EAC7D,MAAO,IAAIO,EAAQ,KAAK,IAAIP,EAAcQ,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAIT,EAAgBS,CAAC,CAAC,EAChF,EAEMC,EAAiBC,GACrBA,EAAQ,OAAO,CAACC,EAAKC,KAAO,CAAE,GAAGD,EAAK,GAAGN,EAAWO,CAAC,CAAA,GAAM,CAAA,CAAE,EAEzDC,EAAeC,GAA2B,CAC9C,MAAMC,EAAMD,EAAK,KAAK,MAAM,GAAG,EAAE,IAAA,GAAO,YAAA,EAExC,OAAKC,EAED,CAAC,MAAO,OAAQ,MAAO,MAAM,EAAE,SAASA,CAAG,EAAU,QACrDA,IAAQ,MAAc,MACtB,CAAC,MAAO,MAAM,EAAE,SAASA,CAAG,EAAU,MACtC,CAAC,MAAO,MAAM,EAAE,SAASA,CAAG,EAAU,QACtCA,IAAQ,MAAc,OAEnB,QARU,OASnB,EAEaC,EAAgB,CAAC,CAC5B,MAAAC,EAAQ,KACR,SAAAC,EACA,SAAAC,EAAW,GACX,SAAAC,EAAWlB,EACX,SAAAmB,EAAW,GACX,UAAAC,EACA,QAAAC,EAAUtB,EACV,QAAAuB,EAAU,OACV,QAAAd,EAAUP,EACV,KAAAsB,EACA,MAAAC,EACA,KAAAC,EACA,UAAAC,EAAY,EACd,IAA0B,CACxB,KAAM,CAACC,EAASC,CAAU,EAAIC,EAAAA,SAAS,EAAK,EACtC,CAACC,EAAOC,CAAQ,EAAIF,EAAAA,SAAwB,IAAI,EAEhDG,EAAQ,MAAM,QAAQjB,CAAK,EAAIA,EAAQA,EAAQ,CAACA,CAAK,EAAI,CAAA,EAGzDkB,EAASC,EAAAA,YACb,CAACC,EAAuBC,IAAmC,CAGzD,GAFAL,EAAS,IAAI,EAETC,EAAM,OAASG,EAAc,OAASjB,EAAU,CAClDa,EAAS,mCAAmCb,CAAQ,EAAE,EACtD,MACF,CAEA,GAAIkB,EAAc,OAAS,EAAG,CAE5B,MAAMC,EADYD,EAAc,CAAC,EAErB,OAAO,CAAC,GAAG,OAAS,iBAC1B,8CAA8Cf,EAAU,KAAO,IAAI,KACnE,gCACNU,EAASM,CAAY,EACrB,MACF,CAEAT,EAAW,EAAI,EAEf,WAAW,IAAM,CACf,MAAMU,EAAmCH,EAAc,IAAKvB,IAAU,CACpE,IAAK,IAAI,gBAAgBA,CAAI,EAC7B,KAAMA,EAAK,KACX,KAAMR,EAAeQ,EAAK,IAAI,EAC9B,QAAS,IAAI,KAAA,EAAO,YAAA,CAAY,EAChC,EAEEK,EACFD,IAAW,CAAC,GAAGgB,EAAO,GAAGM,CAAY,CAAC,GAElCN,EAAM,CAAC,GAAG,KAAK,WAAW,OAAO,GAAG,IAAI,gBAAgBA,EAAM,CAAC,EAAE,GAAG,EACxEhB,IAAWsB,EAAa,CAAC,GAAK,IAAI,GAGpCV,EAAW,EAAK,CAClB,EAAG1B,CAAe,CACpB,EACA,CAAC8B,EAAOd,EAAUG,EAASJ,EAAUD,CAAQ,CAAA,EAGzC,CAAE,aAAAuB,EAAc,cAAAC,EAAe,aAAAC,CAAA,EAAiBC,EAAAA,YAAY,CAChE,OAAAT,EACA,OAAQ1B,EAAcC,CAAO,EAC7B,QAAAa,EACA,SAAUJ,GAAYC,EAAW,EACjC,SAAUC,GAAYQ,EACtB,SAAUT,EAAWc,EAAM,MAAA,CAC5B,EAEKW,EAAeC,GACZ,IAAM,CACPZ,EAAMY,CAAK,GAAG,KAAK,WAAW,OAAO,GACvC,IAAI,gBAAgBZ,EAAMY,CAAK,EAAE,GAAG,EAEtC,MAAMC,EAAWb,EAAM,OAAO,CAACc,EAAGxC,IAAMA,IAAMsC,CAAK,EACnD5B,IAAWC,EAAW4B,EAAWA,EAAS,CAAC,GAAK,IAAI,CACtD,EAGIE,EAAoBf,EAAM,QAAUd,EAGpC8B,EAAc,CAClB,KAAM,4CACN,KAAM,cACN,QAAS,4BAAA,EAGX,cACG,MAAA,CAAI,UAAWC,EAAAA,GAAG,mBAAoB7B,GAAW,SAAS,EAEzD,SAAA,CAAA8B,EAAAA,KAAC,MAAA,CACC,UAAWD,EAAAA,GACT,2BACA3B,IAAY,OAAS,cAAgB0B,EAAY1B,CAAO,CAAA,EAGzD,SAAA,CAAAI,GAAaM,EAAM,IAAI,CAACpB,EAAMgC,IAAU,CACvC,MAAMO,EAAOxC,EAAYC,CAAI,EAE7B,OACEsC,EAAAA,KAAC,MAAA,CAEC,UAAU;AAAA,4CAGT,SAAA,CAAAC,IAAS,QACRC,EAAAA,IAAC,MAAA,CACC,IAAKxC,EAAK,IACV,IAAK,WAAWgC,EAAQ,CAAC,GACzB,UAAU,4BAAA,CAAA,EAGZQ,EAAAA,IAAC,MAAA,CACC,UAAU;AAAA,2CAGT,WAAK,KAAK,MAAM,GAAG,EAAE,IAAA,GAAO,YAAA,CAAY,CAAA,EAI7CA,EAAAA,IAAC,MAAA,CACC,UAAU;AAAA;AAAA,sDAGV,QAAUC,GAAMA,EAAE,gBAAA,EAElB,SAAAD,EAAAA,IAACE,EAAAA,KAAA,CACC,KAAK,IACL,QAASX,EAAYC,CAAK,CAAA,CAAA,CAC5B,CAAA,CACF,CAAA,EA7BKA,CAAA,CAgCX,CAAC,GAEC,CAACG,GAAqB,CAACrB,IACvBwB,EAAAA,KAAC,MAAA,CACE,GAAGX,EAAA,EACJ,UAAWU,EAAAA,GACT;AAAA;AAAA,mDAGAR,GAAgB,+BACftB,GAAYQ,IAAY,gCACzBL,IAAY,OAAS,aAAe,gBACpCF,GAAW,QAAA,EAGb,SAAA,CAAAgC,EAAAA,IAAC,QAAA,CAAO,GAAGZ,EAAA,CAAc,CAAG,EAE3Bb,EACCyB,EAAAA,IAACE,EAAAA,KAAA,CACC,KAAK,cACL,UAAU,0CAAA,CAAA,EAGZJ,EAAAA,KAAC,MAAA,CAAI,UAAU,uDACb,SAAA,CAAAE,EAAAA,IAACE,EAAAA,KAAA,CACC,KAAM/B,GAAM,MAAQ,OACpB,UAAW0B,EAAAA,GAAG,8BAA+B7B,GAAW,IAAI,CAAA,CAAA,EAE9DgC,EAAAA,IAACG,EAAAA,WAAA,CACC,QAAQ,iBACR,UAAWN,EAAAA,GAAG,sBAAuB7B,GAAW,KAAK,EAEpD,SAAAH,EACG,GAAGO,GAAS,UAAU,KAAKQ,EAAM,MAAM,IAAId,CAAQ,IACnD,GAAGM,GAAS,UAAU,EAAA,CAAA,EAE3BC,GACC2B,EAAAA,IAACG,EAAAA,WAAA,CAAW,QAAQ,kBAAkB,UAAWN,EAAAA,GAAG,sBAAuB7B,GAAW,IAAI,EACvF,SAAAK,CAAA,CACH,CAAA,CAAA,CAEJ,CAAA,CAAA,CAAA,CAEJ,CAAA,CAAA,EAYHK,GACCsB,EAAAA,IAAC,MAAA,CAAI,UAAU,gDAAiD,SAAAtB,CAAA,CAAM,CAAA,EAE1E,CAEJ"}
|
|
1
|
+
{"version":3,"file":"components-files-uploader-files-uploader.cjs","sources":["../src/components/files-uploader/files-uploader.tsx"],"sourcesContent":["import { cn } from \"@/lib/utils\";\nimport { useState } from \"react\";\nimport { type FileRejection, useDropzone } from \"react-dropzone\";\nimport { Icon, type IconProps } from \"../ui/icon\";\nimport { Typography } from \"../ui/typography\";\n\ntype Variant = \"grid\" | \"list\" | \"compact\";\ntype AcceptType = \"image\" | \"pdf\" | \"doc\" | \"excel\" | \"text\" | \"all\";\n\nexport type UploadedFileData = {\n url: string;\n name: string;\n size: string;\n addedAt: string;\n status: \"uploaded\" | \"error\";\n error?: string;\n};\n\nexport type FilesUploaderValue = UploadedFileData[] | [];\n\nexport type PropsFilesUploader = {\n value?: FilesUploaderValue;\n onChange?: (value: FilesUploaderValue) => void;\n multiple?: boolean;\n maxFiles?: number;\n disabled?: boolean;\n isErrorText?: boolean;\n className?: {\n container?: string;\n blockAdd?: string;\n title?: string;\n text?: string;\n icon?: string;\n };\n maxSize?: number;\n variant?: Variant;\n accepts?: AcceptType[];\n icon?: IconProps;\n title?: string;\n text?: string;\n showFiles?: boolean;\n};\n\nconst FILE_SIZE_UNITS = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\nconst FILE_SIZE_KB = 1024;\n\nconst DEFAULT_MAX_SIZE = 5 * FILE_SIZE_KB * FILE_SIZE_KB;\nconst DEFAULT_MAX_FILES = 5;\nconst DEFAULT_ACCEPT: AcceptType[] = [\"all\"];\nconst DEFAULT_TIMEOUT = 800;\n\nconst ACCEPT_MAP: Record<AcceptType, Record<string, string[]>> = {\n image: { \"image/*\": [\".jpg\", \".jpeg\", \".png\", \".webp\"] },\n pdf: { \"application/pdf\": [\".pdf\"] },\n doc: {\n \"application/msword\": [\".doc\"],\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\": [\".docx\"],\n },\n excel: {\n \"application/vnd.ms-excel\": [\".xls\"],\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\": [\".xlsx\"],\n },\n text: { \"text/plain\": [\".txt\"] },\n all: {},\n};\n\nconst formatFileSize = (bytes: number) => {\n if (!bytes) return \"0 B\";\n const i = Math.floor(Math.log(bytes) / Math.log(FILE_SIZE_KB));\n return `${(bytes / Math.pow(FILE_SIZE_KB, i)).toFixed(2)} ${FILE_SIZE_UNITS[i]}`;\n};\n\nconst getFileIdentity = (file: Pick<UploadedFileData, \"name\" | \"size\">) =>\n `${file.name}:${file.size}`;\n\nconst fileAcceptMap = (accepts: AcceptType[]) =>\n accepts.reduce((acc, t) => ({ ...acc, ...ACCEPT_MAP[t] }), {});\n\nconst limitFilesForValue = (\n nextFiles: UploadedFileData[],\n maxFiles: number,\n): UploadedFileData[] => {\n const uploadedFiles = nextFiles.filter((file) => file.status === \"uploaded\");\n const errorFiles = nextFiles.filter((file) => file.status === \"error\");\n const availableErrorSlots = Math.max(0, maxFiles - uploadedFiles.length);\n\n return [...uploadedFiles, ...errorFiles.slice(0, availableErrorSlots)];\n};\n\nconst mapFile = (\n file: File,\n status: UploadedFileData[\"status\"],\n error?: string,\n): UploadedFileData => ({\n url: URL.createObjectURL(file),\n name: file.name,\n size: formatFileSize(file.size),\n addedAt: new Date().toISOString(),\n status,\n error,\n});\n\nconst getRejectedError = (code?: string) =>\n code === \"file-too-large\" ? \"Файл слишком большой\" : \"Неподдерживаемый формат\";\n\nconst replaceDuplicateErrors = (\n currentFiles: UploadedFileData[],\n newFiles: UploadedFileData[],\n rejectedFiles: UploadedFileData[],\n) => {\n const rejectedFileIds = new Set(rejectedFiles.map(getFileIdentity));\n const acceptedFileIds = new Set(newFiles.map(getFileIdentity));\n\n return currentFiles.filter((existingFile) => {\n if (existingFile.status !== \"error\") return true;\n const id = getFileIdentity(existingFile);\n return !rejectedFileIds.has(id) && !acceptedFileIds.has(id);\n });\n};\n\nconst getFileType = (file: UploadedFileData) => {\n const ext = file.name.split(\".\").pop()?.toLowerCase();\n\n if (!ext) return \"other\";\n if ([\"jpg\", \"jpeg\", \"png\", \"webp\"].includes(ext)) return \"image\";\n if (ext === \"pdf\") return \"pdf\";\n if ([\"doc\", \"docx\"].includes(ext)) return \"doc\";\n if ([\"xls\", \"xlsx\"].includes(ext)) return \"excel\";\n if (ext === \"txt\") return \"text\";\n\n return \"other\";\n};\n\nexport const FilesUploader = ({\n value = [],\n onChange,\n multiple = false,\n maxFiles = DEFAULT_MAX_FILES,\n disabled = false,\n className,\n maxSize = DEFAULT_MAX_SIZE,\n variant = \"grid\",\n accepts = DEFAULT_ACCEPT,\n icon,\n title,\n text,\n showFiles = true,\n isErrorText = false,\n}: PropsFilesUploader) => {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const files = value;\n const uploadedCount = files.filter((file) => file.status === \"uploaded\").length;\n\n const onDrop = (acceptedFiles: File[], rejectedFiles: FileRejection[]) => {\n setError(null);\n const remainingUploadSlots = Math.max(0, maxFiles - uploadedCount);\n const acceptedFilesToUpload = acceptedFiles.slice(0, remainingUploadSlots);\n const overflowAcceptedFiles = acceptedFiles.slice(remainingUploadSlots);\n\n const rejectedMapped = [\n ...rejectedFiles.map((rejection) =>\n mapFile(rejection.file, \"error\", getRejectedError(rejection.errors[0]?.code)),\n ),\n ...overflowAcceptedFiles.map((file) =>\n mapFile(file, \"error\", `Максимальное количество файлов: ${maxFiles}`),\n ),\n ];\n\n if (rejectedMapped.length) {\n setError(rejectedMapped[0].error || \"Ошибка загрузки\");\n }\n\n if (!acceptedFilesToUpload.length && !rejectedMapped.length) return;\n\n setLoading(true);\n\n setTimeout(() => {\n const newFiles = acceptedFilesToUpload.map((file) => mapFile(file, \"uploaded\"));\n const nextBaseFiles = replaceDuplicateErrors(files, newFiles, rejectedMapped);\n const nextFiles = multiple\n ? limitFilesForValue([...nextBaseFiles, ...newFiles, ...rejectedMapped], maxFiles)\n : [...newFiles, ...rejectedMapped].slice(0, 1);\n\n onChange?.(nextFiles.length ? nextFiles : []);\n setLoading(false);\n }, DEFAULT_TIMEOUT);\n };\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n onDrop,\n accept: fileAcceptMap(accepts),\n maxSize,\n multiple: multiple && maxFiles > 1,\n disabled: disabled || loading,\n });\n\n const removeFile = (index: number) => () => {\n const updated = files.filter((_, i) => i !== index);\n onChange?.(updated.length ? updated : []);\n };\n\n const uploadedFiles = files\n .map((file, index) => ({ file, index }))\n .filter(({ file }) => file.status === \"uploaded\");\n\n const isMaxFilesReached = uploadedCount >= maxFiles;\n\n const gridClasses = {\n grid: \"grid-cols-2 sm:grid-cols-3 md:grid-cols-4\",\n list: \"grid-cols-1\",\n compact: \"grid-cols-2 sm:grid-cols-3\",\n };\n\n return (\n <div className={cn(\"w-full space-y-4\", className?.container)}>\n <div\n className={cn(\n \"grid h-full w-full gap-4\",\n variant === \"list\" ? \"grid-cols-1\" : gridClasses[variant],\n )}\n >\n {showFiles &&\n uploadedFiles.map(({ file, index }) => {\n const type = getFileType(file);\n\n return (\n <div\n key={`${file.url}-${file.addedAt}-${index}`}\n className=\"group bg-primary-bg relative aspect-square h-full w-full\n overflow-hidden rounded-lg\"\n >\n {type === \"image\" ? (\n <img\n src={file.url}\n className=\"h-full w-full object-cover\"\n />\n ) : (\n <div\n className=\"flex h-full w-full items-center justify-center bg-gray-100\n text-sm font-semibold\"\n >\n {file.name.split(\".\").pop()?.toUpperCase()}\n </div>\n )}\n\n <div\n className=\"bg-primary-inverse-bg/50 text-primary-bg absolute inset-0\n flex items-center justify-center opacity-0 transition-opacity\n hover:opacity-100\"\n >\n <Icon\n onClick={removeFile(index)} type={\"x\"} />\n </div>\n </div>\n );\n })}\n\n {!isMaxFilesReached && (\n <div\n {...getRootProps()}\n className={cn(\n `relative flex cursor-pointer flex-col items-center justify-center\n rounded-lg border-2 border-dashed border-gray-300 bg-gray-50\n transition-colors hover:bg-gray-100`,\n isDragActive && \"border-primary bg-primary/5\",\n (disabled || loading) && \"cursor-not-allowed opacity-50\",\n variant === \"list\" ? \"min-h-37.5\" : \"aspect-square\",\n className?.blockAdd,\n )}\n >\n <input {...getInputProps()} />\n\n {loading ? (\n <Icon\n type=\"spinner-gap\"\n className=\"text-sub-label-text h-8 w-8 animate-spin\"\n />\n ) : (\n <div className=\"flex flex-col items-center space-y-2 p-4 text-center\">\n <Icon\n type={icon?.type ?? \"plus\"}\n className={cn(\"text-sub-label-text h-8 w-8\", className?.icon)}\n />\n\n <Typography className={cn(\"text-sub-label-text\", className?.title)}>\n {multiple\n ? `${title || \"Добавить\"} (${uploadedCount}/${maxFiles})`\n : title || \"Добавить\"}\n </Typography>\n\n {text && (\n <Typography className={cn(\"text-sub-label-text\", className?.text)}>\n {text}\n </Typography>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n\n {!isErrorText && error && (\n <div className=\"rounded-lg bg-red-50 p-3 text-sm text-red-600\">{error}</div>\n )}\n </div>\n );\n};\n"],"names":["FILE_SIZE_UNITS","FILE_SIZE_KB","DEFAULT_MAX_SIZE","DEFAULT_MAX_FILES","DEFAULT_ACCEPT","DEFAULT_TIMEOUT","ACCEPT_MAP","formatFileSize","bytes","i","getFileIdentity","file","fileAcceptMap","accepts","acc","t","limitFilesForValue","nextFiles","maxFiles","uploadedFiles","errorFiles","availableErrorSlots","mapFile","status","error","getRejectedError","code","replaceDuplicateErrors","currentFiles","newFiles","rejectedFiles","rejectedFileIds","acceptedFileIds","existingFile","id","getFileType","ext","FilesUploader","value","onChange","multiple","disabled","className","maxSize","variant","icon","title","text","showFiles","isErrorText","loading","setLoading","useState","setError","files","uploadedCount","onDrop","acceptedFiles","remainingUploadSlots","acceptedFilesToUpload","overflowAcceptedFiles","rejectedMapped","rejection","nextBaseFiles","getRootProps","getInputProps","isDragActive","useDropzone","removeFile","index","updated","_","isMaxFilesReached","gridClasses","cn","jsxs","type","jsx","Icon","Typography"],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { jsxs as
|
|
1
|
+
import { jsxs as m, jsx as n } from "react/jsx-runtime";
|
|
2
2
|
import { cn as p } from "./lib-utils.js";
|
|
3
|
-
import { useState as
|
|
4
|
-
import { u as
|
|
5
|
-
import { Icon as
|
|
6
|
-
import { Typography as
|
|
3
|
+
import { useState as U } from "react";
|
|
4
|
+
import { u as G } from "./index-CVlBIwtP.js";
|
|
5
|
+
import { Icon as w } from "./components-ui-icon-icon.js";
|
|
6
|
+
import { Typography as _ } from "./components-ui-typography-typography.js";
|
|
7
7
|
import "./components-ui-typography-typography.styles.js";
|
|
8
|
-
const
|
|
8
|
+
const V = ["B", "KB", "MB", "GB", "TB"], x = 1024, H = 5 * x * x, J = 5, Q = ["all"], W = 800, Y = {
|
|
9
9
|
image: { "image/*": [".jpg", ".jpeg", ".png", ".webp"] },
|
|
10
10
|
pdf: { "application/pdf": [".pdf"] },
|
|
11
11
|
doc: {
|
|
@@ -18,157 +18,156 @@ const S = ["B", "KB", "MB", "GB", "TB"], g = 1024, k = 5 * g * g, F = 5, O = ["a
|
|
|
18
18
|
},
|
|
19
19
|
text: { "text/plain": [".txt"] },
|
|
20
20
|
all: {}
|
|
21
|
-
},
|
|
22
|
-
if (
|
|
23
|
-
const
|
|
24
|
-
return `${(
|
|
25
|
-
},
|
|
26
|
-
const
|
|
27
|
-
return
|
|
28
|
-
},
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
21
|
+
}, ee = (e) => {
|
|
22
|
+
if (!e) return "0 B";
|
|
23
|
+
const t = Math.floor(Math.log(e) / Math.log(x));
|
|
24
|
+
return `${(e / Math.pow(x, t)).toFixed(2)} ${V[t]}`;
|
|
25
|
+
}, F = (e) => `${e.name}:${e.size}`, te = (e) => e.reduce((t, o) => ({ ...t, ...Y[o] }), {}), re = (e, t) => {
|
|
26
|
+
const o = e.filter((s) => s.status === "uploaded"), l = e.filter((s) => s.status === "error"), a = Math.max(0, t - o.length);
|
|
27
|
+
return [...o, ...l.slice(0, a)];
|
|
28
|
+
}, E = (e, t, o) => ({
|
|
29
|
+
url: URL.createObjectURL(e),
|
|
30
|
+
name: e.name,
|
|
31
|
+
size: ee(e.size),
|
|
32
|
+
addedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
33
|
+
status: t,
|
|
34
|
+
error: o
|
|
35
|
+
}), oe = (e) => e === "file-too-large" ? "Файл слишком большой" : "Неподдерживаемый формат", se = (e, t, o) => {
|
|
36
|
+
const l = new Set(o.map(F)), a = new Set(t.map(F));
|
|
37
|
+
return e.filter((s) => {
|
|
38
|
+
if (s.status !== "error") return !0;
|
|
39
|
+
const g = F(s);
|
|
40
|
+
return !l.has(g) && !a.has(g);
|
|
41
|
+
});
|
|
42
|
+
}, le = (e) => {
|
|
43
|
+
const t = e.name.split(".").pop()?.toLowerCase();
|
|
44
|
+
return t ? ["jpg", "jpeg", "png", "webp"].includes(t) ? "image" : t === "pdf" ? "pdf" : ["doc", "docx"].includes(t) ? "doc" : ["xls", "xlsx"].includes(t) ? "excel" : t === "txt" ? "text" : "other" : "other";
|
|
45
|
+
}, me = ({
|
|
46
|
+
value: e = [],
|
|
47
|
+
onChange: t,
|
|
48
|
+
multiple: o = !1,
|
|
49
|
+
maxFiles: l = J,
|
|
50
|
+
disabled: a = !1,
|
|
51
|
+
className: s,
|
|
52
|
+
maxSize: g = H,
|
|
53
|
+
variant: b = "grid",
|
|
54
|
+
accepts: L = Q,
|
|
55
|
+
icon: $,
|
|
56
|
+
title: A,
|
|
57
|
+
text: I,
|
|
58
|
+
showFiles: N = !0,
|
|
59
|
+
isErrorText: D = !1
|
|
42
60
|
}) => {
|
|
43
|
-
const [
|
|
44
|
-
(
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
accept: K(M),
|
|
68
|
-
maxSize: m,
|
|
69
|
-
multiple: i && c > 1,
|
|
70
|
-
disabled: y || b,
|
|
71
|
-
maxFiles: c - r.length
|
|
72
|
-
}), $ = (o) => () => {
|
|
73
|
-
r[o]?.url?.startsWith("blob:") && URL.revokeObjectURL(r[o].url);
|
|
74
|
-
const l = r.filter((a, n) => n !== o);
|
|
75
|
-
e?.(i ? l : l[0] || null);
|
|
76
|
-
}, B = r.length >= c, R = {
|
|
61
|
+
const [y, M] = U(!1), [T, j] = U(null), f = e, v = f.filter((r) => r.status === "uploaded").length, B = (r, c) => {
|
|
62
|
+
j(null);
|
|
63
|
+
const u = Math.max(0, l - v), h = r.slice(0, u), q = r.slice(u), d = [
|
|
64
|
+
...c.map(
|
|
65
|
+
(i) => E(i.file, "error", oe(i.errors[0]?.code))
|
|
66
|
+
),
|
|
67
|
+
...q.map(
|
|
68
|
+
(i) => E(i, "error", `Максимальное количество файлов: ${l}`)
|
|
69
|
+
)
|
|
70
|
+
];
|
|
71
|
+
d.length && j(d[0].error || "Ошибка загрузки"), !(!h.length && !d.length) && (M(!0), setTimeout(() => {
|
|
72
|
+
const i = h.map((X) => E(X, "uploaded")), K = se(f, i, d), S = o ? re([...K, ...i, ...d], l) : [...i, ...d].slice(0, 1);
|
|
73
|
+
t?.(S.length ? S : []), M(!1);
|
|
74
|
+
}, W));
|
|
75
|
+
}, { getRootProps: C, getInputProps: z, isDragActive: P } = G({
|
|
76
|
+
onDrop: B,
|
|
77
|
+
accept: te(L),
|
|
78
|
+
maxSize: g,
|
|
79
|
+
multiple: o && l > 1,
|
|
80
|
+
disabled: a || y
|
|
81
|
+
}), R = (r) => () => {
|
|
82
|
+
const c = f.filter((u, h) => h !== r);
|
|
83
|
+
t?.(c.length ? c : []);
|
|
84
|
+
}, O = f.map((r, c) => ({ file: r, index: c })).filter(({ file: r }) => r.status === "uploaded"), Z = v >= l, k = {
|
|
77
85
|
grid: "grid-cols-2 sm:grid-cols-3 md:grid-cols-4",
|
|
78
86
|
list: "grid-cols-1",
|
|
79
87
|
compact: "grid-cols-2 sm:grid-cols-3"
|
|
80
88
|
};
|
|
81
|
-
return /* @__PURE__ */
|
|
82
|
-
/* @__PURE__ */
|
|
89
|
+
return /* @__PURE__ */ m("div", { className: p("w-full space-y-4", s?.container), children: [
|
|
90
|
+
/* @__PURE__ */ m(
|
|
83
91
|
"div",
|
|
84
92
|
{
|
|
85
93
|
className: p(
|
|
86
94
|
"grid h-full w-full gap-4",
|
|
87
|
-
|
|
95
|
+
b === "list" ? "grid-cols-1" : k[b]
|
|
88
96
|
),
|
|
89
97
|
children: [
|
|
90
|
-
|
|
91
|
-
const
|
|
92
|
-
return /* @__PURE__ */
|
|
98
|
+
N && O.map(({ file: r, index: c }) => {
|
|
99
|
+
const u = le(r);
|
|
100
|
+
return /* @__PURE__ */ m(
|
|
93
101
|
"div",
|
|
94
102
|
{
|
|
95
103
|
className: `group bg-primary-bg relative aspect-square h-full w-full
|
|
96
|
-
|
|
104
|
+
overflow-hidden rounded-lg`,
|
|
97
105
|
children: [
|
|
98
|
-
|
|
106
|
+
u === "image" ? /* @__PURE__ */ n(
|
|
99
107
|
"img",
|
|
100
108
|
{
|
|
101
|
-
src:
|
|
102
|
-
alt: `Preview ${l + 1}`,
|
|
109
|
+
src: r.url,
|
|
103
110
|
className: "h-full w-full object-cover"
|
|
104
111
|
}
|
|
105
|
-
) : /* @__PURE__ */
|
|
112
|
+
) : /* @__PURE__ */ n(
|
|
106
113
|
"div",
|
|
107
114
|
{
|
|
108
115
|
className: `flex h-full w-full items-center justify-center bg-gray-100
|
|
109
|
-
|
|
110
|
-
children:
|
|
116
|
+
text-sm font-semibold`,
|
|
117
|
+
children: r.name.split(".").pop()?.toUpperCase()
|
|
111
118
|
}
|
|
112
119
|
),
|
|
113
|
-
/* @__PURE__ */
|
|
120
|
+
/* @__PURE__ */ n(
|
|
114
121
|
"div",
|
|
115
122
|
{
|
|
116
|
-
className: `
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
x,
|
|
123
|
+
className: `bg-primary-inverse-bg/50 text-primary-bg absolute inset-0
|
|
124
|
+
flex items-center justify-center opacity-0 transition-opacity
|
|
125
|
+
hover:opacity-100`,
|
|
126
|
+
children: /* @__PURE__ */ n(
|
|
127
|
+
w,
|
|
122
128
|
{
|
|
123
|
-
|
|
124
|
-
|
|
129
|
+
onClick: R(c),
|
|
130
|
+
type: "x"
|
|
125
131
|
}
|
|
126
132
|
)
|
|
127
133
|
}
|
|
128
134
|
)
|
|
129
135
|
]
|
|
130
136
|
},
|
|
131
|
-
|
|
137
|
+
`${r.url}-${r.addedAt}-${c}`
|
|
132
138
|
);
|
|
133
139
|
}),
|
|
134
|
-
|
|
140
|
+
!Z && /* @__PURE__ */ m(
|
|
135
141
|
"div",
|
|
136
142
|
{
|
|
137
|
-
...
|
|
143
|
+
...C(),
|
|
138
144
|
className: p(
|
|
139
145
|
`relative flex cursor-pointer flex-col items-center justify-center
|
|
140
146
|
rounded-lg border-2 border-dashed border-gray-300 bg-gray-50
|
|
141
147
|
transition-colors hover:bg-gray-100`,
|
|
142
|
-
|
|
143
|
-
(
|
|
144
|
-
|
|
145
|
-
|
|
148
|
+
P && "border-primary bg-primary/5",
|
|
149
|
+
(a || y) && "cursor-not-allowed opacity-50",
|
|
150
|
+
b === "list" ? "min-h-37.5" : "aspect-square",
|
|
151
|
+
s?.blockAdd
|
|
146
152
|
),
|
|
147
153
|
children: [
|
|
148
|
-
/* @__PURE__ */
|
|
149
|
-
|
|
150
|
-
|
|
154
|
+
/* @__PURE__ */ n("input", { ...z() }),
|
|
155
|
+
y ? /* @__PURE__ */ n(
|
|
156
|
+
w,
|
|
151
157
|
{
|
|
152
158
|
type: "spinner-gap",
|
|
153
159
|
className: "text-sub-label-text h-8 w-8 animate-spin"
|
|
154
160
|
}
|
|
155
|
-
) : /* @__PURE__ */
|
|
156
|
-
/* @__PURE__ */
|
|
157
|
-
|
|
158
|
-
{
|
|
159
|
-
type: T?.type ?? "plus",
|
|
160
|
-
className: p("text-sub-label-text h-8 w-8", d?.icon)
|
|
161
|
-
}
|
|
162
|
-
),
|
|
163
|
-
/* @__PURE__ */ s(
|
|
164
|
-
U,
|
|
161
|
+
) : /* @__PURE__ */ m("div", { className: "flex flex-col items-center space-y-2 p-4 text-center", children: [
|
|
162
|
+
/* @__PURE__ */ n(
|
|
163
|
+
w,
|
|
165
164
|
{
|
|
166
|
-
|
|
167
|
-
className: p("text-sub-label-text",
|
|
168
|
-
children: i ? `${v || "Добавить"} (${r.length}/${c})` : `${v || "Добавить"}`
|
|
165
|
+
type: $?.type ?? "plus",
|
|
166
|
+
className: p("text-sub-label-text h-8 w-8", s?.icon)
|
|
169
167
|
}
|
|
170
168
|
),
|
|
171
|
-
|
|
169
|
+
/* @__PURE__ */ n(_, { className: p("text-sub-label-text", s?.title), children: o ? `${A || "Добавить"} (${v}/${l})` : A || "Добавить" }),
|
|
170
|
+
I && /* @__PURE__ */ n(_, { className: p("text-sub-label-text", s?.text), children: I })
|
|
172
171
|
] })
|
|
173
172
|
]
|
|
174
173
|
}
|
|
@@ -176,10 +175,10 @@ const S = ["B", "KB", "MB", "GB", "TB"], g = 1024, k = 5 * g * g, F = 5, O = ["a
|
|
|
176
175
|
]
|
|
177
176
|
}
|
|
178
177
|
),
|
|
179
|
-
|
|
178
|
+
!D && T && /* @__PURE__ */ n("div", { className: "rounded-lg bg-red-50 p-3 text-sm text-red-600", children: T })
|
|
180
179
|
] });
|
|
181
180
|
};
|
|
182
181
|
export {
|
|
183
|
-
|
|
182
|
+
me as FilesUploader
|
|
184
183
|
};
|
|
185
184
|
//# sourceMappingURL=components-files-uploader-files-uploader.js.map
|