Skip to content

Repository files navigation

Files UI Logo

Files UI

Complete React file upload component library
Validation β€’ Upload β€’ Preview β€’ Crop β€’ Compress

license npm latest package Node.js CI PRs Welcome GitHub stars

Files UI Demo

Quick Start β€’ What's New β€’ Features β€’ Docs β€’ Examples


✨ What's New in v2.1.0

πŸŽ‰ Major update with powerful new capabilities!

🎨 Material Design Icons

Beautiful Material Design selection checkboxes with full dark mode support

<FileMosaic 
  {...file} 
  selectable 
  selected 
  darkMode 
/>

πŸ–ΌοΈ Image Editing

Built-in edit icon for image files with callback support

<FileMosaic 
  {...file} 
  onEdit={handleEdit}
  preview 
/>

πŸ”Œ Optional Plugin Ecosystem

Extend functionality without bloating your bundle:

See Full Changelog β†’


πŸš€ Quick Start

Installation

npm install @files-ui/react
# or
yarn add @files-ui/react

Basic Usage

import { Dropzone, FileMosaic } from "@files-ui/react";
import { useState } from "react";

export default function App() {
  const [files, setFiles] = useState([]);

  return (
    <Dropzone onChange={setFiles} value={files}>
      {files.map((file) => (
        <FileMosaic key={file.id} {...file} preview />
      ))}
    </Dropzone>
  );
}

Live Demos:

Demo Link
Basic Sample 🍰 CodeSandbox
Advanced Sample πŸ”¨ CodeSandbox

πŸ’Ž Key Features

πŸ“€ Upload & Validation

  • βœ… Drag & Drop β€” Intuitive file upload
  • βœ… File Validation β€” Type, size, custom validators
  • βœ… Upload Progress β€” Real-time upload tracking
  • βœ… Chunked Upload β€” Large file support
  • βœ… Server Actions β€” Next.js 16+ native support

🎨 UI Components

  • βœ… Multiple Layouts β€” Grid (FileMosaic) & Card (FileCard)
  • βœ… Material Icons β€” Beautiful Material Design icons
  • βœ… Dark Mode β€” Built-in theme support
  • βœ… Selection API β€” Multi-select with checkboxes
  • βœ… Preview β€” Image and video fullscreen preview
  • βœ… Avatar β€” Profile image picker

πŸ”§ Developer Experience

  • βœ… TypeScript β€” Full type definitions
  • βœ… Headless β€” useFilesUI() hook for custom UIs
  • βœ… Zero Dependencies β€” Core has no external deps
  • βœ… RSC Compatible β€” Next.js App Router ready
  • βœ… Framework Agnostic β€” Works with any React setup

πŸ“š Main Components

Component Purpose Key Props
<Dropzone/> Main upload area onChange, value, accept, maxFileSize
<FileMosaic/> Grid file display preview, onDelete, onEdit, selectable
<FileCard/> Card file display elevation, preview, darkMode
<Avatar/> Profile image picker src, alt, onChange
<FileInputButton/> Button uploader onChange, accept
<FullScreen/> Modal preview open, onClose

β†’ View Full API Reference


🎯 Common Use Cases

πŸ“Έ Image Cropping & Compression
import { Dropzone, FileMosaic } from "@files-ui/react";
import { CropDialog, useCropDialog } from "@files-ui/crop/react";
import { compressImage } from "@files-ui/compress";

function ImageUploader() {
  const [files, setFiles] = useState([]);
  const { cropFile, openCrop, closeCrop, handleCropComplete } = useCropDialog({
    onComplete: async (croppedFile) => {
      // Compress after crop
      const compressed = await compressImage(croppedFile, {
        maxWidthOrHeight: 1920,
        quality: 0.85
      });
      updateFile(compressed);
    }
  });

  return (
    <>
      <Dropzone onChange={setFiles} value={files}>
        {files.map(file => (
          <FileMosaic key={file.id} {...file} onEdit={openCrop} />
        ))}
      </Dropzone>
      
      {cropFile && (
        <CropDialog
          file={cropFile}
          onComplete={handleCropComplete}
          onCancel={closeCrop}
        />
      )}
    </>
  );
}
πŸŒ™ Dark Mode
import { Dropzone, FileMosaic, FilesUiProvider } from "@files-ui/react";

// Global dark mode
function App() {
  return (
    <FilesUiProvider config={{ darkMode: true }}>
      <Dropzone onChange={setFiles} value={files}>
        {files.map(file => (
          <FileMosaic key={file.id} {...file} />
        ))}
      </Dropzone>
    </FilesUiProvider>
  );
}

// Per-component dark mode
<FileMosaic {...file} darkMode />
<FileCard {...file} darkMode />
β˜‘οΈ Multi-Select with Checkboxes
function FileSelector() {
  const [files, setFiles] = useState([]);
  const [selected, setSelected] = useState(new Set());

  const handleSelect = (fileId, isSelected) => {
    setSelected(prev => {
      const next = new Set(prev);
      isSelected ? next.add(fileId) : next.delete(fileId);
      return next;
    });
  };

  return (
    <Dropzone onChange={setFiles} value={files}>
      {files.map(file => (
        <FileMosaic
          key={file.id}
          {...file}
          selectable
          selected={selected.has(file.id)}
          onSelect={handleSelect}
        />
      ))}
    </Dropzone>
  );
}
πŸš€ Next.js Server Actions
// app/actions/upload.ts
"use server";
export async function uploadFile(formData: FormData) {
  const file = formData.get("file") as File;
  // Process file...
  return { success: true, message: `Uploaded ${file.name}` };
}

// app/uploader.tsx
"use client";
import { Dropzone } from "@files-ui/react/client/dropzone";
import { uploadFile } from "./actions/upload";

export function Uploader() {
  return <Dropzone action={uploadFile} />;
}
🎨 Custom UI with Headless Hook
import { useFilesUI } from "@files-ui/react";

function CustomUploader() {
  const { files, uploadFiles, getDragHandlers, getInputProps } = useFilesUI({
    accept: "image/*",
    maxFileSize: 5 * 1024 * 1024,
    url: "/api/upload"
  });

  return (
    <div {...getDragHandlers()} className="my-dropzone">
      <input {...getInputProps()} />
      <button onClick={() => uploadFiles()}>
        Upload {files.length} files
      </button>
    </div>
  );
}

πŸ“– Documentation


πŸ–ΌοΈ More Previews

Image Fullscreen Preview

Image preview

Video Fullscreen Preview

Video preview

Component Gallery

Components

Dark Mode Support

Dark mode 1

Dark mode 2


🌐 Browser Support

Browser Version
Chrome βœ… Latest
Firefox βœ… Latest
Safari βœ… 14+
Edge βœ… Latest
Mobile βœ… iOS 14+, Android Chrome

🀝 Contributing

We welcome contributions! See CONTRIBUTING.md for guidelines.

Ways to contribute:

  • πŸ› Report bugs via GitHub Issues
  • ✨ Suggest features
  • πŸ“ Improve documentation
  • πŸ”§ Submit pull requests

πŸ’¬ Community & Support


⭐ Show Your Support

If Files UI helped your project:

  1. ⭐ Star us on GitHub
  2. 🐦 Share on social media
  3. πŸ’¬ Tell your developer friends
  4. πŸ“ Write about it on your blog

It really helps us grow! πŸ™


πŸ“„ License

MIT License β€” See LICENSE for details.

Β© 2024 Files UI Contributors


πŸ™ Acknowledgments

⭐ Stargazers

Stargazers

πŸ”€ Forkers

Forkers


Made with ❀️ by the Files UI Team
www.files-ui.com

Animated footer


Back to top

About

UI components for file uploads with React js. Files UI is a complete library for handling files in the UI. You can validate and upload them. Multilanguage. Server side support.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

60 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages