import * as React from 'react'; export interface SortableListState { draggedItems: TItem[]; draggedIndex: number | null; sourceListId: TListId | null; dragOverListId: TListId | null; dragOverIndex: number | null; isDragging: boolean; } export interface UseSortableListOptions { /** Called when items are reordered within the same list */ onReorder: (listId: TListId, fromIndex: number, toIndex: number) => void; /** Called when items are dropped onto a different list */ onTransfer?: (sourceListId: TListId, targetListId: TListId, items: TItem[], targetIndex?: number) => void; /** Whether a transfer from source to target is allowed. Defaults to true. */ canTransfer?: (sourceListId: TListId, targetListId: TListId) => boolean; /** Resolve the set of items to drag. Useful for multi-selection. Defaults to [item]. */ getSelectedItems?: (listId: TListId, item: TItem) => TItem[]; } export interface UseSortableListReturn { dragState: SortableListState; /** * Drag handlers for the list container. * Must be spread onto the list wrapper element — handles both same-list reorder * (via dragOverIndexRef) and cross-list transfer in onDrop, so individual items * do not need onDrop handlers and CSS transitions on items are safe to use. */ getListHandlers: (listId: TListId) => { onDragOver: (e: React.DragEvent) => void; onDrop: (e: React.DragEvent) => void; }; /** Drag handlers for individual items (onDragStart, onDragOver, onDragEnd) */ getItemHandlers: (listId: TListId, index: number, item: TItem) => { draggable: true; 'data-index': number; onDragStart: (e: React.DragEvent) => void; onDragOver: (e: React.DragEvent) => void; onDragEnd: () => void; }; /** Reset all drag state */ reset: () => void; } export declare function useSortableList({ onReorder, onTransfer, canTransfer, getSelectedItems }: UseSortableListOptions): UseSortableListReturn;