import type { Worksheet } from 'exceljs';
import type { Writable } from 'svelte/store';
export type Cell = number | string | null | Date | object;
export interface Head {
    title?: string;
    name: string;
    width?: number | string;
    minWidth?: number;
    maxWidth?: number;
    type?: Types | string;
    unit?: string;
    class?: string;
    skipRender?: boolean;
    showTextModal?: boolean;
    modalMinTextLength?: number;
    sortable?: boolean;
    resizable?: boolean;
    pinnable?: boolean;
    pinned?: boolean;
    offsetLeft?: number;
    element?: HTMLElement;
    helpers?: boolean;
    index?: number;
    cast?: (cell: Cell) => string;
    renderValue?: (cell: Cell, type: string | undefined) => string;
    onSort?: SortCallback;
    onFilter?: FilterCallback;
}
export type KeyCallback<T = any> = (index: number, body: Processed.Data<T>) => string | number;
export declare enum Types {
    Number = "number",
    String = "string",
    Date = "date",
    Boolean = "boolean",
    List = "list",
    Object = "object"
}
export type totalValues = Array<number | string> | Record<string, number | string>;
export type RowData = Record<Head['name'], Cell>[];
export type ColData = Record<Head['name'], Cell[]>;
export declare namespace Props {
    type Data = RowData | ColData;
    type Columns = Head[] | Record<Head['name'], Head> | Record<Head['name'], Head['title']> | Head['name'][] | undefined;
    type Config<T> = {
        virtualizer?: {
            overscan?: number;
            rowHeight: number;
        };
        enumerate?: boolean;
        fullScreen?: boolean;
        head?: {
            precision?: Record<string, number>;
            pinnable?: boolean;
            resizable?: boolean;
            sortable?: boolean;
            showPin?: boolean;
            showTextModal?: boolean;
            modalMinTextLength?: number;
            minWidth?: number;
            maxWidth?: number;
            width?: number | string;
            menuable?: boolean;
            filterable?: boolean;
        };
        persist: Writable<Controls | null>;
        format: (value: string | number | Date, type: Types) => string;
        onSort?: SortCallback<T>;
        onPagination?: undefined;
        onFilter?: undefined;
        replaceNull?: string;
    };
    type All<T> = {
        data: Data;
        columns: Columns | undefined;
        config: Config<T> | undefined;
    };
}
export declare namespace Processed {
    type Data<T> = T[];
    type Header = Head[];
    type Config<T> = Props.Config<T>;
}
export type RowProps = {
    [k: string]: unknown;
    class?: string;
};
export type RowsConfig = Record<number | string, // Row index
RowProps> | RowProps[];
export type Sort = {
    by: Head | null;
    asc: boolean;
};
export type Filter = Record<string, string>;
export type Controls = {
    filter: Filter;
    sort: Sort;
    pinned: string[];
    dataVersion: string;
};
export type SortCallback<T> = (data: Processed.Data<T>, controls: Sort) => Promise<Processed.Data<T>>;
export type FilterCallback<T> = (data: Processed.Data<T>, controls: Filter) => Promise<Processed.Data<T>>;
export type Rendered<T> = {
    header: Writable<Processed.Header>;
    body: Writable<Processed.Data<T>>;
    config: Writable<Processed.Config<T>>;
};
export type StyleTableCallback = (worksheet: Worksheet) => void;
