export type TableSortingEntry = {
    desc: boolean;
    id: string;
};
export type TableColumnVisibility = Record<string, boolean>;
export type TableFilterValue = boolean | number | string | null | readonly (boolean | number | string | null)[];
export type TableUrlState = {
    columnFilters: {
        id: string;
        value: TableFilterValue;
    }[];
    globalFilter: string;
    pagination: {
        pageIndex: number;
        pageSize: number;
    };
    sorting: TableSortingEntry[];
};
export type TableSearchParamsAdapter = {
    read: () => URLSearchParams;
    replace: (params: URLSearchParams) => void;
    subscribe: (listener: () => void) => () => void;
};
export type TableStorageAdapter = {
    read: (key: string) => string | null;
    write: (key: string, value: string) => void;
};
export type TablePersistenceAdapters = {
    search: TableSearchParamsAdapter;
    storage?: TableStorageAdapter;
};
export declare const DEFAULT_TABLE_SEARCH_DEBOUNCE_MS = 300;
/**
 * Create a search adapter from a router's search and navigation primitives.
 *
 * TanStack Router consumers can pass `router.state.location.searchStr` from
 * `read`, use `router.navigate({ replace: true, search })` from `replace`, and
 * subscribe to router state changes from `subscribe`. Other routers can expose
 * the same three operations without coupling the table package to that router.
 */
export declare function createTableSearchParamsAdapter(adapter: TableSearchParamsAdapter): TableSearchParamsAdapter;
/** Create browser-backed persistence for tables outside a router context. */
export declare function createBrowserTablePersistenceAdapters(): TablePersistenceAdapters;
export declare function parseTablePage(value: string | null, fallback: number, maximum?: number): number;
export declare function parseTablePageSize(value: string | null, fallback: number, allowedPageSizes: readonly number[]): number;
export declare function parseTableSorting(value: string | null, allowedColumnIds?: readonly string[], maximumEntries?: number): TableSortingEntry[];
export declare function parseTableColumnVisibility(value: string | null, allowedColumnIds?: readonly string[]): TableColumnVisibility;
export declare function serializeTableColumnVisibility(columns: TableColumnVisibility): string;
export declare function parseTableFilterValue(value: string): TableFilterValue;
export declare function serializeTableFilterValue(value: unknown): string | undefined;
/** Parse one namespaced table state from URL search parameters. */
export declare function parseTableUrlState(params: URLSearchParams, stateKey: string, defaultPageSize: number, allowedPageSizes: readonly number[], allowedColumnIds?: readonly string[]): TableUrlState;
/** Write one namespaced table state without changing unrelated parameters. */
export declare function serializeTableUrlState(source: URLSearchParams, stateKey: string, defaultPageSize: number, state: {
    columnFilters: readonly {
        id: string;
        value: unknown;
    }[];
    globalFilter: string;
    pagination: {
        pageIndex: number;
        pageSize: number;
    };
    sorting: readonly TableSortingEntry[];
}): URLSearchParams;
export declare function getLookaheadPage<T>(items: readonly T[], pageSize: number): {
    hasNextPage: boolean;
    rows: T[];
};
/** Returns the nearest valid zero-based page index for a result count. */
export declare function getClampedTablePageIndex(pageIndex: number, pageSize: number, rowCount: number): number;
