import { type InputStatus, type FieldStatusVariant } from '../Field';
export type { InputStatus as FileInputStatus, InputStatusType as FileInputStatusType, } from '../Field';
import type { BaseProps } from '../BaseProps';
import type { SizeValue } from '../utils/types';
export interface FileInputProps extends Omit<BaseProps, 'onChange' | 'defaultValue' | 'value'> {
    ref?: React.Ref<HTMLInputElement>;
    /**
     * Accessible label for the file input.
     */
    label: string;
    /**
     * Whether to visually hide the label (still accessible to screen readers).
     * @default false
     */
    isLabelHidden?: boolean;
    /**
     * Currently selected file(s). Controlled component.
     */
    value: File | File[] | null;
    /**
     * Callback fired when files are selected or removed.
     */
    onChange: (files: File | File[] | null) => void;
    /**
     * Async change action (React 19 transitions pattern).
     * Use for immediate upload on file selection.
     */
    changeAction?: (files: File | File[] | null) => Promise<void>;
    /**
     * Accepted file types. Uses the HTML accept attribute format.
     * Examples: "image/*", ".pdf,.doc,.docx", "image/png,image/jpeg"
     */
    accept?: string;
    /**
     * Whether multiple files can be selected.
     * When true, `value` and `onChange` use `File[]` instead of `File`.
     * @default false
     */
    isMultiple?: boolean;
    /**
     * Maximum file size in bytes. Files exceeding this are rejected
     * with an error status.
     */
    maxSize?: number;
    /**
     * Maximum number of files (only applies when `isMultiple` is true).
     */
    maxFiles?: number;
    /**
     * Whether the input is disabled.
     * @default false
     */
    isDisabled?: boolean;
    /**
     * Explains why the input is disabled. When set together with `isDisabled`,
     * the file input shows a tooltip with this text on hover and keyboard focus,
     * and its trigger stays focusable (via `aria-disabled`) so the reason is
     * discoverable by keyboard and assistive technology. Opening the file picker
     * stays blocked.
     *
     * Use this instead of wrapping a disabled input in `Tooltip` — disabled
     * controls don't emit the pointer events an external tooltip needs.
     *
     * @example
     * ```
     * <FileInput
     *   label="Resume"
     *   value={file}
     *   isDisabled
     *   disabledMessage="Uploads are locked until your profile is verified"
     * />
     * ```
     */
    disabledMessage?: string;
    /**
     * Whether the input is required.
     * @default false
     */
    isRequired?: boolean;
    /**
     * Whether the input is in a loading state (e.g. uploading).
     * @default false
     */
    isLoading?: boolean;
    /**
     * Validation status for the input.
     */
    status?: InputStatus;
    /**
     * How the status message is placed relative to the input.
     * - 'attached': message overlaps directly below the input (bordered treatment)
     * - 'detached': message floats below as a separate element with spacing
     * - 'tooltip': no message box; the status icon becomes a focusable info-tip button that reveals the message on hover, keyboard focus, or tap
     * @default 'attached'
     */
    statusVariant?: FieldStatusVariant;
    /**
     * Description text displayed below the label.
     */
    description?: string;
    /**
     * Placeholder text shown when no file is selected.
     * @default "Choose file" or "Choose files"
     */
    placeholder?: string;
    /**
     * Visual mode for the file input.
     * - 'input': compact inline style, similar to a text input
     * - 'dropzone': larger area with dashed border and drag-and-drop support
     * @default 'input'
     */
    mode?: 'dropzone' | 'input';
    /**
     * Whether the field is optional. Mutually exclusive with isRequired.
     * @default false
     */
    isOptional?: boolean;
    /**
     * Width of the field. Numbers are treated as pixels, strings are used as-is
     * (e.g. `'100%'`). Sizes the whole field (label, control, and status) so they
     * stay aligned, unlike setting width via `xstyle`/`className`/`style`.
     */
    width?: SizeValue;
    /**
     * Tooltip text to display in an info icon at the end of the label.
     */
    labelTooltip?: string;
}
/**
 * A file input component with optional drag-and-drop support.
 *
 * @example
 * ```
 * <FileInput label="Resume" value={file} onChange={setFile} accept=".pdf" />
 * ```
 */
export declare function FileInput({ label, isLabelHidden, value, onChange, changeAction, accept, isMultiple, maxSize, maxFiles, isDisabled, disabledMessage, isRequired, isLoading, status: statusProp, statusVariant, description, placeholder, mode, isOptional, labelTooltip, width, xstyle, className, style, ref, ...rest }: FileInputProps): import("react").JSX.Element;
export declare namespace FileInput {
    var displayName: string;
}
//# sourceMappingURL=FileInput.d.ts.map