@humanspeak/svelte-headless-table
Version: 
A powerful, headless table library for Svelte that provides complete control over table UI while handling complex data operations like sorting, filtering, pagination, grouping, and row expansion. Build custom, accessible data tables with zero styling opin
39 lines (38 loc) • 2.14 kB
TypeScript
import { BodyRow, DataBodyRow } from './bodyRows.js';
import { FlatColumn, type Column } from './columns.js';
import type { Table } from './createTable.js';
import { HeaderRow } from './headerRows.js';
import type { AnyPlugins, PluginStates } from './types/TablePlugin.js';
import { type Readable, type Writable } from 'svelte/store';
export type TableAttributes<Item, Plugins extends AnyPlugins = AnyPlugins> = Record<string, unknown> & {
    role: 'table';
};
export type TableHeadAttributes<Item, Plugins extends AnyPlugins = AnyPlugins> = Record<string, unknown>;
export type TableBodyAttributes<Item, Plugins extends AnyPlugins = AnyPlugins> = Record<string, unknown> & {
    role: 'rowgroup';
};
export interface TableViewModel<Item, Plugins extends AnyPlugins = AnyPlugins> {
    flatColumns: FlatColumn<Item, Plugins>[];
    tableAttrs: Readable<TableAttributes<Item, Plugins>>;
    tableHeadAttrs: Readable<TableHeadAttributes<Item, Plugins>>;
    tableBodyAttrs: Readable<TableBodyAttributes<Item, Plugins>>;
    visibleColumns: Readable<FlatColumn<Item, Plugins>[]>;
    headerRows: Readable<HeaderRow<Item, Plugins>[]>;
    originalRows: Readable<BodyRow<Item, Plugins>[]>;
    rows: Readable<DataBodyRow<Item, Plugins>[]>;
    pageRows: Readable<DataBodyRow<Item, Plugins>[]>;
    pluginStates: PluginStates<Plugins>;
}
export type ReadOrWritable<T> = Readable<T> | Writable<T>;
export interface PluginInitTableState<Item, Plugins extends AnyPlugins = AnyPlugins> extends Omit<TableViewModel<Item, Plugins>, 'pluginStates'> {
    data: ReadOrWritable<Item[]>;
    columns: Column<Item, Plugins>[];
}
export interface TableState<Item, Plugins extends AnyPlugins = AnyPlugins> extends TableViewModel<Item, Plugins> {
    data: ReadOrWritable<Item[]>;
    columns: Column<Item, Plugins>[];
}
export interface CreateViewModelOptions<Item> {
    rowDataId?: (item: Item, index: number) => string;
}
export declare const createViewModel: <Item, Plugins extends AnyPlugins = AnyPlugins>(table: Table<Item, Plugins>, columns: Column<Item, Plugins>[], { rowDataId }?: CreateViewModelOptions<Item>) => TableViewModel<Item, Plugins>;