Skip to main content

Installation

    Usage

    A beautiful drag-and-drop file upload zone with animations and file management.
    import { FileDropzone, DroppedFile } from "@/components/ui/file-dropzone";
    import { useState } from "react";
    
    export default function Example() {
      const [files, setFiles] = useState<DroppedFile[]>([]);
    
      return (
        <FileDropzone
          onFilesDropped={setFiles}
          accept="image/*"
          maxFiles={5}
          maxSize={10 * 1024 * 1024} // 10MB
        />
      );
    }
    

    Features

    Drag & Drop

    Interactive drag-and-drop with animated feedback:
    • Hover effect when dragging files over the zone
    • Smooth animations using Framer Motion
    • Visual indicators showing accepted file types and size limits

    File Type Validation

    Restrict accepted file types:
    {/* Images only */}
    <FileDropzone accept="image/*" onFilesDropped={setFiles} />
    
    {/* PDFs only */}
    <FileDropzone accept=".pdf" onFilesDropped={setFiles} />
    
    {/* Multiple types */}
    <FileDropzone 
      accept="image/*,.pdf,.doc,.docx"
      acceptedFileTypes={["Images", "PDF", "Word"]}
      onFilesDropped={setFiles}
    />
    

    Size & Quantity Limits

    <FileDropzone
      maxSize={5 * 1024 * 1024}  // 5MB per file
      maxFiles={3}                // Maximum 3 files
      onFilesDropped={setFiles}
    />
    

    Single File Mode

    <FileDropzone
      multiple={false}
      onFilesDropped={(files) => {
        // Always receives array with single file
        const file = files[0];
      }}
    />
    

    Image Previews

    Automatic thumbnail generation for images:
    const [files, setFiles] = useState<DroppedFile[]>([]);
    
    <FileDropzone
      accept="image/*"
      onFilesDropped={setFiles}
    />
    
    // Each file in the array has:
    // - file: File object
    // - preview: string (URL for images)
    // - id: string (unique identifier)
    

    Initial Files

    Start with pre-loaded files:
    const initialFiles: DroppedFile[] = [
      {
        id: "1",
        file: existingFile,
        preview: "https://example.com/image.jpg"
      }
    ];
    
    <FileDropzone
      initialFiles={initialFiles}
      onFilesDropped={setFiles}
    />
    

    Custom Content

    Replace the default UI:
    <FileDropzone onFilesDropped={setFiles}>
      <div className="p-8">
        <h3>Drop your files here</h3>
        <p>Or click to browse</p>
      </div>
    </FileDropzone>
    

    Error Handling

    Built-in error messages for validation failures:
    • File size exceeded
    • Too many files
    • Single file limit exceeded

    Props

    DroppedFile Type

    interface DroppedFile {
      id: string;          // Unique identifier
      file: File;          // Native File object
      preview?: string;    // Data URL for image previews
    }
    

    Accessibility

    • Hidden file input for keyboard navigation
    • Proper aria-label on input
    • Visual feedback for drag states
    • Disabled state properly indicated
    • Works with keyboard (Tab to focus, Enter to open file dialog)

    Build docs developers (and LLMs) love