'use client'
import { Button, FileUpload } from '@saas-ui/react'
import { HiUpload } from 'react-icons/hi'
export const FileUploadBasic = () => {
return (
<FileUpload.Root>
<FileUpload.Trigger asChild>
<Button variant="outline" size="sm">
<HiUpload /> Upload file
</Button>
</FileUpload.Trigger>
<FileUpload.List />
</FileUpload.Root>
)
}
import { FileUpload } from '@saas-ui/react/file-upload'
<FileUpload.Root>
<FileUpload.Dropzone>
<FileUpload.Trigger asChild>
<Button>Select files</Button>
</FileUpload.Trigger>
</FileUpload.Dropzone>
<FileUpload.List />
</FileUpload.Root>
Use the directory
prop to allow selecting a directory instead of a file.
'use client'
import { Button, FileUpload } from '@saas-ui/react'
import { HiUpload } from 'react-icons/hi'
export const FileUploadDirectory = () => {
return (
<FileUpload.Root directory>
<FileUpload.Trigger asChild>
<Button variant="outline" size="sm">
<HiUpload /> Upload file
</Button>
</FileUpload.Trigger>
<FileUpload.List />
</FileUpload.Root>
)
}
Use the capture
prop to select and upload files from different environments
and media types.
Note: This is
in all browsers.'use client'
import { Button, FileUpload } from '@saas-ui/react'
import { HiCamera } from 'react-icons/hi'
export const FileUploadMediaCapture = () => {
return (
<FileUpload.Root capture="environment">
<FileUpload.Trigger asChild>
<Button variant="outline" size="sm">
<HiCamera /> Open Camera
</Button>
</FileUpload.Trigger>
<FileUpload.List />
</FileUpload.Root>
)
}
Upload multiple files at once by using the maxFiles
prop.
'use client'
import { Button, FileUpload } from '@saas-ui/react'
import { HiUpload } from 'react-icons/hi'
export const FileUploadMultiple = () => {
return (
<FileUpload.Root maxFiles={5}>
<FileUpload.Trigger asChild>
<Button variant="outline" size="sm">
<HiUpload /> Upload file
</Button>
</FileUpload.Trigger>
<FileUpload.List showSize clearable />
</FileUpload.Root>
)
}
Drop multiple files inside the dropzone and use the maxFiles
prop to set the
number of files that can be uploaded at once.
Drag and drop here to upload
.png, .jpg up to 5MB
'use client'
import { Heading, Text } from '@chakra-ui/react'
import { FileUpload } from '@saas-ui/react'
export const FileUploadWithDropzone = () => {
return (
<FileUpload.Root maxW="xl" alignItems="stretch" maxFiles={10}>
<FileUpload.Dropzone>
<Heading size="md">Drag and drop here to upload</Heading>
<Text color="fg.muted">.png, .jpg up to 5MB</Text>
</FileUpload.Dropzone>
<FileUpload.List />
</FileUpload.Root>
)
}
Use the FileInput
component to create a trigger that looks like a text input.
'use client'
import { FileUpload } from '@saas-ui/react'
export const FileUploadWithInput = () => {
return (
<FileUpload.Root gap="1" maxWidth="300px">
<FileUpload.Label>Upload file</FileUpload.Label>
<FileUpload.Input />
</FileUpload.Root>
)
}
Here's an example of a clearable file upload input.
'use client'
import { CloseButton, FileUpload, InputGroup } from '@saas-ui/react'
import { LuFileUp } from 'react-icons/lu'
export const FileUploadWithInputClear = () => {
return (
<FileUpload.Root gap="1" maxWidth="300px">
<FileUpload.Label>Upload file</FileUpload.Label>
<InputGroup
w="full"
startElement={<LuFileUp />}
endElement={
<FileUpload.ClearTrigger asChild>
<CloseButton
me="-1"
size="xs"
variant="plain"
focusVisibleRing="inside"
focusRingWidth="2px"
pointerEvents="auto"
color="fg.subtle"
/>
</FileUpload.ClearTrigger>
}
>
<FileUpload.Input />
</InputGroup>
</FileUpload.Root>
)
}
Define the accepted files for upload using the accept
prop.
'use client'
import { Button, FileUpload } from '@saas-ui/react'
import { HiUpload } from 'react-icons/hi'
export const FileUploadAcceptedFiles = () => {
return (
<FileUpload.Root accept={['image/png']}>
<FileUpload.Trigger asChild>
<Button variant="outline" size="sm">
<HiUpload /> Upload file
</Button>
</FileUpload.Trigger>
<FileUpload.List />
</FileUpload.Root>
)
}
Prop | Default | Type |
---|---|---|
allowDrop | true | boolean Whether to allow drag and drop in the dropzone element |
locale | '\'en-US\'' | string The current locale. Based on the BCP 47 definition. |
maxFiles | '1' | number The maximum number of files |
maxFileSize | 'Infinity' | number The maximum file size in bytes |
minFileSize | '0' | number The minimum file size in bytes |
accept | Record<string, string[]> | FileMimeType | FileMimeType[] The accept file types | |
asChild | boolean Use the provided child element as the default rendered element, combining their props and behavior. For more details, read our Composition guide. | |
capture | 'user' | 'environment' The default camera to use when capturing media | |
directory | boolean Whether to accept directories, only works in webkit browsers | |
disabled | boolean Whether the file input is disabled | |
ids | Partial<{
root: string
dropzone: string
hiddenInput: string
trigger: string
label: string
item(id: string): string
itemName(id: string): string
itemSizeText(id: string): string
itemPreview(id: string): string
}> The ids of the elements. Useful for composition. | |
invalid | boolean Whether the file input is invalid | |
name | string The name of the underlying file input | |
onFileAccept | (details: FileAcceptDetails) => void Function called when the file is accepted | |
onFileChange | (details: FileChangeDetails) => void Function called when the value changes, whether accepted or rejected | |
onFileReject | (details: FileRejectDetails) => void Function called when the file is rejected | |
required | boolean Whether the file input is required | |
translations | IntlTranslations The localized messages to use. | |
validate | (file: File) => FileError[] | null Function to validate a file | |
as | React.ElementType The underlying element to render. | |
unstyled | boolean Whether to remove the component's style. |