@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
package/src/utils.ts ADDED
@@ -0,0 +1,89 @@
1
+ export const FILE_REJECTION_REASON = {
2
+ MaxSize: 'maxSize',
3
+ Mime: 'mime',
4
+ } as const;
5
+
6
+ export type FileRejectionReason = (typeof FILE_REJECTION_REASON)[keyof typeof FILE_REJECTION_REASON];
7
+
8
+ export type FileRejection = {
9
+ file: File;
10
+ reason: FileRejectionReason;
11
+ };
12
+
13
+ export type AcceptInput = string | string[] | undefined;
14
+
15
+ /**
16
+ * Нормализует значение `accept` в массив отдельных токенов
17
+ * (MIME-типы вида `image/png`, MIME-шаблоны `image/*`, расширения `.pdf`).
18
+ * Принимает строку с запятыми (как в нативном HTML-атрибуте), массив или undefined.
19
+ */
20
+ export function normalizeAccept(accept: AcceptInput): string[] {
21
+ if (!accept) return [];
22
+ const list = Array.isArray(accept) ? accept : accept.split(',');
23
+ return list.map(token => token.trim().toLowerCase()).filter(Boolean);
24
+ }
25
+
26
+ /**
27
+ * Преобразует нормализованный `accept` в строку для нативного `<input accept>`
28
+ * (через запятую). Возвращает undefined, если список пуст — чтобы не задавать
29
+ * атрибут в DOM и не ограничивать picker.
30
+ */
31
+ export function buildAcceptAttribute(accept: AcceptInput): string | undefined {
32
+ const tokens = normalizeAccept(accept);
33
+ return tokens.length ? tokens.join(',') : undefined;
34
+ }
35
+
36
+ function fileMatchesAccept(file: File, acceptTokens: string[]): boolean {
37
+ if (!acceptTokens.length) return true;
38
+ const fileType = (file.type || '').toLowerCase();
39
+ const fileName = (file.name || '').toLowerCase();
40
+
41
+ return acceptTokens.some(token => {
42
+ if (token.startsWith('.')) {
43
+ return fileName.endsWith(token);
44
+ }
45
+ if (token.endsWith('/*')) {
46
+ const prefix = token.slice(0, -1);
47
+ return fileType.startsWith(prefix);
48
+ }
49
+ return fileType === token;
50
+ });
51
+ }
52
+
53
+ export type PartitionOptions = {
54
+ maxSize?: number;
55
+ accept?: AcceptInput;
56
+ };
57
+
58
+ export type PartitionResult = {
59
+ accepted: File[];
60
+ rejected: FileRejection[];
61
+ };
62
+
63
+ /**
64
+ * Разделяет список файлов на принятые и отклонённые согласно ограничениям
65
+ * `maxSize` (байты) и `accept` (MIME-типы / шаблоны / расширения).
66
+ * Размер проверяется раньше MIME: файл, превысивший лимит, отклоняется с
67
+ * причиной `maxSize`, даже если его MIME не совпадает с `accept`.
68
+ */
69
+ export function partitionFiles(files: File[], options: PartitionOptions): PartitionResult {
70
+ const { maxSize, accept } = options;
71
+ const acceptTokens = normalizeAccept(accept);
72
+
73
+ const accepted: File[] = [];
74
+ const rejected: FileRejection[] = [];
75
+
76
+ for (const file of files) {
77
+ if (typeof maxSize === 'number' && file.size > maxSize) {
78
+ rejected.push({ file, reason: FILE_REJECTION_REASON.MaxSize });
79
+ continue;
80
+ }
81
+ if (!fileMatchesAccept(file, acceptTokens)) {
82
+ rejected.push({ file, reason: FILE_REJECTION_REASON.Mime });
83
+ continue;
84
+ }
85
+ accepted.push(file);
86
+ }
87
+
88
+ return { accepted, rejected };
89
+ }