BucketKit
React Package

Components

React components for file uploads

Components

BucketKit provides three main components for building upload interfaces.

BucketKitDropzone

A drag-and-drop zone for file uploads.

<BucketKitDropzone
  multiple
  accept={['image/*', 'application/pdf']}
  maxSize={10 * 1024 * 1024}
  disabled={false}
  className="min-h-[200px]"
  onFilesSelected={(files) => console.log('Selected:', files)}
>
  <p>Custom content here</p>
</BucketKitDropzone>

Props

PropTypeDefaultDescription
multiplebooleantrueAccept multiple files
acceptstring | string[]-Accepted MIME types
maxSizenumber-Max file size (bytes)
disabledbooleanfalseDisable the dropzone
classNamestring-Additional CSS classes
childrenReactNode-Custom idle content
dragActiveContentReactNode-Content when dragging
onFilesSelected(files: File[]) => void-Called on file selection

Custom Content

<BucketKitDropzone
  accept="image/*"
  maxSize={5 * 1024 * 1024}
>
  <div className="text-center">
    <ImageIcon className="h-12 w-12 mx-auto text-gray-400" />
    <p className="mt-2">Drag images here</p>
    <p className="text-sm text-gray-500">PNG, JPG up to 5MB</p>
  </div>
</BucketKitDropzone>

BucketKitUploadButton

A button that opens a file picker.

<BucketKitUploadButton
  multiple
  accept="image/*"
  maxSize={10 * 1024 * 1024}
  variant="default"
  size="default"
>
  <UploadIcon className="mr-2 h-4 w-4" />
  Upload Files
</BucketKitUploadButton>

Props

PropTypeDefaultDescription
multiplebooleantrueAccept multiple files
acceptstring | string[]-Accepted MIME types
maxSizenumber-Max file size (bytes)
disabledbooleanfalseDisable the button
variant'default' | 'outline' | ...'default'Button style
size'default' | 'sm' | 'lg''default'Button size
classNamestring-Additional CSS classes
childrenReactNode-Button content

Variants

// Primary button
<BucketKitUploadButton variant="default">Upload</BucketKitUploadButton>

// Outline style
<BucketKitUploadButton variant="outline">Upload</BucketKitUploadButton>

// Secondary
<BucketKitUploadButton variant="secondary">Upload</BucketKitUploadButton>

// Ghost
<BucketKitUploadButton variant="ghost">Upload</BucketKitUploadButton>

BucketKitUploadList

Displays the list of uploads with progress.

<BucketKitUploadList
  showCancel
  showRetry
  showRemove
  className="space-y-2"
/>

Props

PropTypeDefaultDescription
showCancelbooleantrueShow cancel button
showRetrybooleantrueShow retry button
showRemovebooleantrueShow remove button
classNamestring-Container CSS classes
slotClassNamesobject-Classes for sub-elements
renderItemfunction-Custom item renderer

Custom Slot Classes

<BucketKitUploadList
  slotClassNames={{
    item: 'bg-gray-50 p-4',
    fileName: 'font-bold',
    progress: 'bg-blue-500',
    status: 'text-xs',
    actions: 'gap-2',
  }}
/>

Custom Item Renderer

<BucketKitUploadList
  renderItem={(item, actions) => (
    <div className="flex items-center justify-between p-2 border rounded">
      <div>
        <p className="font-medium">{item.fileName}</p>
        <p className="text-sm text-gray-500">
          {item.status} - {item.progress}%
        </p>
      </div>
      <div className="flex gap-2">
        {item.status === 'uploading' && (
          <button onClick={actions.cancel}>Cancel</button>
        )}
        {item.status === 'error' && (
          <button onClick={actions.retry}>Retry</button>
        )}
        <button onClick={actions.remove}>Remove</button>
      </div>
    </div>
  )}
/>

Complete Example

import {
  BucketKitProvider,
  BucketKitDropzone,
  BucketKitUploadButton,
  BucketKitUploadList,
} from '@nilovon/bucketkit-react';
import { toast } from 'sonner';

function UploadDemo() {
  return (
    <BucketKitProvider
      endpoint="/api/upload"
      onUploadComplete={(item) => toast.success(`Uploaded: ${item.fileName}`)}
      onError={(error) => toast.error(error.message)}
    >
      <div className="max-w-xl mx-auto p-6 space-y-6">
        <BucketKitDropzone
          multiple
          accept={['image/*', 'application/pdf']}
          maxSize={10 * 1024 * 1024}
        />

        <div className="flex gap-2">
          <BucketKitUploadButton variant="outline">
            Browse Files
          </BucketKitUploadButton>
        </div>

        <BucketKitUploadList showCancel showRetry showRemove />
      </div>
    </BucketKitProvider>
  );
}

On this page