import type { ReactNode } from "react";
/**
 * Traducciones disponibles para el componente Kanban.
 * Todas las propiedades son opcionales para permitir traducciones parciales.
 */
export type KanbanTranslations = {
    /** Texto al arrastrar sobre zona de drop vacía */
    dropHere?: string;
    /** Mensaje por defecto cuando una columna está vacía */
    emptyMessage?: string;
};
/**
 * Representa un item genérico en el Kanban.
 * El contenido visual lo define el consumidor con renderItem.
 */
export interface KanbanItem<T = unknown> {
    /** Identificador único del item (requerido para keys) */
    id: string;
    /** Datos del item - el tipo lo define el consumidor */
    data: T;
}
/**
 * Representa una columna del Kanban
 */
export interface KanbanColumn<T = unknown> {
    /** Identificador único de la columna */
    id: string;
    /** Título de la columna */
    title: string;
    /** Items en esta columna */
    items: KanbanItem<T>[];
    /** Mensaje cuando no hay items */
    emptyMessage?: string;
    /** Color del badge de conteo */
    countBadgeColor?: "default" | "primary" | "secondary" | "success" | "warning" | "danger";
    /** Si hay más items para cargar (scroll infinito) */
    hasMore?: boolean;
    /** Si está cargando más items */
    isLoading?: boolean;
}
/**
 * Información del movimiento de un item entre columnas
 */
export interface KanbanMoveEvent<T = unknown> {
    /** El item que fue movido */
    item: KanbanItem<T>;
    /** ID de la columna origen */
    fromColumnId: string;
    /** ID de la columna destino */
    toColumnId: string;
    /** Índice del item en la columna origen */
    fromIndex: number;
    /** Índice donde se soltó en la columna destino */
    toIndex: number;
}
/**
 * Props para el componente KanbanCard interno
 */
export interface KanbanCardProps<T = unknown> {
    /** Item a renderizar */
    item: KanbanItem<T>;
    /** ID de la columna donde está el item */
    columnId: string;
    /** Índice del item en la columna */
    index: number;
    /** Función para renderizar el contenido (REQUERIDO) */
    renderContent: (item: KanbanItem<T>) => ReactNode;
    /** Callback al hacer clic en la tarjeta */
    onCardClick?: (item: KanbanItem<T>) => void;
    /** Clases CSS adicionales para la tarjeta */
    className?: string;
    /** Si la tarjeta es clickeable (muestra hover effects) */
    isClickable?: boolean;
    /** Si el drag and drop está habilitado */
    isDraggable?: boolean;
    /** Callback cuando empieza el drag */
    onDragStart?: (item: KanbanItem<T>, columnId: string, index: number) => void;
    /** Callback cuando termina el drag */
    onDragEnd?: () => void;
}
/**
 * Props para el componente KanbanColumnInternal
 */
export interface KanbanColumnInternalProps<T = unknown> {
    /** Columna a renderizar */
    column: KanbanColumn<T>;
    /** Función para renderizar el contenido de cada item (REQUERIDO) */
    renderItem: (item: KanbanItem<T>) => ReactNode;
    /** Callback al hacer clic en una tarjeta */
    onCardClick?: (item: KanbanItem<T>) => void;
    /** Clases CSS adicionales para las tarjetas */
    cardClassName?: string;
    /** Si las tarjetas son clickeables */
    isCardClickable?: boolean;
    /** Clases CSS adicionales para la columna */
    className?: string;
    /** Altura máxima de la columna (con scroll) */
    maxHeight?: string;
    /** Render personalizado del header de la columna */
    renderColumnHeader?: (column: KanbanColumn<T>) => ReactNode;
    /** Render personalizado del estado vacío */
    renderEmptyState?: (column: KanbanColumn<T>) => ReactNode;
    /** Si el drag and drop está habilitado */
    isDraggable?: boolean;
    /** Callback cuando empieza el drag de un item */
    onDragStart?: (item: KanbanItem<T>, columnId: string, index: number) => void;
    /** Callback cuando termina el drag */
    onDragEnd?: () => void;
    /** Callback cuando se suelta un item en esta columna */
    onDrop?: (columnId: string, dropIndex: number) => void;
    /** Si hay un item siendo arrastrado actualmente */
    isDragging?: boolean;
    /**
     * Traducciones i18n del componente.
     * Si no se proporciona, usa traducciones por defecto en español.
     */
    translations?: KanbanTranslations;
    /** Callback para cargar más items (scroll infinito) */
    onLoadMore?: () => void;
}
/**
 * Props para el componente Kanban principal
 */
export interface KanbanProps<T = unknown> {
    /** Columnas del Kanban */
    columns: KanbanColumn<T>[];
    /**
     * Función para renderizar el contenido de cada item (REQUERIDO).
     * El padre decide qué mostrar en cada tarjeta.
     */
    renderItem: (item: KanbanItem<T>) => ReactNode;
    /** Callback al hacer clic en una tarjeta */
    onCardClick?: (item: KanbanItem<T>) => void;
    /**
     * Callback cuando un item se mueve entre columnas (drag and drop).
     * Recibe información completa del movimiento.
     */
    onItemMove?: (event: KanbanMoveEvent<T>) => void;
    /** Si el drag and drop está habilitado (default: true si hay onItemMove) */
    isDraggable?: boolean;
    /** Clases CSS adicionales para las tarjetas */
    cardClassName?: string;
    /** Si las tarjetas son clickeables (default: true si hay onCardClick) */
    isCardClickable?: boolean;
    /** Clases CSS adicionales para el contenedor */
    className?: string;
    /** Ancho de cada columna */
    columnWidth?: string;
    /** Gap entre columnas */
    columnGap?: "sm" | "md" | "lg";
    /** Si el board tiene scroll horizontal */
    horizontalScroll?: boolean;
    /** Altura máxima de las columnas */
    columnMaxHeight?: string;
    /** Render personalizado del header de columna */
    renderColumnHeader?: (column: KanbanColumn<T>) => ReactNode;
    /** Render personalizado del estado vacío de columna */
    renderEmptyState?: (column: KanbanColumn<T>) => ReactNode;
    /**
     * Traducciones i18n del componente.
     * Si no se proporciona, usa traducciones por defecto en español.
     * @example
     * ```tsx
     * <Kanban translations={{ dropHere: "Drop here", emptyMessage: "No items" }} />
     * ```
     */
    translations?: KanbanTranslations;
    /**
     * Callback para cargar más items cuando se hace scroll al final de una columna.
     * Recibe el ID de la columna que necesita más items.
     * @example
     * ```tsx
     * <Kanban onLoadMore={(columnId) => loadMoreItems(columnId)} />
     * ```
     */
    onLoadMore?: (columnId: string) => void;
}
//# sourceMappingURL=Kanban.types.d.ts.map