import { default as React } from 'react';
export type FileUploadStatus = 'pending' | 'uploading' | 'success' | 'error';
export interface FileUploadItem {
    /** Stable id; the app generates and owns this. */
    id: string;
    file: File;
    /** Upload progress, 0–100. Shown as a bar while `status` is `uploading`. */
    progress?: number;
    status?: FileUploadStatus;
    /** Error message shown under the item when `status` is `error`. */
    error?: string;
}
export interface FileUploadRejection {
    file: File;
    reason: 'type' | 'size' | 'count';
}
export interface FileUploadProps {
    /**
     * Tracked files (controlled). The app owns this list along with the actual
     * upload + progress; the component only renders and emits selection events.
     */
    items?: FileUploadItem[];
    /** Newly added files, already validated against `accept`/`maxSize`/`multiple`. */
    onSelect: (files: File[]) => void;
    /** Fired when the user removes an item via its remove button. */
    onRemove?: (id: string) => void;
    /** Files rejected by client-side validation. */
    onError?: (rejections: FileUploadRejection[]) => void;
    /** Accepted MIME types or extensions, e.g. `['image/*', '.pdf']`. */
    accept?: string[];
    /** Allow selecting more than one file. Default: false. */
    multiple?: boolean;
    /**
     * Accept whole directories — both via the browse button and by dropping a
     * folder, which is traversed recursively. All contained files are returned
     * (still filtered by `accept`). Implies `multiple`.
     */
    acceptDirectory?: boolean;
    /** Max size per file, in bytes. Larger files are rejected. */
    maxSize?: number;
    isDisabled?: boolean;
    label?: string;
    description?: string;
    /** Primary text inside the drop zone. */
    dropzoneLabel?: React.ReactNode;
    buttonLabel?: string;
    className?: string;
    testId?: string;
}
/**
 * FileUpload — accessible file picker with drag-and-drop, image previews and
 * upload progress, built on react-aria-components' `DropZone` + `FileTrigger`.
 *
 * Presentational and transport-agnostic: it emits validated `File[]` via
 * `onSelect` and renders the controlled `items` list. The consuming app owns
 * the actual upload and feeds back `progress`/`status`/`error` per item.
 *
 * @beta The API may change in a minor release while it stabilises.
 *
 * @example
 * ```tsx
 * <FileUpload
 *   items={items}
 *   accept={['image/*']}
 *   multiple
 *   maxSize={5 * 1024 * 1024}
 *   onSelect={(files) => uploadAll(files)}
 *   onRemove={(id) => cancel(id)}
 * />
 * ```
 */
export declare const FileUpload: React.FC<FileUploadProps>;
//# sourceMappingURL=FileUpload.d.ts.map