k5kit
Version:
Utilities for TypeScript and Svelte
67 lines (66 loc) • 2.52 kB
TypeScript
export type Column = {
name: string;
key: string;
width: number;
is_pct?: boolean;
offset?: number;
/** Handles both creation and updating of rows */
cell_render?: (element: HTMLElement, value: unknown) => void;
};
export declare const RefreshLevel: {
readonly Nothing: 0;
readonly NewRows: 1;
readonly AllRows: 2;
};
export type RefreshLevel = (typeof RefreshLevel)[keyof typeof RefreshLevel];
type Row = {
element: HTMLElement | null;
index: number | null;
rendered: boolean;
};
/**
* ## Virtual grid
* High-performance virtual grid. Renders rows as HTML elements directly for better scroll performance instead of relying on a JS framework (which means custom markup needs to be created with JS).
*
* Features:
* - Renders rows as HTML elements directly instead of using a JS framework (for better scroll performance)
* - Rows can be dynamically loaded
* - Columns can have fixed and percentage widths
*
* Note that parentElement is not reactive.
* Do not add other elements into the row elements. Things would break because cells are referenced by indexing into the row's children.
*/
export declare class VirtualGrid<I, R extends Record<string, unknown>> {
#private;
source_items: I[];
options: {
buffer?: number;
row_prepare: (source_items: I, index: number) => R;
row_render?: (element: HTMLElement, item: R, index: number) => void;
row_height: number;
};
main_element?: HTMLElement;
viewport?: HTMLElement;
size_observer?: ResizeObserver;
refreshing: RefreshLevel;
/** Use the `.create()` method instead. I couldn't get the constructor to infer generics */
private constructor();
static create<I, R extends Record<string, unknown>>(source_items: I[], options: {
buffer?: number;
row_prepare: (source_items: I, index: number) => R;
row_render?: (element: HTMLElement, item: R, index: number) => void;
row_height: number;
}): VirtualGrid<I, R>;
set_source_items(source_items: I[]): void;
get_row_index_from_event(e: Event): number | null;
viewport_row_count: number;
rows: Row[];
refresh(level?: RefreshLevel): void;
/** Updating columns must be done via `set_columns` */
columns: Column[];
set_columns(columns: Column[]): Column[];
scroll_to_index(index: number, scroll_margin_bottom?: number): void;
setup(node: HTMLElement): () => void;
attach(): (node: HTMLElement) => () => void;
}
export {};