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 `` 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([]);
* 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>;
//# sourceMappingURL=FileUploader.d.ts.map