@mikestools/usetable 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,504 @@
1
+ import { Ref } from 'vue';
2
+
3
+ /** Cell change record for dirty tracking. @public */
4
+ export declare interface CellChange {
5
+ row: number;
6
+ column: number;
7
+ oldValue: unknown;
8
+ newValue: unknown;
9
+ }
10
+
11
+ /** Configuration for a table cell with content and attributes. @public */
12
+ export declare interface CellConfig {
13
+ value: unknown;
14
+ attributes?: ElementAttributes;
15
+ columnSpan?: number;
16
+ rowSpan?: number;
17
+ }
18
+
19
+ /** Cell position for focus/navigation. @public */
20
+ export declare interface CellPosition {
21
+ row: number;
22
+ column: number;
23
+ }
24
+
25
+ export declare type CellValidator = (value: unknown) => boolean | string;
26
+
27
+ /** Configuration for a table column. @public */
28
+ export declare interface ColumnConfig {
29
+ header: string | CellConfig;
30
+ defaultValue?: unknown;
31
+ defaultAttributes?: ElementAttributes;
32
+ }
33
+
34
+ /** Column definition for type parsing/formatting. @public */
35
+ export declare interface ColumnDefinition {
36
+ type: 'string' | 'number' | 'date' | 'boolean';
37
+ parser?: (value: unknown) => unknown;
38
+ formatter?: (value: unknown) => string;
39
+ defaultValue?: unknown;
40
+ nullable?: boolean;
41
+ }
42
+
43
+ /** Computed column configuration. @public */
44
+ export declare interface ComputedColumnConfig {
45
+ computeFunction: (row: unknown[]) => unknown;
46
+ label: string;
47
+ index?: number;
48
+ }
49
+
50
+ /** Editable configuration. @public */
51
+ export declare interface EditableConfig {
52
+ cells?: boolean;
53
+ headers?: boolean;
54
+ footers?: boolean;
55
+ editableColumns?: number[];
56
+ editableRows?: number[];
57
+ validator?: (value: string, row: number, col: number) => boolean | string;
58
+ parser?: (value: string, row: number, col: number) => unknown;
59
+ onEdit?: (value: unknown, row: number, col: number) => void;
60
+ }
61
+
62
+ /**
63
+ * Comprehensive HTML element attributes for table elements.
64
+ * @public
65
+ */
66
+ export declare interface ElementAttributes extends Partial<Omit<HTMLElement, 'style' | 'className' | 'classList' | 'children' | 'childNodes' | 'parentNode' | 'parentElement' | 'attributes' | 'tagName' | 'namespaceURI' | 'shadowRoot' | 'assignedSlot' | 'offsetParent' | 'offsetTop' | 'offsetLeft' | 'offsetWidth' | 'offsetHeight' | 'clientTop' | 'clientLeft' | 'clientWidth' | 'clientHeight' | 'scrollTop' | 'scrollLeft' | 'scrollWidth' | 'scrollHeight' | 'innerHTML' | 'outerHTML' | 'innerText' | 'outerText' | 'textContent' | 'addEventListener' | 'removeEventListener' | 'dispatchEvent' | 'getAttribute' | 'setAttribute' | 'removeAttribute' | 'hasAttribute' | 'appendChild' | 'removeChild' | 'replaceChild' | 'insertBefore' | 'querySelector' | 'querySelectorAll' | 'getElementsByTagName' | 'getElementsByClassName' | 'getElementById' | 'animate' | 'getAnimations' | 'attachShadow' | 'closest' | 'matches' | 'webkitMatchesSelector' | 'getBoundingClientRect' | 'getClientRects' | 'scrollIntoView' | 'scroll' | 'scrollBy' | 'scrollTo' | 'focus' | 'blur' | 'click'>>, Partial<GlobalEventHandlers>, Partial<ARIAMixin> {
67
+ class?: string | string[] | Record<string, boolean>;
68
+ style?: string | Partial<CSSStyleDeclaration> | Record<string, string | number>;
69
+ dataset?: Record<string, string>;
70
+ [key: `data-${string}`]: string;
71
+ [key: `aria-${string}`]: string;
72
+ [key: string]: unknown;
73
+ }
74
+
75
+ /** Filter state for tracking row filtering. @public */
76
+ export declare interface FilterState {
77
+ readonly isFiltered: Readonly<Ref<boolean>>;
78
+ readonly filteredRowCount: Readonly<Ref<number>>;
79
+ readonly filteredIndices: Readonly<Ref<readonly number[]>>;
80
+ }
81
+
82
+ export declare type FullValidator = (value: unknown, row: number, col: number) => string | null;
83
+
84
+ export declare function isCellConfig(value: unknown): value is CellConfig;
85
+
86
+ export declare function isValidationError(value: unknown): value is ValidationError;
87
+
88
+ export declare function isValidationErrorArray(value: unknown): value is ValidationError[];
89
+
90
+ export declare function isValidationResult(value: unknown): value is ValidationResult;
91
+
92
+ /** Pagination configuration. @public */
93
+ export declare interface PaginationConfig {
94
+ pageSize: number;
95
+ currentPage?: number;
96
+ }
97
+
98
+ /** Pagination state. @public */
99
+ export declare interface PaginationState {
100
+ totalPages: Readonly<Ref<number>>;
101
+ currentPage: Ref<number>;
102
+ pageSize: Ref<number>;
103
+ visibleRows: Ref<number[]>;
104
+ }
105
+
106
+ /** Reactive wrapper for table cells. @public */
107
+ export declare interface ReactiveCellCollection {
108
+ readonly cells: Readonly<Ref<readonly HTMLTableCellElement[]>>;
109
+ readonly cellCount: Readonly<Ref<number>>;
110
+ }
111
+
112
+ /** Reactive wrapper for table rows. @public */
113
+ export declare interface ReactiveRowCollection {
114
+ readonly rows: Readonly<Ref<readonly HTMLTableRowElement[]>>;
115
+ readonly rowCount: Readonly<Ref<number>>;
116
+ }
117
+
118
+ /** Reactive wrapper for tbody elements. @public */
119
+ export declare interface ReactiveTBodyCollection {
120
+ readonly tBodies: Readonly<Ref<readonly HTMLTableSectionElement[]>>;
121
+ readonly tBodyCount: Readonly<Ref<number>>;
122
+ }
123
+
124
+ export declare type RowValidator = (rowData: unknown[]) => boolean | string;
125
+
126
+ /** Search options. @public */
127
+ export declare interface SearchOptions {
128
+ caseSensitive?: boolean;
129
+ }
130
+
131
+ /** Search result. @public */
132
+ export declare interface SearchResult {
133
+ row: number;
134
+ column: number;
135
+ value: unknown;
136
+ }
137
+
138
+ /** Sort state for tracking column sorting. @public */
139
+ export declare interface SortState {
140
+ readonly columnIndex: Readonly<Ref<number | null>>;
141
+ readonly ascending: Readonly<Ref<boolean>>;
142
+ readonly descending: Readonly<Ref<boolean>>;
143
+ }
144
+
145
+ /** Table cell composable. @public */
146
+ export declare interface TableCell {
147
+ readonly element: Readonly<Ref<HTMLTableCellElement>>;
148
+ readonly cellIndex: Readonly<Ref<number>>;
149
+ readonly columnSpan: Ref<number>;
150
+ readonly rowSpan: Ref<number>;
151
+ readonly headers: Ref<string>;
152
+ readonly abbr: Ref<string>;
153
+ readonly scope: Ref<string>;
154
+ }
155
+
156
+ /** Table row composable. @public */
157
+ export declare interface TableRow extends ReactiveCellCollection {
158
+ readonly element: Readonly<Ref<HTMLTableRowElement>>;
159
+ readonly rowIndex: Readonly<Ref<number>>;
160
+ readonly sectionRowIndex: Readonly<Ref<number>>;
161
+ insertCell(index?: number): HTMLTableCellElement;
162
+ deleteCell(index: number): void;
163
+ getCell(index: number): TableCell | undefined;
164
+ }
165
+
166
+ /** Table section composable. @public */
167
+ export declare interface TableSection extends ReactiveRowCollection {
168
+ readonly element: Readonly<Ref<HTMLTableSectionElement>>;
169
+ insertRow(index?: number): HTMLTableRowElement;
170
+ deleteRow(index: number): void;
171
+ getRow(index: number): TableRow | undefined;
172
+ }
173
+
174
+ /**
175
+ * A comprehensive Vue composable for direct HTML table DOM manipulation.
176
+ * DOM is the source of truth - data and headers are computed from DOM state.
177
+ * @public
178
+ */
179
+ export declare function useTable(element: Ref<HTMLTableElement>): UseTableReturn;
180
+
181
+ /** Main table composable return type. @public */
182
+ export declare interface UseTableReturn extends ReactiveRowCollection, ReactiveTBodyCollection {
183
+ readonly element: Readonly<Ref<HTMLTableElement>>;
184
+ readonly caption: Ref<HTMLTableCaptionElement | null>;
185
+ readonly tHead: Ref<HTMLTableSectionElement | null>;
186
+ readonly tFoot: Ref<HTMLTableSectionElement | null>;
187
+ readonly data: Ref<unknown[][]>;
188
+ readonly headers: Ref<string[]>;
189
+ readonly columnCount: Readonly<Ref<number>>;
190
+ createCaption(): HTMLTableCaptionElement;
191
+ deleteCaption(): void;
192
+ createTHead(): HTMLTableSectionElement;
193
+ deleteTHead(): void;
194
+ createTFoot(): HTMLTableSectionElement;
195
+ deleteTFoot(): void;
196
+ createTBody(): HTMLTableSectionElement;
197
+ insertRow(index?: number): HTMLTableRowElement;
198
+ deleteRow(index: number): void;
199
+ getTHead(): TableSection | undefined;
200
+ getTFoot(): TableSection | undefined;
201
+ getTBody(index: number): TableSection | undefined;
202
+ getRow(index: number): TableRow | undefined;
203
+ addRow(rowData: readonly unknown[], index?: number): HTMLTableRowElement;
204
+ removeRow(index: number): void;
205
+ addColumn(headerText?: string, defaultValue?: unknown, index?: number): void;
206
+ removeColumn(index: number): void;
207
+ setCell(rowIndex: number, columnIndex: number, value: unknown): void;
208
+ getCell(rowIndex: number, columnIndex: number): unknown;
209
+ setCaption(text: string): void;
210
+ setHeaders(headerTexts: readonly string[]): void;
211
+ setFooter(footerData: readonly unknown[]): void;
212
+ setData(newData: readonly (readonly unknown[])[]): void;
213
+ clearData(): void;
214
+ reset(): void;
215
+ sync(): void;
216
+ addRowWithAttributes(rowData: readonly (unknown | CellConfig)[], attributes?: ElementAttributes, index?: number): HTMLTableRowElement;
217
+ addColumnWithAttributes(config: ColumnConfig, index?: number): void;
218
+ setHeadersWithAttributes(headerConfigs: readonly (string | CellConfig)[]): void;
219
+ setCellWithAttributes(rowIndex: number, columnIndex: number, value: unknown, attributes?: ElementAttributes): void;
220
+ getRowData(index: number): unknown[] | undefined;
221
+ setRowData(index: number, rowData: readonly unknown[]): void;
222
+ getAllRowData(): unknown[][];
223
+ getColumnData(index: number): unknown[];
224
+ setColumnData(index: number, columnData: readonly unknown[]): void;
225
+ getCellRange(rowStart: number, rowEnd: number, columnStart: number, columnEnd: number): unknown[][];
226
+ setCellRange(rowStart: number, columnStart: number, rangeData: readonly (readonly unknown[])[]): void;
227
+ getHeaderData(): string[];
228
+ getFooterData(): unknown[] | undefined;
229
+ setFooterCell(columnIndex: number, value: unknown): void;
230
+ getFooterCell(columnIndex: number): unknown;
231
+ updateCell(rowIndex: number, columnIndex: number, config: CellConfig): void;
232
+ updateRow(index: number, rowData: readonly (unknown | CellConfig)[]): void;
233
+ getCellElement(rowIndex: number, columnIndex: number): HTMLTableCellElement | undefined;
234
+ getRowElement(index: number): HTMLTableRowElement | undefined;
235
+ selectRows(indices: readonly number[]): unknown[][];
236
+ selectColumns(indices: readonly number[]): unknown[][];
237
+ updateRows(updates: ReadonlyMap<number, readonly (unknown | CellConfig)[]>): void;
238
+ updateCells(updates: ReadonlyMap<readonly [number, number], unknown | CellConfig>): void;
239
+ getRowElements(): readonly HTMLTableRowElement[];
240
+ getRowCellElements(rowIndex: number): readonly HTMLTableCellElement[];
241
+ setRows(startIndex: number, rows: readonly (readonly (unknown | CellConfig)[])[]): void;
242
+ validateCell(rowIndex: number, columnIndex: number, validator: CellValidator): true | ValidationError;
243
+ validateRow(index: number, validator: RowValidator): true | ValidationError[];
244
+ validateColumn(index: number, validator: CellValidator): true | ValidationError[];
245
+ validateAll(validator: FullValidator): ValidationResult;
246
+ sum(columnIndex: number): number;
247
+ average(columnIndex: number): number;
248
+ min(columnIndex: number): unknown;
249
+ max(columnIndex: number): unknown;
250
+ count(columnIndex: number, predicate?: (value: unknown) => boolean): number;
251
+ aggregate<T>(columnIndex: number, options: {
252
+ initial: T;
253
+ reducer: (accumulator: T, value: unknown, rowIndex: number) => T;
254
+ }): T;
255
+ transformColumn(columnIndex: number, transformer: (value: unknown, rowIndex: number) => unknown): void;
256
+ transformRow(rowIndex: number, transformer: (value: unknown, colIndex: number) => unknown): void;
257
+ transformCells(transformer: (value: unknown, rowIndex: number, colIndex: number) => unknown): void;
258
+ exportToCSV(): string;
259
+ exportToJSON(): string;
260
+ importFromArray(data: readonly (readonly unknown[])[]): void;
261
+ importFromCSV(csv: string): void;
262
+ importFromJSON(json: string): void;
263
+ search(query: string, options?: SearchOptions): SearchResult[];
264
+ searchColumn(columnIndex: number, query: string, options?: SearchOptions): SearchResult[];
265
+ readonly selectedRows: Readonly<Ref<Set<number>>>;
266
+ readonly selectedCells: Readonly<Ref<Set<string>>>;
267
+ selectRow(index: number): void;
268
+ deselectRow(index: number): void;
269
+ toggleRowSelection(index: number): void;
270
+ isRowSelected(index: number): boolean;
271
+ selectCell(rowIndex: number, columnIndex: number): void;
272
+ clearSelection(): void;
273
+ enableCellEditing(config?: EditableConfig): void;
274
+ disableCellEditing(): void;
275
+ enableHeaderEditing(config?: Omit<EditableConfig, 'cells'>): void;
276
+ disableHeaderEditing(): void;
277
+ enableColumnEditing(columnIndex: number, config?: EditableConfig): void;
278
+ disableColumnEditing(columnIndex: number): void;
279
+ enableRowEditing(rowIndex: number, config?: EditableConfig): void;
280
+ disableRowEditing(rowIndex: number): void;
281
+ enableEditing(): () => void;
282
+ groupBy(keyFunction: (row: unknown[]) => string | number): Map<string | number, number[]>;
283
+ addComputedColumn(config: ComputedColumnConfig): number;
284
+ removeComputedColumn(index: number): void;
285
+ pagination: PaginationState | null;
286
+ paginate(config: PaginationConfig): void;
287
+ nextPage(): void;
288
+ previousPage(): void;
289
+ goToPage(page: number): void;
290
+ virtualScroll: VirtualScrollState | null;
291
+ enableVirtualScrolling(config: VirtualScrollConfig): void;
292
+ disableVirtualScrolling(): void;
293
+ transaction<T>(callback: () => T | Promise<T>): T | Promise<T>;
294
+ onDataChange(callback: (data: unknown[][]) => void): () => void;
295
+ readonly sortState: SortState;
296
+ sortColumnAscending(columnIndex: number): void;
297
+ sortColumnDescending(columnIndex: number): void;
298
+ sortColumnAscendingWith(columnIndex: number, comparator: (a: unknown, b: unknown) => number): void;
299
+ sortColumnDescendingWith(columnIndex: number, comparator: (a: unknown, b: unknown) => number): void;
300
+ clearColumnSort(): void;
301
+ getSortedColumnIndex(): number | null;
302
+ isSortedAscending(): boolean;
303
+ isSortedDescending(): boolean;
304
+ isSorted(): boolean;
305
+ readonly filterState: FilterState;
306
+ filterRows(predicate: (rowData: unknown[], rowIndex: number) => boolean): void;
307
+ filterColumn(columnIndex: number, predicate: (value: unknown) => boolean): void;
308
+ filterColumnByValue(columnIndex: number, value: unknown): void;
309
+ filterColumnByValues(columnIndex: number, values: readonly unknown[]): void;
310
+ clearFilters(): void;
311
+ getFilteredRowIndices(): readonly number[];
312
+ setRowKeyFunction(keyFunction: (rowData: unknown[], rowIndex: number) => string | number): void;
313
+ clearRowKeyFunction(): void;
314
+ hasRowKeyFunction(): boolean;
315
+ getRowByKey(key: string | number): unknown[] | undefined;
316
+ getRowIndexByKey(key: string | number): number | undefined;
317
+ updateRowByKey(key: string | number, rowData: readonly unknown[]): boolean;
318
+ removeRowByKey(key: string | number): boolean;
319
+ hasRowWithKey(key: string | number): boolean;
320
+ getRowKey(rowIndex: number): string | number | undefined;
321
+ getAllRowKeys(): readonly (string | number)[];
322
+ setColumnDefinition(columnIndex: number, definition: ColumnDefinition): void;
323
+ setColumnDefinitions(definitions: readonly (ColumnDefinition | undefined)[]): void;
324
+ clearColumnDefinition(columnIndex: number): void;
325
+ clearColumnDefinitions(): void;
326
+ getColumnDefinition(columnIndex: number): ColumnDefinition | undefined;
327
+ hasColumnDefinition(columnIndex: number): boolean;
328
+ getParsedCell(rowIndex: number, columnIndex: number): unknown;
329
+ getParsedRowData(rowIndex: number): unknown[];
330
+ getParsedColumnData(columnIndex: number): unknown[];
331
+ getParsedData(): unknown[][];
332
+ readonly dirtyState: Readonly<Ref<boolean>>;
333
+ markClean(): void;
334
+ markDirty(): void;
335
+ isDirty(): boolean;
336
+ hasChanges(): boolean;
337
+ getChangedCells(): readonly CellChange[];
338
+ getChangedRowIndices(): readonly number[];
339
+ getChangedColumnIndices(): readonly number[];
340
+ undo(): boolean;
341
+ redo(): boolean;
342
+ clearHistory(): void;
343
+ canUndo(): boolean;
344
+ canRedo(): boolean;
345
+ getUndoStackSize(): number;
346
+ getRedoStackSize(): number;
347
+ setHistoryLimit(limit: number): void;
348
+ getHistoryLimit(): number;
349
+ selectAllRows(): void;
350
+ deselectAllRows(): void;
351
+ selectRowRange(startIndex: number, endIndex: number): void;
352
+ invertRowSelection(): void;
353
+ getSelectedRowData(): readonly unknown[][];
354
+ getSelectedRowIndices(): readonly number[];
355
+ getSelectedCellIndices(): readonly CellPosition[];
356
+ readonly focusedCell: Readonly<Ref<CellPosition | null>>;
357
+ focusCell(rowIndex: number, columnIndex: number): void;
358
+ clearCellFocus(): void;
359
+ getFocusedCell(): CellPosition | null;
360
+ isCellFocused(rowIndex: number, columnIndex: number): boolean;
361
+ moveFocusUp(): boolean;
362
+ moveFocusDown(): boolean;
363
+ moveFocusLeft(): boolean;
364
+ moveFocusRight(): boolean;
365
+ moveFocusToFirstCell(): void;
366
+ moveFocusToLastCell(): void;
367
+ moveFocusToRowStart(): void;
368
+ moveFocusToRowEnd(): void;
369
+ enableKeyboardNavigation(): () => void;
370
+ readonly visibleColumnCount: Readonly<Ref<number>>;
371
+ hideColumn(columnIndex: number): void;
372
+ showColumn(columnIndex: number): void;
373
+ toggleColumnVisibility(columnIndex: number): void;
374
+ isColumnVisible(columnIndex: number): boolean;
375
+ getVisibleColumnIndices(): readonly number[];
376
+ getHiddenColumnIndices(): readonly number[];
377
+ moveRow(fromIndex: number, toIndex: number): void;
378
+ moveRowUp(rowIndex: number): boolean;
379
+ moveRowDown(rowIndex: number): boolean;
380
+ moveRowToTop(rowIndex: number): void;
381
+ moveRowToBottom(rowIndex: number): void;
382
+ swapRows(indexA: number, indexB: number): void;
383
+ moveColumn(fromIndex: number, toIndex: number): void;
384
+ moveColumnLeft(columnIndex: number): boolean;
385
+ moveColumnRight(columnIndex: number): boolean;
386
+ moveColumnToStart(columnIndex: number): void;
387
+ moveColumnToEnd(columnIndex: number): void;
388
+ swapColumns(indexA: number, indexB: number): void;
389
+ copySelectedCells(): string;
390
+ copySelectedRows(): string;
391
+ copyRow(rowIndex: number): string;
392
+ copyColumn(columnIndex: number): string;
393
+ copyCell(rowIndex: number, columnIndex: number): string;
394
+ copyCellRange(rowStart: number, columnStart: number, rowEnd: number, columnEnd: number): string;
395
+ pasteAtCell(rowIndex: number, columnIndex: number, data: string): void;
396
+ readonly expandedRows: Readonly<Ref<ReadonlySet<number>>>;
397
+ readonly pinnedTopRows: Readonly<Ref<readonly number[]>>;
398
+ readonly pinnedBottomRows: Readonly<Ref<readonly number[]>>;
399
+ expandRow(rowIndex: number): void;
400
+ collapseRow(rowIndex: number): void;
401
+ toggleRowExpansion(rowIndex: number): void;
402
+ expandAllRows(): void;
403
+ collapseAllRows(): void;
404
+ isRowExpanded(rowIndex: number): boolean;
405
+ getExpandedRowIndices(): readonly number[];
406
+ pinRowTop(rowIndex: number): void;
407
+ pinRowBottom(rowIndex: number): void;
408
+ unpinRow(rowIndex: number): void;
409
+ unpinAllRows(): void;
410
+ isRowPinnedTop(rowIndex: number): boolean;
411
+ isRowPinnedBottom(rowIndex: number): boolean;
412
+ getPinnedTopRowIndices(): readonly number[];
413
+ getPinnedBottomRowIndices(): readonly number[];
414
+ setCellMeta<T>(rowIndex: number, columnIndex: number, key: string, value: T): void;
415
+ getCellMeta<T>(rowIndex: number, columnIndex: number, key: string): T | undefined;
416
+ hasCellMeta(rowIndex: number, columnIndex: number, key: string): boolean;
417
+ clearCellMeta(rowIndex: number, columnIndex: number): void;
418
+ clearCellMetaKey(rowIndex: number, columnIndex: number, key: string): void;
419
+ setRowMeta<T>(rowIndex: number, key: string, value: T): void;
420
+ getRowMeta<T>(rowIndex: number, key: string): T | undefined;
421
+ hasRowMeta(rowIndex: number, key: string): boolean;
422
+ clearRowMeta(rowIndex: number): void;
423
+ clearRowMetaKey(rowIndex: number, key: string): void;
424
+ setColumnMeta<T>(columnIndex: number, key: string, value: T): void;
425
+ getColumnMeta<T>(columnIndex: number, key: string): T | undefined;
426
+ hasColumnMeta(columnIndex: number, key: string): boolean;
427
+ clearColumnMeta(columnIndex: number): void;
428
+ clearColumnMetaKey(columnIndex: number, key: string): void;
429
+ onRowAdd(callback: (rowData: unknown[], rowIndex: number) => void): () => void;
430
+ onRowRemove(callback: (rowData: unknown[], rowIndex: number) => void): () => void;
431
+ onRowUpdate(callback: (rowIndex: number, oldRowData: unknown[], newRowData: unknown[]) => void): () => void;
432
+ onCellChange(callback: (rowIndex: number, columnIndex: number, oldValue: unknown, newValue: unknown) => void): () => void;
433
+ onRowSelectionChange(callback: (selectedIndices: ReadonlySet<number>) => void): () => void;
434
+ onCellSelectionChange(callback: (selectedCells: ReadonlySet<string>) => void): () => void;
435
+ onSortChange(callback: (columnIndex: number | null, ascending: boolean) => void): () => void;
436
+ onFilterChange(callback: (filteredIndices: readonly number[]) => void): () => void;
437
+ onCellFocusChange(callback: (cell: CellPosition | null) => void): () => void;
438
+ onColumnVisibilityChange(callback: (columnIndex: number, visible: boolean) => void): () => void;
439
+ beginBatchUpdate(): void;
440
+ endBatchUpdate(): void;
441
+ cancelBatchUpdate(): void;
442
+ isBatchUpdating(): boolean;
443
+ batchUpdate(callback: () => void): void;
444
+ readonly tableLoading: Readonly<Ref<boolean>>;
445
+ setTableLoading(loading: boolean): void;
446
+ setCellLoading(rowIndex: number, columnIndex: number, loading: boolean): void;
447
+ setRowLoading(rowIndex: number, loading: boolean): void;
448
+ setColumnLoading(columnIndex: number, loading: boolean): void;
449
+ isTableLoading(): boolean;
450
+ isCellLoading(rowIndex: number, columnIndex: number): boolean;
451
+ isRowLoading(rowIndex: number): boolean;
452
+ isColumnLoading(columnIndex: number): boolean;
453
+ loadData(fetcher: () => Promise<readonly (readonly unknown[])[]>): Promise<void>;
454
+ appendRowsAsync(fetcher: () => Promise<readonly (readonly unknown[])[]>): Promise<void>;
455
+ prependRowsAsync(fetcher: () => Promise<readonly (readonly unknown[])[]>): Promise<void>;
456
+ readonly frozenLeftColumnCount: Readonly<Ref<number>>;
457
+ readonly frozenRightColumnCount: Readonly<Ref<number>>;
458
+ freezeColumnsLeft(count: number): void;
459
+ freezeColumnsRight(count: number): void;
460
+ unfreezeColumnsLeft(): void;
461
+ unfreezeColumnsRight(): void;
462
+ unfreezeAllColumns(): void;
463
+ getFrozenLeftColumnCount(): number;
464
+ getFrozenRightColumnCount(): number;
465
+ isColumnFrozenLeft(columnIndex: number): boolean;
466
+ isColumnFrozenRight(columnIndex: number): boolean;
467
+ hasFrozenColumns(): boolean;
468
+ }
469
+
470
+ /** Validation error. @public */
471
+ export declare interface ValidationError {
472
+ row: number;
473
+ column: number;
474
+ value: unknown;
475
+ message: string;
476
+ }
477
+
478
+ /** Validation result. @public */
479
+ export declare interface ValidationResult {
480
+ valid: boolean;
481
+ errors: ValidationError[];
482
+ }
483
+
484
+ /** Virtual scrolling configuration. @public */
485
+ export declare interface VirtualScrollConfig {
486
+ rowHeight: number;
487
+ overscan: number;
488
+ containerHeight: number;
489
+ }
490
+
491
+ /** Virtual scrolling state. @public */
492
+ export declare interface VirtualScrollState {
493
+ scrollTop: Ref<number>;
494
+ rowHeight: number;
495
+ overscan: number;
496
+ containerHeight: number;
497
+ visibleRows: Ref<number[]>;
498
+ startIndex: Ref<number>;
499
+ endIndex: Ref<number>;
500
+ scrollHandler?: () => void;
501
+ container?: HTMLElement;
502
+ }
503
+
504
+ export { }