@assure-one/design-system 1.47.1 → 1.48.0

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.
@@ -1,10 +1,11 @@
1
1
  import * as React$1 from 'react';
2
- import { ReactNode, CSSProperties } from 'react';
2
+ import { ReactNode, CSSProperties, RefObject } from 'react';
3
3
  import { V as Variant, I as Intent, C as ControlSize, S as Shape } from './vocab-DornLJbW.js';
4
4
  import * as react_jsx_runtime from 'react/jsx-runtime';
5
5
  import * as SelectPrimitive from '@radix-ui/react-select';
6
- import { S as SelectMessages, T as TableMessages } from './types-BTHIs2nk.js';
6
+ import { S as SelectMessages, T as TableMessages } from './types-CKpkEBvW.js';
7
7
  import { a as BrandTheme } from './brand-theme-ZYM867Jz.js';
8
+ import { O as Option } from './option-izy_4w4Z.js';
8
9
 
9
10
  /**
10
11
  * `Code` parts, stamped as `data-slot="code[-<part>]"` (ADR-008). Inline, the
@@ -277,7 +278,7 @@ type ToastSlot = "region" | "root" | "icon" | "title" | "description" | "action"
277
278
  *
278
279
  * @experimental Slot names are experimental until ADR-008 is accepted (W2-18).
279
280
  */
280
- type TableSlot = "root" | "wrapper" | "header" | "body" | "footer" | "row" | "head" | "cell" | "caption" | "sort" | "sort-indicator" | "group-row" | "group-row-toggle" | "group-row-label" | "group-row-trailing";
281
+ type TableSlot = "root" | "wrapper" | "header" | "body" | "footer" | "row" | "head" | "cell" | "caption" | "sort" | "sort-indicator" | "group-row" | "group-row-toggle" | "group-row-label" | "group-row-trailing" | "sort-rank" | "resize-handle" | "head-menu" | "cell-secondary" | "spacer-row" | "group-row-count" | "group-row-subtotal";
281
282
  /**
282
283
  * `DataTable*` parts, stamped as `data-slot="data-table[-<part>]"` (ADR-008).
283
284
  * These are `C-DT-PARTS`, the parallel copy of `Table*` that W6-03 folds back
@@ -303,7 +304,7 @@ type TableSlot = "root" | "wrapper" | "header" | "body" | "footer" | "row" | "he
303
304
  *
304
305
  * @experimental Slot names are experimental until ADR-008 is accepted (W2-18).
305
306
  */
306
- type DataTableSlot = "root" | "toolbar" | "spacer" | "results-count" | "header" | "body" | "row" | "head" | "head-button" | "head-indicator" | "cell" | "checkbox-cell" | "search" | "filters" | "columns-menu" | "content" | "bulk-actions" | "pagination";
307
+ type DataTableSlot = "root" | "toolbar" | "spacer" | "results-count" | "header" | "body" | "row" | "head" | "head-button" | "head-indicator" | "cell" | "checkbox-cell" | "search" | "filters" | "columns-menu" | "content" | "bulk-actions" | "pagination" | "head-menu" | "cell-secondary" | "load-more";
307
308
  /**
308
309
  * `Pagination` parts, stamped as `data-slot="pagination[-<part>]"` (ADR-008).
309
310
  * `root` is the `<nav>`. The current page carries `data-selected` alongside
@@ -328,10 +329,11 @@ type ShellSlot = "root" | "main" | "content";
328
329
  * `[&>div:first-child]` overrides because there is no name for
329
330
  * `section-header`, `link-label` or `user` today.
330
331
  *
331
- * `group/sidebar`, `data-labels`, `data-state`, `data-peek`, `data-overlay`,
332
- * `data-collapsible` and `data-variant` on the root are **unchanged** — they
333
- * are the frozen part of `C-DOM-06`, and no state attribute is re-stamped over
334
- * them. W7-03 adds `data-collapsed` to the slots and the `SidebarSection`
332
+ * `group/sidebar`, `data-labels`, `data-state`, `data-collapsible` and
333
+ * `data-variant` on the root are **unchanged** — they are the frozen part of
334
+ * `C-DOM-06`, and no state attribute is re-stamped over them. (`data-peek` and
335
+ * `data-overlay` were only ever present mid-hover-peek; with peek removed they
336
+ * are never set.) W7-03 adds `data-collapsed` to the slots and the `SidebarSection`
335
337
  * header slot; this change only names the parts.
336
338
  *
337
339
  * `group` is a `SidebarLinkGroup`: `group-link` is its activating row,
@@ -351,7 +353,7 @@ type SidebarSlot = "root" | "trigger" | "pin" | "brand" | "brand-text" | "sectio
351
353
  *
352
354
  * @experimental Slot names are experimental until ADR-008 is accepted (W2-18).
353
355
  */
354
- type SidebarBrandSwitcherSlot = "root" | "trigger" | "icon";
356
+ type SidebarBrandSwitcherSlot = "root" | "trigger" | "icon" | "mark";
355
357
  /**
356
358
  * `Text` parts, stamped as `data-slot="text"` (ADR-008). One part: the
357
359
  * element that carries the role, and the element `className` lands on (with
@@ -478,6 +480,37 @@ type FieldsetSlot = "root" | "legend";
478
480
  * @experimental Slot names are experimental until ADR-008 is accepted (W4-10).
479
481
  */
480
482
  type ComboboxSlot = "root" | "control" | "value" | "chips" | "input" | "icon" | "clear" | "toggle" | "content" | "header" | "list" | "group" | "group-heading" | "item" | "item-indicator" | "create" | "empty" | "loading" | "footer";
483
+ /**
484
+ * `StatStrip` parts, stamped as `data-slot="stat-strip[-<part>]"` (ADR-008).
485
+ * `root` is the joined card (`role="group"`, `data-state="expanded" |
486
+ * "collapsed"`, `data-loading`), `content` the grid / inline row the toggle
487
+ * controls, `toggle` the wrapper of the collapse chevron. Each
488
+ * `StatStripItem` is an `item` (`data-pressed` and `data-disabled` when it is
489
+ * a filter toggle, `data-intent`, `data-glow` while it highlights a change)
490
+ * with its `label`, `value` and `caption`.
491
+ *
492
+ * @experimental Slot names are experimental until ADR-008 is accepted (W2-18).
493
+ */
494
+ type StatStripSlot = "root" | "content" | "toggle" | "item" | "label" | "value" | "caption";
495
+ /**
496
+ * `FilterChips` parts, stamped as `data-slot="filter-chips[-<part>]"` (ADR-008):
497
+ * the row (`root`), one `chip` per active facet, the collapsed `overflow`
498
+ * ("+N") chip and its popover `overflow-panel` listing each `overflow-facet`
499
+ * and `overflow-value`, and the trailing `clear` ("Clear all") action.
500
+ *
501
+ * @experimental
502
+ */
503
+ type FilterChipsSlot = "root" | "chip" | "overflow" | "overflow-panel" | "overflow-facet" | "overflow-value" | "clear";
504
+ /**
505
+ * `ListPage` parts, stamped as `data-slot="list-page[-<part>]"` (ADR-008): the
506
+ * full-height, non-scrolling `root`; the `stats`, `toolbar` and `bulk-bar`
507
+ * bands; the toolbar's `search`, `chips`, `count` and `actions` cells; the
508
+ * `table` card, its single `scroll` region and pinned `footer`; and the
509
+ * live `result-count`.
510
+ *
511
+ * @experimental
512
+ */
513
+ type ListPageSlot = "root" | "stats" | "toolbar" | "search" | "chips" | "count" | "actions" | "table" | "scroll" | "footer" | "bulk-bar" | "result-count";
481
514
 
482
515
  /** The emphasis subset a badge offers. @experimental */
483
516
  type BadgeVariant = Extract<Variant, "solid" | "soft" | "outline">;
@@ -902,7 +935,23 @@ interface TableProps extends React.TableHTMLAttributes<HTMLTableElement> {
902
935
  * @experimental
903
936
  */
904
937
  messages?: Partial<TableMessages>;
938
+ /**
939
+ * Pin the identity column (PR 3): the first cell of every row sticks to the
940
+ * start edge while the wrapper scrolls horizontally. One attribute on the
941
+ * wrapper (`data-sticky-first`), read by a descendant selector — no prop on
942
+ * each cell. A cell's own `sticky` still works and wins.
943
+ *
944
+ * @experimental
945
+ */
946
+ stickyFirstColumn?: boolean | undefined;
905
947
  }
948
+ /**
949
+ * Whether the wrapper scrolls — its columns overflow it, or its rows do when
950
+ * it has a height (`stickyHeader`). Measured with a ResizeObserver (SSR renders
951
+ * "not overflowing"); the wrapper only becomes a focusable, labelled region
952
+ * when there is actually something to scroll — a table that fits gets no tab
953
+ * stop, and its DOM stays what it was (C-DOM-09).
954
+ */
906
955
  declare const Table: React$1.ForwardRefExoticComponent<TableProps & React$1.RefAttributes<HTMLTableElement>>;
907
956
  type TableHeaderProps = React.HTMLAttributes<HTMLTableSectionElement>;
908
957
  declare const TableHeader: React$1.ForwardRefExoticComponent<TableHeaderProps & React$1.RefAttributes<HTMLTableSectionElement>>;
@@ -964,8 +1013,58 @@ interface TableHeadProps extends Omit<React.ThHTMLAttributes<HTMLTableCellElemen
964
1013
  * @experimental
965
1014
  */
966
1015
  sort?: TableSortDirection | null | undefined;
967
- /** Receives the next step of the sort cycle when the header is activated. */
968
- onSortChange?: ((sort: TableSortDirection | null) => void) | undefined;
1016
+ /**
1017
+ * Receives the next step of the sort cycle when the header is activated.
1018
+ * The second argument (PR 3) says whether the activation was *additive* —
1019
+ * Shift-click or Shift+Enter — so a multi-sort table adds a secondary key
1020
+ * instead of replacing the primary. Single-argument handlers are unaffected.
1021
+ */
1022
+ onSortChange?: ((sort: TableSortDirection | null, meta: TableSortChangeMeta) => void) | undefined;
1023
+ /**
1024
+ * The column's 1-based rank in a multi-key sort (PR 3). Rendered as a small
1025
+ * number beside the indicator when the table sorts by more than one key, and
1026
+ * spoken as "priority N". Omit for single-sort tables.
1027
+ *
1028
+ * @experimental
1029
+ */
1030
+ sortIndex?: number | undefined;
1031
+ /**
1032
+ * The direction an unsorted column starts in (PR 3): `desc` for dates and
1033
+ * money, where the newest / largest is the useful first answer. Default `asc`.
1034
+ *
1035
+ * @experimental
1036
+ */
1037
+ sortFirstDirection?: TableSortDirection | undefined;
1038
+ /**
1039
+ * A trailing slot inside the header cell, after the label — the
1040
+ * `TableHeadMenu` trigger (PR 3). A separate element from the sort button,
1041
+ * so opening the menu never sorts.
1042
+ *
1043
+ * @experimental
1044
+ */
1045
+ menu?: React.ReactNode;
1046
+ /**
1047
+ * Renders a resize handle on the trailing edge (PR 3): pointer drag, or
1048
+ * ArrowLeft / ArrowRight (Shift for bigger steps) while it has focus. The
1049
+ * handle is its own element — dragging it never sorts. Pair with `width`
1050
+ * and `onWidthChange`.
1051
+ *
1052
+ * @experimental
1053
+ */
1054
+ resizable?: boolean | undefined;
1055
+ /** Receives the new width in px while resizing. */
1056
+ onWidthChange?: ((width: number) => void) | undefined;
1057
+ /** Double-click or Enter on the resize handle: fit the column to its content. */
1058
+ onAutoSize?: (() => void) | undefined;
1059
+ /** Resize floor in px. Default `48`. */
1060
+ minWidth?: number | undefined;
1061
+ /** Resize ceiling in px. Default `800`. */
1062
+ maxWidth?: number | undefined;
1063
+ }
1064
+ /** What `TableHead`'s `onSortChange` learns besides the next direction. @experimental */
1065
+ interface TableSortChangeMeta {
1066
+ /** Shift was held: add or update a secondary sort key instead of replacing the sort. */
1067
+ additive: boolean;
969
1068
  }
970
1069
  declare const TableHead: React$1.ForwardRefExoticComponent<TableHeadProps & React$1.RefAttributes<HTMLTableCellElement>>;
971
1070
  interface TableCellProps extends Omit<React.TdHTMLAttributes<HTMLTableCellElement>, "align">, TableCellCommonProps {
@@ -986,6 +1085,18 @@ interface TableCellProps extends Omit<React.TdHTMLAttributes<HTMLTableCellElemen
986
1085
  overflowTooltip?: boolean;
987
1086
  }
988
1087
  declare const TableCell: React$1.ForwardRefExoticComponent<TableCellProps & React$1.RefAttributes<HTMLTableCellElement>>;
1088
+ type TableCellSecondaryProps = React.HTMLAttributes<HTMLSpanElement>;
1089
+ /**
1090
+ * TableCellSecondary — a quiet second line inside a cell (an email under a
1091
+ * name, an engagement under a client) that renders only in the comfortable
1092
+ * ("Detailed") density. Under a `data-ds-density="compact"` ancestor — the
1093
+ * `Table density` prop, or any density scope — it is hidden by a selector, so
1094
+ * switching density changes the *content* of a row, not just its padding,
1095
+ * with no prop on each cell.
1096
+ *
1097
+ * @experimental
1098
+ */
1099
+ declare const TableCellSecondary: React$1.ForwardRefExoticComponent<TableCellSecondaryProps & React$1.RefAttributes<HTMLSpanElement>>;
989
1100
  interface TableGroupRowProps extends Omit<React.HTMLAttributes<HTMLTableRowElement>, "children"> {
990
1101
  /** How many columns the row's one cell spans — the table's column count. */
991
1102
  colSpan: number;
@@ -1004,7 +1115,36 @@ interface TableGroupRowProps extends Omit<React.HTMLAttributes<HTMLTableRowEleme
1004
1115
  open?: boolean;
1005
1116
  onOpenChange?: (open: boolean) => void;
1006
1117
  /** Copy for the collapse toggle; prop > provider > English default (W5-20). */
1007
- messages?: Partial<Pick<TableMessages, "collapseSection" | "expandSection">>;
1118
+ messages?: Partial<Pick<TableMessages, "collapseSection" | "expandSection" | "groupLoadedOf">>;
1119
+ /**
1120
+ * Rows in the group (PR 3): shown after the label as "12". With
1121
+ * `totalCount` above it (infinite mode, only some rows loaded) it reads
1122
+ * "12 of 30 loaded". @experimental
1123
+ */
1124
+ count?: number | undefined;
1125
+ /** Rows the group holds in all, when more exist than are loaded. @experimental */
1126
+ totalCount?: number | undefined;
1127
+ /** Locale for the count. @experimental */
1128
+ locale?: string | undefined;
1129
+ /**
1130
+ * Subtotal cells (PR 3), one entry per column (`colSpan` entries). The label
1131
+ * cell spans every column up to the first non-empty entry; each later entry
1132
+ * renders as its own cell, so a subtotal sits under its column. Mark money /
1133
+ * count entries `numeric` to right-align them like the column's cells.
1134
+ * @experimental
1135
+ */
1136
+ subtotals?: readonly (TableGroupRowSubtotal | null | undefined)[] | undefined;
1137
+ /**
1138
+ * Stick under the sticky header while its rows scroll past (PR 3). Default:
1139
+ * follows the table's `stickyHeader`, as before. @experimental
1140
+ */
1141
+ sticky?: boolean | undefined;
1142
+ }
1143
+ /** One subtotal cell of a {@link TableGroupRow}. @experimental */
1144
+ interface TableGroupRowSubtotal {
1145
+ value: React.ReactNode;
1146
+ /** Right-align with tabular figures, matching a `numeric` column. */
1147
+ numeric?: boolean | undefined;
1008
1148
  }
1009
1149
  /**
1010
1150
  * TableGroupRow — a full-width section header row inside `TableBody` (W6-01
@@ -1021,6 +1161,446 @@ declare const TableGroupRow: React$1.ForwardRefExoticComponent<TableGroupRowProp
1021
1161
  type TableCaptionProps = React.HTMLAttributes<HTMLTableCaptionElement>;
1022
1162
  declare const TableCaption: React$1.ForwardRefExoticComponent<TableCaptionProps & React$1.RefAttributes<HTMLTableCaptionElement>>;
1023
1163
 
1164
+ /**
1165
+ * `useDataTable<TRow>()` (W6-04/W6-05; target architecture §35.2) — the
1166
+ * headless controller behind every data table.
1167
+ *
1168
+ * No DOM, no styling: the hook owns the six state slices a table needs —
1169
+ * **sorting · pagination · search · selection · columnVisibility · filters** —
1170
+ * each independently controllable (`value` + `onValueChange`) or uncontrolled
1171
+ * with a default, plus the whole-state pair `state` / `onStateChange` for a
1172
+ * product hook that mirrors the table into the URL. It derives the rows to
1173
+ * render (filtered → searched → sorted → paged) from typed column definitions
1174
+ * and hands back stable ids for the ARIA wiring the rendering layer adds.
1175
+ *
1176
+ * Why it exists: today `DataTableView` keeps sort, search and page in private
1177
+ * state, so TAX seeds it once through `initialSort` and *listens to header
1178
+ * clicks by header text* to keep the URL in step (`use-queue-view.ts`), and
1179
+ * PRO hand-rolls the same three states per table. Every slice here is
1180
+ * observable and settable, so those bridges become `sorting` +
1181
+ * `onSortingChange`.
1182
+ *
1183
+ * `manual` (W6-05) turns the row model off for server-side tables: the hook
1184
+ * then never sorts, filters, searches or pages `data` itself — it only holds
1185
+ * and emits state, and `rowCount` sizes the pager.
1186
+ *
1187
+ * Every state slice is plain JSON (arrays and records, no `Set`/`Map`), so it
1188
+ * can be written to a URL or storage as it is. Persisting column visibility is
1189
+ * the consumer's `onColumnVisibilityChange`; the design system never touches
1190
+ * `localStorage`.
1191
+ *
1192
+ * @experimental
1193
+ */
1194
+ /** Sort direction of one column; `null` on the sorting slice means unsorted. */
1195
+ type DataTableSortDirection = "asc" | "desc";
1196
+ /** What a column reads from a row: a property name or a function. */
1197
+ type DataTableAccessor<TRow> = keyof TRow | ((row: TRow) => unknown);
1198
+ /** A value the built-in comparator orders. `null`/`undefined` always sort last. */
1199
+ type DataTableSortValue = string | number | boolean | Date | null | undefined;
1200
+ /**
1201
+ * One column of a data table. `id` is the stable key the sorting and
1202
+ * column-visibility slices refer to and the ids for ARIA are derived from.
1203
+ *
1204
+ * @experimental
1205
+ */
1206
+ interface DataTableColumn<TRow> {
1207
+ /** Stable identifier: the key in `sorting`, `columnVisibility` and derived DOM ids. */
1208
+ id: string;
1209
+ /** Header content. Any node — not string-only, so a consumer never has to find a column by its text. */
1210
+ header: ReactNode;
1211
+ /** How the cell value is read. Defaults to `row[id]` when `id` is a key of the row. */
1212
+ accessor?: DataTableAccessor<TRow>;
1213
+ /** Cell renderer. Defaults to the accessor value rendered as text by the rendering layer. */
1214
+ cell?: (row: TRow, context: {
1215
+ value: unknown;
1216
+ rowId: string;
1217
+ index: number;
1218
+ }) => ReactNode;
1219
+ /** Whether the header offers sorting. Default `false`. */
1220
+ sortable?: boolean | undefined;
1221
+ /** Custom sort key (e.g. a numeric age behind a "5h ago" label). Defaults to the accessor value. */
1222
+ sortValue?: ((row: TRow) => DataTableSortValue) | undefined;
1223
+ /**
1224
+ * Whether the client-side search reads this column. Default `true` for a
1225
+ * column with an accessor. `searchText` overrides what is read.
1226
+ */
1227
+ searchable?: boolean;
1228
+ /** Text the client-side search matches for this column. Defaults to `String(value)`. */
1229
+ searchText?: (row: TRow) => string;
1230
+ /** Whether the columns menu may hide it. Default `true`. */
1231
+ hideable?: boolean;
1232
+ /** Layout hint for the rendering layer (W6-01 `TableCell align`). */
1233
+ align?: "start" | "center" | "end";
1234
+ /** Layout hint: right-aligned, tabular figures (W6-01 `TableCell numeric`). */
1235
+ numeric?: boolean;
1236
+ /** Layout hint: a CSS width for the column. */
1237
+ width?: string;
1238
+ /**
1239
+ * The direction a first click sorts in (PR 3). Default `"asc"`; dates and
1240
+ * money usually want `"desc"` (newest / largest first). The cycle is then
1241
+ * first → opposite → unsorted.
1242
+ */
1243
+ sortFirstDirection?: DataTableSortDirection | undefined;
1244
+ /** Layout hint: stick the column to an edge while the table scrolls sideways (`TableCell sticky`). */
1245
+ sticky?: "start" | "end" | undefined;
1246
+ }
1247
+ /**
1248
+ * One filter of a data table: which rows a value keeps, and the options the
1249
+ * rendering layer offers, in the shared {@link Option} model.
1250
+ *
1251
+ * @experimental
1252
+ */
1253
+ interface DataTableFilterDefinition<TRow, TValue extends string = string> {
1254
+ id: string;
1255
+ label: string;
1256
+ options: readonly Option<TValue>[];
1257
+ /** `true` keeps the row for the given value. Receives one value at a time, also for a multi-value filter. */
1258
+ match: (row: TRow, value: TValue) => boolean;
1259
+ /** Whether several values may be active (a row matches when any matches). Default `false`. */
1260
+ multiple?: boolean;
1261
+ }
1262
+ /** Sorting slice: one column and a direction, or `null` for unsorted. */
1263
+ interface DataTableSortingState {
1264
+ columnId: string;
1265
+ direction: DataTableSortDirection;
1266
+ }
1267
+ /** Pagination slice. `page` is 1-based, like `Pagination` and `DataTableView`. */
1268
+ interface DataTablePaginationState {
1269
+ page: number;
1270
+ pageSize: number;
1271
+ }
1272
+ /** Filters slice: filter id → active value(s). A missing key, `null` or `[]` means "all". */
1273
+ type DataTableFilterValue = string | readonly string[] | null;
1274
+ type DataTableFiltersState = Readonly<Record<string, DataTableFilterValue>>;
1275
+ /** Column-visibility slice: column id → shown. A missing key means shown. */
1276
+ type DataTableColumnVisibilityState = Readonly<Record<string, boolean>>;
1277
+ /** Selection slice: the ids of the selected rows, in selection order. */
1278
+ type DataTableSelectionState = readonly string[];
1279
+ /**
1280
+ * Multi-sort slice (PR 3): the sort keys in priority order — index 0 is the
1281
+ * primary sort, the one the `sorting` slice mirrors. `[]` is unsorted.
1282
+ */
1283
+ type DataTableMultiSortingState = readonly DataTableSortingState[];
1284
+ /** Column-order slice: column ids in display order. Ids not listed follow in `columns` order. */
1285
+ type DataTableColumnOrderState = readonly string[];
1286
+ /** Column-width slice: column id → width in px. A missing key keeps the column's own `width`. */
1287
+ type DataTableColumnWidthsState = Readonly<Record<string, number>>;
1288
+ /** Column-pinning slice: ids pinned to the start edge, in pin order (they render first). */
1289
+ interface DataTableColumnPinningState {
1290
+ start: readonly string[];
1291
+ }
1292
+ /**
1293
+ * The whole serialisable state of a table, e.g. for a URL or storage mirror.
1294
+ *
1295
+ * @experimental
1296
+ */
1297
+ interface DataTableState {
1298
+ sorting: DataTableSortingState | null;
1299
+ pagination: DataTablePaginationState;
1300
+ search: string;
1301
+ selection: DataTableSelectionState;
1302
+ columnVisibility: DataTableColumnVisibilityState;
1303
+ filters: DataTableFiltersState;
1304
+ /**
1305
+ * Every sort key, primary first (PR 3). Always present on the state the hook
1306
+ * reports; optional so a state written before multi-sort still type-checks.
1307
+ */
1308
+ multiSorting?: DataTableMultiSortingState;
1309
+ /** Column display order (PR 3). Always present on reported state. */
1310
+ columnOrder?: DataTableColumnOrderState;
1311
+ /** Column widths in px (PR 3). Always present on reported state. */
1312
+ columnWidths?: DataTableColumnWidthsState;
1313
+ /** Pinned columns (PR 3). Always present on reported state. */
1314
+ columnPinning?: DataTableColumnPinningState;
1315
+ }
1316
+ /**
1317
+ * Options of {@link useDataTable}. Every slice accepts a controlled value, a
1318
+ * default, and a change callback; the whole-state `state` / `defaultState` /
1319
+ * `onStateChange` triple works alongside (a granular prop wins over `state`).
1320
+ *
1321
+ * @experimental
1322
+ */
1323
+ interface UseDataTableOptions<TRow> {
1324
+ /** The rows. In client mode the full set; in `manual` mode the current page as the server returned it. */
1325
+ data: readonly TRow[];
1326
+ columns: readonly DataTableColumn<TRow>[];
1327
+ /** Filter definitions (`filters` is the state). */
1328
+ filterDefinitions?: readonly DataTableFilterDefinition<TRow>[] | undefined;
1329
+ /**
1330
+ * Stable id of a row. Defaults to `row.id` when it is a string or number,
1331
+ * otherwise the row's index (fine for static data; pass one for anything
1332
+ * that reorders).
1333
+ */
1334
+ getRowId?: ((row: TRow, index: number) => string) | undefined;
1335
+ /** Whether a row may be selected. Default: every row. */
1336
+ isRowSelectable?: ((row: TRow) => boolean) | undefined;
1337
+ /** Base id for the derived DOM ids (`getColumnId`, `getRowDomId`). Generated when omitted. */
1338
+ id?: string | undefined;
1339
+ /**
1340
+ * Server mode (W6-05): the hook never sorts, filters, searches or pages
1341
+ * `data` — it only holds and emits state. `rowCount` sizes the pager.
1342
+ * Default `false`.
1343
+ */
1344
+ manual?: boolean | undefined;
1345
+ /** Total number of rows matching the current search and filters, in `manual` mode. Defaults to `data.length`. */
1346
+ rowCount?: number | undefined;
1347
+ /**
1348
+ * Called by `selection.selectAllMatching()` in `manual` mode, where only the
1349
+ * server knows every matching id: receives the current state so the
1350
+ * consumer can resolve the ids and set the selection.
1351
+ */
1352
+ onSelectAllMatching?: ((state: DataTableState) => void) | undefined;
1353
+ /**
1354
+ * Whether changing the search or a filter returns to page 1. Default
1355
+ * `true` (today's `DataTableView`). Sorting never resets the page.
1356
+ */
1357
+ resetPageOnChange?: boolean | undefined;
1358
+ sorting?: DataTableSortingState | null | undefined;
1359
+ defaultSorting?: DataTableSortingState | null | undefined;
1360
+ onSortingChange?: ((sorting: DataTableSortingState | null) => void) | undefined;
1361
+ /**
1362
+ * Allow several sort keys (PR 3): `sorting.toggle(id, { additive: true })`
1363
+ * (a Shift-click) adds or advances a secondary key. Default `false` — an
1364
+ * additive toggle then behaves like a plain one.
1365
+ */
1366
+ multiSort?: boolean | undefined;
1367
+ /** Controlled sort keys, primary first. Wins over `sorting`. */
1368
+ multiSorting?: DataTableMultiSortingState | undefined;
1369
+ defaultMultiSorting?: DataTableMultiSortingState | undefined;
1370
+ onMultiSortingChange?: ((multiSorting: DataTableMultiSortingState) => void) | undefined;
1371
+ columnOrder?: DataTableColumnOrderState | undefined;
1372
+ defaultColumnOrder?: DataTableColumnOrderState | undefined;
1373
+ onColumnOrderChange?: ((columnOrder: DataTableColumnOrderState) => void) | undefined;
1374
+ columnWidths?: DataTableColumnWidthsState | undefined;
1375
+ defaultColumnWidths?: DataTableColumnWidthsState | undefined;
1376
+ onColumnWidthsChange?: ((columnWidths: DataTableColumnWidthsState) => void) | undefined;
1377
+ columnPinning?: DataTableColumnPinningState | undefined;
1378
+ defaultColumnPinning?: DataTableColumnPinningState | undefined;
1379
+ onColumnPinningChange?: ((columnPinning: DataTableColumnPinningState) => void) | undefined;
1380
+ pagination?: DataTablePaginationState | undefined;
1381
+ defaultPagination?: Partial<DataTablePaginationState> | undefined;
1382
+ onPaginationChange?: ((pagination: DataTablePaginationState) => void) | undefined;
1383
+ search?: string | undefined;
1384
+ defaultSearch?: string | undefined;
1385
+ onSearchChange?: ((search: string) => void) | undefined;
1386
+ selection?: DataTableSelectionState | undefined;
1387
+ defaultSelection?: DataTableSelectionState | undefined;
1388
+ onSelectionChange?: ((selection: DataTableSelectionState) => void) | undefined;
1389
+ columnVisibility?: DataTableColumnVisibilityState | undefined;
1390
+ defaultColumnVisibility?: DataTableColumnVisibilityState | undefined;
1391
+ /** The persistence hook for column visibility: write it wherever the product keeps preferences. */
1392
+ onColumnVisibilityChange?: ((columnVisibility: DataTableColumnVisibilityState) => void) | undefined;
1393
+ filters?: DataTableFiltersState | undefined;
1394
+ defaultFilters?: DataTableFiltersState | undefined;
1395
+ onFiltersChange?: ((filters: DataTableFiltersState) => void) | undefined;
1396
+ /** Whole-state control. A granular prop (`sorting`, `search`, …) wins over the matching key. */
1397
+ state?: Partial<DataTableState> | undefined;
1398
+ defaultState?: Partial<DataTableState> | undefined;
1399
+ /** Called with the complete next state after any slice changes. */
1400
+ onStateChange?: ((state: DataTableState) => void) | undefined;
1401
+ }
1402
+ /** One row of the derived row model. */
1403
+ interface DataTableRowModel<TRow> {
1404
+ id: string;
1405
+ row: TRow;
1406
+ /** Index within the rows to render (the current page). */
1407
+ index: number;
1408
+ selected: boolean;
1409
+ selectable: boolean;
1410
+ }
1411
+ /** `aria-sort` value of a sortable header. `undefined` for a non-sortable column. */
1412
+ type DataTableAriaSort = "ascending" | "descending" | "none" | undefined;
1413
+ /** Options of `sorting.toggle` (PR 3). */
1414
+ interface DataTableSortToggleOptions {
1415
+ /** Add or advance this column as a secondary key instead of replacing the sort (Shift-click). Needs `multiSort`. */
1416
+ additive?: boolean | undefined;
1417
+ }
1418
+ interface DataTableSortingApi {
1419
+ /** The primary sort key. */
1420
+ value: DataTableSortingState | null;
1421
+ /** Replaces the whole sort with one key (or none). */
1422
+ set: (sorting: DataTableSortingState | null) => void;
1423
+ /** Every sort key, primary first (PR 3). */
1424
+ multi: DataTableMultiSortingState;
1425
+ /** Replaces every sort key (PR 3). */
1426
+ setMulti: (multiSorting: DataTableMultiSortingState) => void;
1427
+ /** Direction of one column, `null` when it is not a sort key. */
1428
+ getDirection: (columnId: string) => DataTableSortDirection | null;
1429
+ /** 1-based priority of a sort key; `0` when the column is not sorted (PR 3). */
1430
+ getIndex: (columnId: string) => number;
1431
+ /**
1432
+ * Advances one column through its cycle: unsorted → first direction →
1433
+ * opposite → unsorted (first direction is the column's
1434
+ * `sortFirstDirection`, default `asc`). A plain toggle replaces the sort; an
1435
+ * `additive` one (with `multiSort`) adds, advances or drops a secondary key.
1436
+ */
1437
+ toggle: (columnId: string, options?: DataTableSortToggleOptions) => void;
1438
+ /**
1439
+ * `aria-sort` for a header: `"ascending"`/`"descending"` on the primary key
1440
+ * only — ARIA expects one sorted header at a time — `"none"` for any other
1441
+ * sortable column, secondary keys included (their rank is in the header's
1442
+ * own text, see `TableHead sortIndex`).
1443
+ */
1444
+ getAriaSort: (columnId: string) => DataTableAriaSort;
1445
+ }
1446
+ /** Column-order API (PR 3). */
1447
+ interface DataTableColumnOrderApi {
1448
+ /** Every column id in display order (resolved: unlisted ids appended). */
1449
+ value: DataTableColumnOrderState;
1450
+ set: (columnOrder: DataTableColumnOrderState) => void;
1451
+ /** Moves a column `delta` places among the rendered columns (`-1` left, `1` right). No-op at an edge or across the pinned boundary. */
1452
+ move: (columnId: string, delta: number) => void;
1453
+ /** Whether `move(columnId, delta)` would move it. */
1454
+ canMove: (columnId: string, delta: number) => boolean;
1455
+ /** Back to the `columns` order. */
1456
+ reset: () => void;
1457
+ }
1458
+ /** Column-width API (PR 3). */
1459
+ interface DataTableColumnWidthsApi {
1460
+ value: DataTableColumnWidthsState;
1461
+ /** Width in px set by the user, or `undefined` (the column's own `width`). */
1462
+ get: (columnId: string) => number | undefined;
1463
+ set: (columnId: string, width: number) => void;
1464
+ /** Clears one column's width (autosize), or every width without an argument. */
1465
+ reset: (columnId?: string) => void;
1466
+ }
1467
+ /** Column-pinning API (PR 3). */
1468
+ interface DataTableColumnPinningApi {
1469
+ value: DataTableColumnPinningState;
1470
+ isPinned: (columnId: string) => boolean;
1471
+ pin: (columnId: string) => void;
1472
+ unpin: (columnId: string) => void;
1473
+ set: (columnPinning: DataTableColumnPinningState) => void;
1474
+ reset: () => void;
1475
+ }
1476
+ interface DataTablePaginationApi extends DataTablePaginationState {
1477
+ pageCount: number;
1478
+ /** Total rows matching the search and filters (`rowCount` in manual mode). */
1479
+ rowCount: number;
1480
+ /** 1-based index of the first and last row on the page; both `0` when empty. */
1481
+ rangeStart: number;
1482
+ rangeEnd: number;
1483
+ canPreviousPage: boolean;
1484
+ canNextPage: boolean;
1485
+ set: (pagination: DataTablePaginationState) => void;
1486
+ setPage: (page: number) => void;
1487
+ /** Changes the page size and returns to page 1. */
1488
+ setPageSize: (pageSize: number) => void;
1489
+ nextPage: () => void;
1490
+ previousPage: () => void;
1491
+ }
1492
+ interface DataTableSearchApi {
1493
+ value: string;
1494
+ set: (search: string) => void;
1495
+ clear: () => void;
1496
+ }
1497
+ interface DataTableSelectionApi {
1498
+ value: DataTableSelectionState;
1499
+ count: number;
1500
+ isSelected: (rowId: string) => boolean;
1501
+ set: (selection: DataTableSelectionState) => void;
1502
+ select: (rowId: string) => void;
1503
+ deselect: (rowId: string) => void;
1504
+ toggle: (rowId: string) => void;
1505
+ clear: () => void;
1506
+ /** Every selectable row on the current page is selected (false when there is none). */
1507
+ allPageSelected: boolean;
1508
+ /** Some, but not all, selectable rows on the current page are selected (the header checkbox's indeterminate). */
1509
+ somePageSelected: boolean;
1510
+ /** Selects (or clears) the selectable rows on the current page, keeping selections made elsewhere. */
1511
+ selectPage: () => void;
1512
+ deselectPage: () => void;
1513
+ togglePage: () => void;
1514
+ /**
1515
+ * Selects every row matching the search and filters. In client mode the
1516
+ * hook knows them; in `manual` mode it calls `onSelectAllMatching(state)`.
1517
+ */
1518
+ selectAllMatching: () => void;
1519
+ }
1520
+ interface DataTableColumnVisibilityApi {
1521
+ value: DataTableColumnVisibilityState;
1522
+ isVisible: (columnId: string) => boolean;
1523
+ set: (columnVisibility: DataTableColumnVisibilityState) => void;
1524
+ setVisible: (columnId: string, visible: boolean) => void;
1525
+ toggle: (columnId: string) => void;
1526
+ /** Shows every column again. */
1527
+ reset: () => void;
1528
+ }
1529
+ interface DataTableFiltersApi<TRow> {
1530
+ value: DataTableFiltersState;
1531
+ definitions: readonly DataTableFilterDefinition<TRow>[];
1532
+ /** Active value(s) of one filter; `null` when it is not narrowing. */
1533
+ get: (filterId: string) => DataTableFilterValue;
1534
+ set: (filterId: string, value: DataTableFilterValue) => void;
1535
+ clear: (filterId: string) => void;
1536
+ clearAll: () => void;
1537
+ /** Number of filters that are narrowing. */
1538
+ activeCount: number;
1539
+ }
1540
+ /**
1541
+ * What {@link useDataTable} returns.
1542
+ *
1543
+ * @experimental
1544
+ */
1545
+ interface DataTableController<TRow> {
1546
+ /** Base id of the derived DOM ids. */
1547
+ id: string;
1548
+ manual: boolean;
1549
+ /** The whole serialisable state. */
1550
+ state: DataTableState;
1551
+ /** Every column, in order. */
1552
+ allColumns: readonly DataTableColumn<TRow>[];
1553
+ /** The columns to render: `allColumns` in `columnOrder`, pinned first, minus the hidden ones. */
1554
+ columns: readonly DataTableColumn<TRow>[];
1555
+ /** The rows to render: filtered → searched → sorted → paged (client mode), or `data` as given (manual mode). */
1556
+ rows: readonly DataTableRowModel<TRow>[];
1557
+ /**
1558
+ * Every row matching the search and filters, sorted, across all pages
1559
+ * (client mode) — the scope of `selection.selectAllMatching()`; `data` as
1560
+ * given in manual mode.
1561
+ */
1562
+ matchingRows: readonly TRow[];
1563
+ /** Reads a cell through the column's accessor. */
1564
+ getCellValue: (row: TRow, column: DataTableColumn<TRow>) => unknown;
1565
+ /** Renders a cell: the column's `cell`, or the accessor value as text. */
1566
+ renderCell: (model: DataTableRowModel<TRow>, column: DataTableColumn<TRow>) => ReactNode;
1567
+ /** Stable DOM id for a column's header cell (`aria-describedby`, `headers`). */
1568
+ getColumnId: (columnId: string) => string;
1569
+ /** Stable DOM id for a row. */
1570
+ getRowDomId: (rowId: string) => string;
1571
+ sorting: DataTableSortingApi;
1572
+ pagination: DataTablePaginationApi;
1573
+ search: DataTableSearchApi;
1574
+ selection: DataTableSelectionApi;
1575
+ columnVisibility: DataTableColumnVisibilityApi;
1576
+ filters: DataTableFiltersApi<TRow>;
1577
+ /** Column order (PR 3). */
1578
+ columnOrder: DataTableColumnOrderApi;
1579
+ /** Column widths (PR 3). */
1580
+ columnWidths: DataTableColumnWidthsApi;
1581
+ /** Column pinning (PR 3). */
1582
+ columnPinning: DataTableColumnPinningApi;
1583
+ /** Resets order, widths, pinning and visibility in one change (a header menu's "Reset columns"). */
1584
+ resetColumns: () => void;
1585
+ }
1586
+ /**
1587
+ * The comparator `DataTableView` uses today: case-insensitive strings,
1588
+ * numbers and dates by value, `null`/`undefined` last in both directions.
1589
+ */
1590
+ declare function compareSortValues(a: DataTableSortValue, b: DataTableSortValue, direction: DataTableSortDirection): number;
1591
+ /**
1592
+ * Advances through the header cycle: unsorted → `first` → opposite →
1593
+ * unsorted. `first` defaults to `asc` (today's cycle).
1594
+ */
1595
+ declare function nextSortDirection(current: DataTableSortDirection | null, first?: DataTableSortDirection): DataTableSortDirection | null;
1596
+ /**
1597
+ * The headless data-table controller. See the module comment and
1598
+ * `docs/data-tables.md`.
1599
+ *
1600
+ * @experimental
1601
+ */
1602
+ declare function useDataTable<TRow>(options: UseDataTableOptions<TRow>): DataTableController<TRow>;
1603
+
1024
1604
  /**
1025
1605
  * Practice service tones for the client portal. Each engagement surface
1026
1606
  * (card, ring, timeline) is "toned per service": a fill color + a track
@@ -1045,6 +1625,10 @@ interface DataTableProps extends React.HTMLAttributes<HTMLDivElement> {
1045
1625
  /** When true, renders the table card with a flat top edge so it
1046
1626
  * visually attaches to a `<DataTableToolbar>` above it. */
1047
1627
  withToolbar?: boolean;
1628
+ /** Keep column headers visible inside the scrolling frame. @experimental */
1629
+ stickyHeader?: boolean | undefined;
1630
+ /** Accessible name for the frame when it overflows. Defaults to the table region message. @experimental */
1631
+ regionLabel?: string | undefined;
1048
1632
  }
1049
1633
  /**
1050
1634
  * DataTable — outer wrapper. Children are typically:
@@ -1110,8 +1694,14 @@ interface DataTableHeaderProps extends Omit<TableHeadProps, "sort" | "onSortChan
1110
1694
  /** Optional controlled sort state. When provided, `onSortChange` should
1111
1695
  * also be wired up — the header becomes fully controlled. */
1112
1696
  sort?: SortDirection | null;
1113
- /** Fires whenever the user clicks a sortable header. */
1114
- onSortChange?: (sort: SortDirection | null) => void;
1697
+ /** Fires whenever the user clicks a sortable header. The second argument
1698
+ * (PR 3) is `{ additive }` — Shift was held, so a multi-sort table adds a
1699
+ * secondary key. */
1700
+ onSortChange?: (sort: SortDirection | null, meta: TableSortChangeMeta) => void;
1701
+ /** 1-based rank in a multi-key sort (PR 3); shown beside the indicator. @experimental */
1702
+ sortIndex?: number | undefined;
1703
+ /** Direction an unsorted column starts in (PR 3). Default `asc`. @experimental */
1704
+ sortFirstDirection?: SortDirection | undefined;
1115
1705
  }
1116
1706
  /**
1117
1707
  * DataTableHeader — `<th scope="col">`; alias of `TableHead` that keeps the
@@ -1174,6 +1764,104 @@ interface DataTableCheckboxProps extends Omit<DataTableCellProps, "onChange" | "
1174
1764
  * column with no right padding to match `.row-checkbox` in the spec.
1175
1765
  */
1176
1766
  declare const DataTableCheckbox: React$1.ForwardRefExoticComponent<DataTableCheckboxProps & React$1.RefAttributes<HTMLTableCellElement>>;
1767
+ /** DataTableCellSecondary — alias of `TableCellSecondary`: a second line shown only in comfortable density (PR 3). */
1768
+ type DataTableCellSecondaryProps = TableCellSecondaryProps;
1769
+ declare const DataTableCellSecondary: React$1.ForwardRefExoticComponent<TableCellSecondaryProps & React$1.RefAttributes<HTMLSpanElement>>;
1770
+
1771
+ /** {@link useDataTableVirtualRows} options. @experimental */
1772
+ interface UseDataTableVirtualRowsOptions {
1773
+ /** Rows loaded so far. */
1774
+ count: number;
1775
+ /** The one scroll region (a `Table` wrapper or a `ListPageScroll`). */
1776
+ getScrollElement: () => HTMLElement | null;
1777
+ /** First-guess row height in px; real heights are measured. Default `44` (`--table-row-height`). */
1778
+ estimateSize?: ((index: number) => number) | undefined;
1779
+ /** Rows kept mounted beyond the viewport on each side. Default `15`. */
1780
+ overscan?: number | undefined;
1781
+ getItemKey?: ((index: number) => string | number) | undefined;
1782
+ }
1783
+ /** What {@link useDataTableVirtualRows} returns. @experimental */
1784
+ interface DataTableVirtualRows {
1785
+ /** The rows to render: `index` into your data, and `key`. */
1786
+ items: readonly {
1787
+ index: number;
1788
+ key: string | number;
1789
+ start: number;
1790
+ }[];
1791
+ /** Height of the spacer row before the first rendered row. */
1792
+ paddingTop: number;
1793
+ /** Height of the spacer row after the last rendered row. */
1794
+ paddingBottom: number;
1795
+ totalSize: number;
1796
+ /** Ref callback for each rendered `<tr>` (needs `data-index={item.index}`). */
1797
+ measureElement: (element: Element | null) => void;
1798
+ scrollToIndex: (index: number) => void;
1799
+ }
1800
+ /**
1801
+ * Windowed rows for a `<table>`: render `paddingTop` / `paddingBottom` as
1802
+ * `DataTableSpacerRow`s around `items`.
1803
+ *
1804
+ * @experimental
1805
+ */
1806
+ declare function useDataTableVirtualRows({ count, getScrollElement, estimateSize, overscan, getItemKey, }: UseDataTableVirtualRowsOptions): DataTableVirtualRows;
1807
+ /** @experimental */
1808
+ interface DataTableSpacerRowProps extends React.HTMLAttributes<HTMLTableRowElement> {
1809
+ /** Spacer height in px; renders nothing at 0. */
1810
+ height: number;
1811
+ /** The table's column count. */
1812
+ colSpan: number;
1813
+ }
1814
+ /**
1815
+ * DataTableSpacerRow — the empty, `aria-hidden` row that stands in for the
1816
+ * rows a virtualised table has not mounted.
1817
+ *
1818
+ * @experimental
1819
+ */
1820
+ declare const DataTableSpacerRow: React$1.ForwardRefExoticComponent<DataTableSpacerRowProps & React$1.RefAttributes<HTMLTableRowElement>>;
1821
+ /** @experimental */
1822
+ interface DataTableLoadMoreProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "children"> {
1823
+ /** More rows exist beyond what is loaded. */
1824
+ hasMore: boolean;
1825
+ /** A page is in flight — the sentinel and button do not fire again. */
1826
+ loading?: boolean | undefined;
1827
+ /** Failed page message. Pauses automatic loading; the visible retry button remains available. */
1828
+ error?: ReactNode;
1829
+ /** Fetch the next page (cursor, offset — the consumer's business). */
1830
+ onLoadMore: () => void;
1831
+ /** Rows loaded so far, for the end-of-list status. */
1832
+ loadedCount?: number | undefined;
1833
+ /** Total matching rows, when known: "240 of 1,240 loaded". */
1834
+ totalCount?: number | undefined;
1835
+ /** The scroll region the sentinel is observed in. Default: the viewport. */
1836
+ root?: RefObject<HTMLElement | null> | undefined;
1837
+ /** How far before the end to start loading. Default `400px`. */
1838
+ rootMargin?: string | undefined;
1839
+ locale?: string | undefined;
1840
+ }
1841
+ /**
1842
+ * DataTableLoadMore — the foot of an infinite list: a sentinel that loads
1843
+ * the next page as it scrolls into view, a visible "Load more" button for
1844
+ * keyboard and no-IntersectionObserver users, and a polite status ("All 1,240
1845
+ * loaded" / "240 of 1,240 loaded").
1846
+ *
1847
+ * @experimental
1848
+ */
1849
+ declare const DataTableLoadMore: React$1.ForwardRefExoticComponent<DataTableLoadMoreProps & React$1.RefAttributes<HTMLDivElement>>;
1850
+ /** {@link useScrollRestoration} options. @experimental */
1851
+ interface UseScrollRestorationOptions {
1852
+ /** Restore only once this is true — e.g. once the restored rows are loaded. Default `true`. */
1853
+ ready?: boolean | undefined;
1854
+ /** Storage. Default `sessionStorage` (per tab, cleared with it). */
1855
+ storage?: Pick<Storage, "getItem" | "setItem"> | undefined;
1856
+ }
1857
+ /**
1858
+ * Saves a scroll region's `scrollTop` under `key` and restores it once on
1859
+ * mount (after `ready`), so "back" from a record returns to the same rows.
1860
+ * SSR-safe: storage is read only in an effect.
1861
+ *
1862
+ * @experimental
1863
+ */
1864
+ declare function useScrollRestoration(key: string, ref: RefObject<HTMLElement | null>, options?: UseScrollRestorationOptions): void;
1177
1865
 
1178
1866
  /**
1179
1867
  * DataTableView — config-driven table on top of the composition
@@ -1209,6 +1897,16 @@ interface DataTableViewColumn<Row extends TableRowData> {
1209
1897
  sortValue?: (row: Row) => string | number | null | undefined;
1210
1898
  /** Custom cell renderer; defaults to the raw field value. */
1211
1899
  render?: (row: Row) => ReactNode;
1900
+ /** Right-aligned tabular figures for money and counts (PR 3). @experimental */
1901
+ numeric?: boolean | undefined;
1902
+ /** A second, quieter line under the cell, shown only in the Detailed density (PR 3). @experimental */
1903
+ secondary?: ((row: Row) => ReactNode) | undefined;
1904
+ /** Direction an unsorted column starts in — `desc` for dates and money (PR 3). @experimental */
1905
+ sortFirstDirection?: SortDirection | undefined;
1906
+ /** `false` keeps the column out of the header menu's Hide (PR 3). Default `true`. @experimental */
1907
+ hideable?: boolean | undefined;
1908
+ /** A group's subtotal for this column, under it in each group header (PR 3). @experimental */
1909
+ subtotal?: ((rows: readonly Row[]) => ReactNode) | undefined;
1212
1910
  }
1213
1911
  interface DataTableViewFilter<Row extends TableRowData> {
1214
1912
  key: string;
@@ -1297,8 +1995,63 @@ interface DataTableViewProps<Row extends TableRowData> {
1297
1995
  /** Opt in to row selection. Omit it and the table renders exactly as before. */
1298
1996
  selection?: DataTableViewSelection<Row>;
1299
1997
  className?: string;
1998
+ /** Show all loaded rows and a lazy-load sentinel inside this scroll frame instead of numbered pagination. @experimental */
1999
+ loadMore?: Omit<DataTableLoadMoreProps, "root"> | undefined;
2000
+ /** Shift-click (Shift+Enter) a header to add a ranked secondary sort. @experimental */
2001
+ multiSort?: boolean | undefined;
2002
+ /** Controlled sort keys, primary first (with `multiSort`). @experimental */
2003
+ multiSorting?: DataTableMultiSortingState | undefined;
2004
+ onMultiSortingChange?: ((multiSorting: DataTableMultiSortingState) => void) | undefined;
2005
+ /** A per-column options menu (sort, move, hide, pin, autosize, reset) in each header. @experimental */
2006
+ columnMenu?: boolean | undefined;
2007
+ /** Pointer and keyboard column resize. @experimental */
2008
+ resizableColumns?: boolean | undefined;
2009
+ /** Column ids in display order. @experimental */
2010
+ columnOrder?: DataTableColumnOrderState | undefined;
2011
+ defaultColumnOrder?: DataTableColumnOrderState | undefined;
2012
+ onColumnOrderChange?: ((columnOrder: DataTableColumnOrderState) => void) | undefined;
2013
+ /** Column id → shown. @experimental */
2014
+ columnVisibility?: DataTableColumnVisibilityState | undefined;
2015
+ defaultColumnVisibility?: DataTableColumnVisibilityState | undefined;
2016
+ onColumnVisibilityChange?: ((columnVisibility: DataTableColumnVisibilityState) => void) | undefined;
2017
+ /** Column id → width in px (with `resizableColumns`). @experimental */
2018
+ columnWidths?: DataTableColumnWidthsState | undefined;
2019
+ defaultColumnWidths?: DataTableColumnWidthsState | undefined;
2020
+ onColumnWidthsChange?: ((columnWidths: DataTableColumnWidthsState) => void) | undefined;
2021
+ /** Columns pinned to the start edge. @experimental */
2022
+ columnPinning?: DataTableColumnPinningState | undefined;
2023
+ defaultColumnPinning?: DataTableColumnPinningState | undefined;
2024
+ onColumnPinningChange?: ((columnPinning: DataTableColumnPinningState) => void) | undefined;
2025
+ /**
2026
+ * Keep the first column in view while the table scrolls sideways. With
2027
+ * `selection` the first column is the checkbox column. @experimental
2028
+ */
2029
+ stickyFirstColumn?: boolean | undefined;
2030
+ /** Keep column headers visible while this frame scrolls vertically. @experimental */
2031
+ stickyHeader?: boolean | undefined;
2032
+ /** Accessible name for the keyboard-scrollable region, present only when overflowing. @experimental */
2033
+ regionLabel?: string | undefined;
2034
+ /** Row density scope; `compact` hides each column's `secondary` line. @experimental */
2035
+ density?: ThemeDensity | undefined;
2036
+ /**
2037
+ * Group the current page's rows by this dimension (a `DisplayMenu` grouping
2038
+ * value); `null` / `"none"` is ungrouped. Groups render as collapsible
2039
+ * `TableGroupRow`s with a count and each column's `subtotal`. @experimental
2040
+ */
2041
+ groupBy?: string | null | undefined;
2042
+ /** A row's group under `groupBy`. Default: the `groupBy` field as text. @experimental */
2043
+ getGroupKey?: ((row: Row, groupBy: string) => string) | undefined;
2044
+ /** A group header's label. Default: the group key. @experimental */
2045
+ renderGroupLabel?: ((groupKey: string, rows: readonly Row[]) => ReactNode) | undefined;
2046
+ /** Order of the groups. Default: first met. @experimental */
2047
+ compareGroups?: ((a: string, b: string) => number) | undefined;
2048
+ collapsedGroups?: readonly string[] | undefined;
2049
+ defaultCollapsedGroups?: readonly string[] | undefined;
2050
+ onCollapsedGroupsChange?: ((collapsed: readonly string[]) => void) | undefined;
2051
+ /** Remember collapsed groups per dimension under this key. @experimental */
2052
+ groupPersistKey?: string | undefined;
1300
2053
  }
1301
- declare function DataTableView<Row extends TableRowData>({ columns, data, filters, searchKeys, searchPlaceholder, initialSort, sorting: sortingProp, onSortingChange, page: pageProp, onPageChange, search: searchProp, onSearchChange, onRowClick, rowKey, pageSize, hideOnSinglePage, itemLabel, selection, className, }: DataTableViewProps<Row>): react_jsx_runtime.JSX.Element;
2054
+ declare function DataTableView<Row extends TableRowData>({ columns, data, filters, searchKeys, searchPlaceholder, initialSort, sorting: sortingProp, onSortingChange, page: pageProp, onPageChange, search: searchProp, onSearchChange, onRowClick, rowKey, pageSize, hideOnSinglePage, itemLabel, selection, className, loadMore, multiSort, multiSorting, onMultiSortingChange, columnMenu, resizableColumns, columnOrder, defaultColumnOrder, onColumnOrderChange, columnVisibility, defaultColumnVisibility, onColumnVisibilityChange, columnWidths, defaultColumnWidths, onColumnWidthsChange, columnPinning, defaultColumnPinning, onColumnPinningChange, stickyFirstColumn, stickyHeader, regionLabel, density, groupBy, getGroupKey, renderGroupLabel, compareGroups, collapsedGroups, defaultCollapsedGroups, onCollapsedGroupsChange, groupPersistKey, }: DataTableViewProps<Row>): react_jsx_runtime.JSX.Element;
1302
2055
  /**
1303
2056
  * EmptyValue — the em-dash placeholder for a cell with no value. Generic:
1304
2057
  * no copy, no product tone.
@@ -1359,4 +2112,4 @@ declare function MoneyCell({ value }: {
1359
2112
  value?: number | null;
1360
2113
  }): react_jsx_runtime.JSX.Element;
1361
2114
 
1362
- export { type DataTableProps as $, Assignee as A, type BadgeProps as B, type CardSlot as C, Dash as D, DataTable as E, type FileKind as F, DataTableBody as G, type DataTableBodyProps as H, type InputSlot as I, DataTableCell as J, DataTableCellDue as K, type DataTableCellDueProps as L, MoneyCell as M, type NumberInputSlot as N, DataTableCellId as O, type PhoneFieldSlot as P, DataTableCellMono as Q, DataTableCellName as R, type SelectSize as S, TagsCell as T, type DataTableCellProps as U, DataTableCheckbox as V, type DataTableCheckboxProps as W, DataTableHead as X, type DataTableHeadProps as Y, DataTableHeader as Z, type DataTableHeaderProps as _, type ServiceTone as a, type TableBodyProps as a$, DataTableResultsCount as a0, type DataTableResultsCountProps as a1, DataTableRow as a2, type DataTableRowProps as a3, DataTableSearch as a4, type DataTableSearchProps as a5, DataTableSpacer as a6, type DataTableSpacerProps as a7, DataTableToolbar as a8, type DataTableToolbarProps as a9, SelectContent as aA, type SelectContentProps as aB, SelectGroup as aC, SelectItem as aD, SelectLabel as aE, type SelectOption as aF, type SelectProps as aG, SelectRoot as aH, SelectScrollDownButton as aI, SelectScrollUpButton as aJ, SelectSeparator as aK, type SelectSlot as aL, SelectTrigger as aM, type SelectTriggerProps as aN, SelectValue as aO, type SheetSlot as aP, type ShellSlot as aQ, type SideDrawerSlot as aR, type SidebarBrandSwitcherSlot as aS, type SidebarSlot as aT, type SortDirection as aU, type StackSlot as aV, type StatusBadgeSlot as aW, type SurfaceSlot as aX, type SwitchSlot as aY, Table as aZ, TableBody as a_, DataTableView as aa, type DataTableViewColumn as ab, type DataTableViewFilter as ac, type DataTableViewProps as ad, type DataTableViewSelection as ae, type DataTableViewSort as af, type DialogSlot as ag, type DropdownMenuSlot as ah, EmptyValue as ai, type FieldSlot as aj, type FieldsetSlot as ak, FileChip as al, type FileChipProps as am, type HeadingSlot as an, type IconButtonSlot as ao, type InlineSlot as ap, type KbdSlot as aq, type LabelSlot as ar, type LinkButtonSlot as as, type PaginationSlot as at, type PopoverSlot as au, type PressableSlot as av, type RadioGroupSlot as aw, SERVICE_TONES as ax, Select as ay, type SelectClassNames as az, StagePill as b, TableCaption as b0, type TableCaptionProps as b1, TableCell as b2, type TableCellAlign as b3, type TableCellCommonProps as b4, type TableCellProps as b5, TableFooter as b6, type TableFooterProps as b7, TableGroupRow as b8, type TableGroupRowProps as b9, TableHead as ba, type TableHeadProps as bb, TableHeader as bc, type TableHeaderProps as bd, type TableHeaderStyle as be, TableRow as bf, type TableRowData as bg, type TableRowProps as bh, type TableSlot as bi, type TableSortDirection as bj, type TableStickyEdge as bk, type TableTone as bl, type TextSlot as bm, type ThemeBrand as bn, type ThemeDirection as bo, type ThemeScheme as bp, ThemeScope as bq, type ThemeScopeProps as br, type ThemeScopeValue as bs, type ToastSlot as bt, type TooltipSlot as bu, badgeVariants as bv, resolveBadgeAppearance as bw, serviceToneLabel as bx, serviceToneStyle as by, type AvatarSlot as c, type FileUploadSlot as d, type SearchInputSlot as e, type ThemeDensity as f, type TextareaSlot as g, type BadgeSize as h, type BadgeShape as i, type DataTableSlot as j, type TableProps as k, type AlertDialogSlot as l, Badge as m, type BadgeAppearance as n, type BadgeAppearanceInput as o, type BadgeLegacyVariant as p, type BadgeSlot as q, type BadgeVariant as r, type BadgeVariantsProps as s, type ButtonSlot as t, type CheckboxSlot as u, type ChipSlot as v, type CodeSlot as w, type ComboboxSlot as x, type CommandSlot as y, type ContextMenuSlot as z };
2115
+ export { DataTableCheckbox as $, Assignee as A, type BadgeProps as B, type CardSlot as C, Dash as D, type CommandSlot as E, type FileKind as F, type ContextMenuSlot as G, DataTable as H, type InputSlot as I, type DataTableAccessor as J, type DataTableAriaSort as K, DataTableBody as L, MoneyCell as M, type NumberInputSlot as N, type DataTableBodyProps as O, type PhoneFieldSlot as P, DataTableCell as Q, DataTableCellDue as R, type SelectSize as S, TagsCell as T, type DataTableCellDueProps as U, DataTableCellId as V, DataTableCellMono as W, DataTableCellName as X, type DataTableCellProps as Y, DataTableCellSecondary as Z, type DataTableCellSecondaryProps as _, type ServiceTone as a, type KbdSlot as a$, type DataTableCheckboxProps as a0, type DataTableColumn as a1, type DataTableColumnOrderApi as a2, type DataTableColumnOrderState as a3, type DataTableColumnPinningApi as a4, type DataTableColumnPinningState as a5, type DataTableColumnVisibilityApi as a6, type DataTableColumnVisibilityState as a7, type DataTableColumnWidthsApi as a8, type DataTableColumnWidthsState as a9, type DataTableSortingApi as aA, type DataTableSortingState as aB, DataTableSpacer as aC, type DataTableSpacerProps as aD, DataTableSpacerRow as aE, type DataTableSpacerRowProps as aF, type DataTableState as aG, DataTableToolbar as aH, type DataTableToolbarProps as aI, DataTableView as aJ, type DataTableViewColumn as aK, type DataTableViewFilter as aL, type DataTableViewProps as aM, type DataTableViewSelection as aN, type DataTableViewSort as aO, type DataTableVirtualRows as aP, type DialogSlot as aQ, type DropdownMenuSlot as aR, EmptyValue as aS, type FieldSlot as aT, type FieldsetSlot as aU, FileChip as aV, type FileChipProps as aW, type FilterChipsSlot as aX, type HeadingSlot as aY, type IconButtonSlot as aZ, type InlineSlot as a_, type DataTableFilterDefinition as aa, type DataTableFilterValue as ab, type DataTableFiltersApi as ac, type DataTableFiltersState as ad, DataTableHead as ae, type DataTableHeadProps as af, DataTableHeader as ag, type DataTableHeaderProps as ah, DataTableLoadMore as ai, type DataTableLoadMoreProps as aj, type DataTableMultiSortingState as ak, type DataTablePaginationApi as al, type DataTablePaginationState as am, type DataTableProps as an, DataTableResultsCount as ao, type DataTableResultsCountProps as ap, DataTableRow as aq, type DataTableRowProps as ar, DataTableSearch as as, type DataTableSearchApi as at, type DataTableSearchProps as au, type DataTableSelectionApi as av, type DataTableSelectionState as aw, type DataTableSortDirection as ax, type DataTableSortToggleOptions as ay, type DataTableSortValue as az, StagePill as b, type TableStickyEdge as b$, type LabelSlot as b0, type LinkButtonSlot as b1, type ListPageSlot as b2, type PaginationSlot as b3, type PopoverSlot as b4, type PressableSlot as b5, type RadioGroupSlot as b6, SERVICE_TONES as b7, Select as b8, type SelectClassNames as b9, Table as bA, TableBody as bB, type TableBodyProps as bC, TableCaption as bD, type TableCaptionProps as bE, TableCell as bF, type TableCellAlign as bG, type TableCellCommonProps as bH, type TableCellProps as bI, TableCellSecondary as bJ, type TableCellSecondaryProps as bK, TableFooter as bL, type TableFooterProps as bM, TableGroupRow as bN, type TableGroupRowProps as bO, type TableGroupRowSubtotal as bP, TableHead as bQ, type TableHeadProps as bR, TableHeader as bS, type TableHeaderProps as bT, type TableHeaderStyle as bU, TableRow as bV, type TableRowData as bW, type TableRowProps as bX, type TableSlot as bY, type TableSortChangeMeta as bZ, type TableSortDirection as b_, SelectContent as ba, type SelectContentProps as bb, SelectGroup as bc, SelectItem as bd, SelectLabel as be, type SelectOption as bf, type SelectProps as bg, SelectRoot as bh, SelectScrollDownButton as bi, SelectScrollUpButton as bj, SelectSeparator as bk, type SelectSlot as bl, SelectTrigger as bm, type SelectTriggerProps as bn, SelectValue as bo, type SheetSlot as bp, type ShellSlot as bq, type SideDrawerSlot as br, type SidebarBrandSwitcherSlot as bs, type SidebarSlot as bt, type SortDirection as bu, type StackSlot as bv, type StatStripSlot as bw, type StatusBadgeSlot as bx, type SurfaceSlot as by, type SwitchSlot as bz, type AvatarSlot as c, type TableTone as c0, type TextSlot as c1, type ThemeBrand as c2, type ThemeDirection as c3, type ThemeScheme as c4, ThemeScope as c5, type ThemeScopeProps as c6, type ThemeScopeValue as c7, type ToastSlot as c8, type TooltipSlot as c9, type UseDataTableOptions as ca, type UseDataTableVirtualRowsOptions as cb, type UseScrollRestorationOptions as cc, badgeVariants as cd, compareSortValues as ce, nextSortDirection as cf, resolveBadgeAppearance as cg, serviceToneLabel as ch, serviceToneStyle as ci, useDataTable as cj, useDataTableVirtualRows as ck, useScrollRestoration as cl, type FileUploadSlot as d, type SearchInputSlot as e, type ThemeDensity as f, type TextareaSlot as g, type BadgeSize as h, type BadgeShape as i, type DataTableController as j, type DataTableSlot as k, type TableProps as l, type DataTableRowModel as m, type AlertDialogSlot as n, Badge as o, type BadgeAppearance as p, type BadgeAppearanceInput as q, type BadgeLegacyVariant as r, type BadgeSlot as s, type BadgeVariant as t, type BadgeVariantsProps as u, type ButtonSlot as v, type CheckboxSlot as w, type ChipSlot as x, type CodeSlot as y, type ComboboxSlot as z };