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