import { AnyIconDefinition, IconFontColor, IconFontSize } from '../../../../shared/types/types';
import { FileUploadListItemData, FileUploadListRowSize } from '../../types';
/**
 * Capas de un icono Font Awesome duotone (mapea a `Icon` / `IconFont`).
 */
export interface FileUploaderDropZoneIconDuotoneProps {
    primary?: IconFontColor;
    secondary?: IconFontColor;
    opacityPrimary?: number;
    opacitySecondary?: number;
}
/**
 * Icono de la zona discontinua (misma superficie que `Icon`: tamaño, color y duotono).
 * Se fusiona con valores por defecto (`faFile`, `xl`, `disabled` / `brand` en highlight).
 */
export interface FileUploaderDropZoneIconProps {
    /** Definición Font Awesome del glifo. @default faFile (pro-regular). */
    name?: AnyIconDefinition;
    size?: IconFontSize;
    /** Color cuando la zona no está resaltada por arrastre. @default 'disabled' */
    color?: IconFontColor;
    /** Color cuando hay highlight de arrastre (drag over). @default 'brand' */
    colorActive?: IconFontColor;
    /** Clases en el contenedor del icono (`Icon`). */
    className?: string;
    /** Duotono: colores y opacidades por capa. */
    duotone?: FileUploaderDropZoneIconDuotoneProps;
}
/**
 * Textos y error visual de la zona de soltar (área discontinua).
 * Futuros ajustes de copy o estado de la zona viven aquí.
 */
export interface FileUploaderDropZoneProps {
    /** Título principal (Figma: «Arrastra y suelta tus archivos»). */
    title?: string;
    /** Ayuda bajo el título (tipos y peso). */
    hint?: string;
    /** Etiqueta del botón que abre el selector del sistema. */
    selectLabel?: string;
    /**
     * Mensaje bajo el botón (borde en error).
     * Sustituye el antiguo `dropZoneError` plano.
     */
    error?: string | null;
    /** Icono, tamaño, colores base/highlight y duotono (agrupado). */
    icon?: FileUploaderDropZoneIconProps;
}
/**
 * Restricciones del `<input type="file">` y validación en cliente antes de `events.onFilesAccepted`.
 */
export interface FileUploaderConstraintsProps {
    /**
     * Valor nativo `accept` (extensiones o MIME, separados por coma).
     * Por defecto: `.png,.jpg,.jpeg,.csv,.pdf` (coherente con `dropZone.hint`).
     * Pasa `undefined` explícitamente en el objeto `constraints` si no quieres filtrar por tipo.
     */
    accept?: string;
    /**
     * Tamaño máximo por archivo en bytes.
     * Por defecto: 50 MiB (mismo mensaje que el hint).
     */
    maxFileSizeBytes?: number;
    /**
     * Máximo de archivos en total en la cola (`list.items` + nuevos aceptados).
     * Si ya hay tantos ítems como este límite, no se añaden más y se llama `onValidationError`.
     * Si un lote supera el hueco restante, solo se emiten los que caben y se notifica el resto.
     */
    maxFiles?: number;
    /** Máximo de archivos por selección o soltar (un solo lote). Independiente de `maxFiles`. */
    maxFilesPerBatch?: number;
    /** Selección múltiple en el diálogo del sistema. @default true */
    multiple?: boolean;
}
/**
 * Cola de archivos y acciones por fila (`FileUploadListItem`).
 */
export interface FileUploaderListProps {
    items?: FileUploadListItemData[];
    rowSize?: FileUploadListRowSize;
    onRemoveItem?: (id: string) => void;
    /**
     * Reintento cuando `status === 'error'` (red, 5xx, validación del servidor, etc.).
     * Muestra el botón con icono `arrows-rotate` junto al de quitar (X).
     */
    onRetryItem?: (id: string) => void;
    onDeleteItem?: (id: string) => void;
}
/**
 * Eventos de ingesta: archivos que pasan o fallan la validación local del organismo.
 * La subida HTTP y los cambios de progreso siguen siendo responsabilidad del consumidor (`list.items`).
 */
export interface FileUploaderEventsProps {
    onFilesAccepted?: (files: File[]) => void;
    onValidationError?: (message: string, files: File[]) => void;
}
export interface FileUploaderProps {
    className?: string;
    disabled?: boolean;
    /** Zona discontinua: copy visible y `error` de la zona. */
    dropZone?: FileUploaderDropZoneProps;
    /** Input nativo y reglas (`accept`, peso, cupo por lote). */
    constraints?: FileUploaderConstraintsProps;
    /** Lista controlada y callbacks por fila (quitar, reintentar, borrar completado). */
    list?: FileUploaderListProps;
    /** Emisión tras validación local; no sustituye el estado de cada fila. */
    events?: FileUploaderEventsProps;
}
/**
 * Zona de arrastrar y soltar con botón «Seleccionar archivos», validación opcional de tipo y peso,
 * y lista de filas de carga (`FileUploadListItem`) según Figma *File Uploader*.
 *
 * La subida real (HTTP) queda fuera del componente: usa `events.onFilesAccepted` y actualiza `list.items`.
 *
 * @example
 * ```tsx
 * const [items, setItems] = useState<FileUploadListItemData[]>([]);
 * <FileUploader
 *   constraints={{ maxFiles: 10 }}
 *   list={{
 *     items,
 *     onRemoveItem: (id) => setItems((p) => p.filter((x) => x.id !== id)),
 *   }}
 *   events={{
 *     onFilesAccepted: (files) =>
 *       setItems((prev) => [
 *         ...prev,
 *         ...files.map((f, i) => ({
 *           id: `${Date.now()}-${i}`,
 *           fileName: f.name,
 *           format: inferFileFormat(f.name),
 *           status: 'uploading' as const,
 *           progress: 0,
 *           detailLine: `${(f.size / (1024 * 1024)).toFixed(1)} Mb | 0%`,
 *         })),
 *       ]),
 *   }}
 *   dropZone={{
 *     icon: {
 *       size: 'lg',
 *       color: 'secondary',
 *       colorActive: 'brand',
 *       duotone: { primary: 'brand', secondary: 'neutral' },
 *     },
 *   }}
 * />
 * ```
 */
export declare const FileUploader: import('react').ForwardRefExoticComponent<FileUploaderProps & import('react').RefAttributes<HTMLDivElement>>;
//# sourceMappingURL=FileUploader.d.ts.map