@seed-design/react-file-upload 0.0.0-alpha-20260416134952

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/lib/index.js ADDED
@@ -0,0 +1,43 @@
1
+ import { F as FileUploadContext, a as FileUploadDropzone, b as FileUploadHiddenInput, c as FileUploadItemBackdrop, d as FileUploadItemImage, e as FileUploadItemMetadata, f as FileUploadItemName, g as FileUploadItemRemoveButton, h as FileUploadItemSize, i as FileUploadItemThumbnail, j as FileUploadRoot, k as FileUploadTrigger } from './FileUpload-12s-BsPs5ndy.js';
2
+ export { l as FileUploadItemProvider, n as useFileUpload, u as useFileUploadContext, o as useFileUploadItem, m as useFileUploadItemContext } from './FileUpload-12s-BsPs5ndy.js';
3
+
4
+ var FileUpload_namespace = {
5
+ __proto__: null,
6
+ Context: FileUploadContext,
7
+ Dropzone: FileUploadDropzone,
8
+ HiddenInput: FileUploadHiddenInput,
9
+ ItemBackdrop: FileUploadItemBackdrop,
10
+ ItemImage: FileUploadItemImage,
11
+ ItemMetadata: FileUploadItemMetadata,
12
+ ItemName: FileUploadItemName,
13
+ ItemRemoveButton: FileUploadItemRemoveButton,
14
+ ItemSize: FileUploadItemSize,
15
+ ItemThumbnail: FileUploadItemThumbnail,
16
+ Root: FileUploadRoot,
17
+ Trigger: FileUploadTrigger
18
+ };
19
+
20
+ /**
21
+ * Split a filename into basename and extension.
22
+ *
23
+ * "document.pdf" -> { basename: "document", extension: ".pdf" }
24
+ * ".gitignore" -> { basename: ".gitignore", extension: "" }
25
+ * "README" -> { basename: "README", extension: "" }
26
+ */ function splitFileName(name) {
27
+ if (!name) return {
28
+ basename: "",
29
+ extension: ""
30
+ };
31
+ const lastDot = name.lastIndexOf(".");
32
+ // No dot, or dot is first character (dotfile)
33
+ if (lastDot <= 0) return {
34
+ basename: name,
35
+ extension: ""
36
+ };
37
+ return {
38
+ basename: name.slice(0, lastDot),
39
+ extension: name.slice(lastDot)
40
+ };
41
+ }
42
+
43
+ export { FileUpload_namespace as FileUpload, FileUploadContext, FileUploadDropzone, FileUploadHiddenInput, FileUploadItemBackdrop, FileUploadItemImage, FileUploadItemMetadata, FileUploadItemName, FileUploadItemRemoveButton, FileUploadItemSize, FileUploadItemThumbnail, FileUploadRoot, FileUploadTrigger, splitFileName };
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@seed-design/react-file-upload",
3
+ "version": "0.0.0-alpha-20260416134952",
4
+ "repository": {
5
+ "type": "git",
6
+ "url": "git+https://github.com/daangn/seed-design.git",
7
+ "directory": "packages/react-headless/file-upload"
8
+ },
9
+ "sideEffects": false,
10
+ "type": "module",
11
+ "exports": {
12
+ ".": {
13
+ "types": "./lib/index.d.ts",
14
+ "import": "./lib/index.js",
15
+ "require": "./lib/index.cjs"
16
+ },
17
+ "./package.json": "./package.json"
18
+ },
19
+ "main": "./lib/index.cjs",
20
+ "files": [
21
+ "lib",
22
+ "src"
23
+ ],
24
+ "scripts": {
25
+ "clean": "rm -rf lib",
26
+ "build": "bunchee",
27
+ "lint:publish": "bun publint"
28
+ },
29
+ "dependencies": {
30
+ "@radix-ui/react-compose-refs": "1.1.2",
31
+ "@radix-ui/react-use-controllable-state": "1.2.2",
32
+ "@seed-design/dom-utils": "1.0.0",
33
+ "@seed-design/react-primitive": "0.0.0-alpha-20260414104312",
34
+ "@seed-design/react-supports": "0.0.1"
35
+ },
36
+ "devDependencies": {
37
+ "@types/react": "^19.1.6",
38
+ "react": "^19.1.0",
39
+ "react-dom": "^19.1.0"
40
+ },
41
+ "peerDependencies": {
42
+ "react": ">=18.0.0",
43
+ "react-dom": ">=18.0.0"
44
+ },
45
+ "publishConfig": {
46
+ "access": "public"
47
+ }
48
+ }
@@ -0,0 +1,26 @@
1
+ export {
2
+ FileUploadRoot as Root,
3
+ FileUploadDropzone as Dropzone,
4
+ FileUploadTrigger as Trigger,
5
+ FileUploadHiddenInput as HiddenInput,
6
+ FileUploadItemName as ItemName,
7
+ FileUploadItemSize as ItemSize,
8
+ FileUploadItemRemoveButton as ItemRemoveButton,
9
+ FileUploadItemImage as ItemImage,
10
+ FileUploadItemThumbnail as ItemThumbnail,
11
+ FileUploadItemMetadata as ItemMetadata,
12
+ FileUploadItemBackdrop as ItemBackdrop,
13
+ FileUploadContext as Context,
14
+ type FileUploadRootProps as RootProps,
15
+ type FileUploadDropzoneProps as DropzoneProps,
16
+ type FileUploadTriggerProps as TriggerProps,
17
+ type FileUploadHiddenInputProps as HiddenInputProps,
18
+ type FileUploadItemNameProps as ItemNameProps,
19
+ type FileUploadItemSizeProps as ItemSizeProps,
20
+ type FileUploadItemRemoveButtonProps as ItemRemoveButtonProps,
21
+ type FileUploadItemImageProps as ItemImageProps,
22
+ type FileUploadItemThumbnailProps as ItemThumbnailProps,
23
+ type FileUploadItemMetadataProps as ItemMetadataProps,
24
+ type FileUploadItemBackdropProps as ItemBackdropProps,
25
+ type FileUploadContextProps as ContextProps,
26
+ } from "./FileUpload";
@@ -0,0 +1,253 @@
1
+ "use client";
2
+
3
+ import { composeRefs } from "@radix-ui/react-compose-refs";
4
+ import { mergeProps } from "@seed-design/dom-utils";
5
+ import { Primitive, type PrimitiveProps } from "@seed-design/react-primitive";
6
+ import type * as React from "react";
7
+ import { forwardRef } from "react";
8
+ import { useFileUpload, type UseFileUploadProps } from "./useFileUpload";
9
+ import type { FileEntry } from "./types";
10
+ import {
11
+ FileUploadProvider,
12
+ useFileUploadContext,
13
+ useFileUploadItemContext,
14
+ type UseFileUploadContext,
15
+ } from "./useFileUploadContext";
16
+
17
+ export interface FileUploadRootProps
18
+ extends UseFileUploadProps,
19
+ PrimitiveProps,
20
+ React.HTMLAttributes<HTMLDivElement> {}
21
+
22
+ export const FileUploadRoot = forwardRef<HTMLDivElement, FileUploadRootProps>(
23
+ (
24
+ {
25
+ // UseFileUploadProps
26
+ accept,
27
+ acceptedFileEntries,
28
+ defaultAcceptedFileEntries,
29
+ disabled,
30
+ invalid,
31
+ maxFileSize,
32
+ maxFiles,
33
+ minFileSize,
34
+ name,
35
+ onAcceptedFileEntriesChange,
36
+ onFileAccept,
37
+ onFileReject,
38
+ preventDocumentDrop,
39
+ readOnly,
40
+ required,
41
+ validate,
42
+
43
+ ...otherProps
44
+ },
45
+ ref,
46
+ ) => {
47
+ const api = useFileUpload({
48
+ accept,
49
+ acceptedFileEntries,
50
+ defaultAcceptedFileEntries,
51
+ disabled,
52
+ invalid,
53
+ maxFileSize,
54
+ maxFiles,
55
+ minFileSize,
56
+ name,
57
+ onAcceptedFileEntriesChange,
58
+ onFileAccept,
59
+ onFileReject,
60
+ preventDocumentDrop,
61
+ readOnly,
62
+ required,
63
+ validate,
64
+ });
65
+
66
+ return (
67
+ <FileUploadProvider value={api}>
68
+ <Primitive.div ref={ref} {...api.stateProps} {...otherProps} />
69
+ </FileUploadProvider>
70
+ );
71
+ },
72
+ );
73
+ FileUploadRoot.displayName = "FileUploadRoot";
74
+
75
+ export interface FileUploadDropzoneProps
76
+ extends PrimitiveProps,
77
+ React.HTMLAttributes<HTMLDivElement> {}
78
+
79
+ export const FileUploadDropzone = forwardRef<HTMLDivElement, FileUploadDropzoneProps>(
80
+ (props, ref) => {
81
+ const { dropzoneRef, dropzoneProps } = useFileUploadContext();
82
+ const mergedProps = mergeProps(dropzoneProps, props);
83
+
84
+ return <Primitive.div ref={composeRefs(dropzoneRef, ref)} {...mergedProps} />;
85
+ },
86
+ );
87
+ FileUploadDropzone.displayName = "FileUploadDropzone";
88
+
89
+ export interface FileUploadTriggerProps
90
+ extends PrimitiveProps,
91
+ React.ButtonHTMLAttributes<HTMLButtonElement> {}
92
+
93
+ export const FileUploadTrigger = forwardRef<HTMLButtonElement, FileUploadTriggerProps>(
94
+ (props, ref) => {
95
+ const { triggerProps } = useFileUploadContext();
96
+ const mergedProps = mergeProps(triggerProps, props);
97
+
98
+ return <Primitive.button ref={ref} {...mergedProps} />;
99
+ },
100
+ );
101
+ FileUploadTrigger.displayName = "FileUploadTrigger";
102
+
103
+ export interface FileUploadHiddenInputProps
104
+ extends PrimitiveProps,
105
+ React.InputHTMLAttributes<HTMLInputElement> {}
106
+
107
+ export const FileUploadHiddenInput = forwardRef<HTMLInputElement, FileUploadHiddenInputProps>(
108
+ (props, ref) => {
109
+ const { inputRef, hiddenInputProps } = useFileUploadContext();
110
+ const mergedProps = mergeProps(hiddenInputProps, props);
111
+
112
+ return <Primitive.input ref={composeRefs(inputRef, ref)} {...mergedProps} />;
113
+ },
114
+ );
115
+ FileUploadHiddenInput.displayName = "FileUploadHiddenInput";
116
+
117
+ export interface FileUploadItemNameProps
118
+ extends PrimitiveProps,
119
+ React.HTMLAttributes<HTMLSpanElement> {}
120
+
121
+ export const FileUploadItemName = forwardRef<HTMLSpanElement, FileUploadItemNameProps>(
122
+ ({ children, ...props }, ref) => {
123
+ const { stateProps } = useFileUploadContext();
124
+ const { file } = useFileUploadItemContext();
125
+
126
+ const mergedProps = mergeProps(stateProps, props);
127
+
128
+ return (
129
+ <Primitive.span ref={ref} {...mergedProps}>
130
+ {children ?? file.name}
131
+ </Primitive.span>
132
+ );
133
+ },
134
+ );
135
+ FileUploadItemName.displayName = "FileUploadItemName";
136
+
137
+ export interface FileUploadItemSizeProps
138
+ extends PrimitiveProps,
139
+ React.HTMLAttributes<HTMLSpanElement> {
140
+ /**
141
+ * Formatter function for file size.
142
+ */
143
+ formatBytes: (bytes: number) => string;
144
+ }
145
+
146
+ export const FileUploadItemSize = forwardRef<HTMLSpanElement, FileUploadItemSizeProps>(
147
+ ({ children, formatBytes, ...props }, ref) => {
148
+ const { stateProps } = useFileUploadContext();
149
+ const { file } = useFileUploadItemContext();
150
+
151
+ const mergedProps = mergeProps(stateProps, props);
152
+
153
+ return (
154
+ <Primitive.span ref={ref} {...mergedProps}>
155
+ {children ?? formatBytes(file.size)}
156
+ </Primitive.span>
157
+ );
158
+ },
159
+ );
160
+ FileUploadItemSize.displayName = "FileUploadItemSize";
161
+
162
+ export interface FileUploadItemRemoveButtonProps
163
+ extends PrimitiveProps,
164
+ React.ButtonHTMLAttributes<HTMLButtonElement> {}
165
+
166
+ export const FileUploadItemRemoveButton = forwardRef<
167
+ HTMLButtonElement,
168
+ FileUploadItemRemoveButtonProps
169
+ >((props, ref) => {
170
+ const { removeButtonProps } = useFileUploadItemContext();
171
+
172
+ const mergedProps = mergeProps(removeButtonProps, props);
173
+
174
+ return <Primitive.button ref={ref} {...mergedProps} />;
175
+ });
176
+ FileUploadItemRemoveButton.displayName = "FileUploadItemRemoveButton";
177
+
178
+ export interface FileUploadItemImageProps
179
+ extends PrimitiveProps,
180
+ React.ImgHTMLAttributes<HTMLImageElement> {}
181
+
182
+ export const FileUploadItemImage = forwardRef<HTMLImageElement, FileUploadItemImageProps>(
183
+ (props, ref) => {
184
+ const ctx = useFileUploadItemContext();
185
+
186
+ if (!("imageProps" in ctx)) return null;
187
+
188
+ const mergedProps = mergeProps(ctx.imageProps ?? {}, props);
189
+
190
+ return <Primitive.img ref={ref} {...mergedProps} />;
191
+ },
192
+ );
193
+ FileUploadItemImage.displayName = "FileUploadItemImage";
194
+
195
+ export interface FileUploadItemThumbnailProps
196
+ extends PrimitiveProps,
197
+ React.HTMLAttributes<HTMLDivElement> {}
198
+
199
+ export const FileUploadItemThumbnail = forwardRef<HTMLDivElement, FileUploadItemThumbnailProps>(
200
+ (props, ref) => {
201
+ const { thumbnailProps } = useFileUploadItemContext();
202
+
203
+ const mergedProps = mergeProps(thumbnailProps, props);
204
+
205
+ return <Primitive.div ref={ref} {...mergedProps} />;
206
+ },
207
+ );
208
+ FileUploadItemThumbnail.displayName = "FileUploadItemThumbnail";
209
+
210
+ export interface FileUploadItemMetadataProps
211
+ extends PrimitiveProps,
212
+ React.HTMLAttributes<HTMLDivElement> {}
213
+
214
+ export const FileUploadItemMetadata = forwardRef<HTMLDivElement, FileUploadItemMetadataProps>(
215
+ (props, ref) => {
216
+ const { metadataProps } = useFileUploadItemContext();
217
+
218
+ const mergedProps = mergeProps(metadataProps, props);
219
+
220
+ return <Primitive.div ref={ref} {...mergedProps} />;
221
+ },
222
+ );
223
+ FileUploadItemMetadata.displayName = "FileUploadItemMetadata";
224
+
225
+ export interface FileUploadItemBackdropProps
226
+ extends PrimitiveProps,
227
+ Omit<React.HTMLAttributes<HTMLDivElement>, "children"> {
228
+ status: FileEntry["status"];
229
+ children: React.ReactNode | ((entry: FileEntry) => React.ReactNode);
230
+ }
231
+
232
+ export const FileUploadItemBackdrop = forwardRef<HTMLDivElement, FileUploadItemBackdropProps>(
233
+ ({ status, children, ...props }, ref) => {
234
+ const entry = useFileUploadItemContext();
235
+
236
+ if (entry.status !== status) return null;
237
+
238
+ return (
239
+ <Primitive.div ref={composeRefs(entry.refs.overlay, ref)} {...props}>
240
+ {typeof children === "function" ? children(entry) : children}
241
+ </Primitive.div>
242
+ );
243
+ },
244
+ );
245
+ FileUploadItemBackdrop.displayName = "FileUploadItemBackdrop";
246
+
247
+ export interface FileUploadContextProps {
248
+ children: (context: UseFileUploadContext) => React.ReactNode;
249
+ }
250
+
251
+ export const FileUploadContext = (props: FileUploadContextProps) => {
252
+ return props.children(useFileUploadContext());
253
+ };
@@ -0,0 +1,87 @@
1
+ import { describe, expect, it } from "bun:test";
2
+ import { isImageAccept, getFileAcceptType } from "./accept-utils";
3
+
4
+ describe("isImageAccept", () => {
5
+ it("should return true for image/* MIME patterns", () => {
6
+ expect(isImageAccept("image/*")).toBe(true);
7
+ expect(isImageAccept("image/png")).toBe(true);
8
+ expect(isImageAccept("image/jpeg")).toBe(true);
9
+ expect(isImageAccept("image/webp")).toBe(true);
10
+ expect(isImageAccept("image/heic")).toBe(true);
11
+ });
12
+
13
+ it("should return true for image file extensions", () => {
14
+ expect(isImageAccept(".jpg")).toBe(true);
15
+ expect(isImageAccept(".jpeg")).toBe(true);
16
+ expect(isImageAccept(".png")).toBe(true);
17
+ expect(isImageAccept(".gif")).toBe(true);
18
+ expect(isImageAccept(".webp")).toBe(true);
19
+ expect(isImageAccept(".avif")).toBe(true);
20
+ expect(isImageAccept(".heic")).toBe(true);
21
+ expect(isImageAccept(".svg")).toBe(true);
22
+ expect(isImageAccept(".bmp")).toBe(true);
23
+ expect(isImageAccept(".tiff")).toBe(true);
24
+ });
25
+
26
+ it("should be case-insensitive for extensions", () => {
27
+ expect(isImageAccept(".JPG")).toBe(true);
28
+ expect(isImageAccept(".Png")).toBe(true);
29
+ expect(isImageAccept(".HEIC")).toBe(true);
30
+ });
31
+
32
+ it("should return false for non-image MIME patterns", () => {
33
+ expect(isImageAccept("application/pdf")).toBe(false);
34
+ expect(isImageAccept("text/plain")).toBe(false);
35
+ expect(isImageAccept("video/mp4")).toBe(false);
36
+ });
37
+
38
+ it("should return false for non-image file extensions", () => {
39
+ expect(isImageAccept(".pdf")).toBe(false);
40
+ expect(isImageAccept(".txt")).toBe(false);
41
+ expect(isImageAccept(".zip")).toBe(false);
42
+ expect(isImageAccept(".mp4")).toBe(false);
43
+ });
44
+
45
+ it("should return false for unknown patterns", () => {
46
+ expect(isImageAccept("foo")).toBe(false);
47
+ expect(isImageAccept("")).toBe(false);
48
+ });
49
+ });
50
+
51
+ describe("getFileAcceptType", () => {
52
+ it("should return undefined when accept is undefined", () => {
53
+ expect(getFileAcceptType(undefined)).toBeUndefined();
54
+ });
55
+
56
+ it("should return 'image' for image-only MIME string", () => {
57
+ expect(getFileAcceptType("image/*")).toBe("image");
58
+ expect(getFileAcceptType("image/png")).toBe("image");
59
+ });
60
+
61
+ it("should return 'image' for image-only extension string", () => {
62
+ expect(getFileAcceptType(".jpg,.png,.gif")).toBe("image");
63
+ });
64
+
65
+ it("should return 'image' for mixed image MIME and extensions", () => {
66
+ expect(getFileAcceptType("image/*,.heic")).toBe("image");
67
+ expect(getFileAcceptType(".jpg,image/png")).toBe("image");
68
+ });
69
+
70
+ it("should return 'image' for image-only array", () => {
71
+ expect(getFileAcceptType(["image/*"])).toBe("image");
72
+ expect(getFileAcceptType([".jpg", ".png", ".gif"])).toBe("image");
73
+ expect(getFileAcceptType(["image/*", ".heic"])).toBe("image");
74
+ });
75
+
76
+ it("should return undefined when mixed with non-image", () => {
77
+ expect(getFileAcceptType(".pdf,image/png")).toBeUndefined();
78
+ expect(getFileAcceptType(["image/*", ".pdf"])).toBeUndefined();
79
+ expect(getFileAcceptType([".jpg", ".txt"])).toBeUndefined();
80
+ });
81
+
82
+ it("should return undefined for non-image only", () => {
83
+ expect(getFileAcceptType(".pdf")).toBeUndefined();
84
+ expect(getFileAcceptType("application/pdf")).toBeUndefined();
85
+ expect(getFileAcceptType([".pdf", ".doc"])).toBeUndefined();
86
+ });
87
+ });
@@ -0,0 +1,83 @@
1
+ import type { FileAcceptType } from "./types";
2
+
3
+ /**
4
+ * Image extension set sourced from mime-db (MIT license).
5
+ * @see https://www.npmjs.com/package/mime
6
+ */
7
+ const IMAGE_EXTENSIONS = new Set([
8
+ "exr",
9
+ "apng",
10
+ "avci",
11
+ "avcs",
12
+ "avif",
13
+ "bmp",
14
+ "dib",
15
+ "cgm",
16
+ "drle",
17
+ "dpx",
18
+ "emf",
19
+ "fits",
20
+ "g3",
21
+ "gif",
22
+ "heic",
23
+ "heics",
24
+ "heif",
25
+ "heifs",
26
+ "hej2",
27
+ "ief",
28
+ "jaii",
29
+ "jais",
30
+ "jls",
31
+ "jp2",
32
+ "jpg2",
33
+ "jpg",
34
+ "jpeg",
35
+ "jpe",
36
+ "jph",
37
+ "jhc",
38
+ "jpm",
39
+ "jpgm",
40
+ "jpx",
41
+ "jpf",
42
+ "jxl",
43
+ "jxr",
44
+ "jxra",
45
+ "jxrs",
46
+ "jxs",
47
+ "jxsc",
48
+ "jxsi",
49
+ "jxss",
50
+ "ktx",
51
+ "ktx2",
52
+ "jfif",
53
+ "png",
54
+ "sgi",
55
+ "svg",
56
+ "svgz",
57
+ "t38",
58
+ "tif",
59
+ "tiff",
60
+ "tfx",
61
+ "webp",
62
+ "wmf",
63
+ ]);
64
+
65
+ export function isImageAccept(pattern: string): boolean {
66
+ if (pattern.startsWith("image/")) return true;
67
+
68
+ if (pattern.startsWith(".")) return IMAGE_EXTENSIONS.has(pattern.slice(1).toLowerCase());
69
+
70
+ return false;
71
+ }
72
+
73
+ /**
74
+ * Determines the file accept type category based on accept patterns.
75
+ * Returns "image" if all patterns are image-related, undefined otherwise.
76
+ */
77
+ export function getFileAcceptType(accept: string | string[] | undefined): FileAcceptType {
78
+ if (!accept) return undefined;
79
+
80
+ const list = Array.isArray(accept) ? accept : accept.split(",").map((s) => s.trim());
81
+
82
+ return list.every(isImageAccept) ? "image" : undefined;
83
+ }
package/src/index.ts ADDED
@@ -0,0 +1,54 @@
1
+ export {
2
+ FileUploadRoot,
3
+ FileUploadDropzone,
4
+ FileUploadTrigger,
5
+ FileUploadHiddenInput,
6
+ FileUploadItemName,
7
+ FileUploadItemSize,
8
+ FileUploadItemRemoveButton,
9
+ FileUploadItemImage,
10
+ FileUploadItemThumbnail,
11
+ FileUploadItemMetadata,
12
+ FileUploadItemBackdrop,
13
+ FileUploadContext,
14
+ type FileUploadRootProps,
15
+ type FileUploadDropzoneProps,
16
+ type FileUploadTriggerProps,
17
+ type FileUploadHiddenInputProps,
18
+ type FileUploadItemNameProps,
19
+ type FileUploadItemSizeProps,
20
+ type FileUploadItemRemoveButtonProps,
21
+ type FileUploadItemImageProps,
22
+ type FileUploadItemThumbnailProps,
23
+ type FileUploadItemMetadataProps,
24
+ type FileUploadItemBackdropProps,
25
+ type FileUploadContextProps,
26
+ } from "./FileUpload";
27
+
28
+ export {
29
+ FileUploadItemProvider,
30
+ useFileUploadContext,
31
+ useFileUploadItemContext,
32
+ type UseFileUploadContext,
33
+ type FileUploadItemContext,
34
+ } from "./useFileUploadContext";
35
+
36
+ export {
37
+ useFileUpload,
38
+ useFileUploadItem,
39
+ type UseFileUploadProps,
40
+ type UseFileUploadReturn,
41
+ type UseFileUploadItemReturn,
42
+ } from "./useFileUpload";
43
+
44
+ export type {
45
+ FileError,
46
+ FileRejection,
47
+ FileStatusDetails,
48
+ FileEntry,
49
+ FileAcceptType,
50
+ } from "./types";
51
+
52
+ export * as FileUpload from "./FileUpload.namespace";
53
+
54
+ export { splitFileName, type SplitFileNameResult } from "./utils";
package/src/types.ts ADDED
@@ -0,0 +1,24 @@
1
+ export type FileError =
2
+ | "FILE_TOO_LARGE"
3
+ | "FILE_TOO_SMALL"
4
+ | "TOO_MANY_FILES"
5
+ | "INVALID_TYPE"
6
+ | (string & {});
7
+
8
+ export interface FileRejection {
9
+ file: File;
10
+ errors: FileError[];
11
+ }
12
+
13
+ export type FileStatusDetails =
14
+ | { status: "pending" }
15
+ | { status: "uploading"; progress?: number }
16
+ | { status: "success" }
17
+ | { status: "error" };
18
+
19
+ export type FileEntry = {
20
+ id: string;
21
+ file: File;
22
+ } & FileStatusDetails;
23
+
24
+ export type FileAcceptType = "image" | undefined;