+ 1}
+ title="file upload"
+ type="file"
+ onChange={(ev) => {
+ if (!ev.target.files?.length) return;
+ const length = ev.target.files.length > maxItems ? maxItems : ev.target.files.length;
+ const newFiles: File[] = [];
+
+ for (let index = 0; index < length; index++) {
+ const file = ev.target.files.item(index);
+
+ file && newFiles.push(file);
+ }
+ updateFiles(newFiles);
+ }}
+ />
+
+ {
+ const singleFile = ev.target.files?.item(0);
+
+ if (!singleFile) return;
+ if (files.find((file) => file.name === singleFile.name)) return;
+ files.push(singleFile);
+ updateFiles([...files]);
+ }}
+ />
+
+
+ {maxItems > 1 &&
+ (maxItemsElement ?? (
+
+ {maxItemsText}: {maxItems}
+
+ ))}
+ {maxAllowedSize &&
+ (maxAllowedSizeElement ?? (
+
+ {maxAllowedSizeText}: {maxAllowedSize}
+
+ ))}
+ {totalMaxAllowedSize &&
+ (totalMaxAllowedSizeElement ?? (
+
+ {totalMaxAllowedSizeText}: {totalMaxAllowedSize}
+
+ ))}
+
+
+
+ {children}
+ {items}
+
+
+ {maxItems > 1 && files.length !== 0 && files.length < maxItems && addButtonElement}
+ {files.length !== 0 && resetButtonElement}
+ {browseButtonElement}
+ {uploadButton}
+
+
+ );
+});
+
+FileUpload.displayName = "NextUI.FileUpload";
+
+export default FileUpload;
diff --git a/packages/components/file-upload/src/index.ts b/packages/components/file-upload/src/index.ts
new file mode 100644
index 0000000000..196571682d
--- /dev/null
+++ b/packages/components/file-upload/src/index.ts
@@ -0,0 +1,10 @@
+import FileUpload from "./file-upload";
+
+// export types
+export type {FileUploadProps} from "./file-upload";
+
+// export hooks
+export {useFileUpload} from "./use-file-upload";
+
+// export component
+export {FileUpload};
diff --git a/packages/components/file-upload/src/use-file-upload-item.ts b/packages/components/file-upload/src/use-file-upload-item.ts
new file mode 100644
index 0000000000..3f5427bd68
--- /dev/null
+++ b/packages/components/file-upload/src/use-file-upload-item.ts
@@ -0,0 +1,39 @@
+import type {FileUploadVariantProps} from "@nextui-org/theme";
+
+import {HTMLNextUIProps, mapPropsVariants} from "@nextui-org/system";
+import {fileUpload} from "@nextui-org/theme";
+import {ReactRef, useDOMRef} from "@nextui-org/react-utils";
+import {objectToDeps} from "@nextui-org/shared-utils";
+import {useMemo} from "react";
+
+interface Props extends HTMLNextUIProps<"div"> {
+ /**
+ * Ref to the DOM node.
+ */
+ ref?: ReactRef