@varialkit/table 0.1.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.
package/docs.md ADDED
@@ -0,0 +1,617 @@
1
+ # Table
2
+
3
+ `Table` is Solara's presentation wrapper around TanStack Table.
4
+
5
+ - TanStack owns data modeling and feature logic.
6
+ - Solara owns list/grid rendering, menu UX, and style tokens.
7
+
8
+ The goal is a stable Solara API that can express both classic table views and card-grid views without forking data logic.
9
+ - We want a Solara-first API for visuals, sizing, and behaviors that stays consistent across apps.
10
+ - We still want TanStack's core logic (sorting, filtering, pinning, virtual-friendly row models) for performance and
11
+ correctness.
12
+ - We need an escape hatch so we can layer custom behavior now and incrementally replace TanStack pieces later if needed.
13
+
14
+ **Long-term strategy:**
15
+
16
+ - TanStack stays as the default engine for table state and row models.
17
+ - Solara owns rendering, styling, and extension points.
18
+ - We expose hooks (`renderBody`, `renderRow`, `renderCell`, `tableOptions`) so we can add custom logic without API churn.
19
+ - If we ever replace TanStack, we keep the same Solara API surface and swap the engine behind it.
20
+
21
+ ## Architecture Notes
22
+
23
+ - `Table` is intentionally thin: it composes TanStack row models and renders standard HTML tables.
24
+ - Custom behavior should sit in `tableOptions` (state + features) or in render overrides.
25
+ - Header actions are rendered as a dedicated `<th>` so they remain aligned with header rows and stay in the tab order.
26
+ - The built-in column manager uses TanStack column visibility + column order state under the hood.
27
+
28
+ ## Quick Start
29
+
30
+ ```tsx
31
+ import { Table } from "@solara/table";
32
+ import { createColumnHelper } from "@tanstack/react-table";
33
+
34
+ type Person = {
35
+ avatar: string;
36
+ name: string;
37
+ role: string;
38
+ status: string;
39
+ lastActive: string;
40
+ };
41
+
42
+ const helper = createColumnHelper<Person>();
43
+
44
+ const columns = [
45
+ helper.accessor("name", { header: "Name" }),
46
+ helper.accessor("role", { header: "Role" }),
47
+ helper.accessor("status", { header: "Status" }),
48
+ helper.accessor("lastActive", { header: "Last Active" }),
49
+ ];
50
+
51
+ <Table data={data} columns={columns} enableSorting enableColumnControls />;
52
+ ```
53
+
54
+ ## Basic Usage
55
+
56
+ The default usage pattern is still a list table powered by TanStack models.
57
+
58
+ ```tsx
59
+ export function Example() {
60
+ return <Table data={data} columns={columns} enableSorting />;
61
+ }
62
+ ```
63
+
64
+ ## Example Index
65
+
66
+ All examples live in [examples.tsx](/Users/craigaucutt/repo/solara/packages/core/components/table/examples.tsx).
67
+
68
+ - `Playground`: base props, density, list/grid switching
69
+ - `Grid Default`: image-first grid with hidden-by-default detail fields
70
+ - `Grid Masonry`: same card model with masonry flow + granular spacing
71
+ - `List Only Layout`: list surfaces that intentionally do not expose grid mode
72
+ - `Overview`: standard list with built-in controls
73
+ - `Sticky Header`: sticky list header behavior
74
+ - `Pinned Columns`: TanStack pinning + sticky/pinning styles
75
+ - `Pagination`: TanStack pagination state wiring
76
+ - `Pagination Controls`: built-in Solara pagination footer (`showPagination`)
77
+ - `Virtualized Rows`: list virtualization via `renderBody`
78
+ - `Expandable Rows`: TanStack expanding rows
79
+ - `Selectable Rows`: TanStack selection rows
80
+ - `Large Data Performance`: loading + pagination guardrails
81
+
82
+ ## Architecture
83
+
84
+ Think in 3 layers:
85
+
86
+ 1. Data layer (TanStack)
87
+ 2. Mode layer (`layoutMode`)
88
+ 3. Presentation layer (Solara)
89
+
90
+ ### 1) Data Layer
91
+
92
+ Inputs:
93
+
94
+ - `data`
95
+ - `columns`
96
+ - `tableOptions`
97
+
98
+ TanStack owns:
99
+
100
+ - row model (`table.getRowModel().rows`)
101
+ - sorting/filtering/pagination
102
+ - base column visibility and ordering
103
+ - pinning state
104
+
105
+ ### 2) Mode Layer
106
+
107
+ `layoutMode` controls presentation only:
108
+
109
+ - `list` (default): semantic `<table>`
110
+ - `grid`: card layout
111
+
112
+ Both modes read from the same TanStack rows/cells.
113
+ If you want list-only surfaces, pass `layoutModeOptions={["list"]}`.
114
+
115
+ ### 3) Presentation Layer
116
+
117
+ Solara adds:
118
+
119
+ - built-in action menu
120
+ - optional action menu surface override (`actionMenuSurfaceStyle`)
121
+ - density styling
122
+ - list markup + sticky/pinned split behavior
123
+ - grid media/detail composition
124
+ - render overrides
125
+
126
+ ## List Mode Details
127
+
128
+ List mode is the canonical table behavior and stays TanStack-first.
129
+
130
+ ### What list mode supports
131
+
132
+ - semantic table markup for accessibility (`table`, `thead`, `tbody`, `tr`, `th`, `td`)
133
+ - sortable headers when `enableSorting` is true
134
+ - sticky headers (`stickyHeader`)
135
+ - pinned columns (via TanStack + `getHeaderProps` / `getCellProps`)
136
+ - custom list rendering via `renderBody`, `renderRow`, `renderCell`
137
+
138
+ ### Pinned columns: state wiring + style wiring
139
+
140
+ Pinning is managed by TanStack state; visual stickiness is applied through header/cell prop resolvers.
141
+
142
+ ```tsx
143
+ const [columnPinning, setColumnPinning] = useState({
144
+ left: ["name"],
145
+ right: [],
146
+ });
147
+
148
+ <Table
149
+ data={data}
150
+ columns={columns}
151
+ tableOptions={{
152
+ enableColumnPinning: true,
153
+ state: { columnPinning },
154
+ onColumnPinningChange: setColumnPinning,
155
+ }}
156
+ getHeaderProps={(header) =>
157
+ header.column.getIsPinned()
158
+ ? {
159
+ style: { left: header.column.getStart("left") },
160
+ className: "solara-table__header-cell--pinned",
161
+ }
162
+ : {}
163
+ }
164
+ getCellProps={(cell) =>
165
+ cell.column.getIsPinned()
166
+ ? {
167
+ style: { left: cell.column.getStart("left") },
168
+ className: "solara-table__cell--pinned",
169
+ }
170
+ : {}
171
+ }
172
+ />
173
+ ```
174
+
175
+ ### Sticky + pinned behavior
176
+
177
+ - `transparentSticky` + sticky/pinning can trigger split panes to prevent visual underlap.
178
+ - Center pane owns horizontal scroll; pinned panes mirror vertical scroll.
179
+ - Custom `renderBody` is list-focused and best used when pinned split behavior is not active.
180
+
181
+ If you want to validate vertical scrolling with pinned columns, constrain wrapper height:
182
+
183
+ ```tsx
184
+ <Table
185
+ data={[...data, ...data, ...data, ...data]}
186
+ columns={columns}
187
+ stickyHeader
188
+ transparentSticky
189
+ wrapperProps={{ style: { maxHeight: 220, overflow: "auto" } }}
190
+ tableOptions={{
191
+ enableColumnPinning: true,
192
+ state: { columnPinning },
193
+ onColumnPinningChange: setColumnPinning,
194
+ }}
195
+ />
196
+ ```
197
+
198
+ ## Grid Mode Details
199
+
200
+ Grid mode is a card presentation on top of TanStack rows.
201
+
202
+ ### Grid availability
203
+
204
+ Grid can be enabled per surface instead of globally:
205
+
206
+ - `layoutModeOptions={["list", "grid"]}` keeps both modes available.
207
+ - `layoutModeOptions={["list"]}` makes the surface list-only.
208
+ - The built-in `View` section only appears when `enableLayoutToggle` is true and more than one view is available.
209
+
210
+ Why this matters:
211
+
212
+ - Some surfaces are operational/dense by design and should remain list-only for consistency.
213
+ - Other surfaces benefit from browse-first card exploration, so offering both `list` and `grid` improves workflow.
214
+ - Keeping availability at the table-instance level avoids one-size-fits-all behavior across the app.
215
+
216
+ ### Cell content fallback order
217
+
218
+ 1. `gridCellRenderers[column.id]`
219
+ 2. `renderGridCell(cell, row, table)`
220
+ 3. `renderCell(cell)`
221
+ 4. TanStack `columnDef.cell`
222
+
223
+ This keeps list and grid content aligned by default.
224
+
225
+ ### Grid structure controls
226
+
227
+ Use `gridColumnConfig` by column id:
228
+
229
+ - `variant: "detail" | "media"`
230
+ - `hiddenByDefault`
231
+ - `showLabel`
232
+ - `unpadded`
233
+ - `className`
234
+
235
+ `media` cells render in a dedicated top section (good for images/video hero blocks).
236
+ `detail` cells render in the labeled details section.
237
+
238
+ ### Grid visibility overlay (important)
239
+
240
+ Grid has its own visibility layer:
241
+
242
+ - controlled with `gridVisibleColumnIds` / `onGridVisibleColumnIdsChange`
243
+ - seeded by `gridColumnConfig.hiddenByDefault` in uncontrolled mode
244
+
245
+ Rules:
246
+
247
+ - TanStack-hidden columns are always hidden in both layouts.
248
+ - Grid overlay only applies to TanStack-visible columns.
249
+ - This allows different defaults in grid without mutating list visibility.
250
+
251
+ ### Grid type and spacing
252
+
253
+ Use `gridType` for card flow behavior:
254
+
255
+ - `grid` (default): auto-fit CSS grid
256
+ - `masonry`: masonry-style column flow
257
+
258
+ When `enableColumnControls` is enabled, users can switch these in the action menu (`View` section).
259
+
260
+ How to choose:
261
+
262
+ - Use `grid` when alignment and scanability matter most (consistent rows/tracks).
263
+ - Use `masonry` when media varies in height and you want tighter visual packing.
264
+ - Keep `gridMinColumnWidth` stable across both so only flow behavior changes, not card target size.
265
+
266
+ Use `gridSpacing` for granular spacing overrides:
267
+
268
+ - `gap`: fallback for row/column gap
269
+ - `columnGap`: horizontal card spacing
270
+ - `rowGap`: vertical card spacing
271
+ - `detailsGap`: gap between detail fields inside each card
272
+ - `detailsPadding`: details section padding inside each card
273
+
274
+ Practical layering strategy:
275
+
276
+ - Start with `density` for broad rhythm changes shared across list + grid.
277
+ - Add `gridSpacing` only when one surface needs finer card/detail tuning.
278
+ - Prefer setting `columnGap` + `rowGap` explicitly when switching to masonry so vertical rhythm stays intentional.
279
+ - `gridSpacing` values override density-driven spacing tokens for the fields you set (`gap`, `columnGap`, `rowGap`, `detailsGap`, `detailsPadding`).
280
+ If density appears to do nothing in grid/masonry spacing, check for explicit `gridSpacing` overrides first.
281
+
282
+ ```tsx
283
+ <Table
284
+ data={data}
285
+ columns={columns}
286
+ layoutMode="grid"
287
+ gridType="masonry"
288
+ gridSpacing={{
289
+ columnGap: "1rem",
290
+ rowGap: "1.25rem",
291
+ detailsGap: "0.625rem",
292
+ detailsPadding: "0.875rem",
293
+ }}
294
+ />
295
+ ```
296
+
297
+ ## Built-in Action Menu
298
+
299
+ Menu sections:
300
+
301
+ - `Columns` (if `enableColumnControls`)
302
+ - `Density`
303
+ - `View` (if `enableLayoutToggle` and more than one view is available)
304
+
305
+ Behavior notes:
306
+
307
+ - `Columns` remains layout-aware (TanStack visibility in list, grid overlay visibility in grid).
308
+ - `View` combines layout + grid-type switching into one control (`List`, `Standard grid`, `Masonry grid`).
309
+ - `View` uses the same controlled/uncontrolled pattern as `Density` and coordinates `layoutMode` + `gridType` when selecting grid variants.
310
+
311
+ `Columns` is layout-aware:
312
+
313
+ - list: toggles TanStack visibility
314
+ - grid: toggles grid visibility overlay
315
+
316
+ There is intentionally one shared column section (no duplicate grid section).
317
+
318
+ ## Header Actions (Action Column)
319
+
320
+ `headerActions` renders in a dedicated right-aligned header action cell. Use it for table-level controls such as:
321
+
322
+ - custom view/filter menus
323
+ - export actions
324
+ - bulk action triggers
325
+ - saved view pickers
326
+
327
+ ```tsx
328
+ <Table data={data} columns={columns} headerActions={<MyControl />} />
329
+ ```
330
+
331
+ If both `headerActions` and `enableColumnControls` are set, they are stacked in the same action area.
332
+
333
+ ## Custom Menu Patterns
334
+
335
+ You can fully replace built-in controls with your own menu surface:
336
+
337
+ ```tsx
338
+ <Table data={data} columns={columns} headerActions={<MyCustomMenu />} />
339
+ ```
340
+
341
+ Or combine custom actions with built-in controls:
342
+
343
+ ```tsx
344
+ <Table
345
+ data={data}
346
+ columns={columns}
347
+ enableColumnControls
348
+ headerActions={<MyCustomMenu />}
349
+ />
350
+ ```
351
+
352
+ This is the recommended approach when you need richer workflows (saved views, advanced filters, export presets) while
353
+ still keeping quick built-in toggles.
354
+
355
+ ## Custom Rendering
356
+
357
+ `renderCell`, `renderRow`, and `renderBody` let you customize rendering while preserving TanStack's data/state model.
358
+ This is the main path for advanced list rendering, grouped layouts, and virtualization integration.
359
+
360
+ ```tsx
361
+ <Table
362
+ data={data}
363
+ columns={columns}
364
+ renderRow={(row, cells) => (
365
+ <tr key={row.id} className={row.index % 2 === 0 ? "even" : "odd"}>
366
+ {cells}
367
+ </tr>
368
+ )}
369
+ />
370
+ ```
371
+
372
+ Hook guidance:
373
+
374
+ - `renderCell`: custom content per cell, keeps default row/table structure
375
+ - `renderRow`: custom `<tr>` composition with provided cell nodes
376
+ - `renderBody`: full `<tbody>` control (best for virtualization/windowing)
377
+
378
+ ## Density Behavior
379
+
380
+ `density` is shared across list and grid.
381
+
382
+ - `compact`
383
+ - `standard`
384
+ - `spacious`
385
+
386
+ List impact:
387
+
388
+ - row/cell padding
389
+ - list typography scale
390
+
391
+ Grid impact:
392
+
393
+ - card-to-card spacing
394
+ - detail section gap/padding
395
+ - media minimum height
396
+ - card value typography
397
+
398
+ This keeps spacing decisions centralized and consistent when switching layouts.
399
+
400
+ ### Density usage notes
401
+
402
+ - `density` is a presentation control, not a data/state control.
403
+ - In list mode, it changes table rhythm (row/cell density).
404
+ - In grid mode, it changes card rhythm (gap/padding/media height + typography).
405
+ - If you pass `onDensityChange`, density is controlled and should come from your state.
406
+
407
+ ```tsx
408
+ const [density, setDensity] = useState<TableDensity>("standard");
409
+
410
+ <Table
411
+ data={data}
412
+ columns={columns}
413
+ density={density}
414
+ onDensityChange={setDensity}
415
+ enableColumnControls
416
+ />;
417
+ ```
418
+
419
+ ## Pagination
420
+
421
+ Pagination remains TanStack-driven.
422
+
423
+ ### Client-side Pagination
424
+
425
+ Use TanStack's pagination row model and wire the state through `tableOptions`. The UI is yours to render, so you can
426
+ build a slim pager, a full footer, or a custom layout without changing how the table works.
427
+
428
+ ```tsx
429
+ import { getPaginationRowModel } from "@tanstack/react-table";
430
+
431
+ const [pagination, setPagination] = useState({
432
+ pageIndex: 0,
433
+ pageSize: 20,
434
+ });
435
+
436
+ <Table
437
+ data={data}
438
+ columns={columns}
439
+ tableOptions={{
440
+ state: { pagination },
441
+ onPaginationChange: setPagination,
442
+ getPaginationRowModel: getPaginationRowModel(),
443
+ }}
444
+ />;
445
+ ```
446
+
447
+ ### Built-in footer
448
+
449
+ Use `showPagination` to render Solara pagination controls.
450
+
451
+ ```tsx
452
+ <Table
453
+ data={data}
454
+ columns={columns}
455
+ showPagination
456
+ tableOptions={{
457
+ state: { pagination },
458
+ onPaginationChange: setPagination,
459
+ getPaginationRowModel: getPaginationRowModel(),
460
+ }}
461
+ />
462
+ ```
463
+
464
+ ### Server-side pagination
465
+
466
+ Use TanStack manual pagination in `tableOptions`.
467
+
468
+ ```tsx
469
+ <Table
470
+ data={rows}
471
+ columns={columns}
472
+ tableOptions={{
473
+ manualPagination: true,
474
+ pageCount,
475
+ state: { pagination },
476
+ onPaginationChange: setPagination,
477
+ }}
478
+ />
479
+ ```
480
+
481
+ ### Custom footer pattern (state-driven with `Table`)
482
+
483
+ If you want your own footer UI, keep pagination controlled in `tableOptions` and render your own controls from the same state.
484
+
485
+ ```tsx
486
+ function PaginationFooter({
487
+ pagination,
488
+ pageCount,
489
+ onPrevious,
490
+ onNext,
491
+ }: {
492
+ pagination: { pageIndex: number };
493
+ pageCount: number;
494
+ onPrevious: () => void;
495
+ onNext: () => void;
496
+ }) {
497
+ return (
498
+ <div className="table-footer">
499
+ <button onClick={onPrevious} disabled={pagination.pageIndex === 0}>
500
+ Prev
501
+ </button>
502
+ <span>
503
+ Page {pagination.pageIndex + 1} of {pageCount}
504
+ </span>
505
+ <button
506
+ onClick={onNext}
507
+ disabled={pageCount > 0 ? pagination.pageIndex + 1 >= pageCount : false}
508
+ >
509
+ Next
510
+ </button>
511
+ </div>
512
+ );
513
+ }
514
+ ```
515
+
516
+ ### TanStack table-instance footer pattern (reference)
517
+
518
+ If you are working directly with a TanStack table instance, this is the canonical footer structure:
519
+
520
+ ```tsx
521
+ import type { Table as TanStackTable } from "@tanstack/react-table";
522
+
523
+ function TableFooter({ table }: { table: TanStackTable<Person> }) {
524
+ return (
525
+ <div className="table-footer">
526
+ <button onClick={() => table.previousPage()} disabled={!table.getCanPreviousPage()}>
527
+ Prev
528
+ </button>
529
+ <span>
530
+ Page {table.getState().pagination.pageIndex + 1} of {table.getPageCount()}
531
+ </span>
532
+ <button onClick={() => table.nextPage()} disabled={!table.getCanNextPage()}>
533
+ Next
534
+ </button>
535
+ </div>
536
+ );
537
+ }
538
+ ```
539
+
540
+ ## Virtualization
541
+
542
+ Current recommended path is list virtualization with `renderBody`.
543
+ See `Virtualized Rows` example in [examples.tsx](/Users/craigaucutt/repo/solara/packages/core/components/table/examples.tsx).
544
+
545
+ Guidelines:
546
+
547
+ - Virtualize `rows` from TanStack's current row model.
548
+ - Keep sticky/scroll container logic explicit via `wrapperProps`.
549
+ - Use stable row heights when possible.
550
+ - Keep spacer rows above/below visible slice for correct scroll height.
551
+
552
+ Grid virtualization is possible with custom `renderGridRow` composition, but the built-in virtualization example is list mode today.
553
+
554
+ ## Best Practices
555
+
556
+ 1. Put feature/state logic in TanStack (`tableOptions`) first.
557
+ 2. Use grid overlay APIs only for grid-specific presentation differences.
558
+ 3. Keep `list` as canonical tabular mode for dense workflows.
559
+ 4. Use `grid` for browse/discovery layouts and media-forward cards.
560
+ 5. Prefer `gridCellRenderers` map over one large conditional in `renderGridCell`.
561
+ 6. Use controlled props for persisted preferences (`layoutMode`, `density`, grid-visible fields).
562
+ 7. Treat pagination controls as state views; avoid duplicating competing pagination state sources.
563
+ 8. Avoid effect-driven setState loops by guarding no-op updates when syncing derived ids/visibility.
564
+
565
+ ## Props
566
+
567
+ | Prop | Type | Default | Description |
568
+ | --- | --- | --- | --- |
569
+ | `data` | `TData[]` | — | Row data. |
570
+ | `columns` | `ColumnDef<TData, unknown>[]` | — | TanStack columns. |
571
+ | `tableOptions` | `Omit<TableOptions<TData>, "data" \| "columns">` | — | TanStack option passthrough. |
572
+ | `getRowId` | `TableOptions<TData>["getRowId"]` | — | Optional TanStack row id resolver. |
573
+ | `layoutMode` | `"list" \| "grid"` | `"list"` | Active/default layout mode. |
574
+ | `layoutModeOptions` | `Array<"list" \| "grid">` | `['list', 'grid']` | Allowed layout modes used by the built-in `View` picker. |
575
+ | `enableLayoutToggle` | `boolean` | `false` | Enables the built-in `View` picker menu. |
576
+ | `onLayoutModeChange` | `(mode) => void` | — | Controlled layout callback. |
577
+ | `gridTypeOptions` | `Array<"grid" \| "masonry">` | `['grid', 'masonry']` | Grid-type choices used by the built-in `View` picker for grid variants. |
578
+ | `enableColumnControls` | `boolean` | `false` | Enables built-in Columns controls. |
579
+ | `gridColumnConfig` | `Record<string, TableGridColumnConfig>` | — | Grid-only column presentation config. |
580
+ | `gridVisibleColumnIds` | `string[]` | — | Controlled grid-visible column ids. |
581
+ | `onGridVisibleColumnIdsChange` | `(ids) => void` | — | Controlled grid-visible callback. |
582
+ | `density` | `"compact" \| "standard" \| "spacious"` | `"standard"` | Shared list/grid density mode. |
583
+ | `densityOptions` | `TableDensity[]` | `['compact', 'standard', 'spacious']` | Density options in menu. |
584
+ | `onDensityChange` | `(density) => void` | — | Controlled density callback. |
585
+ | `renderHeaderCell` | `(header) => ReactNode` | — | List header cell override. |
586
+ | `renderCell` | `(cell) => ReactNode` | — | Shared cell fallback override. |
587
+ | `renderGridCell` | `(cell, row, table) => ReactNode` | — | Global grid cell override. |
588
+ | `gridCellRenderers` | `Record<string, (cell, row, table) => ReactNode>` | — | Per-column grid renderers. |
589
+ | `renderGridRow` | `(row, cells, table) => ReactNode` | — | Full custom grid card renderer. |
590
+ | `renderRow` | `(row, cells) => ReactNode` | — | Custom list row renderer. |
591
+ | `renderBody` | `(table, rows) => ReactNode` | — | Custom list body renderer. |
592
+ | `gridType` | `"grid" \| "masonry"` | `"grid"` | Grid flow behavior when `layoutMode` is `grid`. |
593
+ | `onGridTypeChange` | `(gridType) => void` | — | Controlled grid type callback. |
594
+ | `gridSpacing` | `{ gap?, columnGap?, rowGap?, detailsGap?, detailsPadding? }` | — | Granular grid spacing overrides. |
595
+ | `gridMinColumnWidth` | `number \| string` | `260` | Min card width for auto-fit grid columns. |
596
+ | `emptyState` | `ReactNode` | `"No results."` | Empty-state content. |
597
+ | `onRowClick` | `(row, event) => void` | — | Row/card click callback. |
598
+ | `stickyHeader` | `boolean` | `false` | Sticky list header mode. |
599
+ | `transparentSticky` | `boolean` | `false` | Transparent sticky treatment. |
600
+ | `transparentBackground` | `boolean` | `false` | Force transparent table surfaces. |
601
+ | `showHeader` | `boolean` | `true` | Show/hide list header. |
602
+ | `className` | `string` | — | Wrapper class. |
603
+ | `tableClassName` | `string` | — | `<table>` class (list). |
604
+ | `headerClassName` | `string` | — | `<thead>` class (list). |
605
+ | `bodyClassName` | `string` | — | `<tbody>` class (list). |
606
+ | `rowClassName` | `(row) => string` | — | Row/card class resolver. |
607
+ | `cellClassName` | `(cell) => string` | — | Cell class resolver. |
608
+ | `headerCellClassName` | `(header) => string` | — | Header class resolver. |
609
+ | `wrapperProps` | `HTMLAttributes<HTMLDivElement>` | — | Wrapper props. |
610
+ | `tableProps` | `HTMLAttributes<HTMLTableElement>` | — | Table props (list). |
611
+ | `getRowProps` | `(row) => HTMLAttributes<HTMLTableRowElement>` | — | List row props resolver. |
612
+ | `getCellProps` | `(cell) => HTMLAttributes<HTMLTableCellElement>` | — | List cell props resolver. |
613
+ | `getHeaderProps` | `(header) => HTMLAttributes<HTMLTableCellElement>` | — | List header props resolver. |
614
+ | `enableSorting` | `boolean` | `false` | Enables TanStack sorting row model + sortable headers. |
615
+ | `showPagination` | `boolean` | `false` | Enables built-in pagination footer. |
616
+ | `paginationLabels` | `TablePaginationLabels` | — | Pagination footer label overrides. |
617
+ | `paginationPageSizes` | `number[]` | `[5, 10, 20, 50]` | Pagination page-size options. |
@@ -0,0 +1 @@
1
+ export * from '../examples';