import * as React from 'react';
import { VariantProps } from 'class-variance-authority';
import * as class_variance_authority_types from 'class-variance-authority/types';

declare const fileUploadListVariants: (props?: {
    orientation?: "horizontal" | "vertical";
} & class_variance_authority_types.ClassProp) => string;

type Direction = "ltr" | "rtl";
type FileState = {
    file: File;
    progress: number;
    error?: string;
    status: "idle" | "uploading" | "error" | "success";
};
type FileUploadListCvaProps = VariantProps<typeof fileUploadListVariants>;
type FileUploadListOrientationType = NonNullable<FileUploadListCvaProps["orientation"]>;

type FileUploadUploadOptions = {
    onProgress: (file: File, progress: number) => void;
    onSuccess: (file: File) => void;
    onError: (file: File, error: Error) => void;
};
type FileUploadProps = Omit<React.ComponentProps<"div">, "defaultValue" | "onChange"> & {
    value?: File[];
    defaultValue?: File[];
    onValueChange?: (files: File[]) => void;
    onAccept?: (files: File[]) => void;
    onFileAccept?: (file: File) => void;
    onFileReject?: (file: File, message: string) => void;
    onFileValidate?: (file: File) => string | null | undefined;
    onUpload?: (files: File[], options: FileUploadUploadOptions) => Promise<void> | void;
    accept?: string;
    maxFiles?: number;
    maxSize?: number;
    dir?: Direction;
    label?: string;
    name?: string;
    asChild?: boolean;
    disabled?: boolean;
    invalid?: boolean;
    multiple?: boolean;
    required?: boolean;
};
declare function FileUpload(props: FileUploadProps): React.JSX.Element;

type FileUploadDropzoneProps = React.ComponentProps<"div"> & {
    asChild?: boolean;
};
declare function FileUploadDropzone(props: FileUploadDropzoneProps): React.JSX.Element;

type FileUploadTriggerProps = React.ComponentProps<"button"> & {
    asChild?: boolean;
};
declare function FileUploadTrigger(props: FileUploadTriggerProps): React.JSX.Element;

type FileUploadListProps = React.ComponentProps<"div"> & {
    orientation?: FileUploadListOrientationType;
    asChild?: boolean;
    forceMount?: boolean;
};
declare function FileUploadList(props: FileUploadListProps): React.JSX.Element;

type FileUploadItemProps = React.ComponentProps<"div"> & {
    value: File;
    asChild?: boolean;
};
declare function FileUploadItem(props: FileUploadItemProps): React.JSX.Element;

type FileUploadItemPreviewProps = React.ComponentProps<"div"> & {
    render?: (file: File, fallback: () => React.ReactNode) => React.ReactNode;
    asChild?: boolean;
};
declare function FileUploadItemPreview(props: FileUploadItemPreviewProps): React.JSX.Element;

type FileUploadItemMetadataProps = React.ComponentProps<"div"> & {
    asChild?: boolean;
    size?: "default" | "sm";
};
declare function FileUploadItemMetadata(props: FileUploadItemMetadataProps): React.JSX.Element;

type FileUploadItemProgressProps = React.ComponentProps<"div"> & {
    variant?: "linear" | "circular" | "fill";
    size?: number;
    asChild?: boolean;
    forceMount?: boolean;
};
declare function FileUploadItemProgress(props: FileUploadItemProgressProps): React.JSX.Element;

type FileUploadItemDeleteProps = React.ComponentProps<"button"> & {
    asChild?: boolean;
};
declare function FileUploadItemDelete(props: FileUploadItemDeleteProps): React.JSX.Element;

type FileUploadClearProps = React.ComponentProps<"button"> & {
    forceMount?: boolean;
    asChild?: boolean;
};
declare function FileUploadClear(props: FileUploadClearProps): React.JSX.Element;

type FileUploadContextValue = {
    inputId: string;
    dropzoneId: string;
    listId: string;
    labelId: string;
    disabled: boolean;
    dir: Direction;
    inputRef: React.RefObject<HTMLInputElement | null>;
    urlCache: WeakMap<File, string>;
};
declare function useFileUploadContext(consumerName: string): FileUploadContextValue;

type FileUploadItemContextValue = {
    id: string;
    fileState: FileState | undefined;
    nameId: string;
    sizeId: string;
    statusId: string;
    messageId: string;
};
declare function useFileUploadItemContext(consumerName: string): FileUploadItemContextValue;

type FileUploadStoreState = {
    files: Map<File, FileState>;
    dragOver: boolean;
    invalid: boolean;
};
declare function useFileUploadStore<T>(selector: (state: FileUploadStoreState) => T): T;

export { type FileState, FileUpload, FileUploadClear, type FileUploadClearProps, type FileUploadContextValue, FileUploadDropzone, type FileUploadDropzoneProps, FileUploadItem, type FileUploadItemContextValue, FileUploadItemDelete, type FileUploadItemDeleteProps, FileUploadItemMetadata, type FileUploadItemMetadataProps, FileUploadItemPreview, type FileUploadItemPreviewProps, FileUploadItemProgress, type FileUploadItemProgressProps, type FileUploadItemProps, FileUploadList, type FileUploadListOrientationType, type FileUploadListProps, type FileUploadProps, type FileUploadStoreState, FileUploadTrigger, type FileUploadTriggerProps, type FileUploadUploadOptions, useFileUploadContext, useFileUploadItemContext, useFileUploadStore };
