@cloud-ru/ds-dropzone 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/LICENSE +201 -0
  3. package/README.md +356 -0
  4. package/dist/cjs/components/Dropzone/Dropzone.d.ts +25 -0
  5. package/dist/cjs/components/Dropzone/Dropzone.js +11 -0
  6. package/dist/cjs/components/Dropzone/index.d.ts +1 -0
  7. package/dist/cjs/components/Dropzone/index.js +17 -0
  8. package/dist/cjs/components/FileUpload/FileUpload.d.ts +45 -0
  9. package/dist/cjs/components/FileUpload/FileUpload.js +56 -0
  10. package/dist/cjs/components/FileUpload/index.d.ts +1 -0
  11. package/dist/cjs/components/FileUpload/index.js +17 -0
  12. package/dist/cjs/components/FileUpload/styles.module.css +3 -0
  13. package/dist/cjs/components/HiddenDropZone/HiddenDropZone.d.ts +10 -0
  14. package/dist/cjs/components/HiddenDropZone/HiddenDropZone.js +19 -0
  15. package/dist/cjs/components/HiddenDropZone/index.d.ts +1 -0
  16. package/dist/cjs/components/HiddenDropZone/index.js +17 -0
  17. package/dist/cjs/components/HiddenDropZone/styles.module.css +20 -0
  18. package/dist/cjs/components/PrivateDropZone/PrivateDropZone.d.ts +2 -0
  19. package/dist/cjs/components/PrivateDropZone/PrivateDropZone.js +62 -0
  20. package/dist/cjs/components/PrivateDropZone/constants.d.ts +1 -0
  21. package/dist/cjs/components/PrivateDropZone/constants.js +5 -0
  22. package/dist/cjs/components/PrivateDropZone/index.d.ts +2 -0
  23. package/dist/cjs/components/PrivateDropZone/index.js +5 -0
  24. package/dist/cjs/components/PrivateDropZone/styles.module.css +405 -0
  25. package/dist/cjs/components/PrivateDropZone/types.d.ts +23 -0
  26. package/dist/cjs/components/PrivateDropZone/types.js +2 -0
  27. package/dist/cjs/components/index.d.ts +3 -0
  28. package/dist/cjs/components/index.js +19 -0
  29. package/dist/cjs/constants.d.ts +17 -0
  30. package/dist/cjs/constants.js +20 -0
  31. package/dist/cjs/hooks/useDrag.d.ts +7 -0
  32. package/dist/cjs/hooks/useDrag.js +30 -0
  33. package/dist/cjs/index.d.ts +4 -0
  34. package/dist/cjs/index.js +20 -0
  35. package/dist/cjs/package.json +3 -0
  36. package/dist/cjs/style.css +428 -0
  37. package/dist/cjs/types.d.ts +33 -0
  38. package/dist/cjs/types.js +2 -0
  39. package/dist/cjs/utils.d.ts +37 -0
  40. package/dist/cjs/utils.js +70 -0
  41. package/dist/esm/components/Dropzone/Dropzone.d.ts +25 -0
  42. package/dist/esm/components/Dropzone/Dropzone.js +8 -0
  43. package/dist/esm/components/Dropzone/index.d.ts +1 -0
  44. package/dist/esm/components/Dropzone/index.js +1 -0
  45. package/dist/esm/components/FileUpload/FileUpload.d.ts +45 -0
  46. package/dist/esm/components/FileUpload/FileUpload.js +50 -0
  47. package/dist/esm/components/FileUpload/index.d.ts +1 -0
  48. package/dist/esm/components/FileUpload/index.js +1 -0
  49. package/dist/esm/components/FileUpload/styles.module.css +3 -0
  50. package/dist/esm/components/HiddenDropZone/HiddenDropZone.d.ts +10 -0
  51. package/dist/esm/components/HiddenDropZone/HiddenDropZone.js +13 -0
  52. package/dist/esm/components/HiddenDropZone/index.d.ts +1 -0
  53. package/dist/esm/components/HiddenDropZone/index.js +1 -0
  54. package/dist/esm/components/HiddenDropZone/styles.module.css +20 -0
  55. package/dist/esm/components/PrivateDropZone/PrivateDropZone.d.ts +2 -0
  56. package/dist/esm/components/PrivateDropZone/PrivateDropZone.js +56 -0
  57. package/dist/esm/components/PrivateDropZone/constants.d.ts +1 -0
  58. package/dist/esm/components/PrivateDropZone/constants.js +1 -0
  59. package/dist/esm/components/PrivateDropZone/index.d.ts +2 -0
  60. package/dist/esm/components/PrivateDropZone/index.js +1 -0
  61. package/dist/esm/components/PrivateDropZone/styles.module.css +405 -0
  62. package/dist/esm/components/PrivateDropZone/types.d.ts +23 -0
  63. package/dist/esm/components/PrivateDropZone/types.js +1 -0
  64. package/dist/esm/components/index.d.ts +3 -0
  65. package/dist/esm/components/index.js +3 -0
  66. package/dist/esm/constants.d.ts +17 -0
  67. package/dist/esm/constants.js +17 -0
  68. package/dist/esm/hooks/useDrag.d.ts +7 -0
  69. package/dist/esm/hooks/useDrag.js +27 -0
  70. package/dist/esm/index.d.ts +4 -0
  71. package/dist/esm/index.js +4 -0
  72. package/dist/esm/style.css +428 -0
  73. package/dist/esm/types.d.ts +33 -0
  74. package/dist/esm/types.js +1 -0
  75. package/dist/esm/utils.d.ts +37 -0
  76. package/dist/esm/utils.js +64 -0
  77. package/dist/tsconfig.cjs.tsbuildinfo +1 -0
  78. package/dist/tsconfig.esm.tsbuildinfo +1 -0
  79. package/package.json +43 -0
  80. package/src/components/Dropzone/Dropzone.tsx +40 -0
  81. package/src/components/Dropzone/index.ts +1 -0
  82. package/src/components/FileUpload/FileUpload.tsx +145 -0
  83. package/src/components/FileUpload/index.ts +1 -0
  84. package/src/components/FileUpload/styles.module.scss +3 -0
  85. package/src/components/HiddenDropZone/HiddenDropZone.tsx +39 -0
  86. package/src/components/HiddenDropZone/index.ts +1 -0
  87. package/src/components/HiddenDropZone/styles.module.scss +20 -0
  88. package/src/components/PrivateDropZone/PrivateDropZone.tsx +122 -0
  89. package/src/components/PrivateDropZone/constants.ts +1 -0
  90. package/src/components/PrivateDropZone/index.ts +2 -0
  91. package/src/components/PrivateDropZone/styles.module.scss +126 -0
  92. package/src/components/PrivateDropZone/types.ts +29 -0
  93. package/src/components/index.ts +3 -0
  94. package/src/constants.ts +19 -0
  95. package/src/hooks/useDrag.ts +49 -0
  96. package/src/index.ts +4 -0
  97. package/src/types.ts +36 -0
  98. package/src/utils.ts +89 -0
@@ -0,0 +1,23 @@
1
+ import { WithSupportProps } from '@cloud-ru/ds-utils';
2
+ import { ButtonHTMLAttributes, DetailedHTMLProps, ReactNode } from 'react';
3
+ import { FileFieldProps, Size } from '../../types.js';
4
+ import { UPLOAD_MODE } from './constants.js';
5
+ export type DragAndDropEventNames = 'onDragLeave' | 'onDragOver' | 'onDrop';
6
+ export type PrivateDropZoneProps = WithSupportProps<{
7
+ isOver: boolean;
8
+ /** Колбек с принятыми файлами (прошедшими проверку `maxSize` и `accept`). */
9
+ onFilesUpload(files: File[]): void;
10
+ /** Контент dropzone */
11
+ children?: ReactNode;
12
+ /** Деактивирован ли компонент */
13
+ disabled?: boolean;
14
+ /**
15
+ * Режим
16
+ * @default multiple
17
+ */
18
+ mode?: (typeof UPLOAD_MODE)[keyof typeof UPLOAD_MODE];
19
+ /** Размер компонента */
20
+ size?: Size;
21
+ /** CSS-класс */
22
+ className?: string;
23
+ } & FileFieldProps> & Pick<DetailedHTMLProps<ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, DragAndDropEventNames>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,3 @@
1
+ export * from './Dropzone/index.js';
2
+ export * from './FileUpload/index.js';
3
+ export * from './HiddenDropZone/index.js';
@@ -0,0 +1,3 @@
1
+ export * from './Dropzone/index.js';
2
+ export * from './FileUpload/index.js';
3
+ export * from './HiddenDropZone/index.js';
@@ -0,0 +1,17 @@
1
+ export declare const UPLOAD_MODE: {
2
+ readonly Single: "single";
3
+ readonly Multiple: "multiple";
4
+ };
5
+ export declare const SIZE: {
6
+ readonly S: "s";
7
+ readonly M: "m";
8
+ readonly L: "l";
9
+ };
10
+ export declare const TEST_IDS: {
11
+ readonly dropzone: {
12
+ readonly nativeInput: "file-input";
13
+ };
14
+ readonly fileUpload: {
15
+ readonly nativeInput: "file-upload__native-input";
16
+ };
17
+ };
@@ -0,0 +1,17 @@
1
+ export const UPLOAD_MODE = {
2
+ Single: 'single',
3
+ Multiple: 'multiple',
4
+ };
5
+ export const SIZE = {
6
+ S: 's',
7
+ M: 'm',
8
+ L: 'l',
9
+ };
10
+ export const TEST_IDS = {
11
+ dropzone: {
12
+ nativeInput: 'file-input',
13
+ },
14
+ fileUpload: {
15
+ nativeInput: 'file-upload__native-input',
16
+ },
17
+ };
@@ -0,0 +1,7 @@
1
+ import { DragEventHandler } from 'react';
2
+ type UseDragResult = {
3
+ events: Record<'onDragLeave' | 'onDragOver' | 'onDrop', DragEventHandler<HTMLElement>>;
4
+ isOver: boolean;
5
+ };
6
+ export declare function useDrag(disabled: boolean): UseDragResult;
7
+ export {};
@@ -0,0 +1,27 @@
1
+ import { debounce } from '@cloud-ru/ds-utils';
2
+ import { useCallback, useEffect, useMemo, useState } from 'react';
3
+ export function useDrag(disabled) {
4
+ const [isOver, setIsOver] = useState(false);
5
+ const debouncedSetIsOver = useMemo(() => debounce(setIsOver, 5), []);
6
+ const handleDragLeave = useCallback(e => {
7
+ if (!disabled) {
8
+ e.preventDefault();
9
+ debouncedSetIsOver(false);
10
+ }
11
+ }, [debouncedSetIsOver, disabled]);
12
+ const handleDragOver = useCallback(e => {
13
+ if (!disabled) {
14
+ e.preventDefault();
15
+ debouncedSetIsOver(true);
16
+ }
17
+ }, [debouncedSetIsOver, disabled]);
18
+ const handleDrop = useCallback(e => {
19
+ if (!disabled) {
20
+ e.preventDefault();
21
+ debouncedSetIsOver(false);
22
+ }
23
+ }, [debouncedSetIsOver, disabled]);
24
+ useEffect(() => () => debouncedSetIsOver.cancel(), [debouncedSetIsOver]);
25
+ const events = { onDragLeave: handleDragLeave, onDragOver: handleDragOver, onDrop: handleDrop };
26
+ return { events, isOver };
27
+ }
@@ -0,0 +1,4 @@
1
+ export * from './components/index.js';
2
+ export * from './constants.js';
3
+ export * from './types.js';
4
+ export * from './utils.js';
@@ -0,0 +1,4 @@
1
+ export * from './components/index.js';
2
+ export * from './constants.js';
3
+ export * from './types.js';
4
+ export * from './utils.js';
@@ -0,0 +1,428 @@
1
+ .hiddenInput{
2
+ display:none;
3
+ }
4
+ .wrapper{
5
+ position:relative;
6
+ display:inline-block;
7
+ }
8
+
9
+ .dropZone{
10
+ position:absolute;
11
+ width:100%;
12
+ height:100%;
13
+ }
14
+
15
+ .hidden *{
16
+ visibility:hidden;
17
+ opacity:0;
18
+ }
19
+
20
+ .children{
21
+ width:100%;
22
+ height:100%;
23
+ }
24
+ @charset "UTF-8";
25
+ .hidden{
26
+ display:none;
27
+ }
28
+
29
+ .content{
30
+ z-index:1;
31
+ display:flex;
32
+ align-items:center;
33
+ justify-content:center;
34
+ width:100%;
35
+ height:100%;
36
+ }
37
+
38
+ .overLayer{
39
+ pointer-events:none;
40
+ position:absolute;
41
+ inset:0;
42
+ border-radius:inherit;
43
+ visibility:hidden;
44
+ background-color:var(--sn-theme-color-material-stateLayer-activated-hovered-filled, var(--sn-brand-color-state-activated-hovered-background, var(--sn-brandRole-color-brandA-backgroundActivatedHovered, rgba(56, 159, 116, 0.3490196078))));
45
+ }
46
+
47
+ .borderLayer{
48
+ visibility:initial;
49
+ }
50
+
51
+ .acrylic{
52
+ pointer-events:none;
53
+ position:absolute;
54
+ inset:0;
55
+ border-radius:inherit;
56
+ }
57
+
58
+ .container{
59
+ cursor:pointer;
60
+ position:relative;
61
+ z-index:0;
62
+ display:flex;
63
+ flex-direction:column;
64
+ align-items:center;
65
+ justify-content:center;
66
+ box-sizing:border-box;
67
+ width:100%;
68
+ margin:0;
69
+ padding:0;
70
+ border:none;
71
+ font-family:inherit;
72
+ text-decoration:none;
73
+ background:transparent;
74
+ background-color:var(--sn-theme-color-neutral-background1Level, var(--sn-brand-color-neutral-95, var(--sn-primitive-color-gray-95, #fdfdfd)));
75
+ outline:0;
76
+ outline-offset:0;
77
+ }
78
+ .container[data-acrylic-appearance=primary][data-acrylic-level=default]{
79
+ backdrop-filter:blur(calc(var(--sn-acrylic-blurBackground, 0) / 2));
80
+ }
81
+ .container[data-acrylic-appearance=primary][data-acrylic-level=default] .acrylic{
82
+ opacity:var(--sn-acrylic-opacityBackground, 1);
83
+ background:var(--sn-theme-color-primary-background, var(--sn-brand-color-primary-90, var(--sn-brandRole-color-brandA-90, var(--sn-primitive-color-brandA-90, #edf7f1))));
84
+ }
85
+ .container[data-acrylic-appearance=primary][data-acrylic-level="1Level"]{
86
+ backdrop-filter:blur(calc(var(--sn-acrylic-blurBackground1Level, 0) / 2));
87
+ }
88
+ .container[data-acrylic-appearance=primary][data-acrylic-level="1Level"] .acrylic{
89
+ opacity:var(--sn-acrylic-opacityBackground1Level, 1);
90
+ background:var(--sn-theme-color-primary-background1Level, var(--sn-brand-color-primary-95, var(--sn-brandRole-color-brandA-95, var(--sn-primitive-color-brandA-95, #f5fdf8))));
91
+ }
92
+ .container[data-acrylic-appearance=primary][data-acrylic-level="2Level"]{
93
+ backdrop-filter:blur(calc(var(--sn-acrylic-blurBackground2Level, 0) / 2));
94
+ }
95
+ .container[data-acrylic-appearance=primary][data-acrylic-level="2Level"] .acrylic{
96
+ opacity:var(--sn-acrylic-opacityBackground2Level, 1);
97
+ background:var(--sn-theme-color-primary-background2Level, var(--sn-brand-color-primary-99, var(--sn-brandRole-color-brandA-99, var(--sn-primitive-color-brandA-99, #fbfffc))));
98
+ }
99
+ .container[data-acrylic-appearance=neutral][data-acrylic-level=default]{
100
+ backdrop-filter:blur(calc(var(--sn-acrylic-blurBackground, 0) / 2));
101
+ }
102
+ .container[data-acrylic-appearance=neutral][data-acrylic-level=default] .acrylic{
103
+ opacity:var(--sn-acrylic-opacityBackground, 1);
104
+ background:var(--sn-theme-color-neutral-background, var(--sn-brand-color-neutral-90, var(--sn-primitive-color-gray-90, #eeeff3)));
105
+ }
106
+ .container[data-acrylic-appearance=neutral][data-acrylic-level="1Level"]{
107
+ backdrop-filter:blur(calc(var(--sn-acrylic-blurBackground1Level, 0) / 2));
108
+ }
109
+ .container[data-acrylic-appearance=neutral][data-acrylic-level="1Level"] .acrylic{
110
+ opacity:var(--sn-acrylic-opacityBackground1Level, 1);
111
+ background:var(--sn-theme-color-neutral-background1Level, var(--sn-brand-color-neutral-95, var(--sn-primitive-color-gray-95, #fdfdfd)));
112
+ }
113
+ .container[data-acrylic-appearance=neutral][data-acrylic-level="2Level"]{
114
+ backdrop-filter:blur(calc(var(--sn-acrylic-blurBackground2Level, 0) / 2));
115
+ }
116
+ .container[data-acrylic-appearance=neutral][data-acrylic-level="2Level"] .acrylic{
117
+ opacity:var(--sn-acrylic-opacityBackground2Level, 1);
118
+ background:var(--sn-theme-color-neutral-background2Level, var(--sn-brand-color-neutral-99, var(--sn-primitive-color-gray-99, #ffffff)));
119
+ }
120
+ .container[data-acrylic-appearance=red][data-acrylic-level=default]{
121
+ backdrop-filter:blur(calc(var(--sn-acrylic-blurBackground, 0) / 2));
122
+ }
123
+ .container[data-acrylic-appearance=red][data-acrylic-level=default] .acrylic{
124
+ opacity:var(--sn-acrylic-opacityBackground, 1);
125
+ background:var(--sn-theme-color-red-background, var(--sn-primitive-color-red-90, #fee8e5));
126
+ }
127
+ .container[data-acrylic-appearance=red][data-acrylic-level="1Level"]{
128
+ backdrop-filter:blur(calc(var(--sn-acrylic-blurBackground1Level, 0) / 2));
129
+ }
130
+ .container[data-acrylic-appearance=red][data-acrylic-level="1Level"] .acrylic{
131
+ opacity:var(--sn-acrylic-opacityBackground1Level, 1);
132
+ background:var(--sn-theme-color-red-background1Level, var(--sn-primitive-color-red-95, #fef5f1));
133
+ }
134
+ .container[data-acrylic-appearance=red][data-acrylic-level="2Level"]{
135
+ backdrop-filter:blur(calc(var(--sn-acrylic-blurBackground2Level, 0) / 2));
136
+ }
137
+ .container[data-acrylic-appearance=red][data-acrylic-level="2Level"] .acrylic{
138
+ opacity:var(--sn-acrylic-opacityBackground2Level, 1);
139
+ background:var(--sn-theme-color-red-background2Level, var(--sn-primitive-color-red-99, #fffaf7));
140
+ }
141
+ .container[data-acrylic-appearance=orange][data-acrylic-level=default]{
142
+ backdrop-filter:blur(calc(var(--sn-acrylic-blurBackground, 0) / 2));
143
+ }
144
+ .container[data-acrylic-appearance=orange][data-acrylic-level=default] .acrylic{
145
+ opacity:var(--sn-acrylic-opacityBackground, 1);
146
+ background:var(--sn-theme-color-orange-background, var(--sn-primitive-color-orange-90, #ffedcf));
147
+ }
148
+ .container[data-acrylic-appearance=orange][data-acrylic-level="1Level"]{
149
+ backdrop-filter:blur(calc(var(--sn-acrylic-blurBackground1Level, 0) / 2));
150
+ }
151
+ .container[data-acrylic-appearance=orange][data-acrylic-level="1Level"] .acrylic{
152
+ opacity:var(--sn-acrylic-opacityBackground1Level, 1);
153
+ background:var(--sn-theme-color-orange-background1Level, var(--sn-primitive-color-orange-95, #fff6e5));
154
+ }
155
+ .container[data-acrylic-appearance=orange][data-acrylic-level="2Level"]{
156
+ backdrop-filter:blur(calc(var(--sn-acrylic-blurBackground2Level, 0) / 2));
157
+ }
158
+ .container[data-acrylic-appearance=orange][data-acrylic-level="2Level"] .acrylic{
159
+ opacity:var(--sn-acrylic-opacityBackground2Level, 1);
160
+ background:var(--sn-theme-color-orange-background2Level, var(--sn-primitive-color-orange-99, #fffcf4));
161
+ }
162
+ .container[data-acrylic-appearance=yellow][data-acrylic-level=default]{
163
+ backdrop-filter:blur(calc(var(--sn-acrylic-blurBackground, 0) / 2));
164
+ }
165
+ .container[data-acrylic-appearance=yellow][data-acrylic-level=default] .acrylic{
166
+ opacity:var(--sn-acrylic-opacityBackground, 1);
167
+ background:var(--sn-theme-color-yellow-background, var(--sn-primitive-color-yellow-90, #fdf4cc));
168
+ }
169
+ .container[data-acrylic-appearance=yellow][data-acrylic-level="1Level"]{
170
+ backdrop-filter:blur(calc(var(--sn-acrylic-blurBackground1Level, 0) / 2));
171
+ }
172
+ .container[data-acrylic-appearance=yellow][data-acrylic-level="1Level"] .acrylic{
173
+ opacity:var(--sn-acrylic-opacityBackground1Level, 1);
174
+ background:var(--sn-theme-color-yellow-background1Level, var(--sn-primitive-color-yellow-95, #fffbe6));
175
+ }
176
+ .container[data-acrylic-appearance=yellow][data-acrylic-level="2Level"]{
177
+ backdrop-filter:blur(calc(var(--sn-acrylic-blurBackground2Level, 0) / 2));
178
+ }
179
+ .container[data-acrylic-appearance=yellow][data-acrylic-level="2Level"] .acrylic{
180
+ opacity:var(--sn-acrylic-opacityBackground2Level, 1);
181
+ background:var(--sn-theme-color-yellow-background2Level, var(--sn-primitive-color-yellow-99, #fffef6));
182
+ }
183
+ .container[data-acrylic-appearance=green][data-acrylic-level=default]{
184
+ backdrop-filter:blur(calc(var(--sn-acrylic-blurBackground, 0) / 2));
185
+ }
186
+ .container[data-acrylic-appearance=green][data-acrylic-level=default] .acrylic{
187
+ opacity:var(--sn-acrylic-opacityBackground, 1);
188
+ background:var(--sn-theme-color-green-background, var(--sn-primitive-color-green-90, #e4f5df));
189
+ }
190
+ .container[data-acrylic-appearance=green][data-acrylic-level="1Level"]{
191
+ backdrop-filter:blur(calc(var(--sn-acrylic-blurBackground1Level, 0) / 2));
192
+ }
193
+ .container[data-acrylic-appearance=green][data-acrylic-level="1Level"] .acrylic{
194
+ opacity:var(--sn-acrylic-opacityBackground1Level, 1);
195
+ background:var(--sn-theme-color-green-background1Level, var(--sn-primitive-color-green-95, #f1faed));
196
+ }
197
+ .container[data-acrylic-appearance=green][data-acrylic-level="2Level"]{
198
+ backdrop-filter:blur(calc(var(--sn-acrylic-blurBackground2Level, 0) / 2));
199
+ }
200
+ .container[data-acrylic-appearance=green][data-acrylic-level="2Level"] .acrylic{
201
+ opacity:var(--sn-acrylic-opacityBackground2Level, 1);
202
+ background:var(--sn-theme-color-green-background2Level, var(--sn-primitive-color-green-99, #fcfefa));
203
+ }
204
+ .container[data-acrylic-appearance=blue][data-acrylic-level=default]{
205
+ backdrop-filter:blur(calc(var(--sn-acrylic-blurBackground, 0) / 2));
206
+ }
207
+ .container[data-acrylic-appearance=blue][data-acrylic-level=default] .acrylic{
208
+ opacity:var(--sn-acrylic-opacityBackground, 1);
209
+ background:var(--sn-theme-color-blue-background, var(--sn-primitive-color-blue-90, #e6f4fd));
210
+ }
211
+ .container[data-acrylic-appearance=blue][data-acrylic-level="1Level"]{
212
+ backdrop-filter:blur(calc(var(--sn-acrylic-blurBackground1Level, 0) / 2));
213
+ }
214
+ .container[data-acrylic-appearance=blue][data-acrylic-level="1Level"] .acrylic{
215
+ opacity:var(--sn-acrylic-opacityBackground1Level, 1);
216
+ background:var(--sn-theme-color-blue-background1Level, var(--sn-primitive-color-blue-95, #f2f9ff));
217
+ }
218
+ .container[data-acrylic-appearance=blue][data-acrylic-level="2Level"]{
219
+ backdrop-filter:blur(calc(var(--sn-acrylic-blurBackground2Level, 0) / 2));
220
+ }
221
+ .container[data-acrylic-appearance=blue][data-acrylic-level="2Level"] .acrylic{
222
+ opacity:var(--sn-acrylic-opacityBackground2Level, 1);
223
+ background:var(--sn-theme-color-blue-background2Level, var(--sn-primitive-color-blue-99, #fdfeff));
224
+ }
225
+ .container[data-acrylic-appearance=violet][data-acrylic-level=default]{
226
+ backdrop-filter:blur(calc(var(--sn-acrylic-blurBackground, 0) / 2));
227
+ }
228
+ .container[data-acrylic-appearance=violet][data-acrylic-level=default] .acrylic{
229
+ opacity:var(--sn-acrylic-opacityBackground, 1);
230
+ background:var(--sn-theme-color-violet-background, var(--sn-primitive-color-violet-90, #f3edfc));
231
+ }
232
+ .container[data-acrylic-appearance=violet][data-acrylic-level="1Level"]{
233
+ backdrop-filter:blur(calc(var(--sn-acrylic-blurBackground1Level, 0) / 2));
234
+ }
235
+ .container[data-acrylic-appearance=violet][data-acrylic-level="1Level"] .acrylic{
236
+ opacity:var(--sn-acrylic-opacityBackground1Level, 1);
237
+ background:var(--sn-theme-color-violet-background1Level, var(--sn-primitive-color-violet-95, #f9f5ff));
238
+ }
239
+ .container[data-acrylic-appearance=violet][data-acrylic-level="2Level"]{
240
+ backdrop-filter:blur(calc(var(--sn-acrylic-blurBackground2Level, 0) / 2));
241
+ }
242
+ .container[data-acrylic-appearance=violet][data-acrylic-level="2Level"] .acrylic{
243
+ opacity:var(--sn-acrylic-opacityBackground2Level, 1);
244
+ background:var(--sn-theme-color-violet-background2Level, var(--sn-primitive-color-violet-99, #fdfdfd));
245
+ }
246
+ .container[data-acrylic-appearance=pink][data-acrylic-level=default]{
247
+ backdrop-filter:blur(calc(var(--sn-acrylic-blurBackground, 0) / 2));
248
+ }
249
+ .container[data-acrylic-appearance=pink][data-acrylic-level=default] .acrylic{
250
+ opacity:var(--sn-acrylic-opacityBackground, 1);
251
+ background:var(--sn-theme-color-pink-background, var(--sn-primitive-color-pink-90, #fceaf0));
252
+ }
253
+ .container[data-acrylic-appearance=pink][data-acrylic-level="1Level"]{
254
+ backdrop-filter:blur(calc(var(--sn-acrylic-blurBackground1Level, 0) / 2));
255
+ }
256
+ .container[data-acrylic-appearance=pink][data-acrylic-level="1Level"] .acrylic{
257
+ opacity:var(--sn-acrylic-opacityBackground1Level, 1);
258
+ background:var(--sn-theme-color-pink-background1Level, var(--sn-primitive-color-pink-95, #fff5f7));
259
+ }
260
+ .container[data-acrylic-appearance=pink][data-acrylic-level="2Level"]{
261
+ backdrop-filter:blur(calc(var(--sn-acrylic-blurBackground2Level, 0) / 2));
262
+ }
263
+ .container[data-acrylic-appearance=pink][data-acrylic-level="2Level"] .acrylic{
264
+ opacity:var(--sn-acrylic-opacityBackground2Level, 1);
265
+ background:var(--sn-theme-color-pink-background2Level, var(--sn-primitive-color-pink-99, #fdfcfc));
266
+ }
267
+ .container[data-acrylic-appearance=transparent]{
268
+ backdrop-filter:blur(calc(var(--sn-acrylic-blurBackground1Level, 0) / 2));
269
+ }
270
+ .container[data-acrylic-appearance=transparent] .acrylic{
271
+ opacity:var(--sn-acrylic-opacityBackground1Level, 1);
272
+ background:transparent;
273
+ }
274
+ .container[data-acrylic-appearance=decorTransparent]{
275
+ backdrop-filter:blur(calc(var(--sn-acrylic-blurBackground1Level, 0) / 2));
276
+ }
277
+ .container[data-acrylic-appearance=decorTransparent] .acrylic{
278
+ opacity:var(--sn-acrylic-opacityBackground1Level, 1);
279
+ background:var(--sn-theme-color-neutral-decorTransparent, var(--sn-brand-color-neutral-transparent-forLightMode, rgba(124, 131, 182, 0.0784313725)));
280
+ }
281
+ .container .content{
282
+ color:var(--sn-theme-color-available-version-textMain, var(--sn-brand-color-text-version-main, #41424e));
283
+ }
284
+ .container:focus-visible{
285
+ outline:var(--sn-brand-anatomy-focusLine-field-strokeWeight, var(--sn-primitive-strokeWeight-strokeBold, 3px)) solid var(--sn-theme-color-primary-accent, var(--sn-brand-color-primary-55, var(--sn-brandRole-color-brandA-55, var(--sn-primitive-color-brandA-55, #389f74))));
286
+ outline-offset:0;
287
+ }
288
+ .container[data-over] .overLayer{
289
+ visibility:inherit;
290
+ }
291
+ .container[data-size=s]{
292
+ border-radius:var(--sn-dropzone-anatomy-size-s-borderRadius, var(--sn-brand-anatomy-radius-field-s, var(--sn-primitive-dimension-2, 2px)));
293
+ min-height:var(--sn-dropzone-anatomy-size-s-minHeight, var(--sn-density-size-s, var(--sn-primitive-dimension-48, 48px)));
294
+ border-width:var(--sn-dropzone-anatomy-size-s-borderWidth, var(--sn-brand-anatomy-line-field-strokeWeight, var(--sn-primitive-strokeWeight-strokeRegular, 1px)));
295
+ padding-left:var(--sn-dropzone-anatomy-size-s-paddingHorizontal, var(--sn-density-spacing-control-container-horizontal-s, var(--sn-primitive-dimension-12, 12px)));
296
+ padding-right:var(--sn-dropzone-anatomy-size-s-paddingHorizontal, var(--sn-density-spacing-control-container-horizontal-s, var(--sn-primitive-dimension-12, 12px)));
297
+ padding-top:var(--sn-dropzone-anatomy-size-s-paddingVertical, var(--sn-density-spacing-control-container-vertical-s, var(--sn-primitive-dimension-6, 6px)));
298
+ padding-bottom:var(--sn-dropzone-anatomy-size-s-paddingVertical, var(--sn-density-spacing-control-container-vertical-s, var(--sn-primitive-dimension-6, 6px)));
299
+ }
300
+ .container[data-size=s] .content{
301
+ padding-left:var(--sn-dropzone-anatomy-size-s-contentWrapper-paddingHorizontal, var(--sn-density-spacing-control-wrapper-horizontal-s, var(--sn-primitive-dimension-8, 8px)));
302
+ padding-right:var(--sn-dropzone-anatomy-size-s-contentWrapper-paddingHorizontal, var(--sn-density-spacing-control-wrapper-horizontal-s, var(--sn-primitive-dimension-8, 8px)));
303
+ padding-top:var(--sn-dropzone-anatomy-size-s-contentWrapper-paddingVertical, var(--sn-density-spacing-control-wrapper-vertical-s, var(--sn-primitive-dimension-8, 8px)));
304
+ padding-bottom:var(--sn-dropzone-anatomy-size-s-contentWrapper-paddingVertical, var(--sn-density-spacing-control-wrapper-vertical-s, var(--sn-primitive-dimension-8, 8px)));
305
+ }
306
+ .container[data-size=m]{
307
+ border-radius:var(--sn-dropzone-anatomy-size-m-borderRadius, var(--sn-brand-anatomy-radius-field-m, var(--sn-primitive-dimension-2, 2px)));
308
+ padding-left:var(--sn-dropzone-anatomy-size-m-paddingHorizontal, var(--sn-density-spacing-control-container-horizontal-m, var(--sn-primitive-dimension-16, 16px)));
309
+ padding-right:var(--sn-dropzone-anatomy-size-m-paddingHorizontal, var(--sn-density-spacing-control-container-horizontal-m, var(--sn-primitive-dimension-16, 16px)));
310
+ padding-top:var(--sn-dropzone-anatomy-size-m-paddingVertical, var(--sn-density-spacing-control-container-vertical-m, var(--sn-primitive-dimension-8, 8px)));
311
+ padding-bottom:var(--sn-dropzone-anatomy-size-m-paddingVertical, var(--sn-density-spacing-control-container-vertical-m, var(--sn-primitive-dimension-8, 8px)));
312
+ min-height:var(--sn-dropzone-anatomy-size-m-minHeight, var(--sn-density-size-m, var(--sn-primitive-dimension-56, 56px)));
313
+ border-width:var(--sn-dropzone-anatomy-size-m-borderWidth, var(--sn-brand-anatomy-line-field-strokeWeight, var(--sn-primitive-strokeWeight-strokeRegular, 1px)));
314
+ }
315
+ .container[data-size=m] .content{
316
+ padding-left:var(--sn-dropzone-anatomy-size-m-contentWrapper-paddingHorizontal, var(--sn-density-spacing-control-wrapper-horizontal-m, var(--sn-primitive-dimension-8, 8px)));
317
+ padding-right:var(--sn-dropzone-anatomy-size-m-contentWrapper-paddingHorizontal, var(--sn-density-spacing-control-wrapper-horizontal-m, var(--sn-primitive-dimension-8, 8px)));
318
+ padding-top:var(--sn-dropzone-anatomy-size-m-contentWrapper-paddingVertical, var(--sn-density-spacing-control-wrapper-vertical-m, var(--sn-primitive-dimension-8, 8px)));
319
+ padding-bottom:var(--sn-dropzone-anatomy-size-m-contentWrapper-paddingVertical, var(--sn-density-spacing-control-wrapper-vertical-m, var(--sn-primitive-dimension-8, 8px)));
320
+ }
321
+ .container[data-size=l]{
322
+ border-radius:var(--sn-dropzone-anatomy-size-l-borderRadius, var(--sn-brand-anatomy-radius-field-l, var(--sn-primitive-dimension-2, 2px)));
323
+ padding-left:var(--sn-dropzone-anatomy-size-l-paddingHorizontal, var(--sn-density-spacing-control-container-horizontal-l, var(--sn-primitive-dimension-20, 20px)));
324
+ padding-right:var(--sn-dropzone-anatomy-size-l-paddingHorizontal, var(--sn-density-spacing-control-container-horizontal-l, var(--sn-primitive-dimension-20, 20px)));
325
+ padding-top:var(--sn-dropzone-anatomy-size-l-paddingVertical, var(--sn-density-spacing-control-container-vertical-l, var(--sn-primitive-dimension-10, 10px)));
326
+ padding-bottom:var(--sn-dropzone-anatomy-size-l-paddingVertical, var(--sn-density-spacing-control-container-vertical-l, var(--sn-primitive-dimension-10, 10px)));
327
+ min-height:var(--sn-dropzone-anatomy-size-l-minHeight, var(--sn-density-size-l, var(--sn-primitive-dimension-64, 64px)));
328
+ border-width:var(--sn-dropzone-anatomy-size-l-borderWidth, var(--sn-brand-anatomy-line-field-strokeWeight, var(--sn-primitive-strokeWeight-strokeRegular, 1px)));
329
+ }
330
+ .container[data-size=l] .content{
331
+ padding-left:var(--sn-dropzone-anatomy-size-l-contentWrapper-paddingHorizontal, var(--sn-density-spacing-control-wrapper-horizontal-l, var(--sn-primitive-dimension-12, 12px)));
332
+ padding-right:var(--sn-dropzone-anatomy-size-l-contentWrapper-paddingHorizontal, var(--sn-density-spacing-control-wrapper-horizontal-l, var(--sn-primitive-dimension-12, 12px)));
333
+ padding-top:var(--sn-dropzone-anatomy-size-l-contentWrapper-paddingVertical, var(--sn-density-spacing-control-wrapper-vertical-l, var(--sn-primitive-dimension-8, 8px)));
334
+ padding-bottom:var(--sn-dropzone-anatomy-size-l-contentWrapper-paddingVertical, var(--sn-density-spacing-control-wrapper-vertical-l, var(--sn-primitive-dimension-8, 8px)));
335
+ }
336
+ .container[data-disabled]{
337
+ cursor:not-allowed;
338
+ background-color:var(--sn-theme-color-neutral-background, var(--sn-brand-color-neutral-90, var(--sn-primitive-color-gray-90, #eeeff3)));
339
+ }
340
+ .container[data-disabled] .content{
341
+ opacity:var(--sn-theme-effect-opacity-disabled, 0.4);
342
+ }
343
+ .container .borderLayer{
344
+ position:absolute;
345
+ inset:0;
346
+ border-radius:inherit;
347
+ }
348
+ .container .borderLayer[data-state=borderOnBackground]{
349
+ border-color:var(--sn-theme-color-material-stateLayer-neutral-border-default-borderColor, var(--sn-brand-color-state-neutralBorder-forLightMode-default-borderColor, rgba(159, 166, 198, 0.3019607843)));
350
+ border-style:solid;
351
+ border-width:var(--sn-primitive-strokeWeight-strokeRegular, 1px);
352
+ }
353
+ .container .borderLayer[data-state=emptyNeutralOnBackground]{
354
+ background:var(--sn-theme-color-material-stateLayer-neutral-onBackground-defaultEmpty-filled, var(--sn-brand-color-state-neutral-forLightMode-default-background, rgba(120, 123, 138, 0)));
355
+ }
356
+ .container .borderLayer[data-state=activatedOnBackground]{
357
+ background:var(--sn-theme-color-material-stateLayer-activated-default-filled, var(--sn-brand-color-state-activated-default-background, var(--sn-brandRole-color-brandA-backgroundActivatedDefault, rgba(56, 159, 116, 0.1490196078))));
358
+ }
359
+ .container .borderLayer[data-state=versionOnColor]{
360
+ background:var(--sn-theme-color-material-stateLayer-versionOnColor-default-filled, rgba(0, 0, 0, 0.0509803922));
361
+ }
362
+ .container .borderLayer[data-state=emptyVersionOnColor]{
363
+ background:var(--sn-theme-color-material-stateLayer-versionOnColor-defaultEmpty-filled, rgba(0, 0, 0, 0));
364
+ }
365
+ .container .borderLayer[data-state=inversionOnColor]{
366
+ background:var(--sn-theme-color-material-stateLayer-inversionOnColor-default-filled, rgba(255, 255, 255, 0.1019607843));
367
+ }
368
+ .container .borderLayer[data-state=emptyInversionOnColor]{
369
+ background:var(--sn-theme-color-material-stateLayer-inversionOnColor-defaultEmpty-filled, rgba(255, 255, 255, 0));
370
+ }
371
+ .container .borderLayer[data-state=emptyDarkOnAccent]{
372
+ background:var(--sn-theme-color-material-stateLayer-darkOnAccent-defaultEmpty-filled, rgba(0, 0, 0, 0));
373
+ }
374
+ @media (hover: hover){
375
+ .container:hover:not([data-disabled], [data-loading]) .borderLayer[data-state=borderOnBackground]{
376
+ border-color:var(--sn-theme-color-material-stateLayer-neutral-border-hovered-borderColor, var(--sn-brand-color-state-neutralBorder-forLightMode-hovered-borderColor, rgba(159, 166, 198, 0.6509803922)));
377
+ }
378
+ .container:hover:not([data-disabled], [data-loading]) .borderLayer[data-state=emptyNeutralOnBackground]{
379
+ background:var(--sn-theme-color-material-stateLayer-neutral-onBackground-hovered-filled, var(--sn-brand-color-state-neutral-forLightMode-hovered-background, rgba(188, 195, 220, 0.1490196078)));
380
+ }
381
+ .container:hover:not([data-disabled], [data-loading]) .borderLayer[data-state=activatedOnBackground]{
382
+ background:var(--sn-theme-color-material-stateLayer-activated-hovered-filled, var(--sn-brand-color-state-activated-hovered-background, var(--sn-brandRole-color-brandA-backgroundActivatedHovered, rgba(56, 159, 116, 0.3490196078))));
383
+ }
384
+ .container:hover:not([data-disabled], [data-loading]) .borderLayer[data-state=versionOnColor]{
385
+ background:var(--sn-theme-color-material-stateLayer-versionOnColor-hovered-filled, rgba(0, 0, 0, 0.1019607843));
386
+ }
387
+ .container:hover:not([data-disabled], [data-loading]) .borderLayer[data-state=emptyVersionOnColor]{
388
+ background:var(--sn-theme-color-material-stateLayer-versionOnColor-hovered-filled, rgba(0, 0, 0, 0.1019607843));
389
+ }
390
+ .container:hover:not([data-disabled], [data-loading]) .borderLayer[data-state=inversionOnColor]{
391
+ background:var(--sn-theme-color-material-stateLayer-inversionOnColor-hovered-filled, rgba(255, 255, 255, 0.1490196078));
392
+ }
393
+ .container:hover:not([data-disabled], [data-loading]) .borderLayer[data-state=emptyInversionOnColor]{
394
+ background:var(--sn-theme-color-material-stateLayer-inversionOnColor-hovered-filled, rgba(255, 255, 255, 0.1490196078));
395
+ }
396
+ .container:hover:not([data-disabled], [data-loading]) .borderLayer[data-state=emptyDarkOnAccent]{
397
+ background:var(--sn-theme-color-material-stateLayer-darkOnAccent-hovered-filled, rgba(0, 0, 0, 0.0588235294));
398
+ }
399
+ }
400
+ .container{
401
+ }
402
+ .container[data-loading] .borderLayer[data-state=borderOnBackground], .container:active:not([data-disabled], [data-loading]) .borderLayer[data-state=borderOnBackground], .container[data-pressed=true]:not([data-disabled], [data-loading]) .borderLayer[data-state=borderOnBackground]{
403
+ border-color:var(--sn-theme-color-material-stateLayer-neutral-border-pressed-borderColor, var(--sn-brand-color-state-neutralBorder-forLightMode-pressed-borderColor, rgba(159, 166, 198, 0.8)));
404
+ }
405
+ .container[data-loading] .borderLayer[data-state=emptyNeutralOnBackground], .container:active:not([data-disabled], [data-loading]) .borderLayer[data-state=emptyNeutralOnBackground], .container[data-pressed=true]:not([data-disabled], [data-loading]) .borderLayer[data-state=emptyNeutralOnBackground]{
406
+ background:var(--sn-theme-color-material-stateLayer-neutral-onBackground-pressed-filled, var(--sn-brand-color-state-neutral-forLightMode-pressed-background, rgba(188, 195, 220, 0.3019607843)));
407
+ }
408
+ .container[data-loading] .borderLayer[data-state=activatedOnBackground], .container:active:not([data-disabled], [data-loading]) .borderLayer[data-state=activatedOnBackground], .container[data-pressed=true]:not([data-disabled], [data-loading]) .borderLayer[data-state=activatedOnBackground]{
409
+ background:var(--sn-theme-color-material-stateLayer-activated-pressed-filled, var(--sn-brand-color-state-activated-pressed-background, var(--sn-brandRole-color-brandA-backgroundActivatedPressed, rgba(56, 159, 116, 0.4509803922))));
410
+ }
411
+ .container[data-loading] .borderLayer[data-state=versionOnColor], .container:active:not([data-disabled], [data-loading]) .borderLayer[data-state=versionOnColor], .container[data-pressed=true]:not([data-disabled], [data-loading]) .borderLayer[data-state=versionOnColor]{
412
+ background:var(--sn-theme-color-material-stateLayer-versionOnColor-pressed-filled, rgba(0, 0, 0, 0.1490196078));
413
+ }
414
+ .container[data-loading] .borderLayer[data-state=emptyVersionOnColor], .container:active:not([data-disabled], [data-loading]) .borderLayer[data-state=emptyVersionOnColor], .container[data-pressed=true]:not([data-disabled], [data-loading]) .borderLayer[data-state=emptyVersionOnColor]{
415
+ background:var(--sn-theme-color-material-stateLayer-versionOnColor-pressed-filled, rgba(0, 0, 0, 0.1490196078));
416
+ }
417
+ .container[data-loading] .borderLayer[data-state=inversionOnColor], .container:active:not([data-disabled], [data-loading]) .borderLayer[data-state=inversionOnColor], .container[data-pressed=true]:not([data-disabled], [data-loading]) .borderLayer[data-state=inversionOnColor]{
418
+ background:var(--sn-theme-color-material-stateLayer-inversionOnColor-pressed-filled, rgba(255, 255, 255, 0.0509803922));
419
+ }
420
+ .container[data-loading] .borderLayer[data-state=emptyInversionOnColor], .container:active:not([data-disabled], [data-loading]) .borderLayer[data-state=emptyInversionOnColor], .container[data-pressed=true]:not([data-disabled], [data-loading]) .borderLayer[data-state=emptyInversionOnColor]{
421
+ background:var(--sn-theme-color-material-stateLayer-inversionOnColor-pressed-filled, rgba(255, 255, 255, 0.0509803922));
422
+ }
423
+ .container[data-loading] .borderLayer[data-state=emptyDarkOnAccent], .container:active:not([data-disabled], [data-loading]) .borderLayer[data-state=emptyDarkOnAccent], .container[data-pressed=true]:not([data-disabled], [data-loading]) .borderLayer[data-state=emptyDarkOnAccent]{
424
+ background:var(--sn-theme-color-material-stateLayer-darkOnAccent-pressed-filled, rgba(0, 0, 0, 0.1215686275));
425
+ }
426
+ .container > [data-state-layer][data-state=borderOnBackground]{
427
+ border-style:dashed !important;
428
+ }
@@ -0,0 +1,33 @@
1
+ import { ValueOf } from '@cloud-ru/ds-utils';
2
+ import { ChangeEventHandler, Ref } from 'react';
3
+ import { SIZE, UPLOAD_MODE } from './constants.js';
4
+ import { AcceptInput, FileRejection } from './utils.js';
5
+ export type UploadMode = ValueOf<typeof UPLOAD_MODE>;
6
+ export type Size = ValueOf<typeof SIZE>;
7
+ /**
8
+ * Пропы, превращающие компонент загрузки в полноценное поле формы: нативные
9
+ * атрибуты скрытого `<input type="file">`, ссылка на него, валидация файлов.
10
+ * Общий контракт для FileUpload, Dropzone и HiddenDropZone.
11
+ */
12
+ export type FileFieldProps = {
13
+ /** Разрешённые типы: MIME-тип (`image/png`), шаблон (`image/*`) или расширение (`.pdf`). Строка или массив. */
14
+ accept?: AcceptInput;
15
+ /** Максимальный размер одного файла в байтах. Превысившие уходят в `onFilesReject`. */
16
+ maxSize?: number;
17
+ /** Колбек с отклонёнными файлами и причиной (`maxSize` / `mime`). */
18
+ onFilesReject?(rejections: FileRejection[]): void;
19
+ /** Нативный `name` скрытого input — для отправки формы и интеграции с form-библиотеками. */
20
+ name?: string;
21
+ /** Нативный `id` скрытого input — для связи с `<label htmlFor>`. */
22
+ id?: string;
23
+ /** Нативный `required` скрытого input. */
24
+ required?: boolean;
25
+ /** Нативный `form` скрытого input — привязка к форме по `id`. */
26
+ form?: string;
27
+ /** Нативный `capture` скрытого input — источник захвата на мобильных (камера/микрофон). */
28
+ capture?: boolean | 'user' | 'environment';
29
+ /** Нативный `onChange` скрытого input. Вызывается до валидации с исходным событием. */
30
+ onChange?: ChangeEventHandler<HTMLInputElement>;
31
+ /** Ссылка на нативный `<input type="file">` — для интеграции с формами (react-hook-form `ref`). */
32
+ innerRef?: Ref<HTMLInputElement>;
33
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,37 @@
1
+ export declare const FILE_REJECTION_REASON: {
2
+ readonly MaxSize: "maxSize";
3
+ readonly Mime: "mime";
4
+ };
5
+ export type FileRejectionReason = (typeof FILE_REJECTION_REASON)[keyof typeof FILE_REJECTION_REASON];
6
+ export type FileRejection = {
7
+ file: File;
8
+ reason: FileRejectionReason;
9
+ };
10
+ export type AcceptInput = string | string[] | undefined;
11
+ /**
12
+ * Нормализует значение `accept` в массив отдельных токенов
13
+ * (MIME-типы вида `image/png`, MIME-шаблоны `image/*`, расширения `.pdf`).
14
+ * Принимает строку с запятыми (как в нативном HTML-атрибуте), массив или undefined.
15
+ */
16
+ export declare function normalizeAccept(accept: AcceptInput): string[];
17
+ /**
18
+ * Преобразует нормализованный `accept` в строку для нативного `<input accept>`
19
+ * (через запятую). Возвращает undefined, если список пуст — чтобы не задавать
20
+ * атрибут в DOM и не ограничивать picker.
21
+ */
22
+ export declare function buildAcceptAttribute(accept: AcceptInput): string | undefined;
23
+ export type PartitionOptions = {
24
+ maxSize?: number;
25
+ accept?: AcceptInput;
26
+ };
27
+ export type PartitionResult = {
28
+ accepted: File[];
29
+ rejected: FileRejection[];
30
+ };
31
+ /**
32
+ * Разделяет список файлов на принятые и отклонённые согласно ограничениям
33
+ * `maxSize` (байты) и `accept` (MIME-типы / шаблоны / расширения).
34
+ * Размер проверяется раньше MIME: файл, превысивший лимит, отклоняется с
35
+ * причиной `maxSize`, даже если его MIME не совпадает с `accept`.
36
+ */
37
+ export declare function partitionFiles(files: File[], options: PartitionOptions): PartitionResult;