@jayalfredprufrock/mobx-toolbox 0.7.1 → 0.8.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,619 @@
1
+ import { CSSProperties, FC, HTMLAttributes, ReactNode } from "react";
2
+
3
+ //#region src/table/table.types.d.ts
4
+ type RowData = Record<string, any>;
5
+ type TableData = RowData[];
6
+ type DotPath<T> = T extends object ? T extends Date | readonly unknown[] | ((...args: any) => any) ? never : { [K in keyof T & string]: K | `${K}.${DotPath<T[K]>}` }[keyof T & string] : never;
7
+ type ColumnDef<T> = DotPath<T> | FieldColumnDef<T> | ComputedColumnDef<T> | SelectionColumnDef;
8
+ type ColumnsDef<T> = (ColumnDef<T> | ((firstRow: T) => ColumnDef<T> | ColumnDef<T>[]))[];
9
+ type RowId = string | number;
10
+ interface TableConfig<T> {
11
+ rows?: T[];
12
+ /** Fixed pixel height of every row (the virtualization contract). Default 40. */
13
+ rowHeight?: number;
14
+ columns?: ColumnsDef<T>;
15
+ /**
16
+ * Height (px) of the detail panel below an expanded row. The binary-height contract: a row is
17
+ * `rowHeight` or `rowHeight + expansionHeight`, never measured — panel content taller than
18
+ * this scrolls internally (`<Table.Expansion>` owns that). Default 320.
19
+ */
20
+ expansionHeight?: number;
21
+ /** Whether expanding a row collapses all others. Default "multiple". */
22
+ expandMode?: "single" | "multiple";
23
+ /**
24
+ * How the sort list is applied. `"auto"` (default) sorts rows client-side through each
25
+ * column's value accessor / `compare`. `"manual"` treats `sorts` as pure reactive state and
26
+ * leaves row order untouched — react to `sorts`, refetch server-sorted rows, `setRows`. The
27
+ * sort state APIs (`setSort`, `clearSort`, `sortDirection`, `sortIndex`) behave identically
28
+ * in both modes, so header sort UIs need no changes.
29
+ */
30
+ sortMode?: "auto" | "manual";
31
+ /** Extra rows rendered above/below the visible window. Default 3. */
32
+ rowOverscan?: number;
33
+ /** Extra columns rendered on either side of the visible window. Default 1. */
34
+ columnOverscan?: number;
35
+ /**
36
+ * Stable row identity, used to key all row-scoped state (selection) and React row keys. Must be
37
+ * unique per row. Defaults to the row's index in the source array — stable across `appendRows`,
38
+ * reset (with the rest of row-keyed state) by `setRows`. Provide a business key when row objects
39
+ * may be replaced by fresh instances that mean the same row.
40
+ */
41
+ getRowId?: (row: T, index: number) => RowId;
42
+ /**
43
+ * Client-side row filtering. Pass anything exposing a reactive `predicate`; an array is
44
+ * AND-composed (a global search + a filter panel compose without knowing about each other).
45
+ * Filtering runs over `rows` without replacing them, so selection persists. Omit for
46
+ * server-side filtering — react to the source's serialized query and refetch instead.
47
+ */
48
+ filter?: FilterSource<T> | FilterSource<T>[];
49
+ /**
50
+ * Fires whenever persisted table state changes (see `getState`) — including as a result of
51
+ * `applyState`. The snapshot is JSON-serializable; debouncing/storage is the consumer's job.
52
+ */
53
+ onStateChange?: (state: TableState) => void;
54
+ }
55
+ /** Persisted per-column state (see TableState). `width` is the manual resize override; absent = automatic. */
56
+ interface ColumnState {
57
+ hidden: boolean;
58
+ pinned: false | "left" | "right";
59
+ width?: number;
60
+ }
61
+ /**
62
+ * JSON-serializable snapshot of the user-curated table arrangement: column order, per-column
63
+ * visibility/pinning/manual widths, and the sort list. Ephemeral state (selection, scroll) and
64
+ * anything owned elsewhere (filters) is deliberately excluded. Produced by `getState`, restored
65
+ * by `applyState`, observed by `onStateChange`.
66
+ */
67
+ interface TableState {
68
+ columnOrder: string[];
69
+ columns: Record<string, ColumnState>;
70
+ sorts: ColumnSort[];
71
+ }
72
+ /**
73
+ * The table's contract with any filter implementation: a reactive predicate over rows. Deliberately
74
+ * structural so the table takes on no dependency — a hand-rolled observable object satisfies it.
75
+ * `undefined` predicate = pass-through (no filtering).
76
+ */
77
+ interface FilterSource<T = RowData> {
78
+ readonly predicate?: (row: T) => boolean;
79
+ }
80
+ interface ColumnConfig {
81
+ key: string;
82
+ /** Raw cell value — feeds sorting and the default render. Resolved dot-path for field columns, the `value` fn for computed ones. */
83
+ value: (row: RowData) => unknown;
84
+ render: (row: RowData) => any;
85
+ /** Sort comparator over extracted values. Omitted = default (numeric / chronological / locale string). */
86
+ compare?: (a: any, b: any) => number;
87
+ title?: string;
88
+ pinned?: false | "left" | "right";
89
+ width?: ColumnWidth;
90
+ minWidth?: number;
91
+ maxWidth?: number;
92
+ resizable?: boolean;
93
+ /** See BaseColumnDef.sortable — advisory flag for header sort UIs. Defaults to true. */
94
+ sortable?: boolean;
95
+ /** Marks the built-in row-selection column (rendered via `<Table.SelectionCell>`). */
96
+ selection?: boolean;
97
+ }
98
+ type ColumnWidth = number | `${number}fr`;
99
+ type SortDirection = "asc" | "desc";
100
+ /** One entry in the table's sort priority list. */
101
+ interface ColumnSort {
102
+ key: string;
103
+ direction: SortDirection;
104
+ }
105
+ interface BaseColumnDef<T> {
106
+ title?: string;
107
+ render?: (row: T) => any;
108
+ /**
109
+ * Custom sort comparator. Receives the two rows' *extracted* values (the dot-path lookup for
110
+ * field columns, the `value` fn's result for computed ones), not the rows. Return negative /
111
+ * zero / positive as usual; the table handles direction. Defaults to numbers numerically,
112
+ * Dates chronologically, everything else by locale string, nullish first.
113
+ */
114
+ compare?: (a: any, b: any) => number;
115
+ /** Initial pin side; can also be changed at runtime via ColumnModel.setPinned. */
116
+ pinned?: false | "left" | "right";
117
+ /** Fixed pixel width (`number`) or a flex weight (`"Nfr"`). Defaults to `"1fr"`. */
118
+ width?: ColumnWidth;
119
+ /** Minimum width for flex columns (px). Defaults to 120. Ignored for fixed-px columns. */
120
+ minWidth?: number;
121
+ /** Maximum width for flex columns (px). Ignored for fixed-px columns. */
122
+ maxWidth?: number;
123
+ /** Whether the column can be resized by dragging its header edge. Defaults to true. */
124
+ resizable?: boolean;
125
+ /**
126
+ * Whether the column participates in sorting. Defaults to true. Advisory for header UIs
127
+ * (hide the sort controls); the model's sort APIs are not gated, so programmatic
128
+ * `setSort`/`applyState` still work.
129
+ */
130
+ sortable?: boolean;
131
+ }
132
+ interface FieldColumnDef<T> extends BaseColumnDef<T> {
133
+ key: DotPath<T>;
134
+ value?: never;
135
+ }
136
+ interface ComputedColumnDef<T> extends BaseColumnDef<T> {
137
+ key: string & Record<never, never>;
138
+ value: (row: T) => any;
139
+ }
140
+ /**
141
+ * The built-in row-selection column. Rendered by `<Table.SelectionCell>` (body) and
142
+ * `<Table.SelectionHeaderCell>` (header), so it needs no `render`/`value`. `key` is optional —
143
+ * the table assigns one when omitted.
144
+ */
145
+ interface SelectionColumnDef {
146
+ selection: true;
147
+ key?: string;
148
+ pinned?: false | "left" | "right";
149
+ width?: ColumnWidth;
150
+ minWidth?: number;
151
+ maxWidth?: number;
152
+ resizable?: boolean;
153
+ }
154
+ //#endregion
155
+ //#region src/table/table.model.d.ts
156
+ declare class TableModel {
157
+ readonly config?: TableConfig<any>;
158
+ rows: RowData[];
159
+ columns: Map<string, ColumnModel>;
160
+ columnOrder: string[];
161
+ filterSources: FilterSource[];
162
+ scrollX: number;
163
+ scrollY: number;
164
+ height: number;
165
+ width: number;
166
+ sorts: ColumnSort[];
167
+ selectedIds: Set<RowId>;
168
+ expandedIds: Set<RowId>;
169
+ scrollRequest: {
170
+ y: number | "end";
171
+ } | undefined;
172
+ private appliedState;
173
+ private stateReactionDisposer;
174
+ get rowHeight(): number;
175
+ get rowOverscan(): number;
176
+ get expansionHeight(): number;
177
+ get columnOverscan(): number;
178
+ get rowIds(): Map<RowData, RowId>;
179
+ get allColumns(): ColumnModel[];
180
+ get orderedColumns(): ColumnModel[];
181
+ /**
182
+ * Resolved pixel width for every column, distributed across the viewport (`width`).
183
+ * Fixed columns (explicit px or a manual override) claim their width; the rest are flex
184
+ * (`"Nfr"`, default `1fr`) and share the remaining space by weight, clamped to
185
+ * [minWidth, maxWidth] via a freeze-redistribute pass (a column that hits a clamp is frozen
186
+ * and its share is re-split among the others). Any leftover slack — every flex column capped
187
+ * at its max — is absorbed by the last column so the columns always fill the viewport (this
188
+ * also soaks up sub-pixel rounding). When the minimums don't fit, the total exceeds the
189
+ * viewport and the table scrolls horizontally.
190
+ */
191
+ get columnWidths(): Map<ColumnModel, number>;
192
+ get virtualWidth(): number;
193
+ get virtualHeight(): number;
194
+ get expandedDisplayIndices(): number[];
195
+ get unpinnedColumns(): ColumnModel[];
196
+ get firstUnpinnedRenderedIndex(): number;
197
+ get lastUnpinnedRenderedIndex(): number;
198
+ get unpinnedRenderedColumns(): ColumnModel[];
199
+ get leftPinnedRenderedColumns(): ColumnModel[];
200
+ get rightPinnedRenderedColumns(): ColumnModel[];
201
+ get filteredRows(): RowData[];
202
+ get displayRows(): RowData[];
203
+ get firstRenderedIndex(): number;
204
+ get lastRenderedIndex(): number;
205
+ get renderedRows(): RowData[];
206
+ get virtualOffsetX(): number;
207
+ get virtualOffsetY(): number;
208
+ get renderedColumns(): ColumnModel[];
209
+ get visualColumns(): ColumnModel[];
210
+ get displayRowIndexMap(): Map<RowData, number>;
211
+ /** Whether the table has a selection column (drives aria-multiselectable / aria-selected). */
212
+ get selectable(): boolean;
213
+ get gridTemplateColumns(): string;
214
+ /** Whether the viewport is scrolled to (within one row of) the end of the content. */
215
+ get atEnd(): boolean;
216
+ /** The selected row objects, in source order. Derived from `selectedIds`, so ids without a
217
+ * matching row (possible only if a consumer mutates `selectedIds` directly) drop out. */
218
+ get selectedRows(): RowData[];
219
+ get allRowsSelected(): boolean;
220
+ get someRowsSelected(): boolean;
221
+ constructor(config?: TableConfig<any>);
222
+ /**
223
+ * (Re)start the `onStateChange` reaction. Pairs with `dispose` — `useTable` calls both across
224
+ * effect cycles, so a StrictMode dev remount (mount → cleanup → mount against the same model)
225
+ * re-arms the reaction instead of leaving the surviving model deaf. No-op when already active
226
+ * or when the config has no `onStateChange`.
227
+ */
228
+ activate(): void;
229
+ /** Drop the `onStateChange` reaction. Pairs with `activate`. */
230
+ dispose(): void;
231
+ rowId(row: RowData): RowId | undefined;
232
+ /** Snapshot of the user-curated arrangement (see `TableState`). JSON-serializable. */
233
+ getState(): TableState;
234
+ /**
235
+ * Restore a (possibly partial) snapshot. Keys with no matching column are kept aside and land
236
+ * when a matching column appears (see `appliedState`); columns the snapshot doesn't mention are
237
+ * left as they are, ordered after the snapshot's columns.
238
+ */
239
+ applyState(state: Partial<TableState>): void;
240
+ /** Replace the client-side filter source(s). Pass `undefined` to clear. */
241
+ setFilter(filter: FilterSource | FilterSource[] | undefined): void;
242
+ /** Move a column to a new index in the display order. */
243
+ moveColumn(key: string, toIndex: number): void;
244
+ /** Replace the dataset. Row-keyed state (selection, expansion) is reset — ids from the old world
245
+ * (indices by default) must not silently attach to new rows. Use `appendRows` to add without resetting. */
246
+ setRows(rows: RowData[]): void;
247
+ /** Append rows without resetting row-keyed state — the "load more" path. Existing rows keep
248
+ * their positions, so default (index) ids stay stable and selection survives. */
249
+ appendRows(rows: RowData[]): void;
250
+ setScroll(x: number, y: number): void;
251
+ /** Content offset of a display index's block top (row plus any expansion panels above it). */
252
+ blockOffset(index: number): number;
253
+ /** Scroll so the row's block top lands at the viewport top, or its block end at the bottom. */
254
+ scrollToRow(row: RowData, align?: "top" | "bottom"): void;
255
+ /** Scroll to the very end of the content. */
256
+ scrollToEnd(): void;
257
+ clearScrollRequest(): void;
258
+ setWidth(width: number): void;
259
+ setHeight(height: number): void;
260
+ /**
261
+ * Set a column's sort. By default the whole sort list is replaced (single-sort behavior).
262
+ * With `preserve: true` existing sorts are kept: a column already in the list changes
263
+ * direction in place (keeping its priority), a new column is appended at the lowest priority.
264
+ */
265
+ setSort(key: string, direction: SortDirection, opts?: {
266
+ preserve?: boolean;
267
+ }): void;
268
+ /** Replace the whole sort list at once (restoring a saved view); `setSort` covers per-column interactions. */
269
+ setSorts(sorts: ColumnSort[]): void;
270
+ /** Remove one column from the sort (later entries move up in priority), or all sorts when no key is given. */
271
+ clearSort(key?: string): void;
272
+ isRowSelected(row: RowData): boolean;
273
+ toggleRow(row: RowData): void;
274
+ selectAllRows(): void;
275
+ clearSelection(): void;
276
+ toggleAllRows(): void;
277
+ isRowExpanded(row: RowData): boolean;
278
+ toggleRowExpanded(row: RowData): void;
279
+ collapseAllRows(): void;
280
+ private syncColumns;
281
+ private applyColumnState;
282
+ private mergedOrder;
283
+ private expandedAbove;
284
+ /**
285
+ * The display index of the row whose block (row + its expansion panel, if any) contains the
286
+ * vertical content offset `y`. Walks the expanded indices accumulating their extra height —
287
+ * a row scrolled past its own top stays "at" `y` while its panel is in view, so expanded rows
288
+ * render as long as any part of their block does.
289
+ */
290
+ private indexAtOffset;
291
+ }
292
+ //#endregion
293
+ //#region src/table/column.model.d.ts
294
+ /** Key assigned to a selection column when its def doesn't supply one. */
295
+ declare const SELECTION_COLUMN_KEY = "__selection__";
296
+ declare class ColumnModel {
297
+ readonly table: TableModel;
298
+ readonly config: ColumnConfig;
299
+ pinned: ColumnConfig["pinned"];
300
+ hidden: boolean;
301
+ manualWidth: number | undefined;
302
+ /** Resolved pixel width — distributed across the viewport by the table (see `columnWidths`). */
303
+ get width(): number;
304
+ /** Fixed pixel width when the column isn't flexible (manual override or an explicit number). */
305
+ get fixedWidth(): number | undefined;
306
+ /** Flex weight (the `N` in `"Nfr"`); `0` when fixed. An unspecified width means `1fr`. */
307
+ get grow(): number;
308
+ get minWidth(): number;
309
+ get maxWidth(): number;
310
+ get resizable(): boolean;
311
+ /** Whether header UIs should offer sorting on this column (selection columns never do). */
312
+ get sortable(): boolean;
313
+ /** Whether this is the built-in row-selection column. */
314
+ get selection(): boolean;
315
+ /**
316
+ * True for the innermost pinned column on its side (the one bordering the scrollable area).
317
+ * Consumers hang the pinned boundary shadow off `[data-pinned-edge]` so a group of pinned
318
+ * columns shows a single shadow at the seam.
319
+ */
320
+ get isPinnedEdge(): boolean;
321
+ /**
322
+ * True for the outermost pinned column on its side (the one at the viewport edge). Used by the
323
+ * header to round its outer corners so a pinned column doesn't paint a square over the rounded
324
+ * header background. Both rendered pinned arrays are ordered outer-edge-first.
325
+ */
326
+ get isPinnedOuterEdge(): boolean;
327
+ get offset(): number;
328
+ get title(): string;
329
+ /** 1-based visual column position (pinned blocks at the edges) — the aria-colindex value. */
330
+ get ariaColIndex(): number;
331
+ get key(): string;
332
+ /** Active sort direction for this column, or undefined when it doesn't participate in the sort. */
333
+ get sortDirection(): SortDirection | undefined;
334
+ /** 1-based position in the sort priority (the "1"/"2" badge in multi-sort UIs); undefined when unsorted. */
335
+ get sortIndex(): number | undefined;
336
+ private get pinnedSiblings();
337
+ constructor(table: TableModel, config: ColumnConfig);
338
+ setPinned(pinned: ColumnConfig["pinned"]): void;
339
+ setManualWidth(width: number | undefined): void;
340
+ setHidden(hidden: boolean): void;
341
+ /** Sort by this column — replaces the sort list unless `preserve: true` (see TableModel.setSort). */
342
+ sortBy(direction: SortDirection, opts?: {
343
+ preserve?: boolean;
344
+ }): void;
345
+ /** Remove this column from the sort; other columns' sorts are untouched. */
346
+ clearSort(): void;
347
+ /** Raw cell value for a row — what sorting compares and the default render displays. */
348
+ getValue(row: RowData): unknown;
349
+ /** Ascending comparison of two rows by this column's extracted values (`compare` def or the default). */
350
+ compareRows(a: RowData, b: RowData): number;
351
+ static fromDef(table: TableModel, def: ColumnDef<any>): ColumnModel;
352
+ }
353
+ //#endregion
354
+ //#region src/table/components/cell-slot.d.ts
355
+ type RenderColumn = (column: ColumnModel) => ReactNode;
356
+ /**
357
+ * Per-cell reactive boundary. `Table.Header`/`Table.Row` iterate the rendered columns and hand each
358
+ * off to a `CellSlot` rather than calling the consumer's render function inline — so the render runs
359
+ * inside *this* component's MobX reaction. The upshot: a cell re-renders only when the observables
360
+ * *it* reads change (e.g. one field of one row), never because a sibling cell or the row did.
361
+ *
362
+ * It renders a transparent fragment, so whatever the consumer returns (a `<Table.Cell>`) lands
363
+ * directly in the parent grid with no wrapper element.
364
+ */
365
+ declare const CellSlot: import("react").FunctionComponent<{
366
+ column: ColumnModel;
367
+ render: RenderColumn;
368
+ }>;
369
+ //#endregion
370
+ //#region src/table/components/cell-style.d.ts
371
+ /**
372
+ * Structural style shared by header and body cells: pinned cells stick to their edge at the
373
+ * column's offset and must be opaque (they overlap scrolling cells). The opaque fill is a CSS var
374
+ * so the consumer owns the color — set `--table-pinned-bg` once (and override it inside the header
375
+ * to match a header background). `Canvas` is a theme-aware system default for zero-config use.
376
+ *
377
+ * These are the *only* styles the library forces on a cell; everything cosmetic (padding, font,
378
+ * borders, hover) is left to the consumer's `className`/`style`.
379
+ */
380
+ declare const pinnedCellStyle: (column: ColumnModel) => CSSProperties;
381
+ //#endregion
382
+ //#region src/table/components/checkbox.d.ts
383
+ /**
384
+ * Props a selection-control component receives. Kept intentionally minimal so any checkbox — the
385
+ * native input below, a Chakra `Checkbox`, a Tailwind one — can satisfy it.
386
+ */
387
+ interface TableCheckboxProps {
388
+ checked: boolean;
389
+ indeterminate?: boolean;
390
+ onChange: () => void;
391
+ "aria-label"?: string;
392
+ }
393
+ /**
394
+ * Zero-config fallback used by `<Table.SelectionCell>` / `<Table.SelectAll>` when the consumer
395
+ * neither registers a `checkbox` on `<Table.Root>` nor passes a render-prop. `indeterminate` is a
396
+ * DOM-only property, so it's applied via ref rather than an attribute.
397
+ */
398
+ declare const NativeCheckbox: FC<TableCheckboxProps>;
399
+ //#endregion
400
+ //#region src/table/components/column-resizer.d.ts
401
+ interface TableResizerProps {
402
+ column: ColumnModel;
403
+ }
404
+ /**
405
+ * Drag handle on a header cell's edge that resizes its column. Dragging sets the column's
406
+ * `manualWidth` (treated as a fixed width in the distribution, so the remaining flex columns reflow
407
+ * to fill); double-click resets it to auto. Right-pinned columns are anchored to the right, so their
408
+ * handle sits on the left edge and the drag delta is inverted.
409
+ *
410
+ * Move/up listeners live on the window for the duration of the drag, so the resize tracks and ends
411
+ * wherever the pointer is released — not only over the handle.
412
+ */
413
+ declare const TableResizer: FC<TableResizerProps>;
414
+ //#endregion
415
+ //#region src/table/components/table-root.d.ts
416
+ interface TableRootProps {
417
+ table: TableModel;
418
+ children?: React.ReactNode;
419
+ style?: React.CSSProperties;
420
+ className?: string;
421
+ /**
422
+ * Selection control used by `<Table.SelectionCell>` / `<Table.SelectAll>` when no render-prop is
423
+ * given. Register it once here to capture your app's checkbox everywhere. Defaults to a native
424
+ * `<input type="checkbox">`.
425
+ */
426
+ checkbox?: FC<TableCheckboxProps>;
427
+ }
428
+ /**
429
+ * The table skeleton: a non-scrolling viewport wrapper (owns measured size + the shared
430
+ * `--table-row-height` var) around the scroll container that everything else renders into. This is
431
+ * the only structural piece consumers mount directly; header/body compose inside it.
432
+ */
433
+ declare const TableRoot: FC<TableRootProps>;
434
+ //#endregion
435
+ //#region src/table/components/table-header.d.ts
436
+ interface TableHeaderProps {
437
+ className?: string;
438
+ style?: CSSProperties;
439
+ /**
440
+ * Renders one header cell. Called once per *rendered* column (the library owns which columns are
441
+ * live, their order, and the virtualization spacer); return a `<Table.ColumnHeader>` /
442
+ * `<Table.SelectionHeaderCell>`.
443
+ */
444
+ children: RenderColumn;
445
+ }
446
+ /**
447
+ * The sticky header row group. Owns layout — the grid track template, the left-pinned / spacer /
448
+ * unpinned / right-pinned ordering — and defers each cell's content to the `children` render-prop
449
+ * via a per-cell `CellSlot`.
450
+ */
451
+ declare const TableHeader: FC<TableHeaderProps>;
452
+ interface TableColumnHeaderProps extends HTMLAttributes<HTMLDivElement> {
453
+ column: ColumnModel;
454
+ }
455
+ /**
456
+ * A single header cell. Owns the structural bits (sticky pinning, offset, `data-pinned*`) and stays
457
+ * cosmetically open — the consumer's `className`/`style` add padding, font, borders, etc.; other
458
+ * DOM props pass through.
459
+ */
460
+ declare const TableColumnHeader: FC<TableColumnHeaderProps>;
461
+ //#endregion
462
+ //#region src/table/components/table-body.d.ts
463
+ interface TableBodyProps {
464
+ className?: string;
465
+ style?: CSSProperties;
466
+ /** Renders one row. Called once per *rendered* row; return a `<Table.Row>`. */
467
+ children: (row: RowData) => ReactNode;
468
+ }
469
+ /**
470
+ * The virtualized body. Owns the scroll-sized spacer and the `translate3d` window offset, then maps
471
+ * the rendered slice of rows through the `children` render-prop. Rows are keyed by their row id
472
+ * (see `rowIds`): by default the original index in the source array — stable under sort/filter/
473
+ * scroll and across `appendRows` — or the consumer's `getRowId`, which stays stable even when a
474
+ * refetch replaces the row objects.
475
+ */
476
+ declare const TableBody: FC<TableBodyProps>;
477
+ interface TableRowProps extends Omit<HTMLAttributes<HTMLDivElement>, "children"> {
478
+ row: RowData;
479
+ /** Renders one body cell. Called once per rendered column; return a `<Table.Cell>` / `<Table.SelectionCell>`. */
480
+ children: RenderColumn;
481
+ }
482
+ /**
483
+ * Memoized on identity so scrolling (and filtering) only renders rows that actually entered/changed.
484
+ * `children` (the per-column render-prop) gets a fresh closure on every `TableBody` render, so it is
485
+ * *deliberately excluded* from the comparison — for a row still in the window that closure is
486
+ * equivalent (it closes over the same `row` and reads row/column state live). Every other prop —
487
+ * including pass-through DOM props like `onClick` — is compared shallowly. Layout changes still
488
+ * flow through because the inner `observer` re-renders on the column/width observables it reads, and
489
+ * per-cell data changes flow through each `CellSlot`'s own observer — neither is gated by this memo.
490
+ * (Pass stable `className`/`style`/handlers, not fresh inline values, or the row re-renders every frame.)
491
+ */
492
+ declare const TableRow: import("react").NamedExoticComponent<TableRowProps>;
493
+ interface TableCellProps extends HTMLAttributes<HTMLDivElement> {
494
+ column: ColumnModel;
495
+ }
496
+ /**
497
+ * A single body cell. Owns pinning/offset/`data-pinned*`; cosmetics are the consumer's via
498
+ * `className`/`style`, other DOM props pass through.
499
+ */
500
+ declare const TableCell: FC<TableCellProps>;
501
+ //#endregion
502
+ //#region src/table/components/table-empty.d.ts
503
+ type TableEmptyProps = HTMLAttributes<HTMLDivElement>;
504
+ /**
505
+ * The empty-state surface. Render it after `<Table.Body>`, gated by the consumer — e.g.
506
+ * `table.displayRows.length === 0 && <Table.Empty>…</Table.Empty>` — the library never decides
507
+ * what "empty" means or what to say about it (no rows vs. filtered-out are different stories,
508
+ * and only the consumer knows the words and recovery actions).
509
+ *
510
+ * Owns placement only: fills the viewport below the sticky header (subtracting the theme-owned
511
+ * header vars, falling back to the row height) and pins horizontally like the header pill, so
512
+ * children center in the visible area at any horizontal scroll offset. Cosmetics are the
513
+ * consumer's; `data-empty` is the styling hook.
514
+ */
515
+ declare const TableEmpty: FC<TableEmptyProps>;
516
+ //#endregion
517
+ //#region src/table/components/table-expansion.d.ts
518
+ interface TableExpansionProps {
519
+ row: RowData;
520
+ className?: string;
521
+ style?: CSSProperties;
522
+ children?: ReactNode;
523
+ }
524
+ /**
525
+ * Memoized on row identity like `TableRow`, with `children` deliberately excluded: the panel's
526
+ * element tree is rebuilt by the body render-prop every window shift, but for the same row it is
527
+ * equivalent. Panel content must derive from `row` (or be an observer reading live state) — not
528
+ * from other values captured in the render-prop closure.
529
+ */
530
+ declare const TableExpansion: import("react").NamedExoticComponent<TableExpansionProps>;
531
+ //#endregion
532
+ //#region src/table/components/selection.d.ts
533
+ type RowSelectState = Pick<TableCheckboxProps, "checked" | "onChange">;
534
+ type SelectAllState = Pick<TableCheckboxProps, "checked" | "indeterminate" | "onChange">;
535
+ interface SelectionCellProps {
536
+ column: ColumnModel;
537
+ row: RowData;
538
+ /** Custom control. Omit to use the checkbox registered on `<Table.Root>` (native by default). */
539
+ children?: (state: RowSelectState) => ReactNode;
540
+ }
541
+ /** A body cell wired to per-row selection. Renders the registered checkbox unless given a render-prop. */
542
+ declare const SelectionCell: FC<SelectionCellProps>;
543
+ interface SelectAllProps {
544
+ /** Custom control. Omit to use the checkbox registered on `<Table.Root>` (native by default). */
545
+ children?: (state: SelectAllState) => ReactNode;
546
+ }
547
+ /** The select-all control (checked / indeterminate / none). Place inside a header cell, or use `<Table.SelectionHeaderCell>`. */
548
+ declare const SelectAll: FC<SelectAllProps>;
549
+ interface SelectionHeaderCellProps {
550
+ column: ColumnModel;
551
+ children?: (state: SelectAllState) => ReactNode;
552
+ }
553
+ /** A header cell holding the centered select-all control — the header twin of `<Table.SelectionCell>`. */
554
+ declare const SelectionHeaderCell: FC<SelectionHeaderCellProps>;
555
+ //#endregion
556
+ //#region src/table/components/namespace.d.ts
557
+ /**
558
+ * Compound namespace for the table skeleton. Consumers compose these into their own closed
559
+ * component (styles + defaults captured once), e.g. `<Table.Root><Table.Header>…`.
560
+ */
561
+ declare const Table: {
562
+ Root: import("react").FC<TableRootProps>;
563
+ Header: import("react").FC<TableHeaderProps>;
564
+ ColumnHeader: import("react").FC<TableColumnHeaderProps>;
565
+ Body: import("react").FC<TableBodyProps>;
566
+ Row: import("react").NamedExoticComponent<TableRowProps>;
567
+ Cell: import("react").FC<TableCellProps>;
568
+ Empty: import("react").FC<TableEmptyProps>;
569
+ Expansion: import("react").NamedExoticComponent<TableExpansionProps>;
570
+ Resizer: import("react").FC<TableResizerProps>;
571
+ SelectionCell: import("react").FC<SelectionCellProps>;
572
+ SelectionHeaderCell: import("react").FC<SelectionHeaderCellProps>;
573
+ SelectAll: import("react").FC<SelectAllProps>;
574
+ };
575
+ //#endregion
576
+ //#region src/table/table.context.d.ts
577
+ declare const tableContext: import("react").Context<TableModel | undefined>;
578
+ declare const useTableContext: () => TableModel;
579
+ declare const TableProvider: import("react").Provider<TableModel | undefined>;
580
+ /**
581
+ * Slots let a consumer register defaults once on `<Table.Root>` (currently just the selection
582
+ * `checkbox`) that the built-in parts fall back to. Defaults to a native checkbox so selection
583
+ * works with zero wiring.
584
+ */
585
+ interface TableSlots {
586
+ checkbox: FC<TableCheckboxProps>;
587
+ }
588
+ declare const slotsContext: import("react").Context<TableSlots>;
589
+ declare const TableSlotsProvider: import("react").Provider<TableSlots>;
590
+ declare const useTableSlots: () => TableSlots;
591
+ //#endregion
592
+ //#region src/table/use-scroll.d.ts
593
+ /**
594
+ * Reports a scroll container's offsets on every scroll event.
595
+ *
596
+ * `onScroll` is read through a ref so an inline arrow doesn't re-subscribe on every render — the
597
+ * table's root re-renders as the window shifts, and re-attaching the listener each time would be
598
+ * pure waste.
599
+ */
600
+ declare const useScroll: (ref: React.RefObject<HTMLElement | null>, onScroll: (x: number, y: number) => void) => void;
601
+ //#endregion
602
+ //#region src/table/use-table.d.ts
603
+ declare const useTable: <T>(config?: TableConfig<T>) => TableModel;
604
+ //#endregion
605
+ //#region src/table/util.d.ts
606
+ declare const titleCase: (str: string) => string;
607
+ /**
608
+ * Resolve a column key against a row: a direct property hit wins (so a literal "a.b" property
609
+ * still works), otherwise the key is walked as a dot-path ("owner.name").
610
+ */
611
+ declare const getPath: (obj: unknown, path: string) => unknown;
612
+ /**
613
+ * Default sort comparator over extracted cell values — nullish first, numbers numerically, Dates
614
+ * chronologically, everything else by locale string.
615
+ */
616
+ declare const compareValues: (a: unknown, b: unknown) => number;
617
+ //#endregion
618
+ export { BaseColumnDef, CellSlot, ColumnConfig, ColumnDef, ColumnModel, ColumnSort, ColumnState, ColumnWidth, ColumnsDef, ComputedColumnDef, DotPath, FieldColumnDef, FilterSource, NativeCheckbox, RenderColumn, RowData, RowId, SELECTION_COLUMN_KEY, SelectAll, SelectAllProps, SelectionCell, SelectionCellProps, SelectionColumnDef, SelectionHeaderCell, SelectionHeaderCellProps, SortDirection, Table, TableBody, TableBodyProps, TableCell, TableCellProps, TableCheckboxProps, TableColumnHeader, TableColumnHeaderProps, TableConfig, TableData, TableEmpty, TableEmptyProps, TableExpansion, TableExpansionProps, TableHeader, TableHeaderProps, TableModel, TableProvider, TableResizer, TableResizerProps, TableRoot, TableRootProps, TableRow, TableRowProps, TableSlots, TableSlotsProvider, TableState, compareValues, getPath, pinnedCellStyle, slotsContext, tableContext, titleCase, useScroll, useTable, useTableContext, useTableSlots };
619
+ //# sourceMappingURL=table.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.d.mts","names":[],"sources":["../src/table/table.types.ts","../src/table/table.model.ts","../src/table/column.model.ts","../src/table/components/cell-slot.tsx","../src/table/components/cell-style.ts","../src/table/components/checkbox.tsx","../src/table/components/column-resizer.tsx","../src/table/components/table-root.tsx","../src/table/components/table-header.tsx","../src/table/components/table-body.tsx","../src/table/components/table-empty.tsx","../src/table/components/table-expansion.tsx","../src/table/components/selection.tsx","../src/table/components/namespace.tsx","../src/table/table.context.ts","../src/table/use-scroll.ts","../src/table/use-table.ts","../src/table/util.ts"],"mappings":"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"}