@alfadocs/ui-kit-debug 1.127.1 → 1.128.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.
Files changed (131) hide show
  1. package/dist/_chunks/{bill-line-table-BRxX0Awq.js → bill-line-table-CzYzg-Qh.js} +8 -5
  2. package/dist/_chunks/bill-line-table-CzYzg-Qh.js.map +1 -0
  3. package/dist/_chunks/{calendar-appointment-editor-dialog-B-zYgCgH.js → calendar-appointment-editor-dialog-CGDDGMdo.js} +2 -2
  4. package/dist/_chunks/{calendar-appointment-editor-dialog-B-zYgCgH.js.map → calendar-appointment-editor-dialog-CGDDGMdo.js.map} +1 -1
  5. package/dist/_chunks/{data-grid-bzvkQ3kc.js → data-grid-C9xlUMLt.js} +9 -5
  6. package/dist/_chunks/data-grid-C9xlUMLt.js.map +1 -0
  7. package/dist/_chunks/{default-tabs-yEfqAPuT.js → default-tabs-DOuHEKI5.js} +3 -3
  8. package/dist/_chunks/{default-tabs-yEfqAPuT.js.map → default-tabs-DOuHEKI5.js.map} +1 -1
  9. package/dist/_chunks/{invoice-upload-list-CgS_TBuX.js → invoice-upload-list-tJY7W1g_.js} +6 -4
  10. package/dist/_chunks/invoice-upload-list-tJY7W1g_.js.map +1 -0
  11. package/dist/_chunks/{notes-panel-BOwlTz2-.js → notes-panel-n1JFNQ5u.js} +2 -2
  12. package/dist/_chunks/{notes-panel-BOwlTz2-.js.map → notes-panel-n1JFNQ5u.js.map} +1 -1
  13. package/dist/_chunks/{rich-text-editor-BLEdXJ0l.js → rich-text-editor-TnX0SYdq.js} +1866 -1766
  14. package/dist/_chunks/rich-text-editor-TnX0SYdq.js.map +1 -0
  15. package/dist/_chunks/{toolbar-Co46MEn9.js → toolbar-CC-Ls_eC.js} +2 -2
  16. package/dist/_chunks/{toolbar-Co46MEn9.js.map → toolbar-CC-Ls_eC.js.map} +1 -1
  17. package/dist/agent-catalog.json +1 -1
  18. package/dist/browser-support.js +1 -1
  19. package/dist/components/bill-line-table/bill-line-table.columns.d.ts +7 -3
  20. package/dist/components/bill-line-table/bill-line-table.columns.d.ts.map +1 -1
  21. package/dist/components/bill-line-table/index.js +1 -1
  22. package/dist/components/bill-table/index.js +1 -1
  23. package/dist/components/data-grid/data-grid.variants.d.ts.map +1 -1
  24. package/dist/components/data-grid/index.js +2 -2
  25. package/dist/components/invoice-upload-list/columns.d.ts.map +1 -1
  26. package/dist/components/invoice-upload-list/index.js +1 -1
  27. package/dist/components/notes-panel/index.js +1 -1
  28. package/dist/components/rich-text-editor/editor-toolbar.d.ts +1 -0
  29. package/dist/components/rich-text-editor/editor-toolbar.d.ts.map +1 -1
  30. package/dist/components/rich-text-editor/index.js +1 -1
  31. package/dist/components/rich-text-editor/rich-text-editor.d.ts.map +1 -1
  32. package/dist/core.css +1 -1
  33. package/dist/host-legacy.css +22 -0
  34. package/dist/i18n/locales/ar.d.ts +7 -0
  35. package/dist/i18n/locales/ar.d.ts.map +1 -1
  36. package/dist/i18n/locales/ar.js +7 -0
  37. package/dist/i18n/locales/ar.js.map +1 -1
  38. package/dist/i18n/locales/de.d.ts +7 -0
  39. package/dist/i18n/locales/de.d.ts.map +1 -1
  40. package/dist/i18n/locales/de.js +7 -0
  41. package/dist/i18n/locales/de.js.map +1 -1
  42. package/dist/i18n/locales/el.d.ts +7 -0
  43. package/dist/i18n/locales/el.d.ts.map +1 -1
  44. package/dist/i18n/locales/el.js +7 -0
  45. package/dist/i18n/locales/el.js.map +1 -1
  46. package/dist/i18n/locales/en.d.ts +7 -0
  47. package/dist/i18n/locales/en.d.ts.map +1 -1
  48. package/dist/i18n/locales/en.js +7 -0
  49. package/dist/i18n/locales/en.js.map +1 -1
  50. package/dist/i18n/locales/es.d.ts +7 -0
  51. package/dist/i18n/locales/es.d.ts.map +1 -1
  52. package/dist/i18n/locales/es.js +7 -0
  53. package/dist/i18n/locales/es.js.map +1 -1
  54. package/dist/i18n/locales/fr.d.ts +7 -0
  55. package/dist/i18n/locales/fr.d.ts.map +1 -1
  56. package/dist/i18n/locales/fr.js +7 -0
  57. package/dist/i18n/locales/fr.js.map +1 -1
  58. package/dist/i18n/locales/hi.d.ts +7 -0
  59. package/dist/i18n/locales/hi.d.ts.map +1 -1
  60. package/dist/i18n/locales/hi.js +7 -0
  61. package/dist/i18n/locales/hi.js.map +1 -1
  62. package/dist/i18n/locales/it.d.ts +7 -0
  63. package/dist/i18n/locales/it.d.ts.map +1 -1
  64. package/dist/i18n/locales/it.js +7 -0
  65. package/dist/i18n/locales/it.js.map +1 -1
  66. package/dist/i18n/locales/ja.d.ts +7 -0
  67. package/dist/i18n/locales/ja.d.ts.map +1 -1
  68. package/dist/i18n/locales/ja.js +7 -0
  69. package/dist/i18n/locales/ja.js.map +1 -1
  70. package/dist/i18n/locales/nl.d.ts +7 -0
  71. package/dist/i18n/locales/nl.d.ts.map +1 -1
  72. package/dist/i18n/locales/nl.js +7 -0
  73. package/dist/i18n/locales/nl.js.map +1 -1
  74. package/dist/i18n/locales/pl.d.ts +7 -0
  75. package/dist/i18n/locales/pl.d.ts.map +1 -1
  76. package/dist/i18n/locales/pl.js +7 -0
  77. package/dist/i18n/locales/pl.js.map +1 -1
  78. package/dist/i18n/locales/pt.d.ts +7 -0
  79. package/dist/i18n/locales/pt.d.ts.map +1 -1
  80. package/dist/i18n/locales/pt.js +7 -0
  81. package/dist/i18n/locales/pt.js.map +1 -1
  82. package/dist/i18n/locales/ro.d.ts +7 -0
  83. package/dist/i18n/locales/ro.d.ts.map +1 -1
  84. package/dist/i18n/locales/ro.js +7 -0
  85. package/dist/i18n/locales/ro.js.map +1 -1
  86. package/dist/i18n/locales/ru.d.ts +7 -0
  87. package/dist/i18n/locales/ru.d.ts.map +1 -1
  88. package/dist/i18n/locales/ru.js +7 -0
  89. package/dist/i18n/locales/ru.js.map +1 -1
  90. package/dist/i18n/locales/sq.d.ts +7 -0
  91. package/dist/i18n/locales/sq.d.ts.map +1 -1
  92. package/dist/i18n/locales/sq.js +7 -0
  93. package/dist/i18n/locales/sq.js.map +1 -1
  94. package/dist/i18n/locales/sv.d.ts +7 -0
  95. package/dist/i18n/locales/sv.d.ts.map +1 -1
  96. package/dist/i18n/locales/sv.js +7 -0
  97. package/dist/i18n/locales/sv.js.map +1 -1
  98. package/dist/i18n/locales/tr.d.ts +7 -0
  99. package/dist/i18n/locales/tr.d.ts.map +1 -1
  100. package/dist/i18n/locales/tr.js +7 -0
  101. package/dist/i18n/locales/tr.js.map +1 -1
  102. package/dist/i18n/locales/zh.d.ts +7 -0
  103. package/dist/i18n/locales/zh.d.ts.map +1 -1
  104. package/dist/i18n/locales/zh.js +7 -0
  105. package/dist/i18n/locales/zh.js.map +1 -1
  106. package/dist/index.js +8 -8
  107. package/dist/locales/ar.json +7 -0
  108. package/dist/locales/de.json +7 -0
  109. package/dist/locales/el.json +7 -0
  110. package/dist/locales/en.json +7 -0
  111. package/dist/locales/es.json +7 -0
  112. package/dist/locales/fr.json +7 -0
  113. package/dist/locales/hi.json +7 -0
  114. package/dist/locales/it.json +7 -0
  115. package/dist/locales/ja.json +7 -0
  116. package/dist/locales/nl.json +7 -0
  117. package/dist/locales/pl.json +7 -0
  118. package/dist/locales/pt.json +7 -0
  119. package/dist/locales/ro.json +7 -0
  120. package/dist/locales/ru.json +7 -0
  121. package/dist/locales/sq.json +7 -0
  122. package/dist/locales/sv.json +7 -0
  123. package/dist/locales/tr.json +7 -0
  124. package/dist/locales/zh.json +7 -0
  125. package/dist/patterns/calendar/index.js +1 -1
  126. package/dist/tokens.css +1 -1
  127. package/package.json +1 -1
  128. package/dist/_chunks/bill-line-table-BRxX0Awq.js.map +0 -1
  129. package/dist/_chunks/data-grid-bzvkQ3kc.js.map +0 -1
  130. package/dist/_chunks/invoice-upload-list-CgS_TBuX.js.map +0 -1
  131. package/dist/_chunks/rich-text-editor-BLEdXJ0l.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"data-grid-bzvkQ3kc.js","sources":["../../src/components/data-grid/types.ts","../../src/components/data-grid/state.ts","../../src/components/data-grid/announcer.tsx","../../node_modules/@tanstack/react-table/dist/FlexRender.js","../../node_modules/@tanstack/store/dist/alien.js","../../node_modules/@tanstack/store/dist/atom.js","../../node_modules/@tanstack/store/dist/shallow.js","../../node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js","../../node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js","../../node_modules/use-sync-external-store/shim/index.js","../../node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.js","../../node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js","../../node_modules/use-sync-external-store/shim/with-selector.js","../../node_modules/@tanstack/react-store/dist/useSelector.js","../../node_modules/@tanstack/react-table/dist/Subscribe.js","../../node_modules/@tanstack/table-core/dist/core/reactivity/coreReactivityFeature.utils.js","../../node_modules/@tanstack/table-core/dist/core/reactivity/renderPhaseReactivity.js","../../node_modules/@tanstack/react-table/dist/reactivity.js","../../node_modules/@tanstack/table-core/dist/utils.js","../../node_modules/@tanstack/table-core/dist/core/cells/coreCellsFeature.utils.js","../../node_modules/@tanstack/table-core/dist/core/cells/coreCellsFeature.js","../../node_modules/@tanstack/table-core/dist/core/columns/constructColumn.js","../../node_modules/@tanstack/table-core/dist/core/featureStubs.js","../../node_modules/@tanstack/table-core/dist/core/columns/coreColumnsFeature.utils.js","../../node_modules/@tanstack/table-core/dist/core/columns/coreColumnsFeature.js","../../node_modules/@tanstack/table-core/dist/core/headers/constructHeader.js","../../node_modules/@tanstack/table-core/dist/core/headers/buildHeaderGroups.js","../../node_modules/@tanstack/table-core/dist/core/headers/coreHeadersFeature.utils.js","../../node_modules/@tanstack/table-core/dist/core/headers/coreHeadersFeature.js","../../node_modules/@tanstack/table-core/dist/core/rows/constructRow.js","../../node_modules/@tanstack/table-core/dist/core/row-models/createCoreRowModel.js","../../node_modules/@tanstack/table-core/dist/core/row-models/coreRowModelsFeature.utils.js","../../node_modules/@tanstack/table-core/dist/core/row-models/coreRowModelsFeature.js","../../node_modules/@tanstack/table-core/dist/core/cells/constructCell.js","../../node_modules/@tanstack/table-core/dist/core/rows/coreRowsFeature.utils.js","../../node_modules/@tanstack/table-core/dist/core/rows/coreRowsFeature.js","../../node_modules/@tanstack/table-core/dist/core/table/coreTablesFeature.utils.js","../../node_modules/@tanstack/table-core/dist/core/table/coreTablesFeature.js","../../node_modules/@tanstack/table-core/dist/core/coreFeatures.js","../../node_modules/@tanstack/table-core/dist/helpers/metaHelper.js","../../node_modules/@tanstack/table-core/dist/core/table/constructTable.js","../../node_modules/@tanstack/table-core/dist/features/column-filtering/columnFilteringFeature.utils.js","../../node_modules/@tanstack/table-core/dist/features/column-filtering/columnFilteringFeature.js","../../node_modules/@tanstack/table-core/dist/features/column-ordering/columnOrderingFeature.utils.js","../../node_modules/@tanstack/table-core/dist/features/column-ordering/columnOrderingFeature.js","../../node_modules/@tanstack/table-core/dist/features/column-pinning/columnPinningFeature.utils.js","../../node_modules/@tanstack/table-core/dist/features/column-pinning/orderByColumnPinning.js","../../node_modules/@tanstack/table-core/dist/features/column-pinning/columnPinningFeature.js","../../node_modules/@tanstack/table-core/dist/features/column-sizing/columnSizingFeature.utils.js","../../node_modules/@tanstack/table-core/dist/features/column-resizing/columnResizingFeature.utils.js","../../node_modules/@tanstack/table-core/dist/features/column-resizing/columnResizingFeature.js","../../node_modules/@tanstack/table-core/dist/features/column-sizing/columnSizingFeature.js","../../node_modules/@tanstack/table-core/dist/features/column-visibility/columnVisibilityFeature.utils.js","../../node_modules/@tanstack/table-core/dist/features/column-visibility/columnVisibilityFeature.js","../../node_modules/@tanstack/table-core/dist/features/column-filtering/filterFns.js","../../node_modules/@tanstack/table-core/dist/features/global-filtering/globalFilteringFeature.utils.js","../../node_modules/@tanstack/table-core/dist/features/global-filtering/globalFilteringFeature.js","../../node_modules/@tanstack/table-core/dist/features/row-expanding/rowExpandingFeature.utils.js","../../node_modules/@tanstack/table-core/dist/features/row-expanding/createExpandedRowModel.js","../../node_modules/@tanstack/table-core/dist/features/row-expanding/rowExpandingFeature.js","../../node_modules/@tanstack/table-core/dist/features/row-pagination/rowPaginationFeature.utils.js","../../node_modules/@tanstack/table-core/dist/features/row-pagination/rowPaginationFeature.js","../../node_modules/@tanstack/table-core/dist/features/row-selection/rowSelectionFeature.utils.js","../../node_modules/@tanstack/table-core/dist/features/row-selection/rowSelectionFeature.js","../../node_modules/@tanstack/table-core/dist/features/row-sorting/sortFns.js","../../node_modules/@tanstack/table-core/dist/features/row-sorting/rowSortingFeature.utils.js","../../node_modules/@tanstack/table-core/dist/features/row-sorting/rowSortingFeature.js","../../node_modules/@tanstack/table-core/dist/features/column-filtering/filterRowsUtils.js","../../node_modules/@tanstack/table-core/dist/features/column-filtering/createFilteredRowModel.js","../../node_modules/@tanstack/table-core/dist/features/row-pagination/createPaginatedRowModel.js","../../node_modules/@tanstack/table-core/dist/features/row-sorting/createSortedRowModel.js","../../node_modules/@tanstack/react-table/dist/useTable.js","../../src/components/data-grid/filter-fns.ts","../../src/components/data-grid/features.ts","../../src/components/data-grid/columns.ts","../../src/components/data-grid/data-grid.variants.ts","../../src/components/data-grid/editors.tsx","../../src/components/data-grid/keyboard.ts","../../src/components/data-grid/body.tsx","../../src/components/data-grid/data-grid.agent.ts","../../src/components/data-grid/footer.tsx","../../src/components/data-grid/filters/filter-panels.tsx","../../src/components/data-grid/filters/filter-trigger.tsx","../../src/components/data-grid/header.tsx","../../src/components/data-grid/pager.tsx","../../src/components/data-grid/print.ts","../../src/components/data-grid/states.tsx","../../src/components/data-grid/export-snapshot.ts","../../src/components/data-grid/selection.ts","../../src/components/data-grid/handle.ts","../../src/components/data-grid/persistence.ts","../../src/components/data-grid/responsive.ts","../../src/components/data-grid/toolbar-seam.ts","../../src/components/data-grid/use-data-grid-engine.ts","../../src/components/data-grid/virtual-rows.ts","../../src/components/data-grid/data-grid.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* DataGrid: the typed contract for Phase 1. */\n/* */\n/* Every public type of DataGrid, and the internal interfaces the */\n/* implementation files share. Types and contract constants only. Frozen */\n/* for the parallel build: change it only through the lead. */\n/* */\n/* Rules this file keeps: */\n/* - No TanStack type in a public type. Kit shapes in, kit shapes out; */\n/* the engine converts (JSDoc names the v9 API behind each member). */\n/* - Additive only. Today's props (columns, rows, getRowId, caption) and */\n/* column fields (id, header, headerLabel, cell, footer, align, pin) */\n/* keep their meaning, so care-plan-margin compiles unchanged. */\n/* - Only `row.id` (from `getRowId`) may reach the DOM. */\n/* */\n/* v9 paths below are relative to */\n/* node_modules/@tanstack/table-core/dist/ (TanStack Table 9.3.1). */\n/* -------------------------------------------------------------------- */\n\nimport type { HTMLAttributes, ReactNode } from 'react';\nimport type { ButtonProps } from '../button/button';\nimport type { IconButtonProps } from '../button/icon-button';\nimport type { EmptyStateHeadingLevel } from '../empty-state';\nimport type { NumberInputMode, NumberInputValidity } from '../number-input';\nimport type {\n DateRangeFilterModel,\n NumberFilterModel,\n NumberFilterOperator,\n SelectFilterModel,\n TableExportSnapshot,\n TableToolbarSeam,\n TextFilterModel,\n TextFilterOperator,\n ToolbarActionContext,\n} from '../_shared/table-toolbar/seam';\n\n/* ================================================================== */\n/* Contract constants */\n/* ================================================================== */\n\n/**\n * Rows are virtualised when more than this many body items (rows plus open\n * detail panels, after filters, sorting, expansion and paging) would render.\n * 100 = the largest offered page size, so a paged grid always keeps every row\n * in the DOM (find in page, print, screen-reader table navigation); also the\n * kit's existing number (`transcript-panel.tsx:81`, `08-third-party.mdx:25`)\n * and well inside the PRS ceiling of 500 (`19-performance.mdx:30`).\n */\nexport const DATA_GRID_VIRTUALIZE_ABOVE = 100;\n\n/** Default rows per page when `pagination` is on. */\nexport const DATA_GRID_DEFAULT_PAGE_SIZE = 25;\n\n/** Default page-size choices. The largest equals `DATA_GRID_VIRTUALIZE_ABOVE`. */\nexport const DATA_GRID_PAGE_SIZE_OPTIONS: readonly number[] = [25, 50, 100];\n\n/** Default cap on sort levels (v9 `maxMultiSortColCount`,\n * `features/row-sorting/rowSortingFeature.types.d.ts:193`). */\nexport const DATA_GRID_MAX_SORT_LEVELS = 3;\n\n/**\n * Container inline sizes (px) at which `responsiveTier` 1, 2 and 3 columns\n * appear: PatientTable's tiers (`patient-table/use-responsive-columns.ts:88-93`).\n * Measured on the grid's own root with a ResizeObserver, not the viewport.\n */\nexport const DATA_GRID_RESPONSIVE_BREAKPOINTS = [640, 900, 1200] as const;\n\n/** localStorage key prefix for saved column state: `<prefix><gridId>`.\n * Distinct from DataTable's `data-table-col-state:` (`data-table.tsx:293`). */\nexport const DATA_GRID_COLUMN_STATE_PREFIX = 'data-grid-col-state:';\n\n/** Keyboard resize step on the separator (Arrow keys); Shift multiplies by 4. */\nexport const DATA_GRID_RESIZE_STEP_PX = 16;\n\n/* ================================================================== */\n/* Filter models (kit vocabulary, shared with DataTable) */\n/* ================================================================== */\n\nexport type DataGridTextFilterModel = TextFilterModel;\nexport type DataGridNumberFilterModel = NumberFilterModel;\nexport type DataGridSelectFilterModel = SelectFilterModel;\nexport type DataGridDateRangeFilterModel = DateRangeFilterModel;\nexport type DataGridTextFilterOperator = TextFilterOperator;\nexport type DataGridNumberFilterOperator = NumberFilterOperator;\n\n/** A model DataGrid evaluates on a column in client mode. */\nexport type DataGridColumnFilterModel =\n | TextFilterModel\n | NumberFilterModel\n | SelectFilterModel\n | DateRangeFilterModel;\n\n/**\n * Every active filter, keyed by column id: the same shape as\n * `DataTableHandle.getFilter()`, so DataGridTabs, DataTableTabs and agents\n * read one model.\n *\n * A key that names no column is a **host key**: a filter the host applies on\n * its server (HTP-7312 keeps the platform's advanced filters). DataGrid\n * carries it, reports it in `onFiltersChange` and `onQueryChange`, saves it in\n * tabs, shows it as a chip (label from `filterLabels`) and never evaluates it.\n * v9 sees only column keys (`columnFilters: { id, value }[]`,\n * `features/column-filtering/columnFilteringFeature.types.d.ts:21-28`).\n */\nexport type DataGridFilterModel = Record<string, unknown>;\n\n/* ================================================================== */\n/* Column definition */\n/* ================================================================== */\n\n/** A plain value the grid can sort, filter, search and export. Dates are\n * `Date` objects or ISO `YYYY-MM-DD` strings (calendar days). */\nexport type DataGridCellValue =\n | string\n | number\n | boolean\n | Date\n | null\n | undefined;\n\n/** Second argument of `cell`. Optional for callers: `cell(row)` still fits. */\nexport interface DataGridCellContext {\n /** `getRowId(row)`: the only row datum allowed in a DOM attribute. */\n rowId: string;\n /** 0-based position in display order (after filters and sorting, before\n * paging; expanded sub-rows included, detail panels not). v9\n * `row.getDisplayIndex()` (`core/rows/coreRowsFeature.types.d.ts:62`). */\n displayIndex: number;\n /** Sub-row depth; 0 for top-level rows. */\n depth: number;\n isSelected: boolean;\n /** `isRowReadOnly(row)` or the column's `edit.isEditable(row) === false`. */\n isReadOnly: boolean;\n /** Plain row name for visible text (\"Nitrile gloves M\"); \"Row 3\" under\n * privacy mode (see `getRowLabel`). Never put it in an attribute\n * (`aria-label`, `title`, `data-*`): name controls with\n * `inputLabelledBy`. */\n rowLabel: string;\n /** Plain column name (`headerLabel`, or `header` when it is a string). */\n columnLabel: string;\n /** Two ids: the column's visible header cell, then a `hidden` element in\n * this cell holding the row name (\"Quantity Nitrile gloves M\"). Pass it\n * as `aria-labelledby` on a control in the cell, so the row name stays\n * text and never becomes an attribute. Built from `useId`, indexes and\n * the encoded column id, never from row data. */\n inputLabelledBy: string;\n}\n\n/** Context for a function `footer` (the pinned totals row). */\nexport interface DataGridFooterContext<TData> {\n /** Client mode: every top-level row after filters, all pages (v9\n * `getFilteredRowModel().rows`, never `flatRows`), so a footer that sums\n * `rows` never counts a sub-row twice. Server mode: the current page's\n * top-level rows only. */\n rows: readonly TData[];\n /** Selected row ids (all pages), for \"selected total\" footers. */\n selectedRowIds: readonly string[];\n /** Which rows `rows` covers. */\n scope: 'all-filtered' | 'current-page';\n}\n\n/** An option for a `select` filter or editor. Values, never labels, are\n * stored in models and saved tabs. */\nexport interface DataGridOption {\n value: string | number;\n label: string;\n}\n\n/**\n * A column's filter. Declarative: the panel for each kind is a kit input set\n * the grid owns (text: Select + TextInput; number: Select + NumberInput;\n * select: Checkbox list; dateRange: DateRangePicker, loaded lazily). Backed by\n * v9 `enableColumnFilter` + a kit `filterFn` built with `constructFilterFn`\n * (`features/column-filtering/columnFilteringFeature.types.d.ts:111,115`,\n * `features/column-filtering/filterFns.d.ts:35`). Needs `value` on the column.\n */\nexport type DataGridColumnFilter =\n | {\n kind: 'text';\n /** Default: all five operators. */\n operators?: readonly TextFilterOperator[];\n /** Default `'contains'`. */\n defaultOperator?: TextFilterOperator;\n placeholder?: string;\n }\n | {\n kind: 'number';\n /** Default: all nine operators. */\n operators?: readonly NumberFilterOperator[];\n /** Default `'equals'`. */\n defaultOperator?: NumberFilterOperator;\n /** NumberInput mode for the bounds. Default `'decimal'`. */\n mode?: NumberInputMode;\n /** ISO 4217 code for `mode: 'currency'` (the bounds' NumberInputs).\n * Bounds are typed and stored in major units, as shown. */\n currency?: string;\n min?: number;\n max?: number;\n step?: number;\n }\n | {\n kind: 'select';\n /** Required in server mode (a page cannot derive them; DEV warning).\n * Client mode default: distinct `value`s of every row\n * (v9 `getCoreRowModel()`, so other filters do not shrink the list). */\n options?: readonly DataGridOption[];\n }\n | {\n kind: 'dateRange';\n /** `'apply'` commits on an Apply button. Default `'auto'` in client\n * mode, `'apply'` in server mode (one request per range). */\n commitMode?: 'auto' | 'apply';\n };\n\n/** Shared fields of the built-in editors. Values stay with the host: the\n * grid never mutates `rows`. */\ninterface DataGridEditBase<TData, TValue> {\n /** The current value, read from the host's state. */\n getValue: (row: TData) => TValue;\n /** Fires with the kit input's own change event. */\n onChange: (row: TData, next: TValue) => void;\n /** `false` renders `cell` instead of the editor for this row. Default:\n * editable unless `isRowReadOnly(row)`. */\n isEditable?: (row: TData) => boolean;\n /** A translated message marks the input invalid (`aria-invalid`) and is\n * linked with `aria-describedby`. Under privacy mode, on a row with a\n * masked cell, the kit's neutral message replaces it, since it may name\n * a person. */\n error?: (row: TData) => string | undefined;\n}\n\n/** Kit `NumberInput`, `variant=\"plain\"`, `size=\"sm\"`.\n *\n * The value is a JavaScript number, exact to 15 significant digits. For\n * decimal text such as FatturaPA quantities, convert on the way in with\n * `decimalToNumber` and on the way out with `numberToDecimal` (from\n * `@alfadocs/ui-kit/decimal`), and do arithmetic on the text with\n * `multiplyDecimal` and `divideDecimal`, never on the number. A value\n * past 15 significant digits belongs in a read-only cell.\n *\n * `onChange` reports `null` for an empty field and as soon as the typed\n * text stops being a number. When `error` returns nothing, the kit shows\n * its own message for the editor's verdict (not a number, below `min`,\n * above `max`), so an invalid cell always has text. */\nexport interface DataGridNumberEdit<TData> extends DataGridEditBase<\n TData,\n number | null\n> {\n kind: 'number';\n /** Default `'decimal'`. */\n mode?: NumberInputMode;\n /** ISO 4217 code for `mode: 'currency'`. */\n currency?: string;\n min?: number;\n max?: number;\n step?: number;\n /** Most digits after the decimal separator, for `mode: 'decimal'` and\n * `'currency'`. Forwarded to NumberInput: typing past it is refused and\n * computed values are rounded to it. Default: the mode's own digits. */\n maximumFractionDigits?: number;\n /** Fewest digits after the separator in the display (`2` shows `12` as\n * `12.00`). Display only; never more than `maximumFractionDigits`. */\n minimumFractionDigits?: number;\n /** Unit shown after the value (e.g. \"pcs\"). Translated by the host. A\n * function gives a per-row unit (FatturaPA `UnitaMisura`); `undefined`\n * shows none for that row. Data, never a translation key. */\n unit?: string | ((row: TData) => string | undefined);\n /** Hidden hint read with the field (`aria-describedby`), such as the\n * precision it takes (\"Up to 8 decimals\"). Translated by the host. Not\n * shown on a masked row under privacy mode. */\n description?: (row: TData) => string | undefined;\n /** NumberInput's own verdict for this row, on mount and on each change.\n * `reason: 'format'` means the text on screen is not a number in this\n * language (\"1.5\" in Italian), while `getValue` holds `null`: use it to\n * tell an empty field from one that is not a number. For `'format'` the\n * kit shows its own \"Not a number\" copy even when `error` returns text,\n * since `error` sees only `null` there. */\n onValidityChange?: (row: TData, validity: NumberInputValidity) => void;\n}\n\n/** Kit `TextInput`; commits on every change (controlled). */\nexport interface DataGridTextEdit<TData> extends DataGridEditBase<\n TData,\n string\n> {\n kind: 'text';\n maxLength?: number;\n placeholder?: string;\n}\n\n/** Kit `Select`. `null` = nothing chosen. */\nexport interface DataGridSelectEdit<TData> extends DataGridEditBase<\n TData,\n string | null\n> {\n kind: 'select';\n options: readonly { value: string; label: string }[];\n placeholder?: string;\n}\n\n/** Context for a custom editor. Pass `labelledBy` as the control's\n * `aria-labelledby`; never put `rowLabel` in an attribute. A control that\n * takes `aria-label` only (the kit Combobox in 1.113) goes inside\n * `<div role=\"group\" aria-labelledby={labelledBy}>` with\n * `aria-label={columnLabel}`: the group carries the row name, the input\n * the column alone. */\nexport interface DataGridEditContext {\n rowId: string;\n columnId: string;\n /** Ids of the visible column header and a `hidden` row-name element: the\n * control's accessible name, by reference (\"Quantity Nitrile gloves M\";\n * same as `DataGridCellContext.inputLabelledBy`). */\n labelledBy: string;\n /** Plain row name for visible text only (privacy rules as `getRowLabel`). */\n rowLabel: string;\n /** Plain column name. */\n columnLabel: string;\n /** Id of the cell's error text for `aria-describedby`, or `undefined`. */\n errorId: string | undefined;\n invalid: boolean;\n}\n\n/**\n * Any kit control the host renders (BillLineTable's Combobox with \"create new\n * item\"). Keeps Combobox out of every grid that does not use it. The control\n * must be a single Tab stop or a composite that manages its own arrows.\n */\nexport interface DataGridCustomEdit<TData> {\n kind: 'custom';\n render: (row: TData, context: DataGridEditContext) => ReactNode;\n isEditable?: (row: TData) => boolean;\n /** As on the built-in editors, including the privacy rule. */\n error?: (row: TData) => string | undefined;\n}\n\n/** Always-on editors (not click-to-edit), so Tab order is DOM order. */\nexport type DataGridColumnEdit<TData> =\n | DataGridNumberEdit<TData>\n | DataGridTextEdit<TData>\n | DataGridSelectEdit<TData>\n | DataGridCustomEdit<TData>;\n\n/**\n * Privacy under `privacyMode`.\n * - `'mask'`: the cell shows `privacyMask()` (`_shared/privacy-mask.tsx:20`)\n * with the visually hidden \"Hidden in privacy mode\" (the existing\n * `calendarWorkspace.privacy.hidden` key the shared privacy module uses);\n * `cell()` is not called; export writes the mask.\n * - `'hide'`: the column is hidden and cannot be shown.\n * - Object form masks only the cells where `appliesTo(row)` is true (a\n * patient counterparty, not a supplier) and can supply the mask text.\n *\n * Whole-column rule, every form: while `privacyMode` is on, a column with\n * any `privacy` leaves sorting (its sort entries drop from the effective\n * sort), client filtering (its filter key stays in the slice but is not\n * evaluated, and its chip shows the column label only), quick search and\n * facets, for every row, including rows `appliesTo` leaves unmasked.\n * Otherwise sorting by counterparty would still order patient rows by name.\n * Handle and agent writes that sort or filter a masked column are refused\n * (DEV warning; agent error `COLUMN_MASKED`).\n */\nexport type DataGridColumnPrivacy<TData> =\n | 'mask'\n | 'hide'\n | {\n mode: 'mask';\n /** Default: every row. */\n appliesTo?: (row: TData) => boolean;\n /** Host mask such as initials. Empty or absent gives bullets. */\n mask?: (row: TData) => string;\n };\n\n/**\n * One column. The first seven fields are today's (`data-grid.tsx:95-111`)\n * with the same meaning; every other field is optional.\n */\nexport interface DataGridColumn<TData> {\n /* ---- today's fields ---- */\n\n /** Unique within the grid. A developer constant; never shown, never in the\n * DOM. Must not start with `__` (reserved for utility columns). */\n id: string;\n header: ReactNode;\n /** Plain name when `header` holds more than text. Also names the column in\n * ColumnToggle, chips, export, every control's accessible name and the\n * agent. Required when `header` is not a string and the column sorts,\n * filters, hides, resizes or exports (DEV warning). */\n headerLabel?: string;\n /** What this column shows for a row. The context argument is new and\n * optional for callers. */\n cell: (row: TData, context: DataGridCellContext) => ReactNode;\n /** Totals-row cell. The row appears when any column has a footer. The\n * function form is new. */\n footer?: ReactNode | ((context: DataGridFooterContext<TData>) => ReactNode);\n /** Amounts go `end`. */\n align?: 'start' | 'end';\n /** Initial pin, logical so it holds in RTL. A controlled or saved\n * `columnPinning` wins. v9 `columnPinning { start, end }`\n * (`features/column-pinning/columnPinningFeature.types.d.ts:15-18`). */\n pin?: 'start' | 'end';\n\n /* ---- data ---- */\n\n /** The plain value behind sorting, filtering, quick search and export.\n * Without it the column cannot sort, filter or join quick search (DEV\n * warning if it declares one). v9 `accessorFn`. */\n value?: (row: TData) => DataGridCellValue;\n /** Export text or number (CSV, XLSX, PDF), also matched by quick search.\n * Default: `value`, with dates and numbers formatted for the locale. */\n exportValue?: (row: TData) => string | number | null;\n /** Interactive header content (an InfoTip) rendered beside, not inside,\n * the sort button. */\n headerTip?: ReactNode;\n /** This column's body cells are `<th scope=\"row\">` and name the row.\n * Default: the first visible data column (today's rule). */\n rowHeader?: boolean;\n\n /* ---- sorting ---- */\n\n /** `true` picks the sort from the value type (Intl.Collator for text,\n * numeric, date). A function compares two rows. v9 `enableSorting`,\n * `sortFn` (`features/row-sorting/rowSortingFeature.types.d.ts:74,88`). */\n sort?:\n | boolean\n | 'text'\n | 'number'\n | 'date'\n | ((a: TData, b: TData) => number);\n /** First activation sorts descending. Default `false` (AG parity).\n * v9 `sortDescFirst` (`rowSortingFeature.types.d.ts:82`). */\n sortDescFirst?: boolean;\n\n /* ---- filtering ---- */\n\n filter?: DataGridColumnFilter;\n /** Joins quick search. Default `true` when `value` is set. v9\n * `enableGlobalFilter` (`features/global-filtering/globalFilteringFeature.types.d.ts:16`). */\n search?: boolean;\n\n /* ---- sizing, visibility, order ---- */\n\n /** Initial width in px. Declaring any size switches the table to fixed\n * layout. v9 `size` (`features/column-sizing/columnSizingFeature.types.d.ts:99`).\n * A column without `size` in fixed layout takes its kind's rem token\n * (`--data-grid-col-size-text` etc.) through CVA, never a JS px literal;\n * `--dg-col-size` is set only for host sizes and user resizes. */\n size?: number;\n /** Default 64. v9 `minSize` (`columnSizingFeature.types.d.ts:95`). */\n minSize?: number;\n /** Default 960 (finite, so the separator has an `aria-valuemax`). */\n maxSize?: number;\n /** User resizing. Default: the grid's `columnResizing`. v9\n * `enableResizing` (`features/column-resizing/columnResizingFeature.types.d.ts:55`). */\n resizable?: boolean;\n /** Can the user hide it? Default `true`, `false` for the row-header\n * column. v9 `enableHiding`\n * (`features/column-visibility/columnVisibilityFeature.types.d.ts:64`). */\n hideable?: boolean;\n /** Hidden until shown. A saved or controlled visibility wins. */\n defaultHidden?: boolean;\n /** Can it be pinned or unpinned? Default `true`. v9 `enablePinning`\n * (`columnPinningFeature.types.d.ts:52`). */\n pinnable?: boolean;\n /** Can the user move it? Default `true`, `false` for the row header. */\n reorderable?: boolean;\n /** Responsive tier: 1 shows from 640 px, 2 from 900 px, 3 from 1,200 px of\n * grid width (`DATA_GRID_RESPONSIVE_BREAKPOINTS`). No tier: always shown.\n * A user's own show or hide always wins and is never overridden. */\n responsiveTier?: 1 | 2 | 3;\n /** Wrap long text instead of truncating; virtualised rows then measure\n * their height. */\n wrap?: boolean;\n\n /* ---- editing ---- */\n\n edit?: DataGridColumnEdit<TData>;\n\n /* ---- privacy ---- */\n\n privacy?: DataGridColumnPrivacy<TData>;\n\n /* ---- output ---- */\n\n /** Included in CSV, XLSX and PDF. Default `true` when `value` or\n * `exportValue` is set. */\n exportable?: boolean;\n /** Printed. Default `true`. */\n printable?: boolean;\n}\n\n/**\n * A header that spans adjacent columns (grouped headers, one level). Kept\n * beside `columns` so today's `columns` array type does not change. The\n * engine builds v9 group column defs from it; v9 `getHeaderGroups()` gives\n * `colSpan`, `rowSpan`, `isPlaceholder`\n * (`core/headers/coreHeadersFeature.types.d.ts:13,46,74,90`).\n */\nexport interface DataGridColumnGroup {\n id: string;\n header: ReactNode;\n headerLabel?: string;\n /** Leaf column ids. They must be adjacent in the declared order and share\n * one pin side; a column moves only within its group. */\n columns: readonly string[];\n}\n\n/* ================================================================== */\n/* State slices (kit shapes) */\n/* ================================================================== */\n\n/** One sort level: DataTable's `DataTableSortEntry` (`data-table.tsx:103-106`).\n * v9 `ColumnSort { id, desc }` (`rowSortingFeature.types.d.ts:8-11`). */\nexport interface DataGridSortEntry {\n colId: string;\n sort: 'asc' | 'desc';\n}\n\n/** Zero-based, as `DataTableHandle.getCurrentPage()`. v9 `PaginationState`\n * (`features/row-pagination/rowPaginationFeature.types.d.ts:5-12`). */\nexport interface DataGridPagination {\n pageIndex: number;\n pageSize: number;\n}\n\n/** Logical pins. v9 `ColumnPinningState`\n * (`columnPinningFeature.types.d.ts:15-18`). */\nexport interface DataGridColumnPinning {\n start: readonly string[];\n end: readonly string[];\n}\n\n/**\n * Per-row tri-state.\n * - `'selectable'`: a Checkbox.\n * - `'locked'`: checked and disabled; always in the selection, cannot be\n * cleared by the user, a range or select-all. Kept out of v9's\n * `rowSelection` (v9 `enableRowSelection(row) === false`,\n * `features/row-selection/rowSelectionFeature.types.d.ts:48`) and added back\n * in every value DataGrid reports.\n * - `'none'`: no Checkbox; a muted dash with a visually hidden reason\n * (`fatturapa-import.tsx:573-602` precedent). Never selected.\n * The object form adds a translated reason (Checkbox `disabledReason`).\n */\nexport type DataGridRowSelectability =\n | 'selectable'\n | 'locked'\n | 'none'\n | { state: 'locked' | 'none'; reason: string };\n\n/** Everything a server needs for one request (server mode). */\nexport interface DataGridQuery {\n sorting: DataGridSortEntry[];\n /** Column models and host keys. */\n filters: DataGridFilterModel;\n quickFilter: string;\n pagination: DataGridPagination;\n /** Present only while privacy mode masks columns: their ids. Their sort\n * entries and filter keys are already left out of `sorting` and\n * `filters`; leave them out of quick search too, so no row is ordered\n * or matched by a hidden value. */\n maskedColumnIds?: string[];\n}\n\nexport interface DataGridPaginationConfig {\n /** Default `DATA_GRID_PAGE_SIZE_OPTIONS`. */\n pageSizeOptions?: readonly number[];\n /** First and last page buttons (kit Pagination `showEndpoints`). */\n showEndpoints?: boolean;\n}\n\n/* ================================================================== */\n/* Props */\n/* ================================================================== */\n\n/**\n * DataGrid props. Every slice is controlled (value + `on…Change`) or\n * uncontrolled (`default…`), as the kit's `useControllableState`. Every slice\n * reaches v9 as `state.<slice>` plus `on<Slice>Change`\n * (`core/table/coreTablesFeature.types.d.ts:114`), so v9 never owns state.\n * A controlled slice is never written to storage (DEV warning on overlap).\n */\nexport interface DataGridProps<TData> extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'children' | 'dir'\n> {\n /* ===== today's props ===== */\n\n columns: readonly DataGridColumn<TData>[];\n rows: readonly TData[];\n /** Opaque, stable id. The only row datum that reaches the DOM\n * (`data-row-id`). */\n getRowId: (row: TData) => string;\n /** Names the table for screen readers. Pass a translated string. */\n caption: string;\n\n /* ===== identity and persistence ===== */\n\n /** `data-component-id`, agent instance id and the column-state storage key\n * (`DATA_GRID_COLUMN_STATE_PREFIX + gridId`). */\n gridId?: string;\n /** Save order, sizing, pinning and user-set visibility under `gridId`.\n * Default `true` when `gridId` is set. Sorting is never saved. */\n persistColumnState?: boolean;\n /** Register `dataGridAgent` under `gridId` and write `data-component-id`.\n * Default `true`. A component built on DataGrid that has its own agent\n * surface passes `false`, so one table exposes one agent: no\n * registration and no `data-component-id`, while `gridId` still keys\n * the saved column state. */\n registerAgent?: boolean;\n\n /* ===== data mode ===== */\n\n /** `'server'`: sorting, filters, quick search and paging are manual (v9\n * `manualSorting`, `manualFiltering`, `manualPagination`:\n * `rowSortingFeature.types.d.ts:189`,\n * `columnFilteringFeature.types.d.ts:178`,\n * `rowPaginationFeature.types.d.ts:24`); `rows` is the current page.\n * Default `'client'`. */\n dataMode?: 'client' | 'server';\n /** Server mode: total rows matching the query (v9 `rowCount`,\n * `rowPaginationFeature.types.d.ts:38`). Required in server mode (DEV\n * warning).\n *\n * `-1` = unknown. The engine then passes v9 `{ rowCount: undefined,\n * pageCount: -1 }` (`rowPaginationFeature.types.d.ts:31-34`), never\n * `rowCount: -1`: v9 would compute `Math.ceil(-1 / pageSize)` = `-0`, and\n * `getCanNextPage()` returns `false` for a page count of 0\n * (`rowPaginationFeature.utils.js:189-195, 282-289`), so the grid could\n * never page forward. With `-1`: `getRowCount()` and `getPageCount()`\n * return `-1`; Next stays enabled while the page is full\n * (`rows.length === pageSize`) and is disabled on a short page; there is\n * no last-page button. */\n rowCount?: number;\n /** Fires once per change of sorting, filters, quick filter or page, with\n * the whole query, after the per-slice callback. A sort, filter or quick\n * filter change resets `pageIndex` to 0 in the same call (v9 does not in\n * manual mode: `autoResetPageIndex`, `rowPaginationFeature.types.d.ts:20`).\n * The single fetch trigger for server grids; also fires in client mode.\n *\n * Never fires on mount: the host fetches its first page from its own\n * initial query. It does fire for every later change whatever the source,\n * including a DataGridTabs restore on mount (one extra request; a host\n * that wants none seeds its initial query from the active tab). It also\n * fires when the grid clamps `pageIndex` (below). */\n onQueryChange?: (query: DataGridQuery) => void;\n\n /* ===== sorting ===== */\n\n sorting?: readonly DataGridSortEntry[];\n defaultSorting?: readonly DataGridSortEntry[];\n onSortingChange?: (next: DataGridSortEntry[]) => void;\n /** Shift + activation adds a level. Default `true`. v9 `enableMultiSort`,\n * `isMultiSortEvent` (`rowSortingFeature.types.d.ts:171,185`). */\n multiSort?: boolean;\n /** Default `DATA_GRID_MAX_SORT_LEVELS`. v9 `maxMultiSortColCount`. */\n maxSortLevels?: number;\n\n /* ===== filtering and quick search ===== */\n\n filters?: DataGridFilterModel;\n defaultFilters?: DataGridFilterModel;\n onFiltersChange?: (next: DataGridFilterModel) => void;\n /** Quick search text. v9 `globalFilter` with a kit accent-insensitive\n * `globalFilterFn` (`globalFilteringFeature.types.d.ts:40`). */\n quickFilter?: string;\n defaultQuickFilter?: string;\n onQuickFilterChange?: (next: string) => void;\n /** Chip labels for host keys (filters with no column). Translated. */\n filterLabels?: Record<string, string>;\n\n /* ===== pagination ===== */\n\n /** Off by default (today: every row). `true` = 25 per page.\n *\n * Clamping: v9 auto-reset is off (`autoResetPageIndex: false`), so the\n * store clamps `pageIndex` to `pageCount - 1` (or 0) whenever the page\n * count shrinks (client rows or filters change; server `rowCount`\n * changes), and reports it with source `'host'`. Not clamped while the\n * server total is unknown (`rowCount: -1`). */\n pagination?: boolean | DataGridPaginationConfig;\n page?: DataGridPagination;\n defaultPage?: DataGridPagination;\n onPageChange?: (next: DataGridPagination) => void;\n\n /* ===== selection ===== */\n\n /** Default `'none'`. `'single'` = v9 `enableMultiRowSelection: false`\n * (`rowSelectionFeature.types.d.ts:42`), no select-all. */\n selectionMode?: 'none' | 'single' | 'multiple';\n /** Selected row ids, all pages. Includes locked rows.\n *\n * Lifetime, per mode:\n * - Client: ids are pruned when `rows` no longer holds them (any depth;\n * reported with source `'host'`). Sorting, filtering, quick search and\n * paging keep the selection, including rows a filter hides (AG parity).\n * - Server: the grid sees one page, so ids on other pages are never\n * pruned or dropped; sort, filter, quick-filter and page changes keep\n * them. The host clears the selection when its query makes it stale\n * (`setSelection([])` or the controlled prop).\n * - Either mode, with `clearSelectionOnFilterChange`: a filter or\n * quick-filter change clears it (see that prop).\n * Sub-rows are selectable on their own (per `getRowSelectability`);\n * selecting a parent never selects its children\n * (`enableSubRowSelection: false`). */\n rowSelection?: readonly string[];\n defaultRowSelection?: readonly string[];\n /** Always includes the locked rows present in `rows`. */\n onRowSelectionChange?: (ids: string[]) => void;\n /** Per-row tri-state. Default: every row `'selectable'`. Under\n * `privacyMode`, a `reason` on a row where any masked column applies is\n * replaced by neutral kit copy (it may name a person). */\n getRowSelectability?: (row: TData) => DataGridRowSelectability;\n /** What the header box acts on. Default `'page'` when paginated or in\n * server mode, else `'all'`. `'none'` hides it. v9\n * `getToggleAllPageRowsSelectedHandler` / `getToggleAllRowsSelectedHandler`\n * (`rowSelectionFeature.types.d.ts:157,161`). `'all'` in server mode is\n * treated as `'page'` with a DEV warning: v9's select-all sees loaded\n * rows only (`rowSelectionFeature.utils.js:62-79`). The header cell keeps\n * a visually hidden column name in every mode (no empty `<th>`). */\n selectAllScope?: 'all' | 'page' | 'none';\n /** Shift + click or Shift + Space selects the inclusive range in display\n * order, skipping rows that cannot be selected. Default `true` in\n * multiple mode. v9 `enableRowRangeSelection`, `isRowRangeSelectionEvent`\n * (`rowSelectionFeature.types.d.ts:36,64`). */\n rangeSelection?: boolean;\n /**\n * When `true`, any change to the filters (column models or host keys) or\n * to the quick filter clears the selection, in both modes and whatever\n * the source (`'user'`, `'api'`, `'restore'`, `'host'`). Paging and\n * sorting never clear it. Default `false`: the lifetime rules on\n * `rowSelection` apply. Product decision for server-mode bulk actions\n * (BillTable, HTP-7312): a selection survives paging, but a new filter\n * means a new result set.\n *\n * Rules:\n * - Locked rows stay selected; selectable ids are dropped from every page.\n * - Only a real change clears: a write whose filters and quick filter\n * equal the current ones (stable JSON compare) clears nothing.\n * - Same store write as the filter change: after the `'filter'` or\n * `'quickFilter'` change (with its page reset), the grid emits one\n * `'selection'` change with the same source, and calls\n * `onRowSelectionChange` with the locked ids only, before\n * `onQueryChange`. With controlled `rowSelection` the host applies it.\n * - An empty selection emits nothing.\n * - Privacy mode pausing or resuming a masked column's filter, or\n * narrowing the quick-search scope while there is search text, is a\n * new result set too: the selection is cleared (source `'host'`)\n * before that `onQueryChange`. A paused sort alone keeps it.\n */\n clearSelectionOnFilterChange?: boolean;\n\n /* ===== columns ===== */\n\n columnGroups?: readonly DataGridColumnGroup[];\n /** User resizing (pointer and keyboard separator). Default `false`\n * (today's layout). v9 `enableColumnResizing`, `columnResizeMode: 'onEnd'`,\n * `columnResizeDirection` from `useDirection`\n * (`columnResizingFeature.types.d.ts:22,26,30`). */\n columnResizing?: boolean;\n /** Explicit visibility (user or host). Responsive hiding is derived on top\n * and never reported here. v9 `columnVisibility`. */\n columnVisibility?: Record<string, boolean>;\n defaultColumnVisibility?: Record<string, boolean>;\n onColumnVisibilityChange?: (next: Record<string, boolean>) => void;\n columnPinning?: DataGridColumnPinning;\n defaultColumnPinning?: DataGridColumnPinning;\n onColumnPinningChange?: (next: DataGridColumnPinning) => void;\n /** Widths in px for resized columns. v9 `columnSizing`\n * (`columnSizingFeature.types.d.ts:7`). */\n columnSizing?: Record<string, number>;\n defaultColumnSizing?: Record<string, number>;\n onColumnSizingChange?: (next: Record<string, number>) => void;\n /** Leaf column ids in display order. v9 `columnOrder`\n * (`features/column-ordering/columnOrderingFeature.types.d.ts:6`). */\n columnOrder?: readonly string[];\n defaultColumnOrder?: readonly string[];\n onColumnOrderChange?: (next: string[]) => void;\n /** Hide `responsiveTier` columns by grid width. Default `true` when any\n * column has a tier. */\n responsiveColumns?: boolean;\n\n /* ===== expanding ===== */\n\n /** Tree rows. v9 `getSubRows` (`core/rows/coreRowsFeature.types.d.ts:106`),\n * `paginateExpandedRows: false` so children stay on their parent's page.\n *\n * Sub-row rules:\n * - Selection: each sub-row has its own box per `getRowSelectability`;\n * no cascade (`enableSubRowSelection: false`).\n * - Filters and quick search: evaluated at every depth, from leaf rows up\n * (v9 `filterFromLeafRows: true`, `maxLeafRowFilterDepth` default 100,\n * `columnFilteringFeature.types.d.ts:174,183`): a parent stays when a\n * child matches, so a match is never hidden under a filtered-out parent.\n * - Paging and clamping count top-level rows only.\n * - Export flattens depth-first: every filtered descendant follows its\n * parent, expanded or not. Footers see top-level rows only. */\n getSubRows?: (row: TData) => readonly TData[] | undefined;\n /** Detail panel: one extra full-width row under an expanded row. */\n renderDetail?: (row: TData) => ReactNode;\n /** Default: has sub-rows, or `renderDetail` is set. v9 `getRowCanExpand`\n * (`features/row-expanding/rowExpandingFeature.types.d.ts:49`). */\n getRowCanExpand?: (row: TData) => boolean;\n /** Expanded row ids. A new `rows` array never collapses rows: v9's\n * auto-reset is off (`autoResetExpanded: false`; v9 otherwise resets on\n * every data change, `core/row-models/createCoreRowModel.js:17-24`,\n * `rowExpandingFeature.utils.js:30-33`). Ids no longer in `rows` are\n * pruned, reported with source `'host'` (client mode; server mode prunes\n * to the current page). */\n expanded?: readonly string[];\n defaultExpanded?: readonly string[];\n onExpandedChange?: (ids: string[]) => void;\n /** `'single'` closes the open row when another opens. Default `'multiple'`. */\n expandMode?: 'single' | 'multiple';\n\n /* ===== editing ===== */\n\n /** Rows that render `cell` instead of every editor (already-loaded lines). */\n isRowReadOnly?: (row: TData) => boolean;\n /**\n * The whole grid is read-only for a while (\"a request is running\"):\n * - every row renders `cell` instead of its editors (as `isRowReadOnly`);\n * - every row checkbox and the select-all box are disabled with `reason`\n * (default `ui.dataGrid.readOnly.reason`) as their `disabledReason`, so\n * they stay focusable and the reason is reachable by keyboard (Tooltip\n * on focus) and by screen reader (`aria-describedby`);\n * - checked state is kept: nothing is cleared or added, and handle and\n * agent writes still work. Only the person's toggles are blocked.\n * A locked row keeps its own reason. Under `privacyMode`, `reason` is\n * replaced by the default kit copy (it may name a person, as a\n * selectability reason may), unless `hostTextPrivacySafe` is set.\n * Default `false`.\n */\n readOnly?: boolean | { reason: string };\n\n /* ===== row names ===== */\n\n /** Plain row name for row-scoped names (\"Select {{row}}\"), rendered as\n * text inside `hidden` elements that controls reference with\n * `aria-labelledby`; never written into an attribute.\n * Default: the row-header cell's `exportValue`/`value` text, else\n * \"Row {{n}}\". Under `privacyMode`, every row where any masked column\n * applies gets \"Row {{n}}\" (default label or this function alike), unless\n * `rowLabelPrivacySafe` is set. */\n getRowLabel?: (row: TData) => string;\n /** The host promises `getRowLabel` never returns masked data (a bill\n * number, a product description), so it is used under privacy mode too.\n * Default `false`. */\n rowLabelPrivacySafe?: boolean;\n /** The host promises that its own text never holds personal data: editor\n * `error` and number `description`, selectability `reason` and\n * `readOnly.reason`. Under\n * privacy mode that text then shows as given on a masked row, instead of\n * the neutral kit copy (\"Check this value (message hidden in privacy\n * mode)\"). Cells, row labels and search stay masked as before.\n *\n * Set it only when every such string is built from translated copy and\n * ids (a line number, a limit), never from row data such as a name or a\n * description. Default `false`. */\n hostTextPrivacySafe?: boolean;\n\n /* ===== states ===== */\n\n /** `'loading'` with no rows: skeleton rows. With rows: rows stay at full\n * contrast and focusable (no fading), `aria-busy` on the table, a kit\n * `Spinner` in the frame. `'error'`: EmptyState `variant=\"error\"` in the\n * body. Default `'ready'`. */\n status?: 'ready' | 'loading' | 'error';\n /** Error copy and retry. Defaults from `ui.dataGrid.error.*`.\n * `headingLevel` default 3 (EmptyState's default). */\n error?: {\n title?: string;\n description?: string;\n onRetry?: () => void;\n headingLevel?: EmptyStateHeadingLevel;\n };\n /** Empty copy. Variant is automatic: `no-results` (with \"Clear filters\")\n * when a filter or quick search is active, else `first-use`. The\n * no-results EmptyState is its own polite status, so the grid skips its\n * row-count announcement at 0. `headingLevel` default 3. */\n empty?: {\n title?: string;\n description?: string;\n action?: { label: string; onClick: () => void };\n headingLevel?: EmptyStateHeadingLevel;\n /** Overrides `ui.dataGrid.empty.noResultsTitle` (translated). */\n noResultsTitle?: string;\n /** Overrides `ui.dataGrid.empty.noResultsDescription` (translated). */\n noResultsDescription?: string;\n };\n\n /* ===== chrome and layout ===== */\n\n /** `<DataGridToolbar>` parts. Rendered above the scroll region and wired\n * to this grid through context. Setting it (or `pagination`) switches the\n * root to the frame shape (design section 3.1). */\n toolbar?: ReactNode;\n /** Row block size: `--min-target-size` (default) or\n * `--data-grid-row-size-compact`, both resolved in all four themes; the\n * accessible themes point compact at `--min-target-size` too. The row\n * checkbox's hit area is clamped to the row, so compact rows never\n * overlap. Default `'default'`. */\n density?: 'default' | 'compact';\n /** `'fill'` adds `flex: 1 1 auto; min-block-size: 0` so the grid becomes\n * the bounded scroll container of a flex column parent. Inside the kit\n * Dialog, use exactly one of:\n * - `<Dialog.Content scroll=\"body\">` with\n * `<Dialog.Body className=\"ds:flex ds:flex-col\">` (Dialog.Body scrolls\n * but is not itself a flex container, `src/styles.css:807-815`);\n * - `<Dialog.Content flush>` with the grid as the column child\n * (`dialog.tsx:192-198`, `src/styles.css:786-791`).\n * Known limit: at a viewport height of 480 px or less the Dialog falls\n * back to block layout and the whole surface scrolls\n * (`src/styles.css:823-832`), so the header scrolls away (WCAG 1.4.10\n * wins). Default `'auto'`. */\n height?: 'auto' | 'fill';\n /** `'auto'` virtualises above `DATA_GRID_VIRTUALIZE_ABOVE` rendered items.\n * `'off'` never (DEV warning above 500). Default `'auto'`. */\n virtualization?: 'auto' | 'off';\n\n /* ===== privacy ===== */\n\n /** Applies each column's `privacy` (Heatmap and Calendar name it the same,\n * `heatmap.tsx:276`, `calendar.tsx:661`). Default `false`.\n *\n * While a column is masked, its sort entries and filter keys are paused:\n * the state keeps them (`getSort()`, `getFilter()`), but they leave the\n * effective query, so `getQuery()` and `onQueryChange` never order or\n * match rows by a hidden value, and `maskedColumnIds` lists the masked\n * columns for the host's quick search. Turning privacy off brings them\n * back. When turning it on or off changes the effective query, the page\n * resets to 0 and `onQueryChange` fires exactly once. A `'restore'`\n * write (a saved view) keeps a masked column's filter as written,\n * paused; new api and agent sort or filter writes on it are refused.\n * Toggling it emits one `'columns'` change (source `'host'`) so toolbar\n * parts re-read `masked` and `hiddenByPrivacy`. A host\n * `getRowSelectability` reason is replaced by neutral kit copy on any\n * row where a masked column applies. */\n privacyMode?: boolean;\n}\n\n/* ================================================================== */\n/* Handle */\n/* ================================================================== */\n\n/** Who caused a change. Carried by `subscribe`; v9 atoms carry none. */\nexport type DataGridChangeSource =\n /** A person, through the grid's own UI or the toolbar. */\n | 'user'\n /** A handle method or agent action. */\n | 'api'\n /** DataGridTabs re-applying a saved tab. */\n | 'restore'\n /** Responsive hiding by width. */\n | 'responsive'\n /** Column state loaded from storage. */\n | 'storage'\n /** A prop changed by the host outside the grid: a controlled slice, new\n * `rows` or `rowCount`, or the pruning and clamping they cause. */\n | 'host';\n\nexport type DataGridChangeEvent =\n | 'sort'\n | 'filter'\n | 'quickFilter'\n | 'pagination'\n | 'selection'\n | 'expanded'\n | 'columns'\n | 'rows';\n\nexport interface DataGridChange {\n event: DataGridChangeEvent;\n source: DataGridChangeSource;\n}\n\n/** Options for a programmatic write. `'restore'` is for DataGridTabs. */\nexport interface DataGridWriteOptions {\n source?: 'api' | 'restore';\n}\n\n/** One leaf data column, for `getColumns()` (utility columns excluded). */\nexport interface DataGridColumnInfo {\n id: string;\n /** Plain, translated name. */\n label: string;\n /** Effective visibility (explicit, then responsive, then default). */\n visible: boolean;\n canHide: boolean;\n canMove: boolean;\n canPin: boolean;\n pinned: 'start' | 'end' | false;\n /** px in fixed layout; `null` in auto layout. */\n width: number | null;\n /** Display order index (start-pinned first). */\n index: number;\n groupId: string | null;\n filterKind: DataGridColumnFilter['kind'] | null;\n sortable: boolean;\n /** The user (or `markColumnsUserTouched`) set its visibility. */\n userTouched: boolean;\n /** True while `privacyMode` is on and the column declares `privacy` (any\n * form, whole-column rule); `false` otherwise. The agent adapter treats a\n * missing value as masked while `privacyMode` is on. */\n masked?: boolean;\n}\n\n/** Which features this instance has on, so an agent or a toolbar knows what\n * will work before it calls (the adapter's capabilities are static). */\nexport interface DataGridFeatureInfo {\n dataMode: 'client' | 'server';\n selectionMode: 'none' | 'single' | 'multiple';\n /** Any column sorts. */\n sorting: boolean;\n /** Any column filters. */\n filtering: boolean;\n /** Any column joins quick search. */\n quickFilter: boolean;\n pagination: boolean;\n /** Sub-rows or a detail panel. */\n expansion: boolean;\n columnResizing: boolean;\n privacyMode: boolean;\n}\n\n/**\n * The curated imperative handle (`ref`). No TanStack instance, no row\n * objects, no DOM nodes, no escape hatch. Method names match\n * `DataTableHandle` (`data-table.tsx:113-137`) where the job is the same.\n *\n * Stable identity; every read goes to the live store, so a read straight\n * after a write is fresh, for controlled slices too: after a write to a\n * controlled slice, `get…()` returns the value last written until the next\n * prop value arrives; then the prop wins, and any difference from what was\n * written is emitted with source `'host'` (`DataGridStore.syncFromProps`).\n * So two writes in one tick compose (two chip clears both survive), and a\n * DataGridTabs capture straight after a restore reads the restored view.\n * Structurally satisfies `DataGridTabsSeam` and DataTableTabs' filter half\n * (`getFilter`, `setFilter`).\n */\nexport interface DataGridHandle {\n getFeatures(): DataGridFeatureInfo;\n\n /* ---- selection (ids only) ---- */\n\n /** All pages; includes locked rows. */\n getSelection(): string[];\n /** Replaces the selection. Locked ids are kept whatever is passed; ids of\n * rows whose selectability is `'none'` are dropped. Unknown ids: in\n * client mode, an id not in the core row model (any depth) is dropped; in\n * server mode no id is unknown (other pages' ids are kept). */\n setSelection(ids: readonly string[]): void;\n /** Inclusive range in display order (`getRowsInDisplayOrder()`,\n * `core/rows/coreRowsFeature.types.d.ts:120`), skipping rows that cannot\n * be selected. Does not use v9's internal range anchor. */\n selectRange(fromId: string, toId: string): void;\n /** Clears every selectable row; locked rows stay. */\n clearSelection(): void;\n\n /* ---- sorting ---- */\n\n getSort(): DataGridSortEntry[];\n setSort(model: readonly DataGridSortEntry[]): void;\n\n /* ---- filters and quick search ---- */\n\n /** Column models and host keys. */\n getFilter(): DataGridFilterModel;\n setFilter(model: DataGridFilterModel, options?: DataGridWriteOptions): void;\n getQuickFilter(): string;\n setQuickFilter(text: string, options?: DataGridWriteOptions): void;\n /** Column filters, host keys and quick search. */\n clearFilters(): void;\n /**\n * Applies a saved view in ONE write: the filters (column models and host\n * keys) and the quick search change together, so subscribers see one\n * `'filter'` change and a server host gets one `onQueryChange` with the\n * whole new query (never the new filters with the old search). The page\n * resets to 0 once. `filters` replaces the whole model, as `setFilter`:\n * a filter key missing from it is removed. Leave `filters` or\n * `quickFilter` out of `view` to keep that part as it is.\n * DataGridTabs restores through this.\n * When the search text changes too, the same write also emits one\n * `'quickFilter'` change, so a search box re-reads. Without\n * `source: 'restore'`, a view that writes a masked column's filter\n * under privacy mode is refused whole (DEV warning), as `setFilter`.\n * Removing a masked column's filter is not refused (as `setFilter`): it\n * reveals nothing, and the paused filter simply goes.\n */\n applyView(\n view: { filters?: DataGridFilterModel; quickFilter?: string },\n options?: DataGridWriteOptions,\n ): void;\n /** `true` while `privacyMode` is on. Saved-view tabs read it so they never\n * store quick-search text or masked columns' filter values while names\n * are hidden (Michael, 4 Nov 2026). */\n isPrivacyMode(): boolean;\n\n /* ---- paging (zero-based) ---- */\n\n getCurrentPage(): number;\n goToPage(pageIndex: number): void;\n getPageSize(): number;\n setPageSize(size: number): void;\n /** 1 when pagination is off; `-1` when the server total is unknown. */\n getPageCount(): number;\n /** Client: top-level rows after filters. Server: `rowCount` (`-1` when\n * unknown). */\n getRowCount(): number;\n /** Display order. Client: every filtered row (all pages). Server: the page. */\n getRowIds(): string[];\n\n /* ---- expanding ---- */\n\n getExpandedRowIds(): string[];\n setRowExpanded(id: string, expanded: boolean): void;\n\n /* ---- columns ---- */\n\n getColumns(): DataGridColumnInfo[];\n /** Counts as a user choice: saved, and exempt from responsive hiding. */\n setColumnVisible(id: string, visible: boolean): void;\n /** `false` unpins. The agent's `pin_column` takes `side: null` (JSON) and\n * the adapter maps it to `false`. No-op (DEV warning) on a column with\n * `pinnable: false`, or when the pin would split its group. */\n pinColumn(id: string, side: 'start' | 'end' | false): void;\n /**\n * `toIndex` is the column's final index in `getColumns()` after the move\n * (remove, then insert). The column takes the pin side of the column that\n * sat at `toIndex` before the move (today's AG rule, the drop target's\n * pin, `data-table/toolbar.tsx:1068-1071`). A no-op (DEV warning) when the\n * column is not reorderable, would change pin side but is not pinnable,\n * or would leave or split its group (columns move only within their\n * group; a group moves as a block only through `columnOrder`).\n */\n moveColumn(id: string, toIndex: number): void;\n /** Clamped to `minSize`..`maxSize`. */\n setColumnWidth(id: string, px: number): void;\n /** Back to declared defaults; removes the saved state for `gridId`. */\n resetColumnState(): void;\n getUserTouchedColumns(): string[];\n /** Marks columns user-set (a saved view standing in for the user). */\n markColumnsUserTouched(ids: readonly string[]): void;\n\n /* ---- focus and scroll (virtualisation-safe) ---- */\n\n /** Scrolls the row into view (virtualiser `scrollToIndex` first). */\n scrollToRow(id: string): void;\n /** Scrolls, then focuses the first control in `columnId`'s cell, else the\n * row's selection box, else its row header. */\n focusRow(id: string, columnId?: string): void;\n\n /* ---- output ---- */\n\n /** Renders every filtered row (client) or the page (server), unvirtualised\n * and unpaginated, prints, then restores. */\n print(): Promise<void>;\n\n /* ---- change feed ---- */\n\n /** Synchronous with the write. Used by DataGridTabs, the toolbar seam and\n * the agent. Returns unsubscribe. */\n subscribe(listener: (change: DataGridChange) => void): () => void;\n}\n\n/* ================================================================== */\n/* Toolbar (DataGrid side) */\n/* ================================================================== */\n\n/**\n * For a toolbar lifted out of the grid's `toolbar` slot (a page header).\n * Inside the slot the parts find the grid through context.\n *\n * How it learns the grid has mounted (no polling): `grid-context.ts` holds a\n * module-level mount signal (`DataGridMountSignal`). Every DataGrid calls\n * `notify()` after it mounts and after it unmounts. The provider calls\n * `getGrid()` once after its own mount and again on every signal, and\n * rebinds when the handle it gets changes. So a grid that mounts later (lazy\n * route, conditional render, a Dialog) wakes the toolbar. The parts render\n * disabled until a grid is bound (seam `isReady()` false).\n */\nexport interface DataGridToolbarProviderProps {\n /** Resolve the grid at call time; `null` until mounted. */\n getGrid: () => DataGridHandle | null | undefined;\n children: ReactNode;\n}\n\n/** `DataGridToolbar.BulkAction` callback. */\nexport type DataGridBulkActionHandler = (context: ToolbarActionContext) => void;\n\n/** `DataGridToolbar.ExportMenu.Item` with `format: 'custom'` callback. */\nexport type DataGridCustomExportHandler = (\n context: ToolbarActionContext,\n) => void;\n\n/* ---- DataGridToolbar part props ----------------------------------- */\n/* The public props of the DataGrid toolbar parts. They follow DataTable's */\n/* (`data-table/toolbar.tsx`) where the job is the same and differ on */\n/* purpose where DataTable's carry a GridApi: callbacks get a */\n/* `ToolbarActionContext`; the deprecated ExportCsv and ExportPdf are not */\n/* offered. The root `DataGridToolbar` renders */\n/* `data-component=\"data-grid-toolbar\"` (a bounding marker for a lifted */\n/* toolbar) and keeps the `data-table-toolbar` print class. */\n\n/** Icon-button parts: the label is the tooltip and the accessible name. */\ntype DataGridToolbarIconButtonProps = Omit<\n IconButtonProps,\n 'icon' | 'aria-label' | 'tooltip' | 'onClick' | 'children'\n> & {\n /** Default: the part's `ui.dataTable.*` string. */\n label?: string;\n};\n\n/** `DataGridToolbar` root, `FilterBar` and `Actions`: layout only. */\nexport type DataGridToolbarRootProps = HTMLAttributes<HTMLDivElement>;\n\n/** `DataGridToolbar.QuickSearch`. Follows external changes (tabs, chips,\n * agents) because the DataGrid seam sets `syncsFilterInputs`. */\nexport interface DataGridToolbarQuickSearchProps {\n /** Default `t('dataTable.quickSearch.placeholder')`. */\n placeholder?: string;\n /** Default 150. */\n debounceMs?: number;\n}\n\n/** One FacetFilter pill. `value: null` is the \"All\" pill that clears. */\nexport interface DataGridToolbarFacetOption {\n value: string | number | null;\n /** Translated. */\n label: string;\n}\n\n/**\n * `DataGridToolbar.FacetFilter`: one-value pills that write\n * `{ type: 'set', values: [value] }` under `field` and read the active pill\n * back from the filter state.\n *\n * Rule for `field`: in client mode it must name a column with\n * `filter: { kind: 'select' }` (so v9 evaluates the set model with the kit\n * set fn); any other field renders nothing and logs a DEV warning, because\n * a text or number column would evaluate a set model with the wrong fn and\n * a column with no filter has filtering off. In server mode it may also be a\n * host key (not evaluated by the grid; the host's server applies it).\n */\nexport interface DataGridToolbarFacetFilterProps {\n field: string;\n options: readonly DataGridToolbarFacetOption[];\n /** Name of the pill group. Default `t('dataTable.facetFilter.label')`. */\n label?: string;\n}\n\n/** `DataGridToolbar.ColumnToggle`: hide or show, drag and Move up / Move\n * down, Reset columns. No pin control in this round: pinning is declared\n * (`pin`), set by the handle or agent, or adopted by moving into an\n * existing pinned zone. */\nexport interface DataGridToolbarColumnToggleProps extends DataGridToolbarIconButtonProps {\n /** Override the trigger glyph (default Columns3Cog). */\n icon?: ReactNode;\n /** Extra content above the list, under the title. */\n header?: ReactNode;\n /** Extra content below the list. */\n footer?: ReactNode;\n}\n\n/** Built-in formats or `custom`. */\nexport type DataGridExportFormat = 'csv' | 'xlsx' | 'pdf' | 'custom';\n\n/** `DataGridToolbar.ExportMenu.Item`. In server mode the built-in formats\n * render disabled with the reason `t('dataGrid.toolbar.exportPageOnly')`\n * (\"Not available: only one page is loaded\"), because the grid holds one\n * page; `custom` items always run. */\nexport type DataGridToolbarExportMenuItemProps =\n | {\n format: 'csv' | 'xlsx' | 'pdf';\n /** Default `t('dataTable.export.{format}')`. */\n label?: string;\n /** Default: the grid caption, sanitised. */\n fileName?: string;\n }\n | {\n format: 'custom';\n label: string;\n onExport: DataGridCustomExportHandler;\n };\n\n/** `DataGridToolbar.ExportMenu`. Without children: CSV, Excel and PDF. */\nexport interface DataGridToolbarExportMenuProps extends DataGridToolbarIconButtonProps {\n children?: ReactNode;\n}\n\n/** `DataGridToolbar.Print`: prints every filtered row (client) or the\n * current page (server). */\nexport type DataGridToolbarPrintProps = DataGridToolbarIconButtonProps;\n\n/** `DataGridToolbar.Refresh`. */\nexport interface DataGridToolbarRefreshProps extends DataGridToolbarIconButtonProps {\n onRefresh: () => void;\n}\n\n/** `DataGridToolbar.BulkAction`. Renders nothing while the selection is\n * empty (locked rows count as selected); otherwise shows the label and the\n * count. */\nexport interface DataGridToolbarBulkActionProps extends Omit<\n ButtonProps,\n 'onClick' | 'children' | 'startIcon' | 'intent'\n> {\n label: string;\n icon?: ReactNode;\n onAction: DataGridBulkActionHandler;\n variant?: 'default' | 'destructive';\n}\n\n/** `DataGridToolbar.FilterChips`: one chip per column filter (operator and\n * value; masked columns show the label only), one per host key (label from\n * `filterLabels` only, never the value, so a host filter on a patient name\n * cannot leak), one for the quick search, and Clear all. No props. */\nexport type DataGridToolbarFilterChipsProps = Record<string, never>;\n\n/* ================================================================== */\n/* Persistence envelope */\n/* ================================================================== */\n\n/**\n * `localStorage[DATA_GRID_COLUMN_STATE_PREFIX + gridId]`, version 1 from day\n * one (DataGrid has never saved state, so nothing to migrate). Each field is\n * validated on its own; a bad field is dropped and the others kept. Pins are\n * logical, so no text direction is stored. Utility column ids never appear.\n */\nexport interface DataGridColumnStateEnvelopeV1 {\n v: 1;\n /** Full leaf order at save time. New columns since then keep their\n * declared position; unknown ids are dropped. */\n order?: string[];\n /** px, user-resized columns only; clamped on load. */\n sizing?: Record<string, number>;\n pinning?: { start: string[]; end: string[] };\n /** User-touched columns only: its keys are the user-touched set. */\n visibility?: Record<string, boolean>;\n}\n\n/* ================================================================== */\n/* Internal contract (not exported from index.ts) */\n/* ================================================================== */\n\n/** @internal Every slice the grid owns, in kit shapes. */\nexport interface DataGridSlices {\n sorting: DataGridSortEntry[];\n filters: DataGridFilterModel;\n quickFilter: string;\n page: DataGridPagination;\n /** Selectable ids only; locked ids are added on output. */\n rowSelection: string[];\n expanded: string[];\n /** Explicit visibility only (user, host, storage). */\n columnVisibility: Record<string, boolean>;\n columnPinning: DataGridColumnPinning;\n columnSizing: Record<string, number>;\n columnOrder: string[];\n}\n\n/** @internal */\nexport type DataGridSliceName = keyof DataGridSlices;\n\n/** @internal Which change event each slice emits. */\nexport const DATA_GRID_SLICE_EVENT: Readonly<\n Record<DataGridSliceName, DataGridChangeEvent>\n> = {\n sorting: 'sort',\n filters: 'filter',\n quickFilter: 'quickFilter',\n page: 'pagination',\n rowSelection: 'selection',\n expanded: 'expanded',\n columnVisibility: 'columns',\n columnPinning: 'columns',\n columnSizing: 'columns',\n columnOrder: 'columns',\n};\n\n/**\n * @internal The single owner of grid state (`state.ts`). Each slice is held\n * internally or mirrored from its controlled prop. v9 receives every slice\n * as `state` and writes back through `on<Slice>Change(updater)`, which calls\n * `write(slice, …, 'user')`. Handle, seams, storage and responsive code call\n * `write` with their own source.\n */\nexport interface DataGridStore {\n /** Uncontrolled: the held value. Controlled: the last value written\n * through `write` until the next prop value arrives through\n * `syncFromProps`, then the prop. */\n get<K extends DataGridSliceName>(slice: K): DataGridSlices[K];\n /** Resolves an updater against `get(slice)` (two writes in one tick\n * compose, controlled or not), records the result (a pending value for a\n * controlled slice, the held value otherwise), calls the host's\n * `on…Change` with a kit value, then notifies subscribers synchronously.\n * A sort, filter or quick-filter write also resets `page.pageIndex` to 0\n * in the same notification. With `clearSelectionOnFilterChange`, a\n * filter or quick-filter write (or `syncFromProps` change) that changes\n * the value also clears `rowSelection` and emits `'selection'` with the\n * same source straight after (rules on that prop). */\n write<K extends DataGridSliceName>(\n slice: K,\n next:\n | DataGridSlices[K]\n | ((previous: DataGridSlices[K]) => DataGridSlices[K]),\n source: DataGridChangeSource,\n ): void;\n /** Called on every render with the controlled slices' current prop values\n * (absent key = uncontrolled). For each slice, the prop replaces any\n * pending value; when it differs (stable JSON compare) from what `get`\n * returned, emits the slice's event with source `'host'`, or `'restore'`\n * when it equals a pending restore write. Also prunes selection and\n * expanded ids and clamps `pageIndex` (see `DataGridProps`). */\n syncFromProps(controlled: Partial<DataGridSlices>): void;\n /** Emits a change no slice write carries: `'rows'` when `rows` or\n * `rowCount` change (source `'host'`). In client mode the engine also\n * emits `'rows'` (source `'host'`) after the commit in which a filter or\n * quick-search write changed the filtered row set, because\n * `getRowCount()` and `getRowIds()` read inside the synchronous\n * `'filter'` event still see the old v9 row model. */\n notify(change: DataGridChange): void;\n isControlled(slice: DataGridSliceName): boolean;\n subscribe(listener: (change: DataGridChange) => void): () => void;\n}\n\n/** @internal Module-level mount signal in `grid-context.ts`: wakes lifted\n * toolbars (`DataGridToolbarProvider`) when any DataGrid mounts or\n * unmounts. */\nexport interface DataGridMountSignal {\n subscribe(listener: () => void): () => void;\n notify(): void;\n}\n\n/** @internal Resolved per-row selection state. */\nexport interface DataGridResolvedSelectability {\n state: 'selectable' | 'locked' | 'none';\n /** Translated reason, or `null` (the grid's default copy then applies). */\n reason: string | null;\n}\n\n/**\n * @internal v9 `columnMeta` slot, set with `metaHelper`\n * (`helpers/metaHelper.d.ts:23`). TData-free on purpose: v9 meta slots are\n * static types with no row parameter (`helpers/tableFeatures.d.ts:15-17`,\n * `types/ColumnDef.d.ts:21-27`), and `DataGridColumn<TData>` is\n * contravariant in TData, so a typed kit column cannot be stored in a\n * `DataGridColumnMeta<unknown>` without a cast. The kit column and group are\n * read by id from the engine's typed maps (`DataGridEngine.kitColumns`,\n * `kitGroups`), never from `columns[index]` (today's index mapping breaks\n * with order, visibility and groups).\n */\nexport interface DataGridColumnMeta {\n /** `'select'` and `'expand'` are utility columns (`__select`,\n * `__expand`): pinned start, never hideable, exported or listed. */\n kind: 'data' | 'group' | 'select' | 'expand';\n /** Plain label (headerLabel, string header, or id with a DEV warning). */\n label: string;\n isRowHeader: boolean;\n /** The group a leaf belongs to, or `null`. */\n groupId: string | null;\n}\n\n/** @internal v9 `tableMeta` slot. TData-free for the same reason; every\n * per-row member takes the row id and the engine resolves the row. */\nexport interface DataGridTableMeta {\n privacyMode: boolean;\n /** Plain or privacy-safe row name (see `DataGridProps.getRowLabel`). */\n getRowLabel: (rowId: string) => string;\n getSelectability: (rowId: string) => DataGridResolvedSelectability;\n isRowReadOnly: (rowId: string) => boolean;\n /** Is this cell masked under privacy mode? */\n isMasked: (rowId: string, columnId: string) => boolean;\n /** Does privacy mode mask any cell of this row? Host text shown on such a\n * row (reasons, editor errors) gives way to kit copy. Always `false`\n * when `hostTextPrivacySafe` is set. */\n isRowMasked: (rowId: string) => boolean;\n /** BCP 47 locale (`i18n.language`). The registered kit sort fns read it\n * through `row.table.options.meta` for their `Intl.Collator`, since a\n * registry entry is module-scoped and cannot close over the grid's\n * locale. */\n locale: string;\n /** What quick search matches in one cell: the column's `exportValue`,\n * else its `value` (`kitQuick` reads it through\n * `row.table.options.meta`). Absent: v9's accessor value. */\n getSearchValue?: (rowId: string, columnId: string) => unknown;\n}\n\n/** @internal What `data-grid.tsx` hands the engine hook: every prop that\n * affects state or the row model, plus measured context. */\nexport type DataGridEngineOptions<TData> = Omit<\n DataGridProps<TData>,\n | keyof HTMLAttributes<HTMLDivElement>\n | 'caption'\n | 'toolbar'\n | 'density'\n | 'height'\n | 'error'\n | 'empty'\n> & {\n /** From `useDirection(rootRef)` (`src/hooks/use-direction.ts:21`); feeds\n * v9 `columnResizeDirection`. */\n direction: 'ltr' | 'rtl';\n /** Grid root inline size from a ResizeObserver; `null` before layout. */\n containerInlineSize: number | null;\n /** `print.ts` is rendering for print (design § 5.5): the engine then turns\n * virtualisation off and, in client mode, paging off. Default `false`. */\n printing?: boolean;\n /** The data column holding keyboard focus, if any. Responsive hiding never\n * hides it (design § 12.1, `responsive.test.ts`). Default `null`. */\n focusedColumnId?: string | null;\n /** The grid `caption`, read by the toolbar seam's `getCaption` for the\n * default export file name (design § 7.4). Optional so a missing caption\n * falls back to `table-export`. */\n caption?: string;\n};\n\n/** @internal Selection helpers for the header box and row boxes. */\nexport interface DataGridSelectionApi {\n mode: 'none' | 'single' | 'multiple';\n scope: 'all' | 'page' | 'none';\n /** Over selectable rows in scope only. */\n headerState: boolean | 'indeterminate';\n /** `null` while some row in scope is selectable. Otherwise the header\n * box is disabled, with the reason every row shares, or `null` inside\n * for the default copy (`ui.dataGrid.selection.noneReason`). */\n selectAllBlock: { reason: string | null } | null;\n toggleAll(checked: boolean): void;\n /** Radix Checkbox reports only `onCheckedChange` (`checkbox.tsx:111`), so\n * the cell captures Shift on keydown and pointerdown and passes it here;\n * the engine calls v9 `row.getToggleSelectedHandler()({ target:\n * { checked }, shiftKey })` (`rowSelectionFeature.types.d.ts:103`). */\n toggleRow(\n rowId: string,\n checked: boolean,\n modifiers: { shiftKey: boolean },\n ): void;\n isSelected(rowId: string): boolean;\n getSelectability(rowId: string): DataGridResolvedSelectability;\n}\n\n/** @internal Facts the renderer needs beyond the v9 row model. */\nexport interface DataGridStatusInfo {\n dataMode: 'client' | 'server';\n status: 'ready' | 'loading' | 'error';\n /** No rows to show (before the status overlay is chosen). */\n isEmpty: boolean;\n /** A column filter, host key or quick search is active. */\n anyFilterActive: boolean;\n rowCount: number;\n pageCount: number;\n /** Body items the current model renders (rows + open detail panels). The\n * renderer builds one flattened item list (rows, expanded sub-rows, open\n * detail panels) over the whole pre-paginated order and derives\n * `aria-rowindex` from it, never from `row.getDisplayIndex()`, which\n * ignores detail panels (`core/rows/coreRowsFeature.utils.js:10-28`). */\n renderedItemCount: number;\n /** `renderedItemCount > DATA_GRID_VIRTUALIZE_ABOVE` and not `'off'`, and\n * not printing. */\n virtualised: boolean;\n /** Header rows (group rows + leaf row), for `aria-rowindex`. */\n headerRowCount: number;\n}\n\n/** @internal Layout facts for CVA variants and custom-property setters. */\nexport interface DataGridLayoutInfo {\n /** Any column declares a size, resizing is on, or the grid virtualises. */\n fixed: boolean;\n hasFooter: boolean;\n hasPinned: boolean;\n /** v9 `getStartTotalSize()` / `getEndTotalSize()`\n * (`columnSizingFeature.types.d.ts:68,72`) in fixed layout; `null` in\n * auto layout, where the renderer measures pinned cells instead. */\n startPinnedTotalPx: number | null;\n endPinnedTotalPx: number | null;\n}\n\n/** @internal What the renderer gives the engine so handle methods that need\n * the DOM or the virtualiser can work. */\nexport interface DataGridRendererBindings {\n print(): Promise<void>;\n scrollToRow(id: string): void;\n focusRow(id: string, columnId?: string): void;\n}\n\n/**\n * @internal What `useDataGridEngine` returns. `TTable` is the v9 table\n * (`ReactTable<typeof dataGridFeatures, TData>` from\n * `@tanstack/react-table`'s `useTable.d.ts:6`), bound in the engine file so\n * this contract stays TanStack-free. Never leaves the data-grid folder.\n * The implementation sites keep `TData extends object` (the public\n * `forwardRef` cast, `useDataGridEngine`, `DataGridTable`), because v9\n * requires `RowData` (`types/type-utils.d.ts:4`).\n */\nexport interface DataGridEngine<TData, TTable> {\n table: TTable;\n store: DataGridStore;\n /** Kit columns by id (typed; the v9 meta holds no kit column). */\n kitColumns: ReadonlyMap<string, DataGridColumn<TData>>;\n /** Kit groups by id. */\n kitGroups: ReadonlyMap<string, DataGridColumnGroup>;\n /** Stable for the grid's lifetime. */\n handle: DataGridHandle;\n /** Stable; the DataGrid implementation of the toolbar seam. */\n toolbarSeam: TableToolbarSeam;\n selection: DataGridSelectionApi;\n status: DataGridStatusInfo;\n layout: DataGridLayoutInfo;\n getFooterContext(): DataGridFooterContext<TData>;\n /** Every filtered, sorted row (client) or the page (server), formatted,\n * privacy-masked. v9 `getPrePaginatedRowModel()`\n * (`rowPaginationFeature.types.d.ts:134`), flattened depth-first by hand:\n * with `paginateExpandedRows: false` that model holds top-level rows only\n * (`features/row-expanding/createExpandedRowModel.js:27-33`). Built by\n * `buildDataGridExportSnapshot`, which the lead stubs in step 0. */\n getExportSnapshot(): TableExportSnapshot;\n /** Called once by the renderer on mount; returns an unbind. */\n bindRenderer(bindings: DataGridRendererBindings): () => void;\n}\n\n/**\n * @internal Input of `createDataGridToolbarSeam` (`toolbar-seam.ts`). The\n * seam is built from the handle alone plus three extras, so the toolbar\n * owner codes against this file, not against the engine.\n */\nexport interface DataGridToolbarSeamDeps {\n /** A second handle over the same store whose writes are tagged `'user'`\n * (the public handle tags `'api'`). */\n userHandle: DataGridHandle;\n getExportSnapshot(): TableExportSnapshot;\n /** `filterLabels[key]`, for host-key chips. */\n getFilterLabel(key: string): string | undefined;\n /** The grid `caption`, for the default export file name (CSV, XLSX,\n * PDF). Absent: `table-export`. */\n getCaption?(): string;\n /** Toolbar-only facts about one column that the public handle does not\n * carry: a select filter's option labels, so a chip says \"To load\" and\n * not `toLoad` (left out while the column is masked), and whether\n * privacy mode removes the column (`privacy: 'hide'`), so ColumnToggle\n * leaves it out. Absent: chips show raw values, nothing counts as\n * hidden by privacy. */\n getColumnToolbarInfo?(id: string): {\n filterOptions?: ReadonlyArray<{ value: string | number; label: string }>;\n hiddenByPrivacy: boolean;\n };\n}\n\n/** @internal Signature of `createDataGridToolbarSeam` (`toolbar-seam.ts`). */\nexport type CreateDataGridToolbarSeam = (\n deps: DataGridToolbarSeamDeps,\n) => TableToolbarSeam;\n\n/** @internal Props of the header filter trigger (`filters/filter-trigger.tsx`),\n * rendered by `header.tsx`. Opens a Popover with the kind's panel. Not\n * checked by `check-prop-runtime-coverage`: step 0 scopes that script to\n * the folder's own `<PascalName>Props` (`DataGridProps`). */\nexport interface DataGridFilterTriggerProps {\n columnId: string;\n /** Plain column name, for \"Filter {{column}}\". */\n columnLabel: string;\n config: DataGridColumnFilter;\n /** This column's current model, if any. */\n value: DataGridColumnFilterModel | undefined;\n /** `null` clears. The header writes it with source `'user'`. */\n onChange: (model: DataGridColumnFilterModel | null) => void;\n /** `config.options`, or (client mode) the distinct values of every row. */\n options: readonly DataGridOption[];\n dataMode: 'client' | 'server';\n}\n\n/** @internal Input of `buildDataGridExportSnapshot` (`export-snapshot.ts`). */\nexport interface DataGridExportInput<TData> {\n scope: 'all-filtered' | 'current-page';\n /** Visible, exportable leaf columns in display order. */\n columns: ReadonlyArray<{\n id: string;\n label: string;\n align: 'start' | 'end';\n column: DataGridColumn<TData>;\n }>;\n /** v9 `getPrePaginatedRowModel().rows` (client) or the page (server),\n * flattened depth-first (each filtered sub-row after its parent, expanded\n * or not, via `row.subRows`); detail panels are not rows. */\n rows: ReadonlyArray<{ id: string; original: TData }>;\n /** Masked cells export `maskFor(...)`, never the value. */\n isMasked: (row: TData, columnId: string) => boolean;\n maskFor: (row: TData, columnId: string) => string;\n /** Totals: a footer that is (or returns) a string or number is exported;\n * any other node exports `null`. `null` when there is no footer. */\n footer: DataGridFooterContext<TData> | null;\n /** BCP 47 locale for number and date text (`i18n.language`). */\n locale: string;\n}\n\n/** @internal Signature of `buildDataGridExportSnapshot` (`export-snapshot.ts`). */\nexport type BuildDataGridExportSnapshot = <TData>(\n input: DataGridExportInput<TData>,\n) => TableExportSnapshot;\n\n/** @internal Context the `toolbar` slot and DataGridToolbar parts read. */\nexport interface DataGridContextValue {\n handle: DataGridHandle;\n toolbarSeam: TableToolbarSeam;\n}\n\n/** @internal Context DataGridTabs provides so a descendant DataGrid\n * registers itself (no `getTable` needed). */\nexport interface DataGridRegistry {\n register(handle: DataGridHandle): () => void;\n}\n","/* -------------------------------------------------------------------- */\n/* DataGrid: the store (`DataGridStore`, types.ts) and the kit <-> v9 */\n/* converters. */\n/* */\n/* The kit owns every slice; TanStack v9 never owns state. Each slice is */\n/* held (uncontrolled) or mirrored from its prop (controlled), and every */\n/* write carries a source (`user`, `api`, `restore`, `responsive`, */\n/* `storage`, `host`) that reaches `subscribe` synchronously. */\n/* */\n/* Rules kept here (design § 1.2, § 2.4): */\n/* - A sort, filter or quick-filter change resets `pageIndex` to 0 in */\n/* the same write; `onQueryChange` fires once, after the per-slice */\n/* callbacks, never on mount. */\n/* - `clearSelectionOnFilterChange`: a real filter or quick-filter */\n/* change clears the selectable ids (locked rows stay), emits one */\n/* `'selection'` change with the same source and calls */\n/* `onRowSelectionChange(lockedIds)` before `onQueryChange`. */\n/* - Controlled freshness: after a write to a controlled slice, `get` */\n/* returns the written value until the next prop value arrives through */\n/* `syncFromProps`; then the prop wins and any difference is emitted */\n/* as `'host'` (or `'restore'`). */\n/* - Corrections once: `reconcile()` corrects each distinct controlled */\n/* prop value (pruned ids, clamped page) once. A host that does not */\n/* take the correction gets its prop shown as given, so the grid never */\n/* fights the prop on every commit. */\n/* - Effective query: under privacy mode, sort entries and filter keys */\n/* on masked columns stay in the slices but leave `getQuery()`, so a */\n/* server is never asked to order or match rows by a hidden value. */\n/* They are paused, not dropped: privacy off brings them back. When */\n/* the masked set alone changes the effective query, */\n/* `refreshEffectiveQuery` resets the page and calls `onQueryChange` */\n/* once (never twice in a commit that also delivers host changes). */\n/* When the filters or the search scope changed (not the sort alone), */\n/* `clearSelectionOnFilterChange` clears the selection first. */\n/* */\n/* `syncFromProps` runs during render, so it only records: the changes it */\n/* finds are delivered by `flushHostChanges()`, which the engine calls in */\n/* a layout effect, so no host callback or subscriber runs during render. */\n/* Pruning and page clamping need the v9 row model, so they live in */\n/* `reconcile()`, also called from that layout effect. */\n/* -------------------------------------------------------------------- */\n\nimport type {\n ColumnFiltersState,\n ColumnOrderState,\n ColumnPinningState,\n ExpandedState,\n RowSelectionState,\n SortingState,\n} from '@tanstack/react-table';\n\nimport type {\n DataGridChange,\n DataGridChangeSource,\n DataGridColumnPinning,\n DataGridFilterModel,\n DataGridPagination,\n DataGridProps,\n DataGridQuery,\n DataGridSliceName,\n DataGridSlices,\n DataGridSortEntry,\n DataGridStore,\n} from './types';\nimport { DATA_GRID_SLICE_EVENT } from './types';\n\n/* ------------------------------------------------------------------ */\n/* Stable equality */\n/* ------------------------------------------------------------------ */\n\nfunction normalise(value: unknown): unknown {\n if (value instanceof Date) return { $date: value.toISOString() };\n if (Array.isArray(value)) return value.map(normalise);\n if (value !== null && typeof value === 'object') {\n const record = value as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(record).sort()) {\n if (record[key] !== undefined) out[key] = normalise(record[key]);\n }\n return out;\n }\n if (typeof value === 'number' && !Number.isFinite(value)) {\n return { $number: String(value) };\n }\n return value;\n}\n\n/** JSON with sorted keys; `undefined` members dropped. */\nexport function stableStringify(value: unknown): string {\n return JSON.stringify(normalise(value)) ?? 'undefined';\n}\n\nexport function stableEqual(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n return stableStringify(a) === stableStringify(b);\n}\n\n/* ------------------------------------------------------------------ */\n/* Kit <-> v9 converters */\n/* ------------------------------------------------------------------ */\n\nexport function toV9Sorting(\n entries: readonly DataGridSortEntry[],\n isEffective: (colId: string) => boolean,\n): SortingState {\n return entries\n .filter((entry) => isEffective(entry.colId))\n .map((entry) => ({ id: entry.colId, desc: entry.sort === 'desc' }));\n}\n\nexport function fromV9Sorting(sorting: SortingState): DataGridSortEntry[] {\n return sorting.map((entry) => ({\n colId: entry.id,\n sort: entry.desc ? 'desc' : 'asc',\n }));\n}\n\nconst isAbsentFilterValue = (value: unknown): boolean =>\n value === undefined || value === null;\n\n/** Column keys v9 evaluates. Host keys, masked columns' keys and empty\n * values stay in the kit slice only. */\nexport function toV9ColumnFilters(\n filters: DataGridFilterModel,\n isEvaluated: (key: string) => boolean,\n): ColumnFiltersState {\n return Object.keys(filters)\n .filter((key) => isEvaluated(key) && !isAbsentFilterValue(filters[key]))\n .map((key) => ({ id: key, value: filters[key] }));\n}\n\n/** Folds v9's next `columnFilters` back into the kit model: keys v9 does\n * not see are kept as they were. */\nexport function mergeV9ColumnFilters(\n filters: DataGridFilterModel,\n next: ColumnFiltersState,\n isEvaluated: (key: string) => boolean,\n): DataGridFilterModel {\n const merged: DataGridFilterModel = {};\n for (const key of Object.keys(filters)) {\n if (!isEvaluated(key)) merged[key] = filters[key];\n }\n for (const entry of next) {\n if (!isAbsentFilterValue(entry.value)) merged[entry.id] = entry.value;\n }\n return merged;\n}\n\n/** Drops keys whose value is `null` or `undefined` (AG's \"no filter\"). */\nexport function compactFilterModel(\n filters: DataGridFilterModel,\n): DataGridFilterModel {\n const out: DataGridFilterModel = {};\n for (const key of Object.keys(filters)) {\n if (!isAbsentFilterValue(filters[key])) out[key] = filters[key];\n }\n return out;\n}\n\nexport function toV9RowSelection(ids: readonly string[]): RowSelectionState {\n const record: RowSelectionState = {};\n for (const id of ids) record[id] = true;\n return record;\n}\n\nexport function fromV9RowSelection(state: RowSelectionState): string[] {\n return Object.keys(state).filter((id) => state[id] === true);\n}\n\nexport function toV9Expanded(ids: readonly string[]): ExpandedState {\n const record: Record<string, boolean> = {};\n for (const id of ids) record[id] = true;\n return record;\n}\n\n/** `true` (v9's \"all\") becomes every expandable id. */\nexport function fromV9Expanded(\n state: ExpandedState,\n allExpandableIds: () => readonly string[],\n): string[] {\n if (state === true) return [...allExpandableIds()];\n return Object.keys(state).filter((id) => state[id]);\n}\n\nexport function toV9Pinning(\n pinning: DataGridColumnPinning,\n utilityIds: readonly string[],\n): ColumnPinningState {\n return {\n start: [\n ...utilityIds,\n ...pinning.start.filter((id) => !utilityIds.includes(id)),\n ],\n end: pinning.end.filter((id) => !utilityIds.includes(id)),\n };\n}\n\nexport function fromV9Pinning(\n pinning: ColumnPinningState,\n isUtility: (id: string) => boolean,\n): DataGridColumnPinning {\n return {\n start: (pinning.start ?? []).filter((id) => !isUtility(id)),\n end: (pinning.end ?? []).filter((id) => !isUtility(id)),\n };\n}\n\nexport function fromV9Order(\n order: ColumnOrderState,\n isUtility: (id: string) => boolean,\n): string[] {\n return order.filter((id) => !isUtility(id));\n}\n\n/* ------------------------------------------------------------------ */\n/* Paging helpers */\n/* ------------------------------------------------------------------ */\n\n/** Largest valid page index for a page count (`-1` = unknown: no cap). */\nexport function clampPageIndex(pageIndex: number, pageCount: number): number {\n const index = Math.max(0, Math.floor(pageIndex));\n if (pageCount < 0) return index;\n return Math.min(index, Math.max(0, pageCount - 1));\n}\n\nexport interface DataGridPagerState {\n canPrevious: boolean;\n canNext: boolean;\n /** A known, finite last page exists (no last-page button otherwise). */\n hasLastPage: boolean;\n}\n\n/**\n * Pager buttons. With an unknown total (`pageCount: -1`), Next stays\n * enabled while the page is full and is disabled on a short page, and\n * there is no last-page button (types.ts `rowCount`). v9's own\n * `getCanNextPage()` is always `true` for `-1`, so the kit decides here.\n */\nexport function computeDataGridPagerState(input: {\n pageIndex: number;\n pageSize: number;\n pageCount: number;\n /** Top-level rows on the current page. */\n pageRowCount: number;\n}): DataGridPagerState {\n const { pageIndex, pageSize, pageCount, pageRowCount } = input;\n if (pageCount < 0) {\n return {\n canPrevious: pageIndex > 0,\n canNext: pageRowCount >= pageSize && pageRowCount > 0,\n hasLastPage: false,\n };\n }\n return {\n canPrevious: pageIndex > 0,\n canNext: pageIndex < pageCount - 1,\n hasLastPage: pageCount > 0,\n };\n}\n\n/* ------------------------------------------------------------------ */\n/* Store */\n/* ------------------------------------------------------------------ */\n\n/** The host callbacks the store calls, in kit shapes. */\nexport type DataGridStoreCallbacks = Pick<\n DataGridProps<unknown>,\n | 'onSortingChange'\n | 'onFiltersChange'\n | 'onQuickFilterChange'\n | 'onPageChange'\n | 'onRowSelectionChange'\n | 'onExpandedChange'\n | 'onColumnVisibilityChange'\n | 'onColumnPinningChange'\n | 'onColumnSizingChange'\n | 'onColumnOrderChange'\n | 'onQueryChange'\n>;\n\n/** Per-render facts the store reads at write time. */\nexport interface DataGridStoreContext {\n callbacks: DataGridStoreCallbacks;\n clearSelectionOnFilterChange: boolean;\n /** Locked row ids present in `rows`: added to every reported selection. */\n getLockedRowIds: () => readonly string[];\n /** Columns privacy mode masks right now (empty when it is off). Their\n * sort entries and filter keys leave `getQuery()`. */\n getMaskedColumnIds?: () => readonly string[];\n}\n\n/** One slice write in a batch. */\nexport type DataGridSliceWrite = {\n [K in DataGridSliceName]: {\n slice: K;\n next:\n | DataGridSlices[K]\n | ((previous: DataGridSlices[K]) => DataGridSlices[K]);\n };\n}[DataGridSliceName];\n\n/** What `reconcile` needs from the current row model. */\nexport interface DataGridReconcileInput {\n /** Keep a selected id? `null` keeps all (server mode never prunes). */\n keepSelectedId: ((id: string) => boolean) | null;\n /** Keep an expanded id? `null` keeps all. */\n keepExpandedId: ((id: string) => boolean) | null;\n /** Page count to clamp to; `null` or `-1` never clamps. */\n pageCount: number | null;\n}\n\n/** The store's full surface inside the data-grid folder. */\nexport interface DataGridStoreImpl extends DataGridStore {\n setContext(context: DataGridStoreContext): void;\n /** Several slices in one write: one page reset, one selection clear, one\n * `onQueryChange` (e.g. `clearFilters`, `moveColumn`). */\n writeMany(\n writes: readonly DataGridSliceWrite[],\n source: DataGridChangeSource,\n ): void;\n /** Delivers what `syncFromProps` recorded. Call outside render. */\n flushHostChanges(): void;\n /** Prunes selection and expanded ids and clamps the page (`'host'`). */\n reconcile(input: DataGridReconcileInput): void;\n /** Calls the host callbacks for slices seeded at creation (storage) and\n * emits `'columns'` with that source. Call once, after mount. */\n announceSeeded(\n slices: readonly DataGridSliceName[],\n source: DataGridChangeSource,\n ): void;\n /** Reported selection: selectable ids plus locked rows present. */\n getReportedSelection(): string[];\n /** The effective query: masked columns' sort entries and filter keys\n * are left out, and `maskedColumnIds` lists them while any exist. */\n getQuery(): DataGridQuery;\n /**\n * Reports an effective-query change that no slice write made (privacy\n * mode or the masked column set changed): with\n * `clearSelectionOnFilterChange`, clears the selection when the filters\n * or the search scope changed (one `'selection'` change, locked rows\n * kept); resets the page to 0 when it is not; then calls\n * `onQueryChange` once with the new query. A no-op\n * when the query equals the last one reported (or the one at creation).\n * Call outside render, after `flushHostChanges()`.\n */\n refreshEffectiveQuery(source: DataGridChangeSource): void;\n /** Increments on every change; for `useSyncExternalStore`. */\n getVersion(): number;\n}\n\n/** `'selection'` changes that cleared the selection because the effective\n * query alone changed (privacy mode paused or resumed a filter), with no\n * `'filter'` change before them. The announcer reads it. */\nconst querySelectionClears = new WeakSet<DataGridChange>();\n\n/** Did this change clear the selection for a new effective query? */\nexport function isQuerySelectionClear(change: DataGridChange): boolean {\n return querySelectionClears.has(change);\n}\n\nconst QUERY_SLICES: ReadonlySet<DataGridSliceName> = new Set([\n 'sorting',\n 'filters',\n 'quickFilter',\n 'page',\n]);\n\nconst PAGE_RESET_SLICES: ReadonlySet<DataGridSliceName> = new Set([\n 'sorting',\n 'filters',\n 'quickFilter',\n]);\n\nconst FILTER_SLICES: ReadonlySet<DataGridSliceName> = new Set([\n 'filters',\n 'quickFilter',\n]);\n\nconst SLICE_ORDER: readonly DataGridSliceName[] = [\n 'sorting',\n 'filters',\n 'quickFilter',\n 'page',\n 'rowSelection',\n 'expanded',\n 'columnVisibility',\n 'columnPinning',\n 'columnSizing',\n 'columnOrder',\n];\n\nfunction copySlice<K extends DataGridSliceName>(\n slice: K,\n value: DataGridSlices[K],\n): DataGridSlices[K] {\n switch (slice) {\n case 'sorting':\n return (value as DataGridSortEntry[]).map((entry) => ({\n ...entry,\n })) as DataGridSlices[K];\n case 'rowSelection':\n case 'expanded':\n case 'columnOrder':\n return [...(value as string[])] as DataGridSlices[K];\n case 'page':\n case 'filters':\n case 'columnVisibility':\n case 'columnSizing':\n return { ...(value as object) } as DataGridSlices[K];\n case 'columnPinning': {\n const pinning = value as DataGridColumnPinning;\n return {\n start: [...pinning.start],\n end: [...pinning.end],\n } as unknown as DataGridSlices[K];\n }\n default:\n return value;\n }\n}\n\nexport interface CreateDataGridStoreOptions {\n /** Every slice's starting value (controlled props, defaults, storage). */\n initial: DataGridSlices;\n /** Slices controlled at creation. */\n controlled?: Iterable<DataGridSliceName>;\n context: DataGridStoreContext;\n}\n\nexport function createDataGridStore(\n options: CreateDataGridStoreOptions,\n): DataGridStoreImpl {\n const held = { ...options.initial } as DataGridSlices;\n const controlledValue: Partial<DataGridSlices> = {};\n const pending: Partial<DataGridSlices> = {};\n const lastRestore: Partial<DataGridSlices> = {};\n const controlled = new Set<DataGridSliceName>(options.controlled ?? []);\n for (const slice of controlled) {\n (controlledValue as Record<string, unknown>)[slice] =\n options.initial[slice];\n }\n // Last correction per controlled slice: the prop value `reconcile`\n // corrected and what it corrected it to (stable JSON). The same pair is\n // never corrected twice; a new prop value clears it.\n const corrected: Partial<\n Record<DataGridSliceName, { from: string; to: string }>\n > = {};\n const listeners = new Set<(change: DataGridChange) => void>();\n let context = options.context;\n let version = 0;\n let queued: Array<{\n slice: DataGridSliceName;\n source: DataGridChangeSource;\n }> = [];\n\n function get<K extends DataGridSliceName>(slice: K): DataGridSlices[K] {\n if (controlled.has(slice)) {\n if (slice in pending) return pending[slice] as DataGridSlices[K];\n return controlledValue[slice] as DataGridSlices[K];\n }\n return held[slice];\n }\n\n function record<K extends DataGridSliceName>(\n slice: K,\n value: DataGridSlices[K],\n source: DataGridChangeSource,\n ): void {\n if (controlled.has(slice)) pending[slice] = value;\n else held[slice] = value;\n if (source === 'restore') lastRestore[slice] = value;\n version += 1;\n }\n\n function emit(change: DataGridChange): void {\n for (const listener of [...listeners]) listener(change);\n }\n\n function lockedIds(): string[] {\n return [...context.getLockedRowIds()];\n }\n\n function getReportedSelection(): string[] {\n const selected = get('rowSelection');\n const locked = lockedIds();\n const seen = new Set(selected);\n return [...selected, ...locked.filter((id) => !seen.has(id))];\n }\n\n function getQuery(): DataGridQuery {\n const masked = new Set(context.getMaskedColumnIds?.() ?? []);\n const filters = copySlice('filters', get('filters'));\n for (const key of Object.keys(filters)) {\n if (masked.has(key)) delete filters[key];\n }\n const query: DataGridQuery = {\n sorting: copySlice('sorting', get('sorting')).filter(\n (entry) => !masked.has(entry.colId),\n ),\n filters,\n quickFilter: get('quickFilter'),\n pagination: copySlice('page', get('page')),\n };\n if (masked.size > 0) query.maskedColumnIds = [...masked];\n return query;\n }\n\n /** What a server would fetch by. `maskedColumnIds` only narrows the\n * quick search, so with no search text it changes nothing. */\n function queryKey(query: DataGridQuery): string {\n if (query.quickFilter.trim() !== '') return stableStringify(query);\n const { maskedColumnIds: _unused, ...rest } = query;\n return stableStringify(rest);\n }\n\n /** The part of the query that picks the result set: filters and the\n * search (with its scope). Sorting and paging leave it alone. */\n function resultSetKey(query: DataGridQuery): string {\n const search = query.quickFilter.trim() !== '';\n return stableStringify({\n filters: query.filters,\n quickFilter: query.quickFilter,\n scope: search ? (query.maskedColumnIds ?? []) : [],\n });\n }\n\n // The query last given to `onQueryChange` (or the one at creation), so\n // `refreshEffectiveQuery` reports only what no write has reported yet.\n const initialQuery = getQuery();\n let lastQueryKey = queryKey(initialQuery);\n let lastResultSetKey = resultSetKey(initialQuery);\n\n function reportQuery(): void {\n const query = getQuery();\n lastQueryKey = queryKey(query);\n lastResultSetKey = resultSetKey(query);\n context.callbacks.onQueryChange?.(query);\n }\n\n /** Should `reconcile` correct this slice to `next`? Uncontrolled slices\n * and pending grid writes always; a controlled prop value once. */\n function shouldCorrect(slice: DataGridSliceName, next: unknown): boolean {\n if (!controlled.has(slice) || slice in pending) return true;\n const from = stableStringify(controlledValue[slice]);\n const to = stableStringify(next);\n const last = corrected[slice];\n if (last && last.from === from && last.to === to) return false;\n corrected[slice] = { from, to };\n return true;\n }\n\n function callHost(slice: DataGridSliceName): void {\n const { callbacks } = context;\n switch (slice) {\n case 'sorting':\n callbacks.onSortingChange?.(copySlice('sorting', get('sorting')));\n break;\n case 'filters':\n callbacks.onFiltersChange?.(copySlice('filters', get('filters')));\n break;\n case 'quickFilter':\n callbacks.onQuickFilterChange?.(get('quickFilter'));\n break;\n case 'page':\n callbacks.onPageChange?.(copySlice('page', get('page')));\n break;\n case 'rowSelection':\n callbacks.onRowSelectionChange?.(getReportedSelection());\n break;\n case 'expanded':\n callbacks.onExpandedChange?.(copySlice('expanded', get('expanded')));\n break;\n case 'columnVisibility':\n callbacks.onColumnVisibilityChange?.(\n copySlice('columnVisibility', get('columnVisibility')),\n );\n break;\n case 'columnPinning':\n callbacks.onColumnPinningChange?.(\n copySlice('columnPinning', get('columnPinning')),\n );\n break;\n case 'columnSizing':\n callbacks.onColumnSizingChange?.(\n copySlice('columnSizing', get('columnSizing')),\n );\n break;\n case 'columnOrder':\n callbacks.onColumnOrderChange?.(\n copySlice('columnOrder', get('columnOrder')),\n );\n break;\n }\n }\n\n /**\n * The shared tail of every change: page reset, host callbacks,\n * notifications, selection clear, `onQueryChange`. `callHostFor` lists\n * the changed slices whose host callback must run (a host-made change\n * does not call the host back for its own slice).\n */\n function settle(\n changed: readonly DataGridSliceName[],\n callHostFor: ReadonlySet<DataGridSliceName>,\n source: DataGridChangeSource,\n ): void {\n if (changed.length === 0) return;\n const ordered = SLICE_ORDER.filter((slice) => changed.includes(slice));\n\n // Page reset inside the same write.\n let pageReset = false;\n if (\n ordered.some((slice) => PAGE_RESET_SLICES.has(slice)) &&\n !ordered.includes('page')\n ) {\n const page = get('page');\n if (page.pageIndex !== 0) {\n record('page', { ...page, pageIndex: 0 }, source);\n pageReset = true;\n }\n }\n\n for (const slice of ordered) {\n if (callHostFor.has(slice)) callHost(slice);\n }\n if (pageReset) callHost('page');\n\n const events = new Set<string>();\n for (const slice of ordered) {\n const event = DATA_GRID_SLICE_EVENT[slice];\n if (events.has(event)) continue;\n events.add(event);\n emit({ event, source });\n }\n\n // clearSelectionOnFilterChange (types.ts): same source, after the\n // filter change, before onQueryChange; locked rows stay.\n if (\n context.clearSelectionOnFilterChange &&\n ordered.some((slice) => FILTER_SLICES.has(slice)) &&\n !ordered.includes('rowSelection') &&\n get('rowSelection').length > 0\n ) {\n record('rowSelection', [], source);\n callHost('rowSelection');\n emit({ event: 'selection', source });\n }\n\n if (pageReset || ordered.some((slice) => QUERY_SLICES.has(slice))) {\n reportQuery();\n }\n }\n\n function writeMany(\n writes: readonly DataGridSliceWrite[],\n source: DataGridChangeSource,\n ): void {\n const changed: DataGridSliceName[] = [];\n for (const { slice, next } of writes) {\n const previous = get(slice);\n const value =\n typeof next === 'function'\n ? (next as (p: typeof previous) => typeof previous)(previous)\n : next;\n if (stableEqual(previous, value)) continue;\n record(slice, value as never, source);\n if (!changed.includes(slice)) changed.push(slice);\n }\n settle(changed, new Set(changed), source);\n }\n\n const store: DataGridStoreImpl = {\n get,\n\n write(slice, next, source) {\n writeMany([{ slice, next } as DataGridSliceWrite], source);\n },\n\n writeMany,\n\n syncFromProps(controlledProps) {\n for (const slice of SLICE_ORDER) {\n const value = controlledProps[slice];\n if (value === undefined) {\n if (controlled.has(slice)) {\n // Controlled to uncontrolled: keep what the grid shows.\n (held as unknown as Record<string, unknown>)[slice] = get(slice);\n controlled.delete(slice);\n delete corrected[slice];\n delete pending[slice];\n delete controlledValue[slice];\n }\n continue;\n }\n const previous = get(slice);\n controlled.add(slice);\n const last = corrected[slice];\n if (last && last.from !== stableStringify(value)) {\n delete corrected[slice];\n }\n // Keep the old reference when nothing changed, so memoised v9\n // state (and its row models) survive a re-render.\n (controlledValue as Record<string, unknown>)[slice] = stableEqual(\n previous,\n value,\n )\n ? previous\n : value;\n delete pending[slice];\n if (!stableEqual(previous, value)) {\n const restored =\n slice in lastRestore && stableEqual(value, lastRestore[slice]);\n queued.push({ slice, source: restored ? 'restore' : 'host' });\n }\n }\n },\n\n flushHostChanges() {\n if (queued.length === 0) return;\n const batch = queued;\n queued = [];\n // One settle per source, in arrival order.\n const sources: DataGridChangeSource[] = [];\n for (const entry of batch) {\n if (!sources.includes(entry.source)) sources.push(entry.source);\n }\n for (const source of sources) {\n const slices = batch\n .filter((entry) => entry.source === source)\n .map((entry) => entry.slice);\n settle(slices, new Set(), source);\n }\n },\n\n reconcile(input) {\n const writes: DataGridSliceWrite[] = [];\n const { keepSelectedId, keepExpandedId, pageCount } = input;\n if (keepSelectedId) {\n const selected = get('rowSelection');\n const kept = selected.filter(keepSelectedId);\n if (\n kept.length !== selected.length &&\n shouldCorrect('rowSelection', kept)\n ) {\n writes.push({ slice: 'rowSelection', next: kept });\n }\n }\n if (keepExpandedId) {\n const expanded = get('expanded');\n const kept = expanded.filter(keepExpandedId);\n if (\n kept.length !== expanded.length &&\n shouldCorrect('expanded', kept)\n ) {\n writes.push({ slice: 'expanded', next: kept });\n }\n }\n if (pageCount !== null && pageCount >= 0) {\n const page = get('page');\n const clamped = clampPageIndex(page.pageIndex, pageCount);\n const next = { ...page, pageIndex: clamped };\n if (clamped !== page.pageIndex && shouldCorrect('page', next)) {\n writes.push({ slice: 'page', next });\n }\n }\n if (writes.length > 0) writeMany(writes, 'host');\n },\n\n announceSeeded(slices, source) {\n const ordered = SLICE_ORDER.filter((slice) => slices.includes(slice));\n if (ordered.length === 0) return;\n for (const slice of ordered) callHost(slice);\n const events = new Set(\n ordered.map((slice) => DATA_GRID_SLICE_EVENT[slice]),\n );\n for (const event of events) emit({ event, source });\n },\n\n notify(change) {\n emit(change);\n },\n\n isControlled(slice) {\n return controlled.has(slice);\n },\n\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n\n setContext(next) {\n context = next;\n },\n\n refreshEffectiveQuery(source) {\n const query = getQuery();\n if (queryKey(query) === lastQueryKey) return;\n // A paused or resumed filter, or a narrower search scope, is a new\n // result set, as a filter write is: clearSelectionOnFilterChange\n // applies (locked rows stay). A sort alone keeps the selection.\n if (\n context.clearSelectionOnFilterChange &&\n resultSetKey(query) !== lastResultSetKey &&\n get('rowSelection').length > 0\n ) {\n record('rowSelection', [], source);\n callHost('rowSelection');\n const change: DataGridChange = { event: 'selection', source };\n querySelectionClears.add(change);\n emit(change);\n }\n const page = get('page');\n if (page.pageIndex !== 0) {\n record('page', { ...page, pageIndex: 0 }, source);\n callHost('page');\n emit({ event: DATA_GRID_SLICE_EVENT.page, source });\n }\n reportQuery();\n },\n\n getReportedSelection,\n getQuery,\n getVersion: () => version,\n };\n\n return store;\n}\n\n/** The empty value of each slice (no props, no storage). */\nexport function emptyDataGridSlices(pageSize: number): DataGridSlices {\n return {\n sorting: [],\n filters: {},\n quickFilter: '',\n page: { pageIndex: 0, pageSize },\n rowSelection: [],\n expanded: [],\n columnVisibility: {},\n columnPinning: { start: [], end: [] },\n columnSizing: {},\n columnOrder: [],\n };\n}\n\n/** A shallow kit copy of a pagination value. */\nexport function copyPagination(page: DataGridPagination): DataGridPagination {\n return { pageIndex: page.pageIndex, pageSize: page.pageSize };\n}\n","/* -------------------------------------------------------------------- */\n/* DataGrid announcements: one polite live region (design § 4.7). */\n/* */\n/* The grid listens to its own change feed (`handle.subscribe`, which is */\n/* synchronous with every store write) and says what changed: */\n/* - sort: \"Sorted by Amount, ascending\" / \"Sort removed\"; */\n/* - filter or quick search, once settled (500 ms): \"12 rows\", skipped */\n/* at 0 because the no-results EmptyState is itself a polite status; */\n/* - select-all or a range (single toggles speak through the checkbox): */\n/* \"3 rows selected\"; single mode: \"Selection moved to {{row}}\"; */\n/* - a selection cleared by `clearSelectionOnFilterChange`; */\n/* - page: \"Page 2 of 5\"; */\n/* - column hidden, shown, moved, pinned, unpinned; */\n/* - loading for more than 500 ms, and the error title. */\n/* Changes the host makes through props (`'host'`), storage loads and */\n/* responsive hiding are not announced: the person did not ask for them. */\n/* No message carries a cell value; row names follow the privacy rule of */\n/* `getRowLabel` (the table meta already applies it). Every figure goes */\n/* through `formatNumber`, except plural `count`, which i18next needs as */\n/* a number to pick the form. */\n/* -------------------------------------------------------------------- */\n\nimport { useEffect, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { formatNumber } from '../_shared/format-number';\nimport { isQuerySelectionClear } from './state';\nimport type {\n DataGridChange,\n DataGridChangeSource,\n DataGridColumnInfo,\n DataGridHandle,\n DataGridSortEntry,\n} from './types';\n\n/** Delay before a settled filter or a slow load is announced. */\nexport const DATA_GRID_ANNOUNCE_SETTLE_MS = 500;\n\n/** A message leaves the region after this long, so a row name never sits\n * in the DOM once it has been read. */\nexport const DATA_GRID_ANNOUNCE_CLEAR_MS = 5000;\n\nconst ANNOUNCED_SOURCES: ReadonlySet<DataGridChangeSource> = new Set([\n 'user',\n 'api',\n 'restore',\n]);\n\ninterface Snapshot {\n sort: DataGridSortEntry[];\n selection: string[];\n pageIndex: number;\n columns: DataGridColumnInfo[];\n}\n\nfunction snapshot(handle: DataGridHandle): Snapshot {\n return {\n sort: handle.getSort(),\n selection: handle.getSelection(),\n pageIndex: handle.getCurrentPage(),\n columns: handle.getColumns(),\n };\n}\n\nexport interface DataGridAnnouncerOptions {\n handle: DataGridHandle;\n /** Plain or privacy-safe row name by id (table meta). */\n getRowLabel: (rowId: string) => string;\n status: 'ready' | 'loading' | 'error';\n /** Translated error title (host copy or the default). */\n errorTitle: string;\n selectionMode: 'none' | 'single' | 'multiple';\n /** Locked ids: never \"cleared\" by `clearSelectionOnFilterChange`. */\n clearSelectionOnFilterChange: boolean;\n /** The region is emptied whenever this changes: a message written before\n * privacy mode turned on may name a row. */\n privacyMode?: boolean;\n}\n\n/** Builds the current message. The region renders it. */\nexport function useDataGridAnnouncer({\n handle,\n getRowLabel,\n status,\n errorTitle,\n selectionMode,\n clearSelectionOnFilterChange,\n privacyMode = false,\n}: DataGridAnnouncerOptions): string {\n const { t, i18n } = useTranslation('ui');\n const [message, setMessage] = useState('');\n\n // Privacy mode changed: drop the last message (it may name a row).\n const privacyRef = useRef(privacyMode);\n useEffect(() => {\n if (privacyRef.current === privacyMode) return;\n privacyRef.current = privacyMode;\n setMessage('');\n }, [privacyMode]);\n\n // A read message does not stay in the DOM.\n useEffect(() => {\n if (message === '') return undefined;\n const timer = setTimeout(() => setMessage(''), DATA_GRID_ANNOUNCE_CLEAR_MS);\n return () => clearTimeout(timer);\n }, [message]);\n const latest = useRef({ t, language: i18n.language, getRowLabel });\n latest.current = { t, language: i18n.language, getRowLabel };\n const options = useRef({ selectionMode, clearSelectionOnFilterChange });\n options.current = { selectionMode, clearSelectionOnFilterChange };\n\n // One region, so a repeated message is cleared first and set on the next\n // frame, or screen readers would not repeat it.\n // A message queued before privacy mode changed is dropped.\n const say = useRef((text: string) => {\n setMessage('');\n const privacyAtCall = privacyRef.current;\n const set = () => {\n if (privacyRef.current === privacyAtCall) setMessage(text);\n };\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(set);\n } else {\n setTimeout(set, 0);\n }\n });\n\n // For kit copy that names no row: not dropped when privacy mode changes.\n const sayNeutral = useRef((text: string) => {\n setMessage('');\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(() => setMessage(text));\n } else {\n setTimeout(() => setMessage(text), 0);\n }\n });\n\n useEffect(() => {\n let previous = snapshot(handle);\n let settleTimer: ReturnType<typeof setTimeout> | undefined;\n // Selection held just before the last filter change (for \"cleared\").\n let selectionBeforeFilter: string[] | null = null;\n\n const fmt = (value: number) => formatNumber(value, latest.current.language);\n const label = (column: DataGridColumnInfo) => column.label;\n\n const announceRowsWhenSettled = () => {\n if (settleTimer !== undefined) clearTimeout(settleTimer);\n settleTimer = setTimeout(() => {\n settleTimer = undefined;\n const count = handle.getRowCount();\n // 0: the no-results EmptyState is itself a polite status.\n if (count <= 0) return;\n say.current(latest.current.t('dataGrid.announce.rows', { count }));\n }, DATA_GRID_ANNOUNCE_SETTLE_MS);\n };\n\n const onSort = (next: DataGridSortEntry[]) => {\n const { t } = latest.current;\n const primary = next[0];\n if (!primary) {\n say.current(t('dataGrid.sort.removed'));\n return;\n }\n const column = previous.columns.find((c) => c.id === primary.colId);\n if (!column) return;\n say.current(\n t('dataTable.sortAnnounce', {\n column: label(column),\n direction:\n primary.sort === 'asc'\n ? t('dataTable.sortAscending')\n : t('dataTable.sortDescending'),\n }),\n );\n };\n\n const onSelection = (before: string[], after: string[]) => {\n const { t, getRowLabel: rowLabel } = latest.current;\n const beforeSet = new Set(before);\n const added = after.filter((id) => !beforeSet.has(id));\n const afterSet = new Set(after);\n const removed = before.filter((id) => !afterSet.has(id));\n if (\n options.current.selectionMode === 'single' &&\n added.length === 1 &&\n removed.length > 0\n ) {\n say.current(\n t('dataGrid.selection.singleReplaced', { row: rowLabel(added[0]) }),\n );\n return;\n }\n // A single toggle speaks through its checkbox.\n if (added.length + removed.length <= 1) return;\n say.current(t('dataTable.selected', { count: after.length }));\n };\n\n const onColumns = (before: DataGridColumnInfo[]) => {\n const { t } = latest.current;\n const after = handle.getColumns();\n const byId = new Map(before.map((c) => [c.id, c]));\n // Visibility or pin changes name one column.\n for (const column of after) {\n const old = byId.get(column.id);\n if (!old) continue;\n if (old.visible !== column.visible) {\n say.current(\n column.visible\n ? t('dataGrid.announce.columnShown', { column: label(column) })\n : t('dataGrid.announce.columnHidden', { column: label(column) }),\n );\n return;\n }\n if (old.pinned !== column.pinned) {\n say.current(\n column.pinned === 'start'\n ? t('dataGrid.announce.columnPinnedStart', {\n column: label(column),\n })\n : column.pinned === 'end'\n ? t('dataGrid.announce.columnPinnedEnd', {\n column: label(column),\n })\n : t('dataGrid.announce.columnUnpinned', {\n column: label(column),\n }),\n );\n return;\n }\n }\n // A move: the column whose index moved furthest.\n let moved: DataGridColumnInfo | null = null;\n let distance = 0;\n for (const column of after) {\n const old = byId.get(column.id);\n if (!old) continue;\n const delta = Math.abs(column.index - old.index);\n if (delta > distance) {\n distance = delta;\n moved = column;\n }\n }\n if (moved) {\n say.current(\n t('dataGrid.announce.columnMoved', {\n column: label(moved),\n position: fmt(moved.index + 1),\n total: fmt(after.length),\n }),\n );\n }\n };\n\n const onPage = (pageIndex: number) => {\n const total = handle.getPageCount();\n // Unknown server total: the range text beside the pager says it.\n if (total < 1) return;\n say.current(\n latest.current.t('dataGrid.announce.page', {\n page: fmt(pageIndex + 1),\n total: fmt(total),\n }),\n );\n };\n\n const listener = (change: DataGridChange) => {\n const before = previous;\n previous = snapshot(handle);\n const announced = ANNOUNCED_SOURCES.has(change.source);\n\n switch (change.event) {\n case 'sort':\n if (announced) onSort(previous.sort);\n break;\n case 'filter':\n case 'quickFilter':\n selectionBeforeFilter = before.selection;\n if (announced) announceRowsWhenSettled();\n break;\n case 'rows':\n // Server mode: the new page arrives after the query; keep waiting\n // for it before counting.\n if (settleTimer !== undefined) announceRowsWhenSettled();\n break;\n case 'selection': {\n // Privacy mode paused or resumed a filter: a new result set with\n // no 'filter' change before it (state.ts refreshEffectiveQuery).\n const queryCleared = isQuerySelectionClear(change);\n const cleared =\n queryCleared ||\n (options.current.clearSelectionOnFilterChange &&\n selectionBeforeFilter !== null &&\n previous.selection.length < selectionBeforeFilter.length &&\n previous.selection.every((id) =>\n selectionBeforeFilter?.includes(id),\n ));\n selectionBeforeFilter = null;\n if (cleared) {\n // Any source: the person must learn their selection is gone.\n // Kit copy that names no row, so it survives the privacy\n // switch that caused it.\n const text = latest.current.t('dataGrid.announce.selectionCleared');\n if (queryCleared) sayNeutral.current(text);\n else say.current(text);\n break;\n }\n if (announced) onSelection(before.selection, previous.selection);\n break;\n }\n case 'pagination':\n if (announced && previous.pageIndex !== before.pageIndex) {\n onPage(previous.pageIndex);\n }\n break;\n case 'columns':\n if (announced) onColumns(before.columns);\n break;\n default:\n break;\n }\n if (change.event !== 'filter' && change.event !== 'quickFilter') {\n // Only the write straight after a filter change can be its clear.\n if (change.event !== 'selection') selectionBeforeFilter = null;\n }\n };\n\n const unsubscribe = handle.subscribe(listener);\n return () => {\n unsubscribe();\n if (settleTimer !== undefined) clearTimeout(settleTimer);\n };\n }, [handle]);\n\n // Loading for more than 500 ms, and errors.\n useEffect(() => {\n if (status === 'loading') {\n const timer = setTimeout(() => {\n say.current(latest.current.t('dataTable.loading'));\n }, DATA_GRID_ANNOUNCE_SETTLE_MS);\n return () => clearTimeout(timer);\n }\n if (status === 'error') {\n say.current(errorTitle);\n }\n return undefined;\n }, [status, errorTitle]);\n\n return message;\n}\n\n/** The polite region. Rendered once per grid. */\nexport function DataGridAnnouncer({ message }: { message: string }) {\n return (\n <span role=\"status\" aria-live=\"polite\" className=\"ds:sr-only\">\n {message}\n </span>\n );\n}\n","import React from \"react\";\n\n//#region src/FlexRender.tsx\nfunction isReactComponent(component) {\n\treturn isClassComponent(component) || typeof component === \"function\" || isExoticComponent(component);\n}\nfunction isClassComponent(component) {\n\treturn typeof component === \"function\" && (() => {\n\t\tconst proto = Object.getPrototypeOf(component);\n\t\treturn proto.prototype && proto.prototype.isReactComponent;\n\t})();\n}\nfunction isExoticComponent(component) {\n\treturn typeof component === \"object\" && typeof component.$$typeof === \"symbol\" && [\"react.memo\", \"react.forward_ref\"].includes(component.$$typeof.description);\n}\n/**\n* If rendering headers, cells, or footers with custom markup, use flexRender instead of `cell.getValue()` or `cell.renderValue()`.\n* @example flexRender(cell.column.columnDef.cell, cell.getContext())\n*/\nfunction flexRender(Comp, props) {\n\tif (Comp === null || Comp === void 0) return null;\n\treturn isReactComponent(Comp) ? /* @__PURE__ */ React.createElement(Comp, props) : Comp;\n}\n/**\n* Simplified component wrapper of `flexRender`. Use this utility component to render headers, cells, or footers with custom markup.\n* Only one prop (`cell`, `header`, or `footer`) may be passed.\n* @example\n* ```tsx\n* <FlexRender cell={cell} />\n* <FlexRender header={header} />\n* <FlexRender footer={footer} />\n* ```\n*\n* This replaces calling `flexRender` directly like this:\n* ```tsx\n* flexRender(cell.column.columnDef.cell, cell.getContext())\n* flexRender(header.column.columnDef.header, header.getContext())\n* flexRender(footer.column.columnDef.footer, footer.getContext())\n* ```\n*/\nfunction FlexRender(props) {\n\tif (\"cell\" in props && props.cell) {\n\t\tconst cell = props.cell;\n\t\tconst def = cell.column.columnDef;\n\t\tconst groupingCell = cell;\n\t\tconst groupingDef = def;\n\t\tif (groupingCell.getIsAggregated?.()) return flexRender(groupingDef.aggregatedCell ?? def.cell, cell.getContext());\n\t\tif (groupingCell.getIsPlaceholder?.()) return null;\n\t\treturn flexRender(def.cell, cell.getContext());\n\t}\n\tif (\"header\" in props && props.header) return flexRender(props.header.column.columnDef.header, props.header.getContext());\n\tif (\"footer\" in props && props.footer) return flexRender(props.footer.column.columnDef.footer, props.footer.getContext());\n\treturn null;\n}\n\n//#endregion\nexport { FlexRender, flexRender };","//#region src/alien.ts\nconst NONE = 0;\nconst MUTABLE = 1;\nconst WATCHING = 2;\nconst RECURSED_CHECK = 4;\nconst RECURSED = 8;\nconst DIRTY = 16;\nconst PENDING = 32;\n/* @__NO_SIDE_EFFECTS__ */\nfunction createReactiveSystem({ update, notify, unwatched }) {\n\treturn {\n\t\tlink,\n\t\tunlink,\n\t\tpropagate,\n\t\tcheckDirty,\n\t\tshallowPropagate\n\t};\n\tfunction link(dep, sub, version) {\n\t\tconst prevDep = sub.depsTail;\n\t\tif (prevDep !== void 0 && prevDep.dep === dep) return;\n\t\tconst nextDep = prevDep !== void 0 ? prevDep.nextDep : sub.deps;\n\t\tif (nextDep !== void 0 && nextDep.dep === dep) {\n\t\t\tnextDep.version = version;\n\t\t\tsub.depsTail = nextDep;\n\t\t\treturn;\n\t\t}\n\t\tconst prevSub = dep.subsTail;\n\t\tif (prevSub !== void 0 && prevSub.version === version && prevSub.sub === sub) return;\n\t\tconst newLink = sub.depsTail = dep.subsTail = {\n\t\t\tversion,\n\t\t\tdep,\n\t\t\tsub,\n\t\t\tprevDep,\n\t\t\tnextDep,\n\t\t\tprevSub,\n\t\t\tnextSub: void 0\n\t\t};\n\t\tif (nextDep !== void 0) nextDep.prevDep = newLink;\n\t\tif (prevDep !== void 0) prevDep.nextDep = newLink;\n\t\telse sub.deps = newLink;\n\t\tif (prevSub !== void 0) prevSub.nextSub = newLink;\n\t\telse dep.subs = newLink;\n\t}\n\tfunction unlink(link, sub = link.sub) {\n\t\tconst dep = link.dep;\n\t\tconst prevDep = link.prevDep;\n\t\tconst nextDep = link.nextDep;\n\t\tconst nextSub = link.nextSub;\n\t\tconst prevSub = link.prevSub;\n\t\tif (nextDep !== void 0) nextDep.prevDep = prevDep;\n\t\telse sub.depsTail = prevDep;\n\t\tif (prevDep !== void 0) prevDep.nextDep = nextDep;\n\t\telse sub.deps = nextDep;\n\t\tif (nextSub !== void 0) nextSub.prevSub = prevSub;\n\t\telse dep.subsTail = prevSub;\n\t\tif (prevSub !== void 0) prevSub.nextSub = nextSub;\n\t\telse if ((dep.subs = nextSub) === void 0) unwatched(dep);\n\t\treturn nextDep;\n\t}\n\tfunction propagate(link) {\n\t\tlet next = link.nextSub;\n\t\tlet stack;\n\t\ttop: do {\n\t\t\tconst sub = link.sub;\n\t\t\tlet flags = sub.flags;\n\t\t\tif (!(flags & 60)) sub.flags = flags | 32;\n\t\t\telse if (!(flags & (4 | 8))) flags = 0;\n\t\t\telse if (!(flags & 4)) sub.flags = flags & ~8 | 32;\n\t\t\telse if (!(flags & (16 | 32)) && isValidLink(link, sub)) {\n\t\t\t\tsub.flags = flags | (8 | 32);\n\t\t\t\tflags &= 1;\n\t\t\t} else flags = 0;\n\t\t\tif (flags & 2) notify(sub);\n\t\t\tif (flags & 1) {\n\t\t\t\tconst subSubs = sub.subs;\n\t\t\t\tif (subSubs !== void 0) {\n\t\t\t\t\tconst nextSub = (link = subSubs).nextSub;\n\t\t\t\t\tif (nextSub !== void 0) {\n\t\t\t\t\t\tstack = {\n\t\t\t\t\t\t\tvalue: next,\n\t\t\t\t\t\t\tprev: stack\n\t\t\t\t\t\t};\n\t\t\t\t\t\tnext = nextSub;\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ((link = next) !== void 0) {\n\t\t\t\tnext = link.nextSub;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\twhile (stack !== void 0) {\n\t\t\t\tlink = stack.value;\n\t\t\t\tstack = stack.prev;\n\t\t\t\tif (link !== void 0) {\n\t\t\t\t\tnext = link.nextSub;\n\t\t\t\t\tcontinue top;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t} while (true);\n\t}\n\tfunction checkDirty(link, sub) {\n\t\tlet stack;\n\t\tlet checkDepth = 0;\n\t\tlet dirty = false;\n\t\ttop: do {\n\t\t\tconst dep = link.dep;\n\t\t\tconst flags = dep.flags;\n\t\t\tif (sub.flags & 16) dirty = true;\n\t\t\telse if ((flags & (1 | 16)) === (1 | 16)) {\n\t\t\t\tif (update(dep)) {\n\t\t\t\t\tconst subs = dep.subs;\n\t\t\t\t\tif (subs.nextSub !== void 0) shallowPropagate(subs);\n\t\t\t\t\tdirty = true;\n\t\t\t\t}\n\t\t\t} else if ((flags & (1 | 32)) === (1 | 32)) {\n\t\t\t\tif (link.nextSub !== void 0 || link.prevSub !== void 0) stack = {\n\t\t\t\t\tvalue: link,\n\t\t\t\t\tprev: stack\n\t\t\t\t};\n\t\t\t\tlink = dep.deps;\n\t\t\t\tsub = dep;\n\t\t\t\t++checkDepth;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!dirty) {\n\t\t\t\tconst nextDep = link.nextDep;\n\t\t\t\tif (nextDep !== void 0) {\n\t\t\t\t\tlink = nextDep;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\twhile (checkDepth--) {\n\t\t\t\tconst firstSub = sub.subs;\n\t\t\t\tconst hasMultipleSubs = firstSub.nextSub !== void 0;\n\t\t\t\tif (hasMultipleSubs) {\n\t\t\t\t\tlink = stack.value;\n\t\t\t\t\tstack = stack.prev;\n\t\t\t\t} else link = firstSub;\n\t\t\t\tif (dirty) {\n\t\t\t\t\tif (update(sub)) {\n\t\t\t\t\t\tif (hasMultipleSubs) shallowPropagate(firstSub);\n\t\t\t\t\t\tsub = link.sub;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tdirty = false;\n\t\t\t\t} else sub.flags &= ~32;\n\t\t\t\tsub = link.sub;\n\t\t\t\tconst nextDep = link.nextDep;\n\t\t\t\tif (nextDep !== void 0) {\n\t\t\t\t\tlink = nextDep;\n\t\t\t\t\tcontinue top;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn dirty;\n\t\t} while (true);\n\t}\n\tfunction shallowPropagate(link) {\n\t\tdo {\n\t\t\tconst sub = link.sub;\n\t\t\tconst flags = sub.flags;\n\t\t\tif ((flags & (32 | 16)) === 32) {\n\t\t\t\tsub.flags = flags | 16;\n\t\t\t\tif ((flags & (2 | 4)) === 2) notify(sub);\n\t\t\t}\n\t\t} while ((link = link.nextSub) !== void 0);\n\t}\n\tfunction isValidLink(checkLink, sub) {\n\t\tlet link = sub.depsTail;\n\t\twhile (link !== void 0) {\n\t\t\tif (link === checkLink) return true;\n\t\t\tlink = link.prevDep;\n\t\t}\n\t\treturn false;\n\t}\n}\n\n//#endregion\nexport { createReactiveSystem };\n//# sourceMappingURL=alien.js.map","import { createReactiveSystem } from \"./alien.js\";\n\n//#region src/atom.ts\nfunction toObserver(nextHandler, errorHandler, completionHandler) {\n\tconst isObserver = typeof nextHandler === \"object\";\n\tconst self = isObserver ? nextHandler : void 0;\n\treturn {\n\t\tnext: (isObserver ? nextHandler.next : nextHandler)?.bind(self),\n\t\terror: (isObserver ? nextHandler.error : errorHandler)?.bind(self),\n\t\tcomplete: (isObserver ? nextHandler.complete : completionHandler)?.bind(self)\n\t};\n}\nconst queuedEffects = [];\nlet cycle = 0;\nconst { link, unlink, propagate, checkDirty, shallowPropagate } = /* @__PURE__ */ createReactiveSystem({\n\tupdate(atom) {\n\t\treturn atom._update();\n\t},\n\tnotify(effect) {\n\t\tqueuedEffects[queuedEffectsLength++] = effect;\n\t\teffect.flags &= ~2;\n\t},\n\tunwatched(atom) {\n\t\tif (atom.depsTail !== void 0) {\n\t\t\tatom.depsTail = void 0;\n\t\t\tatom.flags = 1 | 16;\n\t\t\tpurgeDeps(atom);\n\t\t}\n\t}\n});\nlet notifyIndex = 0;\nlet queuedEffectsLength = 0;\nlet activeSub;\nlet batchDepth = 0;\nfunction batch(fn) {\n\ttry {\n\t\t++batchDepth;\n\t\tfn();\n\t} finally {\n\t\tif (!--batchDepth) flush();\n\t}\n}\nfunction purgeDeps(sub) {\n\tconst depsTail = sub.depsTail;\n\tlet dep = depsTail !== void 0 ? depsTail.nextDep : sub.deps;\n\twhile (dep !== void 0) dep = unlink(dep, sub);\n}\nfunction flush() {\n\tif (batchDepth > 0) return;\n\twhile (notifyIndex < queuedEffectsLength) {\n\t\tconst effect = queuedEffects[notifyIndex];\n\t\tqueuedEffects[notifyIndex++] = void 0;\n\t\teffect.notify();\n\t}\n\tnotifyIndex = 0;\n\tqueuedEffectsLength = 0;\n}\nfunction createAsyncAtom(getValue, options) {\n\tconst ref = {};\n\tconst atom = createAtom(() => {\n\t\tgetValue().then((data) => {\n\t\t\tconst internalAtom = ref.current;\n\t\t\tif (internalAtom._update({\n\t\t\t\tstatus: \"done\",\n\t\t\t\tdata\n\t\t\t})) {\n\t\t\t\tconst subs = internalAtom.subs;\n\t\t\t\tif (subs !== void 0) {\n\t\t\t\t\tpropagate(subs);\n\t\t\t\t\tshallowPropagate(subs);\n\t\t\t\t\tflush();\n\t\t\t\t}\n\t\t\t}\n\t\t}, (error) => {\n\t\t\tconst internalAtom = ref.current;\n\t\t\tif (internalAtom._update({\n\t\t\t\tstatus: \"error\",\n\t\t\t\terror\n\t\t\t})) {\n\t\t\t\tconst subs = internalAtom.subs;\n\t\t\t\tif (subs !== void 0) {\n\t\t\t\t\tpropagate(subs);\n\t\t\t\t\tshallowPropagate(subs);\n\t\t\t\t\tflush();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn { status: \"pending\" };\n\t}, options);\n\tref.current = atom;\n\treturn atom;\n}\nfunction createAtom(valueOrFn, options) {\n\tconst isComputed = typeof valueOrFn === \"function\";\n\tconst getter = valueOrFn;\n\tconst atom = {\n\t\t_snapshot: isComputed ? void 0 : valueOrFn,\n\t\tsubs: void 0,\n\t\tsubsTail: void 0,\n\t\tdeps: void 0,\n\t\tdepsTail: void 0,\n\t\tflags: isComputed ? 0 : 1,\n\t\tget() {\n\t\t\tif (activeSub !== void 0) link(atom, activeSub, cycle);\n\t\t\treturn atom._snapshot;\n\t\t},\n\t\tsubscribe(observerOrFn) {\n\t\t\tconst obs = toObserver(observerOrFn);\n\t\t\tconst observed = { current: false };\n\t\t\tconst e = effect(() => {\n\t\t\t\tatom.get();\n\t\t\t\tif (!observed.current) observed.current = true;\n\t\t\t\telse {\n\t\t\t\t\tactiveSub = void 0;\n\t\t\t\t\tobs.next?.(atom._snapshot);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn { unsubscribe: () => {\n\t\t\t\te.stop();\n\t\t\t} };\n\t\t},\n\t\t_update(getValue) {\n\t\t\tconst prevSub = activeSub;\n\t\t\tconst compare = options?.compare ?? Object.is;\n\t\t\tif (isComputed) {\n\t\t\t\tactiveSub = atom;\n\t\t\t\t++cycle;\n\t\t\t\tatom.depsTail = void 0;\n\t\t\t} else if (getValue === void 0) return false;\n\t\t\tif (isComputed) atom.flags = 1 | 4;\n\t\t\ttry {\n\t\t\t\tconst oldValue = atom._snapshot;\n\t\t\t\tconst newValue = typeof getValue === \"function\" ? getValue(oldValue) : getValue === void 0 && isComputed ? getter(oldValue) : getValue;\n\t\t\t\tif (oldValue === void 0 || !compare(oldValue, newValue)) {\n\t\t\t\t\tatom._snapshot = newValue;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t} finally {\n\t\t\t\tactiveSub = prevSub;\n\t\t\t\tif (isComputed) atom.flags &= ~4;\n\t\t\t\tpurgeDeps(atom);\n\t\t\t}\n\t\t}\n\t};\n\tif (isComputed) {\n\t\tatom.flags = 1 | 16;\n\t\tatom.get = function() {\n\t\t\tconst flags = atom.flags;\n\t\t\tif (flags & 16 || flags & 32 && checkDirty(atom.deps, atom)) {\n\t\t\t\tif (atom._update()) {\n\t\t\t\t\tconst subs = atom.subs;\n\t\t\t\t\tif (subs !== void 0) shallowPropagate(subs);\n\t\t\t\t}\n\t\t\t} else if (flags & 32) atom.flags = flags & ~32;\n\t\t\tif (activeSub !== void 0) link(atom, activeSub, cycle);\n\t\t\treturn atom._snapshot;\n\t\t};\n\t} else atom.set = function(valueOrFn) {\n\t\tif (atom._update(valueOrFn)) {\n\t\t\tconst subs = atom.subs;\n\t\t\tif (subs !== void 0) {\n\t\t\t\tpropagate(subs);\n\t\t\t\tshallowPropagate(subs);\n\t\t\t\tflush();\n\t\t\t}\n\t\t}\n\t};\n\treturn atom;\n}\nfunction effect(fn) {\n\tconst run = () => {\n\t\tconst prevSub = activeSub;\n\t\tactiveSub = effectObj;\n\t\t++cycle;\n\t\teffectObj.depsTail = void 0;\n\t\teffectObj.flags = 2 | 4;\n\t\ttry {\n\t\t\treturn fn();\n\t\t} finally {\n\t\t\tactiveSub = prevSub;\n\t\t\teffectObj.flags &= ~4;\n\t\t\tpurgeDeps(effectObj);\n\t\t}\n\t};\n\tconst effectObj = {\n\t\tdeps: void 0,\n\t\tdepsTail: void 0,\n\t\tsubs: void 0,\n\t\tsubsTail: void 0,\n\t\tflags: 2 | 4,\n\t\tnotify() {\n\t\t\tconst flags = this.flags;\n\t\t\tif (flags & 16 || flags & 32 && checkDirty(this.deps, this)) run();\n\t\t\telse this.flags = 2;\n\t\t},\n\t\tstop() {\n\t\t\tthis.flags = 0;\n\t\t\tthis.depsTail = void 0;\n\t\t\tpurgeDeps(this);\n\t\t}\n\t};\n\trun();\n\treturn effectObj;\n}\n\n//#endregion\nexport { batch, createAsyncAtom, createAtom, flush, toObserver };\n//# sourceMappingURL=atom.js.map","//#region src/shallow.ts\nfunction shallow(objA, objB) {\n\tif (Object.is(objA, objB)) return true;\n\tif (typeof objA !== \"object\" || objA === null || typeof objB !== \"object\" || objB === null) return false;\n\tif (objA instanceof Map && objB instanceof Map) {\n\t\tif (objA.size !== objB.size) return false;\n\t\tfor (const [k, v] of objA) if (!objB.has(k) || !Object.is(v, objB.get(k))) return false;\n\t\treturn true;\n\t}\n\tif (objA instanceof Set && objB instanceof Set) {\n\t\tif (objA.size !== objB.size) return false;\n\t\tfor (const v of objA) if (!objB.has(v)) return false;\n\t\treturn true;\n\t}\n\tif (objA instanceof Date && objB instanceof Date) {\n\t\tif (objA.getTime() !== objB.getTime()) return false;\n\t\treturn true;\n\t}\n\tconst keysA = getOwnKeys(objA);\n\tif (keysA.length !== getOwnKeys(objB).length) return false;\n\tfor (let i = 0; i < keysA.length; i++) if (!Object.prototype.hasOwnProperty.call(objB, keysA[i]) || !Object.is(objA[keysA[i]], objB[keysA[i]])) return false;\n\treturn true;\n}\nfunction getOwnKeys(obj) {\n\treturn Object.keys(obj).concat(Object.getOwnPropertySymbols(obj));\n}\n\n//#endregion\nexport { shallow };\n//# sourceMappingURL=shallow.js.map","/**\n * @license React\n * use-sync-external-store-shim.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar React = require(\"react\");\nfunction is(x, y) {\n return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n}\nvar objectIs = \"function\" === typeof Object.is ? Object.is : is,\n useState = React.useState,\n useEffect = React.useEffect,\n useLayoutEffect = React.useLayoutEffect,\n useDebugValue = React.useDebugValue;\nfunction useSyncExternalStore$2(subscribe, getSnapshot) {\n var value = getSnapshot(),\n _useState = useState({ inst: { value: value, getSnapshot: getSnapshot } }),\n inst = _useState[0].inst,\n forceUpdate = _useState[1];\n useLayoutEffect(\n function () {\n inst.value = value;\n inst.getSnapshot = getSnapshot;\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n },\n [subscribe, value, getSnapshot]\n );\n useEffect(\n function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n return subscribe(function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n });\n },\n [subscribe]\n );\n useDebugValue(value);\n return value;\n}\nfunction checkIfSnapshotChanged(inst) {\n var latestGetSnapshot = inst.getSnapshot;\n inst = inst.value;\n try {\n var nextValue = latestGetSnapshot();\n return !objectIs(inst, nextValue);\n } catch (error) {\n return !0;\n }\n}\nfunction useSyncExternalStore$1(subscribe, getSnapshot) {\n return getSnapshot();\n}\nvar shim =\n \"undefined\" === typeof window ||\n \"undefined\" === typeof window.document ||\n \"undefined\" === typeof window.document.createElement\n ? useSyncExternalStore$1\n : useSyncExternalStore$2;\nexports.useSyncExternalStore =\n void 0 !== React.useSyncExternalStore ? React.useSyncExternalStore : shim;\n","/**\n * @license React\n * use-sync-external-store-shim.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function is(x, y) {\n return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n }\n function useSyncExternalStore$2(subscribe, getSnapshot) {\n didWarnOld18Alpha ||\n void 0 === React.startTransition ||\n ((didWarnOld18Alpha = !0),\n console.error(\n \"You are using an outdated, pre-release alpha of React 18 that does not support useSyncExternalStore. The use-sync-external-store shim will not work correctly. Upgrade to a newer pre-release.\"\n ));\n var value = getSnapshot();\n if (!didWarnUncachedGetSnapshot) {\n var cachedValue = getSnapshot();\n objectIs(value, cachedValue) ||\n (console.error(\n \"The result of getSnapshot should be cached to avoid an infinite loop\"\n ),\n (didWarnUncachedGetSnapshot = !0));\n }\n cachedValue = useState({\n inst: { value: value, getSnapshot: getSnapshot }\n });\n var inst = cachedValue[0].inst,\n forceUpdate = cachedValue[1];\n useLayoutEffect(\n function () {\n inst.value = value;\n inst.getSnapshot = getSnapshot;\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n },\n [subscribe, value, getSnapshot]\n );\n useEffect(\n function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n return subscribe(function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n });\n },\n [subscribe]\n );\n useDebugValue(value);\n return value;\n }\n function checkIfSnapshotChanged(inst) {\n var latestGetSnapshot = inst.getSnapshot;\n inst = inst.value;\n try {\n var nextValue = latestGetSnapshot();\n return !objectIs(inst, nextValue);\n } catch (error) {\n return !0;\n }\n }\n function useSyncExternalStore$1(subscribe, getSnapshot) {\n return getSnapshot();\n }\n \"undefined\" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&\n \"function\" ===\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart &&\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());\n var React = require(\"react\"),\n objectIs = \"function\" === typeof Object.is ? Object.is : is,\n useState = React.useState,\n useEffect = React.useEffect,\n useLayoutEffect = React.useLayoutEffect,\n useDebugValue = React.useDebugValue,\n didWarnOld18Alpha = !1,\n didWarnUncachedGetSnapshot = !1,\n shim =\n \"undefined\" === typeof window ||\n \"undefined\" === typeof window.document ||\n \"undefined\" === typeof window.document.createElement\n ? useSyncExternalStore$1\n : useSyncExternalStore$2;\n exports.useSyncExternalStore =\n void 0 !== React.useSyncExternalStore ? React.useSyncExternalStore : shim;\n \"undefined\" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&\n \"function\" ===\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error());\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('../cjs/use-sync-external-store-shim.production.js');\n} else {\n module.exports = require('../cjs/use-sync-external-store-shim.development.js');\n}\n","/**\n * @license React\n * use-sync-external-store-shim/with-selector.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar React = require(\"react\"),\n shim = require(\"use-sync-external-store/shim\");\nfunction is(x, y) {\n return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n}\nvar objectIs = \"function\" === typeof Object.is ? Object.is : is,\n useSyncExternalStore = shim.useSyncExternalStore,\n useRef = React.useRef,\n useEffect = React.useEffect,\n useMemo = React.useMemo,\n useDebugValue = React.useDebugValue;\nexports.useSyncExternalStoreWithSelector = function (\n subscribe,\n getSnapshot,\n getServerSnapshot,\n selector,\n isEqual\n) {\n var instRef = useRef(null);\n if (null === instRef.current) {\n var inst = { hasValue: !1, value: null };\n instRef.current = inst;\n } else inst = instRef.current;\n instRef = useMemo(\n function () {\n function memoizedSelector(nextSnapshot) {\n if (!hasMemo) {\n hasMemo = !0;\n memoizedSnapshot = nextSnapshot;\n nextSnapshot = selector(nextSnapshot);\n if (void 0 !== isEqual && inst.hasValue) {\n var currentSelection = inst.value;\n if (isEqual(currentSelection, nextSnapshot))\n return (memoizedSelection = currentSelection);\n }\n return (memoizedSelection = nextSnapshot);\n }\n currentSelection = memoizedSelection;\n if (objectIs(memoizedSnapshot, nextSnapshot)) return currentSelection;\n var nextSelection = selector(nextSnapshot);\n if (void 0 !== isEqual && isEqual(currentSelection, nextSelection))\n return (memoizedSnapshot = nextSnapshot), currentSelection;\n memoizedSnapshot = nextSnapshot;\n return (memoizedSelection = nextSelection);\n }\n var hasMemo = !1,\n memoizedSnapshot,\n memoizedSelection,\n maybeGetServerSnapshot =\n void 0 === getServerSnapshot ? null : getServerSnapshot;\n return [\n function () {\n return memoizedSelector(getSnapshot());\n },\n null === maybeGetServerSnapshot\n ? void 0\n : function () {\n return memoizedSelector(maybeGetServerSnapshot());\n }\n ];\n },\n [getSnapshot, getServerSnapshot, selector, isEqual]\n );\n var value = useSyncExternalStore(subscribe, instRef[0], instRef[1]);\n useEffect(\n function () {\n inst.hasValue = !0;\n inst.value = value;\n },\n [value]\n );\n useDebugValue(value);\n return value;\n};\n","/**\n * @license React\n * use-sync-external-store-shim/with-selector.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function is(x, y) {\n return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n }\n \"undefined\" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&\n \"function\" ===\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart &&\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());\n var React = require(\"react\"),\n shim = require(\"use-sync-external-store/shim\"),\n objectIs = \"function\" === typeof Object.is ? Object.is : is,\n useSyncExternalStore = shim.useSyncExternalStore,\n useRef = React.useRef,\n useEffect = React.useEffect,\n useMemo = React.useMemo,\n useDebugValue = React.useDebugValue;\n exports.useSyncExternalStoreWithSelector = function (\n subscribe,\n getSnapshot,\n getServerSnapshot,\n selector,\n isEqual\n ) {\n var instRef = useRef(null);\n if (null === instRef.current) {\n var inst = { hasValue: !1, value: null };\n instRef.current = inst;\n } else inst = instRef.current;\n instRef = useMemo(\n function () {\n function memoizedSelector(nextSnapshot) {\n if (!hasMemo) {\n hasMemo = !0;\n memoizedSnapshot = nextSnapshot;\n nextSnapshot = selector(nextSnapshot);\n if (void 0 !== isEqual && inst.hasValue) {\n var currentSelection = inst.value;\n if (isEqual(currentSelection, nextSnapshot))\n return (memoizedSelection = currentSelection);\n }\n return (memoizedSelection = nextSnapshot);\n }\n currentSelection = memoizedSelection;\n if (objectIs(memoizedSnapshot, nextSnapshot))\n return currentSelection;\n var nextSelection = selector(nextSnapshot);\n if (void 0 !== isEqual && isEqual(currentSelection, nextSelection))\n return (memoizedSnapshot = nextSnapshot), currentSelection;\n memoizedSnapshot = nextSnapshot;\n return (memoizedSelection = nextSelection);\n }\n var hasMemo = !1,\n memoizedSnapshot,\n memoizedSelection,\n maybeGetServerSnapshot =\n void 0 === getServerSnapshot ? null : getServerSnapshot;\n return [\n function () {\n return memoizedSelector(getSnapshot());\n },\n null === maybeGetServerSnapshot\n ? void 0\n : function () {\n return memoizedSelector(maybeGetServerSnapshot());\n }\n ];\n },\n [getSnapshot, getServerSnapshot, selector, isEqual]\n );\n var value = useSyncExternalStore(subscribe, instRef[0], instRef[1]);\n useEffect(\n function () {\n inst.hasValue = !0;\n inst.value = value;\n },\n [value]\n );\n useDebugValue(value);\n return value;\n };\n \"undefined\" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&\n \"function\" ===\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error());\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('../cjs/use-sync-external-store-shim/with-selector.production.js');\n} else {\n module.exports = require('../cjs/use-sync-external-store-shim/with-selector.development.js');\n}\n","import { useCallback } from \"react\";\nimport { useSyncExternalStoreWithSelector } from \"use-sync-external-store/shim/with-selector\";\n\n//#region src/useSelector.ts\nfunction defaultCompare(a, b) {\n\treturn a === b;\n}\n/**\n* Selects a slice of state from an atom or store and subscribes the component\n* to that selection.\n*\n* This is the primary React read hook for TanStack Store. It works with any\n* source that exposes `get()` and `subscribe()`, including atoms, readonly\n* atoms, stores, and readonly stores.\n*\n* Omit the selector to subscribe to the whole value.\n*\n* @example\n* ```tsx\n* const count = useSelector(counterStore, (state) => state.count)\n* ```\n*\n* @example\n* ```tsx\n* const value = useSelector(countAtom)\n* ```\n*/\nfunction useSelector(source, selector = (s) => s, options) {\n\tconst compare = options?.compare ?? defaultCompare;\n\tconst subscribe = useCallback((handleStoreChange) => {\n\t\tconst { unsubscribe } = source.subscribe(handleStoreChange);\n\t\treturn unsubscribe;\n\t}, [source]);\n\tconst getSnapshot = useCallback(() => source.get(), [source]);\n\treturn useSyncExternalStoreWithSelector(subscribe, getSnapshot, getSnapshot, selector, compare);\n}\n\n//#endregion\nexport { useSelector };\n//# sourceMappingURL=useSelector.js.map","'use client';\n\nimport { shallow, useSelector } from \"@tanstack/react-store\";\n\n//#region src/Subscribe.ts\nfunction Subscribe(props) {\n\tconst selected = useSelector(props.source, props.selector, { compare: shallow });\n\treturn typeof props.children === \"function\" ? props.children(selected) : props.children;\n}\n\n//#endregion\nexport { Subscribe };","//#region src/core/reactivity/coreReactivityFeature.utils.ts\n/**\n* Bridges atom instances to the `Store`/`ReadonlyStore` API by exposing\n* a `state` getter backed by `atom.get()`, and wiring `setState` for\n* writable atoms.\n*\n* @example\n* ```ts\n* const store = atomToStore(atom)\n* ```\n*/\nfunction atomToStore(atom) {\n\tconst store = atom;\n\tObject.defineProperty(atom, \"state\", { get() {\n\t\treturn atom.get();\n\t} });\n\tif (\"set\" in atom) store.setState = atom.set.bind(atom);\n\treturn store;\n}\n\n//#endregion\nexport { atomToStore };","//#region src/core/reactivity/renderPhaseReactivity.ts\n/**\n* Creates reactivity bindings for render-phase adapters (React, Preact, Lit):\n* frameworks with plain, non-reactive options that are re-synchronized during\n* component render, where store notifications must not fire until the host\n* commits.\n*\n* Readonly atoms are exposed as live facades. `get()` re-evaluates the\n* resolver against the options of the render in progress — a normal computed\n* cannot know that plain `options.state` changed — and caches the result\n* through the configured comparator so external-store consumers (e.g. React's\n* `useSyncExternalStore`) see referentially stable snapshots. `subscribe()`\n* goes through a hidden computed that tracks the resolver's real atom\n* dependencies plus a commit version, so subscribers are invalidated by\n* actual reactive writes and by the adapter's post-commit publication.\n*\n* @example\n* ```ts\n* import { batch, createAtom } from '@tanstack/react-store'\n*\n* export const reactReactivity = () =>\n* renderPhaseReactivity({ createAtom, batch })\n* ```\n*/\nfunction renderPhaseReactivity(primitives) {\n\tconst { createAtom, batch } = primitives;\n\tconst commitAtom = createAtom(0);\n\treturn {\n\t\tcreateOptionsStore: false,\n\t\twrapExternalAtoms: false,\n\t\taddSubscription: () => {\n\t\t\tthrow new Error(\"Feature not supported in current reactivity implementation\");\n\t\t},\n\t\tunmount: () => {\n\t\t\tthrow new Error(\"Feature not supported in current reactivity implementation\");\n\t\t},\n\t\tschedule: primitives.schedule ?? ((fn) => queueMicrotask(fn)),\n\t\tbatch,\n\t\tuntrack: (fn) => fn(),\n\t\tcreateReadonlyAtom: (fn, atomOptions) => {\n\t\t\tconst compare = atomOptions?.compare ?? Object.is;\n\t\t\tlet hasSnapshot = false;\n\t\t\tlet snapshot;\n\t\t\tconst getSnapshot = () => {\n\t\t\t\tconst nextSnapshot = fn();\n\t\t\t\tif (!hasSnapshot || !compare(snapshot, nextSnapshot)) {\n\t\t\t\t\tsnapshot = nextSnapshot;\n\t\t\t\t\thasSnapshot = true;\n\t\t\t\t}\n\t\t\t\treturn snapshot;\n\t\t\t};\n\t\t\tconst reactiveAtom = createAtom(() => {\n\t\t\t\tcommitAtom.get();\n\t\t\t\treturn getSnapshot();\n\t\t\t}, { compare });\n\t\t\treturn {\n\t\t\t\tget: getSnapshot,\n\t\t\t\tsubscribe: reactiveAtom.subscribe.bind(reactiveAtom)\n\t\t\t};\n\t\t},\n\t\tcreateWritableAtom: (value, atomOptions) => {\n\t\t\treturn createAtom(value, { compare: atomOptions?.compare });\n\t\t},\n\t\tcommit: () => {\n\t\t\tcommitAtom.set((version) => version + 1);\n\t\t}\n\t};\n}\n/**\n* Creates a render-phase source with an explicit commit baseline.\n*\n* Render-phase adapters publish controlled state after the host framework\n* commits so isolated subscribers update, but the component that owns the\n* table already rendered that exact snapshot — forwarding the notification to\n* its root subscription would produce a redundant render. Unlike a last-read\n* filter, speculative reads do not change notification behavior: only\n* `markCommitted()` advances the baseline.\n*/\nfunction createRenderPhaseSource(source, compare = Object.is) {\n\tlet hasCommittedSnapshot = false;\n\tlet committedSnapshot;\n\treturn {\n\t\tget: source.get,\n\t\tmarkCommitted: (snapshot) => {\n\t\t\tcommittedSnapshot = snapshot;\n\t\t\thasCommittedSnapshot = true;\n\t\t},\n\t\tsubscribe: (listener) => source.subscribe((value) => {\n\t\t\tif (!hasCommittedSnapshot || !compare(committedSnapshot, value)) listener(value);\n\t\t})\n\t};\n}\n\n//#endregion\nexport { createRenderPhaseSource, renderPhaseReactivity };","import { batch, createAtom } from \"@tanstack/react-store\";\nimport { renderPhaseReactivity } from \"@tanstack/table-core/reactivity\";\n\n//#region src/reactivity.ts\n/**\n* Creates the table-core reactivity bindings used by the React adapter.\n*\n* React stores table state in TanStack Store atoms and leaves options as plain\n* resolved data because `useTable` synchronizes options during render. The\n* render-phase preset supplies the live readonly-atom facades and the `commit`\n* hook; the store primitives are passed in from `@tanstack/react-store` so all\n* atoms share one store instance with user-provided external atoms.\n*/\nfunction reactReactivity() {\n\treturn renderPhaseReactivity({\n\t\tcreateAtom,\n\t\tbatch\n\t});\n}\n\n//#endregion\nexport { reactReactivity };","//#region src/utils.ts\n/**\n* Applies a TanStack updater to a value.\n*\n* If the updater is a function it is called with the previous value; otherwise the updater value is returned directly.\n*/\nfunction functionalUpdate(updater, input) {\n\treturn typeof updater === \"function\" ? updater(input) : updater;\n}\n/**\n* Clones table state values while preserving non-plain objects.\n*\n* Plain objects and arrays are copied recursively so state updates can avoid mutating existing references.\n*/\nfunction cloneState(value) {\n\tif (Array.isArray(value)) return value.map(cloneState);\n\tif (value && typeof value === \"object\") {\n\t\tconst proto = Object.getPrototypeOf(value);\n\t\tif (proto !== Object.prototype && proto !== null) return value;\n\t\tconst copy = proto === null ? makeObjectMap() : {};\n\t\tconst keys = Object.keys(value);\n\t\tfor (let i = 0; i < keys.length; i++) {\n\t\t\tconst key = keys[i];\n\t\t\tObject.defineProperty(copy, key, {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: cloneState(value[key]),\n\t\t\t\twritable: true\n\t\t\t});\n\t\t}\n\t\treturn copy;\n\t}\n\treturn value;\n}\n/**\n* Copies prototype-instance own properties without carrying over lazy memo\n* closures or the per-row cell cache, both of which are bound to the source\n* instance (cached cells reference the source row).\n*/\nfunction copyInstancePropertiesWithoutMemos(target, source) {\n\tconst keys = Object.keys(source);\n\tconst targetRecord = target;\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tconst key = keys[i];\n\t\tif (!key.startsWith(\"_memo_\") && key !== \"_cellsCache\") targetRecord[key] = source[key];\n\t}\n\treturn target;\n}\n/**\n* Creates an object intended only for string-keyed dictionary lookups.\n*\n* The null prototype keeps user-controlled ids such as `__proto__` and\n* `hasOwnProperty` as plain data keys.\n*/\nfunction makeObjectMap() {\n\treturn Object.create(null);\n}\n/**\n* Checks whether an object owns a key, including null-prototype dictionaries.\n*/\nfunction hasOwn(obj, key) {\n\treturn Object.prototype.hasOwnProperty.call(obj, key);\n}\n/**\n* Creates a table state updater for a single state slice.\n*\n* The updater writes through the table base atom for the slice and supports both value and functional updater forms.\n*/\nfunction makeStateUpdater(key, instance) {\n\treturn (updater) => {\n\t\t(instance.options.atoms?.[key] ?? instance.baseAtoms[key]).set((old) => functionalUpdate(updater, old));\n\t};\n}\n/**\n* Checks whether a value is an array or a plain (or null-prototype) object.\n* Class instances, dates, and other exotic values compare by reference only,\n* mirroring the `cloneState` plain-object policy.\n*/\nfunction isPlainContainer(value) {\n\tif (typeof value !== \"object\" || value === null) return false;\n\tif (Array.isArray(value)) return true;\n\tconst proto = Object.getPrototypeOf(value);\n\treturn proto === Object.prototype || proto === null;\n}\n/**\n* Returns every enumerable own key, including symbols and non-index array\n* properties. Keeping key presence explicit distinguishes sparse array holes\n* from entries whose value is `undefined`.\n*/\nfunction getEnumerableOwnKeys(value) {\n\treturn Reflect.ownKeys(value).filter((key) => Object.prototype.propertyIsEnumerable.call(value, key));\n}\nconst MAX_STATE_COMPARE_DEPTH = 3;\n/**\n* Structurally compares two state slice values as deeply as stock feature\n* state can nest and no deeper.\n*\n* Three container levels cover flat maps and arrays, arrays of state objects,\n* array-valued filter values, and `columnResizing.columnSizingStart` tuples.\n* Deeper containers and non-plain values compare by reference. A `false`\n* result is always safe: the state update simply proceeds.\n*/\nfunction stateSlicesEqual(a, b) {\n\treturn stateSlicesEqualAtDepth(a, b, MAX_STATE_COMPARE_DEPTH);\n}\nfunction stateSlicesEqualAtDepth(a, b, depth) {\n\tif (Object.is(a, b)) return true;\n\tif (depth <= 0 || !isPlainContainer(a) || !isPlainContainer(b)) return false;\n\tif (Array.isArray(a) || Array.isArray(b)) {\n\t\tif (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return false;\n\t}\n\tconst keysA = getEnumerableOwnKeys(a);\n\tconst keysB = getEnumerableOwnKeys(b);\n\tif (keysA.length !== keysB.length) return false;\n\tconst recordA = a;\n\tconst recordB = b;\n\tfor (let i = 0; i < keysA.length; i++) {\n\t\tconst key = keysA[i];\n\t\tif (!Object.prototype.propertyIsEnumerable.call(b, key)) return false;\n\t\tif (!stateSlicesEqualAtDepth(recordA[key], recordB[key], depth - 1)) return false;\n\t}\n\treturn true;\n}\n/**\n* Routes a state slice update through the slice's `on<State>Change` handler,\n* preserving the owner's current reference for structural no-ops.\n*\n* Equality is evaluated inside the updater received by the state owner, never\n* against the table's potentially stale controlled snapshot. This keeps\n* same-tick updates composable in queued host containers such as React state,\n* evaluates the original updater only when the owner applies it, and lets atom\n* owners suppress notifications by returning their existing reference.\n*\n* A user-provided change handler is still invoked for a no-op because only that\n* handler's state container can know its latest queued value. The guarded\n* updater returns that container's previous reference, preventing a state write\n* or render in state containers with identity bailout semantics.\n*\n* Hot-path slices that skip guarding entirely (selection maps that scale with\n* row count, pointer-frequency resize state) call their change handler\n* directly instead of routing through this util. Custom feature slices with a\n* cheaper or semantic-aware comparison can pass `isEqual` to override the\n* structural default.\n*/\nfunction setStateSlice(instance, key, updater, isEqual = stateSlicesEqual) {\n\tconst onChangeKey = `on${key.charAt(0).toUpperCase()}${key.slice(1)}Change`;\n\tconst onChange = instance.options[onChangeKey];\n\tif (!onChange) return;\n\tonChange((current) => {\n\t\tconst next = functionalUpdate(updater, current);\n\t\treturn isEqual(current, next) ? current : next;\n\t});\n}\n/**\n* Returns whether a value is a function.\n*/\nfunction isFunction(d) {\n\treturn d instanceof Function;\n}\n/**\n* Flattens a tree of nodes by recursively reading child nodes.\n*\n* The original nodes are preserved in depth-first order.\n*/\nfunction flattenBy(arr, getChildren) {\n\tconst flat = [];\n\tconst recurse = (subArr) => {\n\t\tsubArr.forEach((item) => {\n\t\t\tflat.push(item);\n\t\t\tconst children = getChildren(item);\n\t\t\tif (children.length) recurse(children);\n\t\t});\n\t};\n\trecurse(arr);\n\treturn flat;\n}\n/**\n* Creates a dependency-tracked memoized function for table internals.\n*\n* The memo recomputes only when its dependency tuple changes and can emit debug timing information.\n*/\nconst memo = ({ fn, memoDeps, onAfterCompare, onAfterUpdate, onBeforeCompare, onBeforeUpdate }) => {\n\tlet deps = [];\n\tlet result;\n\tconst memoizedFn = (depArgs) => {\n\t\tonBeforeCompare?.();\n\t\tconst newDeps = memoDeps?.(depArgs);\n\t\tlet depsChanged = !newDeps || newDeps.length !== deps?.length;\n\t\tif (!depsChanged && newDeps) {\n\t\t\tfor (let i = 0; i < newDeps.length; i++) if (newDeps[i] !== deps[i]) {\n\t\t\t\tdepsChanged = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tonAfterCompare?.(depsChanged);\n\t\tif (!depsChanged) return result;\n\t\tdeps = newDeps;\n\t\tonBeforeUpdate?.();\n\t\tresult = fn(...newDeps ?? []);\n\t\tonAfterUpdate?.(result);\n\t\treturn result;\n\t};\n\treturn memoizedFn;\n};\n/**\n* Wraps a callback so that its first invocation is skipped.\n*\n* Row-model `onAfterUpdate` hooks schedule auto-resets when their inputs\n* change. The initial computation of a row model is not a change, so state\n* resets must not fire for it — otherwise merely reading a row model on mount\n* would wipe initial or controlled state.\n*/\nfunction skipFirstRun(fn) {\n\tlet hasRun = false;\n\treturn () => {\n\t\tif (!hasRun) {\n\t\t\thasRun = true;\n\t\t\treturn;\n\t\t}\n\t\tfn();\n\t};\n}\nconst pad = (str, num) => {\n\tstr = String(str);\n\twhile (str.length < num) str = \" \" + str;\n\treturn str;\n};\n/**\n* Creates a table-aware memoized function.\n*\n* This wraps `memo` with table debug options and feature metadata so row models and derived APIs can share consistent diagnostics.\n*/\nfunction tableMemo({ feature, fnName, objectId, onAfterUpdate, table, ...memoOptions }) {\n\tlet startCalcTime;\n\tlet endCalcTime;\n\tlet runCount = 0;\n\tlet debug;\n\tif (process.env.NODE_ENV === \"development\") {\n\t\tconst { debugAll } = table.options;\n\t\tconst { parentName } = getFunctionNameInfo(fnName, \".\");\n\t\tconst debugByParent = table.options[`debug${(parentName != \"table\" ? parentName + \"s\" : parentName).replace(parentName, parentName.charAt(0).toUpperCase() + parentName.slice(1))}`];\n\t\tconst debugByFeature = feature ? table.options[`debug${feature.charAt(0).toUpperCase() + feature.slice(1)}`] : false;\n\t\tdebug = debugAll || debugByParent || debugByFeature;\n\t}\n\tfunction logTime(time, depsChanged) {\n\t\tconst runType = runCount === 0 ? \"(1st run)\" : depsChanged ? \"(rerun #\" + runCount + \")\" : \"(cache)\";\n\t\trunCount++;\n\t\tconsole.groupCollapsed(`%c⏱ ${pad(`${time.toFixed(1)} ms`, 12)} %c${runType}%c ${fnName}%c ${objectId ? `(${fnName.split(\".\")[0]}Id: ${objectId})` : \"\"}`, `font-size: .6rem; font-weight: bold; ${depsChanged ? `color: hsl(\n ${Math.max(0, Math.min(120 - Math.log10(time) * 60, 120))}deg 100% 31%);` : \"\"} `, `color: ${runCount < 2 ? \"#FF00FF\" : \"#FF1493\"}`, \"color: #666\", \"color: #87CEEB\");\n\t\tconsole.info({\n\t\t\tfeature,\n\t\t\tstate: table.store.state,\n\t\t\tdeps: memoOptions.memoDeps?.toString()\n\t\t});\n\t\tconsole.trace();\n\t\tconsole.groupEnd();\n\t}\n\tconst onAfterUpdateHandler = onAfterUpdate ? () => {\n\t\tconst { schedule, untrack } = table._reactivity;\n\t\tschedule(() => untrack(() => onAfterUpdate()));\n\t} : void 0;\n\tconst debugOptions = process.env.NODE_ENV === \"development\" ? {\n\t\tonBeforeCompare: () => {},\n\t\tonAfterCompare: (depsChanged) => {},\n\t\tonBeforeUpdate: () => {\n\t\t\tif (debug) startCalcTime = performance.now();\n\t\t},\n\t\tonAfterUpdate: () => {\n\t\t\tif (debug) {\n\t\t\t\tendCalcTime = performance.now();\n\t\t\t\tlogTime(Math.round((endCalcTime - startCalcTime) * 100) / 100, true);\n\t\t\t}\n\t\t\tonAfterUpdateHandler?.();\n\t\t}\n\t} : { onAfterUpdate: onAfterUpdateHandler };\n\treturn memo({\n\t\t...memoOptions,\n\t\t...debugOptions\n\t});\n}\n/**\n* Assumes that a function name is in the format of `parentName_fnKey` and returns the `fnKey` and `fnName` in the format of `parentName.fnKey`.\n*\n* Splits on the first separator only, so an internal API name such as\n* `table__expandRows` has the `fnKey` `_expandRows`.\n*/\nfunction getFunctionNameInfo(staticFnName, splitBy = \"_\") {\n\tconst [parentName, fnKey] = staticFnName.replace(splitBy, \" \").split(\" \");\n\treturn {\n\t\tfnKey,\n\t\tfnName: `${parentName}.${fnKey}`,\n\t\tparentName\n\t};\n}\n/**\n* Assigns Table API methods directly to the table instance.\n* Unlike row/cell/column/header, the table is a singleton so methods are assigned directly.\n*/\nfunction assignTableAPIs(feature, table, apis) {\n\tfor (const [staticFnName, { fn, memoDeps }] of Object.entries(apis)) {\n\t\tconst { fnKey, fnName } = getFunctionNameInfo(staticFnName);\n\t\ttable[fnKey] = memoDeps ? tableMemo({\n\t\t\tmemoDeps,\n\t\t\tfn,\n\t\t\tfnName,\n\t\t\ttable,\n\t\t\tfeature\n\t\t}) : fn;\n\t}\n}\n/**\n* Assigns API methods to a prototype object for memory-efficient method sharing.\n* All instances created with this prototype will share the same method references.\n*\n* For memoized methods, the memo state is lazily created and stored on each instance.\n* This provides the best of both worlds: shared method code + per-instance caching.\n*/\nfunction assignPrototypeAPIs(feature, prototype, table, apis) {\n\tfor (const [staticFnName, { fn, memoDeps }] of Object.entries(apis)) {\n\t\tconst { fnKey, fnName } = getFunctionNameInfo(staticFnName);\n\t\tif (memoDeps) {\n\t\t\tconst memoKey = `_memo_${fnKey}`;\n\t\t\tprototype[fnKey] = function(...args) {\n\t\t\t\tif (!this[memoKey]) {\n\t\t\t\t\tconst self = this;\n\t\t\t\t\tthis[memoKey] = tableMemo({\n\t\t\t\t\t\tmemoDeps: (depArgs) => memoDeps(self, depArgs),\n\t\t\t\t\t\tfn: (...deps) => fn(self, ...deps),\n\t\t\t\t\t\tfnName,\n\t\t\t\t\t\tobjectId: self.id,\n\t\t\t\t\t\ttable,\n\t\t\t\t\t\tfeature\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn this[memoKey](...args);\n\t\t\t};\n\t\t} else prototype[fnKey] = function(...args) {\n\t\t\treturn fn(this, ...args);\n\t\t};\n\t}\n}\n/**\n* Looks to run the memoized function with the builder pattern on the object if it exists, otherwise fall back to the static method passed in.\n*/\nfunction callMemoOrStaticFn(obj, fnKey, staticFn, ...args) {\n\treturn obj[fnKey]?.(...args) ?? staticFn(obj, ...args);\n}\n\n//#endregion\nexport { assignPrototypeAPIs, assignTableAPIs, callMemoOrStaticFn, cloneState, copyInstancePropertiesWithoutMemos, flattenBy, functionalUpdate, getFunctionNameInfo, hasOwn, isFunction, makeObjectMap, makeStateUpdater, memo, setStateSlice, skipFirstRun, stateSlicesEqual, tableMemo };","//#region src/core/cells/coreCellsFeature.utils.ts\n/**\n* Reads this cell's accessor value from its owning row and column.\n*\n* This is the standalone implementation behind `cell.getValue()`, useful when\n* importing static APIs instead of calling methods from the cell prototype.\n*\n* @example\n* ```ts\n* const value = cell_getValue(cell)\n* ```\n*/\nfunction cell_getValue(cell) {\n\treturn cell.row.getValue(cell.column.id);\n}\n/**\n* Reads the value that should be rendered for this cell.\n*\n* Nullish accessor values are replaced with `table.options.renderFallbackValue`,\n* matching the behavior of `cell.renderValue()`.\n*\n* @example\n* ```ts\n* const rendered = cell_renderValue(cell)\n* ```\n*/\nfunction cell_renderValue(cell) {\n\treturn cell.getValue() ?? cell.table.options.renderFallbackValue;\n}\n/**\n* Builds the render context passed to a column's `cell` template.\n*\n* The returned object includes stable references to the table, row, column, and\n* cell, plus bound `getValue` and `renderValue` helpers for render functions.\n*\n* @example\n* ```ts\n* const context = cell_getContext(cell)\n* ```\n*/\nfunction cell_getContext(cell) {\n\treturn {\n\t\ttable: cell.table,\n\t\tcolumn: cell.column,\n\t\trow: cell.row,\n\t\tcell,\n\t\tgetValue: () => cell.getValue(),\n\t\trenderValue: () => cell.renderValue()\n\t};\n}\n\n//#endregion\nexport { cell_getContext, cell_getValue, cell_renderValue };","import { assignPrototypeAPIs } from \"../../utils.js\";\nimport { cell_getContext, cell_getValue, cell_renderValue } from \"./coreCellsFeature.utils.js\";\n\n//#region src/core/cells/coreCellsFeature.ts\n/**\n* Core feature that adds cell value, render, and context APIs.\n*/\nconst coreCellsFeature = { assignCellPrototype: (prototype, table) => {\n\tassignPrototypeAPIs(\"coreCellsFeature\", prototype, table, {\n\t\tcell_getValue: { fn: (cell) => cell_getValue(cell) },\n\t\tcell_renderValue: { fn: (cell) => cell_renderValue(cell) },\n\t\tcell_getContext: {\n\t\t\tfn: (cell) => cell_getContext(cell),\n\t\t\tmemoDeps: (cell) => [cell]\n\t\t}\n\t});\n} };\n\n//#endregion\nexport { coreCellsFeature };","//#region src/core/columns/constructColumn.ts\n/**\n* Creates or retrieves the column prototype for a table.\n* The prototype is cached on the table and shared by all column instances.\n*/\nfunction getColumnPrototype(table) {\n\tif (!table._columnPrototype) {\n\t\ttable._columnPrototype = { table };\n\t\tconst features = Object.values(table._features);\n\t\tfor (let i = 0; i < features.length; i++) features[i].assignColumnPrototype?.(table._columnPrototype, table);\n\t}\n\treturn table._columnPrototype;\n}\n/**\n* Constructs a column instance from normalized table internals.\n*\n* This wires core properties, feature prototype APIs, and instance data used by table rendering and row-model operations.\n*/\nfunction constructColumn(table, columnDef, depth, parent) {\n\tconst resolvedColumnDef = {\n\t\t...table.getDefaultColumnDef(),\n\t\t...columnDef\n\t};\n\tconst accessorKey = resolvedColumnDef.accessorKey;\n\tconst accessorKeyString = accessorKey === void 0 ? void 0 : String(accessorKey);\n\tconst id = resolvedColumnDef.id ?? accessorKeyString?.replaceAll(\".\", \"_\") ?? (typeof resolvedColumnDef.header === \"string\" ? resolvedColumnDef.header : void 0);\n\tlet accessorFn;\n\tif (resolvedColumnDef.accessorFn) accessorFn = resolvedColumnDef.accessorFn;\n\telse if (accessorKey !== void 0) {\n\t\tif (typeof accessorKey === \"string\" && accessorKey.includes(\".\")) {\n\t\t\tconst keys = accessorKey.split(\".\");\n\t\t\taccessorFn = (originalRow) => {\n\t\t\t\tlet result = originalRow;\n\t\t\t\tfor (let i = 0; i < keys.length; i++) {\n\t\t\t\t\tconst key = keys[i];\n\t\t\t\t\tresult = result?.[key];\n\t\t\t\t\tif (process.env.NODE_ENV === \"development\" && result === void 0) console.warn(`\"${key}\" in deeply nested key \"${accessorKey}\" returned undefined.`);\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t};\n\t\t} else accessorFn = (originalRow) => originalRow[resolvedColumnDef.accessorKey];\n\t}\n\tif (!id) {\n\t\tif (process.env.NODE_ENV === \"development\") throw new Error(resolvedColumnDef.accessorFn ? `coreColumnsFeature require an id when using an accessorFn` : `coreColumnsFeature require an id when using a non-string header`);\n\t\tthrow new Error();\n\t}\n\tconst columnPrototype = getColumnPrototype(table);\n\tconst column = Object.create(columnPrototype);\n\tcolumn.accessorFn = accessorFn;\n\tcolumn.columnDef = resolvedColumnDef;\n\tcolumn.columns = [];\n\tcolumn.depth = depth;\n\tcolumn.id = `${String(id)}`;\n\tcolumn.parent = parent;\n\tconst initFns = table._columnInstanceInitFns;\n\tfor (let i = 0; i < initFns.length; i++) initFns[i](column);\n\treturn column;\n}\n\n//#endregion\nexport { constructColumn };","//#region src/core/featureStubs.ts\n/**\n* Stubs for optional features, used by the core and by any feature or row\n* model that reads another feature.\n*\n* Importing a feature's code from shared code would bundle that feature into\n* every table that uses the shared code, registered or not. A stub instead\n* calls a member the feature declares on its table, column, or row type and\n* assigns when it is registered, and otherwise behaves as if the feature were\n* absent. Members that only other features use are `_`-prefixed and marked\n* `@internal`, such as `table._expandRows`.\n*\n* How code in this package reaches other code:\n*\n* - Its own feature: call the static function, or `callMemoOrStaticFn` to use\n* the feature's memoized API.\n* - The core: import it. Every table bundles the core.\n* - Another feature's state: read `table.atoms.<slice>?.get()`.\n* - Another feature's APIs: call a stub from this file, adding one if needed.\n* - A feature it requires, such as column resizing requiring column sizing:\n* import it.\n*\n* Features assign functions, internal ones included, with `assignTableAPIs` or\n* `assignPrototypeAPIs`, and keep the `init*InstanceData` hooks for mutable\n* per-instance state. The `import/no-restricted-paths` lint rule rejects value\n* imports between feature folders outside an explicit list.\n*\n* Internal: not exported from any package entry point.\n*/\n/** Whether a column is visible; every column is without the feature. */\nfunction getIsColumnVisible(column) {\n\treturn column.getIsVisible?.() ?? true;\n}\n/** Visible leaf columns; all leaf columns without the feature. */\nfunction getVisibleLeafColumns(table) {\n\treturn table.getVisibleLeafColumns?.() ?? table.getAllLeafColumns();\n}\n/**\n* A row's visible cells; all cells, in leaf column order, without the\n* feature.\n*/\nfunction getVisibleCells(row) {\n\treturn row.getVisibleCells?.() ?? row.getAllCells();\n}\n/** A row's visible cells by column id; all cells without the feature. */\nfunction getVisibleCellsByColumnId(row) {\n\treturn row.getVisibleCellsByColumnId?.() ?? row.getAllCellsByColumnId();\n}\n/**\n* Orders leaf columns for display. The column ordering feature applies\n* `columnOrder` and moves grouped columns. Without it, the grouping feature\n* still moves grouped columns, and without either the order is unchanged.\n*/\nfunction orderLeafColumns(table, columns) {\n\tconst orderedTable = table;\n\tconst leafColumns = columns;\n\treturn orderedTable.getOrderColumnsFn?.()(leafColumns) ?? orderedTable._orderGroupedColumns?.(leafColumns) ?? columns;\n}\n/**\n* Orders items that each belong to a leaf column, such as visible leaf columns\n* or a row's visible cells, with start-pinned items first and end-pinned items\n* last. Without the feature, nothing is pinned and the order is unchanged.\n*/\nfunction orderByColumnPinning(table, items, getColumnId, getItemsByColumnId) {\n\treturn table._orderByColumnPinning?.(items, getColumnId, getItemsByColumnId) ?? items;\n}\n/**\n* Visible leaf columns in a pinning region. Without the feature, nothing is\n* pinned: the start and end regions are empty, and the center region and the\n* full list (`position` omitted) hold every visible leaf column.\n*/\nfunction getPinnedVisibleLeafColumns(table, position) {\n\treturn table.getPinnedVisibleLeafColumns?.(position) ?? (position && position !== \"center\" ? [] : getVisibleLeafColumns(table));\n}\n/** The resolved global filter function, if the feature is registered. */\nfunction getGlobalFilterFn(table) {\n\treturn table.getGlobalFilterFn?.();\n}\n/** Whether a column takes part in global filtering; none do without the feature. */\nfunction getCanGlobalFilter(column) {\n\treturn column.getCanGlobalFilter?.() ?? false;\n}\n/**\n* Lists expanded sub-rows inline below their parents. Without the feature no\n* row is expanded, so the row model is returned as is.\n*/\nfunction expandRowModel(table, rowModel) {\n\treturn table._expandRows?.(rowModel) ?? rowModel;\n}\n/**\n* Whether every parent of a row is expanded. Without the feature no row is\n* expanded, so only a top-level row qualifies.\n*/\nfunction getIsAllParentsExpanded(row) {\n\treturn row.getIsAllParentsExpanded?.() ?? !row.parentId;\n}\n/** Resets expanded state if row expanding is registered. */\nfunction autoResetExpanded(table) {\n\ttable.autoResetExpanded?.();\n}\n/** Resets the page index if row pagination is registered. */\nfunction autoResetPageIndex(table) {\n\ttable.autoResetPageIndex?.();\n}\n/** Resets sorting if row sorting is registered. */\nfunction autoResetSorting(table) {\n\ttable.autoResetSorting?.();\n}\n/** Resets cell selection if cell selection is registered. */\nfunction autoResetCellSelection(table) {\n\ttable.autoResetCellSelection?.();\n}\n/**\n* The aggregation executor `rowAggregationFeature` assigns to the table, or\n* `undefined` when the feature is not registered.\n*/\nfunction getAggregateColumnValue(table) {\n\treturn table._aggregateColumnValue;\n}\n\n//#endregion\nexport { autoResetCellSelection, autoResetExpanded, autoResetPageIndex, autoResetSorting, expandRowModel, getAggregateColumnValue, getCanGlobalFilter, getGlobalFilterFn, getIsAllParentsExpanded, getIsColumnVisible, getPinnedVisibleLeafColumns, getVisibleCells, getVisibleCellsByColumnId, getVisibleLeafColumns, orderByColumnPinning, orderLeafColumns };","import { makeObjectMap } from \"../../utils.js\";\nimport { orderLeafColumns } from \"../featureStubs.js\";\nimport { constructColumn } from \"./constructColumn.js\";\n\n//#region src/core/columns/coreColumnsFeature.utils.ts\n/**\n* Flattens this column and every descendant column into a single array.\n*\n* Group columns appear before their child columns, which matches the normalized\n* column hierarchy produced during table construction.\n*\n* @example\n* ```ts\n* const flatColumns = column_getFlatColumns(column)\n* ```\n*/\nfunction column_getFlatColumns(column) {\n\treturn [column, ...column.columns.flatMap((col) => col.getFlatColumns())];\n}\n/**\n* Collects the terminal leaf columns below this column.\n*\n* Group columns return their ordered descendants. Non-group columns return an\n* array containing only the column itself.\n*\n* @example\n* ```ts\n* const leafColumns = column_getLeafColumns(column)\n* ```\n*/\nfunction column_getLeafColumns(column) {\n\tif (column.columns.length) {\n\t\tconst leafColumns = column.columns.flatMap((col) => col.getLeafColumns());\n\t\treturn orderLeafColumns(column.table, leafColumns);\n\t}\n\treturn [column];\n}\n/**\n* Merges built-in, feature, and user default column definitions.\n*\n* Built-in defaults provide a header and fallback cell renderer, feature\n* defaults can add feature-specific column options, and\n* `options.defaultColumn` wins last.\n*\n* @example\n* ```ts\n* const defaultColumn = table_getDefaultColumnDef(table)\n* ```\n*/\nfunction table_getDefaultColumnDef(table) {\n\treturn {\n\t\theader: (props) => {\n\t\t\tconst resolvedColumnDef = props.header.column.columnDef;\n\t\t\tif (resolvedColumnDef.accessorKey) return resolvedColumnDef.accessorKey;\n\t\t\tif (resolvedColumnDef.accessorFn) return resolvedColumnDef.id;\n\t\t\treturn null;\n\t\t},\n\t\tcell: (props) => props.renderValue()?.toString?.() ?? null,\n\t\t...Object.values(table._features).reduce((obj, feature) => {\n\t\t\treturn Object.assign(obj, feature.getDefaultColumnDef?.());\n\t\t}, {}),\n\t\t...table.options.defaultColumn\n\t};\n}\nfunction constructColumns(table, columnDefs, parent, depth = 0) {\n\tconst columns = new Array(columnDefs.length);\n\tfor (let i = 0; i < columnDefs.length; i++) {\n\t\tif (!(i in columnDefs)) continue;\n\t\tconst columnDef = columnDefs[i];\n\t\tconst column = constructColumn(table, columnDef, depth, parent);\n\t\tconst groupingColumnDef = columnDef;\n\t\tcolumn.columns = groupingColumnDef.columns ? constructColumns(table, groupingColumnDef.columns, column, depth + 1) : [];\n\t\tcolumns[i] = column;\n\t}\n\treturn columns;\n}\n/**\n* Normalizes `options.columns` into the table's nested column tree.\n*\n* Each column definition is constructed with its parent and depth, and group\n* column children are recursively constructed.\n*\n* @example\n* ```ts\n* const columns = table_getAllColumns(table)\n* ```\n*/\nfunction table_getAllColumns(table) {\n\treturn constructColumns(table, table.options.columns);\n}\n/**\n* Flattens every table column, including group columns and leaf columns.\n*\n* Use this when parent/group columns must be included in addition to data leaf\n* columns.\n*\n* @example\n* ```ts\n* const flatColumns = table_getAllFlatColumns(table)\n* ```\n*/\nfunction table_getAllFlatColumns(table) {\n\treturn table.getAllColumns().flatMap((column) => column.getFlatColumns());\n}\n/**\n* Builds an id lookup for every flat column in the table.\n*\n* Group columns and leaf columns are included. Later columns with the same id\n* replace earlier entries.\n*\n* @example\n* ```ts\n* const columnsById = table_getAllFlatColumnsById(table)\n* ```\n*/\nfunction table_getAllFlatColumnsById(table) {\n\tconst result = makeObjectMap();\n\tconst flatColumns = table.getAllFlatColumns();\n\tfor (let i = 0; i < flatColumns.length; i++) {\n\t\tconst column = flatColumns[i];\n\t\tresult[column.id] = column;\n\t}\n\treturn result;\n}\n/**\n* Collects all terminal leaf columns in their current table order.\n*\n* Column ordering features can reorder the collected leaves before the result\n* is returned.\n*\n* @example\n* ```ts\n* const leafColumns = table_getAllLeafColumns(table)\n* ```\n*/\nfunction table_getAllLeafColumns(table) {\n\tconst leafColumns = table.getAllColumns().flatMap((c) => c.getLeafColumns());\n\treturn orderLeafColumns(table, leafColumns);\n}\n/**\n* Builds an id lookup for terminal leaf columns only.\n*\n* Parent/group columns are excluded, making this lookup appropriate for row\n* cells and feature state keyed by data columns.\n*\n* @example\n* ```ts\n* const leavesById = table_getAllLeafColumnsById(table)\n* ```\n*/\nfunction table_getAllLeafColumnsById(table) {\n\tconst result = makeObjectMap();\n\tconst leafColumns = table.getAllLeafColumns();\n\tfor (let i = 0; i < leafColumns.length; i++) {\n\t\tconst column = leafColumns[i];\n\t\tresult[column.id] = column;\n\t}\n\treturn result;\n}\n/**\n* Looks up a column by id from the flat column map.\n*\n* The lookup can return group columns or leaf columns. In development, a\n* missing id logs a warning to help catch stale column references.\n*\n* @example\n* ```ts\n* const column = table_getColumn(table, 'firstName')\n* ```\n*/\nfunction table_getColumn(table, columnId) {\n\tconst column = table.getAllFlatColumnsById()[columnId];\n\tif (process.env.NODE_ENV === \"development\" && !column) console.warn(`[Table] Column with id '${columnId}' does not exist.`);\n\treturn column;\n}\n\n//#endregion\nexport { column_getFlatColumns, column_getLeafColumns, table_getAllColumns, table_getAllFlatColumns, table_getAllFlatColumnsById, table_getAllLeafColumns, table_getAllLeafColumnsById, table_getColumn, table_getDefaultColumnDef };","import { assignPrototypeAPIs, assignTableAPIs } from \"../../utils.js\";\nimport { column_getFlatColumns, column_getLeafColumns, table_getAllColumns, table_getAllFlatColumns, table_getAllFlatColumnsById, table_getAllLeafColumns, table_getAllLeafColumnsById, table_getColumn, table_getDefaultColumnDef } from \"./coreColumnsFeature.utils.js\";\n\n//#region src/core/columns/coreColumnsFeature.ts\n/**\n* Core feature that builds the column tree and exposes table/column APIs.\n*/\nconst coreColumnsFeature = {\n\tassignColumnPrototype: (prototype, table) => {\n\t\tassignPrototypeAPIs(\"coreColumnsFeature\", prototype, table, {\n\t\t\tcolumn_getFlatColumns: {\n\t\t\t\tfn: (column) => column_getFlatColumns(column),\n\t\t\t\tmemoDeps: (column) => [column.table.options.columns]\n\t\t\t},\n\t\t\tcolumn_getLeafColumns: {\n\t\t\t\tfn: (column) => column_getLeafColumns(column),\n\t\t\t\tmemoDeps: (column) => [\n\t\t\t\t\tcolumn.table.atoms.columnOrder?.get(),\n\t\t\t\t\tcolumn.table.atoms.grouping?.get(),\n\t\t\t\t\tcolumn.table.options.columns,\n\t\t\t\t\tcolumn.table.options.groupedColumnMode\n\t\t\t\t]\n\t\t\t}\n\t\t});\n\t},\n\tconstructTableAPIs: (table) => {\n\t\tassignTableAPIs(\"coreColumnsFeature\", table, {\n\t\t\ttable_getDefaultColumnDef: {\n\t\t\t\tfn: () => table_getDefaultColumnDef(table),\n\t\t\t\tmemoDeps: () => [table.options.defaultColumn]\n\t\t\t},\n\t\t\ttable_getAllColumns: {\n\t\t\t\tfn: () => table_getAllColumns(table),\n\t\t\t\tmemoDeps: () => [table.options.columns]\n\t\t\t},\n\t\t\ttable_getAllFlatColumns: {\n\t\t\t\tfn: () => table_getAllFlatColumns(table),\n\t\t\t\tmemoDeps: () => [table.options.columns]\n\t\t\t},\n\t\t\ttable_getAllFlatColumnsById: {\n\t\t\t\tfn: () => table_getAllFlatColumnsById(table),\n\t\t\t\tmemoDeps: () => [table.options.columns]\n\t\t\t},\n\t\t\ttable_getAllLeafColumns: {\n\t\t\t\tfn: () => table_getAllLeafColumns(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.atoms.columnOrder?.get(),\n\t\t\t\t\ttable.atoms.grouping?.get(),\n\t\t\t\t\ttable.options.columns,\n\t\t\t\t\ttable.options.groupedColumnMode\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_getAllLeafColumnsById: {\n\t\t\t\tfn: () => table_getAllLeafColumnsById(table),\n\t\t\t\tmemoDeps: () => [table.getAllLeafColumns()]\n\t\t\t},\n\t\t\ttable_getColumn: { fn: (columnId) => table_getColumn(table, columnId) }\n\t\t});\n\t}\n};\n\n//#endregion\nexport { coreColumnsFeature };","//#region src/core/headers/constructHeader.ts\n/**\n* Creates or retrieves the header prototype for a table.\n* The prototype is cached on the table and shared by all header instances.\n*/\nfunction getHeaderPrototype(table) {\n\tif (!table._headerPrototype) {\n\t\ttable._headerPrototype = { table };\n\t\tconst features = Object.values(table._features);\n\t\tfor (let i = 0; i < features.length; i++) features[i].assignHeaderPrototype?.(table._headerPrototype, table);\n\t}\n\treturn table._headerPrototype;\n}\n/**\n* Constructs a header instance from normalized table internals.\n*\n* This wires core properties, feature prototype APIs, and instance data used by table rendering and row-model operations.\n*/\nfunction constructHeader(table, column, options) {\n\tconst headerPrototype = getHeaderPrototype(table);\n\tconst header = Object.create(headerPrototype);\n\theader.colSpan = 0;\n\theader.column = column;\n\theader.depth = options.depth;\n\theader.headerGroup = null;\n\theader.id = options.id ?? column.id;\n\theader.index = options.index;\n\theader.isPlaceholder = !!options.isPlaceholder;\n\theader.placeholderId = options.placeholderId;\n\theader.rowSpan = 0;\n\theader.subHeaders = [];\n\tconst initFns = table._headerInstanceInitFns;\n\tfor (let i = 0; i < initFns.length; i++) initFns[i](header);\n\treturn header;\n}\n\n//#endregion\nexport { constructHeader };","import { getIsColumnVisible } from \"../featureStubs.js\";\nimport { constructHeader } from \"./constructHeader.js\";\n\n//#region src/core/headers/buildHeaderGroups.ts\nfunction getMaxHeaderDepth(columns, depth = 1) {\n\tlet maxDepth = depth;\n\tfor (let i = 0; i < columns.length; i++) {\n\t\tconst column = columns[i];\n\t\tif (getIsColumnVisible(column) && column.columns.length) maxDepth = Math.max(maxDepth, getMaxHeaderDepth(column.columns, depth + 1));\n\t}\n\treturn maxDepth;\n}\nfunction formatHeaderGroupId(headerFamily, depth) {\n\treturn headerFamily ? `${headerFamily}_${depth}` : String(depth);\n}\nfunction formatHeaderId(headerFamily, depth, columnId, childHeaderId) {\n\tlet id = headerFamily ?? \"\";\n\tif (depth) id = id ? `${id}_${depth}` : String(depth);\n\tif (columnId) id = id ? `${id}_${columnId}` : columnId;\n\tif (childHeaderId) id = id ? `${id}_${childHeaderId}` : childHeaderId;\n\treturn id;\n}\nfunction countPendingHeadersForColumn(headers, column) {\n\tlet count = 0;\n\tfor (let i = 0; i < headers.length; i++) if (headers[i].column === column) count++;\n\treturn count;\n}\nfunction constructHeaderGroup(headersToGroup, depth, table, headerFamily, headerGroups, headerGroupInitFns) {\n\tconst headerGroup = {\n\t\tdepth,\n\t\tid: formatHeaderGroupId(headerFamily, depth),\n\t\theaders: []\n\t};\n\tconst pendingParentHeaders = [];\n\tfor (let i = 0; i < headersToGroup.length; i++) {\n\t\tif (!(i in headersToGroup)) continue;\n\t\tconst headerToGroup = headersToGroup[i];\n\t\tconst latestPendingParentHeader = pendingParentHeaders[pendingParentHeaders.length - 1];\n\t\tconst isLeafHeader = headerToGroup.column.depth === headerGroup.depth;\n\t\tlet column;\n\t\tlet isPlaceholder = false;\n\t\tif (isLeafHeader && headerToGroup.column.parent) column = headerToGroup.column.parent;\n\t\telse {\n\t\t\tcolumn = headerToGroup.column;\n\t\t\tisPlaceholder = true;\n\t\t}\n\t\tif (latestPendingParentHeader && latestPendingParentHeader.column === column) latestPendingParentHeader.subHeaders.push(headerToGroup);\n\t\telse {\n\t\t\tconst header = constructHeader(table, column, {\n\t\t\t\tid: formatHeaderId(headerFamily, depth, column.id, headerToGroup.id),\n\t\t\t\tisPlaceholder,\n\t\t\t\tplaceholderId: isPlaceholder ? String(countPendingHeadersForColumn(pendingParentHeaders, column)) : void 0,\n\t\t\t\tdepth,\n\t\t\t\tindex: pendingParentHeaders.length\n\t\t\t});\n\t\t\theader.subHeaders.push(headerToGroup);\n\t\t\tpendingParentHeaders.push(header);\n\t\t}\n\t\theaderGroup.headers.push(headerToGroup);\n\t\theaderToGroup.headerGroup = headerGroup;\n\t}\n\tfor (let i = 0; i < headerGroupInitFns.length; i++) headerGroupInitFns[i](headerGroup);\n\theaderGroups.push(headerGroup);\n\tif (depth > 0) constructHeaderGroup(pendingParentHeaders, depth - 1, table, headerFamily, headerGroups, headerGroupInitFns);\n}\nfunction updateHeaderSpans(headers) {\n\tfor (let i = 0; i < headers.length; i++) {\n\t\tconst header = headers[i];\n\t\tif (!getIsColumnVisible(header.column)) continue;\n\t\tlet colSpan = 0;\n\t\tif (header.subHeaders.length) {\n\t\t\tupdateHeaderSpans(header.subHeaders);\n\t\t\tfor (let j = 0; j < header.subHeaders.length; j++) {\n\t\t\t\tconst child = header.subHeaders[j];\n\t\t\t\tif (!getIsColumnVisible(child.column)) continue;\n\t\t\t\tcolSpan += child.colSpan;\n\t\t\t}\n\t\t} else colSpan = 1;\n\t\theader.colSpan = colSpan;\n\t\tif (header.isPlaceholder && header.subHeaders.length === 1 && header.subHeaders[0].column === header.column) {\n\t\t\tlet rowSpan = 1;\n\t\t\tlet chainChild = header.subHeaders[0];\n\t\t\twhile (chainChild) {\n\t\t\t\tchainChild.rowSpan = 0;\n\t\t\t\trowSpan++;\n\t\t\t\tchainChild = chainChild.subHeaders.length === 1 && chainChild.subHeaders[0].column === header.column ? chainChild.subHeaders[0] : void 0;\n\t\t\t}\n\t\t\theader.rowSpan = rowSpan;\n\t\t} else header.rowSpan = 1;\n\t}\n}\n/**\n* Builds the nested header group structure for a table.\n*\n* The result accounts for visible leaf columns, pinned column groups, and placeholder headers needed to render multi-level headers.\n*/\nfunction buildHeaderGroups(allColumns, columnsToGroup, table, headerFamily) {\n\tconst maxDepth = getMaxHeaderDepth(allColumns);\n\tconst headerGroups = [];\n\tconst headerGroupInitFns = table._headerGroupInstanceInitFns;\n\tconst bottomHeaders = new Array(columnsToGroup.length);\n\tfor (let i = 0; i < columnsToGroup.length; i++) {\n\t\tif (!(i in columnsToGroup)) continue;\n\t\tbottomHeaders[i] = constructHeader(table, columnsToGroup[i], {\n\t\t\tdepth: maxDepth,\n\t\t\tindex: i\n\t\t});\n\t}\n\tconstructHeaderGroup(bottomHeaders, maxDepth - 1, table, headerFamily, headerGroups, headerGroupInitFns);\n\theaderGroups.reverse();\n\tupdateHeaderSpans(headerGroups[0]?.headers ?? []);\n\treturn headerGroups;\n}\n\n//#endregion\nexport { buildHeaderGroups };","import { getVisibleLeafColumns, orderByColumnPinning } from \"../featureStubs.js\";\nimport { buildHeaderGroups } from \"./buildHeaderGroups.js\";\n\n//#region src/core/headers/coreHeadersFeature.utils.ts\nfunction collectLeafHeaders(header, leafHeaders) {\n\tfor (let i = 0; i < header.subHeaders.length; i++) collectLeafHeaders(header.subHeaders[i], leafHeaders);\n\tleafHeaders.push(header);\n}\n/**\n* Walks a header tree and collects all descendant leaf headers.\n*\n* The header itself is included after its descendants, matching the recursive\n* shape used by nested header groups.\n*\n* @example\n* ```ts\n* const leafHeaders = header_getLeafHeaders(header)\n* ```\n*/\nfunction header_getLeafHeaders(header) {\n\tconst leafHeaders = [];\n\tcollectLeafHeaders(header, leafHeaders);\n\treturn leafHeaders;\n}\n/**\n* Builds the render context passed to a column's `header` or `footer` template.\n*\n* The context contains the header, its column, and the owning table instance.\n*\n* @example\n* ```ts\n* const context = header_getContext(header)\n* ```\n*/\nfunction header_getContext(header) {\n\treturn {\n\t\tcolumn: header.column,\n\t\theader,\n\t\ttable: header.column.table\n\t};\n}\n/**\n* Builds visible header groups for the current column tree.\n*\n* Column visibility and pinning are applied before groups are built. When no\n* columns are pinned, the fast path skips pin partitioning.\n*\n* @example\n* ```ts\n* const headerGroups = table_getHeaderGroups(table)\n* ```\n*/\nfunction table_getHeaderGroups(table) {\n\treturn buildHeaderGroups(table.getAllColumns(), orderByColumnPinning(table, getVisibleLeafColumns(table), (column) => column.id), table);\n}\n/**\n* Builds footer groups by reversing the current header groups.\n*\n* Footer rendering uses the same header objects and grouping structure, but\n* renders them from leaf level back toward the root.\n*\n* @example\n* ```ts\n* const footerGroups = table_getFooterGroups(table)\n* ```\n*/\nfunction table_getFooterGroups(table) {\n\treturn [...table.getHeaderGroups()].reverse();\n}\n/**\n* Flattens every header from every header group into one array.\n*\n* The result includes parent headers and placeholder headers, in header-group\n* order from top to bottom.\n*\n* @example\n* ```ts\n* const flatHeaders = table_getFlatHeaders(table)\n* ```\n*/\nfunction table_getFlatHeaders(table) {\n\tconst headerGroups = table.getHeaderGroups();\n\tconst result = [];\n\tfor (let i = 0; i < headerGroups.length; i++) {\n\t\tconst headers = headerGroups[i].headers;\n\t\tfor (let j = 0; j < headers.length; j++) result.push(headers[j]);\n\t}\n\treturn result;\n}\n/**\n* Collects only the leaf headers from the current header tree.\n*\n* Parent/group headers are skipped, making the result suitable for rendering\n* one header per visible leaf column.\n*\n* @example\n* ```ts\n* const leafHeaders = table_getLeafHeaders(table)\n* ```\n*/\nfunction table_getLeafHeaders(table) {\n\tconst topHeaders = table.getHeaderGroups()[0]?.headers ?? [];\n\tconst result = [];\n\tfor (let i = 0; i < topHeaders.length; i++) {\n\t\tconst leafHeaders = topHeaders[i].getLeafHeaders();\n\t\tfor (let j = 0; j < leafHeaders.length; j++) result.push(leafHeaders[j]);\n\t}\n\treturn result;\n}\n\n//#endregion\nexport { header_getContext, header_getLeafHeaders, table_getFlatHeaders, table_getFooterGroups, table_getHeaderGroups, table_getLeafHeaders };","import { assignPrototypeAPIs, assignTableAPIs } from \"../../utils.js\";\nimport { header_getContext, header_getLeafHeaders, table_getFlatHeaders, table_getFooterGroups, table_getHeaderGroups, table_getLeafHeaders } from \"./coreHeadersFeature.utils.js\";\n\n//#region src/core/headers/coreHeadersFeature.ts\n/**\n* Core feature that builds header groups and exposes header context APIs.\n*/\nconst coreHeadersFeature = {\n\tassignHeaderPrototype: (prototype, table) => {\n\t\tassignPrototypeAPIs(\"coreHeadersFeature\", prototype, table, {\n\t\t\theader_getLeafHeaders: {\n\t\t\t\tfn: (header) => header_getLeafHeaders(header),\n\t\t\t\tmemoDeps: (header) => [header.column.table.options.columns]\n\t\t\t},\n\t\t\theader_getContext: {\n\t\t\t\tfn: (header) => header_getContext(header),\n\t\t\t\tmemoDeps: (header) => [header.column.table.options.columns]\n\t\t\t}\n\t\t});\n\t},\n\tconstructTableAPIs: (table) => {\n\t\tassignTableAPIs(\"coreHeadersFeature\", table, {\n\t\t\ttable_getHeaderGroups: {\n\t\t\t\tfn: () => table_getHeaderGroups(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.options.columns,\n\t\t\t\t\ttable.atoms.columnOrder?.get(),\n\t\t\t\t\ttable.atoms.grouping?.get(),\n\t\t\t\t\ttable.atoms.columnPinning?.get(),\n\t\t\t\t\ttable.atoms.columnVisibility?.get(),\n\t\t\t\t\ttable.options.groupedColumnMode\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_getFooterGroups: {\n\t\t\t\tfn: () => table_getFooterGroups(table),\n\t\t\t\tmemoDeps: () => [table.getHeaderGroups()]\n\t\t\t},\n\t\t\ttable_getFlatHeaders: {\n\t\t\t\tfn: () => table_getFlatHeaders(table),\n\t\t\t\tmemoDeps: () => [table.getHeaderGroups()]\n\t\t\t},\n\t\t\ttable_getLeafHeaders: {\n\t\t\t\tfn: () => table_getLeafHeaders(table),\n\t\t\t\tmemoDeps: () => [table.getHeaderGroups()]\n\t\t\t}\n\t\t});\n\t}\n};\n\n//#endregion\nexport { coreHeadersFeature };","import { makeObjectMap } from \"../../utils.js\";\n\n//#region src/core/rows/constructRow.ts\n/**\n* Creates or retrieves the row prototype for a table.\n* The prototype is cached on the table and shared by all row instances.\n*/\nfunction getRowPrototype(table) {\n\tif (!table._rowPrototype) {\n\t\ttable._rowPrototype = { table };\n\t\tconst features = Object.values(table._features);\n\t\tfor (let i = 0; i < features.length; i++) features[i].assignRowPrototype?.(table._rowPrototype, table);\n\t}\n\treturn table._rowPrototype;\n}\n/**\n* Constructs a row instance from normalized table internals.\n*\n* This wires core properties, feature prototype APIs, and instance data used by table rendering and row-model operations.\n*/\nconst constructRow = (table, id, original, rowIndex, depth, subRows, parentId) => {\n\tconst rowPrototype = getRowPrototype(table);\n\tconst row = Object.create(rowPrototype);\n\trow._displayIndexCache = -1;\n\trow._uniqueValuesCache = makeObjectMap();\n\trow._valuesCache = makeObjectMap();\n\trow.depth = depth;\n\trow.id = id;\n\trow.index = rowIndex;\n\trow.original = original;\n\trow.parentId = parentId;\n\trow.subRows = subRows ?? [];\n\tconst initFns = table._rowInstanceInitFns;\n\tfor (let i = 0; i < initFns.length; i++) initFns[i](row);\n\treturn row;\n};\n\n//#endregion\nexport { constructRow };","import { makeObjectMap, skipFirstRun, tableMemo } from \"../../utils.js\";\nimport { autoResetCellSelection, autoResetExpanded, autoResetPageIndex, autoResetSorting } from \"../featureStubs.js\";\nimport { constructRow } from \"../rows/constructRow.js\";\n\n//#region src/core/row-models/createCoreRowModel.ts\n/**\n* Creates a memoized core row model factory.\n*\n* The factory reads the relevant table state atoms and options, then returns a row model function used by the table row-model pipeline.\n*/\nfunction createCoreRowModel() {\n\treturn (table) => {\n\t\treturn tableMemo({\n\t\t\tfeature: \"coreRowModelsFeature\",\n\t\t\ttable,\n\t\t\tfnName: \"table.getCoreRowModel\",\n\t\t\tmemoDeps: () => [table.options.data],\n\t\t\tfn: () => _createCoreRowModel(table, table.options.data),\n\t\t\tonAfterUpdate: skipFirstRun(() => {\n\t\t\t\tautoResetExpanded(table);\n\t\t\t\tautoResetPageIndex(table);\n\t\t\t\tautoResetSorting(table);\n\t\t\t\tautoResetCellSelection(table);\n\t\t\t})\n\t\t});\n\t};\n}\nfunction accessRows(table, rowModel, originalRows, depth = 0, parentRow) {\n\tconst rows = [];\n\tfor (let i = 0; i < originalRows.length; i++) {\n\t\tconst originalRow = originalRows[i];\n\t\tconst row = constructRow(table, table.getRowId(originalRow, i, parentRow), originalRow, i, depth, void 0, parentRow?.id);\n\t\trowModel.flatRows.push(row);\n\t\trowModel.rowsById[row.id] = row;\n\t\trows.push(row);\n\t\tif (table.options.getSubRows) {\n\t\t\trow.originalSubRows = table.options.getSubRows(originalRow, i);\n\t\t\tif (row.originalSubRows?.length) row.subRows = accessRows(table, rowModel, row.originalSubRows, depth + 1, row);\n\t\t}\n\t}\n\treturn rows;\n}\nfunction _createCoreRowModel(table, data) {\n\tconst rowModel = {\n\t\trows: [],\n\t\tflatRows: [],\n\t\trowsById: makeObjectMap()\n\t};\n\trowModel.rows = accessRows(table, rowModel, data);\n\treturn rowModel;\n}\n\n//#endregion\nexport { createCoreRowModel };","import { createCoreRowModel } from \"./createCoreRowModel.js\";\n\n//#region src/core/row-models/coreRowModelsFeature.utils.ts\n/**\n* Resolves the table's unmodified core row model.\n*\n* The factory is created once per table, either from the `coreRowModel` slot on the `features` option\n* or the built-in `createCoreRowModel()`, then reused for later calls.\n*\n* @example\n* ```ts\n* const coreRows = table_getCoreRowModel(table)\n* ```\n*/\nfunction table_getCoreRowModel(table) {\n\tif (!table._rowModels.coreRowModel) table._rowModels.coreRowModel = table.options.features.coreRowModel?.(table) ?? createCoreRowModel()(table);\n\treturn table._rowModels.coreRowModel();\n}\n/**\n* Reads the row model immediately before column/global filtering.\n*\n* Filtering is the first derived row-model stage, so this currently aliases\n* `table.getCoreRowModel()`.\n*\n* @example\n* ```ts\n* const rowsBeforeFiltering = table_getPreFilteredRowModel(table)\n* ```\n*/\nfunction table_getPreFilteredRowModel(table) {\n\treturn table.getCoreRowModel();\n}\n/**\n* Resolves the row model after column and global filtering.\n*\n* When `manualFiltering` is enabled, or no filtered row-model factory was\n* registered, this returns the pre-filtered row model because filtering is\n* expected to happen outside the table.\n*\n* @example\n* ```ts\n* const filteredRows = table_getFilteredRowModel(table)\n* ```\n*/\nfunction table_getFilteredRowModel(table) {\n\tif (!table._rowModels.filteredRowModel) table._rowModels.filteredRowModel = table.options.features.filteredRowModel?.(table);\n\tif (table.options.manualFiltering || !table._rowModels.filteredRowModel) return table.getPreFilteredRowModel();\n\treturn table._rowModels.filteredRowModel();\n}\n/**\n* Reads the row model immediately before grouping.\n*\n* Grouping runs after filtering, so this aliases `table.getFilteredRowModel()`.\n*\n* @example\n* ```ts\n* const rowsBeforeGrouping = table_getPreGroupedRowModel(table)\n* ```\n*/\nfunction table_getPreGroupedRowModel(table) {\n\treturn table.getFilteredRowModel();\n}\n/**\n* Resolves the row model after grouping has produced grouped rows.\n*\n* When `manualGrouping` is enabled, or no grouped row-model factory was\n* registered, this returns the pre-grouped row model unchanged.\n*\n* @example\n* ```ts\n* const groupedRows = table_getGroupedRowModel(table)\n* ```\n*/\nfunction table_getGroupedRowModel(table) {\n\tif (!table._rowModels.groupedRowModel) table._rowModels.groupedRowModel = table.options.features.groupedRowModel?.(table);\n\tif (table.options.manualGrouping || !table._rowModels.groupedRowModel) return table.getPreGroupedRowModel();\n\treturn table._rowModels.groupedRowModel();\n}\n/**\n* Reads the row model immediately before sorting.\n*\n* Sorting runs after grouping, so this aliases `table.getGroupedRowModel()`.\n*\n* @example\n* ```ts\n* const rowsBeforeSorting = table_getPreSortedRowModel(table)\n* ```\n*/\nfunction table_getPreSortedRowModel(table) {\n\treturn table.getGroupedRowModel();\n}\n/**\n* Resolves the row model after sorting has been applied.\n*\n* When `manualSorting` is enabled, or no sorted row-model factory was\n* registered, this returns the pre-sorted row model because sorted data is\n* expected to be supplied by the caller.\n*\n* @example\n* ```ts\n* const sortedRows = table_getSortedRowModel(table)\n* ```\n*/\nfunction table_getSortedRowModel(table) {\n\tif (!table._rowModels.sortedRowModel) table._rowModels.sortedRowModel = table.options.features.sortedRowModel?.(table);\n\tif (table.options.manualSorting || !table._rowModels.sortedRowModel) return table.getPreSortedRowModel();\n\treturn table._rowModels.sortedRowModel();\n}\n/**\n* Reads the row model immediately before row expansion.\n*\n* Expansion runs after sorting, so this aliases `table.getSortedRowModel()`.\n*\n* @example\n* ```ts\n* const rowsBeforeExpansion = table_getPreExpandedRowModel(table)\n* ```\n*/\nfunction table_getPreExpandedRowModel(table) {\n\treturn table.getSortedRowModel();\n}\n/**\n* Resolves the row model after expanded rows have been flattened into view.\n*\n* When `manualExpanding` is enabled, or no expanded row-model factory was\n* registered, this returns the pre-expanded row model unchanged.\n*\n* @example\n* ```ts\n* const expandedRows = table_getExpandedRowModel(table)\n* ```\n*/\nfunction table_getExpandedRowModel(table) {\n\tif (!table._rowModels.expandedRowModel) table._rowModels.expandedRowModel = table.options.features.expandedRowModel?.(table);\n\tif (table.options.manualExpanding || !table._rowModels.expandedRowModel) return table.getPreExpandedRowModel();\n\treturn table._rowModels.expandedRowModel();\n}\n/**\n* Reads the row model immediately before pagination.\n*\n* Pagination is the final built-in row-model stage, so this aliases\n* `table.getExpandedRowModel()`.\n*\n* @example\n* ```ts\n* const rowsBeforePagination = table_getPrePaginatedRowModel(table)\n* ```\n*/\nfunction table_getPrePaginatedRowModel(table) {\n\treturn table.getExpandedRowModel();\n}\n/**\n* Resolves the row model after pagination has sliced rows for the current page.\n*\n* When `manualPagination` is enabled, or no paginated row-model factory was\n* registered, this returns the pre-paginated row model because pagination is\n* expected to happen before data reaches the table.\n*\n* @example\n* ```ts\n* const pageRows = table_getPaginatedRowModel(table)\n* ```\n*/\nfunction table_getPaginatedRowModel(table) {\n\tif (!table._rowModels.paginatedRowModel) table._rowModels.paginatedRowModel = table.options.features.paginatedRowModel?.(table);\n\tif (table.options.manualPagination || !table._rowModels.paginatedRowModel) return table.getPrePaginatedRowModel();\n\treturn table._rowModels.paginatedRowModel();\n}\n/**\n* Resolves the final row model consumed by renderers.\n*\n* This is the end of the built-in row-model pipeline: core -> filtering ->\n* grouping -> sorting -> expanding -> pagination.\n*\n* @example\n* ```ts\n* const visibleRows = table_getRowModel(table)\n* ```\n*/\nfunction table_getRowModel(table) {\n\treturn table.getPaginatedRowModel();\n}\n\n//#endregion\nexport { table_getCoreRowModel, table_getExpandedRowModel, table_getFilteredRowModel, table_getGroupedRowModel, table_getPaginatedRowModel, table_getPreExpandedRowModel, table_getPreFilteredRowModel, table_getPreGroupedRowModel, table_getPrePaginatedRowModel, table_getPreSortedRowModel, table_getRowModel, table_getSortedRowModel };","import { assignTableAPIs } from \"../../utils.js\";\nimport { table_getCoreRowModel, table_getExpandedRowModel, table_getFilteredRowModel, table_getGroupedRowModel, table_getPaginatedRowModel, table_getPreExpandedRowModel, table_getPreFilteredRowModel, table_getPreGroupedRowModel, table_getPrePaginatedRowModel, table_getPreSortedRowModel, table_getRowModel, table_getSortedRowModel } from \"./coreRowModelsFeature.utils.js\";\n\n//#region src/core/row-models/coreRowModelsFeature.ts\n/**\n* Core feature that wires table row-model accessors and row-model caches.\n*/\nconst coreRowModelsFeature = { constructTableAPIs: (table) => {\n\tassignTableAPIs(\"coreRowModelsFeature\", table, {\n\t\ttable_getCoreRowModel: { fn: () => table_getCoreRowModel(table) },\n\t\ttable_getPreFilteredRowModel: { fn: () => table_getPreFilteredRowModel(table) },\n\t\ttable_getFilteredRowModel: { fn: () => table_getFilteredRowModel(table) },\n\t\ttable_getPreGroupedRowModel: { fn: () => table_getPreGroupedRowModel(table) },\n\t\ttable_getGroupedRowModel: { fn: () => table_getGroupedRowModel(table) },\n\t\ttable_getPreSortedRowModel: { fn: () => table_getPreSortedRowModel(table) },\n\t\ttable_getSortedRowModel: { fn: () => table_getSortedRowModel(table) },\n\t\ttable_getPreExpandedRowModel: { fn: () => table_getPreExpandedRowModel(table) },\n\t\ttable_getExpandedRowModel: { fn: () => table_getExpandedRowModel(table) },\n\t\ttable_getPrePaginatedRowModel: { fn: () => table_getPrePaginatedRowModel(table) },\n\t\ttable_getPaginatedRowModel: { fn: () => table_getPaginatedRowModel(table) },\n\t\ttable_getRowModel: { fn: () => table_getRowModel(table) }\n\t});\n} };\n\n//#endregion\nexport { coreRowModelsFeature };","//#region src/core/cells/constructCell.ts\n/**\n* Creates or retrieves the cell prototype for a table.\n* The prototype is cached on the table and shared by all cell instances.\n*/\nfunction getCellPrototype(table) {\n\tif (!table._cellPrototype) {\n\t\ttable._cellPrototype = { table };\n\t\tconst features = Object.values(table._features);\n\t\tfor (let i = 0; i < features.length; i++) features[i].assignCellPrototype?.(table._cellPrototype, table);\n\t}\n\treturn table._cellPrototype;\n}\n/**\n* Constructs a cell instance from normalized table internals.\n*\n* This wires core properties, feature prototype APIs, and instance data used by table rendering and row-model operations.\n*/\nfunction constructCell(column, row, table) {\n\tconst cellPrototype = getCellPrototype(table);\n\tconst cell = Object.create(cellPrototype);\n\tcell.column = column;\n\tcell.id = `${row.id}_${column.id}`;\n\tcell.row = row;\n\tconst initFns = table._cellInstanceInitFns;\n\tfor (let i = 0; i < initFns.length; i++) initFns[i](cell);\n\treturn cell;\n}\n\n//#endregion\nexport { constructCell };","import { flattenBy, hasOwn, makeObjectMap } from \"../../utils.js\";\nimport { expandRowModel } from \"../featureStubs.js\";\nimport { constructCell } from \"../cells/constructCell.js\";\n\n//#region src/core/rows/coreRowsFeature.utils.ts\n/**\n* Returns this row's zero-based position in the current pre-pagination row\n* model. Rows outside that model return `-1`.\n*/\nfunction row_getDisplayIndex(row) {\n\tconst rows = row.table.getRowsInDisplayOrder();\n\tconst displayIndex = row._displayIndexCache;\n\treturn rows[displayIndex] === row ? displayIndex : -1;\n}\n/**\n* Returns the rows in the current display order after assigning their\n* zero-based display indexes.\n*\n* When expanded rows bypass pagination, expanded descendants are inserted into\n* the returned order even though they are absent from the pre-pagination row\n* model.\n*/\nfunction table_getRowsInDisplayOrder(table) {\n\tconst rowModel = table.getPrePaginatedRowModel();\n\tconst rows = table.options.paginateExpandedRows === false ? expandRowModel(table, rowModel).rows : rowModel.rows;\n\tfor (let i = 0; i < rows.length; i++) rows[i]._displayIndexCache = i;\n\treturn rows;\n}\n/**\n* Reads and caches this row's value for a column.\n*\n* The value is produced by the column accessor. Missing columns or display\n* columns without an accessor return `undefined`.\n*\n* @example\n* ```ts\n* const firstName = row_getValue(row, 'firstName')\n* ```\n*/\nfunction row_getValue(row, columnId) {\n\tif (hasOwn(row._valuesCache, columnId)) return row._valuesCache[columnId];\n\tconst column = row.table.getColumn(columnId);\n\tif (!column?.accessorFn) return;\n\trow._valuesCache[columnId] = column.accessorFn(row.original, row.index);\n\treturn row._valuesCache[columnId];\n}\n/**\n* Reads and caches the values used by faceting/grouping for a column.\n*\n* If the column defines `getUniqueValues`, that result is used. Otherwise the\n* row's accessor value is wrapped in a single-item array.\n*\n* @example\n* ```ts\n* const values = row_getUniqueValues(row, 'tags')\n* ```\n*/\nfunction row_getUniqueValues(row, columnId) {\n\tif (hasOwn(row._uniqueValuesCache, columnId)) return row._uniqueValuesCache[columnId];\n\tconst column = row.table.getColumn(columnId);\n\tif (!column?.accessorFn) return;\n\tif (!column.columnDef.getUniqueValues) {\n\t\trow._uniqueValuesCache[columnId] = [row.getValue(columnId)];\n\t\treturn row._uniqueValuesCache[columnId];\n\t}\n\trow._uniqueValuesCache[columnId] = column.columnDef.getUniqueValues(row.original, row.index);\n\treturn row._uniqueValuesCache[columnId];\n}\n/**\n* Returns a renderable row value for a column.\n*\n* If the accessor value is nullish, the table's `renderFallbackValue` is used\n* instead.\n*\n* @example\n* ```ts\n* const value = row_renderValue(row, 'firstName')\n* ```\n*/\nfunction row_renderValue(row, columnId) {\n\treturn row.getValue(columnId) ?? row.table.options.renderFallbackValue;\n}\n/**\n* Flattens this row's descendant tree into leaf rows.\n*\n* The row itself is not included; only nested `subRows` are walked.\n*\n* @example\n* ```ts\n* const descendants = row_getLeafRows(row)\n* ```\n*/\nfunction row_getLeafRows(row) {\n\treturn flattenBy(row.subRows, (d) => d.subRows);\n}\n/**\n* Returns the deepest structural row depth in the core row model.\n* Root rows are depth `0`, their direct sub-rows are depth `1`, and so on.\n*/\nfunction table_getMaxSubRowDepth(table) {\n\tconst rows = table.getCoreRowModel().flatRows;\n\tlet maxDepth = 0;\n\tfor (let i = 0; i < rows.length; i++) maxDepth = Math.max(maxDepth, rows[i].depth);\n\treturn maxDepth;\n}\n/**\n* Looks up this row's direct parent, if it has one.\n*\n* Parent lookup prefers the core row model for structural parents, then falls\n* back to the pre-pagination row model for generated parent rows.\n*\n* @example\n* ```ts\n* const parent = row_getParentRow(row)\n* ```\n*/\nfunction row_getParentRow(row) {\n\tif (!row.parentId) return;\n\treturn row.table.getCoreRowModel().rowsById[row.parentId] ?? row.table.getRow(row.parentId, true);\n}\n/**\n* Collects this row's ancestor chain from root to direct parent.\n*\n* The current row is not included. Rows without a parent return an empty array.\n*\n* @example\n* ```ts\n* const ancestors = row_getParentRows(row)\n* ```\n*/\nfunction row_getParentRows(row) {\n\tconst parentRows = [];\n\tlet currentRow = row;\n\twhile (true) {\n\t\tconst parentRow = currentRow.getParentRow();\n\t\tif (!parentRow) break;\n\t\tparentRows.push(parentRow);\n\t\tcurrentRow = parentRow;\n\t}\n\treturn parentRows.reverse();\n}\n/**\n* Constructs one cell for each leaf column in this row.\n*\n* The result follows `table.getAllLeafColumns()` order and includes hidden\n* columns; visibility-specific APIs filter this list later.\n*\n* @example\n* ```ts\n* const cells = row_getAllCells(row)\n* ```\n*/\nfunction row_getAllCells(row) {\n\tconst columns = row.table.getAllLeafColumns();\n\tlet cache = row._cellsCache;\n\tif (!cache) cache = row._cellsCache = /* @__PURE__ */ new WeakMap();\n\tconst cells = new Array(columns.length);\n\tfor (let i = 0; i < columns.length; i++) {\n\t\tconst column = columns[i];\n\t\tlet cell = cache.get(column);\n\t\tif (!cell) {\n\t\t\tcell = constructCell(column, row, row.table);\n\t\t\tcache.set(column, cell);\n\t\t}\n\t\tcells[i] = cell;\n\t}\n\treturn cells;\n}\n/**\n* Builds a lookup map of this row's cells keyed by column id.\n*\n* This is the static implementation behind `row.getAllCellsByColumnId()`.\n*\n* @example\n* ```ts\n* const cellsById = row_getAllCellsByColumnId(row)\n* ```\n*/\nfunction row_getAllCellsByColumnId(row) {\n\tconst result = makeObjectMap();\n\tconst cells = row.getAllCells();\n\tfor (let i = 0; i < cells.length; i++) {\n\t\tconst cell = cells[i];\n\t\tresult[cell.column.id] = cell;\n\t}\n\treturn result;\n}\n/**\n* Resolves the stable id for a row.\n*\n* `options.getRowId` wins when provided. Otherwise root rows use their index\n* and child rows append their index to the parent id, such as `0.2`.\n*\n* @example\n* ```ts\n* const id = table_getRowId(originalRow, table, index, parentRow)\n* ```\n*/\nfunction table_getRowId(originalRow, table, index, parent) {\n\treturn table.options.getRowId?.(originalRow, index, parent) ?? (parent ? `${parent.id}.${index}` : String(index));\n}\n/**\n* Looks up a row by id from the current or full row model.\n*\n* By default this searches `table.getRowModel()`. Passing `searchAll` searches\n* the pre-pagination model first, then falls back to the core model.\n*\n* @example\n* ```ts\n* const row = table_getRow(table, rowId, true)\n* ```\n*/\nfunction table_getRow(table, rowId, searchAll) {\n\tlet row = (searchAll ? table.getPrePaginatedRowModel() : table.getRowModel()).rowsById[rowId];\n\tif (!row) {\n\t\trow = table.getCoreRowModel().rowsById[rowId];\n\t\tif (!row) {\n\t\t\tif (process.env.NODE_ENV === \"development\") throw new Error(`getRow could not find row with ID: ${rowId}`);\n\t\t\tthrow new Error();\n\t\t}\n\t}\n\treturn row;\n}\n\n//#endregion\nexport { row_getAllCells, row_getAllCellsByColumnId, row_getDisplayIndex, row_getLeafRows, row_getParentRow, row_getParentRows, row_getUniqueValues, row_getValue, row_renderValue, table_getMaxSubRowDepth, table_getRow, table_getRowId, table_getRowsInDisplayOrder };","import { assignPrototypeAPIs, assignTableAPIs } from \"../../utils.js\";\nimport { row_getAllCells, row_getAllCellsByColumnId, row_getDisplayIndex, row_getLeafRows, row_getParentRow, row_getParentRows, row_getUniqueValues, row_getValue, row_renderValue, table_getMaxSubRowDepth, table_getRow, table_getRowId, table_getRowsInDisplayOrder } from \"./coreRowsFeature.utils.js\";\n\n//#region src/core/rows/coreRowsFeature.ts\n/**\n* Core feature that creates row APIs for values, cells, and tree traversal.\n*/\nconst coreRowsFeature = {\n\tassignRowPrototype: (prototype, table) => {\n\t\tassignPrototypeAPIs(\"coreRowsFeature\", prototype, table, {\n\t\t\trow_getDisplayIndex: { fn: (row) => row_getDisplayIndex(row) },\n\t\t\trow_getAllCellsByColumnId: {\n\t\t\t\tfn: (row) => row_getAllCellsByColumnId(row),\n\t\t\t\tmemoDeps: (row) => [row.getAllCells()]\n\t\t\t},\n\t\t\trow_getAllCells: {\n\t\t\t\tfn: (row) => row_getAllCells(row),\n\t\t\t\tmemoDeps: (row) => [row.table.getAllLeafColumns()]\n\t\t\t},\n\t\t\trow_getLeafRows: {\n\t\t\t\tfn: (row) => row_getLeafRows(row),\n\t\t\t\tmemoDeps: (row) => [row.subRows]\n\t\t\t},\n\t\t\trow_getParentRow: { fn: (row) => row_getParentRow(row) },\n\t\t\trow_getParentRows: { fn: (row) => row_getParentRows(row) },\n\t\t\trow_getUniqueValues: { fn: (row, columnId) => row_getUniqueValues(row, columnId) },\n\t\t\trow_getValue: { fn: (row, columnId) => row_getValue(row, columnId) },\n\t\t\trow_renderValue: { fn: (row, columnId) => row_renderValue(row, columnId) }\n\t\t});\n\t},\n\tconstructTableAPIs: (table) => {\n\t\tassignTableAPIs(\"coreRowsFeature\", table, {\n\t\t\ttable_getRowsInDisplayOrder: {\n\t\t\t\tfn: () => table_getRowsInDisplayOrder(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.getPrePaginatedRowModel().rows,\n\t\t\t\t\ttable.options.paginateExpandedRows,\n\t\t\t\t\ttable.options.paginateExpandedRows === false ? table.atoms.expanded?.get() : void 0\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_getRowId: { fn: (originalRow, index, parent) => table_getRowId(originalRow, table, index, parent) },\n\t\t\ttable_getRow: { fn: (id, searchAll) => table_getRow(table, id, searchAll) },\n\t\t\ttable_getMaxSubRowDepth: {\n\t\t\t\tfn: () => table_getMaxSubRowDepth(table),\n\t\t\t\tmemoDeps: () => [table.getCoreRowModel()]\n\t\t\t}\n\t\t});\n\t}\n};\n\n//#endregion\nexport { coreRowsFeature };","import { cloneState, functionalUpdate } from \"../../utils.js\";\n\n//#region src/core/table/coreTablesFeature.utils.ts\n/**\n* Synchronizes externally controlled state slices into the table's base atoms.\n*\n* This keeps `options.state` values mirrored in the atom graph so derived\n* atoms, stores, and table APIs read a consistent snapshot.\n*\n* Adapters that update options during their host's render phase pass the\n* state snapshot captured by the committed render as `capturedState` — the\n* shared options object may already hold values from a newer render that\n* never commits. Pass `null` to publish nothing (a captured \"no controlled\n* state\"); omitting the argument reads the current `table.options.state`\n* instead. An optional `compare` suppresses semantically unchanged slice\n* writes; the default remains reference equality.\n*\n* @example\n* ```ts\n* table_syncExternalStateToBaseAtoms(table)\n* table_syncExternalStateToBaseAtoms(table, capturedState ?? null, shallow)\n* ```\n*/\nfunction table_syncExternalStateToBaseAtoms(table, capturedState, compare = (currentState, externalState) => currentState === externalState) {\n\tconst state = capturedState === void 0 ? table.options.state : capturedState;\n\ttable._reactivity.batch(() => {\n\t\tif (state) for (const key in state) {\n\t\t\tconst baseAtom = table.baseAtoms[key];\n\t\t\tif (!baseAtom) continue;\n\t\t\tconst rawExternalState = state[key];\n\t\t\tconst externalState = rawExternalState === void 0 ? table.initialState[key] : rawExternalState;\n\t\t\tif (!compare(table._reactivity.untrack(() => baseAtom.get()), externalState)) baseAtom.set(() => externalState);\n\t\t}\n\t});\n}\n/**\n* Publishes captured controlled state after a host framework commits.\n*\n* Render-phase adapters stage options without synchronizing base atoms, then\n* pass the state captured by the committed render here. The commit signal also\n* invalidates ownership changes when no base atom was written.\n*/\nfunction table_publishExternalState(table, state, compare = (currentState, externalState) => currentState === externalState) {\n\ttable._reactivity.batch(() => {\n\t\ttable_syncExternalStateToBaseAtoms(table, state, compare);\n\t\ttable._reactivity.commit?.();\n\t});\n}\n/**\n* Resets all internal table base atoms to `table.initialState`, then clears\n* transient instance data through registered feature reset hooks.\n*\n* This resets internally owned state slices in a single reactivity batch. Use\n* feature-specific reset APIs when a slice may be externally owned.\n*\n* @example\n* ```ts\n* table_reset(table)\n* ```\n*/\nfunction table_reset(table) {\n\tconst snap = cloneState(table.initialState);\n\ttable._reactivity.batch(() => {\n\t\tconst keys = Object.keys(snap);\n\t\tfor (let i = 0; i < keys.length; i++) {\n\t\t\tconst key = keys[i];\n\t\t\ttable.baseAtoms[key].set(snap[key]);\n\t\t}\n\t});\n\tconst features = Object.values(table._features);\n\tfor (let i = 0; i < features.length; i++) features[i].resetTableInstanceData?.(table);\n}\n/**\n* Merges new table options with the current resolved options.\n*\n* If `options.mergeOptions` is provided, it owns the merge behavior; otherwise\n* options are shallow-merged. Static options that should never change after\n* initialization are restored on a fresh object so framework merge helpers may\n* return readonly getter/proxy objects.\n*\n* @example\n* ```ts\n* const options = table_mergeOptions(table, nextOptions)\n* ```\n*/\nfunction table_mergeOptions(table, newOptions) {\n\tconst { features, atoms, initialState } = table.options;\n\tif (!table.options.mergeOptions) return {\n\t\t...table.options,\n\t\t...newOptions,\n\t\tfeatures,\n\t\tatoms,\n\t\tinitialState\n\t};\n\tconst mergedOptions = table.options.mergeOptions(table.options, newOptions);\n\tconst descriptors = { ...Object.getOwnPropertyDescriptors(mergedOptions) };\n\treturn Object.defineProperties(Object.create(Object.getPrototypeOf(mergedOptions)), {\n\t\t...descriptors,\n\t\tfeatures: {\n\t\t\tvalue: features,\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\t\t\twritable: true\n\t\t},\n\t\tatoms: {\n\t\t\tvalue: atoms,\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\t\t\twritable: true\n\t\t},\n\t\tinitialState: {\n\t\t\tvalue: initialState,\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\t\t\twritable: true\n\t\t}\n\t});\n}\n/**\n* Updates the table options object.\n*\n* The updater receives the current resolved options and the merged result is\n* immediately assigned to the table instance.\n*\n* @example\n* ```ts\n* table_setOptions(table, (old) => old)\n* table_setOptions(table, (old) => old, { syncExternalState: false })\n* ```\n*/\nfunction table_setOptions(table, updater, options) {\n\tconst mergedOptions = table_mergeOptions(table, functionalUpdate(updater, table.options));\n\tif (table.optionsStore) table.optionsStore.set(() => mergedOptions);\n\telse table.options = mergedOptions;\n\tif (options?.syncExternalState !== false) table_publishExternalState(table, mergedOptions.state ?? null);\n}\n\n//#endregion\nexport { table_mergeOptions, table_publishExternalState, table_reset, table_setOptions, table_syncExternalStateToBaseAtoms };","import { assignTableAPIs } from \"../../utils.js\";\nimport { table_reset, table_setOptions } from \"./coreTablesFeature.utils.js\";\n\n//#region src/core/table/coreTablesFeature.ts\n/**\n* Core feature that adds base table instance APIs such as reset and setOptions.\n*/\nconst coreTablesFeature = { constructTableAPIs: (table) => {\n\tassignTableAPIs(\"coreTablesFeature\", table, {\n\t\ttable_reset: { fn: () => table_reset(table) },\n\t\ttable_setOptions: { fn: (updater) => table_setOptions(table, updater) }\n\t});\n} };\n\n//#endregion\nexport { coreTablesFeature };","import { coreCellsFeature } from \"./cells/coreCellsFeature.js\";\nimport { coreColumnsFeature } from \"./columns/coreColumnsFeature.js\";\nimport { coreHeadersFeature } from \"./headers/coreHeadersFeature.js\";\nimport { coreRowModelsFeature } from \"./row-models/coreRowModelsFeature.js\";\nimport { coreRowsFeature } from \"./rows/coreRowsFeature.js\";\nimport { coreTablesFeature } from \"./table/coreTablesFeature.js\";\n\n//#region src/core/coreFeatures.ts\n/**\n* The built-in core feature set required by every table.\n*\n* These features provide table, column, row, header, cell, and core row-model behavior before optional feature plugins are added.\n*/\nconst coreFeatures = {\n\tcoreCellsFeature,\n\tcoreColumnsFeature,\n\tcoreHeadersFeature,\n\tcoreRowModelsFeature,\n\tcoreRowsFeature,\n\tcoreTablesFeature\n};\n\n//#endregion\nexport { coreFeatures };","//#region src/helpers/metaHelper.ts\n/**\n* A helper for declaring the `tableMeta`/`columnMeta` type-only slots in the\n* `features` option without a type assertion.\n*\n* Equivalent to `{} as TMeta`, but reads as type-only at the call site and\n* avoids `@typescript-eslint/no-unnecessary-type-assertion` false positives\n* when the meta type has only optional properties (where an auto-fix removing\n* the assertion would silently degrade the inferred meta type to `{}`).\n*\n* The returned value is a phantom — it is ignored and stripped from the\n* table's registered features at runtime; only its type is used.\n* @example\n* ```\n* import { metaHelper, tableFeatures, rowSortingFeature } from '@tanstack/react-table'\n* const features = tableFeatures({\n* rowSortingFeature,\n* tableMeta: metaHelper<MyTableMeta>(),\n* columnMeta: metaHelper<MyColumnMeta>(),\n* });\n* ```\n*/\nfunction metaHelper() {\n\treturn {};\n}\n\n//#endregion\nexport { metaHelper };","import { cloneState, hasOwn } from \"../../utils.js\";\nimport { table_syncExternalStateToBaseAtoms } from \"./coreTablesFeature.utils.js\";\nimport { coreFeatures } from \"../coreFeatures.js\";\nimport { atomToStore } from \"../reactivity/coreReactivityFeature.utils.js\";\nimport { shallow } from \"@tanstack/store\";\n\n//#region src/core/table/constructTable.ts\n/**\n* Builds the initial table state from registered features and user initial state.\n*\n* Each feature contributes its default state before user-provided `initialState` values are merged in.\n*/\nfunction getInitialTableState(features, initialState = {}) {\n\tObject.values(features).forEach((feature) => {\n\t\tinitialState = feature.getInitialState?.(initialState) ?? initialState;\n\t});\n\treturn cloneState(initialState);\n}\n/**\n* Constructs a table instance from normalized table internals.\n*\n* This wires core properties, feature prototype APIs, and instance data used by table rendering and row-model operations.\n*/\nfunction constructTable(tableOptions) {\n\tconst _reactivity = tableOptions.features.coreReactivityFeature;\n\tconst { aggregationFns, columnMeta: _columnMeta, coreRowModel, expandedRowModel, facetedMinMaxValues, facetedRowModel, facetedUniqueValues, filterFns, filterMeta: _filterMeta, filteredRowModel, groupedRowModel, paginatedRowModel, sortFns, sortedRowModel, tableMeta: _tableMeta, ...features } = tableOptions.features;\n\tconst table = {\n\t\t_cellInstanceInitFns: [],\n\t\t_columnInstanceInitFns: [],\n\t\t_features: {\n\t\t\t...coreFeatures,\n\t\t\t...features\n\t\t},\n\t\t_headerGroupInstanceInitFns: [],\n\t\t_headerInstanceInitFns: [],\n\t\t_reactivity,\n\t\t_rowInstanceInitFns: [],\n\t\t_rowModelFns: {\n\t\t\taggregationFns,\n\t\t\tfilterFns,\n\t\t\tsortFns\n\t\t},\n\t\t_rowModels: {},\n\t\tatoms: {},\n\t\tbaseAtoms: {}\n\t};\n\tconst featuresList = Object.values(table._features);\n\tconst mergedOptions = {\n\t\t...featuresList.reduce((obj, feature) => {\n\t\t\treturn Object.assign(obj, feature.getDefaultTableOptions?.(table));\n\t\t}, {}),\n\t\t...tableOptions\n\t};\n\tif (_reactivity.wrapExternalAtoms && mergedOptions.atoms) for (const [atomKey, _atom] of Object.entries(mergedOptions.atoms)) {\n\t\tconst atom = _atom;\n\t\tconst wrappedAtom = _reactivity.createWritableAtom(atom.get(), { debugName: `externalAtom/${atomKey}` });\n\t\tmergedOptions.atoms[atomKey] = wrappedAtom;\n\t\tlet syncExternal = false;\n\t\tconst syncAtomToWrappedSub = atom.subscribe((value) => {\n\t\t\tif (syncExternal) return;\n\t\t\twrappedAtom.set(value);\n\t\t});\n\t\tconst syncWrappedToAtomSub = wrappedAtom.subscribe((value) => {\n\t\t\tsyncExternal = true;\n\t\t\tatom.set(value);\n\t\t\tsyncExternal = false;\n\t\t});\n\t\t_reactivity.addSubscription(syncAtomToWrappedSub);\n\t\t_reactivity.addSubscription(syncWrappedToAtomSub);\n\t}\n\tif (_reactivity.createOptionsStore) {\n\t\ttable.optionsStore = _reactivity.createWritableAtom(mergedOptions, { debugName: \"table/optionsStore\" });\n\t\tObject.defineProperty(table, \"options\", {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: true,\n\t\t\tget() {\n\t\t\t\treturn table.optionsStore.get();\n\t\t\t},\n\t\t\tset(value) {\n\t\t\t\ttable.optionsStore.set(() => value);\n\t\t\t}\n\t\t});\n\t} else table.options = mergedOptions;\n\ttable.initialState = getInitialTableState(table._features, table.options.initialState);\n\tconst stateKeys = Object.keys(table.initialState);\n\tfor (let i = 0; i < stateKeys.length; i++) {\n\t\tconst key = stateKeys[i];\n\t\ttable.baseAtoms[key] = _reactivity.createWritableAtom(table.initialState[key], { debugName: `table/baseAtoms/${key}` });\n\t\ttable.atoms[key] = _reactivity.createReadonlyAtom(() => {\n\t\t\tconst options = table.options;\n\t\t\tconst externalAtom = options.atoms?.[key];\n\t\t\tconst reactiveState = externalAtom ? externalAtom.get() : table.baseAtoms[key].get();\n\t\t\tif (externalAtom) return reactiveState;\n\t\t\tconst controlledState = options.state;\n\t\t\tif (controlledState && hasOwn(controlledState, key)) {\n\t\t\t\tconst controlledValue = controlledState[key];\n\t\t\t\treturn controlledValue === void 0 ? table.initialState[key] : controlledValue;\n\t\t\t}\n\t\t\treturn reactiveState;\n\t\t}, { debugName: `table/atoms/${key}` });\n\t}\n\ttable_syncExternalStateToBaseAtoms(table);\n\ttable.store = atomToStore(_reactivity.createReadonlyAtom(() => {\n\t\tconst snapshot = {};\n\t\tfor (let i = 0; i < stateKeys.length; i++) {\n\t\t\tconst key = stateKeys[i];\n\t\t\tsnapshot[key] = table.atoms[key].get();\n\t\t}\n\t\treturn snapshot;\n\t}, {\n\t\tcompare: shallow,\n\t\tdebugName: \"table/store\"\n\t}));\n\tfor (let i = 0; i < featuresList.length; i++) {\n\t\tconst feature = featuresList[i];\n\t\tfeature.initTableInstanceData?.(table);\n\t\tif (feature.initCellInstanceData) table._cellInstanceInitFns.push(feature.initCellInstanceData.bind(feature));\n\t\tif (feature.initColumnInstanceData) table._columnInstanceInitFns.push(feature.initColumnInstanceData.bind(feature));\n\t\tif (feature.initHeaderGroupInstanceData) table._headerGroupInstanceInitFns.push(feature.initHeaderGroupInstanceData.bind(feature));\n\t\tif (feature.initHeaderInstanceData) table._headerInstanceInitFns.push(feature.initHeaderInstanceData.bind(feature));\n\t\tif (feature.initRowInstanceData) table._rowInstanceInitFns.push(feature.initRowInstanceData.bind(feature));\n\t\tfeature.constructTableAPIs?.(table);\n\t}\n\tif (process.env.NODE_ENV === \"development\" && (tableOptions.debugAll || tableOptions.debugTable)) {\n\t\tconst features = Object.keys(table._features);\n\t\tconst rowModels = Object.entries({\n\t\t\tcoreRowModel,\n\t\t\tfilteredRowModel,\n\t\t\tgroupedRowModel,\n\t\t\tsortedRowModel,\n\t\t\texpandedRowModel,\n\t\t\tpaginatedRowModel,\n\t\t\tfacetedRowModel,\n\t\t\tfacetedMinMaxValues,\n\t\t\tfacetedUniqueValues\n\t\t}).filter(([, factory]) => factory).map(([key]) => key);\n\t\tconst states = Object.keys(table.initialState);\n\t\tconsole.log(`Constructing Table Instance\n\n Features: ${features.join(\"\\n \")}\n\n Row Models: ${rowModels.length ? rowModels.join(\"\\n \") : \"(none)\"}\n\n States: ${states.join(\"\\n \")}\\n`, { table });\n\t}\n\treturn table;\n}\n\n//#endregion\nexport { constructTable, getInitialTableState };","import { cloneState, functionalUpdate, isFunction, setStateSlice } from \"../../utils.js\";\n\n//#region src/features/column-filtering/columnFilteringFeature.utils.ts\n/**\n* Creates the default column filter state.\n*\n* The feature default is an empty array, meaning no column filters are active.\n* Reset APIs use this value when `defaultState` is `true`.\n*\n* @example\n* ```ts\n* const filters = getDefaultColumnFiltersState()\n* ```\n*/\nfunction getDefaultColumnFiltersState() {\n\treturn [];\n}\n/**\n* Chooses a built-in filter function from the column's first core row value.\n*\n* Strings use `includesString`, numbers use `inNumberRange`, booleans and\n* objects use `equals`, dates use `inDateRange`, arrays use `arrIncludes`,\n* and unknown values fall back to `weakEquals`.\n*\n* The chosen filter function is looked up in the table's `filterFns`\n* registry. When it is not registered there, this returns `undefined` and\n* warns in development instead of substituting a different filter function.\n*\n* @example\n* ```ts\n* const filterFn = column_getAutoFilterFn(column)\n* ```\n*/\nfunction column_getAutoFilterFn(column) {\n\tconst filterFns = column.table._rowModelFns.filterFns;\n\tconst rows = column.table.getCoreRowModel().flatRows;\n\tlet value;\n\tfor (let i = 0; i < rows.length; i++) {\n\t\tconst rowValue = rows[i].getValue(column.id);\n\t\tif (rowValue !== null && rowValue !== void 0) {\n\t\t\tvalue = rowValue;\n\t\t\tbreak;\n\t\t}\n\t}\n\tlet filterFnName;\n\tif (typeof value === \"string\") filterFnName = \"includesString\";\n\telse if (typeof value === \"number\") filterFnName = \"inNumberRange\";\n\telse if (typeof value === \"boolean\") filterFnName = \"equals\";\n\telse if (Array.isArray(value)) filterFnName = \"arrIncludes\";\n\telse if (Object.prototype.toString.call(value) === \"[object Date]\") filterFnName = \"inDateRange\";\n\telse if (value !== null && typeof value === \"object\") filterFnName = \"equals\";\n\telse filterFnName = \"weakEquals\";\n\tconst filterFn = filterFns?.[filterFnName];\n\tif (process.env.NODE_ENV === \"development\" && !filterFn) console.warn(`filterFn '${filterFnName}' (auto) for column '${column.id}' is not registered`);\n\treturn filterFn;\n}\n/**\n* Resolves the filter function configured for a column.\n*\n* Function-valued `columnDef.filterFn` is returned directly, `'auto'` delegates\n* to `column_getAutoFilterFn`, and string values are looked up in the table's\n* filter function registry.\n*\n* @example\n* ```ts\n* const filterFn = column_getFilterFn(column)\n* ```\n*/\nfunction column_getFilterFn(column) {\n\tlet filterFn = null;\n\tconst filterFns = column.table._rowModelFns.filterFns;\n\tfilterFn = isFunction(column.columnDef.filterFn) ? column.columnDef.filterFn : column.columnDef.filterFn === \"auto\" ? column_getAutoFilterFn(column) : filterFns?.[column.columnDef.filterFn];\n\tif (process.env.NODE_ENV === \"development\" && !filterFn && column.columnDef.filterFn !== \"auto\") console.warn(`filterFn '${String(column.columnDef.filterFn)}' for column '${column.id}' is not registered`);\n\treturn filterFn ?? void 0;\n}\n/**\n* Checks whether column filtering is enabled for this accessor column.\n*\n* The column must have an accessor and filtering must be enabled by the column\n* definition, `enableColumnFilters`, and the table-wide `enableFilters` option.\n*\n* @example\n* ```ts\n* const canFilter = column_getCanFilter(column)\n* ```\n*/\nfunction column_getCanFilter(column) {\n\treturn (column.columnDef.enableColumnFilter ?? true) && (column.table.options.enableColumnFilters ?? true) && (column.table.options.enableFilters ?? true) && !!column.accessorFn;\n}\n/**\n* Checks whether this column currently has an entry in `state.columnFilters`.\n*\n* This only reflects filter state presence; it does not indicate whether the\n* filter removes any rows.\n*\n* @example\n* ```ts\n* const isFiltered = column_getIsFiltered(column)\n* ```\n*/\nfunction column_getIsFiltered(column) {\n\treturn column_getFilterIndex(column) > -1;\n}\n/**\n* Reads this column's current filter value from `state.columnFilters`.\n*\n* Missing filter entries return `undefined`.\n*\n* @example\n* ```ts\n* const value = column_getFilterValue(column)\n* ```\n*/\nfunction column_getFilterValue(column) {\n\treturn column.table.atoms.columnFilters?.get()?.find((d) => d.id === column.id)?.value;\n}\n/**\n* Finds this column's position in the ordered `state.columnFilters` array.\n*\n* The result is `-1` when the column has no active filter.\n*\n* @example\n* ```ts\n* const index = column_getFilterIndex(column)\n* ```\n*/\nfunction column_getFilterIndex(column) {\n\treturn column.table.atoms.columnFilters?.get()?.findIndex((d) => d.id === column.id) ?? -1;\n}\n/**\n* Adds, updates, or removes this column's filter value.\n*\n* The incoming value may be an updater. After resolution, `autoRemove` rules\n* decide whether the filter should be removed instead of stored.\n*\n* @example\n* ```ts\n* column_setFilterValue(column, (old) => String(old ?? '').trim())\n* ```\n*/\nfunction column_setFilterValue(column, value) {\n\ttable_setColumnFilters(column.table, (old) => {\n\t\tconst filterFn = column_getFilterFn(column);\n\t\tconst previousFilter = old.find((d) => d.id === column.id);\n\t\tconst newFilter = functionalUpdate(value, previousFilter ? previousFilter.value : void 0);\n\t\tif (shouldAutoRemoveFilter(filterFn, newFilter, column)) return old.filter((d) => d.id !== column.id);\n\t\tconst newFilterObj = {\n\t\t\tid: column.id,\n\t\t\tvalue: newFilter\n\t\t};\n\t\tif (previousFilter) return old.map((d) => {\n\t\t\tif (d.id === column.id) return newFilterObj;\n\t\t\treturn d;\n\t\t});\n\t\tif (old.length) return [...old, newFilterObj];\n\t\treturn [newFilterObj];\n\t});\n}\n/**\n* Routes a column filter updater through the table's filter change handler.\n*\n* The resolved filters are cleaned before they are emitted: filters for known\n* columns are removed when their filter function says the value should be\n* auto-removed.\n*\n* @example\n* ```ts\n* table_setColumnFilters(table, (old) => old.filter((filter) => filter.id !== 'age'))\n* ```\n*/\nfunction table_setColumnFilters(table, updater) {\n\tconst leafColumnsById = table.getAllLeafColumnsById();\n\tconst updateFn = (old) => {\n\t\treturn functionalUpdate(updater, old).filter((filter) => {\n\t\t\tconst column = leafColumnsById[filter.id];\n\t\t\tif (column) {\n\t\t\t\tif (shouldAutoRemoveFilter(column_getFilterFn(column), filter.value, column)) return false;\n\t\t\t}\n\t\t\treturn true;\n\t\t});\n\t};\n\tsetStateSlice(table, \"columnFilters\", updateFn);\n}\n/**\n* Resets `columnFilters` to the configured initial state or feature default.\n*\n* With no argument, the reset clones `table.initialState.columnFilters` when it\n* exists. Passing `true` ignores initial state and resets to `[]`.\n*\n* @example\n* ```ts\n* table_resetColumnFilters(table)\n* table_resetColumnFilters(table, true)\n* ```\n*/\nfunction table_resetColumnFilters(table, defaultState) {\n\ttable_setColumnFilters(table, defaultState ? [] : cloneState(table.initialState.columnFilters ?? []));\n}\n/**\n* Returns whether a filter value should be removed from filter state.\n*\n* `undefined` always removes: it is the universal \"clear this filter\"\n* sentinel used by `setFilterValue(undefined)` and functional updaters. For\n* any other value, a filter function's `autoRemove` hook is authoritative\n* when provided, so custom filter functions can keep values (such as empty\n* strings) that the default heuristic would drop. Without an `autoRemove`\n* hook, empty strings are removed.\n*\n* @example\n* ```ts\n* const removeFilter = shouldAutoRemoveFilter(filterFn, value, column)\n* ```\n*/\nfunction shouldAutoRemoveFilter(filterFn, value, column) {\n\tif (typeof value === \"undefined\") return true;\n\tif (filterFn?.autoRemove) return !!filterFn.autoRemove(value, column);\n\treturn typeof value === \"string\" && !value;\n}\n\n//#endregion\nexport { column_getAutoFilterFn, column_getCanFilter, column_getFilterFn, column_getFilterIndex, column_getFilterValue, column_getIsFiltered, column_setFilterValue, getDefaultColumnFiltersState, shouldAutoRemoveFilter, table_resetColumnFilters, table_setColumnFilters };","import { assignPrototypeAPIs, assignTableAPIs, makeObjectMap, makeStateUpdater } from \"../../utils.js\";\nimport { column_getAutoFilterFn, column_getCanFilter, column_getFilterFn, column_getFilterIndex, column_getFilterValue, column_getIsFiltered, column_setFilterValue, getDefaultColumnFiltersState, table_resetColumnFilters, table_setColumnFilters } from \"./columnFilteringFeature.utils.js\";\n\n//#region src/features/column-filtering/columnFilteringFeature.ts\n/**\n* Feature that adds per-column filtering state, options, and column/table filter APIs.\n*/\nconst columnFilteringFeature = {\n\tgetInitialState: (initialState) => {\n\t\treturn {\n\t\t\tcolumnFilters: getDefaultColumnFiltersState(),\n\t\t\t...initialState\n\t\t};\n\t},\n\tgetDefaultColumnDef: () => {\n\t\treturn { filterFn: \"auto\" };\n\t},\n\tgetDefaultTableOptions: (table) => {\n\t\treturn {\n\t\t\tonColumnFiltersChange: makeStateUpdater(\"columnFilters\", table),\n\t\t\tfilterFromLeafRows: false,\n\t\t\tmaxLeafRowFilterDepth: 100\n\t\t};\n\t},\n\tassignColumnPrototype: (prototype, table) => {\n\t\tassignPrototypeAPIs(\"columnFilteringFeature\", prototype, table, {\n\t\t\tcolumn_getAutoFilterFn: { fn: (column) => column_getAutoFilterFn(column) },\n\t\t\tcolumn_getFilterFn: { fn: (column) => column_getFilterFn(column) },\n\t\t\tcolumn_getCanFilter: { fn: (column) => column_getCanFilter(column) },\n\t\t\tcolumn_getIsFiltered: { fn: (column) => column_getIsFiltered(column) },\n\t\t\tcolumn_getFilterValue: { fn: (column) => column_getFilterValue(column) },\n\t\t\tcolumn_getFilterIndex: { fn: (column) => column_getFilterIndex(column) },\n\t\t\tcolumn_setFilterValue: { fn: (column, value) => column_setFilterValue(column, value) }\n\t\t});\n\t},\n\tinitRowInstanceData: (row) => {\n\t\trow.columnFilters = makeObjectMap();\n\t\trow.columnFiltersMeta = makeObjectMap();\n\t},\n\tconstructTableAPIs: (table) => {\n\t\tassignTableAPIs(\"columnFilteringFeature\", table, {\n\t\t\ttable_setColumnFilters: { fn: (updater) => table_setColumnFilters(table, updater) },\n\t\t\ttable_resetColumnFilters: { fn: (defaultState) => table_resetColumnFilters(table, defaultState) }\n\t\t});\n\t}\n};\n\n//#endregion\nexport { columnFilteringFeature };","import { callMemoOrStaticFn, cloneState, makeObjectMap, setStateSlice } from \"../../utils.js\";\nimport { getPinnedVisibleLeafColumns } from \"../../core/featureStubs.js\";\n\n//#region src/features/column-ordering/columnOrderingFeature.utils.ts\n/**\n* Creates the default column order state.\n*\n* The feature default is an empty array, meaning leaf columns keep their natural\n* definition order. Reset APIs use this value when `defaultState` is `true`.\n*\n* @example\n* ```ts\n* const order = getDefaultColumnOrderState()\n* ```\n*/\nfunction getDefaultColumnOrderState() {\n\treturn [];\n}\n/**\n* Builds column-id to index records for each visible pinning region.\n*\n* All four regions are built in one pass so a single memo entry serves every\n* `column_getIndex` lookup without per-column scans.\n*\n* @example\n* ```ts\n* const indexes = table_getColumnIndexes(table)\n* ```\n*/\nfunction table_getColumnIndexes(table) {\n\tconst buildIndexes = (columns) => {\n\t\tconst indexes = makeObjectMap();\n\t\tfor (let i = 0; i < columns.length; i++) indexes[columns[i].id] = i;\n\t\treturn indexes;\n\t};\n\treturn {\n\t\tall: buildIndexes(getPinnedVisibleLeafColumns(table)),\n\t\tcenter: buildIndexes(getPinnedVisibleLeafColumns(table, \"center\")),\n\t\tstart: buildIndexes(getPinnedVisibleLeafColumns(table, \"start\")),\n\t\tend: buildIndexes(getPinnedVisibleLeafColumns(table, \"end\"))\n\t};\n}\n/**\n* Finds this column's index within a visible pinning region.\n*\n* Pass `'start'`, `'center'`, or `'end'` to search that region; omit the\n* position to search the full visible leaf column list.\n*\n* @example\n* ```ts\n* const index = column_getIndex(column, 'center')\n* ```\n*/\nfunction column_getIndex(column, position) {\n\treturn callMemoOrStaticFn(column.table, \"getColumnIndexes\", table_getColumnIndexes)[position === \"start\" ? \"start\" : position === \"end\" ? \"end\" : position === \"center\" ? \"center\" : \"all\"][column.id] ?? -1;\n}\n/**\n* Checks whether this column is the first visible column in a pinning region.\n*\n* The same `position` semantics as `column_getIndex` apply.\n*\n* @example\n* ```ts\n* const isFirst = column_getIsFirstColumn(column, 'start')\n* ```\n*/\nfunction column_getIsFirstColumn(column, position) {\n\treturn getPinnedVisibleLeafColumns(column.table, position)[0]?.id === column.id;\n}\n/**\n* Checks whether this column is the last visible column in a pinning region.\n*\n* The same `position` semantics as `column_getIndex` apply.\n*\n* @example\n* ```ts\n* const isLast = column_getIsLastColumn(column, 'end')\n* ```\n*/\nfunction column_getIsLastColumn(column, position) {\n\tconst columns = getPinnedVisibleLeafColumns(column.table, position);\n\treturn columns[columns.length - 1]?.id === column.id;\n}\n/**\n* Routes a column order updater through the table's column-order change handler.\n*\n* The updater may be a next ordered id array or a function of the previous\n* array, matching the instance `table.setColumnOrder` behavior.\n*\n* @example\n* ```ts\n* table_setColumnOrder(table, ['firstName', 'lastName', 'age'])\n* ```\n*/\nfunction table_setColumnOrder(table, updater) {\n\tsetStateSlice(table, \"columnOrder\", updater);\n}\n/**\n* Resets `columnOrder` to the configured initial state or feature default.\n*\n* With no argument, the reset clones `table.initialState.columnOrder` when it\n* exists. Passing `true` ignores initial state and resets to `[]`.\n*\n* @example\n* ```ts\n* table_resetColumnOrder(table)\n* table_resetColumnOrder(table, true)\n* ```\n*/\nfunction table_resetColumnOrder(table, defaultState) {\n\ttable_setColumnOrder(table, defaultState ? [] : cloneState(table.initialState.columnOrder ?? []));\n}\n/**\n* Creates the ordering function used to arrange leaf columns.\n*\n* The returned function applies `state.columnOrder`, preserves unspecified\n* columns in their original order, then delegates to grouping rules.\n*\n* @example\n* ```ts\n* const orderColumnsForTable = table_getOrderColumnsFn(table)\n* ```\n*/\nfunction table_getOrderColumnsFn(table) {\n\tconst columnOrder = table.atoms.columnOrder?.get();\n\treturn (columns) => {\n\t\tlet orderedColumns = [];\n\t\tif (!columnOrder?.length) orderedColumns = columns;\n\t\telse {\n\t\t\tconst remaining = /* @__PURE__ */ new Map();\n\t\t\tfor (let i = 0; i < columns.length; i++) {\n\t\t\t\tconst column = columns[i];\n\t\t\t\tremaining.set(column.id, column);\n\t\t\t}\n\t\t\tfor (let i = 0; i < columnOrder.length; i++) {\n\t\t\t\tconst id = columnOrder[i];\n\t\t\t\tconst column = remaining.get(id);\n\t\t\t\tif (column) {\n\t\t\t\t\torderedColumns.push(column);\n\t\t\t\t\tremaining.delete(id);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (let i = 0; i < columns.length; i++) {\n\t\t\t\tconst column = columns[i];\n\t\t\t\tif (remaining.has(column.id)) orderedColumns.push(column);\n\t\t\t}\n\t\t}\n\t\treturn orderColumns(table, orderedColumns);\n\t};\n}\n/**\n* Applies grouped-column placement rules to an already ordered leaf-column list.\n*\n* `groupedColumnMode: 'remove'` drops grouped columns from the list.\n* `groupedColumnMode: 'reorder'` moves grouped columns to the front in grouping\n* state order.\n*\n* @example\n* ```ts\n* const orderedColumns = orderColumns(table, leafColumns)\n* ```\n*/\nfunction orderColumns(table, leafColumns) {\n\tconst grouping = table.atoms.grouping?.get() ?? [];\n\tconst { groupedColumnMode } = table.options;\n\tif (!grouping.length || !groupedColumnMode) return leafColumns;\n\tconst nonGroupingColumns = leafColumns.filter((col) => !grouping.includes(col.id));\n\tif (groupedColumnMode === \"remove\") return nonGroupingColumns;\n\tconst leafColumnsById = /* @__PURE__ */ new Map();\n\tfor (let i = 0; i < leafColumns.length; i++) {\n\t\tconst col = leafColumns[i];\n\t\tleafColumnsById.set(col.id, col);\n\t}\n\tconst groupingColumns = [];\n\tfor (let i = 0; i < grouping.length; i++) {\n\t\tconst col = leafColumnsById.get(grouping[i]);\n\t\tif (col) groupingColumns.push(col);\n\t}\n\treturn [...groupingColumns, ...nonGroupingColumns];\n}\n\n//#endregion\nexport { column_getIndex, column_getIsFirstColumn, column_getIsLastColumn, getDefaultColumnOrderState, orderColumns, table_getColumnIndexes, table_getOrderColumnsFn, table_resetColumnOrder, table_setColumnOrder };","import { assignPrototypeAPIs, assignTableAPIs, makeStateUpdater } from \"../../utils.js\";\nimport { column_getIndex, column_getIsFirstColumn, column_getIsLastColumn, getDefaultColumnOrderState, table_getColumnIndexes, table_getOrderColumnsFn, table_resetColumnOrder, table_setColumnOrder } from \"./columnOrderingFeature.utils.js\";\n\n//#region src/features/column-ordering/columnOrderingFeature.ts\n/**\n* Feature that adds column ordering state and APIs for ordering leaf columns.\n*/\nconst columnOrderingFeature = {\n\tgetInitialState: (initialState) => {\n\t\treturn {\n\t\t\tcolumnOrder: getDefaultColumnOrderState(),\n\t\t\t...initialState\n\t\t};\n\t},\n\tgetDefaultTableOptions: (table) => {\n\t\treturn { onColumnOrderChange: makeStateUpdater(\"columnOrder\", table) };\n\t},\n\tassignColumnPrototype: (prototype, table) => {\n\t\tassignPrototypeAPIs(\"columnOrderingFeature\", prototype, table, {\n\t\t\tcolumn_getIndex: { fn: (column, position) => column_getIndex(column, position) },\n\t\t\tcolumn_getIsFirstColumn: { fn: (column, position) => column_getIsFirstColumn(column, position) },\n\t\t\tcolumn_getIsLastColumn: { fn: (column, position) => column_getIsLastColumn(column, position) }\n\t\t});\n\t},\n\tconstructTableAPIs: (table) => {\n\t\tassignTableAPIs(\"columnOrderingFeature\", table, {\n\t\t\ttable_getColumnIndexes: {\n\t\t\t\tfn: () => table_getColumnIndexes(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.options.columns,\n\t\t\t\t\ttable.atoms.columnOrder?.get(),\n\t\t\t\t\ttable.atoms.columnPinning?.get(),\n\t\t\t\t\ttable.atoms.columnVisibility?.get(),\n\t\t\t\t\ttable.atoms.grouping?.get(),\n\t\t\t\t\ttable.options.groupedColumnMode\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_setColumnOrder: { fn: (updater) => table_setColumnOrder(table, updater) },\n\t\t\ttable_resetColumnOrder: { fn: (defaultState) => table_resetColumnOrder(table, defaultState) },\n\t\t\ttable_getOrderColumnsFn: {\n\t\t\t\tfn: () => table_getOrderColumnsFn(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.atoms.columnOrder?.get(),\n\t\t\t\t\ttable.atoms.grouping?.get(),\n\t\t\t\t\ttable.options.groupedColumnMode\n\t\t\t\t]\n\t\t\t}\n\t\t});\n\t}\n};\n\n//#endregion\nexport { columnOrderingFeature };","import { callMemoOrStaticFn, cloneState, setStateSlice } from \"../../utils.js\";\nimport { getIsColumnVisible, getVisibleCells, getVisibleCellsByColumnId, getVisibleLeafColumns } from \"../../core/featureStubs.js\";\nimport { buildHeaderGroups } from \"../../core/headers/buildHeaderGroups.js\";\n\n//#region src/features/column-pinning/columnPinningFeature.utils.ts\n/**\n* Creates the default column pinning state.\n*\n* Both pinning regions start empty. Reset APIs use this value when\n* `defaultState` is `true`.\n*\n* @example\n* ```ts\n* const pinning = getDefaultColumnPinningState()\n* ```\n*/\nfunction getDefaultColumnPinningState() {\n\treturn {\n\t\tstart: [],\n\t\tend: []\n\t};\n}\n/**\n* Moves this column's leaf column ids into a pinning region.\n*\n* Pinning a group column pins all of its leaves. The leaf ids are first removed\n* from both regions, then appended to the requested `'start'` or `'end'`\n* region. Passing `false` unpins them back to the center.\n*\n* `start` and `end` are logical positions. In LTR languages/layouts, `start`\n* usually corresponds to left and `end` to right. In RTL languages/layouts,\n* `start` usually corresponds to right and `end` to left.\n*\n* @example\n* ```ts\n* column_pin(column, 'start')\n* ```\n*/\nfunction column_pin(column, position) {\n\tconst leafColumns = column.getLeafColumns();\n\tconst columnIds = [];\n\tfor (let i = 0; i < leafColumns.length; i++) {\n\t\tconst id = leafColumns[i].id;\n\t\tif (id) columnIds.push(id);\n\t}\n\ttable_setColumnPinning(column.table, (old) => {\n\t\tif (position === \"end\") return {\n\t\t\tstart: old.start.filter((d) => !columnIds.includes(d)),\n\t\t\tend: [...old.end.filter((d) => !columnIds.includes(d)), ...columnIds]\n\t\t};\n\t\tif (position === \"start\") return {\n\t\t\tstart: [...old.start.filter((d) => !columnIds.includes(d)), ...columnIds],\n\t\t\tend: old.end.filter((d) => !columnIds.includes(d))\n\t\t};\n\t\treturn {\n\t\t\tstart: old.start.filter((d) => !columnIds.includes(d)),\n\t\t\tend: old.end.filter((d) => !columnIds.includes(d))\n\t\t};\n\t});\n}\n/**\n* Checks whether this column or any of its leaf columns can be pinned.\n*\n* Column-level `enablePinning` and table `enableColumnPinning` both default to\n* `true`; at least one leaf column must allow pinning.\n*\n* @example\n* ```ts\n* const canPin = column_getCanPin(column)\n* ```\n*/\nfunction column_getCanPin(column) {\n\treturn column.getLeafColumns().some((leafColumn) => (leafColumn.columnDef.enablePinning ?? true) && (column.table.options.enableColumnPinning ?? true));\n}\n/**\n* Reads this column's current pinning region.\n*\n* Group columns report `'start'` or `'end'` when any leaf column is pinned in\n* that region. Unpinned columns return `false`.\n*\n* `start` and `end` are logical positions. In LTR languages/layouts, `start`\n* usually corresponds to left and `end` to right. In RTL languages/layouts,\n* `start` usually corresponds to right and `end` to left.\n*\n* @example\n* ```ts\n* const position = column_getIsPinned(column)\n* ```\n*/\nfunction column_getIsPinned(column) {\n\tconst leafColumns = column.getLeafColumns();\n\tconst { start, end } = column.table.atoms.columnPinning?.get() ?? getDefaultColumnPinningState();\n\tfor (let i = 0; i < leafColumns.length; i++) if (start.includes(leafColumns[i].id)) return \"start\";\n\tfor (let i = 0; i < leafColumns.length; i++) if (end.includes(leafColumns[i].id)) return \"end\";\n\treturn false;\n}\n/**\n* Finds this column's index within its pinned region.\n*\n* Unpinned columns return `0`; pinned columns return their position in\n* `state.columnPinning.start` or `state.columnPinning.end`.\n*\n* @example\n* ```ts\n* const index = column_getPinnedIndex(column)\n* ```\n*/\nfunction column_getPinnedIndex(column) {\n\tconst position = column_getIsPinned(column);\n\treturn position ? column.table.atoms.columnPinning?.get()?.[position].indexOf(column.id) ?? -1 : 0;\n}\n/**\n* Collects visible cells whose columns are not pinned start or end.\n*\n* The result preserves the row's visible-cell order for center columns.\n*\n* @example\n* ```ts\n* const centerCells = row_getCenterVisibleCells(row)\n* ```\n*/\nfunction row_getCenterVisibleCells(row) {\n\tconst allCells = getVisibleCells(row);\n\tconst { start, end } = row.table.atoms.columnPinning?.get() ?? getDefaultColumnPinningState();\n\tif (!start.length && !end.length) return allCells;\n\tconst startAndEnd = [...start, ...end];\n\treturn allCells.filter((d) => !startAndEnd.includes(d.column.id));\n}\n/**\n* Collects visible cells for columns pinned to the start region.\n*\n* Cells are returned in `state.columnPinning.start` order and are marked with\n* `cell.position = 'start'`.\n*\n* @example\n* ```ts\n* const startCells = row_getStartVisibleCells(row)\n* ```\n*/\nfunction row_getStartVisibleCells(row) {\n\tconst { start } = row.table.atoms.columnPinning?.get() ?? getDefaultColumnPinningState();\n\tif (!start.length) return [];\n\tconst allVisibleCells = getVisibleCellsByColumnId(row);\n\tconst cells = [];\n\tfor (let i = 0; i < start.length; i++) {\n\t\tconst cell = allVisibleCells[start[i]];\n\t\tif (cell) {\n\t\t\tcell.position = \"start\";\n\t\t\tcells.push(cell);\n\t\t}\n\t}\n\treturn cells;\n}\n/**\n* Collects visible cells for columns pinned to the end region.\n*\n* Cells are returned in `state.columnPinning.end` order and are marked with\n* `cell.position = 'end'`.\n*\n* @example\n* ```ts\n* const endCells = row_getEndVisibleCells(row)\n* ```\n*/\nfunction row_getEndVisibleCells(row) {\n\tconst { end } = row.table.atoms.columnPinning?.get() ?? getDefaultColumnPinningState();\n\tif (!end.length) return [];\n\tconst allVisibleCells = getVisibleCellsByColumnId(row);\n\tconst cells = [];\n\tfor (let i = 0; i < end.length; i++) {\n\t\tconst cell = allVisibleCells[end[i]];\n\t\tif (cell) {\n\t\t\tcell.position = \"end\";\n\t\t\tcells.push(cell);\n\t\t}\n\t}\n\treturn cells;\n}\n/**\n* Routes a column pinning updater through the table's pinning change handler.\n*\n* The updater may be a next `{ start, end }` state or a function of the\n* previous state, matching the instance `table.setColumnPinning` behavior.\n*\n* @example\n* ```ts\n* table_setColumnPinning(table, (old) => ({ ...old, start: ['select'] }))\n* ```\n*/\nfunction table_setColumnPinning(table, updater) {\n\tsetStateSlice(table, \"columnPinning\", updater);\n}\n/**\n* Resets `columnPinning` to the configured initial state or feature default.\n*\n* With no argument, the reset clones `table.initialState.columnPinning` when it\n* exists. Passing `true` ignores initial state and resets to empty start/end\n* arrays.\n*\n* @example\n* ```ts\n* table_resetColumnPinning(table)\n* table_resetColumnPinning(table, true)\n* ```\n*/\nfunction table_resetColumnPinning(table, defaultState) {\n\ttable_setColumnPinning(table, defaultState ? getDefaultColumnPinningState() : cloneState(table.initialState.columnPinning ?? getDefaultColumnPinningState()));\n}\n/**\n* Checks whether any columns are pinned.\n*\n* Omit `position` to check both sides, or pass `'start'`/`'end'` to inspect a\n* single pinning region.\n*\n* @example\n* ```ts\n* const hasPinnedColumns = table_getIsSomeColumnsPinned(table)\n* ```\n*/\nfunction table_getIsSomeColumnsPinned(table, position) {\n\tconst pinningState = table.atoms.columnPinning?.get();\n\tif (!position) return Boolean(pinningState?.start.length || pinningState?.end.length);\n\treturn Boolean(pinningState?.[position].length);\n}\n/**\n* Builds header groups for visible columns pinned to the start region.\n*\n* The leaf columns are read in `state.columnPinning.start` order and then passed\n* through the same header-group builder as the unpinned table.\n*\n* @example\n* ```ts\n* const headerGroups = table_getStartHeaderGroups(table)\n* ```\n*/\nfunction table_getStartHeaderGroups(table) {\n\tconst allColumns = table.getAllColumns();\n\tconst leafColumnsById = table.getAllLeafColumnsById();\n\tconst { start } = table.atoms.columnPinning?.get() ?? getDefaultColumnPinningState();\n\tconst orderedLeafColumns = [];\n\tfor (let i = 0; i < start.length; i++) {\n\t\tconst column = leafColumnsById[start[i]];\n\t\tif (column && getIsColumnVisible(column)) orderedLeafColumns.push(column);\n\t}\n\treturn buildHeaderGroups(allColumns, orderedLeafColumns, table, \"start\");\n}\n/**\n* Builds header groups for visible columns pinned to the end region.\n*\n* The leaf columns are read in `state.columnPinning.end` order and then\n* passed through the same header-group builder as the unpinned table.\n*\n* @example\n* ```ts\n* const headerGroups = table_getEndHeaderGroups(table)\n* ```\n*/\nfunction table_getEndHeaderGroups(table) {\n\tconst allColumns = table.getAllColumns();\n\tconst leafColumnsById = table.getAllLeafColumnsById();\n\tconst { end } = table.atoms.columnPinning?.get() ?? getDefaultColumnPinningState();\n\tconst orderedLeafColumns = [];\n\tfor (let i = 0; i < end.length; i++) {\n\t\tconst column = leafColumnsById[end[i]];\n\t\tif (column && getIsColumnVisible(column)) orderedLeafColumns.push(column);\n\t}\n\treturn buildHeaderGroups(allColumns, orderedLeafColumns, table, \"end\");\n}\n/**\n* Builds header groups for visible columns that are not pinned.\n*\n* Start- and end-pinned column ids are removed from the visible leaf column\n* list before header groups are built for the center region.\n*\n* @example\n* ```ts\n* const headerGroups = table_getCenterHeaderGroups(table)\n* ```\n*/\nfunction table_getCenterHeaderGroups(table) {\n\tconst allColumns = table.getAllColumns();\n\tlet leafColumns = getVisibleLeafColumns(table);\n\tconst { start, end } = table.atoms.columnPinning?.get() ?? getDefaultColumnPinningState();\n\tif (start.length || end.length) {\n\t\tconst startAndEnd = [...start, ...end];\n\t\tleafColumns = leafColumns.filter((column) => !startAndEnd.includes(column.id));\n\t}\n\treturn buildHeaderGroups(allColumns, leafColumns, table, \"center\");\n}\n/**\n* Builds footer groups for the start pinned region.\n*\n* Footer groups reuse the start header groups in reverse order.\n*\n* @example\n* ```ts\n* const footerGroups = table_getStartFooterGroups(table)\n* ```\n*/\nfunction table_getStartFooterGroups(table) {\n\treturn [...callMemoOrStaticFn(table, \"getStartHeaderGroups\", table_getStartHeaderGroups)].reverse();\n}\n/**\n* Builds footer groups for the end pinned region.\n*\n* Footer groups reuse the end header groups in reverse order.\n*\n* @example\n* ```ts\n* const footerGroups = table_getEndFooterGroups(table)\n* ```\n*/\nfunction table_getEndFooterGroups(table) {\n\treturn [...callMemoOrStaticFn(table, \"getEndHeaderGroups\", table_getEndHeaderGroups)].reverse();\n}\n/**\n* Builds footer groups for the center, unpinned region.\n*\n* Footer groups reuse the center header groups in reverse order.\n*\n* @example\n* ```ts\n* const footerGroups = table_getCenterFooterGroups(table)\n* ```\n*/\nfunction table_getCenterFooterGroups(table) {\n\treturn [...callMemoOrStaticFn(table, \"getCenterHeaderGroups\", table_getCenterHeaderGroups)].reverse();\n}\n/**\n* Flattens every header from the start pinned header groups.\n*\n* Parent headers and placeholder headers are included.\n*\n* @example\n* ```ts\n* const headers = table_getStartFlatHeaders(table)\n* ```\n*/\nfunction table_getStartFlatHeaders(table) {\n\tconst leftHeaderGroups = callMemoOrStaticFn(table, \"getStartHeaderGroups\", table_getStartHeaderGroups);\n\tconst result = [];\n\tfor (let i = 0; i < leftHeaderGroups.length; i++) {\n\t\tconst headers = leftHeaderGroups[i].headers;\n\t\tfor (let j = 0; j < headers.length; j++) result.push(headers[j]);\n\t}\n\treturn result;\n}\n/**\n* Flattens every header from the end pinned header groups.\n*\n* Parent headers and placeholder headers are included.\n*\n* @example\n* ```ts\n* const headers = table_getEndFlatHeaders(table)\n* ```\n*/\nfunction table_getEndFlatHeaders(table) {\n\tconst rightHeaderGroups = callMemoOrStaticFn(table, \"getEndHeaderGroups\", table_getEndHeaderGroups);\n\tconst result = [];\n\tfor (let i = 0; i < rightHeaderGroups.length; i++) {\n\t\tconst headers = rightHeaderGroups[i].headers;\n\t\tfor (let j = 0; j < headers.length; j++) result.push(headers[j]);\n\t}\n\treturn result;\n}\n/**\n* Flattens every header from the center header groups.\n*\n* Parent headers and placeholder headers are included.\n*\n* @example\n* ```ts\n* const headers = table_getCenterFlatHeaders(table)\n* ```\n*/\nfunction table_getCenterFlatHeaders(table) {\n\tconst centerHeaderGroups = callMemoOrStaticFn(table, \"getCenterHeaderGroups\", table_getCenterHeaderGroups);\n\tconst result = [];\n\tfor (let i = 0; i < centerHeaderGroups.length; i++) {\n\t\tconst headers = centerHeaderGroups[i].headers;\n\t\tfor (let j = 0; j < headers.length; j++) result.push(headers[j]);\n\t}\n\treturn result;\n}\n/**\n* Collects leaf headers for the start pinned region.\n*\n* Parent headers are filtered out from the start flat header list.\n*\n* @example\n* ```ts\n* const headers = table_getStartLeafHeaders(table)\n* ```\n*/\nfunction table_getStartLeafHeaders(table) {\n\treturn callMemoOrStaticFn(table, \"getStartFlatHeaders\", table_getStartFlatHeaders).filter((header) => !header.subHeaders.length);\n}\n/**\n* Collects leaf headers for the end pinned region.\n*\n* Parent headers are filtered out from the end flat header list.\n*\n* @example\n* ```ts\n* const headers = table_getEndLeafHeaders(table)\n* ```\n*/\nfunction table_getEndLeafHeaders(table) {\n\treturn callMemoOrStaticFn(table, \"getEndFlatHeaders\", table_getEndFlatHeaders).filter((header) => !header.subHeaders.length);\n}\n/**\n* Collects leaf headers for the center, unpinned region.\n*\n* Parent headers are filtered out from the center flat header list.\n*\n* @example\n* ```ts\n* const headers = table_getCenterLeafHeaders(table)\n* ```\n*/\nfunction table_getCenterLeafHeaders(table) {\n\treturn callMemoOrStaticFn(table, \"getCenterFlatHeaders\", table_getCenterFlatHeaders).filter((header) => !header.subHeaders.length);\n}\n/**\n* Resolves leaf columns pinned to the start region.\n*\n* The result follows `state.columnPinning.start` order and skips stale ids that\n* no longer correspond to a leaf column.\n*\n* @example\n* ```ts\n* const columns = table_getStartLeafColumns(table)\n* ```\n*/\nfunction table_getStartLeafColumns(table) {\n\tconst { start } = table.atoms.columnPinning?.get() ?? getDefaultColumnPinningState();\n\tconst leafColumnsById = table.getAllLeafColumnsById();\n\tconst result = [];\n\tfor (let i = 0; i < start.length; i++) {\n\t\tconst column = leafColumnsById[start[i]];\n\t\tif (column) result.push(column);\n\t}\n\treturn result;\n}\n/**\n* Resolves leaf columns pinned to the end region.\n*\n* The result follows `state.columnPinning.end` order and skips stale ids that\n* no longer correspond to a leaf column.\n*\n* @example\n* ```ts\n* const columns = table_getEndLeafColumns(table)\n* ```\n*/\nfunction table_getEndLeafColumns(table) {\n\tconst { end } = table.atoms.columnPinning?.get() ?? getDefaultColumnPinningState();\n\tconst leafColumnsById = table.getAllLeafColumnsById();\n\tconst result = [];\n\tfor (let i = 0; i < end.length; i++) {\n\t\tconst column = leafColumnsById[end[i]];\n\t\tif (column) result.push(column);\n\t}\n\treturn result;\n}\n/**\n* Resolves leaf columns that are not pinned to either logical side.\n*\n* Start- and end-pinned ids are removed from `table.getAllLeafColumns()`.\n*\n* @example\n* ```ts\n* const columns = table_getCenterLeafColumns(table)\n* ```\n*/\nfunction table_getCenterLeafColumns(table) {\n\tconst { start, end } = table.atoms.columnPinning?.get() ?? getDefaultColumnPinningState();\n\tif (!start.length && !end.length) return table.getAllLeafColumns();\n\tconst startAndEnd = [...start, ...end];\n\treturn table.getAllLeafColumns().filter((d) => !startAndEnd.includes(d.id));\n}\n/**\n* Resolves leaf columns for a requested pinning region.\n*\n* Pass `'start'`, `'center'`, or `'end'` for a partition, or pass `false` to\n* read all leaf columns without partitioning.\n*\n* @example\n* ```ts\n* const columns = table_getPinnedLeafColumns(table, 'center')\n* ```\n*/\nfunction table_getPinnedLeafColumns(table, position) {\n\treturn !position ? table.getAllLeafColumns() : position === \"start\" ? callMemoOrStaticFn(table, \"getStartLeafColumns\", table_getStartLeafColumns) : position === \"end\" ? callMemoOrStaticFn(table, \"getEndLeafColumns\", table_getEndLeafColumns) : callMemoOrStaticFn(table, \"getCenterLeafColumns\", table_getCenterLeafColumns);\n}\n/**\n* Resolves visible leaf columns pinned to the start region.\n*\n* Hidden pinned columns are filtered out after the start pin order is applied.\n*\n* @example\n* ```ts\n* const columns = table_getStartVisibleLeafColumns(table)\n* ```\n*/\nfunction table_getStartVisibleLeafColumns(table) {\n\treturn callMemoOrStaticFn(table, \"getStartLeafColumns\", table_getStartLeafColumns).filter((column) => getIsColumnVisible(column));\n}\n/**\n* Resolves visible leaf columns pinned to the end region.\n*\n* Hidden pinned columns are filtered out after the end pin order is applied.\n*\n* @example\n* ```ts\n* const columns = table_getEndVisibleLeafColumns(table)\n* ```\n*/\nfunction table_getEndVisibleLeafColumns(table) {\n\treturn callMemoOrStaticFn(table, \"getEndLeafColumns\", table_getEndLeafColumns).filter((column) => getIsColumnVisible(column));\n}\n/**\n* Resolves visible leaf columns that are not pinned.\n*\n* This is the center partition used by layouts that render pinned columns\n* separately from the scrollable middle region.\n*\n* @example\n* ```ts\n* const columns = table_getCenterVisibleLeafColumns(table)\n* ```\n*/\nfunction table_getCenterVisibleLeafColumns(table) {\n\treturn callMemoOrStaticFn(table, \"getCenterLeafColumns\", table_getCenterLeafColumns).filter((column) => getIsColumnVisible(column));\n}\n/**\n* Resolves visible leaf columns for a requested pinning region.\n*\n* Omit `position` to get all visible leaf columns, or pass `'start'`, `'center'`,\n* or `'end'` to get one partition.\n*\n* @example\n* ```ts\n* const columns = table_getPinnedVisibleLeafColumns(table, 'start')\n* ```\n*/\nfunction table_getPinnedVisibleLeafColumns(table, position) {\n\treturn !position ? getVisibleLeafColumns(table) : position === \"start\" ? callMemoOrStaticFn(table, \"getStartVisibleLeafColumns\", table_getStartVisibleLeafColumns) : position === \"end\" ? callMemoOrStaticFn(table, \"getEndVisibleLeafColumns\", table_getEndVisibleLeafColumns) : callMemoOrStaticFn(table, \"getCenterVisibleLeafColumns\", table_getCenterVisibleLeafColumns);\n}\n\n//#endregion\nexport { column_getCanPin, column_getIsPinned, column_getPinnedIndex, column_pin, getDefaultColumnPinningState, row_getCenterVisibleCells, row_getEndVisibleCells, row_getStartVisibleCells, table_getCenterFlatHeaders, table_getCenterFooterGroups, table_getCenterHeaderGroups, table_getCenterLeafColumns, table_getCenterLeafHeaders, table_getCenterVisibleLeafColumns, table_getEndFlatHeaders, table_getEndFooterGroups, table_getEndHeaderGroups, table_getEndLeafColumns, table_getEndLeafHeaders, table_getEndVisibleLeafColumns, table_getIsSomeColumnsPinned, table_getPinnedLeafColumns, table_getPinnedVisibleLeafColumns, table_getStartFlatHeaders, table_getStartFooterGroups, table_getStartHeaderGroups, table_getStartLeafColumns, table_getStartLeafHeaders, table_getStartVisibleLeafColumns, table_resetColumnPinning, table_setColumnPinning };","import { makeObjectMap } from \"../../utils.js\";\n\n//#region src/features/column-pinning/orderByColumnPinning.ts\n/**\n* Display order for column pinning, shared through the `orderByColumnPinning`\n* feature stub so that the core headers, row visible cells, and cell selection\n* don't bundle it when the column pinning feature is not registered.\n*\n* Internal: not exported from any package entry point.\n*/\n/**\n* Orders items that each belong to a leaf column, such as visible leaf\n* columns or a row's visible cells: start-pinned items in pinning order, then\n* unpinned items in their given order, then end-pinned items in pinning order.\n* Pinned ids that match no item are skipped.\n*\n* `getItemsByColumnId` can return an existing lookup of the same items, which\n* is only read when something is pinned.\n*/\nfunction orderByColumnPinning(table, items, getColumnId, getItemsByColumnId) {\n\tconst columnPinning = table.atoms.columnPinning?.get();\n\tif (!columnPinning || !columnPinning.start.length && !columnPinning.end.length) return items;\n\tconst { start, end } = columnPinning;\n\tlet itemsByColumnId = getItemsByColumnId?.();\n\tif (!itemsByColumnId) {\n\t\titemsByColumnId = makeObjectMap();\n\t\tfor (let i = 0; i < items.length; i++) itemsByColumnId[getColumnId(items[i])] = items[i];\n\t}\n\tconst ordered = [];\n\tfor (let i = 0; i < start.length; i++) {\n\t\tconst item = itemsByColumnId[start[i]];\n\t\tif (item) ordered.push(item);\n\t}\n\tfor (let i = 0; i < items.length; i++) {\n\t\tconst columnId = getColumnId(items[i]);\n\t\tif (!start.includes(columnId) && !end.includes(columnId)) ordered.push(items[i]);\n\t}\n\tfor (let i = 0; i < end.length; i++) {\n\t\tconst item = itemsByColumnId[end[i]];\n\t\tif (item) ordered.push(item);\n\t}\n\treturn ordered;\n}\n\n//#endregion\nexport { orderByColumnPinning };","import { assignPrototypeAPIs, assignTableAPIs, callMemoOrStaticFn, makeStateUpdater } from \"../../utils.js\";\nimport { getVisibleLeafColumns } from \"../../core/featureStubs.js\";\nimport { column_getCanPin, column_getIsPinned, column_getPinnedIndex, column_pin, getDefaultColumnPinningState, row_getCenterVisibleCells, row_getEndVisibleCells, row_getStartVisibleCells, table_getCenterFlatHeaders, table_getCenterFooterGroups, table_getCenterHeaderGroups, table_getCenterLeafColumns, table_getCenterLeafHeaders, table_getCenterVisibleLeafColumns, table_getEndFlatHeaders, table_getEndFooterGroups, table_getEndHeaderGroups, table_getEndLeafColumns, table_getEndLeafHeaders, table_getEndVisibleLeafColumns, table_getIsSomeColumnsPinned, table_getPinnedLeafColumns, table_getPinnedVisibleLeafColumns, table_getStartFlatHeaders, table_getStartFooterGroups, table_getStartHeaderGroups, table_getStartLeafColumns, table_getStartLeafHeaders, table_getStartVisibleLeafColumns, table_resetColumnPinning, table_setColumnPinning } from \"./columnPinningFeature.utils.js\";\nimport { orderByColumnPinning } from \"./orderByColumnPinning.js\";\n\n//#region src/features/column-pinning/columnPinningFeature.ts\n/**\n* Feature that adds column pinning state and APIs for logical start, center,\n* and end regions.\n*\n* In LTR languages/layouts, start usually corresponds to left and end to\n* right. In RTL languages/layouts, start usually corresponds to right and end\n* to left.\n*/\nconst columnPinningFeature = {\n\tgetInitialState: (initialState) => {\n\t\treturn {\n\t\t\tcolumnPinning: {\n\t\t\t\t...getDefaultColumnPinningState(),\n\t\t\t\t...initialState.columnPinning\n\t\t\t},\n\t\t\t...initialState\n\t\t};\n\t},\n\tgetDefaultTableOptions: (table) => {\n\t\treturn { onColumnPinningChange: makeStateUpdater(\"columnPinning\", table) };\n\t},\n\tassignColumnPrototype: (prototype, table) => {\n\t\tassignPrototypeAPIs(\"columnPinningFeature\", prototype, table, {\n\t\t\tcolumn_pin: { fn: (column, position) => column_pin(column, position) },\n\t\t\tcolumn_getCanPin: { fn: (column) => column_getCanPin(column) },\n\t\t\tcolumn_getPinnedIndex: { fn: (column) => column_getPinnedIndex(column) },\n\t\t\tcolumn_getIsPinned: { fn: (column) => column_getIsPinned(column) }\n\t\t});\n\t},\n\tassignRowPrototype: (prototype, table) => {\n\t\tassignPrototypeAPIs(\"columnPinningFeature\", prototype, table, {\n\t\t\trow_getCenterVisibleCells: {\n\t\t\t\tfn: (row) => row_getCenterVisibleCells(row),\n\t\t\t\tmemoDeps: (row) => [\n\t\t\t\t\trow.getAllCells(),\n\t\t\t\t\trow.table.atoms.columnPinning?.get(),\n\t\t\t\t\trow.table.atoms.columnVisibility?.get()\n\t\t\t\t]\n\t\t\t},\n\t\t\trow_getStartVisibleCells: {\n\t\t\t\tfn: (row) => row_getStartVisibleCells(row),\n\t\t\t\tmemoDeps: (row) => [\n\t\t\t\t\trow.getAllCells(),\n\t\t\t\t\trow.table.atoms.columnPinning?.get()?.start,\n\t\t\t\t\trow.table.atoms.columnVisibility?.get()\n\t\t\t\t]\n\t\t\t},\n\t\t\trow_getEndVisibleCells: {\n\t\t\t\tfn: (row) => row_getEndVisibleCells(row),\n\t\t\t\tmemoDeps: (row) => [\n\t\t\t\t\trow.getAllCells(),\n\t\t\t\t\trow.table.atoms.columnPinning?.get()?.end,\n\t\t\t\t\trow.table.atoms.columnVisibility?.get()\n\t\t\t\t]\n\t\t\t}\n\t\t});\n\t},\n\tconstructTableAPIs: (table) => {\n\t\tassignTableAPIs(\"columnPinningFeature\", table, {\n\t\t\ttable_setColumnPinning: { fn: (updater) => table_setColumnPinning(table, updater) },\n\t\t\ttable_resetColumnPinning: { fn: (defaultState) => table_resetColumnPinning(table, defaultState) },\n\t\t\ttable_getIsSomeColumnsPinned: { fn: (position) => table_getIsSomeColumnsPinned(table, position) },\n\t\t\ttable__orderByColumnPinning: { fn: (items, getColumnId, getItemsByColumnId) => orderByColumnPinning(table, items, getColumnId, getItemsByColumnId) },\n\t\t\ttable_getStartHeaderGroups: {\n\t\t\t\tfn: () => table_getStartHeaderGroups(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.getAllColumns(),\n\t\t\t\t\tgetVisibleLeafColumns(table),\n\t\t\t\t\ttable.atoms.columnPinning?.get()?.start,\n\t\t\t\t\ttable.atoms.columnOrder?.get()\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_getCenterHeaderGroups: {\n\t\t\t\tfn: () => table_getCenterHeaderGroups(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.getAllColumns(),\n\t\t\t\t\tgetVisibleLeafColumns(table),\n\t\t\t\t\ttable.atoms.columnPinning?.get(),\n\t\t\t\t\ttable.atoms.columnOrder?.get()\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_getEndHeaderGroups: {\n\t\t\t\tfn: () => table_getEndHeaderGroups(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.getAllColumns(),\n\t\t\t\t\tgetVisibleLeafColumns(table),\n\t\t\t\t\ttable.atoms.columnPinning?.get()?.end,\n\t\t\t\t\ttable.atoms.columnOrder?.get()\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_getStartFooterGroups: {\n\t\t\t\tfn: () => table_getStartFooterGroups(table),\n\t\t\t\tmemoDeps: () => [callMemoOrStaticFn(table, \"getStartHeaderGroups\", table_getStartHeaderGroups)]\n\t\t\t},\n\t\t\ttable_getCenterFooterGroups: {\n\t\t\t\tfn: () => table_getCenterFooterGroups(table),\n\t\t\t\tmemoDeps: () => [callMemoOrStaticFn(table, \"getCenterHeaderGroups\", table_getCenterHeaderGroups)]\n\t\t\t},\n\t\t\ttable_getEndFooterGroups: {\n\t\t\t\tfn: () => table_getEndFooterGroups(table),\n\t\t\t\tmemoDeps: () => [callMemoOrStaticFn(table, \"getEndHeaderGroups\", table_getEndHeaderGroups)]\n\t\t\t},\n\t\t\ttable_getStartFlatHeaders: {\n\t\t\t\tfn: () => table_getStartFlatHeaders(table),\n\t\t\t\tmemoDeps: () => [callMemoOrStaticFn(table, \"getStartHeaderGroups\", table_getStartHeaderGroups)]\n\t\t\t},\n\t\t\ttable_getEndFlatHeaders: {\n\t\t\t\tfn: () => table_getEndFlatHeaders(table),\n\t\t\t\tmemoDeps: () => [callMemoOrStaticFn(table, \"getEndHeaderGroups\", table_getEndHeaderGroups)]\n\t\t\t},\n\t\t\ttable_getCenterFlatHeaders: {\n\t\t\t\tfn: () => table_getCenterFlatHeaders(table),\n\t\t\t\tmemoDeps: () => [callMemoOrStaticFn(table, \"getCenterHeaderGroups\", table_getCenterHeaderGroups)]\n\t\t\t},\n\t\t\ttable_getStartLeafHeaders: {\n\t\t\t\tfn: () => table_getStartLeafHeaders(table),\n\t\t\t\tmemoDeps: () => [callMemoOrStaticFn(table, \"getStartHeaderGroups\", table_getStartHeaderGroups)]\n\t\t\t},\n\t\t\ttable_getEndLeafHeaders: {\n\t\t\t\tfn: () => table_getEndLeafHeaders(table),\n\t\t\t\tmemoDeps: () => [callMemoOrStaticFn(table, \"getEndHeaderGroups\", table_getEndHeaderGroups)]\n\t\t\t},\n\t\t\ttable_getCenterLeafHeaders: {\n\t\t\t\tfn: () => table_getCenterLeafHeaders(table),\n\t\t\t\tmemoDeps: () => [callMemoOrStaticFn(table, \"getCenterHeaderGroups\", table_getCenterHeaderGroups)]\n\t\t\t},\n\t\t\ttable_getStartLeafColumns: {\n\t\t\t\tfn: () => table_getStartLeafColumns(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.options.columns,\n\t\t\t\t\ttable.atoms.columnPinning?.get(),\n\t\t\t\t\ttable.atoms.columnOrder?.get(),\n\t\t\t\t\ttable.atoms.grouping?.get(),\n\t\t\t\t\ttable.options.groupedColumnMode\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_getEndLeafColumns: {\n\t\t\t\tfn: () => table_getEndLeafColumns(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.options.columns,\n\t\t\t\t\ttable.atoms.columnPinning?.get(),\n\t\t\t\t\ttable.atoms.columnOrder?.get(),\n\t\t\t\t\ttable.atoms.grouping?.get(),\n\t\t\t\t\ttable.options.groupedColumnMode\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_getCenterLeafColumns: {\n\t\t\t\tfn: () => table_getCenterLeafColumns(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.options.columns,\n\t\t\t\t\ttable.atoms.columnPinning?.get(),\n\t\t\t\t\ttable.atoms.columnOrder?.get(),\n\t\t\t\t\ttable.atoms.grouping?.get(),\n\t\t\t\t\ttable.options.groupedColumnMode\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_getPinnedLeafColumns: { fn: (position) => table_getPinnedLeafColumns(table, position) },\n\t\t\ttable_getStartVisibleLeafColumns: {\n\t\t\t\tfn: () => table_getStartVisibleLeafColumns(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.options.columns,\n\t\t\t\t\ttable.atoms.columnPinning?.get(),\n\t\t\t\t\ttable.atoms.columnVisibility?.get(),\n\t\t\t\t\ttable.atoms.columnOrder?.get(),\n\t\t\t\t\ttable.atoms.grouping?.get(),\n\t\t\t\t\ttable.options.groupedColumnMode\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_getCenterVisibleLeafColumns: {\n\t\t\t\tfn: () => table_getCenterVisibleLeafColumns(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.options.columns,\n\t\t\t\t\ttable.atoms.columnPinning?.get(),\n\t\t\t\t\ttable.atoms.columnVisibility?.get(),\n\t\t\t\t\ttable.atoms.columnOrder?.get(),\n\t\t\t\t\ttable.atoms.grouping?.get(),\n\t\t\t\t\ttable.options.groupedColumnMode\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_getEndVisibleLeafColumns: {\n\t\t\t\tfn: () => table_getEndVisibleLeafColumns(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.options.columns,\n\t\t\t\t\ttable.atoms.columnPinning?.get(),\n\t\t\t\t\ttable.atoms.columnVisibility?.get(),\n\t\t\t\t\ttable.atoms.columnOrder?.get(),\n\t\t\t\t\ttable.atoms.grouping?.get(),\n\t\t\t\t\ttable.options.groupedColumnMode\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_getPinnedVisibleLeafColumns: { fn: (position) => table_getPinnedVisibleLeafColumns(table, position) }\n\t\t});\n\t}\n};\n\n//#endregion\nexport { columnPinningFeature };","import { callMemoOrStaticFn, cloneState, hasOwn, makeObjectMap } from \"../../utils.js\";\nimport { getPinnedVisibleLeafColumns } from \"../../core/featureStubs.js\";\n\n//#region src/features/column-sizing/columnSizingFeature.utils.ts\n/**\n* Creates the default committed column sizing state.\n*\n* The feature default is an empty map, so columns fall back to their column def\n* size or the built-in sizing defaults.\n*\n* @example\n* ```ts\n* const sizing = getDefaultColumnSizingState()\n* ```\n*/\nfunction getDefaultColumnSizingState() {\n\treturn makeObjectMap();\n}\n/**\n* Creates the built-in sizing defaults for column definitions.\n*\n* Columns default to `size: 150`, `minSize: 20`, and\n* `maxSize: Number.MAX_SAFE_INTEGER` unless overridden by column definitions or\n* table defaults.\n*\n* @example\n* ```ts\n* const defaults = getDefaultColumnSizingColumnDef()\n* ```\n*/\nfunction getDefaultColumnSizingColumnDef() {\n\treturn {\n\t\tsize: 150,\n\t\tminSize: 20,\n\t\tmaxSize: Number.MAX_SAFE_INTEGER\n\t};\n}\n/**\n* Resolves a column's current pixel size.\n*\n* Committed `state.columnSizing[column.id]` wins over `columnDef.size`, then the\n* built-in default size. The result is clamped between min and max size.\n*\n* @example\n* ```ts\n* const width = column_getSize(column)\n* ```\n*/\nfunction column_getSize(column) {\n\tconst defaultSizes = getDefaultColumnSizingColumnDef();\n\tconst columnSizing = column.table.atoms.columnSizing?.get();\n\tconst columnSize = columnSizing && hasOwn(columnSizing, column.id) ? columnSizing[column.id] : void 0;\n\treturn Math.min(Math.max(column.columnDef.minSize ?? defaultSizes.minSize, columnSize ?? column.columnDef.size ?? defaultSizes.size), column.columnDef.maxSize ?? defaultSizes.maxSize);\n}\nfunction buildColumnOffsets(columns) {\n\tconst starts = makeObjectMap();\n\tconst afters = makeObjectMap();\n\tconst sizes = new Array(columns.length);\n\tlet start = 0;\n\tfor (let i = 0; i < columns.length; i++) {\n\t\tconst column = columns[i];\n\t\tconst size = callMemoOrStaticFn(column, \"getSize\", column_getSize);\n\t\tsizes[i] = size;\n\t\tstarts[column.id] = start;\n\t\tstart += size;\n\t}\n\tlet after = 0;\n\tfor (let i = columns.length - 1; i >= 0; i--) {\n\t\tafters[columns[i].id] = after;\n\t\tafter += sizes[i];\n\t}\n\treturn {\n\t\tstarts,\n\t\tafters\n\t};\n}\n/**\n* Builds start and after offset maps for every visible leaf column, computed\n* once per pinning region plus the full visible list.\n*\n* A single table-level memo of this result backs all `column.getStart()` and\n* `column.getAfter()` calls with O(1) lookups.\n*\n* @example\n* ```ts\n* const offsets = table_getColumnOffsets(table)\n* const startOffset = offsets.start.starts[column.id]\n* ```\n*/\nfunction table_getColumnOffsets(table) {\n\treturn {\n\t\tall: buildColumnOffsets(getPinnedVisibleLeafColumns(table)),\n\t\tcenter: buildColumnOffsets(getPinnedVisibleLeafColumns(table, \"center\")),\n\t\tstart: buildColumnOffsets(getPinnedVisibleLeafColumns(table, \"start\")),\n\t\tend: buildColumnOffsets(getPinnedVisibleLeafColumns(table, \"end\"))\n\t};\n}\nfunction toOffsetsKey(position) {\n\treturn position === \"start\" ? \"start\" : position === \"end\" ? \"end\" : position === \"center\" ? \"center\" : \"all\";\n}\n/**\n* Computes the offset from the start edge of a pinning region to this column.\n*\n* The value is the sum of all previous visible leaf column sizes in the\n* requested `'start'`, `'center'`, or `'end'` region.\n*\n* `start` and `end` are logical positions. In LTR languages/layouts, `start`\n* usually corresponds to left and `end` to right. In RTL languages/layouts,\n* `start` usually corresponds to right and `end` to left.\n*\n* @example\n* ```ts\n* const startOffset = column_getStart(column, 'start')\n* ```\n*/\nfunction column_getStart(column, position) {\n\treturn callMemoOrStaticFn(column.table, \"getColumnOffsets\", table_getColumnOffsets)[toOffsetsKey(position)].starts[column.id] ?? 0;\n}\n/**\n* Computes the offset from the end edge of a pinning region after this column.\n*\n* The value is the sum of all following visible leaf column sizes in the\n* requested region.\n*\n* @example\n* ```ts\n* const endOffset = column_getAfter(column, 'end')\n* ```\n*/\nfunction column_getAfter(column, position) {\n\treturn callMemoOrStaticFn(column.table, \"getColumnOffsets\", table_getColumnOffsets)[toOffsetsKey(position)].afters[column.id] ?? 0;\n}\n/**\n* Removes this column's committed size override.\n*\n* After reset, the column resolves size from `columnDef.size` or built-in\n* defaults again.\n*\n* @example\n* ```ts\n* column_resetSize(column)\n* ```\n*/\nfunction column_resetSize(column) {\n\ttable_setColumnSizing(column.table, (old) => {\n\t\tconst rest = makeObjectMap();\n\t\tconst columnIds = Object.keys(old);\n\t\tfor (let i = 0; i < columnIds.length; i++) {\n\t\t\tconst columnId = columnIds[i];\n\t\t\tif (columnId !== column.id) rest[columnId] = old[columnId];\n\t\t}\n\t\treturn rest;\n\t});\n}\nfunction sumHeaderSize(header) {\n\tif (!header.subHeaders.length) return column_getSize(header.column);\n\tlet sum = 0;\n\tfor (let i = 0; i < header.subHeaders.length; i++) sum += sumHeaderSize(header.subHeaders[i]);\n\treturn sum;\n}\n/**\n* Computes a header's rendered size from its leaf headers.\n*\n* Group headers sum the sizes of all descendant leaf columns. Leaf headers use\n* their column's current size.\n*\n* @example\n* ```ts\n* const width = header_getSize(header)\n* ```\n*/\nfunction header_getSize(header) {\n\treturn sumHeaderSize(header);\n}\n/**\n* Computes a header's offset from the start of its header group.\n*\n* The offset is the previous sibling header's start plus size, or `0` for the\n* first header in the group.\n*\n* @example\n* ```ts\n* const offset = header_getStart(header)\n* ```\n*/\nfunction header_getStart(header) {\n\tif (header.index > 0) {\n\t\tconst prevSiblingHeader = header.headerGroup?.headers[header.index - 1];\n\t\tif (prevSiblingHeader) return callMemoOrStaticFn(prevSiblingHeader, \"getStart\", header_getStart) + callMemoOrStaticFn(prevSiblingHeader, \"getSize\", header_getSize);\n\t}\n\treturn 0;\n}\n/**\n* Routes a committed column sizing updater through the table's sizing handler.\n*\n* The updater may be a next size map or a function of the previous map,\n* matching the instance `table.setColumnSizing` behavior.\n*\n* @example\n* ```ts\n* table_setColumnSizing(table, (old) => ({ ...old, age: 96 }))\n* ```\n*/\nfunction table_setColumnSizing(table, updater) {\n\ttable.options.onColumnSizingChange?.(updater);\n}\n/**\n* Resets `columnSizing` to the configured initial state or feature default.\n*\n* With no argument, the reset clones `table.initialState.columnSizing` when it\n* exists. Passing `true` ignores initial state and resets to `{}`.\n*\n* @example\n* ```ts\n* table_resetColumnSizing(table)\n* table_resetColumnSizing(table, true)\n* ```\n*/\nfunction table_resetColumnSizing(table, defaultState) {\n\ttable_setColumnSizing(table, defaultState ? makeObjectMap() : Object.assign(makeObjectMap(), cloneState(table.initialState.columnSizing ?? {})));\n}\nfunction sumColumnSizes(columns) {\n\tlet sum = 0;\n\tfor (let i = 0; i < columns.length; i++) sum += callMemoOrStaticFn(columns[i], \"getSize\", column_getSize);\n\treturn sum;\n}\n/**\n* Sums the rendered size of the full table header row.\n*\n* This includes start, center, and end columns in the main header group.\n*\n* @example\n* ```ts\n* const width = table_getTotalSize(table)\n* ```\n*/\nfunction table_getTotalSize(table) {\n\treturn table.getHeaderGroups()[0]?.headers.reduce((sum, header) => {\n\t\treturn sum + header_getSize(header);\n\t}, 0) ?? 0;\n}\n/**\n* Sums the sizes of the visible leaf columns pinned to the logical start\n* region.\n*\n* An empty start pinning region returns `0`.\n*\n* @example\n* ```ts\n* const width = table_getStartTotalSize(table)\n* ```\n*/\nfunction table_getStartTotalSize(table) {\n\treturn sumColumnSizes(getPinnedVisibleLeafColumns(table, \"start\"));\n}\n/**\n* Sums the sizes of the visible leaf columns that are not pinned.\n*\n* An empty center region returns `0`.\n*\n* @example\n* ```ts\n* const width = table_getCenterTotalSize(table)\n* ```\n*/\nfunction table_getCenterTotalSize(table) {\n\treturn sumColumnSizes(getPinnedVisibleLeafColumns(table, \"center\"));\n}\n/**\n* Sums the sizes of the visible leaf columns pinned to the logical end region.\n*\n* An empty end pinning region returns `0`.\n*\n* @example\n* ```ts\n* const width = table_getEndTotalSize(table)\n* ```\n*/\nfunction table_getEndTotalSize(table) {\n\treturn sumColumnSizes(getPinnedVisibleLeafColumns(table, \"end\"));\n}\n\n//#endregion\nexport { column_getAfter, column_getSize, column_getStart, column_resetSize, getDefaultColumnSizingColumnDef, getDefaultColumnSizingState, header_getSize, header_getStart, table_getCenterTotalSize, table_getColumnOffsets, table_getEndTotalSize, table_getStartTotalSize, table_getTotalSize, table_resetColumnSizing, table_setColumnSizing };","import { cloneState, makeObjectMap } from \"../../utils.js\";\nimport { column_getSize, header_getSize, table_setColumnSizing } from \"../column-sizing/columnSizingFeature.utils.js\";\n\n//#region src/features/column-resizing/columnResizingFeature.utils.ts\n/**\n* Creates the default transient column resizing state.\n*\n* The feature default represents no active drag interaction. Reset APIs use\n* this value when `defaultState` is `true`.\n*\n* @example\n* ```ts\n* const resizeInfo = getDefaultColumnResizingState()\n* ```\n*/\nfunction getDefaultColumnResizingState() {\n\treturn {\n\t\tstartOffset: null,\n\t\tstartSize: null,\n\t\tdeltaOffset: null,\n\t\tdeltaPercentage: null,\n\t\tisResizingColumn: false,\n\t\tcolumnSizingStart: []\n\t};\n}\n/**\n* Checks whether this column can start a resize interaction.\n*\n* Both `columnDef.enableResizing` and table `enableColumnResizing` default to\n* `true`.\n*\n* @example\n* ```ts\n* const canResize = column_getCanResize(column)\n* ```\n*/\nfunction column_getCanResize(column) {\n\treturn (column.columnDef.enableResizing ?? true) && (column.table.options.enableColumnResizing ?? true);\n}\n/**\n* Checks whether this column is the active column resize target.\n*\n* The value is read from `state.columnResizing.isResizingColumn`.\n*\n* @example\n* ```ts\n* const isResizing = column_getIsResizing(column)\n* ```\n*/\nfunction column_getIsResizing(column) {\n\treturn column.table.atoms.columnResizing?.get()?.isResizingColumn === column.id;\n}\n/**\n* Creates the pointer/touch start handler for resizing a header.\n*\n* The handler records starting sizes for all leaf headers, tracks drag deltas,\n* writes transient resize info, and commits column sizes on change or drag end\n* depending on `columnResizeMode`.\n*\n* @example\n* ```ts\n* const onMouseDown = header_getResizeHandler(header)\n* ```\n*/\nfunction header_getResizeHandler(header, _contextDocument) {\n\tconst column = header.table.getColumn(header.column.id);\n\tconst canResize = column_getCanResize(column);\n\treturn (event) => {\n\t\tif (!canResize) return;\n\t\tif (isTouchStartEvent(event)) {\n\t\t\tif (event.touches.length > 1) return;\n\t\t}\n\t\tconst startSize = header_getSize(header);\n\t\tconst columnSizingStart = header.getLeafHeaders().map((leafHeader) => [leafHeader.column.id, column_getSize(leafHeader.column)]);\n\t\tconst clientX = isTouchStartEvent(event) ? Math.round(event.touches[0].clientX) : event.clientX;\n\t\tconst newColumnSizing = makeObjectMap();\n\t\tconst updateOffset = (eventType, clientXPos) => {\n\t\t\tif (typeof clientXPos !== \"number\") return;\n\t\t\tconst table = column.table;\n\t\t\tconst isCommit = table.options.columnResizeMode === \"onChange\" || eventType === \"end\";\n\t\t\ttable._reactivity.batch(() => {\n\t\t\t\ttable_setColumnResizing(table, (old) => {\n\t\t\t\t\tconst deltaDirection = table.options.columnResizeDirection === \"rtl\" ? -1 : 1;\n\t\t\t\t\tconst deltaOffset = (clientXPos - (old.startOffset ?? 0)) * deltaDirection;\n\t\t\t\t\tconst startSize = old.startSize ?? 0;\n\t\t\t\t\tconst deltaPercentage = Math.max(startSize > 0 ? deltaOffset / startSize : 0, -.999999);\n\t\t\t\t\tif (isCommit) {\n\t\t\t\t\t\tconst columnSizingStart = old.columnSizingStart;\n\t\t\t\t\t\tfor (let i = 0; i < columnSizingStart.length; i++) {\n\t\t\t\t\t\t\tconst entry = columnSizingStart[i];\n\t\t\t\t\t\t\tconst headerSize = entry[1];\n\t\t\t\t\t\t\tnewColumnSizing[entry[0]] = Math.round(Math.max(headerSize > 0 ? headerSize + headerSize * deltaPercentage : deltaOffset / columnSizingStart.length, 0) * 100) / 100;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...old,\n\t\t\t\t\t\tdeltaOffset,\n\t\t\t\t\t\tdeltaPercentage\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t\tif (isCommit) table_setColumnSizing(table, (old) => Object.assign(makeObjectMap(), old, newColumnSizing));\n\t\t\t});\n\t\t};\n\t\tlet moveRafId = null;\n\t\tlet hasPendingMove = false;\n\t\tlet latestMoveX;\n\t\tconst flushMove = () => {\n\t\t\tif (hasPendingMove) {\n\t\t\t\thasPendingMove = false;\n\t\t\t\tupdateOffset(\"move\", latestMoveX);\n\t\t\t\tmoveRafId = requestAnimationFrame(flushMove);\n\t\t\t} else moveRafId = null;\n\t\t};\n\t\tconst onMove = (clientXPos) => {\n\t\t\tlatestMoveX = clientXPos;\n\t\t\tif (typeof requestAnimationFrame !== \"function\") {\n\t\t\t\tupdateOffset(\"move\", clientXPos);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (moveRafId !== null) {\n\t\t\t\thasPendingMove = true;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tupdateOffset(\"move\", clientXPos);\n\t\t\tmoveRafId = requestAnimationFrame(flushMove);\n\t\t};\n\t\tconst onEnd = (clientXPos) => {\n\t\t\tif (moveRafId !== null) {\n\t\t\t\tcancelAnimationFrame(moveRafId);\n\t\t\t\tmoveRafId = null;\n\t\t\t\thasPendingMove = false;\n\t\t\t}\n\t\t\tcolumn.table._reactivity.batch(() => {\n\t\t\t\tupdateOffset(\"end\", clientXPos ?? latestMoveX);\n\t\t\t\ttable_setColumnResizing(column.table, (old) => ({\n\t\t\t\t\t...old,\n\t\t\t\t\tisResizingColumn: false,\n\t\t\t\t\tstartOffset: null,\n\t\t\t\t\tstartSize: null,\n\t\t\t\t\tdeltaOffset: null,\n\t\t\t\t\tdeltaPercentage: null,\n\t\t\t\t\tcolumnSizingStart: []\n\t\t\t\t}));\n\t\t\t});\n\t\t};\n\t\tconst contextDocument = _contextDocument || (typeof document !== \"undefined\" ? document : null);\n\t\tconst mouseEvents = {\n\t\t\tmoveHandler: (e) => onMove(e.clientX),\n\t\t\tupHandler: (e) => {\n\t\t\t\tcontextDocument?.removeEventListener(\"mousemove\", mouseEvents.moveHandler);\n\t\t\t\tcontextDocument?.removeEventListener(\"mouseup\", mouseEvents.upHandler);\n\t\t\t\tonEnd(e.clientX);\n\t\t\t}\n\t\t};\n\t\tconst touchEvents = {\n\t\t\tmoveHandler: (touchEvent) => {\n\t\t\t\tif (touchEvent.cancelable) {\n\t\t\t\t\ttouchEvent.preventDefault();\n\t\t\t\t\ttouchEvent.stopPropagation();\n\t\t\t\t}\n\t\t\t\tonMove(touchEvent.touches[0].clientX);\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\tupHandler: (e) => {\n\t\t\t\tremoveTouchEvents();\n\t\t\t\tif (e.cancelable) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t}\n\t\t\t\tonEnd(e.touches[0]?.clientX);\n\t\t\t},\n\t\t\tcancelHandler: () => {\n\t\t\t\tremoveTouchEvents();\n\t\t\t\tonEnd();\n\t\t\t}\n\t\t};\n\t\tconst removeTouchEvents = () => {\n\t\t\tcontextDocument?.removeEventListener(\"touchmove\", touchEvents.moveHandler);\n\t\t\tcontextDocument?.removeEventListener(\"touchend\", touchEvents.upHandler);\n\t\t\tcontextDocument?.removeEventListener(\"touchcancel\", touchEvents.cancelHandler);\n\t\t};\n\t\tconst passiveIfSupported = passiveEventSupported() ? { passive: false } : false;\n\t\tif (isTouchStartEvent(event)) {\n\t\t\tcontextDocument?.addEventListener(\"touchmove\", touchEvents.moveHandler, passiveIfSupported);\n\t\t\tcontextDocument?.addEventListener(\"touchend\", touchEvents.upHandler, passiveIfSupported);\n\t\t\tcontextDocument?.addEventListener(\"touchcancel\", touchEvents.cancelHandler, passiveIfSupported);\n\t\t} else {\n\t\t\tcontextDocument?.addEventListener(\"mousemove\", mouseEvents.moveHandler, passiveIfSupported);\n\t\t\tcontextDocument?.addEventListener(\"mouseup\", mouseEvents.upHandler, passiveIfSupported);\n\t\t}\n\t\ttable_setColumnResizing(column.table, (old) => ({\n\t\t\t...old,\n\t\t\tstartOffset: clientX,\n\t\t\tstartSize,\n\t\t\tdeltaOffset: 0,\n\t\t\tdeltaPercentage: 0,\n\t\t\tcolumnSizingStart,\n\t\t\tisResizingColumn: column.id\n\t\t}));\n\t};\n}\n/**\n* Routes a transient column resizing updater through the table's resize handler.\n*\n* This state tracks the active drag interaction; committed widths live in\n* `columnSizing`.\n*\n* @example\n* ```ts\n* table_setColumnResizing(table, (old) => ({ ...old, deltaOffset: 12 }))\n* ```\n*/\nfunction table_setColumnResizing(table, updater) {\n\ttable.options.onColumnResizingChange?.(updater);\n}\n/**\n* Resets `columnResizing` to the configured initial state or feature default.\n*\n* With no argument, the reset clones `table.initialState.columnResizing` when\n* it exists. Passing `true` ignores initial state and resets to the no-drag\n* default state.\n*\n* @example\n* ```ts\n* table_resetHeaderSizeInfo(table)\n* table_resetHeaderSizeInfo(table, true)\n* ```\n*/\nfunction table_resetHeaderSizeInfo(table, defaultState) {\n\ttable_setColumnResizing(table, defaultState ? getDefaultColumnResizingState() : cloneState(table.initialState.columnResizing ?? getDefaultColumnResizingState()));\n}\nlet passiveSupported = null;\n/**\n* Detects whether the current environment supports passive event listeners.\n*\n* Column resizing uses this to register pointer and touch listeners with\n* `passive: false` only when the environment understands passive options.\n*\n* @example\n* ```ts\n* const canUsePassiveListeners = passiveEventSupported()\n* ```\n*/\nfunction passiveEventSupported() {\n\tif (typeof passiveSupported === \"boolean\") return passiveSupported;\n\tlet supported = false;\n\ttry {\n\t\tconst options = { get passive() {\n\t\t\tsupported = true;\n\t\t\treturn false;\n\t\t} };\n\t\tconst noop = () => {};\n\t\twindow.addEventListener(\"test\", noop, options);\n\t\twindow.removeEventListener(\"test\", noop);\n\t} catch (err) {\n\t\tsupported = false;\n\t}\n\tpassiveSupported = supported;\n\treturn passiveSupported;\n}\n/**\n* Narrows an unknown event to a `touchstart` event.\n*\n* Column resizing uses this before reading touch coordinates and installing\n* touch-specific listeners.\n*\n* @example\n* ```ts\n* const isTouch = isTouchStartEvent(event)\n* ```\n*/\nfunction isTouchStartEvent(e) {\n\treturn e.type === \"touchstart\";\n}\n\n//#endregion\nexport { column_getCanResize, column_getIsResizing, getDefaultColumnResizingState, header_getResizeHandler, isTouchStartEvent, passiveEventSupported, table_resetHeaderSizeInfo, table_setColumnResizing };","import { assignPrototypeAPIs, assignTableAPIs, makeStateUpdater } from \"../../utils.js\";\nimport { column_getCanResize, column_getIsResizing, getDefaultColumnResizingState, header_getResizeHandler, table_resetHeaderSizeInfo, table_setColumnResizing } from \"./columnResizingFeature.utils.js\";\n\n//#region src/features/column-resizing/columnResizingFeature.ts\n/**\n* Feature that adds column resizing state, options, and resize handlers.\n*/\nconst columnResizingFeature = {\n\tgetInitialState: (initialState) => {\n\t\treturn {\n\t\t\tcolumnResizing: getDefaultColumnResizingState(),\n\t\t\t...initialState\n\t\t};\n\t},\n\tgetDefaultTableOptions: (table) => {\n\t\treturn {\n\t\t\tcolumnResizeMode: \"onEnd\",\n\t\t\tcolumnResizeDirection: \"ltr\",\n\t\t\tonColumnResizingChange: makeStateUpdater(\"columnResizing\", table)\n\t\t};\n\t},\n\tassignColumnPrototype: (prototype, table) => {\n\t\tassignPrototypeAPIs(\"columnResizingFeature\", prototype, table, {\n\t\t\tcolumn_getCanResize: { fn: (column) => column_getCanResize(column) },\n\t\t\tcolumn_getIsResizing: { fn: (column) => column_getIsResizing(column) }\n\t\t});\n\t},\n\tassignHeaderPrototype: (prototype, table) => {\n\t\tassignPrototypeAPIs(\"columnResizingFeature\", prototype, table, { header_getResizeHandler: { fn: (header, _contextDocument) => header_getResizeHandler(header, _contextDocument) } });\n\t},\n\tconstructTableAPIs: (table) => {\n\t\tassignTableAPIs(\"columnResizingFeature\", table, {\n\t\t\ttable_setColumnResizing: { fn: (updater) => table_setColumnResizing(table, updater) },\n\t\t\ttable_resetHeaderSizeInfo: { fn: (defaultState) => table_resetHeaderSizeInfo(table, defaultState) }\n\t\t});\n\t}\n};\n\n//#endregion\nexport { columnResizingFeature };","import { assignPrototypeAPIs, assignTableAPIs, makeStateUpdater } from \"../../utils.js\";\nimport { column_getAfter, column_getSize, column_getStart, column_resetSize, getDefaultColumnSizingColumnDef, getDefaultColumnSizingState, header_getSize, header_getStart, table_getCenterTotalSize, table_getColumnOffsets, table_getEndTotalSize, table_getStartTotalSize, table_getTotalSize, table_resetColumnSizing, table_setColumnSizing } from \"./columnSizingFeature.utils.js\";\n\n//#region src/features/column-sizing/columnSizingFeature.ts\n/**\n* Feature that adds column sizing state, defaults, and size measurement APIs.\n*/\nconst columnSizingFeature = {\n\tgetInitialState: (initialState) => {\n\t\treturn {\n\t\t\tcolumnSizing: getDefaultColumnSizingState(),\n\t\t\t...initialState\n\t\t};\n\t},\n\tgetDefaultColumnDef: () => {\n\t\treturn getDefaultColumnSizingColumnDef();\n\t},\n\tgetDefaultTableOptions: (table) => {\n\t\treturn { onColumnSizingChange: makeStateUpdater(\"columnSizing\", table) };\n\t},\n\tassignColumnPrototype: (prototype, table) => {\n\t\tassignPrototypeAPIs(\"columnSizingFeature\", prototype, table, {\n\t\t\tcolumn_getSize: {\n\t\t\t\tfn: (column) => column_getSize(column),\n\t\t\t\tmemoDeps: (column) => [table.options.columns, table.atoms.columnSizing?.get()?.[column.id]]\n\t\t\t},\n\t\t\tcolumn_getStart: { fn: (column, position) => column_getStart(column, position) },\n\t\t\tcolumn_getAfter: { fn: (column, position) => column_getAfter(column, position) },\n\t\t\tcolumn_resetSize: { fn: (column) => column_resetSize(column) }\n\t\t});\n\t},\n\tassignHeaderPrototype: (prototype, table) => {\n\t\tassignPrototypeAPIs(\"columnSizingFeature\", prototype, table, {\n\t\t\theader_getSize: {\n\t\t\t\tfn: (header) => header_getSize(header),\n\t\t\t\tmemoDeps: (header) => [table.options.columns, header.column.columns.length > 0 ? table.atoms.columnSizing?.get() : table.atoms.columnSizing?.get()?.[header.column.id]]\n\t\t\t},\n\t\t\theader_getStart: {\n\t\t\t\tfn: (header) => header_getStart(header),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.options.columns,\n\t\t\t\t\ttable.atoms.columnSizing?.get(),\n\t\t\t\t\ttable.atoms.columnOrder?.get(),\n\t\t\t\t\ttable.atoms.columnPinning?.get(),\n\t\t\t\t\ttable.atoms.columnVisibility?.get(),\n\t\t\t\t\ttable.atoms.grouping?.get(),\n\t\t\t\t\ttable.options.groupedColumnMode\n\t\t\t\t]\n\t\t\t}\n\t\t});\n\t},\n\tconstructTableAPIs: (table) => {\n\t\tassignTableAPIs(\"columnSizingFeature\", table, {\n\t\t\ttable_getColumnOffsets: {\n\t\t\t\tfn: () => table_getColumnOffsets(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.options.columns,\n\t\t\t\t\ttable.atoms.columnSizing?.get(),\n\t\t\t\t\ttable.atoms.columnOrder?.get(),\n\t\t\t\t\ttable.atoms.columnPinning?.get(),\n\t\t\t\t\ttable.atoms.columnVisibility?.get(),\n\t\t\t\t\ttable.atoms.grouping?.get(),\n\t\t\t\t\ttable.options.groupedColumnMode\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_setColumnSizing: { fn: (updater) => table_setColumnSizing(table, updater) },\n\t\t\ttable_resetColumnSizing: { fn: (defaultState) => table_resetColumnSizing(table, defaultState) },\n\t\t\ttable_getTotalSize: {\n\t\t\t\tfn: () => table_getTotalSize(table),\n\t\t\t\tmemoDeps: () => [table.atoms.columnSizing?.get(), table.getHeaderGroups()]\n\t\t\t},\n\t\t\ttable_getStartTotalSize: {\n\t\t\t\tfn: () => table_getStartTotalSize(table),\n\t\t\t\tmemoDeps: () => [table.atoms.columnSizing?.get(), table.getHeaderGroups()]\n\t\t\t},\n\t\t\ttable_getCenterTotalSize: {\n\t\t\t\tfn: () => table_getCenterTotalSize(table),\n\t\t\t\tmemoDeps: () => [table.atoms.columnSizing?.get(), table.getHeaderGroups()]\n\t\t\t},\n\t\t\ttable_getEndTotalSize: {\n\t\t\t\tfn: () => table_getEndTotalSize(table),\n\t\t\t\tmemoDeps: () => [table.atoms.columnSizing?.get(), table.getHeaderGroups()]\n\t\t\t}\n\t\t});\n\t}\n};\n\n//#endregion\nexport { columnSizingFeature };","import { callMemoOrStaticFn, cloneState, hasOwn, makeObjectMap, setStateSlice } from \"../../utils.js\";\nimport { orderByColumnPinning } from \"../../core/featureStubs.js\";\n\n//#region src/features/column-visibility/columnVisibilityFeature.utils.ts\n/**\n* Creates the default column visibility state.\n*\n* The feature default is an empty object, where missing column ids are treated\n* as visible. Reset APIs use this value when `defaultState` is `true`.\n*\n* @example\n* ```ts\n* const visibility = getDefaultColumnVisibilityState()\n* ```\n*/\nfunction getDefaultColumnVisibilityState() {\n\treturn makeObjectMap();\n}\n/**\n* Updates this column's visibility when hiding is allowed.\n*\n* Passing `visible` stores that value. Omitting it flips the column's current\n* visibility state. Group columns update their hideable leaf columns because\n* visibility state is keyed by leaf column ids. Columns that cannot hide stay\n* unchanged.\n*\n* @example\n* ```ts\n* column_toggleVisibility(column)\n* ```\n*/\nfunction column_toggleVisibility(column, visible) {\n\tif (column_getCanHide(column)) table_setColumnVisibility(column.table, (old) => {\n\t\tconst next = Object.assign(makeObjectMap(), old);\n\t\tconst nextVisible = visible ?? !callMemoOrStaticFn(column, \"getIsVisible\", column_getIsVisible);\n\t\tconst leafColumns = column.getLeafColumns();\n\t\tfor (let i = 0; i < leafColumns.length; i++) {\n\t\t\tconst leafColumn = leafColumns[i];\n\t\t\tif (column_getCanHide(leafColumn)) next[leafColumn.id] = nextVisible;\n\t\t}\n\t\treturn next;\n\t});\n}\n/**\n* Checks whether this column is visible.\n*\n* Leaf columns read `state.columnVisibility[column.id]`, where missing entries\n* default to visible. Parent columns are visible when at least one child column\n* is visible.\n*\n* @example\n* ```ts\n* const visible = column_getIsVisible(column)\n* ```\n*/\nfunction column_getIsVisible(column) {\n\tconst columnVisibility = column.table.atoms.columnVisibility?.get();\n\tif (!columnVisibility) return true;\n\tconst childColumns = column.columns;\n\tif (childColumns.length) return childColumns.some((childColumn) => callMemoOrStaticFn(childColumn, \"getIsVisible\", column_getIsVisible));\n\treturn (hasOwn(columnVisibility, column.id) ? columnVisibility[column.id] : void 0) ?? true;\n}\n/**\n* Checks whether this column is allowed to be hidden.\n*\n* Both `columnDef.enableHiding` and table `enableHiding` default to `true`.\n*\n* @example\n* ```ts\n* const canHide = column_getCanHide(column)\n* ```\n*/\nfunction column_getCanHide(column) {\n\treturn (column.columnDef.enableHiding ?? true) && (column.table.options.enableHiding ?? true);\n}\n/**\n* Creates a checkbox-style handler that writes this column's visibility.\n*\n* The handler reads `event.target.checked`, so it is intended for visibility\n* controls whose checked state means \"visible\".\n*\n* @example\n* ```ts\n* const onChange = column_getToggleVisibilityHandler(column)\n* ```\n*/\nfunction column_getToggleVisibilityHandler(column) {\n\treturn (e) => {\n\t\tcolumn_toggleVisibility(column, e.target.checked);\n\t};\n}\n/**\n* Collects the cells from this row whose columns are visible.\n*\n* When column pinning is active, the result is ordered as start-pinned cells,\n* center cells, then end-pinned cells.\n*\n* @example\n* ```ts\n* const visibleCells = row_getVisibleCells(row)\n* ```\n*/\nfunction row_getVisibleCells(row) {\n\tconst allCells = row.getAllCells();\n\tconst visibleCells = [];\n\tfor (let i = 0; i < allCells.length; i++) {\n\t\tconst cell = allCells[i];\n\t\tif (callMemoOrStaticFn(cell.column, \"getIsVisible\", column_getIsVisible)) visibleCells.push(cell);\n\t}\n\treturn orderByColumnPinning(row.table, visibleCells, (cell) => cell.column.id, () => callMemoOrStaticFn(row, \"getVisibleCellsByColumnId\", row_getVisibleCellsByColumnId));\n}\n/**\n* Builds a lookup map of this row's visible cells keyed by column id.\n*\n* Hidden columns are omitted from the map.\n*\n* @example\n* ```ts\n* const visibleCellsById = row_getVisibleCellsByColumnId(row)\n* ```\n*/\nfunction row_getVisibleCellsByColumnId(row) {\n\tconst result = makeObjectMap();\n\tconst allCells = row.getAllCells();\n\tfor (let i = 0; i < allCells.length; i++) {\n\t\tconst cell = allCells[i];\n\t\tif (callMemoOrStaticFn(cell.column, \"getIsVisible\", column_getIsVisible)) result[cell.column.id] = cell;\n\t}\n\treturn result;\n}\n/**\n* Filters the flat column list down to visible columns.\n*\n* Parent/group columns are included when `column_getIsVisible` considers them\n* visible.\n*\n* @example\n* ```ts\n* const columns = table_getVisibleFlatColumns(table)\n* ```\n*/\nfunction table_getVisibleFlatColumns(table) {\n\treturn table.getAllFlatColumns().filter((column) => callMemoOrStaticFn(column, \"getIsVisible\", column_getIsVisible));\n}\n/**\n* Filters leaf columns down to those currently visible.\n*\n* This is the column list most row rendering code uses before pinning-specific\n* partitioning.\n*\n* @example\n* ```ts\n* const columns = table_getVisibleLeafColumns(table)\n* ```\n*/\nfunction table_getVisibleLeafColumns(table) {\n\treturn table.getAllLeafColumns().filter((column) => callMemoOrStaticFn(column, \"getIsVisible\", column_getIsVisible));\n}\n/**\n* Routes a column visibility updater through the table's visibility change handler.\n*\n* The updater may be a next visibility map or a function of the previous map,\n* matching the instance `table.setColumnVisibility` behavior.\n*\n* @example\n* ```ts\n* table_setColumnVisibility(table, (old) => ({ ...old, age: false }))\n* ```\n*/\nfunction table_setColumnVisibility(table, updater) {\n\tsetStateSlice(table, \"columnVisibility\", updater);\n}\n/**\n* Resets `columnVisibility` to the configured initial state or feature default.\n*\n* With no argument, the reset clones `table.initialState.columnVisibility` when\n* it exists. Passing `true` ignores initial state and resets to `{}`.\n*\n* @example\n* ```ts\n* table_resetColumnVisibility(table)\n* table_resetColumnVisibility(table, true)\n* ```\n*/\nfunction table_resetColumnVisibility(table, defaultState) {\n\ttable_setColumnVisibility(table, defaultState ? makeObjectMap() : Object.assign(makeObjectMap(), cloneState(table.initialState.columnVisibility ?? {})));\n}\n/**\n* Shows or hides every hideable leaf column.\n*\n* Columns that cannot hide stay visible when toggling all columns off.\n*\n* @example\n* ```ts\n* table_toggleAllColumnsVisible(table)\n* ```\n*/\nfunction table_toggleAllColumnsVisible(table, value) {\n\tvalue = value ?? !table_getIsAllColumnsVisible(table);\n\tconst visibility = makeObjectMap();\n\tconst leafColumns = table.getAllLeafColumns();\n\tfor (let i = 0; i < leafColumns.length; i++) {\n\t\tconst column = leafColumns[i];\n\t\tvisibility[column.id] = !value ? !column_getCanHide(column) : value;\n\t}\n\ttable_setColumnVisibility(table, visibility);\n}\n/**\n* Checks whether every leaf column is currently visible.\n*\n* Non-hideable columns are naturally visible because missing visibility entries\n* default to `true`.\n*\n* @example\n* ```ts\n* const allVisible = table_getIsAllColumnsVisible(table)\n* ```\n*/\nfunction table_getIsAllColumnsVisible(table) {\n\treturn !table.getAllLeafColumns().some((column) => !callMemoOrStaticFn(column, \"getIsVisible\", column_getIsVisible));\n}\n/**\n* Checks whether at least one leaf column is currently visible.\n*\n* This is useful for tri-state \"show all columns\" controls.\n*\n* @example\n* ```ts\n* const someVisible = table_getIsSomeColumnsVisible(table)\n* ```\n*/\nfunction table_getIsSomeColumnsVisible(table) {\n\treturn table.getAllLeafColumns().some((column) => callMemoOrStaticFn(column, \"getIsVisible\", column_getIsVisible));\n}\n/**\n* Creates a checkbox-style handler that shows or hides all columns.\n*\n* The handler reads `event.target.checked`, so it is intended for controls whose\n* checked state means \"all columns visible\".\n*\n* @example\n* ```ts\n* const onChange = table_getToggleAllColumnsVisibilityHandler(table)\n* ```\n*/\nfunction table_getToggleAllColumnsVisibilityHandler(table) {\n\treturn (e) => {\n\t\ttable_toggleAllColumnsVisible(table, e.target.checked);\n\t};\n}\n\n//#endregion\nexport { column_getCanHide, column_getIsVisible, column_getToggleVisibilityHandler, column_toggleVisibility, getDefaultColumnVisibilityState, row_getVisibleCells, row_getVisibleCellsByColumnId, table_getIsAllColumnsVisible, table_getIsSomeColumnsVisible, table_getToggleAllColumnsVisibilityHandler, table_getVisibleFlatColumns, table_getVisibleLeafColumns, table_resetColumnVisibility, table_setColumnVisibility, table_toggleAllColumnsVisible };","import { assignPrototypeAPIs, assignTableAPIs, makeStateUpdater } from \"../../utils.js\";\nimport { column_getCanHide, column_getIsVisible, column_getToggleVisibilityHandler, column_toggleVisibility, getDefaultColumnVisibilityState, row_getVisibleCells, row_getVisibleCellsByColumnId, table_getIsAllColumnsVisible, table_getIsSomeColumnsVisible, table_getToggleAllColumnsVisibilityHandler, table_getVisibleFlatColumns, table_getVisibleLeafColumns, table_resetColumnVisibility, table_setColumnVisibility, table_toggleAllColumnsVisible } from \"./columnVisibilityFeature.utils.js\";\n\n//#region src/features/column-visibility/columnVisibilityFeature.ts\n/**\n* Feature that adds column visibility state and APIs for hiding and showing columns.\n*/\nconst columnVisibilityFeature = {\n\tgetInitialState: (initialState) => {\n\t\treturn {\n\t\t\tcolumnVisibility: getDefaultColumnVisibilityState(),\n\t\t\t...initialState\n\t\t};\n\t},\n\tgetDefaultTableOptions: (table) => {\n\t\treturn { onColumnVisibilityChange: makeStateUpdater(\"columnVisibility\", table) };\n\t},\n\tassignColumnPrototype: (prototype, table) => {\n\t\tassignPrototypeAPIs(\"columnVisibilityFeature\", prototype, table, {\n\t\t\tcolumn_getIsVisible: {\n\t\t\t\tfn: (column) => column_getIsVisible(column),\n\t\t\t\tmemoDeps: (column) => [\n\t\t\t\t\ttable.options.columns,\n\t\t\t\t\ttable.atoms.columnVisibility?.get(),\n\t\t\t\t\tcolumn.columns\n\t\t\t\t]\n\t\t\t},\n\t\t\tcolumn_getCanHide: { fn: (column) => column_getCanHide(column) },\n\t\t\tcolumn_getToggleVisibilityHandler: { fn: (column) => column_getToggleVisibilityHandler(column) },\n\t\t\tcolumn_toggleVisibility: { fn: (column, visible) => column_toggleVisibility(column, visible) }\n\t\t});\n\t},\n\tassignRowPrototype: (prototype, table) => {\n\t\tassignPrototypeAPIs(\"columnVisibilityFeature\", prototype, table, {\n\t\t\trow_getVisibleCells: {\n\t\t\t\tfn: (row) => row_getVisibleCells(row),\n\t\t\t\tmemoDeps: (row) => [\n\t\t\t\t\trow.getAllCells(),\n\t\t\t\t\ttable.atoms.columnPinning?.get(),\n\t\t\t\t\ttable.atoms.columnVisibility?.get()\n\t\t\t\t]\n\t\t\t},\n\t\t\trow_getVisibleCellsByColumnId: {\n\t\t\t\tfn: (row) => row_getVisibleCellsByColumnId(row),\n\t\t\t\tmemoDeps: (row) => [row.getAllCells(), table.atoms.columnVisibility?.get()]\n\t\t\t}\n\t\t});\n\t},\n\tconstructTableAPIs: (table) => {\n\t\tassignTableAPIs(\"columnVisibilityFeature\", table, {\n\t\t\ttable_getVisibleFlatColumns: {\n\t\t\t\tfn: () => table_getVisibleFlatColumns(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.atoms.columnVisibility?.get(),\n\t\t\t\t\ttable.atoms.columnOrder?.get(),\n\t\t\t\t\ttable.atoms.grouping?.get(),\n\t\t\t\t\ttable.options.columns,\n\t\t\t\t\ttable.options.groupedColumnMode\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_getVisibleLeafColumns: {\n\t\t\t\tfn: () => table_getVisibleLeafColumns(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.atoms.columnVisibility?.get(),\n\t\t\t\t\ttable.atoms.columnOrder?.get(),\n\t\t\t\t\ttable.atoms.grouping?.get(),\n\t\t\t\t\ttable.options.columns,\n\t\t\t\t\ttable.options.groupedColumnMode\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_setColumnVisibility: { fn: (updater) => table_setColumnVisibility(table, updater) },\n\t\t\ttable_resetColumnVisibility: { fn: (defaultState) => table_resetColumnVisibility(table, defaultState) },\n\t\t\ttable_toggleAllColumnsVisible: { fn: (value) => table_toggleAllColumnsVisible(table, value) },\n\t\t\ttable_getIsAllColumnsVisible: { fn: () => table_getIsAllColumnsVisible(table) },\n\t\t\ttable_getIsSomeColumnsVisible: { fn: () => table_getIsSomeColumnsVisible(table) },\n\t\t\ttable_getToggleAllColumnsVisibilityHandler: { fn: () => table_getToggleAllColumnsVisibilityHandler(table) }\n\t\t});\n\t}\n};\n\n//#endregion\nexport { columnVisibilityFeature };","//#region src/features/column-filtering/filterFns.ts\n/**\n* Builds a `FilterFn` from a value-level comparator plus optional resolvers.\n*\n* The `filter` comparator receives the row's data value (already passed\n* through `resolveDataValue` when one is defined) and the filter value\n* (already passed through `resolveFilterValue` by the table). Keeping\n* normalization in the resolvers means a variant of an existing filter\n* function only has to swap the resolvers, not re-implement the comparison.\n*\n* The definition is attached to the returned function, so a variant can be\n* created by spreading a built-in filter function and overriding what differs:\n*\n* ```ts\n* const normalize = (value: unknown) =>\n* String(value ?? '')\n* .toLowerCase()\n* .normalize('NFD')\n* .replace(/\\p{Diacritic}/gu, '')\n*\n* const includesStringIgnoreDiacritics = constructFilterFn({\n* ...filterFn_includesString,\n* resolveFilterValue: normalize,\n* resolveDataValue: normalize,\n* })\n* ```\n*\n* Note: the table applies `resolveFilterValue` once per filter before any rows\n* are tested. When calling a filter function directly (outside of a table),\n* apply it yourself: `fn(row, columnId, fn.resolveFilterValue?.(value) ?? value)`.\n*/\n/* @__NO_SIDE_EFFECTS__ */\nfunction constructFilterFn(def) {\n\tconst filterFn = Object.assign((row, columnId, filterValue, addMeta) => {\n\t\tconst rawValue = row.getValue(columnId);\n\t\tconst dataValue = filterFn.resolveDataValue ? filterFn.resolveDataValue(rawValue) : rawValue;\n\t\treturn filterFn.filter(dataValue, filterValue, row, columnId, addMeta);\n\t}, def);\n\treturn filterFn;\n}\n/**\n* Keeps rows whose column value is strictly equal to the filter value.\n*\n* Uses JavaScript `===` comparison and auto-removes empty filter values.\n*/\nconst filterFn_equals = /* @__PURE__ */ constructFilterFn({\n\tfilter: (dataValue, filterValue) => dataValue === filterValue,\n\tautoRemove: (val) => testFalsy(val)\n});\n/**\n* Keeps rows whose column value is loosely equal to the filter value.\n*\n* Uses JavaScript `==` comparison and auto-removes empty filter values. This is\n* useful for matching string input against numeric row values.\n*/\nconst filterFn_weakEquals = /* @__PURE__ */ constructFilterFn({\n\tfilter: (dataValue, filterValue) => dataValue == filterValue,\n\tautoRemove: (val) => testFalsy(val)\n});\n/**\n* Keeps rows whose stringified column value includes the filter text.\n*\n* Matching is case-sensitive and empty filter values are auto-removed.\n*/\nconst filterFn_includesStringSensitive = /* @__PURE__ */ constructFilterFn({\n\tfilter: (dataValue, filterValue) => Boolean(dataValue?.includes(filterValue)),\n\tautoRemove: (val) => testFalsy(val),\n\tresolveFilterValue: (val) => String(val),\n\tresolveDataValue: (val) => val == null ? void 0 : String(val)\n});\n/**\n* Keeps rows whose stringified column value includes the filter text.\n*\n* Both values are lowercased before comparison, and empty filter values are\n* auto-removed.\n*/\nconst filterFn_includesString = /* @__PURE__ */ constructFilterFn({\n\tfilter: (dataValue, filterValue) => Boolean(dataValue?.includes(filterValue)),\n\tautoRemove: (val) => testFalsy(val),\n\tresolveFilterValue: (val) => String(val).toLowerCase(),\n\tresolveDataValue: (val) => val == null ? void 0 : String(val).toLowerCase()\n});\n/**\n* Keeps rows whose stringified column value equals the filter text.\n*\n* Both values are lowercased before comparison, and empty filter values are\n* auto-removed.\n*/\nconst filterFn_equalsString = /* @__PURE__ */ constructFilterFn({\n\tfilter: (dataValue, filterValue) => dataValue === filterValue,\n\tautoRemove: (val) => testFalsy(val),\n\tresolveFilterValue: (val) => String(val).toLowerCase(),\n\tresolveDataValue: (val) => val == null ? void 0 : String(val).toLowerCase()\n});\n/**\n* Keeps rows whose stringified column value exactly equals the filter text.\n*\n* Matching is case-sensitive and empty filter values are auto-removed.\n*/\nconst filterFn_equalsStringSensitive = /* @__PURE__ */ constructFilterFn({\n\tfilter: (dataValue, filterValue) => dataValue === filterValue,\n\tautoRemove: (val) => testFalsy(val),\n\tresolveFilterValue: (val) => String(val),\n\tresolveDataValue: (val) => val == null ? void 0 : String(val)\n});\n/**\n* Keeps rows whose stringified column value starts with the filter text.\n*\n* Both values are lowercased before comparison, and empty filter values are\n* auto-removed.\n*/\nconst filterFn_startsWith = /* @__PURE__ */ constructFilterFn({\n\tfilter: (dataValue, filterValue) => Boolean(dataValue?.startsWith(filterValue)),\n\tautoRemove: (val) => testFalsy(val),\n\tresolveFilterValue: (val) => String(val).toLowerCase(),\n\tresolveDataValue: (val) => val == null ? void 0 : String(val).toLowerCase()\n});\n/**\n* Keeps rows whose stringified column value ends with the filter text.\n*\n* Both values are lowercased before comparison, and empty filter values are\n* auto-removed.\n*/\nconst filterFn_endsWith = /* @__PURE__ */ constructFilterFn({\n\tfilter: (dataValue, filterValue) => Boolean(dataValue?.endsWith(filterValue)),\n\tautoRemove: (val) => testFalsy(val),\n\tresolveFilterValue: (val) => String(val).toLowerCase(),\n\tresolveDataValue: (val) => val == null ? void 0 : String(val).toLowerCase()\n});\n/**\n* Keeps rows whose column value is empty.\n*\n* A value is empty when it is nullish or stringifies to whitespace only. The\n* filter value acts as an on/off flag: `false` and blank values are\n* auto-removed.\n*/\nconst filterFn_empty = /* @__PURE__ */ constructFilterFn({\n\tfilter: (dataValue) => testValueEmpty(dataValue),\n\tautoRemove: (val) => testFalsy(val) || val === false\n});\n/**\n* Keeps rows whose column value is not empty.\n*\n* A value is empty when it is nullish or stringifies to whitespace only. The\n* filter value acts as an on/off flag: `false` and blank values are\n* auto-removed.\n*/\nconst filterFn_notEmpty = /* @__PURE__ */ constructFilterFn({\n\tfilter: (dataValue) => !testValueEmpty(dataValue),\n\tautoRemove: (val) => testFalsy(val) || val === false\n});\n/**\n* Keeps rows whose value is greater than the filter value.\n*\n* Numeric values are compared numerically when both sides can be coerced to\n* numbers; otherwise normalized strings are compared.\n*/\nconst filterFn_greaterThan = /* @__PURE__ */ constructFilterFn({\n\tfilter: (dataValue, filterValue) => compareGreaterThan(dataValue, filterValue),\n\tautoRemove: (val) => testFalsy(val)\n});\n/**\n* Keeps rows whose value is greater than or equal to the filter value.\n*\n* Delegates to the built-in greater-than and strict-equality comparisons.\n*/\nconst filterFn_greaterThanOrEqualTo = /* @__PURE__ */ constructFilterFn({\n\tfilter: (dataValue, filterValue) => compareGreaterThanOrEqualTo(dataValue, filterValue),\n\tautoRemove: (val) => testFalsy(val)\n});\n/**\n* Keeps rows whose value is less than the filter value.\n*\n* This is implemented as the inverse of greater-than-or-equal comparison.\n*/\nconst filterFn_lessThan = /* @__PURE__ */ constructFilterFn({\n\tfilter: (dataValue, filterValue) => !compareGreaterThanOrEqualTo(dataValue, filterValue),\n\tautoRemove: (val) => testFalsy(val)\n});\n/**\n* Keeps rows whose value is less than or equal to the filter value.\n*\n* This is implemented as the inverse of greater-than comparison.\n*/\nconst filterFn_lessThanOrEqualTo = /* @__PURE__ */ constructFilterFn({\n\tfilter: (dataValue, filterValue) => !compareGreaterThan(dataValue, filterValue),\n\tautoRemove: (val) => testFalsy(val)\n});\n/**\n* Keeps rows whose value falls between an exclusive min/max pair.\n*\n* Blank range endpoints are treated as open-ended.\n*/\nconst filterFn_between = /* @__PURE__ */ constructFilterFn({\n\tfilter: (dataValue, filterValues) => compareBetween(dataValue, filterValues, false),\n\tautoRemove: (val) => testFalsy(val) || Array.isArray(val) && testFalsy(val[0]) && testFalsy(val[1])\n});\n/**\n* Keeps rows whose value falls between an inclusive min/max pair.\n*\n* Blank range endpoints are treated as open-ended.\n*/\nconst filterFn_betweenInclusive = /* @__PURE__ */ constructFilterFn({\n\tfilter: (dataValue, filterValues) => compareBetween(dataValue, filterValues, true),\n\tautoRemove: (val) => testFalsy(val) || Array.isArray(val) && testFalsy(val[0]) && testFalsy(val[1])\n});\n/**\n* Keeps rows whose numeric value is inside an inclusive `[min, max]` range.\n*\n* Filter values are normalized so blank endpoints become open-ended and\n* reversed endpoints are swapped. Only real numbers can fall inside the\n* range: non-numeric row values (`null`, `undefined`, strings, booleans)\n* never match.\n*/\nconst filterFn_inNumberRange = /* @__PURE__ */ constructFilterFn({\n\tfilter: (dataValue, filterValue) => {\n\t\tif (typeof dataValue !== \"number\" || Number.isNaN(dataValue)) return false;\n\t\tconst [min, max] = filterValue;\n\t\treturn dataValue >= min && dataValue <= max;\n\t},\n\tresolveFilterValue: (val) => {\n\t\tconst [unsafeMin, unsafeMax] = val;\n\t\tconst parsedMin = typeof unsafeMin !== \"number\" ? parseFloat(unsafeMin) : unsafeMin;\n\t\tconst parsedMax = typeof unsafeMax !== \"number\" ? parseFloat(unsafeMax) : unsafeMax;\n\t\tlet min = unsafeMin === null || Number.isNaN(parsedMin) ? -Infinity : parsedMin;\n\t\tlet max = unsafeMax === null || Number.isNaN(parsedMax) ? Infinity : parsedMax;\n\t\tif (min > max) {\n\t\t\tconst temp = min;\n\t\t\tmin = max;\n\t\t\tmax = temp;\n\t\t}\n\t\treturn [min, max];\n\t},\n\tautoRemove: (val) => testFalsy(val) || Array.isArray(val) && testFalsy(val[0]) && testFalsy(val[1])\n});\n/**\n* Keeps rows whose date value is inside an inclusive `[min, max]` date range.\n*\n* Row values and range endpoints may be `Date` objects, timestamps, or\n* parseable date strings. Blank or invalid endpoints become open-ended and\n* reversed endpoints are swapped. Rows without a valid date never match.\n*/\nconst filterFn_inDateRange = /* @__PURE__ */ constructFilterFn({\n\tfilter: (dataValue, filterValue) => {\n\t\tconst [min, max] = filterValue;\n\t\treturn dataValue >= min && dataValue <= max;\n\t},\n\tresolveFilterValue: (val) => {\n\t\tconst [unsafeMin, unsafeMax] = val;\n\t\tconst parsedMin = toDateTimestamp(unsafeMin);\n\t\tconst parsedMax = toDateTimestamp(unsafeMax);\n\t\tlet min = Number.isNaN(parsedMin) ? -Infinity : parsedMin;\n\t\tlet max = Number.isNaN(parsedMax) ? Infinity : parsedMax;\n\t\tif (min > max) {\n\t\t\tconst temp = min;\n\t\t\tmin = max;\n\t\t\tmax = temp;\n\t\t}\n\t\treturn [min, max];\n\t},\n\tresolveDataValue: (val) => toDateTimestamp(val),\n\tautoRemove: (val) => testFalsy(val) || Array.isArray(val) && testFalsy(val[0]) && testFalsy(val[1])\n});\n/**\n* Keeps rows whose scalar column value equals at least one filter value.\n*/\nconst filterFn_arrHas = /* @__PURE__ */ constructFilterFn({\n\tfilter: (dataValue, filterValue) => {\n\t\tfor (let i = 0; i < filterValue.length; i++) if (dataValue === filterValue[i]) return true;\n\t\treturn false;\n\t},\n\tautoRemove: (val) => testFalsy(val) || !val?.length\n});\n/**\n* Keeps rows whose array or string column value includes at least one filter value.\n*/\nconst filterFn_arrIncludes = /* @__PURE__ */ constructFilterFn({\n\tfilter: (dataValue, filterValue) => {\n\t\tif (typeof dataValue !== \"string\" && !Array.isArray(dataValue)) return false;\n\t\tfor (let i = 0; i < filterValue.length; i++) if (dataValue.includes(filterValue[i])) return true;\n\t\treturn false;\n\t},\n\tautoRemove: (val) => testFalsy(val) || !val?.length\n});\n/**\n* Keeps rows whose array column value includes every filter value.\n*/\nconst filterFn_arrIncludesAll = /* @__PURE__ */ constructFilterFn({\n\tfilter: (dataValue, filterValue) => {\n\t\tif (!Array.isArray(dataValue)) return false;\n\t\tfor (let i = 0; i < filterValue.length; i++) if (!dataValue.includes(filterValue[i])) return false;\n\t\treturn true;\n\t},\n\tautoRemove: (val) => testFalsy(val) || !val?.length\n});\n/**\n* Keeps rows whose array column value includes at least one filter value.\n*/\nconst filterFn_arrIncludesSome = /* @__PURE__ */ constructFilterFn({\n\tfilter: (dataValue, filterValue) => {\n\t\tif (!Array.isArray(dataValue)) return false;\n\t\tfor (let i = 0; i < filterValue.length; i++) if (dataValue.includes(filterValue[i])) return true;\n\t\treturn false;\n\t},\n\tautoRemove: (val) => testFalsy(val) || !val?.length\n});\n/**\n* The built-in filter function registry.\n*\n* Registering this full object opts out of tree-shaking: every built-in\n* filter function ends up in your bundle. Prefer importing the `filterFn_*`\n* functions you actually use and registering just those in the `filterFns`\n* slot, or passing them directly to the `filterFn` column option.\n*\n* @deprecated Import individual `filterFn_*` functions instead for a smaller\n* bundle. This export still works and is not going away in v9, but built-in\n* name resolution (including `filterFn: 'auto'`) only finds functions you\n* register yourself.\n*/\nconst filterFns = {\n\tarrIncludes: filterFn_arrIncludes,\n\tarrIncludesAll: filterFn_arrIncludesAll,\n\tarrHas: filterFn_arrHas,\n\tarrIncludesSome: filterFn_arrIncludesSome,\n\tbetween: filterFn_between,\n\tbetweenInclusive: filterFn_betweenInclusive,\n\tempty: filterFn_empty,\n\tendsWith: filterFn_endsWith,\n\tequals: filterFn_equals,\n\tequalsString: filterFn_equalsString,\n\tequalsStringSensitive: filterFn_equalsStringSensitive,\n\tinDateRange: filterFn_inDateRange,\n\tinNumberRange: filterFn_inNumberRange,\n\tincludesString: filterFn_includesString,\n\tincludesStringSensitive: filterFn_includesStringSensitive,\n\tnotEmpty: filterFn_notEmpty,\n\tstartsWith: filterFn_startsWith,\n\tweakEquals: filterFn_weakEquals\n};\nfunction testFalsy(val) {\n\treturn val === void 0 || val === null || val === \"\";\n}\nfunction testValueEmpty(dataValue) {\n\treturn dataValue == null || String(dataValue).trim() === \"\";\n}\nfunction toDateTimestamp(value) {\n\tif (value instanceof Date) return value.getTime();\n\tif (typeof value === \"number\") return value;\n\tif (value == null || value === \"\") return NaN;\n\treturn new Date(value).getTime();\n}\nfunction compareGreaterThan(dataValue, filterValue) {\n\tconst numericDataValue = dataValue == null ? 0 : +dataValue;\n\tconst numericFilterValue = Number(filterValue);\n\tif (!isNaN(numericFilterValue) && !isNaN(numericDataValue)) return numericDataValue > numericFilterValue;\n\treturn String(dataValue ?? \"\").toLowerCase().trim() > String(filterValue).toLowerCase().trim();\n}\nfunction compareGreaterThanOrEqualTo(dataValue, filterValue) {\n\treturn dataValue === filterValue || compareGreaterThan(dataValue, filterValue);\n}\nfunction compareBetween(dataValue, filterValues, inclusive) {\n\tconst min = filterValues[0];\n\tconst hasMin = min !== \"\" && min !== void 0;\n\tif (hasMin) {\n\t\tif (!(inclusive ? compareGreaterThanOrEqualTo(dataValue, min) : compareGreaterThan(dataValue, min))) return false;\n\t}\n\tconst max = filterValues[1];\n\tif (max === \"\" || max === void 0) return true;\n\tif (hasMin) {\n\t\tconst numericMin = Number(min);\n\t\tconst numericMax = Number(max);\n\t\tif (!isNaN(numericMin) && !isNaN(numericMax) && numericMin > numericMax) return true;\n\t}\n\treturn inclusive ? !compareGreaterThan(dataValue, max) : !compareGreaterThanOrEqualTo(dataValue, max);\n}\n\n//#endregion\nexport { constructFilterFn, filterFn_arrHas, filterFn_arrIncludes, filterFn_arrIncludesAll, filterFn_arrIncludesSome, filterFn_between, filterFn_betweenInclusive, filterFn_empty, filterFn_endsWith, filterFn_equals, filterFn_equalsString, filterFn_equalsStringSensitive, filterFn_greaterThan, filterFn_greaterThanOrEqualTo, filterFn_inDateRange, filterFn_inNumberRange, filterFn_includesString, filterFn_includesStringSensitive, filterFn_lessThan, filterFn_lessThanOrEqualTo, filterFn_notEmpty, filterFn_startsWith, filterFn_weakEquals, filterFns };","import { cloneState, isFunction } from \"../../utils.js\";\nimport { filterFn_includesString } from \"../column-filtering/filterFns.js\";\n\n//#region src/features/global-filtering/globalFilteringFeature.utils.ts\n/**\n* Checks whether this accessor column participates in global filtering.\n*\n* The column must have an accessor and pass column-level, table-level, and\n* optional `getColumnCanGlobalFilter` checks.\n*\n* @example\n* ```ts\n* const canGlobalFilter = column_getCanGlobalFilter(column)\n* ```\n*/\nfunction column_getCanGlobalFilter(column) {\n\treturn (column.columnDef.enableGlobalFilter ?? true) && (column.table.options.enableGlobalFilter ?? true) && (column.table.options.enableFilters ?? true) && (column.table.options.getColumnCanGlobalFilter?.(column) ?? true) && !!column.accessorFn;\n}\n/**\n* Provides the built-in automatic global filter function.\n*\n* Global filtering defaults to `includesString`, which gives search-box style\n* matching across globally filterable columns.\n*\n* @example\n* ```ts\n* const filterFn = table_getGlobalAutoFilterFn()\n* ```\n*/\nfunction table_getGlobalAutoFilterFn() {\n\treturn filterFn_includesString;\n}\n/**\n* Resolves the filter function used for global filtering.\n*\n* Function-valued `options.globalFilterFn` is returned directly, `'auto'`\n* delegates to `table_getGlobalAutoFilterFn`, and string values are looked up in\n* the table's filter function registry.\n*\n* @example\n* ```ts\n* const filterFn = table_getGlobalFilterFn(table)\n* ```\n*/\nfunction table_getGlobalFilterFn(table) {\n\tconst { globalFilterFn } = table.options;\n\tconst filterFns = table._rowModelFns.filterFns;\n\tconst filterFn = isFunction(globalFilterFn) ? globalFilterFn : globalFilterFn === \"auto\" ? table_getGlobalAutoFilterFn() : filterFns?.[globalFilterFn];\n\tif (process.env.NODE_ENV === \"development\" && !filterFn && globalFilterFn != null) console.warn(`globalFilterFn '${String(globalFilterFn)}' is not registered`);\n\treturn filterFn;\n}\n/**\n* Routes a global filter updater through the table's global filter handler.\n*\n* The updater may be a next value or a function of the previous value, matching\n* the instance `table.setGlobalFilter` behavior.\n*\n* @example\n* ```ts\n* table_setGlobalFilter(table, 'search text')\n* ```\n*/\nfunction table_setGlobalFilter(table, updater) {\n\ttable.options.onGlobalFilterChange?.(updater);\n}\n/**\n* Resets `globalFilter` to the configured initial state or feature default.\n*\n* With no argument, the reset clones `table.initialState.globalFilter`. Passing\n* `true` ignores initial state and resets to `undefined`.\n*\n* @example\n* ```ts\n* table_resetGlobalFilter(table)\n* table_resetGlobalFilter(table, true)\n* ```\n*/\nfunction table_resetGlobalFilter(table, defaultState) {\n\ttable_setGlobalFilter(table, defaultState ? void 0 : cloneState(table.initialState.globalFilter));\n}\n\n//#endregion\nexport { column_getCanGlobalFilter, table_getGlobalAutoFilterFn, table_getGlobalFilterFn, table_resetGlobalFilter, table_setGlobalFilter };","import { assignPrototypeAPIs, assignTableAPIs, makeStateUpdater } from \"../../utils.js\";\nimport { column_getCanGlobalFilter, table_getGlobalAutoFilterFn, table_getGlobalFilterFn, table_resetGlobalFilter, table_setGlobalFilter } from \"./globalFilteringFeature.utils.js\";\n\n//#region src/features/global-filtering/globalFilteringFeature.ts\n/**\n* Feature that adds global filtering state, defaults, and global filter APIs.\n*/\nconst globalFilteringFeature = {\n\tgetInitialState: (initialState) => {\n\t\treturn {\n\t\t\tglobalFilter: void 0,\n\t\t\t...initialState\n\t\t};\n\t},\n\tgetDefaultTableOptions: (table) => {\n\t\treturn {\n\t\t\tonGlobalFilterChange: makeStateUpdater(\"globalFilter\", table),\n\t\t\tglobalFilterFn: \"auto\",\n\t\t\tgetColumnCanGlobalFilter: (column) => {\n\t\t\t\tif (\"enableGlobalFilter\" in column.columnDef && column.columnDef.enableGlobalFilter === true) return true;\n\t\t\t\tconst value = table.getCoreRowModel().flatRows.find((row) => row.getAllCellsByColumnId()[column.id]?.getValue() != null)?.getAllCellsByColumnId()[column.id]?.getValue();\n\t\t\t\treturn typeof value === \"string\" || typeof value === \"number\";\n\t\t\t}\n\t\t};\n\t},\n\tassignColumnPrototype: (prototype, table) => {\n\t\tassignPrototypeAPIs(\"globalFilteringFeature\", prototype, table, { column_getCanGlobalFilter: { fn: (column) => column_getCanGlobalFilter(column) } });\n\t},\n\tconstructTableAPIs: (table) => {\n\t\tassignTableAPIs(\"globalFilteringFeature\", table, {\n\t\t\ttable_getGlobalAutoFilterFn: { fn: () => table_getGlobalAutoFilterFn() },\n\t\t\ttable_getGlobalFilterFn: { fn: () => table_getGlobalFilterFn(table) },\n\t\t\ttable_setGlobalFilter: { fn: (updater) => table_setGlobalFilter(table, updater) },\n\t\t\ttable_resetGlobalFilter: { fn: (defaultState) => table_resetGlobalFilter(table, defaultState) }\n\t\t});\n\t}\n};\n\n//#endregion\nexport { globalFilteringFeature };","import { cloneState, hasOwn, makeObjectMap, setStateSlice } from \"../../utils.js\";\n\n//#region src/features/row-expanding/rowExpandingFeature.utils.ts\n/**\n* Creates the default expanded state.\n*\n* The feature default is an empty map, meaning no rows are expanded. Reset APIs\n* use this value when `defaultState` is `true`.\n*\n* @example\n* ```ts\n* const expanded = getDefaultExpandedState()\n* ```\n*/\nfunction getDefaultExpandedState() {\n\treturn makeObjectMap();\n}\n/**\n* Schedules an expanded-state reset after row-structure changes.\n*\n* The reset runs when `autoResetAll`, `autoResetExpanded`, or the default\n* client-side expanding behavior allows it. Manual expanding opts out unless\n* the reset options explicitly opt back in.\n*\n* @example\n* ```ts\n* table_autoResetExpanded(table)\n* ```\n*/\nfunction table_autoResetExpanded(table) {\n\tif (!table.atoms.expanded) return;\n\tif (table.options.autoResetAll ?? table.options.autoResetExpanded ?? !table.options.manualExpanding) table._reactivity.schedule(() => table_resetExpanded(table));\n}\n/**\n* Routes an expanded-state updater through the table's expanded change handler.\n*\n* The updater may be `true`, a row-id map, or a function of the previous\n* expanded state, matching the instance `table.setExpanded` behavior.\n*\n* @example\n* ```ts\n* table_setExpanded(table, (old) => ({ ...old, [rowId]: true }))\n* ```\n*/\nfunction table_setExpanded(table, updater) {\n\ttable.options.onExpandedChange?.(updater);\n}\n/**\n* Expands or collapses every row.\n*\n* Passing `true` stores the special expanded-all state. Passing `false` stores\n* an empty map. Omitting the value toggles based on whether all rows are\n* currently expanded.\n*\n* The call is a no-op (no `onExpandedChange`) when no row can expand or when\n* the requested state matches the current state exactly.\n*\n* @example\n* ```ts\n* table_toggleAllRowsExpanded(table)\n* ```\n*/\nfunction table_toggleAllRowsExpanded(table, expanded) {\n\tconst currentExpanded = table.atoms.expanded?.get() ?? {};\n\tif (expanded ?? !table_getIsAllRowsExpanded(table)) {\n\t\tif (currentExpanded === true) return;\n\t\tif (!table_getCanSomeRowsExpand(table)) return;\n\t\ttable_setExpanded(table, true);\n\t} else {\n\t\tif (currentExpanded !== true && !Object.keys(currentExpanded).length) return;\n\t\ttable_setExpanded(table, makeObjectMap());\n\t}\n}\n/**\n* Resets `expanded` to the configured initial state or feature default.\n*\n* With no argument, the reset clones `table.initialState.expanded` when it\n* exists. Passing `true` ignores initial state and resets to `{}`.\n*\n* @example\n* ```ts\n* table_resetExpanded(table)\n* table_resetExpanded(table, true)\n* ```\n*/\nfunction table_resetExpanded(table, defaultState) {\n\tconst initialExpanded = table.initialState.expanded;\n\tsetStateSlice(table, \"expanded\", defaultState ? makeObjectMap() : initialExpanded === true ? true : Object.assign(makeObjectMap(), cloneState(initialExpanded ?? {})));\n}\n/**\n* Checks whether at least one pre-paginated row can expand.\n*\n* Pagination is intentionally ignored so controls can reflect expandable rows\n* that may not be on the current page.\n*\n* @example\n* ```ts\n* const canExpand = table_getCanSomeRowsExpand(table)\n* ```\n*/\nfunction table_getCanSomeRowsExpand(table) {\n\treturn table.getPrePaginatedRowModel().flatRows.some((row) => row_getCanExpand(row));\n}\n/**\n* Creates an event handler that toggles all rows expanded.\n*\n* @example\n* ```ts\n* const onClick = table_getToggleAllRowsExpandedHandler(table)\n* ```\n*/\nfunction table_getToggleAllRowsExpandedHandler(table) {\n\treturn (_e) => {\n\t\ttable_toggleAllRowsExpanded(table);\n\t};\n}\n/**\n* Checks whether any row is expanded.\n*\n* The special expanded-all value `true` counts as some rows expanded.\n*\n* @example\n* ```ts\n* const someExpanded = table_getIsSomeRowsExpanded(table)\n* ```\n*/\nfunction table_getIsSomeRowsExpanded(table) {\n\tconst expanded = table.atoms.expanded?.get() ?? {};\n\treturn expanded === true || Object.values(expanded).some(Boolean);\n}\n/**\n* Checks whether every expandable row in the current row model is expanded.\n*\n* The special expanded-all value `true` returns true immediately. Empty\n* expanded state returns false. Rows that cannot expand are ignored, so a\n* materialized expanded-all map (which only contains expandable row ids)\n* still counts as all rows expanded.\n*\n* @example\n* ```ts\n* const allExpanded = table_getIsAllRowsExpanded(table)\n* ```\n*/\nfunction table_getIsAllRowsExpanded(table) {\n\tconst expanded = table.atoms.expanded?.get() ?? {};\n\tif (expanded === true) return true;\n\tif (!Object.keys(expanded).length) return false;\n\tconst expandableRows = table.getRowModel().flatRows.filter((row) => row_getCanExpand(row));\n\tif (!expandableRows.length) return false;\n\tif (expandableRows.some((row) => !row_getIsExpanded(row))) return false;\n\treturn true;\n}\n/**\n* Computes the deepest expanded row id depth.\n*\n* Row ids are split on `.`; expanded-all state scans the current row model's\n* expandable rows, while explicit expanded state scans its expanded id keys.\n*\n* @example\n* ```ts\n* const depth = table_getExpandedDepth(table)\n* ```\n*/\nfunction table_getExpandedDepth(table) {\n\tlet maxDepth = 0;\n\tconst expanded = table.atoms.expanded?.get();\n\t(expanded === true ? Object.values(table.getRowModel().rowsById).filter((row) => row_getCanExpand(row)).map((row) => row.id) : Object.keys(expanded ?? {})).forEach((id) => {\n\t\tconst splitId = id.split(\".\");\n\t\tmaxDepth = Math.max(maxDepth, splitId.length);\n\t});\n\treturn maxDepth;\n}\n/**\n* Expands or collapses this row.\n*\n* Omitting `expanded` toggles the row. If the current state is expanded-all,\n* the function first materializes that state into a row-id map (containing\n* only expandable row ids) before applying the row-specific change.\n*\n* The call is a no-op (no `onExpandedChange`) when the requested state matches\n* the current state, or when expanding a row that cannot expand. Collapsing is\n* always allowed so stale expanded ids can be cleaned up.\n*\n* @example\n* ```ts\n* row_toggleExpanded(row)\n* ```\n*/\nfunction row_toggleExpanded(row, expanded) {\n\tconst currentExpanded = row.table.atoms.expanded?.get() ?? {};\n\tconst currentExists = currentExpanded === true || isExpandedRowId(currentExpanded, row.id);\n\tconst targetExpanded = expanded ?? !currentExists;\n\tif (targetExpanded === currentExists) return;\n\tif (targetExpanded && !row_getCanExpand(row)) return;\n\ttable_setExpanded(row.table, (old) => {\n\t\tconst exists = old === true ? true : isExpandedRowId(old, row.id);\n\t\tlet oldExpanded = makeObjectMap();\n\t\tif (old === true) Object.values(row.table.getRowModel().rowsById).forEach((rowModelRow) => {\n\t\t\tif (row_getCanExpand(rowModelRow)) oldExpanded[rowModelRow.id] = true;\n\t\t});\n\t\telse oldExpanded = Object.assign(makeObjectMap(), old);\n\t\tif (!exists && targetExpanded) {\n\t\t\toldExpanded[row.id] = true;\n\t\t\treturn oldExpanded;\n\t\t}\n\t\tif (exists && !targetExpanded) {\n\t\t\tconst rest = makeObjectMap();\n\t\t\tconst rowIds = Object.keys(oldExpanded);\n\t\t\tfor (let i = 0; i < rowIds.length; i++) {\n\t\t\t\tconst rowId = rowIds[i];\n\t\t\t\tif (rowId !== row.id && oldExpanded[rowId]) rest[rowId] = true;\n\t\t\t}\n\t\t\treturn rest;\n\t\t}\n\t\treturn old;\n\t});\n}\n/**\n* Checks whether this row is expanded.\n*\n* `options.getIsRowExpanded` can override state-derived behavior. Otherwise\n* the row is expanded when expanded state is `true` or contains this row id.\n*\n* @example\n* ```ts\n* const expanded = row_getIsExpanded(row)\n* ```\n*/\nfunction row_getIsExpanded(row) {\n\tconst expanded = row.table.atoms.expanded?.get() ?? {};\n\treturn !!(row.table.options.getIsRowExpanded?.(row) ?? (expanded === true || isExpandedRowId(expanded, row.id)));\n}\nfunction isExpandedRowId(expanded, rowId) {\n\treturn !!(expanded && expanded !== true && hasOwn(expanded, rowId) && expanded[rowId]);\n}\n/**\n* Checks whether this row can be expanded.\n*\n* `options.getRowCanExpand` wins when provided. Otherwise rows can expand when\n* expanding is enabled and the row has subRows.\n*\n* @example\n* ```ts\n* const canExpand = row_getCanExpand(row)\n* ```\n*/\nfunction row_getCanExpand(row) {\n\treturn row.table.options.getRowCanExpand?.(row) ?? ((row.table.options.enableExpanding ?? true) && !!row.subRows.length);\n}\n/**\n* Checks whether every ancestor of this row is expanded.\n*\n* The current row is not considered; only its parent chain is walked.\n*\n* @example\n* ```ts\n* const parentsExpanded = row_getIsAllParentsExpanded(row)\n* ```\n*/\nfunction row_getIsAllParentsExpanded(row) {\n\tlet isFullyExpanded = true;\n\tlet currentRow = row;\n\twhile (isFullyExpanded && currentRow.parentId) {\n\t\tcurrentRow = row.table.getRow(currentRow.parentId, true);\n\t\tisFullyExpanded = row_getIsExpanded(currentRow);\n\t}\n\treturn isFullyExpanded;\n}\n/**\n* Creates a row control handler that toggles this row's expanded state.\n*\n* The handler is a no-op when the row cannot expand.\n*\n* @example\n* ```ts\n* const onClick = row_getToggleExpandedHandler(row)\n* ```\n*/\nfunction row_getToggleExpandedHandler(row) {\n\tconst canExpand = row_getCanExpand(row);\n\treturn () => {\n\t\tif (!canExpand) return;\n\t\trow_toggleExpanded(row);\n\t};\n}\n\n//#endregion\nexport { getDefaultExpandedState, row_getCanExpand, row_getIsAllParentsExpanded, row_getIsExpanded, row_getToggleExpandedHandler, row_toggleExpanded, table_autoResetExpanded, table_getCanSomeRowsExpand, table_getExpandedDepth, table_getIsAllRowsExpanded, table_getIsSomeRowsExpanded, table_getToggleAllRowsExpandedHandler, table_resetExpanded, table_setExpanded, table_toggleAllRowsExpanded };","import { tableMemo } from \"../../utils.js\";\nimport { row_getIsExpanded } from \"./rowExpandingFeature.utils.js\";\n\n//#region src/features/row-expanding/createExpandedRowModel.ts\n/**\n* Creates a memoized expanded row model factory.\n*\n* The factory reads the relevant table state atoms and options, then returns a row model function used by the table row-model pipeline.\n*/\nfunction createExpandedRowModel() {\n\treturn (_table) => {\n\t\tconst table = _table;\n\t\treturn tableMemo({\n\t\t\tfeature: \"rowExpandingFeature\",\n\t\t\ttable,\n\t\t\tfnName: \"table.getExpandedRowModel\",\n\t\t\tmemoDeps: () => [\n\t\t\t\ttable.atoms.expanded?.get(),\n\t\t\t\ttable.getPreExpandedRowModel(),\n\t\t\t\ttable.options.paginateExpandedRows,\n\t\t\t\ttable.options.manualPagination\n\t\t\t],\n\t\t\tfn: () => _createExpandedRowModel(table)\n\t\t});\n\t};\n}\nfunction _createExpandedRowModel(table) {\n\tconst rowModel = table.getPreExpandedRowModel();\n\tconst expanded = table.atoms.expanded?.get();\n\tif (!rowModel.rows.length || expanded !== true && !Object.keys(expanded ?? {}).length) return rowModel;\n\tif (!table.options.paginateExpandedRows && !table.options.manualPagination) return rowModel;\n\treturn expandRows(rowModel);\n}\n/**\n* Expands a row model according to the current expanded row state.\n*\n* Expanded sub-rows are inserted into the flattened row order while preserving the original row hierarchy.\n*/\nfunction expandRows(rowModel) {\n\tconst expandedRows = [];\n\tconst handleRow = (row) => {\n\t\texpandedRows.push(row);\n\t\tif (row.subRows.length && row_getIsExpanded(row)) row.subRows.forEach(handleRow);\n\t};\n\trowModel.rows.forEach(handleRow);\n\treturn {\n\t\trows: expandedRows,\n\t\tflatRows: rowModel.flatRows,\n\t\trowsById: rowModel.rowsById\n\t};\n}\n\n//#endregion\nexport { createExpandedRowModel, expandRows };","import { assignPrototypeAPIs, assignTableAPIs, makeStateUpdater } from \"../../utils.js\";\nimport { getDefaultExpandedState, row_getCanExpand, row_getIsAllParentsExpanded, row_getIsExpanded, row_getToggleExpandedHandler, row_toggleExpanded, table_autoResetExpanded, table_getCanSomeRowsExpand, table_getExpandedDepth, table_getIsAllRowsExpanded, table_getIsSomeRowsExpanded, table_getToggleAllRowsExpandedHandler, table_resetExpanded, table_setExpanded, table_toggleAllRowsExpanded } from \"./rowExpandingFeature.utils.js\";\nimport { expandRows } from \"./createExpandedRowModel.js\";\n\n//#region src/features/row-expanding/rowExpandingFeature.ts\n/**\n* Feature that adds row expansion state and APIs for expandable row trees.\n*/\nconst rowExpandingFeature = {\n\tgetInitialState: (initialState) => {\n\t\treturn {\n\t\t\texpanded: getDefaultExpandedState(),\n\t\t\t...initialState\n\t\t};\n\t},\n\tgetDefaultTableOptions: (table) => {\n\t\treturn {\n\t\t\tonExpandedChange: makeStateUpdater(\"expanded\", table),\n\t\t\tpaginateExpandedRows: true\n\t\t};\n\t},\n\tassignRowPrototype: (prototype, table) => {\n\t\tassignPrototypeAPIs(\"rowExpandingFeature\", prototype, table, {\n\t\t\trow_toggleExpanded: { fn: (row, expanded) => row_toggleExpanded(row, expanded) },\n\t\t\trow_getIsExpanded: { fn: (row) => row_getIsExpanded(row) },\n\t\t\trow_getCanExpand: { fn: (row) => row_getCanExpand(row) },\n\t\t\trow_getIsAllParentsExpanded: { fn: (row) => row_getIsAllParentsExpanded(row) },\n\t\t\trow_getToggleExpandedHandler: { fn: (row) => row_getToggleExpandedHandler(row) }\n\t\t});\n\t},\n\tconstructTableAPIs: (table) => {\n\t\tassignTableAPIs(\"rowExpandingFeature\", table, {\n\t\t\ttable_autoResetExpanded: { fn: () => table_autoResetExpanded(table) },\n\t\t\ttable_setExpanded: { fn: (updater) => table_setExpanded(table, updater) },\n\t\t\ttable_toggleAllRowsExpanded: { fn: (expanded) => table_toggleAllRowsExpanded(table, expanded) },\n\t\t\ttable_resetExpanded: { fn: (defaultState) => table_resetExpanded(table, defaultState) },\n\t\t\ttable_getCanSomeRowsExpand: { fn: () => table_getCanSomeRowsExpand(table) },\n\t\t\ttable_getToggleAllRowsExpandedHandler: { fn: () => table_getToggleAllRowsExpandedHandler(table) },\n\t\t\ttable_getIsSomeRowsExpanded: { fn: () => table_getIsSomeRowsExpanded(table) },\n\t\t\ttable_getIsAllRowsExpanded: { fn: () => table_getIsAllRowsExpanded(table) },\n\t\t\ttable_getExpandedDepth: { fn: () => table_getExpandedDepth(table) },\n\t\t\ttable__expandRows: { fn: expandRows }\n\t\t});\n\t}\n};\n\n//#endregion\nexport { rowExpandingFeature };","import { cloneState, functionalUpdate, setStateSlice } from \"../../utils.js\";\n\n//#region src/features/row-pagination/rowPaginationFeature.utils.ts\nconst defaultPageIndex = 0;\nconst defaultPageSize = 10;\n/**\n* Creates the default pagination state used by the pagination feature.\n*\n* The feature default starts at the first page with a page size of 10. Reset\n* APIs use this value when `defaultState` is `true`.\n*\n* @example\n* ```ts\n* const pagination = getDefaultPaginationState()\n* ```\n*/\nfunction getDefaultPaginationState() {\n\treturn {\n\t\tpageIndex: defaultPageIndex,\n\t\tpageSize: defaultPageSize\n\t};\n}\n/**\n* Resets the page index when a page-altering change should return to page 0.\n*\n* The reset runs when `autoResetAll`, `autoResetPageIndex`, or the default\n* client-side pagination behavior allows it. Manual pagination opts out unless\n* the reset options explicitly opt back in.\n*\n* @example\n* ```ts\n* table_autoResetPageIndex(table)\n* ```\n*/\nfunction table_autoResetPageIndex(table) {\n\tif (table.options.autoResetAll ?? table.options.autoResetPageIndex ?? !table.options.manualPagination) {\n\t\tif ((table.atoms.pagination?.get()?.pageIndex ?? defaultPageIndex) === defaultPageIndex) return;\n\t\ttable_resetPageIndex(table, true);\n\t}\n}\n/**\n* Routes a pagination updater through the table's pagination change handler.\n*\n* The updater may be a next state object or a function of the previous\n* `PaginationState`; controlled state and external atoms observe the same\n* updater path as the instance API.\n*\n* @example\n* ```ts\n* table_setPagination(table, (old) => old)\n* ```\n*/\nfunction table_setPagination(table, updater) {\n\tsetStateSlice(table, \"pagination\", updater);\n}\n/**\n* Resets `pagination` to the configured initial state or feature default.\n*\n* With no argument, the reset clones `table.initialState.pagination` when it\n* exists. Passing `true` ignores initial state and resets to\n* `{ pageIndex: 0, pageSize: 10 }`.\n*\n* @example\n* ```ts\n* table_resetPagination(table)\n* table_resetPagination(table, true)\n* ```\n*/\nfunction table_resetPagination(table, defaultState) {\n\ttable_setPagination(table, defaultState ? getDefaultPaginationState() : cloneState(table.initialState.pagination ?? getDefaultPaginationState()));\n}\n/**\n* Updates `pagination.pageIndex` and clamps it to the known page range.\n*\n* Unknown page counts (`undefined` or `-1`) allow any non-negative page index.\n* Known page counts clamp the index between `0` and `pageCount - 1`.\n*\n* @example\n* ```ts\n* table_setPageIndex(table, (old) => old)\n* ```\n*/\nfunction table_setPageIndex(table, updater) {\n\ttable_setPagination(table, (old) => {\n\t\tlet pageIndex = functionalUpdate(updater, old.pageIndex);\n\t\tconst maxPageIndex = typeof table.options.pageCount === \"undefined\" || table.options.pageCount === -1 ? Number.MAX_SAFE_INTEGER : table.options.pageCount - 1;\n\t\tpageIndex = Math.max(0, Math.min(pageIndex, maxPageIndex));\n\t\treturn {\n\t\t\t...old,\n\t\t\tpageIndex\n\t\t};\n\t});\n}\n/**\n* Resets only `pagination.pageIndex`.\n*\n* With no argument, the reset uses `table.initialState.pagination?.pageIndex`\n* or `0`. Passing `true` always resets the page index to `0`.\n*\n* @example\n* ```ts\n* table_resetPageIndex(table)\n* table_resetPageIndex(table, true)\n* ```\n*/\nfunction table_resetPageIndex(table, defaultState) {\n\ttable_setPageIndex(table, defaultState ? defaultPageIndex : table.initialState.pagination?.pageIndex ?? defaultPageIndex);\n}\n/**\n* Resets only `pagination.pageSize`.\n*\n* With no argument, the reset uses `table.initialState.pagination?.pageSize`\n* or `10`. Passing `true` always resets the page size to `10`.\n*\n* @example\n* ```ts\n* table_resetPageSize(table)\n* table_resetPageSize(table, true)\n* ```\n*/\nfunction table_resetPageSize(table, defaultState) {\n\ttable_setPageSize(table, defaultState ? defaultPageSize : table.initialState.pagination?.pageSize ?? defaultPageSize);\n}\n/**\n* Updates `pagination.pageSize` while preserving the current top row.\n*\n* The new size is clamped to at least `1`, and `pageIndex` is recalculated so\n* the row that was previously at the top of the page remains in view.\n*\n* @example\n* ```ts\n* table_setPageSize(table, (old) => old)\n* ```\n*/\nfunction table_setPageSize(table, updater) {\n\ttable_setPagination(table, (old) => {\n\t\tconst pageSize = Math.max(1, functionalUpdate(updater, old.pageSize));\n\t\tconst topRowIndex = old.pageSize === Infinity ? 0 : old.pageSize * old.pageIndex;\n\t\tconst pageIndex = pageSize === Infinity ? 0 : Math.floor(topRowIndex / pageSize);\n\t\treturn {\n\t\t\t...old,\n\t\t\tpageIndex,\n\t\t\tpageSize\n\t\t};\n\t});\n}\n/**\n* Builds the zero-based page indexes available for the current page count.\n*\n* Unknown or empty page counts return an empty array; otherwise the result is\n* `[0, 1, ...pageCount - 1]`.\n*\n* @example\n* ```ts\n* const pageIndexes = table_getPageOptions(table)\n* ```\n*/\nfunction table_getPageOptions(table) {\n\tconst pageCount = table_getPageCount(table);\n\tlet pageOptions = [];\n\tif (pageCount && pageCount > 0) pageOptions = [...new Array(pageCount)].fill(null).map((_, i) => i);\n\treturn pageOptions;\n}\n/**\n* Checks whether the current page index can move backward.\n*\n* The first page is page index `0`, so only positive page indexes can navigate\n* to a previous page.\n*\n* @example\n* ```ts\n* const canGoBack = table_getCanPreviousPage(table)\n* ```\n*/\nfunction table_getCanPreviousPage(table) {\n\treturn (table.atoms.pagination?.get()?.pageIndex ?? 0) > 0;\n}\n/**\n* Checks whether the current page index can move forward.\n*\n* A `pageCount` of `-1` means the caller does not know the total page count, so\n* this returns `true`. A page count of `0` returns `false`.\n*\n* @example\n* ```ts\n* const canGoForward = table_getCanNextPage(table)\n* ```\n*/\nfunction table_getCanNextPage(table) {\n\tconst pageIndex = table.atoms.pagination?.get()?.pageIndex ?? defaultPageIndex;\n\tconst pageCount = table_getPageCount(table);\n\tif (pageCount === -1) return true;\n\tif (pageCount === 0) return false;\n\treturn pageIndex < pageCount - 1;\n}\n/**\n* Checks whether a known, finite last page exists after the current page.\n*\n* Unknown (`-1`), empty, and non-finite page counts do not have a navigable\n* last page.\n*\n* @example\n* ```ts\n* const canGoToLastPage = table_getCanLastPage(table)\n* ```\n*/\nfunction table_getCanLastPage(table) {\n\tconst pageIndex = table.atoms.pagination?.get()?.pageIndex ?? defaultPageIndex;\n\tconst pageCount = table_getPageCount(table);\n\treturn Number.isFinite(pageCount) && pageCount > 0 && pageIndex < pageCount - 1;\n}\n/**\n* Moves the table to the previous page.\n*\n* This delegates to `table_setPageIndex` so pagination state ownership and\n* updater semantics remain consistent.\n*\n* @example\n* ```ts\n* table_previousPage(table)\n* ```\n*/\nfunction table_previousPage(table) {\n\treturn table_setPageIndex(table, (old) => old - 1);\n}\n/**\n* Moves the table to the next page.\n*\n* This delegates to `table_setPageIndex` so pagination state ownership and\n* updater semantics remain consistent.\n*\n* @example\n* ```ts\n* table_nextPage(table)\n* ```\n*/\nfunction table_nextPage(table) {\n\treturn table_setPageIndex(table, (old) => {\n\t\treturn old + 1;\n\t});\n}\n/**\n* Moves the table to the first page.\n*\n* This is a convenience wrapper around `table_setPageIndex(table, 0)`.\n*\n* @example\n* ```ts\n* table_firstPage(table)\n* ```\n*/\nfunction table_firstPage(table) {\n\treturn table_setPageIndex(table, 0);\n}\n/**\n* Moves the table to the last known page.\n*\n* Unknown, empty, and non-finite page counts do not have a navigable last\n* page, so this does nothing for those states.\n*\n* @example\n* ```ts\n* table_lastPage(table)\n* ```\n*/\nfunction table_lastPage(table) {\n\tconst pageCount = table_getPageCount(table);\n\tif (!Number.isFinite(pageCount) || pageCount <= 0) return;\n\treturn table_setPageIndex(table, pageCount - 1);\n}\n/**\n* Resolves the number of pages for the current pagination state.\n*\n* `options.pageCount` wins for manual pagination. Otherwise the value is\n* calculated from `table_getRowCount(table)` and the current `pageSize`.\n*\n* @example\n* ```ts\n* const pages = table_getPageCount(table)\n* ```\n*/\nfunction table_getPageCount(table) {\n\tconst configuredPageCount = table.options.pageCount;\n\tif (configuredPageCount != null) return configuredPageCount;\n\tconst rowCount = table_getRowCount(table);\n\tconst pageSize = table.atoms.pagination?.get()?.pageSize ?? defaultPageSize;\n\tif (pageSize === Infinity && Number.isFinite(rowCount) && rowCount > 0) return 1;\n\treturn Math.ceil(rowCount / pageSize);\n}\n/**\n* Resolves the total row count used for pagination math.\n*\n* `options.rowCount` wins for manual pagination. Otherwise the count comes\n* from the pre-paginated row model so filtering, grouping, sorting, and\n* expansion are reflected before the page slice is applied.\n*\n* @example\n* ```ts\n* const rows = table_getRowCount(table)\n* ```\n*/\nfunction table_getRowCount(table) {\n\treturn table.options.rowCount ?? table.getPrePaginatedRowModel().rows.length;\n}\n\n//#endregion\nexport { getDefaultPaginationState, table_autoResetPageIndex, table_firstPage, table_getCanLastPage, table_getCanNextPage, table_getCanPreviousPage, table_getPageCount, table_getPageOptions, table_getRowCount, table_lastPage, table_nextPage, table_previousPage, table_resetPageIndex, table_resetPageSize, table_resetPagination, table_setPageIndex, table_setPageSize, table_setPagination };","import { assignTableAPIs, makeStateUpdater } from \"../../utils.js\";\nimport { getDefaultPaginationState, table_autoResetPageIndex, table_firstPage, table_getCanLastPage, table_getCanNextPage, table_getCanPreviousPage, table_getPageCount, table_getPageOptions, table_getRowCount, table_lastPage, table_nextPage, table_previousPage, table_resetPageIndex, table_resetPageSize, table_resetPagination, table_setPageIndex, table_setPageSize, table_setPagination } from \"./rowPaginationFeature.utils.js\";\n\n//#region src/features/row-pagination/rowPaginationFeature.ts\n/**\n* Feature that adds pagination state and table APIs for page navigation.\n*/\nconst rowPaginationFeature = {\n\tgetInitialState: (initialState) => {\n\t\treturn {\n\t\t\t...initialState,\n\t\t\tpagination: {\n\t\t\t\t...getDefaultPaginationState(),\n\t\t\t\t...initialState.pagination\n\t\t\t}\n\t\t};\n\t},\n\tgetDefaultTableOptions: (table) => {\n\t\treturn { onPaginationChange: makeStateUpdater(\"pagination\", table) };\n\t},\n\tconstructTableAPIs: (table) => {\n\t\tassignTableAPIs(\"rowPaginationFeature\", table, {\n\t\t\ttable_autoResetPageIndex: { fn: () => table_autoResetPageIndex(table) },\n\t\t\ttable_setPagination: { fn: (updater) => table_setPagination(table, updater) },\n\t\t\ttable_resetPagination: { fn: (defaultState) => table_resetPagination(table, defaultState) },\n\t\t\ttable_setPageIndex: { fn: (updater) => table_setPageIndex(table, updater) },\n\t\t\ttable_resetPageIndex: { fn: (defaultState) => table_resetPageIndex(table, defaultState) },\n\t\t\ttable_setPageSize: { fn: (updater) => table_setPageSize(table, updater) },\n\t\t\ttable_getPageCount: { fn: () => table_getPageCount(table) },\n\t\t\ttable_resetPageSize: { fn: (defaultState) => table_resetPageSize(table, defaultState) },\n\t\t\ttable_getPageOptions: { fn: () => table_getPageOptions(table) },\n\t\t\ttable_getCanPreviousPage: { fn: () => table_getCanPreviousPage(table) },\n\t\t\ttable_getCanNextPage: { fn: () => table_getCanNextPage(table) },\n\t\t\ttable_getCanLastPage: { fn: () => table_getCanLastPage(table) },\n\t\t\ttable_previousPage: { fn: () => table_previousPage(table) },\n\t\t\ttable_nextPage: { fn: () => table_nextPage(table) },\n\t\t\ttable_firstPage: { fn: () => table_firstPage(table) },\n\t\t\ttable_lastPage: { fn: () => table_lastPage(table) },\n\t\t\ttable_getRowCount: { fn: () => table_getRowCount(table) }\n\t\t});\n\t}\n};\n\n//#endregion\nexport { rowPaginationFeature };","import { callMemoOrStaticFn, cloneState, copyInstancePropertiesWithoutMemos, hasOwn, makeObjectMap } from \"../../utils.js\";\n\n//#region src/features/row-selection/rowSelectionFeature.utils.ts\n/**\n* Creates the default row selection state.\n*\n* The feature default is an empty map, meaning no rows are selected. Reset APIs\n* use this value when `defaultState` is `true`.\n*\n* @example\n* ```ts\n* const selection = getDefaultRowSelectionState()\n* ```\n*/\nfunction getDefaultRowSelectionState() {\n\treturn makeObjectMap();\n}\n/**\n* Routes a row selection updater through the table's selection change handler.\n*\n* The updater may be a next selection map or a function of the previous map,\n* matching the instance `table.setRowSelection` behavior.\n*\n* @example\n* ```ts\n* table_setRowSelection(table, (old) => ({ ...old, [rowId]: true }))\n* ```\n*/\nfunction table_setRowSelection(table, updater) {\n\ttable.options.onRowSelectionChange?.(updater);\n}\n/**\n* Resets `rowSelection` to the configured initial state or feature default.\n*\n* With no argument, the reset clones `table.initialState.rowSelection` when it\n* exists. Passing `true` ignores initial state and resets to `{}`.\n*\n* @example\n* ```ts\n* table_resetRowSelection(table)\n* table_resetRowSelection(table, true)\n* ```\n*/\nfunction table_resetRowSelection(table, defaultState) {\n\ttable._lastSelectedRowId = null;\n\ttable_setRowSelection(table, defaultState ? makeObjectMap() : Object.assign(makeObjectMap(), cloneState(table.initialState.rowSelection ?? {})));\n}\n/**\n* Selects or deselects every selectable row before grouping.\n*\n* Omitting `value` toggles based on `table_getIsAllRowsSelected(table)`.\n* Selecting skips sub-rows whose ancestors block descent via\n* `enableSubRowSelection`. Deselecting removes matching selectable ids from the\n* existing selection map; rows that cannot be selected keep their selection\n* unless `opts.deselectAll` is `true`.\n*\n* @example\n* ```ts\n* table_toggleAllRowsSelected(table)\n* ```\n*/\nfunction table_toggleAllRowsSelected(table, value, opts) {\n\ttable._lastSelectedRowId = null;\n\ttable_setRowSelection(table, (old) => {\n\t\tvalue = typeof value !== \"undefined\" ? value : !callMemoOrStaticFn(table, \"getIsAllRowsSelected\", table_getIsAllRowsSelected);\n\t\tif (opts?.deselectAll && !value) return makeObjectMap();\n\t\tconst rowSelection = Object.assign(makeObjectMap(), old);\n\t\tconst preGroupedFlatRows = table.getPreGroupedRowModel().flatRows;\n\t\tif (value) {\n\t\t\tconst subtreeCache = /* @__PURE__ */ new Map();\n\t\t\tpreGroupedFlatRows.forEach((row) => {\n\t\t\t\tif (isRowSelectableInSelectAll(row, subtreeCache)) rowSelection[row.id] = true;\n\t\t\t});\n\t\t} else preGroupedFlatRows.forEach((row) => {\n\t\t\tif (row_getCanSelect(row)) delete rowSelection[row.id];\n\t\t});\n\t\treturn rowSelection;\n\t});\n}\n/**\n* Selects or deselects every selectable row on the current page.\n*\n* Omitting `value` toggles based on `table_getIsAllPageRowsSelected(table)`.\n* Child rows are included when sub-row selection allows it.\n*\n* @example\n* ```ts\n* table_toggleAllPageRowsSelected(table)\n* ```\n*/\nfunction table_toggleAllPageRowsSelected(table, value, opts) {\n\ttable._lastSelectedRowId = null;\n\ttable_setRowSelection(table, (old) => {\n\t\tconst resolvedValue = typeof value !== \"undefined\" ? value : !callMemoOrStaticFn(table, \"getIsAllPageRowsSelected\", table_getIsAllPageRowsSelected);\n\t\tif (opts?.deselectAll && !resolvedValue) return makeObjectMap();\n\t\tconst rowSelection = Object.assign(makeObjectMap(), old);\n\t\ttable.getRowModel().rows.forEach((row) => {\n\t\t\tmutateRowIsSelected(rowSelection, row.id, resolvedValue, true, table, true);\n\t\t});\n\t\treturn rowSelection;\n\t});\n}\n/**\n* Reads the row model before row selection is projected into selected rows.\n*\n* Selection does not alter the base row pipeline, so this returns the core row\n* model.\n*\n* @example\n* ```ts\n* const rowsBeforeSelection = table_getPreSelectedRowModel(table)\n* ```\n*/\nfunction table_getPreSelectedRowModel(table) {\n\treturn table.getCoreRowModel();\n}\n/**\n* Builds a row model containing selected rows from the core row model.\n*\n* If no row ids are selected, an empty row model is returned without walking\n* the rows.\n*\n* @example\n* ```ts\n* const selectedRows = table_getSelectedRowModel(table)\n* ```\n*/\nfunction table_getSelectedRowModel(table) {\n\tconst rowModel = table.getCoreRowModel();\n\tif (!callMemoOrStaticFn(table, \"getIsSomeRowsSelected\", table_getIsSomeRowsSelected)) return {\n\t\trows: [],\n\t\tflatRows: [],\n\t\trowsById: makeObjectMap()\n\t};\n\treturn selectRowsFn(rowModel, table);\n}\n/**\n* Builds a row model containing selected rows from the filtered row model.\n*\n* If no row ids are selected, an empty row model is returned without walking\n* the rows.\n*\n* @example\n* ```ts\n* const selectedRows = table_getFilteredSelectedRowModel(table)\n* ```\n*/\nfunction table_getFilteredSelectedRowModel(table) {\n\tconst rowModel = table.getFilteredRowModel();\n\tif (!callMemoOrStaticFn(table, \"getIsSomeRowsSelected\", table_getIsSomeRowsSelected)) return {\n\t\trows: [],\n\t\tflatRows: [],\n\t\trowsById: makeObjectMap()\n\t};\n\treturn selectRowsFn(rowModel, table);\n}\n/**\n* Builds a row model containing selected rows from the grouped row model.\n*\n* If no row ids are selected, an empty row model is returned without walking\n* the rows.\n*\n* @example\n* ```ts\n* const selectedRows = table_getGroupedSelectedRowModel(table)\n* ```\n*/\nfunction table_getGroupedSelectedRowModel(table) {\n\tconst rowModel = table.getSortedRowModel();\n\tif (!callMemoOrStaticFn(table, \"getIsSomeRowsSelected\", table_getIsSomeRowsSelected)) return {\n\t\trows: [],\n\t\tflatRows: [],\n\t\trowsById: makeObjectMap()\n\t};\n\treturn selectRowsFn(rowModel, table);\n}\n/**\n* Returns the ids of all selected rows.\n*\n* @example\n* ```ts\n* const selectedRowIds = table_getSelectedRowIds(table)\n* ```\n*/\nfunction table_getSelectedRowIds(table) {\n\treturn Object.keys(table.atoms.rowSelection?.get() ?? {});\n}\n/**\n* Checks whether every selectable filtered row is selected.\n*\n* The result is false when there are no filtered rows or when selection state is\n* empty. Sub-rows whose ancestors block descent via `enableSubRowSelection` are\n* ignored, matching the rows that `table_toggleAllRowsSelected` selects.\n*\n* @example\n* ```ts\n* const allSelected = table_getIsAllRowsSelected(table)\n* ```\n*/\nfunction table_getIsAllRowsSelected(table) {\n\tconst preGroupedFlatRows = table.getFilteredRowModel().flatRows;\n\tconst rowSelection = table.atoms.rowSelection?.get() ?? {};\n\tlet isAllRowsSelected = Boolean(preGroupedFlatRows.length && Object.keys(rowSelection).length);\n\tif (isAllRowsSelected) {\n\t\tconst subtreeCache = /* @__PURE__ */ new Map();\n\t\tif (preGroupedFlatRows.some((row) => !isRowSelected(row, rowSelection) && isRowSelectableInSelectAll(row, subtreeCache))) isAllRowsSelected = false;\n\t}\n\treturn isAllRowsSelected;\n}\n/**\n* Checks whether every selectable row on the current page is selected.\n*\n* Non-selectable rows are ignored for this calculation, as are sub-rows whose\n* ancestors block descent via `enableSubRowSelection`.\n*\n* @example\n* ```ts\n* const allPageRowsSelected = table_getIsAllPageRowsSelected(table)\n* ```\n*/\nfunction table_getIsAllPageRowsSelected(table) {\n\tconst paginationFlatRows = table.getPaginatedRowModel().flatRows;\n\tconst rowSelection = table.atoms.rowSelection?.get() ?? {};\n\tconst subtreeCache = /* @__PURE__ */ new Map();\n\tlet sawSelectableRow = false;\n\tfor (let i = 0; i < paginationFlatRows.length; i++) {\n\t\tconst row = paginationFlatRows[i];\n\t\tif (!isRowSelected(row, rowSelection)) {\n\t\t\tif (isRowSelectableInSelectAll(row, subtreeCache)) return false;\n\t\t} else if (!sawSelectableRow && isRowSelectableInSelectAll(row, subtreeCache)) sawSelectableRow = true;\n\t}\n\treturn sawSelectableRow;\n}\n/**\n* Checks whether at least one row id is selected.\n*\n* The result stays true when every row is selected.\n*\n* @example\n* ```ts\n* const someRowsSelected = table_getIsSomeRowsSelected(table)\n* ```\n*/\nfunction table_getIsSomeRowsSelected(table) {\n\treturn callMemoOrStaticFn(table, \"getSelectedRowIds\", table_getSelectedRowIds).length > 0;\n}\n/**\n* Checks whether at least one selectable row on the current page is selected.\n*\n* @example\n* ```ts\n* const somePageRowsSelected = table_getIsSomePageRowsSelected(table)\n* ```\n*/\nfunction table_getIsSomePageRowsSelected(table) {\n\treturn table.getPaginatedRowModel().flatRows.filter((row) => row_getCanSelect(row)).some((row) => row_getIsSelected(row) || callMemoOrStaticFn(row, \"getIsSomeSelected\", row_getIsSomeSelected));\n}\n/**\n* Creates a checkbox-style handler that selects or deselects all rows.\n*\n* The handler reads `event.target.checked`, so it is intended for controls whose\n* checked state means \"all rows selected\".\n*\n* @example\n* ```ts\n* const onChange = table_getToggleAllRowsSelectedHandler(table)\n* ```\n*/\nfunction table_getToggleAllRowsSelectedHandler(table) {\n\treturn (e) => {\n\t\ttable_toggleAllRowsSelected(table, e.target.checked);\n\t};\n}\n/**\n* Creates a checkbox-style handler that selects or deselects current page rows.\n*\n* The handler reads `event.target.checked`, so it is intended for controls whose\n* checked state means \"all page rows selected\".\n*\n* @example\n* ```ts\n* const onChange = table_getToggleAllPageRowsSelectedHandler(table)\n* ```\n*/\nfunction table_getToggleAllPageRowsSelectedHandler(table) {\n\treturn (e) => {\n\t\ttable_toggleAllPageRowsSelected(table, e.target.checked);\n\t};\n}\n/**\n* Selects or deselects this row.\n*\n* Omitting `value` toggles the row. Child rows are selected recursively unless\n* `opts.selectChildren` is `false`, sub-row selection is disabled, or the row\n* only supports single selection. Pass `deselectParents: true` to also remove\n* ancestor row ids from the selection when this row is deselected.\n*\n* @example\n* ```ts\n* row_toggleSelected(row)\n* row_toggleSelected(row, true)\n* row_toggleSelected(row, false)\n* row_toggleSelected(row, true, { selectChildren: false })\n* row_toggleSelected(row, false, { deselectParents: true })\n* ```\n*/\nfunction row_toggleSelected(row, value, opts) {\n\tconst isSelected = row_getIsSelected(row);\n\ttable_setRowSelection(row.table, (old) => {\n\t\tvalue = typeof value !== \"undefined\" ? value : !isSelected;\n\t\tconst rowSelection = Object.assign(makeObjectMap(), old);\n\t\tmutateRowIsSelected(rowSelection, row.id, value, (opts?.selectChildren ?? true) && row_getCanMultiSelect(row), row.table);\n\t\tif (!value && opts?.deselectParents) pruneAncestorRowIds(rowSelection, row);\n\t\treturn rowSelection;\n\t});\n}\n/**\n* Checks whether this row id is selected in `state.rowSelection`.\n*\n* Missing row ids are treated as not selected.\n*\n* @example\n* ```ts\n* const selected = row_getIsSelected(row)\n* ```\n*/\nfunction row_getIsSelected(row) {\n\treturn isRowSelected(row, row.table.atoms.rowSelection?.get() ?? {});\n}\n/**\n* Checks whether some, but not all, selectable descendants are selected.\n*\n* This supports indeterminate selection UI for parent rows.\n*\n* @example\n* ```ts\n* const partial = row_getIsSomeSelected(row)\n* ```\n*/\nfunction row_getIsSomeSelected(row) {\n\treturn isSubRowSelected(row) === \"some\";\n}\n/**\n* Checks whether all selectable descendants are selected.\n*\n* Rows without selectable descendants return false.\n*\n* @example\n* ```ts\n* const allChildrenSelected = row_getIsAllSubRowsSelected(row)\n* ```\n*/\nfunction row_getIsAllSubRowsSelected(row) {\n\treturn isSubRowSelected(row) === \"all\";\n}\n/**\n* Checks whether this row can be selected.\n*\n* `options.enableRowSelection` may be a boolean or a row predicate; it defaults\n* to `true`.\n*\n* @example\n* ```ts\n* const canSelect = row_getCanSelect(row)\n* ```\n*/\nfunction row_getCanSelect(row) {\n\tconst options = row.table.options;\n\tif (typeof options.enableRowSelection === \"function\") return options.enableRowSelection(row);\n\treturn options.enableRowSelection ?? true;\n}\n/**\n* Checks whether selecting this row should also select its subRows.\n*\n* `options.enableSubRowSelection` may be a boolean or a row predicate; it\n* defaults to `true`.\n*\n* @example\n* ```ts\n* const canSelectChildren = row_getCanSelectSubRows(row)\n* ```\n*/\nfunction row_getCanSelectSubRows(row) {\n\tconst options = row.table.options;\n\tif (typeof options.enableSubRowSelection === \"function\") return options.enableSubRowSelection(row);\n\treturn options.enableSubRowSelection ?? true;\n}\n/**\n* Checks whether this row can be selected alongside other rows.\n*\n* `options.enableMultiRowSelection` may be a boolean or a row predicate; it\n* defaults to `true`.\n*\n* @example\n* ```ts\n* const canMultiSelect = row_getCanMultiSelect(row)\n* ```\n*/\nfunction row_getCanMultiSelect(row) {\n\tconst options = row.table.options;\n\tif (typeof options.enableMultiRowSelection === \"function\") return options.enableMultiRowSelection(row);\n\treturn options.enableMultiRowSelection ?? true;\n}\n/**\n* Creates a checkbox-style handler that selects or deselects this row.\n*\n* The handler is a no-op when the row cannot be selected and reads\n* `event.target.checked`. Shift events select or deselect the inclusive range\n* from the most recent selectable row handled by this table. Pass\n* `selectChildren: false` to limit changes to rows explicitly present in the\n* display-order interval, and `deselectParents: true` to remove ancestor row\n* ids from the selection when rows are deselected.\n*\n* @example\n* ```ts\n* const onChange = row_getToggleSelectedHandler(row)\n* ```\n*/\nfunction row_getToggleSelectedHandler(row, opts) {\n\tconst canSelect = row_getCanSelect(row);\n\treturn (e) => {\n\t\tif (!canSelect) return;\n\t\tconst event = e;\n\t\tconst table = row.table;\n\t\tconst checked = event.target.checked;\n\t\tconst anchorId = table._lastSelectedRowId;\n\t\tif (!(table.options.enableRowRangeSelection !== false && anchorId !== null && row_getCanMultiSelect(row) && (table.options.isRowRangeSelectionEvent?.(e) ?? false)) || !selectRowRange(row, anchorId, checked, opts)) row_toggleSelected(row, checked, opts);\n\t\ttable._lastSelectedRowId = row.id;\n\t};\n}\n/**\n* Resolves and mutates an inclusive interval in the table's latest logical\n* display order.\n*\n* The anchor is resolved without throwing from the pre-pagination row model,\n* then the core row model. Both endpoint display indexes must still identify\n* those rows in the current order and both endpoints must support\n* multi-selection. Eligible interval rows are applied through one row\n* selection updater; non-selectable and non-multi-selectable rows are skipped.\n* Returns `false` when the interaction should fall back to an ordinary toggle.\n*/\nfunction selectRowRange(row, anchorId, value, opts) {\n\tconst includeChildren = opts?.selectChildren ?? true;\n\tconst table = row.table;\n\tconst rows = table.getRowsInDisplayOrder();\n\tconst anchorRow = table.getPrePaginatedRowModel().rowsById[anchorId] ?? table.getCoreRowModel().rowsById[anchorId];\n\tif (!anchorRow) return false;\n\tconst anchorIndex = anchorRow.getDisplayIndex();\n\tconst rowIndex = row.getDisplayIndex();\n\tconst anchorAtIndex = rows[anchorIndex];\n\tconst rowAtIndex = rows[rowIndex];\n\tif (anchorIndex < 0 || rowIndex < 0 || anchorIndex >= rows.length || rowIndex >= rows.length || anchorAtIndex?.id !== anchorRow.id || rowAtIndex?.id !== row.id || !row_getCanMultiSelect(anchorRow) || !row_getCanMultiSelect(row)) return false;\n\tconst start = Math.min(anchorIndex, rowIndex);\n\tconst end = Math.max(anchorIndex, rowIndex);\n\ttable_setRowSelection(table, (old) => {\n\t\tconst rowSelection = Object.assign(makeObjectMap(), old);\n\t\tfor (let index = start; index <= end; index++) {\n\t\t\tconst rangeRow = rows[index];\n\t\t\tif (!row_getCanSelect(rangeRow) || !row_getCanMultiSelect(rangeRow)) continue;\n\t\t\tmutateRowIsSelected(rowSelection, rangeRow.id, value, includeChildren, table);\n\t\t\tif (!value && opts?.deselectParents) pruneAncestorRowIds(rowSelection, rangeRow);\n\t\t}\n\t\treturn rowSelection;\n\t});\n\treturn true;\n}\nfunction mutateRowIsSelected(rowSelection, rowId, value, includeChildren, table, respectCanSelectOnDeselect) {\n\tconst row = table.getRow(rowId, true);\n\tif (value) {\n\t\tif (!row_getCanMultiSelect(row)) Object.keys(rowSelection).forEach((key) => delete rowSelection[key]);\n\t\tif (row_getCanSelect(row)) rowSelection[rowId] = true;\n\t} else if (!respectCanSelectOnDeselect || row_getCanSelect(row)) delete rowSelection[rowId];\n\tif (includeChildren && row.subRows.length && row_getCanSelectSubRows(row)) row.subRows.forEach((r) => mutateRowIsSelected(rowSelection, r.id, value, includeChildren, table, respectCanSelectOnDeselect));\n}\n/**\n* Returns whether a select-all cascade can reach this row: the row itself is\n* selectable and no ancestor blocks descent via `enableSubRowSelection`.\n*\n* `subtreeCache` memoizes the per-ancestor verdict for one select-all pass, so\n* ancestor chains shared by sibling rows are only walked (and the\n* `enableSubRowSelection` predicate only invoked) once per unique ancestor.\n*/\nfunction isRowSelectableInSelectAll(row, subtreeCache) {\n\tif (!row_getCanSelect(row)) return false;\n\tconst table = row.table;\n\tif (table.options.enableSubRowSelection === true) return true;\n\tconst parentId = row.parentId;\n\tif (parentId === void 0) return true;\n\tconst cached = subtreeCache.get(parentId);\n\tif (cached !== void 0) return cached;\n\tconst rowsById = table.getCoreRowModel().rowsById;\n\tconst visited = [];\n\tlet selectable = true;\n\tlet currentId = parentId;\n\twhile (currentId !== void 0) {\n\t\tconst known = subtreeCache.get(currentId);\n\t\tif (known !== void 0) {\n\t\t\tselectable = known;\n\t\t\tbreak;\n\t\t}\n\t\tvisited.push(currentId);\n\t\tconst parent = rowsById[currentId] ?? table.getRow(currentId, true);\n\t\tif (!row_getCanSelectSubRows(parent)) {\n\t\t\tselectable = false;\n\t\t\tbreak;\n\t\t}\n\t\tcurrentId = parent.parentId;\n\t}\n\tvisited.forEach((id) => subtreeCache.set(id, selectable));\n\treturn selectable;\n}\nfunction pruneAncestorRowIds(rowSelection, row) {\n\tconst rowsById = row.table.getCoreRowModel().rowsById;\n\tlet parentId = row.parentId;\n\twhile (parentId !== void 0) {\n\t\tdelete rowSelection[parentId];\n\t\tparentId = (rowsById[parentId] ?? row.table.getRow(parentId, true)).parentId;\n\t}\n}\nfunction selectRowsRecursively(rows, rowSelection, selectedFlatRows, selectedRowsById) {\n\tconst result = [];\n\tfor (let i = 0; i < rows.length; i++) {\n\t\tconst row = rows[i];\n\t\tconst isSelected = isRowSelected(row, rowSelection);\n\t\tif (isSelected) {\n\t\t\tselectedFlatRows.push(row);\n\t\t\tselectedRowsById[row.id] = row;\n\t\t}\n\t\tif (row.subRows.length) {\n\t\t\tconst newSubRows = selectRowsRecursively(row.subRows, rowSelection, selectedFlatRows, selectedRowsById);\n\t\t\tif (isSelected) {\n\t\t\t\tconst cloned = Object.create(Object.getPrototypeOf(row));\n\t\t\t\tcopyInstancePropertiesWithoutMemos(cloned, row);\n\t\t\t\tcloned.subRows = newSubRows;\n\t\t\t\tresult.push(cloned);\n\t\t\t}\n\t\t} else if (isSelected) result.push(row);\n\t}\n\treturn result;\n}\n/**\n* Builds a row model containing rows selected by the current row selection state.\n*\n* The result is derived from the supplied row model, so selected ids absent from\n* that model are not materialized as rows.\n*\n* @example\n* ```ts\n* const selectedRows = selectRowsFn(rowModel)\n* ```\n*/\nfunction selectRowsFn(rowModel, table) {\n\tconst newSelectedFlatRows = [];\n\tconst newSelectedRowsById = makeObjectMap();\n\tconst rowSelection = table.atoms.rowSelection?.get() ?? {};\n\treturn {\n\t\trows: selectRowsRecursively(rowModel.rows, rowSelection, newSelectedFlatRows, newSelectedRowsById),\n\t\tflatRows: newSelectedFlatRows,\n\t\trowsById: newSelectedRowsById\n\t};\n}\n/**\n* Returns whether a row id is selected in the current row selection state.\n*\n* @example\n* ```ts\n* const selected = isRowSelected(row)\n* ```\n*/\nfunction isRowSelected(row, rowSelection) {\n\treturn !!(hasOwn(rowSelection, row.id) && rowSelection[row.id]);\n}\n/**\n* Returns whether all, some, or none of a row's selectable descendants are selected.\n*\n* The result is used to drive indeterminate row selection UI.\n*\n* @example\n* ```ts\n* const selectedState = isSubRowSelected(row)\n* ```\n*/\nfunction isSubRowSelected(row) {\n\tif (!row.subRows.length) return false;\n\tconst rowSelection = row.table.atoms.rowSelection?.get() ?? {};\n\tlet someSelected = false;\n\tlet allChildrenSelected = true;\n\tlet someSelectable = false;\n\tfor (let i = 0; i < row.subRows.length; i++) {\n\t\tconst subRow = row.subRows[i];\n\t\tif (someSelected && !allChildrenSelected) break;\n\t\tif (row_getCanSelect(subRow)) {\n\t\t\tsomeSelectable = true;\n\t\t\tif (isRowSelected(subRow, rowSelection)) someSelected = true;\n\t\t\telse allChildrenSelected = false;\n\t\t}\n\t\tif (subRow.subRows.length) {\n\t\t\tconst subRowChildrenSelected = isSubRowSelected(subRow);\n\t\t\tif (subRowChildrenSelected === \"all\") {\n\t\t\t\tsomeSelected = true;\n\t\t\t\tsomeSelectable = true;\n\t\t\t} else if (subRowChildrenSelected === \"some\") {\n\t\t\t\tsomeSelected = true;\n\t\t\t\tallChildrenSelected = false;\n\t\t\t\tsomeSelectable = true;\n\t\t\t} else allChildrenSelected = false;\n\t\t}\n\t}\n\tif (!someSelectable) return false;\n\treturn allChildrenSelected ? \"all\" : someSelected ? \"some\" : false;\n}\n\n//#endregion\nexport { getDefaultRowSelectionState, isRowSelected, isSubRowSelected, row_getCanMultiSelect, row_getCanSelect, row_getCanSelectSubRows, row_getIsAllSubRowsSelected, row_getIsSelected, row_getIsSomeSelected, row_getToggleSelectedHandler, row_toggleSelected, selectRowsFn, table_getFilteredSelectedRowModel, table_getGroupedSelectedRowModel, table_getIsAllPageRowsSelected, table_getIsAllRowsSelected, table_getIsSomePageRowsSelected, table_getIsSomeRowsSelected, table_getPreSelectedRowModel, table_getSelectedRowIds, table_getSelectedRowModel, table_getToggleAllPageRowsSelectedHandler, table_getToggleAllRowsSelectedHandler, table_resetRowSelection, table_setRowSelection, table_toggleAllPageRowsSelected, table_toggleAllRowsSelected };","import { assignPrototypeAPIs, assignTableAPIs, makeStateUpdater } from \"../../utils.js\";\nimport { getDefaultRowSelectionState, row_getCanMultiSelect, row_getCanSelect, row_getCanSelectSubRows, row_getIsAllSubRowsSelected, row_getIsSelected, row_getIsSomeSelected, row_getToggleSelectedHandler, row_toggleSelected, table_getFilteredSelectedRowModel, table_getGroupedSelectedRowModel, table_getIsAllPageRowsSelected, table_getIsAllRowsSelected, table_getIsSomePageRowsSelected, table_getIsSomeRowsSelected, table_getPreSelectedRowModel, table_getSelectedRowIds, table_getSelectedRowModel, table_getToggleAllPageRowsSelectedHandler, table_getToggleAllRowsSelectedHandler, table_resetRowSelection, table_setRowSelection, table_toggleAllPageRowsSelected, table_toggleAllRowsSelected } from \"./rowSelectionFeature.utils.js\";\n\n//#region src/features/row-selection/rowSelectionFeature.ts\n/**\n* Feature that adds row selection state and APIs for row and page selection.\n*/\nconst rowSelectionFeature = {\n\tinitTableInstanceData: (table) => {\n\t\ttable._lastSelectedRowId = null;\n\t},\n\tresetTableInstanceData: (table) => {\n\t\ttable._lastSelectedRowId = null;\n\t},\n\tgetInitialState: (initialState) => {\n\t\treturn {\n\t\t\trowSelection: getDefaultRowSelectionState(),\n\t\t\t...initialState\n\t\t};\n\t},\n\tgetDefaultTableOptions: (table) => {\n\t\treturn {\n\t\t\tonRowSelectionChange: makeStateUpdater(\"rowSelection\", table),\n\t\t\tenableRowSelection: true,\n\t\t\tenableMultiRowSelection: true,\n\t\t\tenableRowRangeSelection: true,\n\t\t\tenableSubRowSelection: true,\n\t\t\tisRowRangeSelectionEvent: (event) => {\n\t\t\t\tconst rangeEvent = event;\n\t\t\t\treturn Boolean(rangeEvent.shiftKey || rangeEvent.nativeEvent?.shiftKey);\n\t\t\t}\n\t\t};\n\t},\n\tassignRowPrototype: (prototype, table) => {\n\t\tassignPrototypeAPIs(\"rowSelectionFeature\", prototype, table, {\n\t\t\trow_toggleSelected: { fn: (row, value, opts) => row_toggleSelected(row, value, opts) },\n\t\t\trow_getIsSelected: { fn: (row) => row_getIsSelected(row) },\n\t\t\trow_getIsSomeSelected: {\n\t\t\t\tfn: (row) => row_getIsSomeSelected(row),\n\t\t\t\tmemoDeps: (row) => [\n\t\t\t\t\trow.subRows,\n\t\t\t\t\trow.table.atoms.rowSelection?.get(),\n\t\t\t\t\trow.table.options.enableRowSelection\n\t\t\t\t]\n\t\t\t},\n\t\t\trow_getIsAllSubRowsSelected: {\n\t\t\t\tfn: (row) => row_getIsAllSubRowsSelected(row),\n\t\t\t\tmemoDeps: (row) => [\n\t\t\t\t\trow.subRows,\n\t\t\t\t\trow.table.atoms.rowSelection?.get(),\n\t\t\t\t\trow.table.options.enableRowSelection\n\t\t\t\t]\n\t\t\t},\n\t\t\trow_getCanSelect: { fn: (row) => row_getCanSelect(row) },\n\t\t\trow_getCanSelectSubRows: { fn: (row) => row_getCanSelectSubRows(row) },\n\t\t\trow_getCanMultiSelect: { fn: (row) => row_getCanMultiSelect(row) },\n\t\t\trow_getToggleSelectedHandler: { fn: (row, opts) => row_getToggleSelectedHandler(row, opts) }\n\t\t});\n\t},\n\tconstructTableAPIs: (table) => {\n\t\tassignTableAPIs(\"rowSelectionFeature\", table, {\n\t\t\ttable_setRowSelection: { fn: (updater) => table_setRowSelection(table, updater) },\n\t\t\ttable_resetRowSelection: { fn: (defaultState) => table_resetRowSelection(table, defaultState) },\n\t\t\ttable_toggleAllRowsSelected: { fn: (value, opts) => table_toggleAllRowsSelected(table, value, opts) },\n\t\t\ttable_toggleAllPageRowsSelected: { fn: (value, opts) => table_toggleAllPageRowsSelected(table, value, opts) },\n\t\t\ttable_getPreSelectedRowModel: { fn: () => table_getPreSelectedRowModel(table) },\n\t\t\ttable_getSelectedRowModel: {\n\t\t\t\tfn: () => table_getSelectedRowModel(table),\n\t\t\t\tmemoDeps: () => [table.atoms.rowSelection?.get(), table.getCoreRowModel()]\n\t\t\t},\n\t\t\ttable_getFilteredSelectedRowModel: {\n\t\t\t\tfn: () => table_getFilteredSelectedRowModel(table),\n\t\t\t\tmemoDeps: () => [table.atoms.rowSelection?.get(), table.getFilteredRowModel()]\n\t\t\t},\n\t\t\ttable_getGroupedSelectedRowModel: {\n\t\t\t\tfn: () => table_getGroupedSelectedRowModel(table),\n\t\t\t\tmemoDeps: () => [table.atoms.rowSelection?.get(), table.getSortedRowModel()]\n\t\t\t},\n\t\t\ttable_getSelectedRowIds: {\n\t\t\t\tfn: () => table_getSelectedRowIds(table),\n\t\t\t\tmemoDeps: () => [table.atoms.rowSelection?.get()]\n\t\t\t},\n\t\t\ttable_getIsAllRowsSelected: {\n\t\t\t\tfn: () => table_getIsAllRowsSelected(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.atoms.rowSelection?.get(),\n\t\t\t\t\ttable.getFilteredRowModel(),\n\t\t\t\t\ttable.options.enableRowSelection,\n\t\t\t\t\ttable.options.enableSubRowSelection\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_getIsAllPageRowsSelected: {\n\t\t\t\tfn: () => table_getIsAllPageRowsSelected(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.atoms.rowSelection?.get(),\n\t\t\t\t\ttable.getPaginatedRowModel(),\n\t\t\t\t\ttable.options.enableRowSelection,\n\t\t\t\t\ttable.options.enableSubRowSelection\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_getIsSomeRowsSelected: {\n\t\t\t\tfn: () => table_getIsSomeRowsSelected(table),\n\t\t\t\tmemoDeps: () => [table.atoms.rowSelection?.get()]\n\t\t\t},\n\t\t\ttable_getIsSomePageRowsSelected: {\n\t\t\t\tfn: () => table_getIsSomePageRowsSelected(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.atoms.rowSelection?.get(),\n\t\t\t\t\ttable.getPaginatedRowModel(),\n\t\t\t\t\ttable.options.enableRowSelection\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_getToggleAllRowsSelectedHandler: { fn: () => table_getToggleAllRowsSelectedHandler(table) },\n\t\t\ttable_getToggleAllPageRowsSelectedHandler: { fn: () => table_getToggleAllPageRowsSelectedHandler(table) }\n\t\t});\n\t}\n};\n\n//#endregion\nexport { rowSelectionFeature };","//#region src/features/row-sorting/sortFns.ts\n/**\n* Regular expression used to split mixed text and numeric chunks.\n*\n* The alphanumeric sort functions use these chunks for natural sorting of\n* strings like `item2` before `item10`.\n*/\nconst reSplitAlphaNumeric = /([0-9]+)/gm;\n/**\n* Builds a `SortFn` from a value-level comparator plus an optional\n* `resolveDataValue` normalizer.\n*\n* The `sort` comparator receives both rows' data values, each already passed\n* through `resolveDataValue` when one is defined. Keeping normalization in the\n* resolver means a variant of an existing sorting function only has to swap\n* the resolver, not re-implement the comparison.\n*\n* The definition is attached to the returned function, so a variant can be\n* created by spreading a built-in sorting function and overriding what\n* differs:\n*\n* ```ts\n* const stripDiacritics = (value: string) =>\n* value.normalize('NFD').replace(/\\p{Diacritic}/gu, '')\n*\n* const alphanumericIgnoreDiacritics = constructSortFn({\n* ...sortFn_alphanumeric,\n* resolveDataValue: (value) =>\n* stripDiacritics(sortFn_alphanumeric.resolveDataValue!(value)),\n* })\n* ```\n*/\n/* @__NO_SIDE_EFFECTS__ */\nfunction constructSortFn(def) {\n\tconst sortFn = Object.assign((rowA, rowB, columnId) => {\n\t\tlet dataValueA = rowA.getValue(columnId);\n\t\tlet dataValueB = rowB.getValue(columnId);\n\t\tconst resolveDataValue = sortFn.resolveDataValue;\n\t\tif (resolveDataValue) {\n\t\t\tdataValueA = resolveDataValue(dataValueA);\n\t\t\tdataValueB = resolveDataValue(dataValueB);\n\t\t}\n\t\treturn sortFn.sort(dataValueA, dataValueB, rowA, rowB, columnId);\n\t}, def);\n\treturn sortFn;\n}\n/**\n* Sorts rows with the built-in alphanumeric strategy.\n*\n* This comparator returns ascending-order results; descending order is applied by the sorting row model.\n*/\nconst sortFn_alphanumeric = /* @__PURE__ */ constructSortFn({\n\tresolveDataValue: (dataValue) => toString(dataValue).toLowerCase(),\n\tsort: (dataValueA, dataValueB) => compareAlphanumeric(dataValueA, dataValueB)\n});\n/**\n* Sorts rows with the built-in alphanumeric case sensitive strategy.\n*\n* This comparator returns ascending-order results; descending order is applied by the sorting row model.\n*/\nconst sortFn_alphanumericCaseSensitive = /* @__PURE__ */ constructSortFn({\n\tresolveDataValue: (dataValue) => toString(dataValue),\n\tsort: (dataValueA, dataValueB) => compareAlphanumeric(dataValueA, dataValueB)\n});\n/**\n* Sorts rows with the built-in text strategy.\n*\n* This comparator returns ascending-order results; descending order is applied by the sorting row model.\n*/\nconst sortFn_text = /* @__PURE__ */ constructSortFn({\n\tresolveDataValue: (dataValue) => toString(dataValue).toLowerCase(),\n\tsort: (dataValueA, dataValueB) => compareBasic(dataValueA, dataValueB)\n});\n/**\n* Sorts rows with the built-in text case sensitive strategy.\n*\n* This comparator returns ascending-order results; descending order is applied by the sorting row model.\n*/\nconst sortFn_textCaseSensitive = /* @__PURE__ */ constructSortFn({\n\tresolveDataValue: (dataValue) => toString(dataValue),\n\tsort: (dataValueA, dataValueB) => compareBasic(dataValueA, dataValueB)\n});\n/**\n* Sorts rows with the built-in datetime strategy.\n*\n* This comparator returns ascending-order results; descending order is applied by the sorting row model.\n*/\nconst sortFn_datetime = /* @__PURE__ */ constructSortFn({\n\tresolveDataValue: (dataValue) => toDateSortValue(dataValue),\n\tsort: (dataValueA, dataValueB) => dataValueA > dataValueB ? 1 : dataValueA < dataValueB ? -1 : 0\n});\n/**\n* Sorts rows with the built-in basic strategy.\n*\n* This comparator returns ascending-order results; descending order is applied by the sorting row model.\n*/\nconst sortFn_basic = /* @__PURE__ */ constructSortFn({ sort: (dataValueA, dataValueB) => compareBasic(dataValueA, dataValueB) });\nfunction compareBasic(a, b) {\n\treturn a === b ? 0 : a > b ? 1 : -1;\n}\nfunction toDateSortValue(value) {\n\treturn value instanceof Date ? value.getTime() : value;\n}\nfunction toString(a) {\n\tif (typeof a === \"number\") {\n\t\tif (isNaN(a) || a === Infinity || a === -Infinity) return \"\";\n\t\treturn String(a);\n\t}\n\tif (typeof a === \"string\") return a;\n\treturn \"\";\n}\nfunction compareAlphanumeric(aStr, bStr) {\n\tlet ai = 0;\n\tlet bi = 0;\n\tconst aLen = aStr.length;\n\tconst bLen = bStr.length;\n\twhile (ai < aLen && bi < bLen) {\n\t\tconst aIsNumeric = isDigit(aStr.charCodeAt(ai));\n\t\tconst bIsNumeric = isDigit(bStr.charCodeAt(bi));\n\t\tconst aEnd = findChunkEnd(aStr, ai, aIsNumeric);\n\t\tconst bEnd = findChunkEnd(bStr, bi, bIsNumeric);\n\t\tif (!aIsNumeric && !bIsNumeric) {\n\t\t\tconst stringComparison = compareStringChunks(aStr, ai, aEnd, bStr, bi, bEnd);\n\t\t\tif (stringComparison) return stringComparison;\n\t\t\tai = aEnd;\n\t\t\tbi = bEnd;\n\t\t\tcontinue;\n\t\t}\n\t\tif (aIsNumeric !== bIsNumeric) return aIsNumeric ? 1 : -1;\n\t\tconst numericComparison = compareNumericChunks(aStr, ai, aEnd, bStr, bi, bEnd);\n\t\tif (numericComparison) return numericComparison;\n\t\tai = aEnd;\n\t\tbi = bEnd;\n\t}\n\treturn countRemainingChunks(aStr, ai) - countRemainingChunks(bStr, bi);\n}\nfunction isDigit(charCode) {\n\treturn charCode >= 48 && charCode <= 57;\n}\nfunction findChunkEnd(str, start, isNumeric) {\n\tlet end = start + 1;\n\twhile (end < str.length && isDigit(str.charCodeAt(end)) === isNumeric) end++;\n\treturn end;\n}\nfunction compareStringChunks(aStr, aStart, aEnd, bStr, bStart, bEnd) {\n\tconst aLength = aEnd - aStart;\n\tconst bLength = bEnd - bStart;\n\tconst minLength = aLength < bLength ? aLength : bLength;\n\tfor (let i = 0; i < minLength; i++) {\n\t\tconst aCode = aStr.charCodeAt(aStart + i);\n\t\tconst bCode = bStr.charCodeAt(bStart + i);\n\t\tif (aCode > bCode) return 1;\n\t\tif (bCode > aCode) return -1;\n\t}\n\tif (aLength > bLength) return 1;\n\tif (bLength > aLength) return -1;\n\treturn 0;\n}\nfunction compareNumericChunks(aStr, aStart, aEnd, bStr, bStart, bEnd) {\n\tlet aSignificantStart = aStart;\n\twhile (aSignificantStart < aEnd && aStr.charCodeAt(aSignificantStart) === 48) aSignificantStart++;\n\tlet bSignificantStart = bStart;\n\twhile (bSignificantStart < bEnd && bStr.charCodeAt(bSignificantStart) === 48) bSignificantStart++;\n\tconst aSignificantLength = aEnd - aSignificantStart;\n\tconst bSignificantLength = bEnd - bSignificantStart;\n\tif (aSignificantLength === 0 && bSignificantLength === 0) return 0;\n\tif (aSignificantLength <= 15 && bSignificantLength <= 15) {\n\t\tconst an = parseSmallInt(aStr, aSignificantStart, aEnd);\n\t\tconst bn = parseSmallInt(bStr, bSignificantStart, bEnd);\n\t\tif (an > bn) return 1;\n\t\tif (bn > an) return -1;\n\t\treturn 0;\n\t}\n\tconst an = parseInt(aStr.slice(aStart, aEnd), 10);\n\tconst bn = parseInt(bStr.slice(bStart, bEnd), 10);\n\tif (an > bn) return 1;\n\tif (bn > an) return -1;\n\treturn 0;\n}\nfunction parseSmallInt(str, start, end) {\n\tlet result = 0;\n\tfor (let i = start; i < end; i++) result = result * 10 + str.charCodeAt(i) - 48;\n\treturn result;\n}\nfunction countRemainingChunks(str, start) {\n\tlet count = 0;\n\tlet index = start;\n\twhile (index < str.length) {\n\t\tcount++;\n\t\tindex = findChunkEnd(str, index, isDigit(str.charCodeAt(index)));\n\t}\n\treturn count;\n}\n/**\n* The built-in sorting function registry.\n*\n* Registering this full object opts out of tree-shaking: every built-in\n* sorting function ends up in your bundle. Prefer importing the `sortFn_*`\n* functions you actually use and registering just those in the `sortFns`\n* slot, or passing them directly to the `sortFn` column option.\n*\n* @deprecated Import individual `sortFn_*` functions instead for a smaller\n* bundle. This export still works and is not going away in v9, but built-in\n* name resolution (including `sortFn: 'auto'`) only finds functions you\n* register yourself.\n*/\nconst sortFns = {\n\talphanumeric: sortFn_alphanumeric,\n\talphanumericCaseSensitive: sortFn_alphanumericCaseSensitive,\n\tbasic: sortFn_basic,\n\tdatetime: sortFn_datetime,\n\ttext: sortFn_text,\n\ttextCaseSensitive: sortFn_textCaseSensitive\n};\n\n//#endregion\nexport { constructSortFn, reSplitAlphaNumeric, sortFn_alphanumeric, sortFn_alphanumericCaseSensitive, sortFn_basic, sortFn_datetime, sortFn_text, sortFn_textCaseSensitive, sortFns };","import { cloneState, isFunction, setStateSlice } from \"../../utils.js\";\nimport { reSplitAlphaNumeric, sortFn_basic } from \"./sortFns.js\";\n\n//#region src/features/row-sorting/rowSortingFeature.utils.ts\n/**\n* Creates the default sorting state.\n*\n* The feature default is an empty array, meaning no columns are sorted. Reset\n* APIs use this value when `defaultState` is `true`.\n*\n* @example\n* ```ts\n* const sorting = getDefaultSortingState()\n* ```\n*/\nfunction getDefaultSortingState() {\n\treturn [];\n}\n/**\n* Routes a sorting updater through the table's sorting change handler.\n*\n* The updater may be a next `SortingState` array or a function of the previous\n* sorting state, matching the instance `table.setSorting` behavior. State\n* owners receive an equality-guarded updater so structurally equal sorting\n* values preserve the owner's existing reference.\n*\n* @example\n* ```ts\n* table_setSorting(table, (old) => [...old, { id: 'age', desc: true }])\n* ```\n*/\nfunction table_setSorting(table, updater) {\n\tsetStateSlice(table, \"sorting\", updater);\n}\n/**\n* Resets `sorting` to the configured initial state or feature default.\n*\n* With no argument, the reset clones `table.initialState.sorting` when it\n* exists. Passing `true` ignores initial state and resets to `[]`.\n*\n* @example\n* ```ts\n* table_resetSorting(table)\n* table_resetSorting(table, true)\n* ```\n*/\nfunction table_resetSorting(table, defaultState) {\n\ttable_setSorting(table, defaultState ? [] : cloneState(table.initialState.sorting ?? []));\n}\n/**\n* Resets sorting after the table data changes when explicitly enabled.\n*\n* Unlike other auto-reset behaviors, sorting is preserved by default. An\n* explicit `autoResetAll` value takes precedence over `autoResetSorting`.\n*\n* @example\n* ```ts\n* table_autoResetSorting(table)\n* ```\n*/\nfunction table_autoResetSorting(table) {\n\tif (!table.atoms.sorting) return;\n\tif (table.options.autoResetAll ?? table.options.autoResetSorting ?? false) table_resetSorting(table);\n}\n/**\n* Chooses a built-in sorting function from sampled filtered row values.\n*\n* Date-like values use `datetime`, mixed text/numeric strings use\n* `alphanumeric`, plain strings use `text`, and unknown values fall back to\n* `basic`.\n*\n* @example\n* ```ts\n* const sortFn = column_getAutoSortFn(column)\n* ```\n*/\nfunction column_getAutoSortFn(column) {\n\tconst sortFns = column.table._rowModelFns.sortFns;\n\tconst firstRows = column.table.getFilteredRowModel().flatRows.slice(0, 10);\n\tlet sortFnName;\n\tlet isString = false;\n\tfor (let i = 0; i < firstRows.length; i++) {\n\t\tconst value = firstRows[i].getValue(column.id);\n\t\tif (Object.prototype.toString.call(value) === \"[object Date]\") {\n\t\t\tsortFnName = \"datetime\";\n\t\t\tbreak;\n\t\t}\n\t\tif (typeof value === \"string\") {\n\t\t\tisString = true;\n\t\t\tif (value.split(reSplitAlphaNumeric).length > 1) {\n\t\t\t\tsortFnName = \"alphanumeric\";\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tif (!sortFnName && isString) sortFnName = \"text\";\n\tif (sortFnName) {\n\t\tlet sortFn = sortFns?.[sortFnName];\n\t\tif (!sortFn) {\n\t\t\tif (process.env.NODE_ENV === \"development\") console.warn(`sortFn '${sortFnName}' (auto) for column '${column.id}' is not registered`);\n\t\t\tif (sortFnName === \"alphanumeric\") sortFn = sortFns?.text;\n\t\t}\n\t\tif (sortFn) return sortFn;\n\t}\n\treturn sortFn_basic;\n}\n/**\n* Chooses the default first sort direction from sampled filtered row values.\n*\n* The first non-nullish value among the sampled rows decides: string columns\n* start ascending so alphabetical order is natural; other value types (or\n* columns with no non-nullish sample) start descending. Sampling past leading\n* nullish values keeps the toggle cycle stable when sorting or a data swap\n* moves an empty value into the first row.\n*\n* @example\n* ```ts\n* const direction = column_getAutoSortDir(column)\n* ```\n*/\nfunction column_getAutoSortDir(column) {\n\tconst firstRows = column.table.getFilteredRowModel().flatRows.slice(0, 10);\n\tfor (let i = 0; i < firstRows.length; i++) {\n\t\tconst value = firstRows[i].getValue(column.id);\n\t\tif (value == null) continue;\n\t\treturn typeof value === \"string\" ? \"asc\" : \"desc\";\n\t}\n\treturn \"desc\";\n}\n/**\n* Resolves the sorting function configured for a column.\n*\n* Function-valued `columnDef.sortFn` is returned directly, `'auto'` delegates\n* to `column_getAutoSortFn`, and string values are looked up in the table's\n* sorting function registry before falling back to `basic`.\n*\n* @example\n* ```ts\n* const sortFn = column_getSortFn(column)\n* ```\n*/\nfunction column_getSortFn(column) {\n\tconst sortFns = column.table._rowModelFns.sortFns;\n\tif (isFunction(column.columnDef.sortFn)) return column.columnDef.sortFn;\n\tif (column.columnDef.sortFn === \"auto\") return column_getAutoSortFn(column);\n\tconst sortFn = sortFns?.[column.columnDef.sortFn];\n\tif (process.env.NODE_ENV === \"development\" && !sortFn) console.warn(`sortFn '${String(column.columnDef.sortFn)}' for column '${column.id}' is not registered`);\n\treturn sortFn ?? sortFn_basic;\n}\n/**\n* Applies the next sorting state for this column.\n*\n* The toggle can add, replace, flip, or remove this column's sort entry. Multi\n* sorting respects `enableMultiSort`, `enableMultiRemove`,\n* `maxMultiSortColCount`, and the `multi` argument.\n*\n* @example\n* ```ts\n* column_toggleSorting(column, undefined, true)\n* ```\n*/\nfunction column_toggleSorting(column, desc, multi) {\n\tconst nextSortingOrder = column_getNextSortingOrder(column, multi && column_getCanMultiSort(column));\n\tconst hasManualValue = typeof desc !== \"undefined\";\n\ttable_setSorting(column.table, (old) => {\n\t\tconst existingIndex = old.findIndex((d) => d.id === column.id);\n\t\tconst existingSorting = existingIndex === -1 ? void 0 : old[existingIndex];\n\t\tlet newSorting = [];\n\t\tlet sortAction;\n\t\tconst nextDesc = hasManualValue ? desc : nextSortingOrder === \"desc\";\n\t\tconst isMultiMode = !!(old.length && column_getCanMultiSort(column) && multi);\n\t\tif (isMultiMode) {\n\t\t\tif (existingSorting) sortAction = \"toggle\";\n\t\t\telse sortAction = \"add\";\n\t\t} else if (existingSorting) sortAction = \"toggle\";\n\t\telse sortAction = \"replace\";\n\t\tif (sortAction === \"toggle\") {\n\t\t\tif (!hasManualValue) {\n\t\t\t\tif (!nextSortingOrder) sortAction = \"remove\";\n\t\t\t}\n\t\t}\n\t\tif (sortAction === \"add\") {\n\t\t\tnewSorting = [...old, {\n\t\t\t\tid: column.id,\n\t\t\t\tdesc: nextDesc\n\t\t\t}];\n\t\t\tnewSorting.splice(0, newSorting.length - (column.table.options.maxMultiSortColCount ?? Number.MAX_SAFE_INTEGER));\n\t\t} else if (sortAction === \"toggle\") newSorting = isMultiMode ? old.map((d) => {\n\t\t\tif (d.id === column.id) return {\n\t\t\t\t...d,\n\t\t\t\tdesc: nextDesc\n\t\t\t};\n\t\t\treturn d;\n\t\t}) : [{\n\t\t\tid: column.id,\n\t\t\tdesc: nextDesc\n\t\t}];\n\t\telse if (sortAction === \"remove\") newSorting = isMultiMode ? old.filter((d) => d.id !== column.id) : [];\n\t\telse newSorting = [{\n\t\t\tid: column.id,\n\t\t\tdesc: nextDesc\n\t\t}];\n\t\treturn newSorting;\n\t});\n}\n/**\n* Resolves the first direction used when this column begins sorting.\n*\n* Column-level `sortDescFirst` wins, then table-level `sortDescFirst`, then the\n* auto direction inferred from sampled values.\n*\n* @example\n* ```ts\n* const firstDirection = column_getFirstSortDir(column)\n* ```\n*/\nfunction column_getFirstSortDir(column) {\n\treturn column.columnDef.sortDescFirst ?? column.table.options.sortDescFirst ?? column_getAutoSortDir(column) === \"desc\" ? \"desc\" : \"asc\";\n}\n/**\n* Resolves the next sort order for this column's toggle cycle.\n*\n* The cycle starts with the first sort direction, flips between `asc` and\n* `desc`, and can return `false` when sorting removal is enabled.\n*\n* @example\n* ```ts\n* const nextOrder = column_getNextSortingOrder(column)\n* ```\n*/\nfunction column_getNextSortingOrder(column, multi) {\n\tconst firstSortDirection = column_getFirstSortDir(column);\n\tconst isSorted = column_getIsSorted(column);\n\tif (!isSorted) return firstSortDirection;\n\tif (isSorted !== firstSortDirection && (column.table.options.enableSortingRemoval ?? true) && (multi ? column.table.options.enableMultiRemove ?? true : true)) return false;\n\treturn isSorted === \"desc\" ? \"asc\" : \"desc\";\n}\n/**\n* Checks whether this accessor column can participate in sorting.\n*\n* The column must have an accessor and sorting must be enabled by both the\n* column definition and table options.\n*\n* @example\n* ```ts\n* const canSort = column_getCanSort(column)\n* ```\n*/\nfunction column_getCanSort(column) {\n\treturn (column.columnDef.enableSorting ?? true) && (column.table.options.enableSorting ?? true) && !!column.accessorFn;\n}\n/**\n* Checks whether this column can be added to a multi-sort state.\n*\n* Column-level `enableMultiSort` wins over table-level `enableMultiSort`; if\n* neither is set, accessor columns can multi-sort by default.\n*\n* @example\n* ```ts\n* const canMultiSort = column_getCanMultiSort(column)\n* ```\n*/\nfunction column_getCanMultiSort(column) {\n\treturn column.columnDef.enableMultiSort ?? column.table.options.enableMultiSort ?? !!column.accessorFn;\n}\n/**\n* Reads this column's current sort direction.\n*\n* The result is `false` when the column is not sorted, otherwise `'asc'` or\n* `'desc'` based on the column's entry in `state.sorting`.\n*\n* @example\n* ```ts\n* const direction = column_getIsSorted(column)\n* ```\n*/\nfunction column_getIsSorted(column) {\n\tconst columnSort = column.table.atoms.sorting?.get()?.find((d) => d.id === column.id);\n\treturn !columnSort ? false : columnSort.desc ? \"desc\" : \"asc\";\n}\n/**\n* Finds this column's position in the ordered `state.sorting` array.\n*\n* The result is `-1` when the column is not sorted.\n*\n* @example\n* ```ts\n* const index = column_getSortIndex(column)\n* ```\n*/\nfunction column_getSortIndex(column) {\n\treturn column.table.atoms.sorting?.get()?.findIndex((d) => d.id === column.id) ?? -1;\n}\n/**\n* Removes this column from the sorting state.\n*\n* Other sorted columns are preserved, including their relative order.\n*\n* @example\n* ```ts\n* column_clearSorting(column)\n* ```\n*/\nfunction column_clearSorting(column) {\n\ttable_setSorting(column.table, (old) => old.length ? old.filter((d) => d.id !== column.id) : []);\n}\n/**\n* Creates a header event handler that toggles this column's sorting.\n*\n* The handler ignores events when the column cannot sort, and asks\n* `options.isMultiSortEvent` whether the event should add to a multi-sort.\n*\n* @example\n* ```ts\n* const onClick = column_getToggleSortingHandler(column)\n* ```\n*/\nfunction column_getToggleSortingHandler(column) {\n\tconst canSort = column_getCanSort(column);\n\treturn (e) => {\n\t\tif (!canSort) return;\n\t\tcolumn_toggleSorting(column, void 0, column_getCanMultiSort(column) ? column.table.options.isMultiSortEvent?.(e) : false);\n\t};\n}\n\n//#endregion\nexport { column_clearSorting, column_getAutoSortDir, column_getAutoSortFn, column_getCanMultiSort, column_getCanSort, column_getFirstSortDir, column_getIsSorted, column_getNextSortingOrder, column_getSortFn, column_getSortIndex, column_getToggleSortingHandler, column_toggleSorting, getDefaultSortingState, table_autoResetSorting, table_resetSorting, table_setSorting };","import { assignPrototypeAPIs, assignTableAPIs, makeStateUpdater } from \"../../utils.js\";\nimport { column_clearSorting, column_getAutoSortDir, column_getAutoSortFn, column_getCanMultiSort, column_getCanSort, column_getFirstSortDir, column_getIsSorted, column_getNextSortingOrder, column_getSortFn, column_getSortIndex, column_getToggleSortingHandler, column_toggleSorting, getDefaultSortingState, table_autoResetSorting, table_resetSorting, table_setSorting } from \"./rowSortingFeature.utils.js\";\n\n//#region src/features/row-sorting/rowSortingFeature.ts\n/**\n* Feature that adds row sorting state, defaults, and column/table sorting APIs.\n*/\nconst rowSortingFeature = {\n\tgetInitialState(initialState) {\n\t\treturn {\n\t\t\tsorting: getDefaultSortingState(),\n\t\t\t...initialState\n\t\t};\n\t},\n\tgetDefaultColumnDef() {\n\t\treturn {\n\t\t\tsortFn: \"auto\",\n\t\t\tsortUndefined: 1\n\t\t};\n\t},\n\tgetDefaultTableOptions(table) {\n\t\treturn {\n\t\t\tautoResetSorting: false,\n\t\t\tonSortingChange: makeStateUpdater(\"sorting\", table),\n\t\t\tisMultiSortEvent: (e) => {\n\t\t\t\treturn e.shiftKey;\n\t\t\t}\n\t\t};\n\t},\n\tassignColumnPrototype(prototype, table) {\n\t\tassignPrototypeAPIs(\"rowSortingFeature\", prototype, table, {\n\t\t\tcolumn_getAutoSortFn: { fn: (column) => column_getAutoSortFn(column) },\n\t\t\tcolumn_getAutoSortDir: { fn: (column) => column_getAutoSortDir(column) },\n\t\t\tcolumn_getSortFn: { fn: (column) => column_getSortFn(column) },\n\t\t\tcolumn_toggleSorting: { fn: (column, desc, multi) => column_toggleSorting(column, desc, multi) },\n\t\t\tcolumn_getFirstSortDir: { fn: (column) => column_getFirstSortDir(column) },\n\t\t\tcolumn_getNextSortingOrder: { fn: (column, multi) => column_getNextSortingOrder(column, multi) },\n\t\t\tcolumn_getCanSort: { fn: (column) => column_getCanSort(column) },\n\t\t\tcolumn_getCanMultiSort: { fn: (column) => column_getCanMultiSort(column) },\n\t\t\tcolumn_getIsSorted: { fn: (column) => column_getIsSorted(column) },\n\t\t\tcolumn_getSortIndex: { fn: (column) => column_getSortIndex(column) },\n\t\t\tcolumn_clearSorting: { fn: (column) => column_clearSorting(column) },\n\t\t\tcolumn_getToggleSortingHandler: { fn: (column) => column_getToggleSortingHandler(column) }\n\t\t});\n\t},\n\tconstructTableAPIs(table) {\n\t\tassignTableAPIs(\"rowSortingFeature\", table, {\n\t\t\ttable_autoResetSorting: { fn: () => table_autoResetSorting(table) },\n\t\t\ttable_setSorting: { fn: (updater) => table_setSorting(table, updater) },\n\t\t\ttable_resetSorting: { fn: (defaultState) => table_resetSorting(table, defaultState) }\n\t\t});\n\t}\n};\n\n//#endregion\nexport { rowSortingFeature };","import { makeObjectMap } from \"../../utils.js\";\nimport { constructRow } from \"../../core/rows/constructRow.js\";\n\n//#region src/features/column-filtering/filterRowsUtils.ts\n/**\n* Filters a row model with the supplied row predicate.\n*\n* The helper supports both filtering from leaf rows upward and filtering parents before descendants, depending on table options.\n*/\nfunction filterRows(rows, filterRowImpl, table) {\n\tif (table.options.filterFromLeafRows) return filterRowModelFromLeafs(rows, filterRowImpl, table);\n\treturn filterRowModelFromRoot(rows, filterRowImpl, table);\n}\nfunction filterRowModelFromLeafs(rowsToFilter, filterRow, table) {\n\tconst newFilteredFlatRows = [];\n\tconst newFilteredRowsById = makeObjectMap();\n\tconst maxDepth = table.options.maxLeafRowFilterDepth ?? 100;\n\tconst recurseFilterRows = (rowsToFilter, depth = 0) => {\n\t\tconst filteredRows = [];\n\t\tfor (const row of rowsToFilter) {\n\t\t\tconst newRow = constructRow(table, row.id, row.original, row.index, row.depth, void 0, row.parentId);\n\t\t\tnewRow.columnFilters = row.columnFilters;\n\t\t\tnewRow.columnFiltersMeta = row.columnFiltersMeta;\n\t\t\tif (row.subRows.length && depth < maxDepth) {\n\t\t\t\tnewRow.subRows = recurseFilterRows(row.subRows, depth + 1);\n\t\t\t\tif (newRow.subRows.length || filterRow(newRow)) filteredRows.push(newRow);\n\t\t\t} else if (filterRow(newRow)) {\n\t\t\t\tnewRow.subRows = row.subRows;\n\t\t\t\tfilteredRows.push(newRow);\n\t\t\t}\n\t\t}\n\t\treturn filteredRows;\n\t};\n\tconst rows = recurseFilterRows(rowsToFilter);\n\taddSubRowsToFlatArrays(rows, newFilteredFlatRows, newFilteredRowsById);\n\treturn {\n\t\trows,\n\t\tflatRows: newFilteredFlatRows,\n\t\trowsById: newFilteredRowsById\n\t};\n}\nfunction filterRowModelFromRoot(rowsToFilter, filterRow, table) {\n\tconst newFilteredFlatRows = [];\n\tconst newFilteredRowsById = makeObjectMap();\n\tconst maxDepth = table.options.maxLeafRowFilterDepth ?? 100;\n\tconst recurseFilterRows = (rowsToFilter, depth = 0) => {\n\t\tconst filteredRows = [];\n\t\tfor (const row of rowsToFilter) if (filterRow(row)) {\n\t\t\tif (row.subRows.length && depth < maxDepth) {\n\t\t\t\tconst newRow = constructRow(table, row.id, row.original, row.index, row.depth, void 0, row.parentId);\n\t\t\t\tconst filterData = row;\n\t\t\t\tnewRow.columnFilters = filterData.columnFilters;\n\t\t\t\tnewRow.columnFiltersMeta = filterData.columnFiltersMeta;\n\t\t\t\tfilteredRows.push(newRow);\n\t\t\t\tnewFilteredFlatRows.push(newRow);\n\t\t\t\tnewFilteredRowsById[newRow.id] = newRow;\n\t\t\t\tnewRow.subRows = recurseFilterRows(row.subRows, depth + 1);\n\t\t\t} else {\n\t\t\t\tfilteredRows.push(row);\n\t\t\t\tnewFilteredFlatRows.push(row);\n\t\t\t\tnewFilteredRowsById[row.id] = row;\n\t\t\t\tif (row.subRows.length && depth >= maxDepth) addSubRowsToFlatArrays(row.subRows, newFilteredFlatRows, newFilteredRowsById);\n\t\t\t}\n\t\t}\n\t\treturn filteredRows;\n\t};\n\treturn {\n\t\trows: recurseFilterRows(rowsToFilter),\n\t\tflatRows: newFilteredFlatRows,\n\t\trowsById: newFilteredRowsById\n\t};\n}\nfunction addSubRowsToFlatArrays(subRows, flatRows, rowsById) {\n\tfor (const subRow of subRows) {\n\t\tflatRows.push(subRow);\n\t\trowsById[subRow.id] = subRow;\n\t\tif (subRow.subRows.length) addSubRowsToFlatArrays(subRow.subRows, flatRows, rowsById);\n\t}\n}\n\n//#endregion\nexport { filterRows };","import { makeObjectMap, skipFirstRun, tableMemo } from \"../../utils.js\";\nimport { autoResetPageIndex, getCanGlobalFilter, getGlobalFilterFn } from \"../../core/featureStubs.js\";\nimport { table_getColumn } from \"../../core/columns/coreColumnsFeature.utils.js\";\nimport { column_getFilterFn } from \"./columnFilteringFeature.utils.js\";\nimport { filterRows } from \"./filterRowsUtils.js\";\n\n//#region src/features/column-filtering/createFilteredRowModel.ts\n/**\n* Creates a memoized filtered row model factory.\n*\n* The factory reads the relevant table state atoms and options, then returns a row model function used by the table row-model pipeline.\n*\n* Register the filter functions you use with the `filterFns` slot on the\n* `features` option:\n* `tableFeatures({ columnFilteringFeature, filteredRowModel: createFilteredRowModel(), filterFns: { includesString: filterFn_includesString } })`.\n* Importing individual `filterFn_*` functions keeps unused built-ins out of\n* your bundle; filter functions passed directly to the `filterFn` column\n* option need no registration at all.\n*/\nfunction createFilteredRowModel() {\n\treturn (_table) => {\n\t\tconst table = _table;\n\t\treturn tableMemo({\n\t\t\tfeature: \"columnFilteringFeature\",\n\t\t\ttable,\n\t\t\tfnName: \"table.getFilteredRowModel\",\n\t\t\tmemoDeps: () => [\n\t\t\t\ttable.getPreFilteredRowModel(),\n\t\t\t\ttable.atoms.columnFilters?.get(),\n\t\t\t\ttable.atoms.globalFilter?.get()\n\t\t\t],\n\t\t\tfn: () => _createFilteredRowModel(table),\n\t\t\tonAfterUpdate: skipFirstRun(() => autoResetPageIndex(table))\n\t\t});\n\t};\n}\nfunction _createFilteredRowModel(table) {\n\tconst rowModel = table.getPreFilteredRowModel();\n\tconst columnFilters = table.atoms.columnFilters?.get();\n\tconst globalFilter = table.atoms.globalFilter?.get();\n\tconst hasGlobalFilter = globalFilter !== void 0 && globalFilter !== null && globalFilter !== \"\";\n\tif (!rowModel.rows.length || !columnFilters?.length && !hasGlobalFilter) {\n\t\tconst flatRows = rowModel.flatRows;\n\t\tfor (let i = 0; i < flatRows.length; i++) {\n\t\t\tconst row = flatRows[i];\n\t\t\trow.columnFilters = makeObjectMap();\n\t\t\trow.columnFiltersMeta = makeObjectMap();\n\t\t}\n\t\treturn rowModel;\n\t}\n\tconst resolvedColumnFilters = [];\n\tconst resolvedGlobalFilters = [];\n\tcolumnFilters?.forEach((columnFilter) => {\n\t\tconst column = table_getColumn(table, columnFilter.id);\n\t\tif (!column) return;\n\t\tconst filterFn = column_getFilterFn(column);\n\t\tif (!filterFn) return;\n\t\tresolvedColumnFilters.push({\n\t\t\tid: columnFilter.id,\n\t\t\tfilterFn,\n\t\t\tresolvedValue: filterFn.resolveFilterValue?.(columnFilter.value) ?? columnFilter.value\n\t\t});\n\t});\n\tconst filterableIds = columnFilters?.map((d) => d.id) ?? [];\n\tif (hasGlobalFilter) {\n\t\tconst globalFilterFn = getGlobalFilterFn(table);\n\t\tconst globallyFilterableColumns = globalFilterFn ? table.getAllLeafColumns().filter(getCanGlobalFilter) : [];\n\t\tif (globalFilterFn && globallyFilterableColumns.length) {\n\t\t\tfilterableIds.push(\"__global__\");\n\t\t\tgloballyFilterableColumns.forEach((column) => {\n\t\t\t\tresolvedGlobalFilters.push({\n\t\t\t\t\tid: column.id,\n\t\t\t\t\tfilterFn: globalFilterFn,\n\t\t\t\t\tresolvedValue: globalFilterFn.resolveFilterValue?.(globalFilter) ?? globalFilter\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t}\n\tconst flatRows = rowModel.flatRows;\n\tfor (let i = 0; i < flatRows.length; i++) {\n\t\tconst row = flatRows[i];\n\t\trow.columnFilters = makeObjectMap();\n\t\trow.columnFiltersMeta = makeObjectMap();\n\t\tif (resolvedColumnFilters.length) for (let j = 0; j < resolvedColumnFilters.length; j++) {\n\t\t\tconst currentColumnFilter = resolvedColumnFilters[j];\n\t\t\tconst id = currentColumnFilter.id;\n\t\t\trow.columnFilters[id] = currentColumnFilter.filterFn(row, id, currentColumnFilter.resolvedValue, (filterMeta) => {\n\t\t\t\tif (!row.columnFiltersMeta) row.columnFiltersMeta = makeObjectMap();\n\t\t\t\trow.columnFiltersMeta[id] = filterMeta;\n\t\t\t});\n\t\t}\n\t\tif (resolvedGlobalFilters.length) {\n\t\t\tfor (let j = 0; j < resolvedGlobalFilters.length; j++) {\n\t\t\t\tconst currentGlobalFilter = resolvedGlobalFilters[j];\n\t\t\t\tconst id = currentGlobalFilter.id;\n\t\t\t\tif (currentGlobalFilter.filterFn(row, id, currentGlobalFilter.resolvedValue, (filterMeta) => {\n\t\t\t\t\tif (!row.columnFiltersMeta) row.columnFiltersMeta = makeObjectMap();\n\t\t\t\t\trow.columnFiltersMeta[id] = filterMeta;\n\t\t\t\t})) {\n\t\t\t\t\trow.columnFilters.__global__ = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (row.columnFilters.__global__ !== true) row.columnFilters.__global__ = false;\n\t\t}\n\t}\n\tconst filterRowsImpl = (row) => {\n\t\tfor (let i = 0; i < filterableIds.length; i++) if (row.columnFilters[filterableIds[i]] === false) return false;\n\t\treturn true;\n\t};\n\treturn filterRows(rowModel.rows, filterRowsImpl, table);\n}\n\n//#endregion\nexport { createFilteredRowModel };","import { tableMemo } from \"../../utils.js\";\nimport { expandRowModel } from \"../../core/featureStubs.js\";\nimport { getDefaultPaginationState } from \"./rowPaginationFeature.utils.js\";\n\n//#region src/features/row-pagination/createPaginatedRowModel.ts\n/**\n* Creates a memoized paginated row model factory.\n*\n* The factory reads the relevant table state atoms and options, then returns a row model function used by the table row-model pipeline.\n*/\nfunction createPaginatedRowModel() {\n\treturn (_table) => {\n\t\tconst table = _table;\n\t\treturn tableMemo({\n\t\t\tfeature: \"rowPaginationFeature\",\n\t\t\ttable,\n\t\t\tfnName: \"table.getPaginatedRowModel\",\n\t\t\tmemoDeps: () => [\n\t\t\t\ttable.getPrePaginatedRowModel(),\n\t\t\t\ttable.atoms.pagination?.get(),\n\t\t\t\t!table.options.paginateExpandedRows ? table.atoms.expanded?.get() : void 0\n\t\t\t],\n\t\t\tfn: () => _createPaginatedRowModel(table)\n\t\t});\n\t};\n}\nfunction _createPaginatedRowModel(table) {\n\tconst prePaginatedRowModel = table.getPrePaginatedRowModel();\n\tconst pagination = table.atoms.pagination?.get();\n\tif (!prePaginatedRowModel.rows.length) return prePaginatedRowModel;\n\tconst { pageSize, pageIndex } = pagination ?? getDefaultPaginationState();\n\tconst { rows, flatRows, rowsById } = prePaginatedRowModel;\n\tlet paginatedRows = rows;\n\tif (pageSize !== Infinity || pageIndex !== 0) {\n\t\tconst pageStart = pageSize * pageIndex;\n\t\tconst pageEnd = pageStart + pageSize;\n\t\tpaginatedRows = rows.slice(pageStart, pageEnd);\n\t}\n\tlet paginatedRowModel;\n\tif (!table.options.paginateExpandedRows) paginatedRowModel = expandRowModel(table, {\n\t\trows: paginatedRows,\n\t\tflatRows,\n\t\trowsById\n\t});\n\telse paginatedRowModel = {\n\t\trows: paginatedRows,\n\t\tflatRows,\n\t\trowsById\n\t};\n\tpaginatedRowModel.flatRows = [];\n\tconst seenFlatRows = /* @__PURE__ */ new Set();\n\tconst handleRow = (row) => {\n\t\tif (seenFlatRows.has(row.id)) return;\n\t\tseenFlatRows.add(row.id);\n\t\tpaginatedRowModel.flatRows.push(row);\n\t\tif (row.subRows.length) row.subRows.forEach(handleRow);\n\t};\n\tpaginatedRowModel.rows.forEach(handleRow);\n\treturn paginatedRowModel;\n}\n\n//#endregion\nexport { createPaginatedRowModel };","import { copyInstancePropertiesWithoutMemos, skipFirstRun, tableMemo } from \"../../utils.js\";\nimport { autoResetPageIndex } from \"../../core/featureStubs.js\";\nimport { column_getCanSort, column_getSortFn } from \"./rowSortingFeature.utils.js\";\n\n//#region src/features/row-sorting/createSortedRowModel.ts\n/**\n* Creates a memoized sorted row model factory.\n*\n* The factory reads the relevant table state atoms and options, then returns a row model function used by the table row-model pipeline.\n*\n* Register the sorting functions you use with the `sortFns` slot on the\n* `features` option:\n* `tableFeatures({ rowSortingFeature, sortedRowModel: createSortedRowModel(), sortFns: { alphanumeric: sortFn_alphanumeric } })`.\n* Importing individual `sortFn_*` functions keeps unused built-ins out of\n* your bundle; sorting functions passed directly to the `sortFn` column\n* option need no registration at all.\n*/\nfunction createSortedRowModel() {\n\treturn (_table) => {\n\t\tconst table = _table;\n\t\treturn tableMemo({\n\t\t\tfeature: \"rowSortingFeature\",\n\t\t\ttable,\n\t\t\tfnName: \"table.getSortedRowModel\",\n\t\t\tmemoDeps: () => [table.atoms.sorting?.get(), table.getPreSortedRowModel()],\n\t\t\tfn: () => _createSortedRowModel(table),\n\t\t\tonAfterUpdate: skipFirstRun(() => autoResetPageIndex(table))\n\t\t});\n\t};\n}\nfunction _createSortedRowModel(table) {\n\tconst preSortedRowModel = table.getPreSortedRowModel();\n\tconst sorting = table.atoms.sorting?.get();\n\tif (!preSortedRowModel.rows.length || !sorting?.length) return preSortedRowModel;\n\tconst sortedFlatRows = [];\n\tconst availableSorting = sorting.filter((sort) => {\n\t\tconst column = table.getColumn(sort.id);\n\t\treturn column ? column_getCanSort(column) : false;\n\t});\n\tif (!availableSorting.length) return preSortedRowModel;\n\tconst resolvedSorting = [];\n\tfor (let i = 0; i < availableSorting.length; i++) {\n\t\tconst sortEntry = availableSorting[i];\n\t\tconst column = table.getColumn(sortEntry.id);\n\t\tif (!column) continue;\n\t\tresolvedSorting.push({\n\t\t\tid: sortEntry.id,\n\t\t\tdesc: sortEntry.desc,\n\t\t\tsortUndefined: column.columnDef.sortUndefined,\n\t\t\tinvertSorting: column.columnDef.invertSorting,\n\t\t\tsortFn: column_getSortFn(column)\n\t\t});\n\t}\n\tconst compareRows = (rowA, rowB) => {\n\t\tfor (let i = 0; i < resolvedSorting.length; i++) {\n\t\t\tconst sortEntry = resolvedSorting[i];\n\t\t\tconst sortUndefined = sortEntry.sortUndefined;\n\t\t\tconst isDesc = sortEntry.desc;\n\t\t\tlet sortInt = 0;\n\t\t\tif (sortUndefined) {\n\t\t\t\tconst aValue = rowA.getValue(sortEntry.id);\n\t\t\t\tconst bValue = rowB.getValue(sortEntry.id);\n\t\t\t\tconst aUndefined = aValue === void 0;\n\t\t\t\tconst bUndefined = bValue === void 0;\n\t\t\t\tif (aUndefined && bUndefined) continue;\n\t\t\t\tif (aUndefined || bUndefined) {\n\t\t\t\t\tif (sortUndefined === \"first\") return aUndefined ? -1 : 1;\n\t\t\t\t\tif (sortUndefined === \"last\") return aUndefined ? 1 : -1;\n\t\t\t\t\tsortInt = aUndefined ? sortUndefined : -sortUndefined;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (sortInt === 0) sortInt = sortEntry.sortFn(rowA, rowB, sortEntry.id);\n\t\t\tif (sortInt !== 0) {\n\t\t\t\tif (isDesc) sortInt *= -1;\n\t\t\t\tif (sortEntry.invertSorting) sortInt *= -1;\n\t\t\t\treturn sortInt;\n\t\t\t}\n\t\t}\n\t\treturn rowA.index - rowB.index;\n\t};\n\tconst sortData = (rows) => {\n\t\tconst sortedData = rows.slice();\n\t\tsortedData.sort(compareRows);\n\t\tlet changed = false;\n\t\tfor (let i = 0; i < sortedData.length; i++) {\n\t\t\tconst row = sortedData[i];\n\t\t\tif (row !== rows[i]) changed = true;\n\t\t\tconst flatIndex = sortedFlatRows.length;\n\t\t\tsortedFlatRows.push(row);\n\t\t\tif (row.subRows.length) {\n\t\t\t\tconst sortedSubRows = sortData(row.subRows);\n\t\t\t\tif (sortedSubRows.changed) {\n\t\t\t\t\tconst cloned = Object.create(Object.getPrototypeOf(row));\n\t\t\t\t\tcopyInstancePropertiesWithoutMemos(cloned, row);\n\t\t\t\t\tcloned.subRows = sortedSubRows.rows;\n\t\t\t\t\tsortedData[i] = cloned;\n\t\t\t\t\tsortedFlatRows[flatIndex] = cloned;\n\t\t\t\t\tchanged = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\trows: sortedData,\n\t\t\tchanged\n\t\t};\n\t};\n\treturn {\n\t\trows: sortData(preSortedRowModel.rows).rows,\n\t\tflatRows: sortedFlatRows,\n\t\trowsById: preSortedRowModel.rowsById\n\t};\n}\n\n//#endregion\nexport { createSortedRowModel };","'use client';\n\nimport { FlexRender } from \"./FlexRender.js\";\nimport { Subscribe } from \"./Subscribe.js\";\nimport { reactReactivity } from \"./reactivity.js\";\nimport { constructTable } from \"@tanstack/table-core\";\nimport { useEffect, useLayoutEffect, useMemo, useState } from \"react\";\nimport { shallow, useSelector } from \"@tanstack/react-store\";\nimport { createRenderPhaseSource } from \"@tanstack/table-core/reactivity\";\nimport { table_publishExternalState, table_setOptions } from \"@tanstack/table-core/static-functions\";\n\n//#region src/useTable.ts\nconst useIsomorphicLayoutEffect = typeof window === \"undefined\" ? useEffect : useLayoutEffect;\n/**\n* Creates a React table instance backed by TanStack Store atoms.\n*\n* The optional selector projects from `table.store`; the selected value is\n* exposed on `table.state` and compared shallowly for React re-renders. Omit\n* the selector to subscribe to every registered table state slice, or pass a\n* narrower selector and use `table.Subscribe` lower in the tree for targeted\n* subscriptions.\n*\n* @example\n* ```tsx\n* const table = useTable(\n* {\n* features,\n* columns,\n* data,\n* },\n* (state) => ({ pagination: state.pagination }),\n* )\n*\n* table.state.pagination\n* ```\n*/\nfunction useTable(tableOptions, selector) {\n\tconst [{ table, rootSource }] = useState(() => {\n\t\tconst tableInstance = constructTable({\n\t\t\t...tableOptions,\n\t\t\tfeatures: {\n\t\t\t\tcoreReactivityFeature: reactReactivity(),\n\t\t\t\t...tableOptions.features\n\t\t\t}\n\t\t});\n\t\ttableInstance.Subscribe = ((props) => {\n\t\t\treturn Subscribe({\n\t\t\t\t...props,\n\t\t\t\tsource: props.source ?? tableInstance.store\n\t\t\t});\n\t\t});\n\t\ttableInstance.FlexRender = FlexRender;\n\t\treturn {\n\t\t\ttable: tableInstance,\n\t\t\trootSource: createRenderPhaseSource(tableInstance.store, shallow)\n\t\t};\n\t});\n\tconst coreTable = table;\n\ttable_setOptions(coreTable, (prev) => ({\n\t\t...prev,\n\t\t...tableOptions\n\t}), { syncExternalState: false });\n\tconst controlledState = coreTable.options.state;\n\tconst renderSnapshot = rootSource.get();\n\tconst state = useSelector(rootSource, selector, { compare: shallow });\n\tuseIsomorphicLayoutEffect(() => {\n\t\trootSource.markCommitted(renderSnapshot);\n\t\ttable_publishExternalState(coreTable, controlledState ?? null, shallow);\n\t});\n\treturn useMemo(() => ({\n\t\t...table,\n\t\toptions: tableOptions,\n\t\tstate\n\t}), [\n\t\ttable,\n\t\ttableOptions,\n\t\tstate\n\t]);\n}\n\n//#endregion\nexport { useTable };","/* -------------------------------------------------------------------- */\n/* DataGrid filter functions (TanStack Table v9 `filterFns` registry). */\n/* */\n/* Each kit filter kind is one v9 filter fn built with */\n/* `constructFilterFn({ filter, autoRemove })` */\n/* (`features/column-filtering/filterFns.d.ts:35`; definition shape */\n/* `columnFilteringFeature.types.d.ts:70-75`). The row tests are the very */\n/* predicates DataTable's AG filters run (`_shared/table-filters/`), so */\n/* both tables keep a row for the same model. */\n/* */\n/* `autoRemove` drops a model that filters nothing, so an empty filter */\n/* leaves v9 state the way AG's `null` does. Privacy is the engine's job: */\n/* a masked column has `enableColumnFilter` and global filtering off */\n/* (`columns.ts`, `use-data-grid-engine.ts`), so these fns never see it. */\n/* -------------------------------------------------------------------- */\n\nimport { constructFilterFn } from '@tanstack/react-table';\nimport { normalizeDiacritics } from '../_shared/normalize-diacritics';\nimport {\n dateRangeModelPasses,\n isEmptyFilterModel,\n makeTextMatcher,\n numberModelPasses,\n selectFilterPasses,\n textFilterPasses,\n type TextMatcher,\n} from '../_shared/table-filters/predicates';\nimport { dayOf } from '../_shared/table-filters/calendar-day';\nimport type {\n DateRangeFilterModel,\n NumberFilterModel,\n SelectFilterModel,\n TextFilterModel,\n} from '../_shared/table-toolbar/seam';\nimport type { DataGridTableMeta } from './types';\n\n/** The grid's locale, from the table meta (registry fns are module-scoped). */\nfunction localeOf(row: {\n table: { options: { meta?: unknown } };\n}): string | undefined {\n const meta = row.table.options.meta as Partial<DataGridTableMeta> | undefined;\n return meta?.locale;\n}\n\nconst matchers = new Map<string, TextMatcher>();\n\n/** One collator-backed matcher per locale, built once. */\nfunction matcherFor(locale: string | undefined): TextMatcher {\n const key = locale ?? '';\n let matcher = matchers.get(key);\n if (!matcher) {\n matcher = makeTextMatcher(locale);\n matchers.set(key, matcher);\n }\n return matcher;\n}\n\n/** Whitespace-only text filters nothing (DataTable's TextFilter commits\n * `null` for it, `text-filter.tsx` apply). */\nfunction isEmptyTextModel(model: unknown): boolean {\n if (isEmptyFilterModel(model)) return true;\n const m = model as Partial<TextFilterModel>;\n return typeof m.filter !== 'string' || m.filter.trim() === '';\n}\n\n/** Text a cell offers to quick search (`exportValue`, else `value`, through\n * the table meta): dates as their calendar day, other values as text. */\nfunction quickText(value: unknown): string {\n if (value === null || value === undefined) return '';\n if (value instanceof Date) return dayOf(value) ?? '';\n return String(value);\n}\n\n/**\n * The five kit filter functions, registered on `dataGridFeatures.filterFns`\n * (design § 2.2). Keys are the only names columns and `globalFilterFn` may\n * use:\n *\n * - `kitText`: `TextFilterModel` (column `filter.kind: 'text'`).\n * - `kitNumber`: `NumberFilterModel` (`'number'`).\n * - `kitSet`: `SelectFilterModel` (`'select'`; also FacetFilter's model).\n * - `kitDateRange`: `DateRangeFilterModel` (`'dateRange'`).\n * - `kitQuick`: the quick search (`globalFilterFn: 'kitQuick'`):\n * accent-folded, case-insensitive \"contains\" on what the cell shows:\n * the column's `exportValue`, else its `value`.\n */\nexport const dataGridFilterFns = {\n kitText: constructFilterFn({\n filter: (value: unknown, model: TextFilterModel, row) =>\n textFilterPasses(model, value, matcherFor(localeOf(row))),\n autoRemove: isEmptyTextModel,\n }),\n kitNumber: constructFilterFn({\n filter: (value: unknown, model: NumberFilterModel) =>\n numberModelPasses(model, value),\n autoRemove: isEmptyFilterModel,\n }),\n kitSet: constructFilterFn({\n filter: (value: unknown, model: SelectFilterModel) =>\n selectFilterPasses(model, value),\n autoRemove: isEmptyFilterModel,\n }),\n kitDateRange: constructFilterFn({\n filter: (value: unknown, model: DateRangeFilterModel) =>\n dateRangeModelPasses(model, value),\n autoRemove: isEmptyFilterModel,\n }),\n kitQuick: constructFilterFn({\n // Normalised once per filter, before any row is tested.\n resolveFilterValue: (text: unknown) =>\n normalizeDiacritics(String(text ?? '').trim()),\n filter: (value: unknown, needle: string, row, columnId) => {\n if (needle === '') return true;\n const meta = row.table.options.meta as\n | Partial<DataGridTableMeta>\n | undefined;\n const searched = meta?.getSearchValue\n ? meta.getSearchValue(row.id, columnId)\n : value;\n return normalizeDiacritics(quickText(searched)).includes(needle);\n },\n autoRemove: (text: unknown) =>\n text === null || text === undefined || String(text).trim() === '',\n }),\n};\n\n/** A registered kit filter function name. */\nexport type DataGridFilterFnName = keyof typeof dataGridFilterFns;\n","/* -------------------------------------------------------------------- */\n/* DataGrid: the one static TanStack Table v9 feature set. */\n/* */\n/* v9 reads `features` once, when the table is built */\n/* (`core/table/constructTable.js:25-43`), so every grid registers the */\n/* same superset at module scope and switches parts on and off with */\n/* `enable*` and `manual*` options (design § 2.2). */\n/* */\n/* Registered: eleven features, four row models, the kit sort and filter */\n/* registries and the TData-free meta slots. Not registered, on purpose */\n/* (bundle): column faceting, row aggregation, row pinning, column */\n/* grouping, cell selection, cell spanning. */\n/* -------------------------------------------------------------------- */\n\nimport {\n columnFilteringFeature,\n columnOrderingFeature,\n columnPinningFeature,\n columnResizingFeature,\n columnSizingFeature,\n columnVisibilityFeature,\n constructSortFn,\n createExpandedRowModel,\n createFilteredRowModel,\n createPaginatedRowModel,\n createSortedRowModel,\n globalFilteringFeature,\n metaHelper,\n rowExpandingFeature,\n rowPaginationFeature,\n rowSelectionFeature,\n rowSortingFeature,\n sortFn_alphanumeric,\n sortFn_basic,\n sortFn_datetime,\n tableFeatures,\n} from '@tanstack/react-table';\n\nimport { dataGridFilterFns } from './filter-fns';\nimport type { DataGridColumnMeta, DataGridTableMeta } from './types';\n\n/* ------------------------------------------------------------------ */\n/* Kit comparators */\n/* ------------------------------------------------------------------ */\n\nconst collators = new Map<string, Intl.Collator>();\n\n/** One `Intl.Collator` per locale: numeric, accent- and case-insensitive. */\nexport function getDataGridCollator(locale: string | undefined): Intl.Collator {\n const key = locale ?? '';\n let collator = collators.get(key);\n if (!collator) {\n try {\n collator = new Intl.Collator(locale || undefined, {\n numeric: true,\n sensitivity: 'base',\n });\n } catch {\n collator = new Intl.Collator(undefined, {\n numeric: true,\n sensitivity: 'base',\n });\n }\n collators.set(key, collator);\n }\n return collator;\n}\n\n/** The locale the grid passes in its table meta (`DataGridTableMeta.locale`). */\nfunction localeOf(row: {\n table: { options: { meta?: unknown } };\n}): string | undefined {\n const meta = row.table.options.meta as Partial<DataGridTableMeta> | undefined;\n return meta?.locale;\n}\n\nconst isEmpty = (value: unknown): boolean =>\n value === null || value === undefined || value === '';\n\n/** Empty values sort first in ascending order (AG Grid parity). */\nfunction compareEmpty(a: unknown, b: unknown): number | null {\n const aEmpty = isEmpty(a);\n const bEmpty = isEmpty(b);\n if (aEmpty && bEmpty) return 0;\n if (aEmpty) return -1;\n if (bEmpty) return 1;\n return null;\n}\n\nfunction toNumber(value: unknown): number {\n if (typeof value === 'number') return value;\n if (typeof value === 'boolean') return value ? 1 : 0;\n if (value instanceof Date) return value.getTime();\n const parsed = Number(value);\n return Number.isNaN(parsed) ? Number.NEGATIVE_INFINITY : parsed;\n}\n\nfunction toTime(value: unknown): number {\n if (value instanceof Date) return value.getTime();\n if (typeof value === 'number') return value;\n const parsed = Date.parse(String(value));\n return Number.isNaN(parsed) ? Number.NEGATIVE_INFINITY : parsed;\n}\n\n/** Compares two plain cell values for `sort: 'text'`. */\nexport function compareDataGridText(\n a: unknown,\n b: unknown,\n locale?: string,\n): number {\n const empty = compareEmpty(a, b);\n if (empty !== null) return empty;\n return getDataGridCollator(locale).compare(String(a), String(b));\n}\n\n/** Compares two plain cell values for `sort: 'number'`. */\nexport function compareDataGridNumber(a: unknown, b: unknown): number {\n const empty = compareEmpty(a, b);\n if (empty !== null) return empty;\n const diff = toNumber(a) - toNumber(b);\n return diff < 0 ? -1 : diff > 0 ? 1 : 0;\n}\n\n/** Compares two plain cell values for `sort: 'date'` (Date or ISO text). */\nexport function compareDataGridDate(a: unknown, b: unknown): number {\n const empty = compareEmpty(a, b);\n if (empty !== null) return empty;\n const diff = toTime(a) - toTime(b);\n return diff < 0 ? -1 : diff > 0 ? 1 : 0;\n}\n\n/** `sort: true`: picks the comparison from the two values' types. */\nexport function compareDataGridValues(\n a: unknown,\n b: unknown,\n locale?: string,\n): number {\n const empty = compareEmpty(a, b);\n if (empty !== null) return empty;\n if (a instanceof Date || b instanceof Date) return compareDataGridDate(a, b);\n if (\n (typeof a === 'number' || typeof a === 'boolean') &&\n (typeof b === 'number' || typeof b === 'boolean')\n ) {\n return compareDataGridNumber(a, b);\n }\n return compareDataGridText(a, b, locale);\n}\n\n/* ------------------------------------------------------------------ */\n/* Registered sort functions */\n/* ------------------------------------------------------------------ */\n\n/** `sort: 'text'`: Intl.Collator for the grid's locale. */\nconst kitText = constructSortFn({\n sort: (a, b, rowA) => compareDataGridText(a, b, localeOf(rowA)),\n});\n\n/** `sort: 'number'`. */\nconst kitNumber = constructSortFn({\n sort: (a, b) => compareDataGridNumber(a, b),\n});\n\n/** `sort: 'date'`. */\nconst kitDate = constructSortFn({\n sort: (a, b) => compareDataGridDate(a, b),\n});\n\n/** `sort: true`: by value type. */\nconst kitAuto = constructSortFn({\n sort: (a, b, rowA) => compareDataGridValues(a, b, localeOf(rowA)),\n});\n\n/* ------------------------------------------------------------------ */\n/* The feature set */\n/* ------------------------------------------------------------------ */\n\nexport const dataGridFeatures = tableFeatures({\n rowSortingFeature,\n columnFilteringFeature,\n globalFilteringFeature,\n rowPaginationFeature,\n rowSelectionFeature,\n rowExpandingFeature,\n columnVisibilityFeature,\n columnPinningFeature,\n columnOrderingFeature,\n columnSizingFeature,\n columnResizingFeature,\n sortedRowModel: createSortedRowModel(),\n filteredRowModel: createFilteredRowModel(),\n paginatedRowModel: createPaginatedRowModel(),\n expandedRowModel: createExpandedRowModel(),\n sortFns: {\n kitText,\n kitNumber,\n kitDate,\n kitAuto,\n alphanumeric: sortFn_alphanumeric,\n datetime: sortFn_datetime,\n basic: sortFn_basic,\n },\n filterFns: dataGridFilterFns,\n tableMeta: metaHelper<DataGridTableMeta>(),\n columnMeta: metaHelper<DataGridColumnMeta>(),\n});\n\nexport type DataGridFeatures = typeof dataGridFeatures;\n\n/** A registered kit sort function name. */\nexport type DataGridSortFnName =\n | 'kitText'\n | 'kitNumber'\n | 'kitDate'\n | 'kitAuto';\n\n/** Utility column ids (design § 2.1, `columns.ts`). */\nexport const DATA_GRID_SELECT_COLUMN_ID = '__select';\nexport const DATA_GRID_EXPAND_COLUMN_ID = '__expand';\n\n/** Default column size bounds (types.ts `minSize`, `maxSize`). */\nexport const DATA_GRID_DEFAULT_MIN_SIZE = 64;\nexport const DATA_GRID_DEFAULT_MAX_SIZE = 960;\n","/* -------------------------------------------------------------------- */\n/* DataGrid: kit columns to TanStack Table v9 column defs. */\n/* */\n/* Turns `columns` + `columnGroups` (+ the utility columns `__select` and */\n/* `__expand`) into v9 `ColumnDef`s with a TData-free `DataGridColumnMeta`, */\n/* and keeps the typed kit columns in maps keyed by id: the v9 meta slot */\n/* cannot hold a `DataGridColumn<TData>` (types.ts, `DataGridColumnMeta`). */\n/* Also the per-column rules the store, handle and renderer share: label, */\n/* masking, hide / move / pin defaults, row header and declared order. */\n/* -------------------------------------------------------------------- */\n\nimport type { ColumnDef } from '@tanstack/react-table';\n\nimport { isDevelopment } from '../_shared/is-development';\nimport {\n DATA_GRID_DEFAULT_MAX_SIZE,\n DATA_GRID_DEFAULT_MIN_SIZE,\n DATA_GRID_EXPAND_COLUMN_ID,\n DATA_GRID_SELECT_COLUMN_ID,\n type DataGridFeatures,\n type DataGridSortFnName,\n} from './features';\nimport type { DataGridFilterFnName } from './filter-fns';\nimport type {\n DataGridCellValue,\n DataGridColumn,\n DataGridColumnFilter,\n DataGridColumnGroup,\n DataGridColumnMeta,\n DataGridColumnPinning,\n DataGridOption,\n} from './types';\n\n/** A v9 column def over the kit feature set. */\nexport type DataGridColumnDef<TData extends object> = ColumnDef<\n DataGridFeatures,\n TData,\n unknown\n>;\n\n/** Ids starting with this are reserved for utility columns. */\nexport const DATA_GRID_RESERVED_PREFIX = '__';\n\n/** Utility column ids in their fixed start-pinned order. */\nexport const DATA_GRID_UTILITY_IDS: readonly string[] = [\n DATA_GRID_SELECT_COLUMN_ID,\n DATA_GRID_EXPAND_COLUMN_ID,\n];\n\nexport function isUtilityColumnId(id: string): boolean {\n return id.startsWith(DATA_GRID_RESERVED_PREFIX);\n}\n\nfunction warn(message: string): void {\n if (isDevelopment()) console.warn(`[DataGrid] ${message}`);\n}\n\n/* ------------------------------------------------------------------ */\n/* Per-column rules */\n/* ------------------------------------------------------------------ */\n\n/** Plain column name: `headerLabel`, a string or number `header`, else the\n * id (with a DEV warning, because the id is a developer constant). */\nexport function getDataGridColumnLabel<TData>(\n column: Pick<DataGridColumn<TData>, 'id' | 'header' | 'headerLabel'>,\n): string {\n if (column.headerLabel !== undefined && column.headerLabel !== '') {\n return column.headerLabel;\n }\n if (typeof column.header === 'string') return column.header;\n if (typeof column.header === 'number') return String(column.header);\n return column.id;\n}\n\n/** Whole-column rule (types.ts `DataGridColumnPrivacy`): under privacy\n * mode, a column with any `privacy` leaves sorting, filtering, quick\n * search and facets for every row. */\nexport function isDataGridColumnMasked<TData>(\n column: Pick<DataGridColumn<TData>, 'privacy'>,\n privacyMode: boolean,\n): boolean {\n return privacyMode && column.privacy !== undefined;\n}\n\n/** Is this one cell masked (shows the mask instead of `cell`)? */\nexport function isDataGridCellMasked<TData>(\n column: Pick<DataGridColumn<TData>, 'privacy'>,\n row: TData,\n privacyMode: boolean,\n): boolean {\n const { privacy } = column;\n if (!privacyMode || privacy === undefined) return false;\n if (typeof privacy === 'string') return true;\n return privacy.appliesTo ? privacy.appliesTo(row) : true;\n}\n\n/** The host mask text for a masked cell, or `undefined` (bullets). */\nexport function getDataGridHostMask<TData>(\n column: Pick<DataGridColumn<TData>, 'privacy'>,\n row: TData,\n): string | undefined {\n const { privacy } = column;\n if (privacy === undefined || typeof privacy === 'string') return undefined;\n return privacy.mask?.(row);\n}\n\n/** `privacy: 'hide'` under privacy mode: hidden and cannot be shown. */\nexport function isDataGridColumnPrivacyHidden<TData>(\n column: Pick<DataGridColumn<TData>, 'privacy'>,\n privacyMode: boolean,\n): boolean {\n return privacyMode && column.privacy === 'hide';\n}\n\n/**\n * A select filter's options: the column's own, else (client mode) the\n * distinct values of every core row, sorted for `locale`, so other filters\n * do not shrink the list. Shared by the header panel and the toolbar seam.\n */\nexport function getDataGridSelectOptions<TData>(\n column: Pick<DataGridColumn<TData>, 'filter' | 'value'>,\n coreRows: ReadonlyArray<{ original: TData }>,\n dataMode: 'client' | 'server',\n locale: string | undefined,\n): readonly DataGridOption[] {\n const config = column.filter;\n if (!config || config.kind !== 'select') return [];\n if (config.options) return config.options;\n if (dataMode === 'server' || !column.value) return [];\n const seen = new Map<string | number, DataGridOption>();\n for (const row of coreRows) {\n const value = column.value(row.original);\n if (typeof value !== 'string' && typeof value !== 'number') continue;\n if (value === '' || seen.has(value)) continue;\n seen.set(value, { value, label: String(value) });\n }\n const collator = new Intl.Collator(locale || undefined, {\n numeric: true,\n sensitivity: 'base',\n });\n return [...seen.values()].sort((a, b) => collator.compare(a.label, b.label));\n}\n\nexport function resolveDataGridSortFn<TData>(\n sort: DataGridColumn<TData>['sort'],\n): DataGridSortFnName | ((a: TData, b: TData) => number) | null {\n if (sort === undefined || sort === false) return null;\n if (typeof sort === 'function') return sort;\n if (sort === 'text') return 'kitText';\n if (sort === 'number') return 'kitNumber';\n if (sort === 'date') return 'kitDate';\n return 'kitAuto';\n}\n\nexport function resolveDataGridFilterFn(\n filter: DataGridColumnFilter,\n): DataGridFilterFnName {\n switch (filter.kind) {\n case 'text':\n return 'kitText';\n case 'number':\n return 'kitNumber';\n case 'select':\n return 'kitSet';\n case 'dateRange':\n return 'kitDateRange';\n }\n}\n\n/** Is the column sortable in principle (ignoring privacy)? */\nexport function isDataGridColumnSortable<TData>(\n column: DataGridColumn<TData>,\n): boolean {\n const sortFn = resolveDataGridSortFn(column.sort);\n if (sortFn === null) return false;\n return typeof sortFn === 'function' || column.value !== undefined;\n}\n\n/** Does the column filter in principle (ignoring privacy)? */\nexport function isDataGridColumnFilterable<TData>(\n column: DataGridColumn<TData>,\n): boolean {\n return column.filter !== undefined && column.value !== undefined;\n}\n\n/** Does the column join quick search in principle (ignoring privacy)? */\nexport function isDataGridColumnSearchable<TData>(\n column: DataGridColumn<TData>,\n): boolean {\n if (column.value === undefined && column.exportValue === undefined) {\n return false;\n }\n return column.search ?? column.value !== undefined;\n}\n\nexport interface DataGridColumnRules {\n canHide: boolean;\n canMove: boolean;\n canPin: boolean;\n minSize: number;\n maxSize: number;\n}\n\n/** Hide, move, pin and size defaults (types.ts `DataGridColumn`). */\nexport function getDataGridColumnRules<TData>(\n column: DataGridColumn<TData>,\n defaultRowHeaderId: string | null,\n privacyMode: boolean,\n): DataGridColumnRules {\n const isRowHeader = column.id === defaultRowHeaderId;\n const minSize = column.minSize ?? DATA_GRID_DEFAULT_MIN_SIZE;\n return {\n canHide: isDataGridColumnPrivacyHidden(column, privacyMode)\n ? false\n : (column.hideable ?? !isRowHeader),\n canMove: column.reorderable ?? !isRowHeader,\n canPin: column.pinnable ?? true,\n minSize,\n maxSize: Math.max(minSize, column.maxSize ?? DATA_GRID_DEFAULT_MAX_SIZE),\n };\n}\n\n/** Clamps a width to the column's bounds; `null` for a non-finite value. */\nexport function clampDataGridColumnSize<TData>(\n column: DataGridColumn<TData>,\n px: number,\n): number | null {\n if (!Number.isFinite(px)) return null;\n const minSize = column.minSize ?? DATA_GRID_DEFAULT_MIN_SIZE;\n const maxSize = Math.max(\n minSize,\n column.maxSize ?? DATA_GRID_DEFAULT_MAX_SIZE,\n );\n return Math.round(Math.min(maxSize, Math.max(minSize, px)));\n}\n\n/**\n * The row-header column: the first visible column with `rowHeader`, else\n * the first visible data column (today's rule), wherever it moved.\n */\nexport function resolveDataGridRowHeaderId<TData>(\n kitColumns: ReadonlyMap<string, DataGridColumn<TData>>,\n visibleOrderedIds: readonly string[],\n): string | null {\n const dataIds = visibleOrderedIds.filter((id) => kitColumns.has(id));\n const explicit = dataIds.find((id) => kitColumns.get(id)?.rowHeader);\n return explicit ?? dataIds[0] ?? null;\n}\n\n/**\n * Completes a (possibly partial or stale) leaf order: unknown ids are\n * dropped, and declared columns missing from it keep their declared\n * position (each goes straight after its declared predecessor).\n */\nexport function resolveDataGridColumnOrder(\n order: readonly string[],\n declared: readonly string[],\n): string[] {\n const known = new Set(declared);\n const result: string[] = [];\n const seen = new Set<string>();\n for (const id of order) {\n if (known.has(id) && !seen.has(id)) {\n result.push(id);\n seen.add(id);\n }\n }\n declared.forEach((id, index) => {\n if (seen.has(id)) return;\n let insertAt = 0;\n for (let back = index - 1; back >= 0; back -= 1) {\n const at = result.indexOf(declared[back]);\n if (at !== -1) {\n insertAt = at + 1;\n break;\n }\n }\n result.splice(insertAt, 0, id);\n seen.add(id);\n });\n return result;\n}\n\n/* ------------------------------------------------------------------ */\n/* Column model */\n/* ------------------------------------------------------------------ */\n\nexport interface BuildDataGridColumnsInput<TData> {\n columns: readonly DataGridColumn<TData>[];\n columnGroups?: readonly DataGridColumnGroup[];\n selectionMode: 'none' | 'single' | 'multiple';\n /** Sub-rows or a detail panel: adds `__expand`. */\n expandable: boolean;\n privacyMode: boolean;\n /** The grid's `columnResizing` (each column's default). */\n columnResizing: boolean;\n}\n\nexport interface DataGridColumnModel<TData extends object> {\n /** v9 defs: utility columns first, then data columns and groups. */\n defs: DataGridColumnDef<TData>[];\n /** Valid data columns by id. */\n kitColumns: Map<string, DataGridColumn<TData>>;\n /** Valid groups (at least one known leaf) by id. */\n kitGroups: Map<string, DataGridColumnGroup>;\n /** Leaf id to group id. */\n groupOf: Map<string, string>;\n /** Data leaf ids in declared order (group members pulled together). */\n declaredOrder: string[];\n /** Utility ids present, in their pinned order. */\n utilityIds: string[];\n /** `rowHeader` column, else the first declared data column. */\n defaultRowHeaderId: string | null;\n /** From each column's `pin`, minus pins that would split a group. */\n declaredPinning: DataGridColumnPinning;\n}\n\n/** Drops reserved and duplicate ids (DEV warning). */\nfunction validColumns<TData>(\n columns: readonly DataGridColumn<TData>[],\n): DataGridColumn<TData>[] {\n const seen = new Set<string>();\n const result: DataGridColumn<TData>[] = [];\n for (const column of columns) {\n if (isUtilityColumnId(column.id)) {\n warn(\n `column id \"${column.id}\" starts with \"__\", which is reserved for utility columns; the column is ignored.`,\n );\n continue;\n }\n if (seen.has(column.id)) {\n warn(`duplicate column id \"${column.id}\"; the later one is ignored.`);\n continue;\n }\n seen.add(column.id);\n result.push(column);\n }\n return result;\n}\n\nfunction warnColumnDeclarations<TData>(column: DataGridColumn<TData>): void {\n if (!isDevelopment()) return;\n if (column.value === undefined) {\n if (column.filter !== undefined) {\n warn(\n `column \"${column.id}\" declares a filter but no value; it cannot filter.`,\n );\n }\n if (\n column.sort !== undefined &&\n typeof column.sort !== 'function' &&\n column.sort !== false\n ) {\n warn(`column \"${column.id}\" declares sort but no value; it cannot sort.`);\n }\n }\n if (\n typeof column.header !== 'string' &&\n column.headerLabel === undefined &&\n (column.sort ||\n column.filter ||\n column.hideable !== false ||\n column.resizable)\n ) {\n warn(\n `column \"${column.id}\" has a non-text header and no headerLabel; its id is used as the label.`,\n );\n }\n}\n\nfunction dataColumnDef<TData extends object>(\n column: DataGridColumn<TData>,\n input: BuildDataGridColumnsInput<TData>,\n meta: DataGridColumnMeta,\n rules: DataGridColumnRules,\n): DataGridColumnDef<TData> {\n const masked = isDataGridColumnMasked(column, input.privacyMode);\n const sortFn = resolveDataGridSortFn(column.sort);\n const { value } = column;\n const accessorFn =\n value !== undefined\n ? (row: TData): DataGridCellValue => value(row) ?? null\n : (sortFn !== null && typeof sortFn === 'function') ||\n isDataGridColumnSearchable(column)\n ? // v9 needs an accessor to sort by a comparator or to join quick\n // search; an `exportValue`-only column is searched through the\n // table meta (`getSearchValue`).\n (): DataGridCellValue => null\n : undefined;\n\n const def = {\n id: column.id,\n header: meta.label,\n meta,\n enableSorting: !masked && isDataGridColumnSortable(column),\n sortDescFirst: column.sortDescFirst ?? false,\n enableColumnFilter: !masked && isDataGridColumnFilterable(column),\n enableGlobalFilter: !masked && isDataGridColumnSearchable(column),\n enableResizing: column.resizable ?? input.columnResizing,\n enableHiding: rules.canHide,\n enablePinning: rules.canPin,\n minSize: rules.minSize,\n maxSize: rules.maxSize,\n ...(column.size !== undefined\n ? { size: clampDataGridColumnSize(column, column.size) ?? undefined }\n : {}),\n ...(sortFn === null\n ? {}\n : typeof sortFn === 'function'\n ? {\n sortFn: (rowA: { original: TData }, rowB: { original: TData }) =>\n sortFn(rowA.original, rowB.original),\n }\n : { sortFn }),\n ...(column.filter !== undefined\n ? { filterFn: resolveDataGridFilterFn(column.filter) }\n : {}),\n ...(accessorFn !== undefined ? { accessorFn } : {}),\n };\n return def as DataGridColumnDef<TData>;\n}\n\nfunction utilityColumnDef<TData extends object>(\n id: string,\n kind: 'select' | 'expand',\n): DataGridColumnDef<TData> {\n const def = {\n id,\n header: '',\n meta: {\n kind,\n label: '',\n isRowHeader: false,\n groupId: null,\n } satisfies DataGridColumnMeta,\n enableSorting: false,\n enableColumnFilter: false,\n enableGlobalFilter: false,\n enableResizing: false,\n enableHiding: false,\n enablePinning: false,\n };\n return def as DataGridColumnDef<TData>;\n}\n\n/**\n * Builds the column model. Memoise on `columns`, `columnGroups`,\n * `selectionMode`, `expandable`, `privacyMode` and `columnResizing`.\n */\nexport function buildDataGridColumns<TData extends object>(\n input: BuildDataGridColumnsInput<TData>,\n): DataGridColumnModel<TData> {\n const columns = validColumns(input.columns);\n const kitColumns = new Map(columns.map((column) => [column.id, column]));\n\n // Groups: known leaves only; a leaf belongs to the first group naming it.\n const kitGroups = new Map<string, DataGridColumnGroup>();\n const groupOf = new Map<string, string>();\n for (const group of input.columnGroups ?? []) {\n if (kitColumns.has(group.id) || isUtilityColumnId(group.id)) {\n warn(`column group id \"${group.id}\" collides with a column id; ignored.`);\n continue;\n }\n const leaves = group.columns.filter((id) => {\n if (!kitColumns.has(id)) {\n warn(`column group \"${group.id}\" names unknown column \"${id}\".`);\n return false;\n }\n if (groupOf.has(id)) {\n warn(`column \"${id}\" is in more than one group; the first one wins.`);\n return false;\n }\n return true;\n });\n if (leaves.length === 0) continue;\n leaves.forEach((id) => groupOf.set(id, group.id));\n kitGroups.set(group.id, group);\n }\n\n // Declared order: a group sits where its first leaf is declared.\n const declaredOrder: string[] = [];\n const emittedGroups = new Set<string>();\n for (const column of columns) {\n const groupId = groupOf.get(column.id);\n if (groupId === undefined) {\n declaredOrder.push(column.id);\n continue;\n }\n if (emittedGroups.has(groupId)) continue;\n emittedGroups.add(groupId);\n const members = columns\n .filter((candidate) => groupOf.get(candidate.id) === groupId)\n .map((candidate) => candidate.id);\n if (isDevelopment()) {\n const positions = members.map((id) =>\n columns.findIndex((candidate) => candidate.id === id),\n );\n const adjacent = positions.every(\n (position, index) =>\n index === 0 || position === positions[index - 1] + 1,\n );\n if (!adjacent) {\n warn(\n `the columns of group \"${groupId}\" are not adjacent; they are shown together.`,\n );\n }\n }\n declaredOrder.push(...members);\n }\n\n const explicitRowHeader = columns.find((column) => column.rowHeader);\n const defaultRowHeaderId = explicitRowHeader?.id ?? declaredOrder[0] ?? null;\n\n // Declared pins; a group keeps a pin only when every leaf shares it.\n const start: string[] = [];\n const end: string[] = [];\n for (const id of declaredOrder) {\n const column = kitColumns.get(id);\n if (!column?.pin) continue;\n const groupId = groupOf.get(id);\n if (groupId !== undefined) {\n const group = kitGroups.get(groupId);\n const sameSide = group?.columns\n .filter((leaf) => groupOf.get(leaf) === groupId)\n .every((leaf) => kitColumns.get(leaf)?.pin === column.pin);\n if (!sameSide) {\n warn(\n `column \"${id}\" is pinned but the rest of group \"${groupId}\" is not; the pin is ignored.`,\n );\n continue;\n }\n }\n (column.pin === 'start' ? start : end).push(id);\n }\n\n // Defs.\n const utilityIds: string[] = [];\n const defs: DataGridColumnDef<TData>[] = [];\n if (input.selectionMode !== 'none') {\n utilityIds.push(DATA_GRID_SELECT_COLUMN_ID);\n defs.push(utilityColumnDef<TData>(DATA_GRID_SELECT_COLUMN_ID, 'select'));\n }\n if (input.expandable) {\n utilityIds.push(DATA_GRID_EXPAND_COLUMN_ID);\n defs.push(utilityColumnDef<TData>(DATA_GRID_EXPAND_COLUMN_ID, 'expand'));\n }\n\n const leafDef = (id: string): DataGridColumnDef<TData> => {\n const column = kitColumns.get(id) as DataGridColumn<TData>;\n warnColumnDeclarations(column);\n const meta: DataGridColumnMeta = {\n kind: 'data',\n label: getDataGridColumnLabel(column),\n isRowHeader: column.id === defaultRowHeaderId,\n groupId: groupOf.get(id) ?? null,\n };\n return dataColumnDef(\n column,\n input,\n meta,\n getDataGridColumnRules(column, defaultRowHeaderId, input.privacyMode),\n );\n };\n\n const doneGroups = new Set<string>();\n for (const id of declaredOrder) {\n const groupId = groupOf.get(id);\n if (groupId === undefined) {\n defs.push(leafDef(id));\n continue;\n }\n if (doneGroups.has(groupId)) continue;\n doneGroups.add(groupId);\n const group = kitGroups.get(groupId) as DataGridColumnGroup;\n const members = declaredOrder.filter(\n (leaf) => groupOf.get(leaf) === groupId,\n );\n const groupDef = {\n id: group.id,\n header: getDataGridColumnLabel(group),\n meta: {\n kind: 'group',\n label: getDataGridColumnLabel(group),\n isRowHeader: false,\n groupId: null,\n } satisfies DataGridColumnMeta,\n columns: members.map(leafDef),\n };\n defs.push(groupDef as DataGridColumnDef<TData>);\n }\n\n return {\n defs,\n kitColumns,\n kitGroups,\n groupOf,\n declaredOrder,\n utilityIds,\n defaultRowHeaderId,\n declaredPinning: { start, end },\n };\n}\n","/* -------------------------------------------------------------------- */\n/* DataGrid CVA: every class the renderer uses. */\n/* */\n/* Custom properties consumed here are set by the renderer under the */\n/* 23-constraints runtime exception (case 1 setters; case 2 measurements):*/\n/* --dg-head-size, --dg-foot-size ResizeObserver on thead / tfoot */\n/* --dg-group-row-size ResizeObserver on the group row */\n/* --dg-pin-start-total, -end-total TanStack sizing or measured */\n/* --dg-pin-offset pinned cell offset (2nd+ per side) */\n/* --dg-col-size host size or user resize */\n/* --dg-pad-start, --dg-pad-end virtual spacer heights */\n/* --dg-gap virtual gap spacer height */\n/* --dg-depth sub-row depth */\n/* -------------------------------------------------------------------- */\n\nimport { cva } from 'class-variance-authority';\nimport { EDITOR_COMPACT_FIELDS_CLASS } from '../_shared/compact-editor-fields';\n\n/* ------------------------------------------------------------------ */\n/* Surfaces */\n/* ------------------------------------------------------------------ */\n\n/** The card surface and line colour, shared by both DOM shapes. */\nconst surface = [\n 'ds:rounded-[var(--radius-md)] ds:bg-[color:var(--background)] ds:shadow-[var(--shadow-sm)]',\n // The same softened line as DataTable: half-strength `--border`, or 35%\n // on the accessible themes, where `--border` is a full-contrast edge.\n 'ds:[--data-grid-line:color-mix(in_srgb,var(--border)_var(--data-grid-border-mix,50%),transparent)]',\n];\n\n/** Frame shape root (toolbar or pagination): a flex column holding the\n * toolbar slot, the scroll region and the pager slot. */\nexport const frameVariants = cva(\n [...surface, 'ds:flex ds:min-h-0 ds:flex-col'],\n {\n variants: {\n height: {\n auto: '',\n fill: 'ds:flex-1',\n },\n },\n defaultVariants: { height: 'auto' },\n },\n);\n\n/** The scroll region. In the no-chrome shape it is also the root, so it\n * carries the card surface. */\nexport const scrollerVariants = cva(\n [\n // The header and totals are sticky, so keyboard focus must not land\n // under them when the grid scrolls a control into view. Measured when\n // possible (grouped headers are taller), else today's clearance.\n 'ds:[scroll-padding-block-start:var(--dg-head-size,calc(var(--min-target-size)*2))]',\n 'ds:[scroll-padding-block-end:var(--dg-foot-size,calc(var(--min-target-size)*2))]',\n // Print every row: no clipping, no max size.\n 'ds:print:overflow-visible ds:print:[max-block-size:none]',\n ],\n {\n variants: {\n chrome: {\n false: surface,\n true: 'ds:min-h-0 ds:flex-1',\n },\n // Pinned columns: a focused centre control is never hidden under them\n // (WCAG 2.4.11). Measured totals when known, else today's clearance.\n pinned: {\n true: [\n 'ds:[scroll-padding-inline-start:var(--dg-pin-start-total,calc(var(--spacing-lg)*6))]',\n 'ds:[scroll-padding-inline-end:var(--dg-pin-end-total,calc(var(--spacing-lg)*6))]',\n ],\n false: '',\n },\n height: {\n auto: '',\n fill: 'ds:min-h-0 ds:flex-1',\n },\n },\n defaultVariants: { chrome: false, pinned: false, height: 'auto' },\n },\n);\n\n/** Toolbar and pager slots in the frame shape. Never printed. */\nexport const slotVariants = cva('ds:print:hidden', {\n variants: {\n slot: {\n toolbar: 'ds:shrink-0 ds:pb-[var(--spacing-sm)]',\n pager: [\n 'ds:flex ds:shrink-0 ds:flex-wrap ds:items-center ds:justify-between',\n 'ds:gap-[var(--spacing-sm)] ds:border-t ds:border-[color:var(--data-grid-line)]',\n 'ds:px-[var(--spacing-md)] ds:py-[var(--spacing-sm)]',\n ],\n },\n },\n});\n\n/** Range text beside the pager (\"Rows 26 to 50 of 312\"). */\nexport const pagerRangeVariants = cva(\n 'type-body-sm ds:m-0 ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] ds:text-[color:var(--muted-foreground)] ds:tabular-nums',\n);\n\n/** Spinner holder in the no-chrome shape while loading with rows. */\nexport const busyVariants = cva(\n 'ds:pointer-events-none ds:sticky ds:start-0 ds:top-0 ds:z-[4] ds:flex ds:justify-end ds:p-[var(--spacing-xs)] ds:print:hidden',\n);\n\n/* ------------------------------------------------------------------ */\n/* Table, columns, rows */\n/* ------------------------------------------------------------------ */\n\n// The totals row draws its own top line, and a table with none needs no\n// line against the frame, so the last body row never draws one. Spacer rows\n// render only with a height, so at the end of a virtual list the last data\n// row is the last child again.\nexport const tableVariants = cva(\n 'ds:w-full ds:border-separate ds:[border-spacing:0] ds:[&_tbody_tr:last-child>*]:border-b-0',\n {\n variants: {\n // Fixed layout: host sizes, resizing or virtualisation. Widths come\n // from <col> and do not jump while rows mount.\n fixed: {\n true: 'ds:table-fixed',\n false: '',\n },\n },\n defaultVariants: { fixed: false },\n },\n);\n\n/** `<col>` widths in fixed layout. */\nexport const colVariants = cva('', {\n variants: {\n kind: {\n text: 'ds:w-[var(--data-grid-col-size-text)]',\n number: 'ds:w-[var(--data-grid-col-size-number)]',\n date: 'ds:w-[var(--data-grid-col-size-date)]',\n utility: 'ds:w-[calc(var(--min-target-size)+var(--spacing-sm))]',\n // A host size or a user resize, set as `--dg-col-size`.\n sized: 'ds:w-[var(--dg-col-size)]',\n },\n printable: {\n true: '',\n false: 'ds:print:hidden',\n },\n },\n defaultVariants: { kind: 'text', printable: true },\n});\n\n/** Spacer rows of the virtual window: one cell spanning every column. */\nexport const spacerVariants = cva('ds:border-0 ds:p-0', {\n variants: {\n edge: {\n start: 'ds:h-[var(--dg-pad-start)]',\n end: 'ds:h-[var(--dg-pad-end)]',\n gap: 'ds:h-[var(--dg-gap)]',\n },\n },\n});\n\n/** Every grid cell. */\nexport const cellVariants = cva(\n 'ds:border-[color:var(--data-grid-line)] ds:px-[var(--spacing-md)]',\n {\n variants: {\n section: {\n head: [\n 'ds:h-[var(--min-target-size)] ds:py-[var(--spacing-sm)]',\n 'ds:sticky ds:z-[2] ds:border-b ds:align-bottom ds:bg-[color:var(--background)]',\n // Opaque background under the tint: the dark header surface is\n // translucent, and rows scroll beneath this cell.\n 'ds:[background-image:linear-gradient(var(--data-grid-header-surface,var(--muted)),var(--data-grid-header-surface,var(--muted)))]',\n // The eyebrow, as DataTable's header. CJK has no capitals to track.\n 'ds:[font-size:var(--data-grid-eyebrow-size,var(--font-size-xs))] ds:[font-weight:var(--font-weight-bold)] ds:uppercase ds:tracking-[0.04em] ds:text-[color:var(--data-grid-eyebrow-ink,var(--muted-foreground))]',\n 'ds:[&:lang(ja)]:tracking-normal ds:[&:lang(ko)]:tracking-normal ds:[&:lang(zh)]:tracking-normal',\n // A word longer than a fixed column (\"LIEFERANTENCODE\") breaks\n // inside its own cell, hyphenated where the language allows,\n // instead of running under the next header.\n 'ds:hyphens-auto ds:wrap-break-word',\n // Printed headers repeat on every page; sticky would pin them once.\n 'ds:print:static',\n ],\n // A header that spans a group of columns.\n group: [\n 'ds:h-[var(--min-target-size)] ds:py-[var(--spacing-sm)]',\n 'ds:sticky ds:z-[2] ds:border-b ds:align-bottom ds:bg-[color:var(--background)]',\n 'ds:[background-image:linear-gradient(var(--data-grid-header-surface,var(--muted)),var(--data-grid-header-surface,var(--muted)))]',\n 'ds:[font-size:var(--data-grid-group-size,var(--font-size-sm))] ds:[font-weight:var(--font-weight-semibold)] ds:text-[color:var(--foreground)]',\n 'ds:print:static',\n ],\n body: [\n 'type-body-sm ds:border-b ds:bg-[color:var(--background)] ds:align-middle',\n ],\n // Not `type-body-sm`: that class would win over the totals' weight.\n foot: [\n 'ds:h-[var(--min-target-size)] ds:py-[var(--spacing-sm)]',\n 'ds:sticky ds:bottom-0 ds:z-[2] ds:border-t ds:bg-[color:var(--muted)] ds:align-middle ds:[font-size:var(--font-size-sm)] ds:[font-weight:var(--font-weight-semibold)]',\n 'ds:print:static',\n ],\n // The full-width detail panel under an expanded row.\n detail: [\n 'type-body-sm ds:border-b ds:bg-[color:var(--background)] ds:py-[var(--spacing-md)]',\n ],\n },\n density: {\n default: '',\n compact: '',\n },\n // Header rows: the first sticks at the top, the second under it (a\n // cell spanning both rows sticks at the top).\n stick: {\n none: '',\n top: 'ds:top-0',\n below: 'ds:top-[var(--dg-group-row-size,0)]',\n },\n align: {\n start: 'ds:text-start',\n end: 'ds:text-end',\n },\n // The first pinned column on a side sits at the edge; later ones at\n // their measured or computed offset.\n pin: {\n none: '',\n start: 'ds:sticky ds:start-0',\n end: 'ds:sticky ds:end-0',\n startOffset: 'ds:sticky ds:[inset-inline-start:var(--dg-pin-offset)]',\n endOffset: 'ds:sticky ds:[inset-inline-end:var(--dg-pin-offset)]',\n },\n // The line between pinned and scrolling columns.\n divider: {\n none: '',\n end: 'ds:border-e',\n start: 'ds:border-s',\n },\n utility: {\n true: [\n 'ds:w-[calc(var(--min-target-size)+var(--spacing-sm))] ds:px-[var(--spacing-xs)] ds:text-center',\n // The Checkbox root is an inline-flex box on the text baseline,\n // which leaves it a descender's height off centre. As a block it\n // centres in a body cell and sits on the header's bottom edge, and\n // the select-all and row boxes share one inline centre.\n 'ds:[&>[data-component=checkbox]]:flex ds:[&>[data-component=checkbox]]:justify-center',\n // The expander fills a compact row, so its ring is drawn inset.\n // A checkbox keeps its own ring outside the box: inset, the ring\n // would sit on a checked box's fill in the same colour. The cell\n // leaves room for it on every side.\n 'ds:[&_[data-dg-control=expand]]:focus-visible:outline-offset-[calc(var(--focus-ring-width)*-1)]',\n ],\n false: '',\n },\n editable: {\n // A `size=\"sm\"` input fits the row without growing it.\n true: 'ds:py-[var(--spacing-2xs)]',\n false: '',\n },\n selected: {\n true: [\n 'ds:bg-[color:color-mix(in_srgb,var(--primary)_var(--data-grid-selected-mix),var(--background))]',\n // The tint disappears in forced colours; a system-colour edge\n // stays. The checkbox is always the non-colour cue.\n 'ds:forced-colors:border-b-[length:var(--border-width-md)] ds:forced-colors:border-[color:Highlight]',\n ],\n false: '',\n },\n wrap: {\n true: 'ds:whitespace-normal ds:break-words',\n false: '',\n },\n printable: {\n true: '',\n false: 'ds:print:hidden',\n },\n },\n compoundVariants: [\n {\n section: 'body',\n density: 'default',\n // `--min-target-size` straight, not the `--data-grid-row-size`\n // alias: an alias declared on `:root` resolves there, so a nested\n // accessible ThemeRoot would inherit the light value.\n className: 'ds:h-[var(--min-target-size)] ds:py-[var(--spacing-sm)]',\n },\n {\n section: 'body',\n density: 'compact',\n className:\n 'ds:h-[var(--data-grid-row-size-compact)] ds:py-[var(--spacing-2xs)]',\n },\n // Compact rows are shorter than the checkbox's target area, so the\n // area is clamped to the box: a click near a row's lower edge never\n // reaches the next row's box. The accessible themes, whose compact\n // rows are `--min-target-size` high, raise it back to the target\n // through `--accessible-target-floor` (unset elsewhere: inset 0).\n {\n section: 'body',\n density: 'compact',\n utility: true,\n className:\n 'ds:[&_button]:before:inset-y-[calc((var(--accessible-target-floor,100%)-100%)/-2)]',\n },\n {\n section: ['body', 'detail'],\n pin: ['start', 'end', 'startOffset', 'endOffset'],\n className: 'ds:z-[1]',\n },\n {\n section: ['head', 'group', 'foot'],\n pin: ['start', 'end', 'startOffset', 'endOffset'],\n className: 'ds:z-[3]',\n },\n ],\n defaultVariants: {\n density: 'default',\n stick: 'none',\n align: 'start',\n pin: 'none',\n divider: 'none',\n utility: false,\n editable: false,\n selected: false,\n wrap: false,\n printable: true,\n },\n },\n);\n\n/** Sub-row indent on the row-header cell (`--dg-depth` set per cell). */\nexport const depthVariants = cva(\n 'ds:ps-[calc(var(--spacing-md)+var(--dg-depth)*var(--data-grid-depth-indent))]',\n);\n\n/* ------------------------------------------------------------------ */\n/* Header controls */\n/* ------------------------------------------------------------------ */\n\n/** Label, tip, filter and separator inside a leaf header. */\nexport const headerContentVariants = cva(\n 'ds:flex ds:min-w-0 ds:items-center ds:gap-[var(--spacing-2xs)]',\n {\n variants: {\n align: {\n start: 'ds:justify-start',\n end: 'ds:justify-end',\n },\n },\n defaultVariants: { align: 'start' },\n },\n);\n\n/* 05:9 under the accessible themes: one constant for DataGrid and\n RowActions, kept in `_shared`. */\nexport {\n accessibleTargetBlockClass,\n accessibleTargetSquareClass,\n} from '../_shared/accessible-target';\n\nconst insetRing = [\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid ds:focus-visible:outline-[color:var(--ring)]',\n 'ds:focus-visible:outline-offset-[calc(var(--focus-ring-width)*-1)]',\n 'ds:forced-colors:focus-visible:outline-[Highlight]',\n];\n\n/** The sort button: the header label and the direction glyph. */\nexport const sortButtonVariants = cva([\n 'ds:inline-flex ds:[min-block-size:var(--accessible-target-floor,var(--spacing-lg))] ds:min-w-0 ds:items-center ds:gap-[var(--spacing-2xs)]',\n 'ds:m-0 ds:cursor-pointer ds:rounded-[var(--radius-sm)] ds:border-0 ds:bg-transparent ds:p-0',\n 'ds:[font:inherit] ds:uppercase ds:[letter-spacing:inherit] ds:text-[color:inherit] ds:text-start',\n 'ds:hover:text-[color:var(--foreground)] ds:active:text-[color:var(--foreground)]',\n ...insetRing,\n]);\n\n/** The direction glyph; muted while the column is unsorted. */\nexport const sortIconVariants = cva('ds:size-3.5 ds:shrink-0', {\n variants: {\n active: {\n true: 'ds:text-[color:var(--foreground)]',\n false: 'ds:text-[color:var(--muted-foreground)]',\n },\n },\n defaultVariants: { active: false },\n});\n\n/** Sort level number from the second level on. */\nexport const sortPriorityVariants = cva(\n 'ds:[font-size:var(--font-size-xs)] ds:tabular-nums ds:text-[color:var(--foreground)]',\n);\n\n/** The resize separator at the header's inline-end edge (WCAG 2.5.8 and\n * the kit's 05:9 rule, as `accessibleTargetSquareClass`):\n * - hit area `--spacing-lg` (24 px) wide by the header's full block size\n * (`--min-target-size`), raised to `--min-target-size` on both axes in\n * the accessible themes through `--accessible-target-floor`;\n * - it sits inside its own header cell (`end-0`), never over the next\n * column, and `resizableHeadCellClass` reserves exactly its width as the\n * cell's inline-end padding in every theme, so the sort button and\n * filter trigger never sit under it;\n * - not wider in the default theme: centring a 44 px area on the column\n * edge would cover the next header's sort button, and a 44 px padding\n * would leave a 64 px column no room for its label. */\nexport const separatorVariants = cva(\n [\n 'ds:absolute ds:inset-y-0 ds:end-0 ds:z-[1] ds:flex ds:w-[var(--accessible-target-floor,var(--spacing-lg))] ds:justify-center',\n 'ds:cursor-col-resize ds:touch-none ds:select-none ds:print:hidden',\n 'ds:after:block ds:after:h-full ds:after:w-[length:var(--border-width-md)] ds:after:content-[\"\"]',\n // `--border` and `--ring` straight (see the body row size above): the\n // `--data-grid-resize-line*` aliases resolve on `:root` only.\n 'ds:after:bg-[color:var(--border)]',\n 'ds:hover:after:bg-[color:var(--ring)]',\n 'ds:focus-visible:after:bg-[color:var(--ring)]',\n 'ds:data-[resizing]:after:bg-[color:var(--ring)]',\n 'ds:forced-colors:after:bg-[CanvasText]',\n ...insetRing,\n ],\n {\n variants: {\n // The header already has the pinned-column border at this edge: the\n // idle line would be a second, parallel one a few pixels inside it.\n // Hover, focus and a drag still show the line.\n edge: {\n true: 'ds:after:bg-transparent',\n false: '',\n },\n },\n defaultVariants: { edge: false },\n },\n);\n\n/** A resizable leaf header cell: its inline-end padding is the\n * separator's width in every theme (24 px, or `--min-target-size` in the\n * accessible themes), so the sort button and filter trigger never sit\n * under the separator. */\nexport const resizableHeadCellClass =\n 'ds:pe-[var(--accessible-target-floor,var(--spacing-lg))]';\n\n/* ------------------------------------------------------------------ */\n/* Body controls */\n/* ------------------------------------------------------------------ */\n\n/** The expander chevron: rotates when open, flips in RTL while closed. */\nexport const expanderIconVariants = cva(\n 'ds:size-4 ds:motion-safe:transition-transform ds:motion-safe:duration-[var(--animation-duration)]',\n {\n variants: {\n expanded: {\n true: 'ds:rotate-90',\n false: 'ds:rtl:-scale-x-100',\n },\n },\n defaultVariants: { expanded: false },\n },\n);\n\n/** The muted dash for a row that cannot be selected. */\nexport const noneMarkVariants = cva('ds:text-[color:var(--muted-foreground)]');\n\n/** The detail panel cell stays in view when scrolled sideways. */\nexport const detailContentVariants = cva('ds:sticky ds:start-0 ds:max-w-full');\n\n/** A skeleton row's placeholder bar. */\nexport const skeletonBarVariants = cva('ds:block', {\n variants: {\n width: {\n short: 'ds:w-2/5',\n medium: 'ds:w-3/5',\n long: 'ds:w-4/5',\n },\n },\n defaultVariants: { width: 'medium' },\n});\n\n/** The EmptyState holder row: one cell over every column. */\nexport const stateCellVariants = cva(\n 'ds:border-0 ds:bg-[color:var(--background)] ds:p-[var(--spacing-md)]',\n);\n\n/** Built-in editors fill their cell. */\nexport const editorVariants = cva('ds:w-full ds:min-w-0');\n\n/** Wraps a built-in editor: the kit's compact field exception (32 px,\n * raised to `--min-target-size` under the accessible themes and on touch\n * widths) instead of `size=\"sm\"`, so a Select's menu keeps the target. */\nexport const editorFieldVariants = cva([\n 'ds:w-full ds:min-w-0',\n EDITOR_COMPACT_FIELDS_CLASS,\n]);\n\n/** An editor's error text under the input. */\nexport const editorErrorVariants = cva(\n 'type-body-sm ds:mt-[var(--spacing-2xs)] ds:block ds:text-[color:var(--destructive)]',\n);\n\n/** Text read as part of its cell's name but not shown, kept inline: the\n * name algorithm adds no space around an inline span (it does around the\n * block-level `sr-only` box), and font size 0 gives it no width. Used for\n * a sub-row's \", level 2\" so the row header reads \"Alginate 500 g,\n * level 2\". `print:hidden` keeps it off paper. */\nexport const inlineHiddenTextClass =\n 'ds:inline ds:[font-size:0] ds:leading-none ds:print:hidden';\n\n/** Visually hidden level text and similar inline extras. */\nexport const maskVariants = cva('ds:text-[color:var(--muted-foreground)]');\n","/* -------------------------------------------------------------------- */\n/* DataGrid always-on editors (design § 3.3, 4.2). */\n/* */\n/* Built-in number, text and select editors use the kit inputs inside */\n/* the kit's compact field exception (`editorFieldVariants`: 32 px, */\n/* raised to the target size under the accessible themes); a `custom` */\n/* editor is whatever the host renders (Combobox */\n/* with \"create new item\"). Editors are always on, not click-to-edit, so */\n/* Tab order is DOM order. Values stay with the host: every change goes */\n/* to `edit.onChange(row, next)` and the grid never mutates `rows`. */\n/* */\n/* Names: each editor takes `aria-labelledby` pointing at the visible */\n/* column header and a `hidden` row-name span in its cell, so the row */\n/* name stays text and never becomes an attribute. Errors: `aria-invalid` */\n/* plus `aria-describedby` to the cell's visible error text. */\n/* Rendered inside the grid's marked root. */\n/* -------------------------------------------------------------------- */\n\nimport { useId } from 'react';\nimport { FormFieldContext } from '../form-field/form-field-context';\nimport { NumberInput, type NumberInputValidity } from '../number-input';\nimport { Select } from '../select';\nimport { TextInput } from '../text-input';\nimport { editorFieldVariants, editorVariants } from './data-grid.variants';\nimport type { DataGridColumnEdit, DataGridEditContext } from './types';\n\nexport interface DataGridEditorProps<TData> {\n edit: DataGridColumnEdit<TData>;\n row: TData;\n context: DataGridEditContext;\n /** Id of the cell's hidden host hint (number editor only). */\n descriptionId?: string;\n /** The number editor's own verdict, so the cell can show kit copy when\n * the host's `error` says nothing. */\n onNumberValidityChange?: (validity: NumberInputValidity) => void;\n}\n\nexport function DataGridEditor<TData>({\n edit,\n row,\n context,\n descriptionId,\n onNumberValidityChange,\n}: DataGridEditorProps<TData>) {\n const tone = context.invalid ? 'error' : 'default';\n const invalid = context.invalid || undefined;\n // Only an error id is passed, never an `undefined` key: an input that\n // spreads its rest props would let that key overwrite its own\n // description (NumberInput's unit).\n const describedBy = context.errorId\n ? { 'aria-describedby': context.errorId }\n : {};\n const numberFieldId = useId();\n\n if (edit.kind === 'custom') return <>{edit.render(row, context)}</>;\n return <div className={editorFieldVariants()}>{builtIn()}</div>;\n\n function builtIn() {\n switch (edit.kind) {\n case 'number': {\n const unit =\n typeof edit.unit === 'function' ? edit.unit(row) : edit.unit;\n // The hint and error reach NumberInput as field context, not as\n // `aria-describedby`: NumberInput joins the field's description\n // with its unit, so an invalid quantity reads its hint, its error\n // and its unit (a passed `aria-describedby` would replace the unit\n // link).\n return (\n <FormFieldContext.Provider\n value={{\n id: numberFieldId,\n helpId: `${numberFieldId}-help`,\n errorId: context.errorId ?? `${numberFieldId}-error`,\n describedBy: [descriptionId, context.errorId]\n .filter(Boolean)\n .join(' '),\n invalid: Boolean(context.invalid),\n required: false,\n disabled: false,\n }}\n >\n <NumberInput\n variant=\"plain\"\n className={editorVariants()}\n value={edit.getValue(row)}\n onChange={(next) => edit.onChange(row, next)}\n onValidityChange={(validity) => {\n onNumberValidityChange?.(validity);\n edit.onValidityChange?.(row, validity);\n }}\n mode={edit.mode ?? 'decimal'}\n currency={edit.currency}\n min={edit.min}\n max={edit.max}\n step={edit.step}\n minimumFractionDigits={edit.minimumFractionDigits}\n maximumFractionDigits={edit.maximumFractionDigits}\n unit={unit}\n tone={tone}\n aria-labelledby={context.labelledBy}\n aria-invalid={invalid}\n />\n </FormFieldContext.Provider>\n );\n }\n case 'text':\n return (\n <TextInput\n className={editorVariants()}\n value={edit.getValue(row)}\n onChange={(event) => edit.onChange(row, event.target.value)}\n maxLength={edit.maxLength}\n placeholder={edit.placeholder}\n tone={tone}\n aria-labelledby={context.labelledBy}\n aria-invalid={invalid}\n {...describedBy}\n />\n );\n case 'select':\n return (\n <Select\n className={editorVariants()}\n options={edit.options.map((option) => ({\n value: option.value,\n label: option.label,\n }))}\n value={edit.getValue(row) ?? ''}\n onValueChange={(next) =>\n edit.onChange(row, next === '' ? null : next)\n }\n placeholder={edit.placeholder}\n tone={tone}\n aria-labelledby={context.labelledBy}\n aria-invalid={invalid}\n {...describedBy}\n />\n );\n default:\n return null;\n }\n }\n}\n","/* -------------------------------------------------------------------- */\n/* DataGrid keyboard model (design § 4). */\n/* */\n/* A native table: Tab moves through every control in DOM order (always- */\n/* on editors included) and the grid never intercepts Tab. On top of */\n/* that, for sighted keyboard users: */\n/* - ArrowDown / ArrowUp / Home / End move between row checkboxes, or */\n/* between expanders, scrolling a virtualised row in first; */\n/* - Shift is captured on keydown and pointerdown, because the Radix */\n/* checkbox reports only `onCheckedChange` and a keyboard click may */\n/* not carry `shiftKey`; */\n/* - the resize separator takes Arrow keys (RTL swapped), Shift for a */\n/* larger step, Home and End; */\n/* - focus is remembered as (row id, cell index) and restored when a */\n/* sort, filter or the virtual window remounts its row. */\n/* Nothing here runs for a key inside an editor, a combobox, a host */\n/* control or an IME composition. */\n/* -------------------------------------------------------------------- */\n\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n type KeyboardEvent as ReactKeyboardEvent,\n type RefObject,\n} from 'react';\n\nimport { DATA_GRID_RESIZE_STEP_PX } from './types';\n\n/** `data-dg-control` values on grid-owned row controls. */\nexport type DataGridRowControl = 'select' | 'expand';\n\n/** Attribute that marks a grid-owned row control (not row data). */\nexport const DG_CONTROL_ATTR = 'data-dg-control';\n\n/** A target that owns its own keys: inputs, editors, comboboxes. */\nexport function isEditableTarget(target: EventTarget | null): boolean {\n if (!(target instanceof Element)) return false;\n if (\n target.closest(\n 'input, textarea, select, [contenteditable=\"\"], [contenteditable=\"true\"]',\n )\n ) {\n return true;\n }\n return (\n target.closest(\n '[role=\"combobox\"], [role=\"textbox\"], [role=\"spinbutton\"]',\n ) !== null\n );\n}\n\n/** The grid-owned row control the event came from, or `null`. */\nexport function rowControlOf(\n target: EventTarget | null,\n): DataGridRowControl | null {\n if (!(target instanceof Element)) return null;\n const value = target.getAttribute(DG_CONTROL_ATTR);\n return value === 'select' || value === 'expand' ? value : null;\n}\n\n/* ------------------------------------------------------------------ */\n/* Shift capture */\n/* ------------------------------------------------------------------ */\n\nexport interface ShiftCapture {\n onPointerDown: (event: { shiftKey: boolean }) => void;\n onKeyDown: (event: { shiftKey: boolean; key: string }) => void;\n /** The Shift state of the last activation; resets after reading. */\n take: (fallback?: boolean) => boolean;\n}\n\n/** Records Shift on pointerdown and keydown for a control whose change\n * callback carries no event (Radix checkbox, keyboard-activated click). */\nexport function useShiftCapture(): ShiftCapture {\n const shift = useRef(false);\n const onPointerDown = useCallback((event: { shiftKey: boolean }) => {\n shift.current = event.shiftKey;\n }, []);\n const onKeyDown = useCallback((event: { shiftKey: boolean; key: string }) => {\n if (event.key === ' ' || event.key === 'Enter')\n shift.current = event.shiftKey;\n }, []);\n const take = useCallback((fallback = false) => {\n const value = shift.current || fallback;\n shift.current = false;\n return value;\n }, []);\n return { onPointerDown, onKeyDown, take };\n}\n\n/* ------------------------------------------------------------------ */\n/* Resize separator */\n/* ------------------------------------------------------------------ */\n\n/**\n * The new width for a key on the separator, or `null` when the key is not\n * one of the separator's. ArrowRight and ArrowLeft move by\n * `DATA_GRID_RESIZE_STEP_PX` (Shift: four times that); in RTL they swap,\n * so the key toward the inline end always widens. Home and End jump to the\n * bounds.\n */\nexport function resizeWidthForKey(\n key: string,\n shiftKey: boolean,\n direction: 'ltr' | 'rtl',\n current: number,\n min: number,\n max: number,\n): number | null {\n const step = DATA_GRID_RESIZE_STEP_PX * (shiftKey ? 4 : 1);\n const widen = direction === 'rtl' ? 'ArrowLeft' : 'ArrowRight';\n const narrow = direction === 'rtl' ? 'ArrowRight' : 'ArrowLeft';\n let next: number;\n if (key === widen) next = current + step;\n else if (key === narrow) next = current - step;\n else if (key === 'Home') next = min;\n else if (key === 'End') next = max;\n else return null;\n return Math.min(max, Math.max(min, Math.round(next)));\n}\n\n/* ------------------------------------------------------------------ */\n/* Arrow movement between row controls */\n/* ------------------------------------------------------------------ */\n\nexport interface RowNavigation {\n /** Body item indexes that hold this control, in display order. */\n indexesWith: (control: DataGridRowControl) => number[];\n /** Row id of a body item. */\n rowIdAt: (index: number) => string | undefined;\n /** Item index of a row id. */\n indexOf: (rowId: string) => number | undefined;\n /** Scrolls a virtualised item in and keeps it mounted. */\n reveal: (index: number) => void;\n}\n\n/* ------------------------------------------------------------------ */\n/* Own rows */\n/* ------------------------------------------------------------------ */\n/* A grid can sit inside another (a detail panel, a cell, a Dialog */\n/* opened from a row: React events cross portals). Row ids are only */\n/* unique per grid, so every lookup below takes the body's direct rows, */\n/* never a nested grid's. */\n\n/** The body's own data rows, in DOM order (nested grids excluded). */\nexport function ownRows(body: Element): HTMLElement[] {\n return Array.from(\n body.querySelectorAll<HTMLElement>(':scope > tr[data-row-id]'),\n );\n}\n\n/** The body's own data row with this id, or `null`. */\nexport function findOwnRow(body: Element, rowId: string): HTMLElement | null {\n for (const row of ownRows(body)) {\n if (row.dataset.rowId === rowId) return row;\n }\n return null;\n}\n\n/** The body's own data row that holds `target`, or `null` when `target`\n * sits in a nested grid, a detail panel or outside the body. */\nexport function ownRowOf(\n body: Element,\n target: EventTarget | null,\n): HTMLElement | null {\n if (!(target instanceof Element)) return null;\n let node: Element | null = target;\n while (node && node.parentElement !== body) node = node.parentElement;\n if (\n node instanceof HTMLElement &&\n node.tagName === 'TR' &&\n node.dataset.rowId !== undefined\n ) {\n return node;\n }\n return null;\n}\n\n/** The row's own cell that holds `target` (not a nested grid's cell). */\nfunction ownCellOf(row: Element, target: Element): Element | null {\n let node: Element | null = target;\n while (node && node.parentElement !== row) node = node.parentElement;\n return node;\n}\n\n/** The row's own control, never one of a grid nested in a cell. */\nfunction ownControl(\n row: Element,\n control: DataGridRowControl,\n): HTMLElement | null {\n for (const element of row.querySelectorAll<HTMLElement>(\n `[${DG_CONTROL_ATTR}=\"${control}\"]`,\n )) {\n if (element.closest('tr') === row) return element;\n }\n return null;\n}\n\nfunction findControl(\n body: HTMLElement,\n rowId: string,\n control: DataGridRowControl,\n): HTMLElement | null {\n const row = findOwnRow(body, rowId);\n return row ? ownControl(row, control) : null;\n}\n\n/** Focuses `control` on item `index`, scrolling it in first when needed. */\nexport function focusRowControl(\n body: HTMLElement,\n navigation: RowNavigation,\n index: number,\n control: DataGridRowControl,\n): void {\n const rowId = navigation.rowIdAt(index);\n if (rowId === undefined) return;\n const now = findControl(body, rowId, control);\n if (now) {\n now.focus();\n return;\n }\n navigation.reveal(index);\n const attempt = (tries: number) => {\n const element = findControl(body, rowId, control);\n if (element) {\n element.focus();\n return;\n }\n if (tries > 0 && typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(() => attempt(tries - 1));\n }\n };\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(() => attempt(3));\n }\n}\n\n/**\n * `<tbody>` keydown: Arrow keys, Home and End between row checkboxes or\n * expanders. Returns without acting for any other target, so editors,\n * comboboxes and host menus keep their keys.\n */\nexport function handleBodyKeyDown(\n event: ReactKeyboardEvent<HTMLElement>,\n navigation: RowNavigation,\n): void {\n if (\n event.defaultPrevented ||\n event.nativeEvent.isComposing ||\n event.altKey ||\n event.ctrlKey ||\n event.metaKey\n ) {\n return;\n }\n if (isEditableTarget(event.target)) return;\n const control = rowControlOf(event.target);\n if (!control) return;\n const { key } = event;\n if (\n key !== 'ArrowDown' &&\n key !== 'ArrowUp' &&\n key !== 'Home' &&\n key !== 'End'\n ) {\n return;\n }\n // Only this grid's rows: a key from a nested grid (or a portal opened\n // from a row) bubbles here too, and its row ids may match ours.\n const row = ownRowOf(event.currentTarget, event.target);\n const rowId = row?.dataset.rowId;\n if (rowId === undefined) return;\n const current = navigation.indexOf(rowId);\n if (current === undefined) return;\n const indexes = navigation.indexesWith(control);\n if (indexes.length === 0) return;\n let target: number | undefined;\n if (key === 'Home') target = indexes[0];\n else if (key === 'End') target = indexes[indexes.length - 1];\n else if (key === 'ArrowDown') target = indexes.find((i) => i > current);\n else {\n for (let i = indexes.length - 1; i >= 0; i -= 1) {\n if (indexes[i] < current) {\n target = indexes[i];\n break;\n }\n }\n }\n event.preventDefault();\n if (target === undefined || target === current) return;\n focusRowControl(event.currentTarget, navigation, target, control);\n}\n\n/* ------------------------------------------------------------------ */\n/* Focus memory */\n/* ------------------------------------------------------------------ */\n\ninterface FocusMemory {\n rowId: string;\n cellIndex: number;\n control: DataGridRowControl | null;\n}\n\n/**\n * Remembers which row and cell hold focus, tells the virtual window to keep\n * that row mounted, and puts focus back when the row is remounted after a\n * sort, a filter or a scroll. If the row is gone, focus goes to the scroll\n * region, never to `body`. If the row stays but the focused control went\n * (`readOnly` turned an editor into text, a box was removed), focus goes to\n * the same cell, else the row's select box, else its row header. Call it\n * from the component that renders the body, so it runs on every commit.\n */\nexport function useFocusMemory({\n bodyRef,\n scrollRef,\n navigation,\n keepMounted,\n onFocusedColumnIndex,\n}: {\n bodyRef: RefObject<HTMLElement | null>;\n scrollRef: RefObject<HTMLElement | null>;\n navigation: RowNavigation;\n /** Virtual window: keep this item mounted (`null` releases). */\n keepMounted: (index: number | null) => void;\n /** Visible cell index holding focus, or `null` (responsive hiding keeps\n * that column). */\n onFocusedColumnIndex?: (cellIndex: number | null) => void;\n}): void {\n const memory = useRef<FocusMemory | null>(null);\n // The element that held focus, to see in the commit itself that it was\n // removed (a browser moves focus to `body` without a reliable focusout).\n const focused = useRef<Element | null>(null);\n const lost = useRef(false);\n const navigationRef = useRef(navigation);\n navigationRef.current = navigation;\n\n useEffect(() => {\n const body = bodyRef.current;\n if (!body) return undefined;\n const onFocusIn = (event: FocusEvent) => {\n const target = event.target as Element | null;\n // This grid's rows only, never a nested grid's.\n const row = ownRowOf(body, target);\n const cell = row && target ? ownCellOf(row, target) : null;\n if (!row || !cell || !target || row.dataset.rowId === undefined) {\n return;\n }\n const cellIndex = Array.prototype.indexOf.call(\n row.children,\n cell,\n ) as number;\n memory.current = {\n rowId: row.dataset.rowId,\n cellIndex,\n control: rowControlOf(target),\n };\n focused.current = target;\n lost.current = false;\n keepMounted(navigationRef.current.indexOf(row.dataset.rowId) ?? null);\n onFocusedColumnIndex?.(cellIndex);\n };\n const onFocusOut = (event: FocusEvent) => {\n const next = event.relatedTarget as Node | null;\n if (next && body.contains(next)) return;\n const target = event.target as Element | null;\n // A blur caused by the row unmounting: restore after the render.\n queueMicrotask(() => {\n if (target && !target.isConnected && memory.current) {\n lost.current = true;\n return;\n }\n if (!next || !body.contains(next)) {\n memory.current = null;\n focused.current = null;\n keepMounted(null);\n onFocusedColumnIndex?.(null);\n }\n });\n };\n body.addEventListener('focusin', onFocusIn);\n body.addEventListener('focusout', onFocusOut);\n return () => {\n body.removeEventListener('focusin', onFocusIn);\n body.removeEventListener('focusout', onFocusOut);\n };\n }, [bodyRef, keepMounted, onFocusedColumnIndex]);\n\n // Every commit, not only when `renderKey` changes: a prop such as\n // `readOnly` swaps an editor for text, or removes a focused control,\n // without changing the rows. Detected here, in the commit, before a\n // Dialog's focus trap moves focus to its container.\n useLayoutEffect(() => {\n if (!memory.current) return;\n const active = document.activeElement;\n const atBody = !active || active === document.body;\n const was = focused.current;\n if (was && !was.isConnected && atBody) lost.current = true;\n if (!lost.current) return;\n if (!atBody) {\n lost.current = false;\n return;\n }\n const body = bodyRef.current;\n if (!body) return;\n const { rowId, cellIndex, control } = memory.current;\n const index = navigationRef.current.indexOf(rowId);\n if (index === undefined) {\n // The row is gone (filtered out): the scroll region takes focus.\n lost.current = false;\n memory.current = null;\n focused.current = null;\n keepMounted(null);\n const scroller = scrollRef.current;\n if (scroller) {\n if (!scroller.hasAttribute('tabindex'))\n scroller.setAttribute('tabindex', '-1');\n scroller.focus();\n }\n return;\n }\n // A virtualised row not mounted yet: wait for the next commit.\n const row = findOwnRow(body, rowId);\n if (!row) return;\n lost.current = false;\n const cell = row.children[cellIndex] as HTMLElement | undefined;\n const target =\n (control ? ownControl(row, control) : null) ??\n cell?.querySelector<HTMLElement>(\n 'button:not([disabled]), input:not([disabled]), select, textarea, a[href], [tabindex]:not([tabindex=\"-1\"])',\n ) ??\n // Nothing focusable left in that cell (an editor now shows text, a\n // box the row lost): the row's select box, else its row header.\n ownControl(row, 'select') ??\n row.querySelector<HTMLElement>(':scope > th[scope=\"row\"]');\n if (!target) return;\n if (target.tagName === 'TH' && !target.hasAttribute('tabindex')) {\n target.setAttribute('tabindex', '-1');\n }\n target.focus();\n });\n}\n","/* -------------------------------------------------------------------- */\n/* DataGrid body (design § 3.3): rows, the selection cell, the expander, */\n/* sub-row indent, detail rows, editors, masked cells and the virtual */\n/* spacers. Also the renderer-internal types header and footer share. */\n/* */\n/* Only `row.id` reaches the DOM (`data-row-id`). Row-scoped controls are */\n/* named with `aria-labelledby` pointing at a `hidden` span whose text is */\n/* the translated full name (\"Select {{row}}\"), so the row name is text, */\n/* never an attribute. Editors and cell controls are named by the visible */\n/* column header plus a `hidden` row-name span (\"Quantity Nitrile gloves */\n/* M\"): a visible part keeps axe `label-title-only` green when the field */\n/* also has a description (a unit, an error). Ids are built from `useId`, */\n/* indexes and the encoded column id. */\n/* Rendered inside the grid's marked root. */\n/* -------------------------------------------------------------------- */\n\nimport {\n Fragment,\n memo,\n type CSSProperties,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n type RefObject,\n useState,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { ChevronRight } from 'lucide-react';\nimport type { Cell, Column, Row, Table } from '@tanstack/react-table';\n\nimport { formatNumber } from '../_shared/format-number';\nimport type { NumberInputValidity } from '../number-input';\nimport { privacyMask } from '../_shared/privacy-mask-text';\nimport { IconButton } from '../button/icon-button';\nimport { Checkbox } from '../checkbox';\nimport { VisuallyHidden } from '../visually-hidden';\nimport { getDataGridHostMask } from './columns';\nimport {\n cellVariants,\n depthVariants,\n detailContentVariants,\n accessibleTargetSquareClass,\n editorErrorVariants,\n expanderIconVariants,\n inlineHiddenTextClass,\n maskVariants,\n noneMarkVariants,\n spacerVariants,\n} from './data-grid.variants';\nimport { DataGridEditor } from './editors';\nimport type { DataGridFeatures } from './features';\nimport { DG_CONTROL_ATTR, useShiftCapture } from './keyboard';\nimport type {\n DataGridCellContext,\n DataGridColumn,\n DataGridColumnGroup,\n DataGridEditContext,\n DataGridNumberEdit,\n DataGridSelectionApi,\n DataGridStore,\n DataGridTableMeta,\n} from './types';\n\n/* ------------------------------------------------------------------ */\n/* Renderer-internal types */\n/* ------------------------------------------------------------------ */\n\nexport type DgTable<TData extends object> = Table<DataGridFeatures, TData>;\nexport type DgRow<TData extends object> = Row<DataGridFeatures, TData>;\nexport type DgColumn<TData extends object> = Column<\n DataGridFeatures,\n TData,\n unknown\n>;\nexport type DgCell<TData extends object> = Cell<\n DataGridFeatures,\n TData,\n unknown\n>;\n\n/** How a pinned column sticks: the first on a side at the edge, later ones\n * at an offset; the divider on the boundary column. */\nexport interface DataGridPinPresentation {\n pin: 'none' | 'start' | 'end' | 'startOffset' | 'endOffset';\n divider: 'none' | 'start' | 'end';\n /** px from the edge for `startOffset` / `endOffset` (measured). */\n offset: number | null;\n}\n\nexport const NO_PIN: DataGridPinPresentation = {\n pin: 'none',\n divider: 'none',\n offset: null,\n};\n\n/** Everything the header, body and footer read. Built once per render by\n * `data-grid.tsx` from the engine. */\nexport interface DataGridRenderModel<TData extends object> {\n table: DgTable<TData>;\n store: DataGridStore;\n kitColumns: ReadonlyMap<string, DataGridColumn<TData>>;\n kitGroups: ReadonlyMap<string, DataGridColumnGroup>;\n selection: DataGridSelectionApi;\n meta: DataGridTableMeta;\n /** `useId()` of the grid: prefix of every generated id. */\n idBase: string;\n density: 'default' | 'compact';\n dataMode: 'client' | 'server';\n direction: 'ltr' | 'rtl';\n privacyMode: boolean;\n /** `DataGridProps.hostTextPrivacySafe`: host errors, descriptions and\n * reasons show as written on a masked row. */\n hostTextPrivacySafe: boolean;\n pins: ReadonlyMap<string, DataGridPinPresentation>;\n /** Visible leaf columns in DOM order (start-pinned, centre, end-pinned),\n * the order `row.getVisibleCells()` uses. */\n visibleColumns: readonly DgColumn<TData>[];\n /** Their ids joined: a memoised body row compares this, not the array. */\n visibleColumnsKey: string;\n /** The model of the last committed render. Event handlers in a memoised\n * row read it, so a row that did not re-render never acts on a stale\n * selection or table state. */\n latest: { readonly current: DataGridRenderModel<TData> | null };\n /** The data column whose cells are `<th scope=\"row\">`. */\n rowHeaderColumnId: string | null;\n renderDetail?: (row: TData) => ReactNode;\n /** `DataGridProps.readOnly`: the reason every selectable box gives while\n * the whole grid is read-only, or `null`. */\n readOnlyReason: string | null;\n}\n\n/** One body item: a row, or the detail panel under an expanded row. */\nexport type DataGridBodyItem<TData extends object> =\n | { kind: 'row'; key: string; row: DgRow<TData> }\n | { kind: 'detail'; key: string; row: DgRow<TData> };\n\n/** Utility column kinds from the v9 column meta. */\nexport function columnKind<TData extends object>(\n column: DgColumn<TData>,\n): 'data' | 'group' | 'select' | 'expand' {\n return column.columnDef.meta?.kind ?? 'data';\n}\n\n/** The CSS custom property a pinned cell needs, if any. Inline style only\n * under 23-constraints §Runtime-computed dimensions (case 1 setter, case 2\n * value: measured from the pinned header cells). */\nexport function pinStyle(\n presentation: DataGridPinPresentation,\n): CSSProperties | undefined {\n if (presentation.offset === null) return undefined;\n if (presentation.pin !== 'startOffset' && presentation.pin !== 'endOffset') {\n return undefined;\n }\n return { '--dg-pin-offset': `${presentation.offset}px` } as CSSProperties;\n}\n\n/** Is this kit column printed? Utility columns never are. */\nexport function isPrintable<TData>(\n kind: 'data' | 'group' | 'select' | 'expand',\n kit: DataGridColumn<TData> | undefined,\n): boolean {\n if (kind === 'select' || kind === 'expand') return false;\n return kit?.printable !== false;\n}\n\n/* ------------------------------------------------------------------ */\n/* Ids */\n/* ------------------------------------------------------------------ */\n\nexport const nameId = (idBase: string, itemIndex: number, cellIndex: number) =>\n `${idBase}-n-${itemIndex}-${cellIndex}`;\nexport const detailId = (idBase: string, itemIndex: number) =>\n `${idBase}-detail-${itemIndex}`;\n/** A data column's header cell. Encoded, since a column id is host text\n * and an id reference list splits on white space. */\nexport const headerNameId = (idBase: string, columnId: string) =>\n `${idBase}-h-${encodeURIComponent(columnId)}`;\n\n/* ------------------------------------------------------------------ */\n/* Selection cell */\n/* ------------------------------------------------------------------ */\n\nfunction SelectionCellContent<TData extends object>({\n model,\n row,\n labelId,\n rowLabel,\n selected,\n selectState,\n selectReason,\n}: {\n model: DataGridRenderModel<TData>;\n row: DgRow<TData>;\n labelId: string;\n rowLabel: string;\n selected: boolean;\n selectState: DataGridSelectState;\n selectReason: string | null;\n}) {\n const { t } = useTranslation('ui');\n const shift = useShiftCapture();\n\n if (selectState === 'none') {\n return (\n <>\n <span aria-hidden=\"true\" className={noneMarkVariants()}>\n –\n </span>\n <VisuallyHidden>\n {selectReason ?? t('dataGrid.selection.noneReason')}\n </VisuallyHidden>\n </>\n );\n }\n\n const locked = selectState === 'locked';\n // `selectReason` is the engine's resolved reason (masked under privacy\n // mode), never the host's raw `getRowSelectability` text. A locked box\n // keeps its own reason under `readOnly`; a selectable one takes the\n // grid's, stays focusable and keeps its checked state.\n const frozen = !locked && model.readOnlyReason !== null;\n // Always a reason, enabled or not: the Checkbox wraps itself in a\n // Tooltip only when it has one, so a box that gained or lost it (readOnly\n // on or off, a row turning locked) would remount and drop focus. An\n // enabled box neither shows nor links it.\n const reason = locked\n ? (selectReason ?? t('dataGrid.selection.lockedReason'))\n : (model.readOnlyReason ?? t('dataGrid.readOnly.reason'));\n\n return (\n <>\n <span hidden id={labelId}>\n {t('dataGrid.selection.selectRow', { row: rowLabel })}\n </span>\n {/* Label-less Checkbox: named by reference to the hidden span, so the\n row name never becomes an attribute. A locked box's reason is\n linked by the Checkbox itself (`disabledReason`). */}\n <Checkbox\n size=\"sm\"\n aria-labelledby={labelId}\n checked={locked ? true : selected}\n disabled={locked || frozen}\n disabledReason={reason}\n {...{ [DG_CONTROL_ATTR]: 'select' }}\n onPointerDown={shift.onPointerDown}\n onKeyDown={shift.onKeyDown}\n onCheckedChange={(checked) =>\n (model.latest.current ?? model).selection.toggleRow(\n row.id,\n checked === true,\n { shiftKey: shift.take() },\n )\n }\n />\n </>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Expander cell */\n/* ------------------------------------------------------------------ */\n\nfunction ExpanderCellContent<TData extends object>({\n row,\n labelId,\n rowLabel,\n controlsId,\n canExpand,\n expanded,\n}: {\n row: DgRow<TData>;\n labelId: string;\n rowLabel: string;\n /** The detail row's id while it is mounted. */\n controlsId: string | undefined;\n canExpand: boolean;\n expanded: boolean;\n}) {\n const { t } = useTranslation('ui');\n if (!canExpand) return null;\n return (\n <>\n <span hidden id={labelId}>\n {expanded\n ? t('dataGrid.expand.collapse', { row: rowLabel })\n : t('dataGrid.expand.expand', { row: rowLabel })}\n </span>\n <IconButton\n size=\"sm\"\n intent=\"ghost\"\n className={accessibleTargetSquareClass}\n icon={\n <ChevronRight\n aria-hidden=\"true\"\n className={expanderIconVariants({ expanded })}\n />\n }\n aria-labelledby={labelId}\n aria-expanded={expanded}\n aria-controls={controlsId}\n {...{ [DG_CONTROL_ATTR]: 'expand' }}\n onClick={() => row.toggleExpanded()}\n />\n </>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Data cell */\n/* ------------------------------------------------------------------ */\n\nfunction DataCellContent<TData extends object>({\n model,\n row,\n kit,\n rowLabel,\n columnLabel,\n labelId,\n errorId,\n displayIndex,\n isRowHeader,\n selected,\n rowReadOnly,\n}: {\n model: DataGridRenderModel<TData>;\n row: DgRow<TData>;\n kit: DataGridColumn<TData>;\n rowLabel: string;\n columnLabel: string;\n labelId: string;\n errorId: string;\n displayIndex: number;\n isRowHeader: boolean;\n selected: boolean;\n rowReadOnly: boolean;\n}) {\n const { t, i18n } = useTranslation('ui');\n const { meta } = model;\n const original = row.original;\n // The number editor's own verdict (\"1.5\" in Italian is not a number),\n // so the cell never shows a red border with no text (WCAG 3.3.1).\n const [numberValidity, setNumberValidity] =\n useState<NumberInputValidity | null>(null);\n const numberEditorError = (\n numberEdit: DataGridNumberEdit<TData>,\n validity: NumberInputValidity | null,\n ): string | undefined => {\n const fmt = (value: number) => formatNumber(value, i18n.language);\n switch (validity?.reason) {\n case 'format':\n return t(\n 'dataGrid.edit.notANumber',\n 'Not a number. Write decimals like {{example}}.',\n { example: fmt(1.5) },\n );\n case 'below-min':\n return numberEdit.min === undefined\n ? undefined\n : t('dataGrid.edit.belowMin', 'Enter {{min}} or more.', {\n min: fmt(numberEdit.min),\n });\n case 'above-max':\n return numberEdit.max === undefined\n ? undefined\n : t('dataGrid.edit.aboveMax', 'Enter {{max}} or less.', {\n max: fmt(numberEdit.max),\n });\n default:\n return undefined;\n }\n };\n\n if (meta.isMasked(row.id, kit.id)) {\n return (\n <>\n <span aria-hidden=\"true\" className={maskVariants()}>\n {privacyMask(getDataGridHostMask(kit, original))}\n </span>\n <VisuallyHidden>{t('calendarWorkspace.privacy.hidden')}</VisuallyHidden>\n </>\n );\n }\n\n const edit = kit.edit;\n const editable =\n edit !== undefined &&\n !rowReadOnly &&\n (edit.isEditable ? edit.isEditable(original) : true);\n const isReadOnly = !editable && (rowReadOnly || edit !== undefined);\n // \", level 2\" joins the row header's name. Not VisuallyHidden: its\n // `position: absolute` makes the span block-level, and the name\n // algorithm puts a space around a block (\"Alginate 500 g , level 2\"). An\n // inline span at font size 0 adds no space and takes no room.\n const levelText =\n isRowHeader && row.depth > 0 ? (\n <span className={inlineHiddenTextClass}>\n {t('dataGrid.expand.level', {\n level: formatNumber(row.depth + 1, i18n.language),\n })}\n </span>\n ) : null;\n\n if (edit && editable) {\n const hostError = edit.error?.(original);\n const rowMasked = meta.isRowMasked(row.id);\n // Privacy mode: a host message may name the person (\"Check the quantity\n // for <name>\"), so a masked row shows neutral kit copy, as reasons do.\n // A number editor's own verdict gets kit copy when the host says\n // nothing, so an invalid field always has text that says how to fix it.\n // Text that is not a number (\"1.5\" in Italian) wins over the host: the\n // host only sees `null`, so its copy would say \"required\" for a field\n // that is not empty (WCAG 3.3.3).\n const formatError =\n edit.kind === 'number' && numberValidity?.reason === 'format'\n ? numberEditorError(edit, numberValidity)\n : undefined;\n const error = formatError\n ? formatError\n : hostError\n ? rowMasked\n ? t(\n 'dataGrid.edit.errorPrivacy',\n 'Check this value (message hidden in privacy mode)',\n )\n : hostError\n : edit.kind === 'number'\n ? numberEditorError(edit, numberValidity)\n : undefined;\n // A host hint, such as the precision a quantity takes. It is hidden\n // text read with the field; a masked row drops it, since it is host\n // copy that may name the person.\n const hostDescription =\n edit.kind === 'number' && !rowMasked\n ? edit.description?.(original)\n : undefined;\n const descriptionId = hostDescription ? `${errorId}-d` : undefined;\n const context: DataGridEditContext = {\n rowId: row.id,\n columnId: kit.id,\n labelledBy: `${headerNameId(model.idBase, kit.id)} ${labelId}`,\n rowLabel,\n columnLabel,\n errorId: error ? errorId : undefined,\n invalid: Boolean(error),\n };\n return (\n <>\n <span hidden id={labelId}>\n {rowLabel}\n </span>\n {hostDescription ? (\n <span hidden id={descriptionId}>\n {hostDescription}\n </span>\n ) : null}\n <DataGridEditor\n edit={edit}\n row={original}\n context={context}\n descriptionId={descriptionId}\n onNumberValidityChange={setNumberValidity}\n />\n {error ? (\n <span id={errorId} className={editorErrorVariants()}>\n {error}\n </span>\n ) : null}\n {levelText}\n </>\n );\n }\n\n // The hidden name is rendered only when `cell` reads `inputLabelledBy`\n // (a host control in the cell), so plain cells add no nodes.\n let labelRead = false;\n const context: DataGridCellContext = {\n rowId: row.id,\n displayIndex,\n depth: row.depth,\n isSelected: selected,\n isReadOnly,\n rowLabel,\n columnLabel,\n get inputLabelledBy() {\n labelRead = true;\n return `${headerNameId(model.idBase, kit.id)} ${labelId}`;\n },\n };\n const content = kit.cell(original, context);\n return (\n <>\n {labelRead ? (\n <span hidden id={labelId}>\n {rowLabel}\n </span>\n ) : null}\n {content}\n {levelText}\n </>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Row */\n/* ------------------------------------------------------------------ */\n\ntype DataGridSelectState = 'selectable' | 'locked' | 'none';\n\ninterface BodyRowProps<TData extends object> {\n model: DataGridRenderModel<TData>;\n row: DgRow<TData>;\n itemIndex: number;\n /** `aria-rowindex`, when rows are missing from the DOM. */\n ariaRowIndex: number | undefined;\n /** Virtualised: `data-index` plus `measureElement`. */\n virtualIndex: number | undefined;\n measureRef: ((node: HTMLTableRowElement | null) => void) | undefined;\n /** Detail row id while it is mounted (for `aria-controls`). */\n detailMountedId: string | undefined;\n /* Row facts, read by the body from the current model: the memoised row\n re-renders when one of them changes, and only then. */\n selected: boolean;\n expanded: boolean;\n canExpand: boolean;\n rowReadOnly: boolean;\n rowLabel: string;\n selectState: DataGridSelectState;\n selectReason: string | null;\n displayIndex: number;\n}\n\n/** Model facts every row renders from. `model` itself is rebuilt on each\n * grid render (a new selection API, new meta closures), so a row compares\n * these instead; the per-row results of the meta closures are props. */\nfunction sameRowModel<TData extends object>(\n a: DataGridRenderModel<TData>,\n b: DataGridRenderModel<TData>,\n): boolean {\n // Not `table`: v9's `useTable` returns a fresh spread on every render\n // (`useTable.js:70-76`); rows hold the stable core table.\n return (\n a.kitColumns === b.kitColumns &&\n a.pins === b.pins &&\n a.visibleColumnsKey === b.visibleColumnsKey &&\n a.rowHeaderColumnId === b.rowHeaderColumnId &&\n a.density === b.density &&\n a.privacyMode === b.privacyMode &&\n a.hostTextPrivacySafe === b.hostTextPrivacySafe &&\n a.idBase === b.idBase &&\n a.direction === b.direction &&\n a.dataMode === b.dataMode &&\n a.readOnlyReason === b.readOnlyReason &&\n a.meta.locale === b.meta.locale\n );\n}\n\nfunction sameBodyRow<TData extends object>(\n a: BodyRowProps<TData>,\n b: BodyRowProps<TData>,\n): boolean {\n // The row by id, data and depth, not by object: a new `rows` array\n // rebuilds every v9 row object, but only a row whose data changed (the\n // one being edited) needs to render again. Handlers in a skipped row act\n // on the stable core table through its id.\n return (\n a.row.id === b.row.id &&\n a.row.original === b.row.original &&\n a.row.depth === b.row.depth &&\n a.itemIndex === b.itemIndex &&\n a.ariaRowIndex === b.ariaRowIndex &&\n a.virtualIndex === b.virtualIndex &&\n a.measureRef === b.measureRef &&\n a.detailMountedId === b.detailMountedId &&\n a.selected === b.selected &&\n a.expanded === b.expanded &&\n a.canExpand === b.canExpand &&\n a.rowReadOnly === b.rowReadOnly &&\n a.rowLabel === b.rowLabel &&\n a.selectState === b.selectState &&\n a.selectReason === b.selectReason &&\n a.displayIndex === b.displayIndex &&\n sameRowModel(a.model, b.model)\n );\n}\n\nfunction BodyRowImpl<TData extends object>({\n model,\n row,\n itemIndex,\n ariaRowIndex,\n virtualIndex,\n measureRef,\n detailMountedId,\n selected,\n expanded,\n canExpand,\n rowReadOnly,\n rowLabel,\n selectState,\n selectReason,\n displayIndex,\n}: BodyRowProps<TData>) {\n const { kitColumns, idBase, meta, density, pins, rowHeaderColumnId } = model;\n const cells = row.getVisibleCells();\n\n return (\n <tr\n ref={measureRef}\n data-row-id={row.id}\n data-index={virtualIndex}\n data-selected={selected ? '' : undefined}\n data-expanded={expanded ? '' : undefined}\n aria-rowindex={ariaRowIndex}\n >\n {cells.map((cell, cellIndex) => {\n const column = cell.column;\n const kind = columnKind(column);\n const kit = kitColumns.get(column.id);\n const presentation = pins.get(column.id) ?? NO_PIN;\n const isRowHeader = kind === 'data' && column.id === rowHeaderColumnId;\n const Tag = isRowHeader ? 'th' : 'td';\n const labelId = nameId(idBase, itemIndex, cellIndex);\n const masked = kind === 'data' && meta.isMasked(row.id, column.id);\n const editable =\n kind === 'data' &&\n kit?.edit !== undefined &&\n !masked &&\n !rowReadOnly &&\n (kit.edit.isEditable ? kit.edit.isEditable(row.original) : true);\n const indent = isRowHeader && row.depth > 0;\n const className = [\n cellVariants({\n section: 'body',\n density,\n align: kit?.align ?? 'start',\n pin: presentation.pin,\n divider: presentation.divider,\n utility: kind === 'select' || kind === 'expand',\n editable,\n selected,\n wrap: kit?.wrap === true,\n printable: isPrintable(kind, kit),\n }),\n indent ? depthVariants() : '',\n ]\n .filter(Boolean)\n .join(' ');\n const style: CSSProperties | undefined =\n pinStyle(presentation) || indent\n ? ({\n ...pinStyle(presentation),\n ...(indent ? { '--dg-depth': String(row.depth) } : null),\n } as CSSProperties)\n : undefined;\n\n let content: ReactNode = null;\n if (kind === 'select') {\n content = (\n <SelectionCellContent\n model={model}\n row={row}\n labelId={labelId}\n rowLabel={rowLabel}\n selected={selected}\n selectState={selectState}\n selectReason={selectReason}\n />\n );\n } else if (kind === 'expand') {\n content = (\n <ExpanderCellContent\n row={row}\n labelId={labelId}\n rowLabel={rowLabel}\n controlsId={detailMountedId}\n canExpand={canExpand}\n expanded={expanded}\n />\n );\n } else if (kit) {\n content = (\n <DataCellContent\n model={model}\n row={row}\n kit={kit}\n rowLabel={rowLabel}\n columnLabel={column.columnDef.meta?.label ?? kit.id}\n labelId={labelId}\n errorId={`${labelId}-e`}\n displayIndex={displayIndex}\n isRowHeader={isRowHeader}\n selected={selected}\n rowReadOnly={rowReadOnly}\n />\n );\n }\n\n return (\n <Tag\n key={cell.id}\n scope={isRowHeader ? 'row' : undefined}\n className={className}\n data-privacy={masked ? 'masked' : undefined}\n // eslint-disable-next-line react/forbid-component-props -- 23-constraints §Runtime-computed dimensions: custom-property setter only (`--dg-pin-offset` measured from the pinned header, case 2; `--dg-depth` from the row depth, case 1); the consuming rules live in data-grid.variants.ts. `Tag` is `th` or `td`.\n style={style}\n >\n {content}\n </Tag>\n );\n })}\n </tr>\n );\n}\n\n/** A body row that re-renders only when its own facts or the shared model\n * facts change: a selection toggle re-renders the toggled row, not the\n * page (measured in `data-grid.perf.test.tsx`). */\nconst BodyRow = memo(BodyRowImpl, sameBodyRow) as typeof BodyRowImpl;\n\n/* ------------------------------------------------------------------ */\n/* Detail row */\n/* ------------------------------------------------------------------ */\n\nfunction DetailRow<TData extends object>({\n model,\n row,\n itemIndex,\n columnCount,\n ariaRowIndex,\n virtualIndex,\n measureRef,\n}: {\n model: DataGridRenderModel<TData>;\n row: DgRow<TData>;\n itemIndex: number;\n columnCount: number;\n ariaRowIndex: number | undefined;\n virtualIndex: number | undefined;\n measureRef: ((node: HTMLTableRowElement | null) => void) | undefined;\n}) {\n const { t } = useTranslation('ui');\n const { idBase, meta, renderDetail } = model;\n const labelId = `${detailId(idBase, itemIndex)}-n`;\n return (\n <tr ref={measureRef} data-index={virtualIndex} aria-rowindex={ariaRowIndex}>\n <td\n id={detailId(idBase, itemIndex)}\n colSpan={Math.max(1, columnCount)}\n aria-labelledby={labelId}\n className={cellVariants({ section: 'detail' })}\n >\n <span hidden id={labelId}>\n {t('dataGrid.expand.detail', { row: meta.getRowLabel(row.id) })}\n </span>\n <div className={detailContentVariants()}>\n {renderDetail?.(row.original)}\n </div>\n </td>\n </tr>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Body */\n/* ------------------------------------------------------------------ */\n\nexport interface DataGridBodyProps<TData extends object> {\n model: DataGridRenderModel<TData>;\n bodyRef: RefObject<HTMLTableSectionElement | null>;\n /** Every body item on this page, in display order. */\n items: readonly DataGridBodyItem<TData>[];\n /** Mounted item indexes and gaps (all of them when not virtualised). */\n mounted: readonly { index: number; gapBefore: number }[];\n virtualised: boolean;\n padStart: number;\n padEnd: number;\n measureElement: (node: HTMLTableRowElement | null) => void;\n columnCount: number;\n /** `aria-rowindex` of an item, or `undefined` when every row is in the\n * DOM. */\n ariaRowIndexOf: (itemIndex: number) => number | undefined;\n onKeyDown: (event: ReactKeyboardEvent<HTMLElement>) => void;\n /** Replaces the rows (states: skeleton, empty, error). */\n stateRows?: ReactNode;\n}\n\nexport function DataGridBody<TData extends object>({\n model,\n bodyRef,\n items,\n mounted,\n virtualised,\n padStart,\n padEnd,\n measureElement,\n columnCount,\n ariaRowIndexOf,\n onKeyDown,\n stateRows,\n}: DataGridBodyProps<TData>) {\n const colSpan = Math.max(1, columnCount);\n const mountedSet = new Set(mounted.map((entry) => entry.index));\n\n const bodyStyle = virtualised\n ? ({\n '--dg-pad-start': `${padStart}px`,\n '--dg-pad-end': `${padEnd}px`,\n } as CSSProperties)\n : undefined;\n\n return (\n // The row group delegates Arrow, Home and End from its row checkboxes and\n // expanders (keyboard.ts); it is not itself a control.\n // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions\n <tbody\n ref={bodyRef}\n onKeyDown={onKeyDown}\n // eslint-disable-next-line react/forbid-dom-props -- 23-constraints §Runtime-computed dimensions: virtual spacer custom properties (case 1, values from @tanstack/react-virtual).\n style={bodyStyle}\n >\n {stateRows ?? (\n <>\n {virtualised && padStart > 0 ? (\n <tr aria-hidden=\"true\">\n <td\n colSpan={colSpan}\n className={spacerVariants({ edge: 'start' })}\n />\n </tr>\n ) : null}\n {mounted.map(({ index, gapBefore }) => {\n const item = items[index];\n if (!item) return null;\n const gap =\n virtualised && gapBefore > 0 ? (\n <tr aria-hidden=\"true\">\n <td\n colSpan={colSpan}\n className={spacerVariants({ edge: 'gap' })}\n // eslint-disable-next-line react/forbid-dom-props -- 23-constraints §Runtime-computed dimensions: gap spacer custom property (case 1) from two @tanstack/react-virtual items' offsets.\n style={{ '--dg-gap': `${gapBefore}px` } as CSSProperties}\n />\n </tr>\n ) : null;\n const virtualIndex = virtualised ? index : undefined;\n const measureRef = virtualised ? measureElement : undefined;\n if (item.kind === 'detail') {\n return (\n <Fragment key={item.key}>\n {gap}\n <DetailRow\n model={model}\n row={item.row}\n itemIndex={index}\n columnCount={colSpan}\n ariaRowIndex={ariaRowIndexOf(index)}\n virtualIndex={virtualIndex}\n measureRef={measureRef}\n />\n </Fragment>\n );\n }\n const next = items[index + 1];\n const detailMountedId =\n next?.kind === 'detail' &&\n next.row.id === item.row.id &&\n mountedSet.has(index + 1)\n ? detailId(model.idBase, index + 1)\n : undefined;\n const { row } = item;\n const selectability = model.selection.getSelectability(row.id);\n return (\n <Fragment key={item.key}>\n {gap}\n <BodyRow\n model={model}\n row={row}\n itemIndex={index}\n ariaRowIndex={ariaRowIndexOf(index)}\n virtualIndex={virtualIndex}\n measureRef={measureRef}\n detailMountedId={detailMountedId}\n selected={model.selection.isSelected(row.id)}\n expanded={row.getIsExpanded()}\n canExpand={row.getCanExpand()}\n rowReadOnly={\n model.readOnlyReason !== null ||\n model.meta.isRowReadOnly(row.id)\n }\n rowLabel={model.meta.getRowLabel(row.id)}\n selectState={selectability.state}\n selectReason={selectability.reason}\n displayIndex={row.getDisplayIndex()}\n />\n </Fragment>\n );\n })}\n {virtualised && padEnd > 0 ? (\n <tr aria-hidden=\"true\">\n <td\n colSpan={colSpan}\n className={spacerVariants({ edge: 'end' })}\n />\n </tr>\n ) : null}\n </>\n )}\n </tbody>\n );\n}\n","/* -------------------------------------------------------------------- */\n/* Agent adapter — DataGrid. */\n/* */\n/* Operations work against the curated `DataGridHandle`: ids and kit */\n/* shapes only, never a TanStack instance, row object or DOM node. */\n/* Query actions (sort, filter, quick search, paging) stay `read`: they */\n/* change the view, not data. They are `openWorld` because in server */\n/* mode the host fetches new rows. Column choices persist under `gridId`, */\n/* so they are `write`, and `reset_columns` discards them all */\n/* (`destructive`). Preconditions are checked before any write: a refused */\n/* call throws an Error whose message starts with its code. */\n/* Under `privacyMode`, `filter` and `quickFilter` report */\n/* `{ masked: true }` instead of a value that could name a person, and */\n/* writes that sort or filter a masked column are refused. */\n/* See `src/docs/26-agent-readiness.mdx`. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type {\n DataGridColumnInfo,\n DataGridFilterModel,\n DataGridHandle,\n DataGridSortEntry,\n} from './types';\n\n/** Equals `DATA_GRID_MAX_SORT_LEVELS`. A literal, because the catalog build\n * imports this file in plain Node, where only type imports are erased;\n * `data-grid.agent.test.ts` keeps the two equal. */\nconst MAX_SORT_LEVELS = 3;\n\n/** Error codes the adapter throws (message prefix). */\ntype DataGridAgentErrorCode =\n | 'SELECTION_DISABLED'\n | 'SORT_DISABLED'\n | 'FILTER_DISABLED'\n | 'PAGINATION_DISABLED'\n | 'EXPANSION_DISABLED'\n | 'UNKNOWN_ROW'\n | 'UNKNOWN_COLUMN'\n | 'COLUMN_MASKED'\n | 'NOT_HIDEABLE'\n | 'NOT_PINNABLE'\n | 'NOT_MOVABLE';\n\n/** What an agent sees in place of a value privacy mode hides. */\nconst MASKED = { masked: true } as const;\n\n/** The `{ masked: true }` placeholder the `filter` state reports. */\nfunction isMaskedPlaceholder(value: unknown): boolean {\n return (\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n Object.keys(value).length === 1 &&\n (value as { masked?: unknown }).masked === true\n );\n}\n\n/** JSON with sorted object keys (local: this file takes type imports\n * only, see `MAX_SORT_LEVELS`). */\nfunction canonical(value: unknown): string {\n return (\n JSON.stringify(value, (_key, entry: unknown) => {\n if (entry === null || typeof entry !== 'object' || Array.isArray(entry)) {\n return entry;\n }\n const record = entry as Record<string, unknown>;\n const sorted: Record<string, unknown> = {};\n for (const key of Object.keys(record).sort()) sorted[key] = record[key];\n return sorted;\n }) ?? 'undefined'\n );\n}\n\nfunction refuse(code: DataGridAgentErrorCode, detail: string): never {\n throw new Error(`${code}: ${detail}`);\n}\n\nfunction findColumn(handle: DataGridHandle, id: string): DataGridColumnInfo {\n const column = handle.getColumns().find((c) => c.id === id);\n return column ?? refuse('UNKNOWN_COLUMN', `no column \"${id}\".`);\n}\n\n/** Masked under privacy mode, for refusing a write: only when the handle\n * says so. */\nfunction isMaskedForWrite(handle: DataGridHandle, column: DataGridColumnInfo) {\n return handle.getFeatures().privacyMode && column.masked === true;\n}\n\nfunction knownRow(handle: DataGridHandle, id: string): void {\n if (!handle.getRowIds().includes(id)) {\n refuse('UNKNOWN_ROW', `no row \"${id}\" in the current view.`);\n }\n}\n\n/**\n * The filter model as an agent may read it. Under privacy mode a key keeps\n * its value only when it names a column the handle reports unmasked\n * (`masked === false`); host keys and masked columns report\n * `{ masked: true }`, since a host key can hold a patient's name.\n */\nfunction readFilter(handle: DataGridHandle): DataGridFilterModel {\n const model = handle.getFilter();\n if (!handle.getFeatures().privacyMode) {\n return model;\n }\n const columns = new Map(handle.getColumns().map((c) => [c.id, c]));\n const view: DataGridFilterModel = {};\n for (const [key, value] of Object.entries(model)) {\n view[key] = columns.get(key)?.masked === false ? value : MASKED;\n }\n return view;\n}\n\n/** Quick search text is typed free text, so it may be a name: masked while\n * privacy mode is on and any column is (or may be) masked. */\nfunction readQuickFilter(handle: DataGridHandle): string | typeof MASKED {\n const text = handle.getQuickFilter();\n if (\n text === '' ||\n !handle.getFeatures().privacyMode ||\n handle.getColumns().every((c) => c.masked === false)\n ) {\n return text;\n }\n return MASKED;\n}\n\nconst SELECTION_RESULT_SCHEMA = {\n type: 'object',\n properties: {\n selection: {\n type: 'array',\n items: { type: 'string' },\n description: 'Row ids selected after the call (every page).',\n },\n dropped: {\n type: 'array',\n items: { type: 'string' },\n description:\n 'Requested ids the grid did not select: unknown rows (client mode) or rows that cannot be selected.',\n },\n },\n required: ['selection', 'dropped'],\n} as const;\n\nexport const dataGridAgent: AgentAdapter<DataGridHandle> = {\n id: 'data-grid',\n // Column hide, pin and move are claimed under `view_change` (they change\n // how the grid shows the same data); see the ruling in\n // 26-agent-readiness.mdx. Values belong to the host, so no `edit_inline`\n // or `set_value`.\n capabilities: [\n 'select_single',\n 'select_multiple',\n 'range_pick',\n 'filter',\n 'sort',\n 'paginate',\n 'expand',\n 'view_change',\n 'scroll',\n ],\n state: {\n features: {\n type: '{ dataMode, selectionMode, sorting, filtering, quickFilter, pagination, expansion, columnResizing, privacyMode }',\n descriptionKey: 'ui.agent.dataGrid.state.features',\n description:\n 'Which features this grid has on, so you know which actions will work before you call them.',\n read: (handle) => handle.getFeatures(),\n },\n selection: {\n type: 'string[]',\n descriptionKey: 'ui.agent.dataGrid.state.selection',\n description:\n 'Row ids of the selected rows, on every page, locked rows included.',\n read: (handle) => handle.getSelection(),\n },\n sort: {\n type: 'Array<{ colId, sort }>',\n descriptionKey: 'ui.agent.dataGrid.state.sort',\n description: 'Active sort, in priority order.',\n read: (handle) => handle.getSort(),\n },\n filter: {\n type: 'object',\n descriptionKey: 'ui.agent.dataGrid.state.filter',\n description:\n 'Filter model: kit filter models keyed by column id, plus host keys. Under privacy mode, host keys and masked columns report { masked: true } instead of the value.',\n read: (handle) => readFilter(handle),\n },\n quickFilter: {\n type: 'string | { masked: true }',\n descriptionKey: 'ui.agent.dataGrid.state.quickFilter',\n description:\n 'Quick search text. Under privacy mode it reports { masked: true } while any column is masked.',\n read: (handle) => readQuickFilter(handle),\n },\n currentPage: {\n type: 'number',\n descriptionKey: 'ui.agent.dataGrid.state.currentPage',\n description: 'Zero-based page number.',\n read: (handle) => handle.getCurrentPage(),\n },\n pageSize: {\n type: 'number',\n descriptionKey: 'ui.agent.dataGrid.state.pageSize',\n description: 'Rows per page.',\n read: (handle) => handle.getPageSize(),\n },\n pageCount: {\n type: 'number',\n descriptionKey: 'ui.agent.dataGrid.state.pageCount',\n description:\n 'Number of pages: 1 when paging is off, -1 when the server total is unknown.',\n read: (handle) => handle.getPageCount(),\n },\n rowCount: {\n type: 'number',\n descriptionKey: 'ui.agent.dataGrid.state.rowCount',\n description:\n 'Top-level rows after filters (client mode) or the server total (-1 when unknown).',\n read: (handle) => handle.getRowCount(),\n },\n rowIds: {\n type: 'string[]',\n descriptionKey: 'ui.agent.dataGrid.state.rowIds',\n description:\n 'Row ids in display order: every filtered row in client mode, the current page in server mode.',\n read: (handle) => handle.getRowIds(),\n },\n expandedRowIds: {\n type: 'string[]',\n descriptionKey: 'ui.agent.dataGrid.state.expandedRowIds',\n description: 'Ids of the rows whose sub-rows or detail panel are open.',\n read: (handle) => handle.getExpandedRowIds(),\n },\n columns: {\n type: 'Array<{ id, label, visible, pinned, index }>',\n descriptionKey: 'ui.agent.dataGrid.state.columns',\n description:\n 'Data columns in display order: id, header label, visibility, pin side (start, end or false) and index.',\n read: (handle) =>\n handle.getColumns().map(({ id, label, visible, pinned, index }) => ({\n id,\n label,\n visible,\n pinned,\n index,\n })),\n },\n },\n actions: {\n select_rows: {\n // Transient selection (the data-table convention): stays read.\n safety: 'read',\n argsType: '{ ids: string[] }',\n argsSchema: {\n type: 'object',\n properties: {\n ids: {\n type: 'array',\n items: { type: 'string' },\n description: 'Row ids to select (replaces the current selection).',\n },\n },\n required: ['ids'],\n },\n returns: '{ selection: string[], dropped: string[] }',\n returnsSchema: SELECTION_RESULT_SCHEMA,\n idempotent: true,\n errors: [\n 'SELECTION_DISABLED: the grid has no row selection (features.selectionMode is none).',\n 'UNKNOWN_ROW: in client mode, ids not in the grid are dropped and listed in dropped. Server mode keeps ids from other pages.',\n 'Locked rows stay selected whatever is passed.',\n ],\n examples: [\n { args: { ids: ['bill-1', 'bill-2'] }, note: 'Select two rows.' },\n ],\n descriptionKey: 'ui.agent.dataGrid.actions.selectRows',\n description:\n 'Replace the selection with the given row ids. Returns the resulting selection and the ids that were not selected.',\n invoke: (handle, args: { ids: string[] }) => {\n if (handle.getFeatures().selectionMode === 'none') {\n refuse('SELECTION_DISABLED', 'this grid has no row selection.');\n }\n handle.setSelection(args.ids);\n const selection = handle.getSelection();\n const selected = new Set(selection);\n return {\n selection,\n dropped: args.ids.filter((id) => !selected.has(id)),\n };\n },\n },\n select_range: {\n safety: 'read',\n argsType: '{ fromId: string, toId: string }',\n argsSchema: {\n type: 'object',\n properties: {\n fromId: { type: 'string', description: 'Start row id (inclusive).' },\n toId: { type: 'string', description: 'End row id (inclusive).' },\n },\n required: ['fromId', 'toId'],\n },\n idempotent: true,\n errors: [\n 'SELECTION_DISABLED: the grid does not allow multiple selection.',\n 'UNKNOWN_ROW: fromId or toId is not in rowIds.',\n ],\n descriptionKey: 'ui.agent.dataGrid.actions.selectRange',\n description:\n 'Select every row from fromId to toId, inclusive, in display order. Rows that cannot be selected are skipped.',\n invoke: (handle, args: { fromId: string; toId: string }) => {\n if (handle.getFeatures().selectionMode !== 'multiple') {\n refuse(\n 'SELECTION_DISABLED',\n 'this grid does not allow multiple selection.',\n );\n }\n knownRow(handle, args.fromId);\n knownRow(handle, args.toId);\n handle.selectRange(args.fromId, args.toId);\n },\n },\n clear_selection: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.dataGrid.actions.clearSelection',\n description: 'Deselect every row. Locked rows stay selected.',\n invoke: (handle) => {\n handle.clearSelection();\n },\n },\n get_selection: {\n safety: 'read',\n returns: 'string[]',\n returnsSchema: { type: 'array', items: { type: 'string' } },\n idempotent: true,\n descriptionKey: 'ui.agent.dataGrid.actions.getSelection',\n description:\n 'Return the ids of the selected rows, on every page, locked rows included.',\n invoke: (handle) => handle.getSelection(),\n },\n sort_by: {\n safety: 'read',\n openWorld: true,\n argsType: '{ model: Array<{ colId: string, sort: \"asc\" | \"desc\" }> }',\n argsSchema: {\n type: 'object',\n properties: {\n model: {\n type: 'array',\n maxItems: MAX_SORT_LEVELS,\n description:\n 'Sort entries in priority order. An empty list removes the sort.',\n items: {\n type: 'object',\n properties: {\n colId: { type: 'string', description: 'Column id to sort by.' },\n sort: { enum: ['asc', 'desc'], description: 'Sort direction.' },\n },\n required: ['colId', 'sort'],\n },\n },\n },\n required: ['model'],\n },\n idempotent: true,\n errors: [\n 'SORT_DISABLED: the grid does not sort, or a named column does not sort.',\n 'UNKNOWN_COLUMN: a colId names no column.',\n 'COLUMN_MASKED: a named column is hidden by privacy mode.',\n ],\n examples: [\n {\n args: { model: [{ colId: 'dueDate', sort: 'asc' }] },\n note: 'Sort by due date, earliest first.',\n },\n ],\n descriptionKey: 'ui.agent.dataGrid.actions.sortBy',\n description:\n 'Replace the active sort with the given list, in priority order. In server mode this asks the host for new rows.',\n invoke: (handle, args: { model: DataGridSortEntry[] }) => {\n if (!handle.getFeatures().sorting) {\n refuse('SORT_DISABLED', 'this grid does not sort.');\n }\n for (const entry of args.model) {\n const column = findColumn(handle, entry.colId);\n if (!column.sortable) {\n refuse('SORT_DISABLED', `column \"${entry.colId}\" does not sort.`);\n }\n if (isMaskedForWrite(handle, column)) {\n refuse('COLUMN_MASKED', `column \"${entry.colId}\" is masked.`);\n }\n }\n handle.setSort(args.model);\n },\n },\n apply_filter: {\n safety: 'read',\n openWorld: true,\n argsType: '{ model: Record<string, unknown> }',\n argsSchema: {\n type: 'object',\n properties: {\n model: {\n type: 'object',\n description:\n 'Kit filter models keyed by column id (text, number, set or date range), plus any host keys the page uses. Replaces the current model.',\n additionalProperties: true,\n },\n },\n required: ['model'],\n },\n idempotent: true,\n errors: [\n 'FILTER_DISABLED: a key names a column that has no filter.',\n 'COLUMN_MASKED: a key names a column hidden by privacy mode.',\n 'Keys that name no column are host keys and pass through to the host.',\n ],\n examples: [\n {\n args: { model: { status: { type: 'set', values: ['toLoad'] } } },\n note: 'Show only rows whose status is toLoad.',\n },\n ],\n descriptionKey: 'ui.agent.dataGrid.actions.applyFilter',\n description:\n 'Replace the filter model with the given object. In server mode this asks the host for new rows.',\n invoke: (handle, args: { model: DataGridFilterModel }) => {\n const columns = new Map(handle.getColumns().map((c) => [c.id, c]));\n const current = handle.getFilter();\n // Read-modify-write under privacy mode: a key still holding the\n // `{ masked: true }` the `filter` state reported keeps its current\n // value, so the placeholder never reaches the host.\n const model: DataGridFilterModel = {};\n for (const key of Object.keys(args.model)) {\n const value = args.model[key];\n if (isMaskedPlaceholder(value)) {\n if (key in current) model[key] = current[key];\n continue;\n }\n model[key] = value;\n }\n for (const key of Object.keys(model)) {\n const column = columns.get(key);\n if (!column) {\n continue;\n }\n if (column.filterKind === null) {\n refuse('FILTER_DISABLED', `column \"${key}\" has no filter.`);\n }\n if (\n isMaskedForWrite(handle, column) &&\n canonical(model[key]) !== canonical(current[key])\n ) {\n refuse('COLUMN_MASKED', `column \"${key}\" is masked.`);\n }\n }\n handle.setFilter(model);\n },\n },\n set_quick_filter: {\n safety: 'read',\n openWorld: true,\n argsType: '{ text: string }',\n argsSchema: {\n type: 'object',\n properties: {\n text: {\n type: 'string',\n description: 'Search text. An empty string clears quick search.',\n },\n },\n required: ['text'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.dataGrid.actions.setQuickFilter',\n description:\n 'Set the quick search text, which matches across the searchable columns. In server mode this asks the host for new rows.',\n invoke: (handle, args: { text: string }) => {\n handle.setQuickFilter(args.text);\n },\n },\n clear_filters: {\n safety: 'read',\n openWorld: true,\n idempotent: true,\n descriptionKey: 'ui.agent.dataGrid.actions.clearFilters',\n description:\n 'Clear every column filter, host key and the quick search. In server mode this asks the host for new rows.',\n invoke: (handle) => {\n handle.clearFilters();\n },\n },\n go_to_page: {\n safety: 'read',\n openWorld: true,\n argsType: '{ page: number }',\n argsSchema: {\n type: 'object',\n properties: {\n page: {\n type: 'integer',\n minimum: 0,\n description: 'Zero-based page number.',\n },\n },\n required: ['page'],\n },\n idempotent: true,\n errors: ['PAGINATION_DISABLED: the grid is not paged.'],\n descriptionKey: 'ui.agent.dataGrid.actions.goToPage',\n description:\n 'Go to the given zero-based page. In server mode this asks the host for new rows.',\n invoke: (handle, args: { page: number }) => {\n if (!handle.getFeatures().pagination) {\n refuse('PAGINATION_DISABLED', 'this grid is not paged.');\n }\n handle.goToPage(args.page);\n },\n },\n set_page_size: {\n safety: 'read',\n openWorld: true,\n argsType: '{ size: number }',\n argsSchema: {\n type: 'object',\n properties: {\n size: {\n type: 'integer',\n minimum: 1,\n description: 'Rows per page.',\n },\n },\n required: ['size'],\n },\n idempotent: true,\n errors: ['PAGINATION_DISABLED: the grid is not paged.'],\n descriptionKey: 'ui.agent.dataGrid.actions.setPageSize',\n description:\n 'Set how many rows a page shows. In server mode this asks the host for new rows.',\n invoke: (handle, args: { size: number }) => {\n if (!handle.getFeatures().pagination) {\n refuse('PAGINATION_DISABLED', 'this grid is not paged.');\n }\n handle.setPageSize(args.size);\n },\n },\n expand_row: {\n safety: 'read',\n argsType: '{ id: string, expanded: boolean }',\n argsSchema: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Row id.' },\n expanded: {\n type: 'boolean',\n description: 'True opens the row, false closes it.',\n },\n },\n required: ['id', 'expanded'],\n },\n idempotent: true,\n errors: [\n 'EXPANSION_DISABLED: the grid has no sub-rows or detail panel.',\n 'UNKNOWN_ROW: the id is not in rowIds.',\n ],\n descriptionKey: 'ui.agent.dataGrid.actions.expandRow',\n description: \"Open or close a row's sub-rows or detail panel.\",\n invoke: (handle, args: { id: string; expanded: boolean }) => {\n if (!handle.getFeatures().expansion) {\n refuse('EXPANSION_DISABLED', 'this grid has no expandable rows.');\n }\n knownRow(handle, args.id);\n handle.setRowExpanded(args.id, args.expanded);\n },\n },\n scroll_to_row: {\n safety: 'read',\n argsType: '{ id: string }',\n argsSchema: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Row id.' },\n },\n required: ['id'],\n },\n idempotent: true,\n errors: ['UNKNOWN_ROW: the id is not in rowIds.'],\n descriptionKey: 'ui.agent.dataGrid.actions.scrollToRow',\n description:\n 'Scroll a row into view, including a row a virtualised grid has not rendered yet. Does not move focus.',\n invoke: (handle, args: { id: string }) => {\n knownRow(handle, args.id);\n handle.scrollToRow(args.id);\n },\n },\n set_column_visibility: {\n // Saved under gridId and kept across visits: a write.\n safety: 'write',\n argsType: '{ id: string, visible: boolean }',\n argsSchema: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Column id.' },\n visible: {\n type: 'boolean',\n description: 'True shows the column, false hides it.',\n },\n },\n required: ['id', 'visible'],\n },\n idempotent: true,\n errors: [\n 'UNKNOWN_COLUMN: the id names no column.',\n 'NOT_HIDEABLE: the column cannot be hidden.',\n ],\n descriptionKey: 'ui.agent.dataGrid.actions.setColumnVisibility',\n description:\n 'Show or hide a column. Counts as a user choice: it is saved for this grid and responsive hiding leaves it alone.',\n invoke: (handle, args: { id: string; visible: boolean }) => {\n const column = findColumn(handle, args.id);\n if (!column.canHide) {\n refuse('NOT_HIDEABLE', `column \"${args.id}\" cannot be hidden.`);\n }\n handle.setColumnVisible(args.id, args.visible);\n },\n },\n pin_column: {\n safety: 'write',\n argsType: '{ id: string, side: \"start\" | \"end\" | null }',\n argsSchema: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Column id.' },\n side: {\n enum: ['start', 'end', null],\n description:\n 'start pins to the reading start edge, end to the reading end edge, null unpins.',\n },\n },\n required: ['id', 'side'],\n },\n idempotent: true,\n errors: [\n 'UNKNOWN_COLUMN: the id names no column.',\n 'NOT_PINNABLE: the column cannot be pinned, or pinning it would split its group.',\n ],\n descriptionKey: 'ui.agent.dataGrid.actions.pinColumn',\n description:\n 'Pin a column to the start or end edge so it stays in view while the others scroll, or unpin it. Saved for this grid.',\n invoke: (handle, args: { id: string; side: 'start' | 'end' | null }) => {\n const column = findColumn(handle, args.id);\n if (!column.canPin) {\n refuse('NOT_PINNABLE', `column \"${args.id}\" cannot be pinned.`);\n }\n handle.pinColumn(args.id, args.side ?? false);\n },\n },\n move_column: {\n safety: 'write',\n argsType: '{ id: string, toIndex: number }',\n argsSchema: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Column id.' },\n toIndex: {\n type: 'integer',\n minimum: 0,\n description:\n \"The column's final index in the columns state after the move.\",\n },\n },\n required: ['id', 'toIndex'],\n },\n idempotent: true,\n errors: [\n 'UNKNOWN_COLUMN: the id names no column.',\n 'NOT_MOVABLE: the column cannot be moved, or the move would take it out of its group.',\n ],\n descriptionKey: 'ui.agent.dataGrid.actions.moveColumn',\n description:\n 'Move a column to a new position. It takes the pin side of the column that was at that position. Saved for this grid.',\n invoke: (handle, args: { id: string; toIndex: number }) => {\n const column = findColumn(handle, args.id);\n if (!column.canMove) {\n refuse('NOT_MOVABLE', `column \"${args.id}\" cannot be moved.`);\n }\n handle.moveColumn(args.id, args.toIndex);\n },\n },\n reset_columns: {\n // Discards every saved column choice under gridId, with no undo in\n // the UI: the more conservative class (26-agent-readiness.mdx).\n safety: 'destructive',\n idempotent: true,\n descriptionKey: 'ui.agent.dataGrid.actions.resetColumns',\n description:\n \"Put every column back to the page's default width, order, pin and visibility, and delete the column choices saved for this grid.\",\n invoke: (handle) => {\n handle.resetColumnState();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'data-grid',\n description: 'Marks the element as a kit DataGrid.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'gridId',\n description:\n 'Sourced from the gridId prop. Required to address a specific grid from the agent.',\n },\n item: {\n attr: 'data-row-id',\n description:\n 'Opaque row id from getRowId, on each record row. Select, expand and scroll through the handle, not by changing the DOM.',\n },\n },\n};\n","/* -------------------------------------------------------------------- */\n/* DataGrid totals row (design § 3.4): a sticky `<tfoot>`, shown when any */\n/* column has a `footer`. The row header is the row-header column's cell */\n/* (`<th scope=\"row\">`) wherever that column sits; without a footer it */\n/* says \"Total\", so it is never an empty `<th>`. Utility cells are empty. */\n/* Function footers get the footer context (client: every filtered top- */\n/* level row, all pages; server: the page). Never virtualised, selectable */\n/* or counted. Rendered inside the grid's marked root. */\n/* -------------------------------------------------------------------- */\n\nimport { useTranslation } from 'react-i18next';\n\nimport { cellVariants } from './data-grid.variants';\nimport {\n NO_PIN,\n columnKind,\n isPrintable,\n pinStyle,\n type DataGridRenderModel,\n} from './body';\nimport type { DataGridFooterContext } from './types';\n\nexport interface DataGridFooterProps<TData extends object> {\n model: DataGridRenderModel<TData>;\n footRef: (node: HTMLTableSectionElement | null) => void;\n getFooterContext: () => DataGridFooterContext<TData>;\n ariaRowIndex: number | undefined;\n}\n\nexport function DataGridFooter<TData extends object>({\n model,\n footRef,\n getFooterContext,\n ariaRowIndex,\n}: DataGridFooterProps<TData>) {\n const { t } = useTranslation('ui');\n let context: DataGridFooterContext<TData> | null = null;\n const contextOnce = () => {\n context ??= getFooterContext();\n return context;\n };\n\n return (\n <tfoot ref={footRef}>\n <tr aria-rowindex={ariaRowIndex}>\n {model.visibleColumns.map((column) => {\n const kind = columnKind(column);\n const kit = model.kitColumns.get(column.id);\n const presentation = model.pins.get(column.id) ?? NO_PIN;\n const isRowHeader =\n kind === 'data' && column.id === model.rowHeaderColumnId;\n const Tag = isRowHeader ? 'th' : 'td';\n let content = null;\n if (kind === 'data' && kit) {\n const footer = kit.footer;\n content =\n typeof footer === 'function' ? footer(contextOnce()) : footer;\n if (isRowHeader && (content === undefined || content === null)) {\n content = t('dataTable.totalRow');\n }\n }\n return (\n <Tag\n key={column.id}\n scope={isRowHeader ? 'row' : undefined}\n className={cellVariants({\n section: 'foot',\n align: kit?.align ?? 'start',\n pin: presentation.pin,\n divider: presentation.divider,\n utility: kind === 'select' || kind === 'expand',\n printable: isPrintable(kind, kit),\n })}\n // eslint-disable-next-line react/forbid-component-props -- 23-constraints §Runtime-computed dimensions: `--dg-pin-offset` custom-property setter (case 2, measured from the pinned header). `Tag` is `th` or `td`.\n style={pinStyle(presentation)}\n >\n {content}\n </Tag>\n );\n })}\n </tr>\n </tfoot>\n );\n}\n","/* -------------------------------------------------------------------- */\n/* DataGrid filter panels: text, number and select (design § 6.1). */\n/* */\n/* Kit inputs only, each panel writing one of the kit filter models the */\n/* seam declares, so DataGrid, DataTable, saved tabs and agents read the */\n/* same shapes. Apply commits, Clear removes the filter, Enter in a field */\n/* applies. Strings reuse DataTable's `dataTable.*Filter.*` keys. */\n/* */\n/* Every field has a visible label (FormField), and its accessible name */\n/* keeps the column (\"Total, from\"). Fields use the kit's compact field */\n/* exception and buttons the accessible target floor, so all of them */\n/* reach `--min-target-size` under the accessible themes. */\n/* -------------------------------------------------------------------- */\n\nimport { useMemo, useState, type FormEvent, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { cva } from 'class-variance-authority';\nimport { Button } from '../../button/button';\nimport { Checkbox } from '../../checkbox/checkbox';\nimport { FormField } from '../../form-field';\nimport { NumberInput } from '../../number-input';\nimport { Select, type SelectOption } from '../../select';\nimport { StateBackedTextInput } from '../../_shared/state-backed-text-input';\nimport {\n selectValueKey,\n type SelectFilterValue,\n} from '../../_shared/table-filters/predicates';\nimport type {\n NumberFilterModel,\n NumberFilterOperator,\n SelectFilterModel,\n TextFilterModel,\n TextFilterOperator,\n} from '../../_shared/table-toolbar/seam';\nimport { EDITOR_COMPACT_FIELDS_CLASS } from '../../_shared/compact-editor-fields';\nimport { accessibleTargetBlockClass } from '../data-grid.variants';\nimport type {\n DataGridColumnFilter,\n DataGridColumnFilterModel,\n DataGridOption,\n} from '../types';\n\n/** What every panel gets from the trigger. */\nexport interface DataGridFilterPanelProps {\n columnId: string;\n columnLabel: string;\n value: DataGridColumnFilterModel | undefined;\n options: readonly DataGridOption[];\n dataMode: 'client' | 'server';\n /** Commit (`null` clears) and close. */\n onApply: (model: DataGridColumnFilterModel | null) => void;\n}\n\nconst TEXT_OPERATORS: readonly TextFilterOperator[] = [\n 'contains',\n 'equals',\n 'startsWith',\n 'endsWith',\n 'notContains',\n];\n\nconst NUMBER_OPERATORS: readonly NumberFilterOperator[] = [\n 'equals',\n 'notEqual',\n 'greaterThan',\n 'greaterThanOrEqual',\n 'lessThan',\n 'lessThanOrEqual',\n 'inRange',\n 'blank',\n 'notBlank',\n];\n\nconst panelVariants = cva([\n 'ds:flex ds:min-h-0 ds:flex-col ds:gap-[var(--spacing-sm)]',\n EDITOR_COMPACT_FIELDS_CLASS,\n]);\nconst actionsVariants = cva(\n 'ds:flex ds:flex-wrap ds:items-center ds:justify-end ds:gap-[var(--spacing-xs)] ds:border-t ds:border-[color:var(--border)] ds:pt-[var(--spacing-xs)]',\n);\nconst rangeVariants = cva('ds:flex ds:items-end ds:gap-[var(--spacing-xs)]');\nconst rangeFieldVariants = cva('ds:min-w-0 ds:flex-1');\nconst optionListVariants = cva(\n 'ds:flex ds:min-h-0 ds:flex-col ds:gap-[var(--spacing-xs)] ds:overflow-y-auto',\n);\nconst emptyVariants = cva(\n 'ds:py-[var(--spacing-xs)] ds:text-[length:var(--font-size-sm)] ds:text-[color:var(--muted-foreground)]',\n);\n\n/** A form, so Enter in any field applies; Clear and Apply at the end. */\nfunction PanelForm({\n kind,\n onSubmit,\n onClear,\n clearLabel,\n applyLabel,\n children,\n}: {\n kind: string;\n onSubmit: () => void;\n onClear: () => void;\n clearLabel: string;\n applyLabel: string;\n children: ReactNode;\n}) {\n return (\n <form\n data-filter-kind={kind}\n className={panelVariants()}\n onSubmit={(event: FormEvent) => {\n event.preventDefault();\n onSubmit();\n }}\n >\n {children}\n <div className={actionsVariants()}>\n <Button\n intent=\"ghost\"\n size=\"sm\"\n type=\"button\"\n className={accessibleTargetBlockClass}\n onClick={onClear}\n >\n {clearLabel}\n </Button>\n <Button\n intent=\"primary\"\n size=\"sm\"\n type=\"submit\"\n className={accessibleTargetBlockClass}\n >\n {applyLabel}\n </Button>\n </div>\n </form>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Text */\n/* ------------------------------------------------------------------ */\n\nexport function TextFilterPanel({\n columnLabel,\n value,\n onApply,\n config,\n}: DataGridFilterPanelProps & {\n config: Extract<DataGridColumnFilter, { kind: 'text' }>;\n}) {\n const { t } = useTranslation('ui');\n const current = value as TextFilterModel | undefined;\n const operators = config.operators ?? TEXT_OPERATORS;\n const fallback = config.defaultOperator ?? operators[0] ?? 'contains';\n const [operator, setOperator] = useState<TextFilterOperator>(\n current?.type ?? fallback,\n );\n const [draft, setDraft] = useState(current?.filter ?? '');\n\n const operatorOptions: SelectOption<TextFilterOperator>[] = operators.map(\n (op) => ({ value: op, label: t(`dataTable.textFilter.operators.${op}`) }),\n );\n\n return (\n <PanelForm\n kind=\"text\"\n clearLabel={t('dataTable.textFilter.clear')}\n applyLabel={t('dataTable.textFilter.apply')}\n onClear={() => onApply(null)}\n onSubmit={() =>\n // Whitespace only filters nothing: commit `null` (DataTable parity).\n onApply(draft.trim() === '' ? null : { type: operator, filter: draft })\n }\n >\n {operators.length > 1 ? (\n <FormField label={t('dataTable.numberFilter.operatorLabel')}>\n <Select<TextFilterOperator>\n options={operatorOptions}\n value={operator}\n onValueChange={(next) => {\n if (next !== '') setOperator(next);\n }}\n aria-label={t('dataTable.numberFilter.columnOperator', {\n column: columnLabel,\n operator: t('dataTable.numberFilter.operatorLabel'),\n })}\n />\n </FormField>\n ) : null}\n <FormField label={columnLabel}>\n <StateBackedTextInput\n value={draft}\n onChange={(event) => setDraft(event.target.value)}\n placeholder={\n config.placeholder ?? t('dataTable.textFilter.placeholder')\n }\n aria-label={t('dataTable.numberFilter.columnFilter', {\n column: columnLabel,\n })}\n />\n </FormField>\n </PanelForm>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Number */\n/* ------------------------------------------------------------------ */\n\nexport function NumberFilterPanel({\n columnLabel,\n value,\n onApply,\n config,\n}: DataGridFilterPanelProps & {\n config: Extract<DataGridColumnFilter, { kind: 'number' }>;\n}) {\n const { t } = useTranslation('ui');\n const current = value as NumberFilterModel | undefined;\n const operators = config.operators ?? NUMBER_OPERATORS;\n const fallback = config.defaultOperator ?? operators[0] ?? 'equals';\n const [operator, setOperator] = useState<NumberFilterOperator>(\n current?.type ?? fallback,\n );\n const [primary, setPrimary] = useState<number | null>(\n current?.filter ?? null,\n );\n const [secondary, setSecondary] = useState<number | null>(\n current?.filterTo ?? null,\n );\n const takesValue = operator !== 'blank' && operator !== 'notBlank';\n const takesRange = operator === 'inRange';\n const mode = config.mode ?? 'decimal';\n\n const operatorOptions = operators.map((op) => ({\n value: op,\n label: t(`dataTable.numberFilter.operators.${op}`),\n }));\n\n function commit() {\n if (!takesValue) {\n onApply({ type: operator });\n return;\n }\n if (takesRange) {\n if (primary === null && secondary === null) {\n onApply(null);\n return;\n }\n onApply({\n type: operator,\n ...(primary !== null ? { filter: primary } : {}),\n ...(secondary !== null ? { filterTo: secondary } : {}),\n });\n return;\n }\n onApply(primary === null ? null : { type: operator, filter: primary });\n }\n\n const input = (\n current: number | null,\n set: (v: number | null) => void,\n visibleLabel: string,\n label: string,\n className?: string,\n ) => (\n <FormField label={visibleLabel} className={className}>\n <NumberInput\n mode={mode}\n currency={config.currency}\n value={current}\n onChange={set}\n min={config.min}\n max={config.max}\n step={config.step}\n aria-label={label}\n />\n </FormField>\n );\n\n return (\n <PanelForm\n kind=\"number\"\n clearLabel={t('dataTable.numberFilter.clear')}\n applyLabel={t('dataTable.numberFilter.apply')}\n onClear={() => onApply(null)}\n onSubmit={commit}\n >\n {operators.length > 1 ? (\n <FormField label={t('dataTable.numberFilter.operatorLabel')}>\n <Select<NumberFilterOperator>\n options={operatorOptions}\n value={operator}\n onValueChange={(next) => {\n if (next !== '') setOperator(next);\n }}\n aria-label={t('dataTable.numberFilter.columnOperator', {\n column: columnLabel,\n operator: t('dataTable.numberFilter.operatorLabel'),\n })}\n />\n </FormField>\n ) : null}\n {takesValue && !takesRange\n ? input(\n primary,\n setPrimary,\n columnLabel,\n t('dataTable.numberFilter.columnFilter', { column: columnLabel }),\n )\n : null}\n {takesRange ? (\n <div className={rangeVariants()}>\n {input(\n primary,\n setPrimary,\n t('dataTable.numberFilter.from'),\n t('dataTable.numberFilter.columnFrom', { column: columnLabel }),\n rangeFieldVariants(),\n )}\n {input(\n secondary,\n setSecondary,\n t('dataTable.numberFilter.to'),\n t('dataTable.numberFilter.columnTo', { column: columnLabel }),\n rangeFieldVariants(),\n )}\n </div>\n ) : null}\n </PanelForm>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Select */\n/* ------------------------------------------------------------------ */\n\nexport function SelectFilterPanel({\n columnLabel,\n value,\n options,\n onApply,\n}: DataGridFilterPanelProps & {\n config: Extract<DataGridColumnFilter, { kind: 'select' }>;\n}) {\n const { t } = useTranslation('ui');\n const current = value as SelectFilterModel | undefined;\n const [pending, setPending] = useState<Set<string>>(\n () => new Set((current?.values ?? []).map(selectValueKey)),\n );\n const keys = useMemo(\n () => options.map((o) => selectValueKey(o.value)),\n [options],\n );\n const allChecked = keys.length > 0 && keys.every((k) => pending.has(k));\n const someChecked = keys.some((k) => pending.has(k));\n\n function toggle(key: string, checked: boolean) {\n setPending((prev) => {\n const next = new Set(prev);\n if (checked) next.add(key);\n else next.delete(key);\n return next;\n });\n }\n\n function commit() {\n const values: SelectFilterValue[] = options\n .filter((o) => pending.has(selectValueKey(o.value)))\n .map((o) => o.value);\n onApply(values.length === 0 ? null : { type: 'set', values });\n }\n\n return (\n <PanelForm\n kind=\"select\"\n clearLabel={t('dataTable.selectFilter.clear')}\n applyLabel={t('dataTable.selectFilter.apply')}\n onClear={() => onApply(null)}\n onSubmit={commit}\n >\n {options.length === 0 ? (\n <p className={emptyVariants()}>{t('dataTable.agGrid.noRowsToShow')}</p>\n ) : (\n <>\n <Checkbox\n size=\"sm\"\n label={t('dataTable.selectFilter.all')}\n checked={allChecked ? true : someChecked ? 'indeterminate' : false}\n onCheckedChange={(checked) =>\n setPending(checked === true ? new Set(keys) : new Set())\n }\n />\n <div\n role=\"group\"\n aria-label={t('dataGrid.filter.button', { column: columnLabel })}\n className={optionListVariants()}\n >\n {options.map((option) => {\n const key = selectValueKey(option.value);\n return (\n <Checkbox\n key={key}\n size=\"sm\"\n label={option.label}\n checked={pending.has(key)}\n onCheckedChange={(checked) => toggle(key, checked === true)}\n />\n );\n })}\n </div>\n </>\n )}\n </PanelForm>\n );\n}\n","/* -------------------------------------------------------------------- */\n/* DataGrid header filter trigger: a small icon button that opens the */\n/* column's filter panel in a Popover (design § 3.2, § 6.2). */\n/* */\n/* Eager and small. The text, number and select panels are plain kit */\n/* inputs (`filter-panels.tsx`); the date-range panel pulls in */\n/* DateRangePicker and its calendar, so it is loaded on first open */\n/* (`date-range-panel.tsx`, React.lazy). */\n/* -------------------------------------------------------------------- */\n\nimport { Suspense, lazy, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Funnel } from 'lucide-react';\nimport { cva } from 'class-variance-authority';\nimport { IconButton } from '../../button/icon-button';\nimport { Popover } from '../../popover/popover';\nimport { Spinner } from '../../spinner';\nimport { accessibleTargetSquareClass } from '../data-grid.variants';\nimport type { DataGridFilterTriggerProps } from '../types';\nimport {\n NumberFilterPanel,\n SelectFilterPanel,\n TextFilterPanel,\n type DataGridFilterPanelProps,\n} from './filter-panels';\n\nconst DateRangeFilterPanel = lazy(() =>\n import('./date-range-panel').then((m) => ({\n default: m.DateRangeFilterPanel,\n })),\n);\n\nconst triggerWrapVariants = cva('ds:relative ds:inline-flex ds:shrink-0');\n\n/** The dot that marks an active filter; the accessible name says it too. */\nconst activeDotVariants = cva(\n 'ds:pointer-events-none ds:absolute ds:top-[var(--spacing-2xs)] ds:end-[var(--spacing-2xs)] ds:size-[var(--spacing-xs)] ds:rounded-full ds:bg-[var(--primary)]',\n);\n\nconst panelLoadingVariants = cva(\n 'ds:flex ds:items-center ds:justify-center ds:p-[var(--spacing-sm)]',\n);\n\n/**\n * The header's filter control for one column. `value` is the column's\n * current model; `onChange(null)` clears it.\n */\nexport function DataGridFilterTrigger({\n columnId,\n columnLabel,\n config,\n value,\n onChange,\n options,\n dataMode,\n}: DataGridFilterTriggerProps) {\n const { t } = useTranslation('ui');\n const [open, setOpen] = useState(false);\n const active = value !== undefined && value !== null;\n const name = t(\n active ? 'dataGrid.filter.buttonActive' : 'dataGrid.filter.button',\n {\n column: columnLabel,\n },\n );\n const title = t('dataGrid.filter.button', { column: columnLabel });\n\n const panelProps: DataGridFilterPanelProps = {\n columnId,\n columnLabel,\n value,\n options,\n dataMode,\n onApply: (model) => {\n onChange(model);\n setOpen(false);\n },\n };\n\n return (\n <Popover.Root open={open} onOpenChange={setOpen}>\n <span className={triggerWrapVariants()}>\n <Popover.Trigger asChild>\n <IconButton\n type=\"button\"\n size=\"sm\"\n intent=\"ghost\"\n className={accessibleTargetSquareClass}\n icon={<Funnel aria-hidden />}\n aria-label={name}\n aria-haspopup=\"dialog\"\n />\n </Popover.Trigger>\n {active ? (\n <span aria-hidden=\"true\" className={activeDotVariants()} />\n ) : null}\n </span>\n <Popover.Content\n size=\"sm\"\n align=\"start\"\n className=\"ds:flex ds:max-h-[var(--radix-popover-content-available-height)] ds:flex-col\"\n >\n <Popover.Heading>{title}</Popover.Heading>\n {config.kind === 'text' ? (\n <TextFilterPanel {...panelProps} config={config} />\n ) : config.kind === 'number' ? (\n <NumberFilterPanel {...panelProps} config={config} />\n ) : config.kind === 'select' ? (\n <SelectFilterPanel {...panelProps} config={config} />\n ) : (\n <Suspense\n fallback={\n <div className={panelLoadingVariants()}>\n <Spinner size=\"sm\" />\n </div>\n }\n >\n <DateRangeFilterPanel {...panelProps} config={config} />\n </Suspense>\n )}\n </Popover.Content>\n </Popover.Root>\n );\n}\n","/* -------------------------------------------------------------------- */\n/* DataGrid header (design § 3.2): group rows, the leaf row, sort */\n/* buttons with `aria-sort`, header tips, filter triggers (panels from */\n/* `filters/`), keyboard-operable resize separators and select-all. */\n/* */\n/* - Group headers are `<th scope=\"colgroup\" colSpan>`. A column with no */\n/* group spans both header rows (`rowSpan`); v9 reports 0 for the cells */\n/* it covers, which are skipped. */\n/* - A leaf `<th>` that holds controls is named by its plain label, so a */\n/* body cell does not announce \"Amount Filter Amount Resize Amount\". */\n/* - Utility headers are never empty: a visually hidden \"Select\" or */\n/* \"Details\", or the select-all box with its own label. */\n/* Rendered inside the grid's marked root. */\n/* -------------------------------------------------------------------- */\n\nimport { useMemo, useRef, useState, type ReactNode, type Ref } from 'react';\nimport { flushSync } from 'react-dom';\nimport { useTranslation } from 'react-i18next';\nimport { ArrowDown, ArrowUp, ChevronsUpDown } from 'lucide-react';\nimport type { Header } from '@tanstack/react-table';\n\nimport { useIsomorphicLayoutEffect } from '../../hooks/use-isomorphic-layout-effect';\nimport { formatNumber } from '../_shared/format-number';\nimport { Checkbox } from '../checkbox';\nimport { VisuallyHidden } from '../visually-hidden';\nimport {\n cellVariants,\n headerContentVariants,\n resizableHeadCellClass,\n separatorVariants,\n sortButtonVariants,\n sortIconVariants,\n sortPriorityVariants,\n} from './data-grid.variants';\nimport {\n NO_PIN,\n columnKind,\n headerNameId,\n isPrintable,\n pinStyle,\n type DataGridRenderModel,\n type DgColumn,\n} from './body';\nimport {\n DATA_GRID_DEFAULT_MAX_SIZE,\n DATA_GRID_DEFAULT_MIN_SIZE,\n} from './features';\nimport type { DataGridFeatures } from './features';\nimport { getDataGridSelectOptions } from './columns';\nimport { DataGridFilterTrigger } from './filters/filter-trigger';\nimport { resizeWidthForKey, useShiftCapture } from './keyboard';\nimport type {\n DataGridColumn,\n DataGridColumnFilterModel,\n DataGridOption,\n} from './types';\n\ntype DgHeader<TData extends object> = Header<DataGridFeatures, TData, unknown>;\n\n/* ------------------------------------------------------------------ */\n/* Sort button */\n/* ------------------------------------------------------------------ */\n\nfunction SortButton<TData extends object>({\n column,\n children,\n}: {\n column: DgColumn<TData>;\n children: ReactNode;\n}) {\n const { t, i18n } = useTranslation('ui');\n const shift = useShiftCapture();\n const sorted = column.getIsSorted();\n const index = column.getSortIndex();\n const Icon =\n sorted === 'asc' ? ArrowUp : sorted === 'desc' ? ArrowDown : ChevronsUpDown;\n\n return (\n <button\n type=\"button\"\n className={sortButtonVariants()}\n onPointerDown={shift.onPointerDown}\n onKeyDown={shift.onKeyDown}\n onClick={(event) => {\n // Shift on the click, or captured on keydown: a keyboard-triggered\n // click may not carry `shiftKey` (design § 4.3).\n const multi = shift.take(event.shiftKey);\n column.getToggleSortingHandler()?.({ shiftKey: multi });\n }}\n >\n {children}\n <Icon\n aria-hidden=\"true\"\n className={sortIconVariants({ active: sorted !== false })}\n />\n {sorted !== false && index > 0 ? (\n <>\n <span aria-hidden=\"true\" className={sortPriorityVariants()}>\n {formatNumber(index + 1, i18n.language)}\n </span>\n <VisuallyHidden>\n {t('dataGrid.sort.priority', {\n priority: formatNumber(index + 1, i18n.language),\n })}\n </VisuallyHidden>\n </>\n ) : null}\n </button>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Resize separator */\n/* ------------------------------------------------------------------ */\n\nfunction ResizeSeparator<TData extends object>({\n model,\n header,\n label,\n edgeDivider,\n}: {\n model: DataGridRenderModel<TData>;\n header: DgHeader<TData>;\n label: string;\n edgeDivider: boolean;\n}) {\n const { t } = useTranslation('ui');\n const column = header.column;\n const min = column.columnDef.minSize ?? DATA_GRID_DEFAULT_MIN_SIZE;\n const max = column.columnDef.maxSize ?? DATA_GRID_DEFAULT_MAX_SIZE;\n const clamp = (width: number) => Math.min(max, Math.max(min, width));\n const handler = header.getResizeHandler();\n\n // A column with no host or user size renders at its kind token (and\n // wider when the table spreads spare width), not at v9's default of 150.\n // Until it is resized, the separator reports and steps from the width\n // on screen, and a pointer drag starts from it.\n const ref = useRef<HTMLDivElement>(null);\n // v9 fills `columnDef.size` with its default, so the kit column says\n // whether the host sized it.\n const unsized =\n model.store.get('columnSizing')[column.id] === undefined &&\n model.kitColumns.get(column.id)?.size === undefined;\n const [measured, setMeasured] = useState<number | null>(null);\n const renderedWidth = (): number | null => {\n const cell = ref.current?.closest('th');\n const width = cell ? Math.round(cell.getBoundingClientRect().width) : 0;\n return width > 0 ? clamp(width) : null;\n };\n useIsomorphicLayoutEffect(() => {\n if (!unsized) {\n setMeasured(null);\n return undefined;\n }\n setMeasured(renderedWidth());\n const cell = ref.current?.closest('th');\n if (!cell || typeof ResizeObserver === 'undefined') return undefined;\n const observer = new ResizeObserver(() => setMeasured(renderedWidth()));\n observer.observe(cell);\n return () => observer.disconnect();\n // renderedWidth reads the ref and the column's min and max.\n }, [unsized, min, max]);\n const size =\n unsized && measured !== null ? measured : Math.round(column.getSize());\n\n // Before v9's pointer handler reads the start width, pin the width on\n // screen, committed synchronously so the drag starts from it.\n const pinRenderedWidth = () => {\n if (!unsized) return;\n const width = renderedWidth();\n if (width === null) return;\n flushSync(() => {\n model.store.write(\n 'columnSizing',\n (previous) => ({ ...previous, [column.id]: width }),\n 'user',\n );\n });\n };\n\n // A focusable separator is the ARIA window-splitter pattern: it takes\n // keys and a value, so it is interactive although jsx-a11y lists the role\n // as static.\n return (\n // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions\n <div\n role=\"separator\"\n aria-orientation=\"vertical\"\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex\n tabIndex={0}\n aria-label={t('dataGrid.resize.label', { column: label })}\n aria-valuenow={size}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuetext={t('dataGrid.resize.valueText', { count: size })}\n ref={ref}\n data-resizing={column.getIsResizing() ? '' : undefined}\n className={separatorVariants({ edge: edgeDivider })}\n onPointerDown={pinRenderedWidth}\n onMouseDown={handler}\n onTouchStart={handler}\n onKeyDown={(event) => {\n const next = resizeWidthForKey(\n event.key,\n event.shiftKey,\n model.direction,\n size,\n min,\n max,\n );\n if (next === null) return;\n event.preventDefault();\n // The v9 handler is pointer-only; the keyboard writes the size.\n model.store.write(\n 'columnSizing',\n (previous) => ({ ...previous, [column.id]: next }),\n 'user',\n );\n }}\n />\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Filter trigger slot */\n/* ------------------------------------------------------------------ */\n\nfunction FilterSlot<TData extends object>({\n model,\n kit,\n label,\n}: {\n model: DataGridRenderModel<TData>;\n kit: DataGridColumn<TData>;\n label: string;\n}) {\n const config = kit.filter;\n const { table, store, dataMode } = model;\n const coreRows = model.table.getCoreRowModel().flatRows;\n\n // Select options: the column's own, else (client mode) the distinct\n // values of every row, so other filters do not shrink the list.\n const options = useMemo<readonly DataGridOption[]>(\n () =>\n getDataGridSelectOptions(\n kit,\n coreRows,\n dataMode,\n table.options.meta?.locale,\n ),\n [dataMode, kit, coreRows, table],\n );\n\n if (!config) return null;\n const filters = store.get('filters');\n const value = filters[kit.id] as DataGridColumnFilterModel | undefined;\n\n return (\n <DataGridFilterTrigger\n columnId={kit.id}\n columnLabel={label}\n config={config}\n value={value ?? undefined}\n options={options}\n dataMode={dataMode}\n onChange={(next) =>\n store.write(\n 'filters',\n (previous) => {\n const copy = { ...previous };\n if (next === null) delete copy[kit.id];\n else copy[kit.id] = next;\n return copy;\n },\n 'user',\n )\n }\n />\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Header cells */\n/* ------------------------------------------------------------------ */\n\nfunction stickFor(rowIndex: number, spansAll: boolean): 'top' | 'below' {\n return rowIndex > 0 && !spansAll ? 'below' : 'top';\n}\n\nfunction LeafHeaderCell<TData extends object>({\n model,\n header,\n rowIndex,\n rowSpan,\n measurePinned,\n}: {\n model: DataGridRenderModel<TData>;\n header: DgHeader<TData>;\n rowIndex: number;\n rowSpan: number | undefined;\n measurePinned: (columnId: string, node: HTMLElement | null) => void;\n}) {\n const { t } = useTranslation('ui');\n const column = header.column;\n const kind = columnKind(column);\n const kit = model.kitColumns.get(column.id);\n const presentation = model.pins.get(column.id) ?? NO_PIN;\n const pinned = presentation.pin !== 'none';\n const className = cellVariants({\n section: 'head',\n stick: stickFor(rowIndex, (rowSpan ?? 1) > 1),\n align: kit?.align ?? 'start',\n pin: presentation.pin,\n divider: presentation.divider,\n utility: kind === 'select' || kind === 'expand',\n printable: isPrintable(kind, kit),\n });\n const ref = pinned\n ? (node: HTMLElement | null) => measurePinned(column.id, node)\n : undefined;\n const style = pinStyle(presentation);\n\n if (kind === 'select') {\n const { selection } = model;\n const showAll = selection.mode === 'multiple' && selection.scope !== 'none';\n const selectAllId = `${model.idBase}-select-all`;\n // The select-all box is label-less, as the row boxes are, so the two\n // line up (a visible-label Checkbox adds a first-line offset). The\n // column keeps text for axe (`empty-table-header`): the hidden span\n // names the box, and the header itself is named \"Select\", so a body\n // cell does not announce \"Select all rows\" as its column.\n return (\n <th\n ref={ref}\n scope=\"col\"\n rowSpan={rowSpan}\n aria-label={showAll ? t('dataGrid.selection.columnLabel') : undefined}\n className={className}\n // eslint-disable-next-line react/forbid-dom-props -- 23-constraints §Runtime-computed dimensions: `--dg-pin-offset` custom-property setter (case 2).\n style={style}\n >\n {showAll ? (\n <>\n <VisuallyHidden id={selectAllId}>\n {selection.scope === 'page'\n ? t('dataGrid.selection.selectAllOnPage')\n : t('dataGrid.selection.selectAll')}\n </VisuallyHidden>\n {/* Disabled while no row in scope can be selected, with the\n reason the rows share (a loaded invoice) or \"Cannot be\n selected\". `readOnly`: disabled with the grid's reason, still focusable\n (Tooltip on focus, reason in `aria-describedby`), state\n kept. The reason is passed in both states: the Checkbox\n wraps itself in a Tooltip only when it has one, so a box\n that gained or lost it would remount and drop focus. While\n enabled, the reason is neither shown nor linked. */}\n <Checkbox\n size=\"sm\"\n aria-labelledby={selectAllId}\n checked={selection.headerState}\n disabled={\n model.readOnlyReason !== null ||\n selection.selectAllBlock !== null\n }\n disabledReason={\n model.readOnlyReason ??\n (selection.selectAllBlock\n ? (selection.selectAllBlock.reason ??\n t('dataGrid.selection.noneReason'))\n : t('dataGrid.readOnly.reason'))\n }\n onCheckedChange={() =>\n selection.toggleAll(selection.headerState !== true)\n }\n />\n </>\n ) : (\n <VisuallyHidden>{t('dataGrid.selection.columnLabel')}</VisuallyHidden>\n )}\n </th>\n );\n }\n\n if (kind === 'expand') {\n return (\n <th\n ref={ref}\n scope=\"col\"\n rowSpan={rowSpan}\n className={className}\n // eslint-disable-next-line react/forbid-dom-props -- 23-constraints §Runtime-computed dimensions: `--dg-pin-offset` custom-property setter (case 2).\n style={style}\n >\n <VisuallyHidden>{t('dataGrid.expand.columnLabel')}</VisuallyHidden>\n </th>\n );\n }\n\n if (!kit) return null;\n const label = column.columnDef.meta?.label ?? kit.id;\n const canSort = column.getCanSort();\n const canFilter = kit.filter !== undefined && column.getCanFilter();\n const canResize = column.getCanResize();\n const hasControls =\n canSort || canFilter || canResize || kit.headerTip !== undefined;\n const sorted = column.getIsSorted();\n const primary = sorted !== false && column.getSortIndex() === 0;\n\n // The id names the column's editors and cell controls with the visible\n // header text (`headerNameId`, body.tsx). The header's own name is\n // `aria-label` (the plain label) when it holds controls.\n return (\n <th\n ref={ref}\n id={headerNameId(model.idBase, column.id)}\n scope=\"col\"\n rowSpan={rowSpan}\n aria-sort={\n primary ? (sorted === 'asc' ? 'ascending' : 'descending') : undefined\n }\n aria-label={hasControls ? label : kit.headerLabel}\n className={\n canResize ? `${className} ${resizableHeadCellClass}` : className\n }\n // eslint-disable-next-line react/forbid-dom-props -- 23-constraints §Runtime-computed dimensions: `--dg-pin-offset` custom-property setter (case 2).\n style={style}\n >\n {hasControls ? (\n <div className={headerContentVariants({ align: kit.align ?? 'start' })}>\n {canSort ? (\n <SortButton column={column}>{kit.header}</SortButton>\n ) : (\n kit.header\n )}\n {kit.headerTip}\n {canFilter ? (\n <FilterSlot model={model} kit={kit} label={label} />\n ) : null}\n </div>\n ) : (\n kit.header\n )}\n {canResize ? (\n <ResizeSeparator\n model={model}\n header={header}\n label={label}\n edgeDivider={presentation.divider === 'end'}\n />\n ) : null}\n </th>\n );\n}\n\nfunction GroupHeaderCell<TData extends object>({\n model,\n header,\n}: {\n model: DataGridRenderModel<TData>;\n header: DgHeader<TData>;\n}) {\n const group = model.kitGroups.get(header.column.id);\n // A group sticks with its leaves when they are pinned together.\n const leaves = header.getLeafHeaders();\n const first = leaves[0]\n ? (model.pins.get(leaves[0].column.id) ?? NO_PIN)\n : NO_PIN;\n const sameSide = leaves.every(\n (leaf) => (model.pins.get(leaf.column.id) ?? NO_PIN).pin !== 'none',\n );\n const presentation = sameSide ? first : NO_PIN;\n const kit = header.column;\n const printable = leaves.some((leaf) =>\n isPrintable(columnKind(leaf.column), model.kitColumns.get(leaf.column.id)),\n );\n return (\n <th\n scope=\"colgroup\"\n colSpan={header.colSpan}\n aria-label={group?.headerLabel}\n className={cellVariants({\n section: 'group',\n stick: 'top',\n pin: presentation.pin,\n divider: presentation.divider,\n printable,\n })}\n // eslint-disable-next-line react/forbid-dom-props -- 23-constraints §Runtime-computed dimensions: `--dg-pin-offset` custom-property setter (case 2).\n style={pinStyle(presentation)}\n >\n {group?.header ?? kit.columnDef.meta?.label}\n </th>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Header */\n/* ------------------------------------------------------------------ */\n\nexport interface DataGridHeaderProps<TData extends object> {\n model: DataGridRenderModel<TData>;\n headRef: Ref<HTMLTableSectionElement>;\n /** Called with each pinned leaf header cell (measured offsets). */\n measurePinned: (columnId: string, node: HTMLElement | null) => void;\n /** `aria-rowindex` of header row `index` (0-based), when set. */\n ariaRowIndexOf: (index: number) => number | undefined;\n}\n\nexport function DataGridHeader<TData extends object>({\n model,\n headRef,\n measurePinned,\n ariaRowIndexOf,\n}: DataGridHeaderProps<TData>) {\n const groups = model.table.getHeaderGroups();\n return (\n <thead ref={headRef}>\n {groups.map((group, rowIndex) => (\n <tr key={group.id} aria-rowindex={ariaRowIndexOf(rowIndex)}>\n {group.headers.map((header) => {\n if (header.rowSpan === 0) return null;\n const kind = columnKind(header.column);\n if (header.isPlaceholder) {\n // The top of a chain of placeholders: the leaf's own header,\n // spanning every header row.\n if (header.rowSpan > 1) {\n return (\n <LeafHeaderCell\n key={header.id}\n model={model}\n header={header}\n rowIndex={rowIndex}\n rowSpan={header.rowSpan}\n measurePinned={measurePinned}\n />\n );\n }\n // An empty cell keeps the geometry (never `aria-hidden`).\n return (\n <td\n key={header.id}\n colSpan={header.colSpan}\n className={cellVariants({ section: 'group', stick: 'top' })}\n />\n );\n }\n if (kind === 'group' || header.subHeaders.length > 0) {\n return (\n <GroupHeaderCell\n key={header.id}\n model={model}\n header={header}\n />\n );\n }\n return (\n <LeafHeaderCell\n key={header.id}\n model={model}\n header={header}\n rowIndex={rowIndex}\n rowSpan={undefined}\n measurePinned={measurePinned}\n />\n );\n })}\n </tr>\n ))}\n </thead>\n );\n}\n","/* -------------------------------------------------------------------- */\n/* DataGrid pager (design § 3.8): the kit Pagination (1-based) plus the */\n/* range text \"Rows 26 to 50 of 312\" at the inline start. Outside the */\n/* scroll region, never printed. Rendered inside the grid's marked root. */\n/* */\n/* Unknown server total (`rowCount: -1`): the kit Pagination takes a */\n/* `totalPages`, so the pager offers one page beyond the current one */\n/* while the page is full and none on a short page; no endpoints. The */\n/* range text drops \"of {{total}}\". */\n/* -------------------------------------------------------------------- */\n\nimport { useTranslation } from 'react-i18next';\n\nimport { formatNumber } from '../_shared/format-number';\nimport { Pagination } from '../pagination';\nimport { Spinner } from '../spinner';\nimport { pagerRangeVariants, slotVariants } from './data-grid.variants';\n\nexport interface DataGridPagerProps {\n caption: string;\n pageIndex: number;\n pageSize: number;\n /** `-1` when the server total is unknown. */\n pageCount: number;\n /** `-1` when unknown. */\n rowCount: number;\n /** Rows on this page (top level), for the range and unknown totals. */\n pageRowCount: number;\n pageSizeOptions: readonly number[];\n showEndpoints: boolean;\n loading: boolean;\n onPageChange: (pageIndex: number) => void;\n onPageSizeChange: (pageSize: number) => void;\n}\n\nexport function DataGridPager({\n caption,\n pageIndex,\n pageSize,\n pageCount,\n rowCount,\n pageRowCount,\n pageSizeOptions,\n showEndpoints,\n loading,\n onPageChange,\n onPageSizeChange,\n}: DataGridPagerProps) {\n const { t, i18n } = useTranslation('ui');\n const fmt = (value: number) => formatNumber(value, i18n.language);\n\n const unknown = pageCount < 0 || rowCount < 0;\n const totalPages = unknown\n ? pageIndex + (pageRowCount >= pageSize ? 2 : 1)\n : Math.max(1, pageCount);\n\n const from = pageRowCount === 0 ? 0 : pageIndex * pageSize + 1;\n const to = pageIndex * pageSize + pageRowCount;\n const range =\n pageRowCount === 0 && !unknown && rowCount === 0\n ? null\n : unknown\n ? t('dataGrid.pagination.rangeUnknown', {\n from: fmt(from),\n to: fmt(to),\n })\n : t('dataGrid.pagination.range', {\n from: fmt(from),\n to: fmt(to),\n total: fmt(rowCount),\n });\n\n return (\n <div className={slotVariants({ slot: 'pager' })}>\n <p className={pagerRangeVariants()}>\n {range}\n {loading ? <Spinner size=\"sm\" label={t('dataTable.loading')} /> : null}\n </p>\n <Pagination\n aria-label={t('dataGrid.pagination.label', { caption })}\n totalPages={totalPages}\n page={pageIndex + 1}\n onPageChange={(page) => onPageChange(page - 1)}\n showEndpoints={showEndpoints && !unknown}\n align=\"end\"\n size=\"sm\"\n useLocaleDigits\n locale={i18n.language}\n pageSize={{\n value: pageSize,\n options: [...pageSizeOptions],\n onChange: onPageSizeChange,\n }}\n />\n </div>\n );\n}\n","/* -------------------------------------------------------------------- */\n/* DataGrid print orchestration (design § 5.5). */\n/* */\n/* `handle.print()`, the toolbar Print and the browser's own print all */\n/* come here: */\n/* 1. `printing` turns on synchronously (`flushSync`): virtualisation */\n/* off, and in client mode paging off, so every filtered, sorted row */\n/* renders; */\n/* 2. `print()` waits two animation frames, then calls `window.print()`; */\n/* 3. on `afterprint` (or straight after a synchronous `window.print()`) */\n/* `printing` turns off and the scroll position is restored. */\n/* `flushSync` inside `beforeprint` is unverified across browsers; the */\n/* toolbar and handle path do not depend on it. */\n/* -------------------------------------------------------------------- */\n\nimport {\n useCallback,\n useEffect,\n useRef,\n useState,\n type RefObject,\n} from 'react';\nimport { flushSync } from 'react-dom';\n\nfunction nextFrame(): Promise<void> {\n return new Promise((resolve) => {\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(() => resolve());\n } else {\n setTimeout(resolve, 0);\n }\n });\n}\n\nexport interface DataGridPrint {\n /** Every row is rendered for print. */\n printing: boolean;\n /** Renders every row, prints, then restores. */\n print: () => Promise<void>;\n}\n\n/** Print state for one grid. `scrollRef` is the grid's scroll region. */\nexport function useDataGridPrint(\n scrollRef: RefObject<HTMLElement | null>,\n): DataGridPrint {\n const [printing, setPrinting] = useState(false);\n const savedScroll = useRef<{ top: number; left: number } | null>(null);\n const inProgress = useRef(false);\n\n const begin = useCallback(() => {\n const scroller = scrollRef.current;\n savedScroll.current = scroller\n ? { top: scroller.scrollTop, left: scroller.scrollLeft }\n : null;\n flushSync(() => setPrinting(true));\n }, [scrollRef]);\n\n const end = useCallback(() => {\n setPrinting(false);\n const saved = savedScroll.current;\n savedScroll.current = null;\n if (!saved) return;\n // Restore once the windowed rows are back.\n void nextFrame().then(() => {\n const scroller = scrollRef.current;\n if (!scroller) return;\n scroller.scrollTop = saved.top;\n scroller.scrollLeft = saved.left;\n });\n }, [scrollRef]);\n\n // The browser's own print (Ctrl+P): best effort.\n useEffect(() => {\n if (typeof window === 'undefined') return undefined;\n const onBefore = () => {\n if (inProgress.current) return;\n begin();\n };\n const onAfter = () => {\n if (inProgress.current) return;\n end();\n };\n window.addEventListener('beforeprint', onBefore);\n window.addEventListener('afterprint', onAfter);\n return () => {\n window.removeEventListener('beforeprint', onBefore);\n window.removeEventListener('afterprint', onAfter);\n };\n }, [begin, end]);\n\n const print = useCallback(async () => {\n if (inProgress.current || typeof window === 'undefined') return;\n inProgress.current = true;\n try {\n begin();\n await nextFrame();\n await nextFrame();\n window.print();\n } finally {\n inProgress.current = false;\n end();\n }\n }, [begin, end]);\n\n return { printing, print };\n}\n","/* -------------------------------------------------------------------- */\n/* DataGrid body states (design § 3.7): skeleton rows while the first */\n/* page loads, and one full-width row holding an EmptyState for first */\n/* use, no results and errors. Headers render in every state, so the */\n/* table keeps its name and structure. Rendered inside the grid's marked */\n/* root (allowlisted in check-data-component-coverage). */\n/* -------------------------------------------------------------------- */\n\nimport { useTranslation } from 'react-i18next';\n\nimport { EmptyState, type EmptyStateHeadingLevel } from '../empty-state';\nimport { Skeleton } from '../skeleton';\nimport {\n cellVariants,\n skeletonBarVariants,\n stateCellVariants,\n} from './data-grid.variants';\n\nconst SKELETON_WIDTHS = ['long', 'medium', 'short'] as const;\n\n/** Placeholder rows while the first rows load. Hidden from assistive tech:\n * the table carries `aria-busy` and the announcer says \"Loading data…\". */\nexport function DataGridSkeletonRows({\n rowCount,\n columnCount,\n density,\n}: {\n rowCount: number;\n columnCount: number;\n density: 'default' | 'compact';\n}) {\n return (\n <>\n {Array.from({ length: rowCount }, (_, rowIndex) => (\n <tr key={rowIndex} aria-hidden=\"true\">\n {Array.from({ length: columnCount }, (_, cellIndex) => (\n <td\n key={cellIndex}\n className={cellVariants({ section: 'body', density })}\n >\n <Skeleton\n variant=\"text\"\n size=\"sm\"\n animate\n className={skeletonBarVariants({\n width:\n SKELETON_WIDTHS[\n (rowIndex + cellIndex) % SKELETON_WIDTHS.length\n ],\n })}\n />\n </td>\n ))}\n </tr>\n ))}\n </>\n );\n}\n\nexport interface DataGridStateRowProps {\n kind: 'first-use' | 'no-results' | 'error';\n columnCount: number;\n empty?: {\n title?: string;\n description?: string;\n action?: { label: string; onClick: () => void };\n headingLevel?: EmptyStateHeadingLevel;\n noResultsTitle?: string;\n noResultsDescription?: string;\n };\n error?: {\n title?: string;\n description?: string;\n onRetry?: () => void;\n headingLevel?: EmptyStateHeadingLevel;\n };\n /** \"Clear filters\" on no results (source `'user'`). */\n onClearFilters: () => void;\n}\n\n/** One `<tr><td colSpan>` holding the EmptyState for the current state. */\nexport function DataGridStateRow({\n kind,\n columnCount,\n empty,\n error,\n onClearFilters,\n}: DataGridStateRowProps) {\n const { t } = useTranslation('ui');\n\n let content;\n if (kind === 'error') {\n content = (\n <EmptyState\n variant=\"error\"\n size=\"sm\"\n title={error?.title ?? t('dataGrid.error.title')}\n description={error?.description ?? t('dataGrid.error.description')}\n headingLevel={error?.headingLevel ?? 3}\n primaryAction={\n error?.onRetry\n ? { label: t('dataGrid.error.retry'), onClick: error.onRetry }\n : undefined\n }\n />\n );\n } else if (kind === 'no-results') {\n content = (\n <EmptyState\n variant=\"no-results\"\n size=\"sm\"\n title={empty?.noResultsTitle ?? t('dataGrid.empty.noResultsTitle')}\n description={\n empty?.noResultsDescription ??\n t('dataGrid.empty.noResultsDescription')\n }\n headingLevel={empty?.headingLevel ?? 3}\n primaryAction={{\n label: t('dataGrid.empty.clearFilters'),\n onClick: onClearFilters,\n }}\n />\n );\n } else {\n content = (\n <EmptyState\n variant=\"first-use\"\n size=\"sm\"\n title={empty?.title ?? t('dataGrid.empty.title')}\n description={empty?.description}\n headingLevel={empty?.headingLevel ?? 3}\n primaryAction={empty?.action}\n />\n );\n }\n\n return (\n <tr>\n <td colSpan={Math.max(1, columnCount)} className={stateCellVariants()}>\n {content}\n </td>\n </tr>\n );\n}\n","/* -------------------------------------------------------------------- */\n/* Export snapshot builder for DataGrid (CSV, XLSX, PDF, custom). */\n/* */\n/* The engine hands in every row after filters and sorting (v9 */\n/* `getPrePaginatedRowModel().rows`, sub-rows flattened depth-first), not */\n/* the page and not the virtualised window, so an export always holds */\n/* what the user filtered. Server mode passes the one page it has, with */\n/* `scope: 'current-page'`. */\n/* */\n/* Cell rules, in order: */\n/* 1. A masked cell (privacy mode) exports the mask, never the value. */\n/* 2. `exportValue` wins. */\n/* 3. Else `value`: numbers stay numbers (XLSX keeps them numeric); */\n/* dates (a `Date` or an ISO `YYYY-MM-DD` day) become the locale's */\n/* short date; booleans and other values become text; empty is null. */\n/* -------------------------------------------------------------------- */\n\nimport {\n fromIsoDate,\n isCalendarDay,\n} from '../_shared/table-filters/calendar-day';\nimport type {\n TableExportCell,\n TableExportSnapshot,\n} from '../_shared/table-toolbar/seam';\nimport type {\n BuildDataGridExportSnapshot,\n DataGridColumn,\n DataGridExportInput,\n DataGridFooterContext,\n} from './types';\n\nfunction dateFormatter(locale: string): Intl.DateTimeFormat {\n try {\n return new Intl.DateTimeFormat(locale, { dateStyle: 'short' });\n } catch {\n return new Intl.DateTimeFormat(undefined, { dateStyle: 'short' });\n }\n}\n\n/** One plain value as an export cell. */\nfunction valueCell(\n value: unknown,\n dates: Intl.DateTimeFormat,\n): TableExportCell {\n if (value === null || value === undefined || value === '') return null;\n if (typeof value === 'number') return Number.isFinite(value) ? value : null;\n if (value instanceof Date) {\n return Number.isNaN(value.getTime()) ? null : dates.format(value);\n }\n if (isCalendarDay(value)) {\n const day = fromIsoDate(value);\n return day ? dates.format(day) : value;\n }\n return String(value);\n}\n\n/** A totals cell: a footer that is (or returns) a string or number. */\nfunction footerCell<TData>(\n column: DataGridColumn<TData>,\n context: DataGridFooterContext<TData>,\n): TableExportCell {\n const footer =\n typeof column.footer === 'function'\n ? column.footer(context)\n : column.footer;\n if (typeof footer === 'number')\n return Number.isFinite(footer) ? footer : null;\n if (typeof footer === 'string') return footer;\n return null;\n}\n\nexport const buildDataGridExportSnapshot: BuildDataGridExportSnapshot = <TData>(\n input: DataGridExportInput<TData>,\n): TableExportSnapshot => {\n const dates = dateFormatter(input.locale);\n const cellOf = (\n row: TData,\n entry: DataGridExportInput<TData>['columns'][number],\n ): TableExportCell => {\n if (input.isMasked(row, entry.id)) return input.maskFor(row, entry.id);\n const { column } = entry;\n if (column.exportValue) {\n const own = column.exportValue(row);\n if (typeof own === 'number') return Number.isFinite(own) ? own : null;\n return own === '' ? null : own;\n }\n if (column.value) return valueCell(column.value(row), dates);\n return null;\n };\n const { footer } = input;\n return {\n scope: input.scope,\n columns: input.columns.map(({ id, label, align }) => ({\n id,\n label,\n align,\n })),\n rows: input.rows.map((row) => ({\n id: row.id,\n cells: input.columns.map((entry) => cellOf(row.original, entry)),\n })),\n totals: footer\n ? input.columns.map((entry) => footerCell(entry.column, footer))\n : null,\n };\n};\n","/* -------------------------------------------------------------------- */\n/* DataGrid: row selection (design § 1.2, § 1.4, § 3.3). */\n/* */\n/* - Tri-state rows: `selectable`, `locked` (always reported, never in */\n/* v9's `rowSelection`, never cleared), `none` (never selected). */\n/* - Single and multiple modes; select-all over the page or every */\n/* filtered row (`'all'` acts as `'page'` in server mode). */\n/* - Shift range in display order (v9 `getRowsInDisplayOrder()`), */\n/* skipping rows that cannot be selected. The anchor is the kit's own: */\n/* v9's `_lastSelectedRowId` is `@internal` (design R11). */\n/* - Server mode keeps ids from other pages; client mode drops unknown */\n/* ids on `setSelection` and prunes ids that leave `rows`. */\n/* -------------------------------------------------------------------- */\n\nimport { isDevelopment } from '../_shared/is-development';\nimport type { DataGridStoreImpl } from './state';\nimport type {\n DataGridChangeSource,\n DataGridResolvedSelectability,\n DataGridRowSelectability,\n DataGridSelectionApi,\n} from './types';\n\n/** Normalises a host `getRowSelectability` result. */\nexport function resolveDataGridSelectability(\n value: DataGridRowSelectability | undefined,\n): DataGridResolvedSelectability {\n if (value === undefined) return { state: 'selectable', reason: null };\n if (typeof value === 'string') return { state: value, reason: null };\n return { state: value.state, reason: value.reason };\n}\n\n/**\n * The header box's scope. Default `'page'` when paginated or in server\n * mode, else `'all'`; `'none'` outside multiple mode. `'all'` in server\n * mode acts as `'page'` (DEV warning): v9's select-all sees loaded rows\n * only (`rowSelectionFeature.utils.js:62-79`).\n */\nexport function resolveDataGridSelectAllScope(input: {\n selectionMode: 'none' | 'single' | 'multiple';\n selectAllScope: 'all' | 'page' | 'none' | undefined;\n paginated: boolean;\n dataMode: 'client' | 'server';\n warn?: boolean;\n}): 'all' | 'page' | 'none' {\n if (input.selectionMode !== 'multiple') return 'none';\n const scope =\n input.selectAllScope ??\n (input.paginated || input.dataMode === 'server' ? 'page' : 'all');\n if (scope === 'all' && input.dataMode === 'server') {\n if (input.warn && isDevelopment()) {\n console.warn(\n \"[DataGrid] selectAllScope 'all' acts as 'page' in server mode: the grid holds one page.\",\n );\n }\n return 'page';\n }\n return scope;\n}\n\n/** What selection reads from the engine. */\nexport interface DataGridSelectionRuntime {\n store: DataGridStoreImpl;\n mode: 'none' | 'single' | 'multiple';\n scope: 'all' | 'page' | 'none';\n rangeSelection: boolean;\n dataMode: 'client' | 'server';\n getSelectability: (rowId: string) => DataGridResolvedSelectability;\n /** v9 `getRowsInDisplayOrder()` ids (filtered and sorted, all pages,\n * expanded sub-rows included). */\n getDisplayOrderIds: () => readonly string[];\n /** Top-level row ids the header box acts on (the page, or every\n * filtered row). */\n getScopeRowIds: () => readonly string[];\n /** Client: in the core row model at any depth. Server: always true. */\n isKnownRowId: (rowId: string) => boolean;\n}\n\n/** The kit's range anchor, shared by the user and API paths. */\nexport interface DataGridSelectionAnchor {\n current: string | null;\n}\n\nconst canSelect = (runtime: DataGridSelectionRuntime, id: string): boolean =>\n runtime.getSelectability(id).state === 'selectable';\n\n/**\n * `setSelection`: locked ids are kept whatever is passed (they are never\n * stored); `none` ids are dropped; unknown ids are dropped in client mode\n * only. Single mode keeps the last selectable id.\n */\nexport function normaliseDataGridSelection(\n runtime: DataGridSelectionRuntime,\n ids: readonly string[],\n): string[] {\n if (runtime.mode === 'none') return [];\n const seen = new Set<string>();\n const kept: string[] = [];\n for (const id of ids) {\n if (seen.has(id)) continue;\n seen.add(id);\n if (runtime.dataMode === 'client' && !runtime.isKnownRowId(id)) continue;\n // Server mode: an off-page id has no row to ask, so it is kept.\n if (runtime.dataMode === 'server' && !runtime.isKnownRowId(id)) {\n kept.push(id);\n continue;\n }\n if (canSelect(runtime, id)) kept.push(id);\n }\n if (runtime.mode === 'single' && kept.length > 1) {\n return [kept[kept.length - 1]];\n }\n return kept;\n}\n\n/** Selectable ids in the inclusive display-order range (either direction). */\nexport function getDataGridRangeIds(\n runtime: DataGridSelectionRuntime,\n fromId: string,\n toId: string,\n): string[] | null {\n const order = runtime.getDisplayOrderIds();\n const from = order.indexOf(fromId);\n const to = order.indexOf(toId);\n if (from === -1 || to === -1) return null;\n const start = Math.min(from, to);\n const end = Math.max(from, to);\n return order.slice(start, end + 1).filter((id) => canSelect(runtime, id));\n}\n\nexport function setDataGridSelection(\n runtime: DataGridSelectionRuntime,\n ids: readonly string[],\n source: DataGridChangeSource,\n): void {\n runtime.store.write(\n 'rowSelection',\n normaliseDataGridSelection(runtime, ids),\n source,\n );\n}\n\n/** Selects (or deselects) the range; `false` when an end is not shown. */\nexport function selectDataGridRange(\n runtime: DataGridSelectionRuntime,\n fromId: string,\n toId: string,\n checked: boolean,\n source: DataGridChangeSource,\n): boolean {\n if (runtime.mode === 'none') return false;\n if (runtime.mode === 'single') {\n if (!checked) return false;\n if (!canSelect(runtime, toId)) return false;\n runtime.store.write('rowSelection', [toId], source);\n return true;\n }\n const range = getDataGridRangeIds(runtime, fromId, toId);\n if (range === null) return false;\n runtime.store.write(\n 'rowSelection',\n (previous) => {\n if (checked) {\n const seen = new Set(previous);\n return [...previous, ...range.filter((id) => !seen.has(id))];\n }\n const drop = new Set(range);\n return previous.filter((id) => !drop.has(id));\n },\n source,\n );\n return true;\n}\n\nexport function toggleDataGridRow(\n runtime: DataGridSelectionRuntime,\n anchor: DataGridSelectionAnchor,\n rowId: string,\n checked: boolean,\n modifiers: { shiftKey: boolean },\n source: DataGridChangeSource,\n): void {\n if (runtime.mode === 'none' || !canSelect(runtime, rowId)) return;\n if (runtime.mode === 'single') {\n runtime.store.write('rowSelection', checked ? [rowId] : [], source);\n anchor.current = rowId;\n return;\n }\n const useRange =\n modifiers.shiftKey &&\n runtime.rangeSelection &&\n anchor.current !== null &&\n anchor.current !== rowId;\n if (\n !useRange ||\n !selectDataGridRange(\n runtime,\n anchor.current as string,\n rowId,\n checked,\n source,\n )\n ) {\n runtime.store.write(\n 'rowSelection',\n (previous) =>\n checked\n ? previous.includes(rowId)\n ? previous\n : [...previous, rowId]\n : previous.filter((id) => id !== rowId),\n source,\n );\n }\n anchor.current = rowId;\n}\n\n/** Header box over selectable rows in scope only. */\nexport function getDataGridHeaderState(\n runtime: DataGridSelectionRuntime,\n): boolean | 'indeterminate' {\n if (runtime.scope === 'none') return false;\n const candidates = runtime\n .getScopeRowIds()\n .filter((id) => canSelect(runtime, id));\n if (candidates.length === 0) return false;\n const selected = new Set(runtime.store.get('rowSelection'));\n const count = candidates.filter((id) => selected.has(id)).length;\n if (count === 0) return false;\n return count === candidates.length ? true : 'indeterminate';\n}\n\n/**\n * The header box is disabled when no row in scope can be selected (every\n * row `locked` or `none`, or no rows). `null` while some row is\n * selectable. Otherwise the reason the rows share (already resolved and\n * privacy-masked by the engine), or `null` inside the object when they\n * differ or give none, so the grid's default copy applies.\n */\nexport function getDataGridSelectAllBlock(\n runtime: DataGridSelectionRuntime,\n): { reason: string | null } | null {\n if (runtime.scope === 'none') return null;\n let shared: string | null | undefined;\n for (const id of runtime.getScopeRowIds()) {\n const { state, reason } = runtime.getSelectability(id);\n if (state === 'selectable') return null;\n if (shared === undefined) shared = reason;\n else if (shared !== reason) shared = null;\n }\n return { reason: shared ?? null };\n}\n\nexport function toggleAllDataGridRows(\n runtime: DataGridSelectionRuntime,\n anchor: DataGridSelectionAnchor,\n checked: boolean,\n source: DataGridChangeSource,\n): void {\n if (runtime.scope === 'none') return;\n anchor.current = null;\n const candidates = runtime\n .getScopeRowIds()\n .filter((id) => canSelect(runtime, id));\n runtime.store.write(\n 'rowSelection',\n (previous) => {\n if (checked) {\n const seen = new Set(previous);\n return [...previous, ...candidates.filter((id) => !seen.has(id))];\n }\n const drop = new Set(candidates);\n return previous.filter((id) => !drop.has(id));\n },\n source,\n );\n}\n\n/** The renderer's selection API (types.ts `DataGridSelectionApi`). */\nexport function createDataGridSelectionApi(\n runtime: DataGridSelectionRuntime,\n anchor: DataGridSelectionAnchor,\n): DataGridSelectionApi {\n const selected = new Set(runtime.store.get('rowSelection'));\n return {\n mode: runtime.mode,\n scope: runtime.scope,\n headerState: getDataGridHeaderState(runtime),\n selectAllBlock: getDataGridSelectAllBlock(runtime),\n toggleAll: (checked) =>\n toggleAllDataGridRows(runtime, anchor, checked, 'user'),\n toggleRow: (rowId, checked, modifiers) =>\n toggleDataGridRow(runtime, anchor, rowId, checked, modifiers, 'user'),\n isSelected: (rowId) => {\n const state = runtime.getSelectability(rowId).state;\n if (state === 'locked') return true;\n if (state === 'none') return false;\n return selected.has(rowId);\n },\n getSelectability: (rowId) => runtime.getSelectability(rowId),\n };\n}\n","/* -------------------------------------------------------------------- */\n/* DataGrid: the curated imperative handle (types.ts `DataGridHandle`). */\n/* */\n/* Ids and kit shapes only: no TanStack instance, row object or DOM node */\n/* leaves this file, and there is no escape hatch. Two handles share one */\n/* store: the public one (`ref`, agent) tags writes `'api'`; the toolbar */\n/* seam's tags them `'user'`. Both read the live store, so a read */\n/* straight after a write is fresh, and both have stable identity. */\n/* -------------------------------------------------------------------- */\n\nimport { isDevelopment } from '../_shared/is-development';\nimport {\n clampDataGridColumnSize,\n getDataGridColumnLabel,\n getDataGridColumnRules,\n isDataGridColumnFilterable,\n isDataGridColumnMasked,\n isDataGridColumnSortable,\n resolveDataGridColumnOrder,\n type DataGridColumnModel,\n} from './columns';\nimport {\n getDataGridRangeIds,\n normaliseDataGridSelection,\n selectDataGridRange,\n type DataGridSelectionAnchor,\n type DataGridSelectionRuntime,\n} from './selection';\nimport {\n compactFilterModel,\n stableEqual,\n type DataGridSliceWrite,\n type DataGridStoreImpl,\n} from './state';\nimport type {\n DataGridChangeSource,\n DataGridColumnInfo,\n DataGridColumnPinning,\n DataGridFeatureInfo,\n DataGridFilterModel,\n DataGridHandle,\n DataGridRendererBindings,\n DataGridSlices,\n DataGridSortEntry,\n} from './types';\n\nfunction warn(message: string): void {\n if (isDevelopment()) console.warn(`[DataGrid] ${message}`);\n}\n\n/** The column slices `resetColumnState` restores. */\nexport type DataGridColumnDefaults = Pick<\n DataGridSlices,\n 'columnVisibility' | 'columnPinning' | 'columnSizing' | 'columnOrder'\n>;\n\n/** Live facts the handle reads at call time (the engine refreshes them on\n * every render). Plain values and closures over ids only. */\nexport interface DataGridHandleRuntime<TData extends object> {\n store: DataGridStoreImpl;\n model: DataGridColumnModel<TData>;\n selection: DataGridSelectionRuntime;\n anchor: DataGridSelectionAnchor;\n features: DataGridFeatureInfo;\n privacyMode: boolean;\n /** `pagination` is on. */\n paginated: boolean;\n /** `multiSort ? maxSortLevels : 1`. */\n maxSortLevels: number;\n expandMode: 'single' | 'multiple';\n /** Fixed table layout (widths are px). */\n fixedLayout: boolean;\n /** Effective visibility of every data column. */\n getEffectiveVisibility: () => Record<string, boolean>;\n getPageCount: () => number;\n getRowCount: () => number;\n getRowIds: () => string[];\n /** `null` when the row is unknown (client) or not on the page (server). */\n canExpand: (rowId: string) => boolean | null;\n /** Ancestors of a row, root first (empty for top-level rows). */\n getAncestorIds: (rowId: string) => string[];\n isKnownRowId: (rowId: string) => boolean;\n getColumnDefaults: () => DataGridColumnDefaults;\n /** Removes the saved column state for `gridId`, if any. */\n clearSavedColumnState: () => void;\n getBindings: () => DataGridRendererBindings | null;\n}\n\n/** One data column in display order with its pin side. */\nexport interface DataGridDisplayColumn {\n id: string;\n pinned: 'start' | 'end' | false;\n}\n\n/** Data columns in display order: start-pinned (pinning order), then the\n * rest by `columnOrder`, then end-pinned. Hidden columns included. */\nexport function getDataGridDisplayColumns<TData extends object>(\n model: DataGridColumnModel<TData>,\n order: readonly string[],\n pinning: DataGridColumnPinning,\n): DataGridDisplayColumn[] {\n const resolved = resolveDataGridColumnOrder(order, model.declaredOrder);\n const start = pinning.start.filter((id) => model.kitColumns.has(id));\n const startSet = new Set(start);\n const end = pinning.end.filter(\n (id) => model.kitColumns.has(id) && !startSet.has(id),\n );\n const endSet = new Set(end);\n const centre = resolved.filter((id) => !startSet.has(id) && !endSet.has(id));\n return [\n ...start.map((id) => ({ id, pinned: 'start' as const })),\n ...centre.map((id) => ({ id, pinned: false as const })),\n ...end.map((id) => ({ id, pinned: 'end' as const })),\n ];\n}\n\n/** Every group's leaves are adjacent and share one pin side. */\nfunction groupsIntact<TData extends object>(\n model: DataGridColumnModel<TData>,\n list: readonly DataGridDisplayColumn[],\n): boolean {\n for (const groupId of model.kitGroups.keys()) {\n const positions: number[] = [];\n list.forEach((column, index) => {\n if (model.groupOf.get(column.id) === groupId) positions.push(index);\n });\n if (positions.length < 2) continue;\n for (let index = 1; index < positions.length; index += 1) {\n if (positions[index] !== positions[index - 1] + 1) return false;\n }\n const side = list[positions[0]].pinned;\n if (positions.some((position) => list[position].pinned !== side)) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * `moveColumn` maths (types.ts): `toIndex` is the final index; the column\n * takes the pin side of the column at `toIndex` before the move. Returns\n * the new order and pinning, or `null` when the move is refused.\n */\nexport function planDataGridColumnMove<TData extends object>(\n model: DataGridColumnModel<TData>,\n list: readonly DataGridDisplayColumn[],\n id: string,\n toIndex: number,\n privacyMode: boolean,\n): { order: string[]; pinning: DataGridColumnPinning } | null {\n const from = list.findIndex((column) => column.id === id);\n const column = model.kitColumns.get(id);\n if (from === -1 || !column) {\n warn(`moveColumn: unknown column \"${id}\".`);\n return null;\n }\n const rules = getDataGridColumnRules(\n column,\n model.defaultRowHeaderId,\n privacyMode,\n );\n if (!rules.canMove) {\n warn(`moveColumn: column \"${id}\" is not reorderable.`);\n return null;\n }\n if (!Number.isFinite(toIndex)) return null;\n const target = Math.min(Math.max(0, Math.floor(toIndex)), list.length - 1);\n const side = list[target].pinned;\n if (side !== list[from].pinned && !rules.canPin) {\n warn(`moveColumn: column \"${id}\" cannot change pin side.`);\n return null;\n }\n const next = list.filter((entry) => entry.id !== id);\n next.splice(target, 0, { id, pinned: side });\n if (!groupsIntact(model, next)) {\n warn(`moveColumn: moving \"${id}\" there would split a column group.`);\n return null;\n }\n return {\n order: next.map((entry) => entry.id),\n pinning: {\n start: next\n .filter((entry) => entry.pinned === 'start')\n .map((entry) => entry.id),\n end: next\n .filter((entry) => entry.pinned === 'end')\n .map((entry) => entry.id),\n },\n };\n}\n\n/**\n * Builds a handle over the live runtime. `defaultSource` is `'api'` for the\n * public handle and `'user'` for the toolbar seam's.\n */\nexport function createDataGridHandle<TData extends object>(\n getRuntime: () => DataGridHandleRuntime<TData>,\n defaultSource: 'api' | 'user',\n): DataGridHandle {\n const sourceOf = (options?: {\n source?: 'api' | 'restore';\n }): DataGridChangeSource => options?.source ?? defaultSource;\n\n const columnMasked = (id: string): boolean => {\n const { model, privacyMode } = getRuntime();\n const column = model.kitColumns.get(id);\n return column !== undefined && isDataGridColumnMasked(column, privacyMode);\n };\n\n const displayColumns = (): DataGridDisplayColumn[] => {\n const { model, store } = getRuntime();\n return getDataGridDisplayColumns(\n model,\n store.get('columnOrder'),\n store.get('columnPinning'),\n );\n };\n\n const handle: DataGridHandle = {\n getFeatures: () => ({ ...getRuntime().features }),\n\n /* ---- selection ---- */\n\n getSelection: () => getRuntime().store.getReportedSelection(),\n\n setSelection(ids) {\n const runtime = getRuntime();\n if (runtime.selection.mode === 'none') {\n warn('setSelection: selection is off (selectionMode \"none\").');\n return;\n }\n runtime.store.write(\n 'rowSelection',\n normaliseDataGridSelection(runtime.selection, ids),\n defaultSource,\n );\n },\n\n selectRange(fromId, toId) {\n const runtime = getRuntime();\n if (runtime.selection.mode === 'none') return;\n if (getDataGridRangeIds(runtime.selection, fromId, toId) === null) {\n warn('selectRange: an end of the range is not a displayed row.');\n return;\n }\n selectDataGridRange(runtime.selection, fromId, toId, true, defaultSource);\n runtime.anchor.current = toId;\n },\n\n clearSelection() {\n const runtime = getRuntime();\n runtime.anchor.current = null;\n runtime.store.write('rowSelection', [], defaultSource);\n },\n\n /* ---- sorting ---- */\n\n getSort: () =>\n getRuntime()\n .store.get('sorting')\n .map((entry) => ({ ...entry })),\n\n setSort(model) {\n const runtime = getRuntime();\n if (model.some((entry) => columnMasked(entry.colId))) {\n warn(\n 'setSort: a masked column cannot be sorted while privacy mode is on.',\n );\n return;\n }\n const seen = new Set<string>();\n const next: DataGridSortEntry[] = [];\n for (const entry of model) {\n const column = runtime.model.kitColumns.get(entry.colId);\n if (!column || !isDataGridColumnSortable(column)) {\n warn(`setSort: column \"${entry.colId}\" is unknown or does not sort.`);\n continue;\n }\n if (seen.has(entry.colId)) continue;\n seen.add(entry.colId);\n next.push({\n colId: entry.colId,\n sort: entry.sort === 'desc' ? 'desc' : 'asc',\n });\n }\n runtime.store.write(\n 'sorting',\n next.slice(0, runtime.maxSortLevels),\n defaultSource,\n );\n },\n\n /* ---- filters ---- */\n\n getFilter: () => ({ ...getRuntime().store.get('filters') }),\n\n setFilter(model: DataGridFilterModel, options) {\n const runtime = getRuntime();\n const current = runtime.store.get('filters');\n const next = compactFilterModel(model);\n const source = sourceOf(options);\n const touchesMasked = Object.keys(next).some(\n (key) => columnMasked(key) && !stableEqual(next[key], current[key]),\n );\n // A restore (a saved view) keeps a masked column's model in the\n // slice, unevaluated (design 3.9); only new api and agent writes are\n // refused.\n if (touchesMasked && source !== 'restore') {\n warn(\n 'setFilter: a masked column cannot be filtered while privacy mode is on.',\n );\n return;\n }\n runtime.store.write('filters', next, source);\n },\n\n getQuickFilter: () => getRuntime().store.get('quickFilter'),\n\n setQuickFilter(text, options) {\n getRuntime().store.write(\n 'quickFilter',\n String(text ?? ''),\n sourceOf(options),\n );\n },\n\n clearFilters() {\n getRuntime().store.writeMany(\n [\n { slice: 'filters', next: {} },\n { slice: 'quickFilter', next: '' },\n ],\n defaultSource,\n );\n },\n\n applyView(view, options) {\n const runtime = getRuntime();\n const source = sourceOf(options);\n const writes: DataGridSliceWrite[] = [];\n if (view.filters !== undefined) {\n const current = runtime.store.get('filters');\n const next = compactFilterModel(view.filters);\n const touchesMasked = Object.keys(next).some(\n (key) => columnMasked(key) && !stableEqual(next[key], current[key]),\n );\n // Same rule as setFilter: a restore keeps a masked column's model,\n // unevaluated; a new api write is refused, whole, so a view never\n // lands half applied.\n if (touchesMasked && source !== 'restore') {\n warn(\n 'applyView: a masked column cannot be filtered while privacy mode is on.',\n );\n return;\n }\n writes.push({ slice: 'filters', next });\n }\n if (view.quickFilter !== undefined) {\n writes.push({ slice: 'quickFilter', next: String(view.quickFilter) });\n }\n // One write: one page reset and one onQueryChange with the whole query.\n if (writes.length > 0) runtime.store.writeMany(writes, source);\n },\n\n isPrivacyMode: () => getRuntime().privacyMode,\n\n /* ---- paging ---- */\n\n getCurrentPage: () => getRuntime().store.get('page').pageIndex,\n\n goToPage(pageIndex) {\n const runtime = getRuntime();\n if (!runtime.paginated) {\n warn('goToPage: pagination is off.');\n return;\n }\n if (!Number.isFinite(pageIndex)) return;\n const pageCount = runtime.getPageCount();\n let index = Math.max(0, Math.floor(pageIndex));\n if (pageCount >= 0) index = Math.min(index, Math.max(0, pageCount - 1));\n runtime.store.write(\n 'page',\n (previous) => ({ ...previous, pageIndex: index }),\n defaultSource,\n );\n },\n\n getPageSize: () => getRuntime().store.get('page').pageSize,\n\n setPageSize(size) {\n const runtime = getRuntime();\n if (!runtime.paginated) {\n warn('setPageSize: pagination is off.');\n return;\n }\n if (!Number.isFinite(size) || size < 1) return;\n runtime.store.write(\n 'page',\n { pageIndex: 0, pageSize: Math.floor(size) },\n defaultSource,\n );\n },\n\n getPageCount: () => getRuntime().getPageCount(),\n getRowCount: () => getRuntime().getRowCount(),\n getRowIds: () => getRuntime().getRowIds(),\n\n /* ---- expanding ---- */\n\n getExpandedRowIds: () => [...getRuntime().store.get('expanded')],\n\n setRowExpanded(id, expanded) {\n const runtime = getRuntime();\n const can = runtime.canExpand(id);\n if (can !== true) {\n warn(`setRowExpanded: row \"${id}\" is unknown or cannot expand.`);\n return;\n }\n runtime.store.write(\n 'expanded',\n (previous) => {\n if (!expanded) return previous.filter((other) => other !== id);\n if (runtime.expandMode === 'single') {\n const keep = new Set(runtime.getAncestorIds(id));\n return [...previous.filter((other) => keep.has(other)), id];\n }\n return previous.includes(id) ? previous : [...previous, id];\n },\n defaultSource,\n );\n },\n\n /* ---- columns ---- */\n\n getColumns(): DataGridColumnInfo[] {\n const runtime = getRuntime();\n const { model, store, privacyMode } = runtime;\n const visibility = runtime.getEffectiveVisibility();\n const explicit = store.get('columnVisibility');\n const sizing = store.get('columnSizing');\n return displayColumns().map((entry, index) => {\n const column = model.kitColumns.get(entry.id);\n if (!column) throw new Error(`[DataGrid] unknown column ${entry.id}`);\n const rules = getDataGridColumnRules(\n column,\n model.defaultRowHeaderId,\n privacyMode,\n );\n const masked = isDataGridColumnMasked(column, privacyMode);\n const width = runtime.fixedLayout\n ? (sizing[entry.id] ?? column.size ?? null)\n : null;\n return {\n id: entry.id,\n label: getDataGridColumnLabel(column),\n visible: visibility[entry.id] ?? true,\n canHide: rules.canHide,\n canMove: rules.canMove,\n canPin: rules.canPin,\n pinned: entry.pinned,\n width,\n index,\n groupId: model.groupOf.get(entry.id) ?? null,\n filterKind: isDataGridColumnFilterable(column)\n ? (column.filter?.kind ?? null)\n : null,\n sortable: !masked && isDataGridColumnSortable(column),\n userTouched: entry.id in explicit,\n masked,\n };\n });\n },\n\n setColumnVisible(id, visible) {\n const runtime = getRuntime();\n const column = runtime.model.kitColumns.get(id);\n if (!column) {\n warn(`setColumnVisible: unknown column \"${id}\".`);\n return;\n }\n const { canHide } = getDataGridColumnRules(\n column,\n runtime.model.defaultRowHeaderId,\n runtime.privacyMode,\n );\n if (!canHide) {\n warn(`setColumnVisible: column \"${id}\" cannot be hidden or shown.`);\n return;\n }\n runtime.store.write(\n 'columnVisibility',\n (previous) => ({ ...previous, [id]: Boolean(visible) }),\n defaultSource,\n );\n },\n\n pinColumn(id, side) {\n const runtime = getRuntime();\n const column = runtime.model.kitColumns.get(id);\n if (!column) {\n warn(`pinColumn: unknown column \"${id}\".`);\n return;\n }\n const rules = getDataGridColumnRules(\n column,\n runtime.model.defaultRowHeaderId,\n runtime.privacyMode,\n );\n if (!rules.canPin) {\n warn(`pinColumn: column \"${id}\" is not pinnable.`);\n return;\n }\n const groupId = runtime.model.groupOf.get(id);\n if (groupId !== undefined) {\n const members = [...runtime.model.groupOf].filter(\n ([, group]) => group === groupId,\n );\n if (members.length > 1) {\n warn(\n `pinColumn: pinning \"${id}\" alone would split group \"${groupId}\".`,\n );\n return;\n }\n }\n runtime.store.write(\n 'columnPinning',\n (previous) => {\n const start = previous.start.filter((other) => other !== id);\n const end = previous.end.filter((other) => other !== id);\n if (side === 'start') start.push(id);\n if (side === 'end') end.push(id);\n return { start, end };\n },\n defaultSource,\n );\n },\n\n moveColumn(id, toIndex) {\n const runtime = getRuntime();\n const plan = planDataGridColumnMove(\n runtime.model,\n displayColumns(),\n id,\n toIndex,\n runtime.privacyMode,\n );\n if (!plan) return;\n runtime.store.writeMany(\n [\n { slice: 'columnOrder', next: plan.order },\n { slice: 'columnPinning', next: plan.pinning },\n ],\n defaultSource,\n );\n },\n\n setColumnWidth(id, px) {\n const runtime = getRuntime();\n const column = runtime.model.kitColumns.get(id);\n if (!column) {\n warn(`setColumnWidth: unknown column \"${id}\".`);\n return;\n }\n const clamped = clampDataGridColumnSize(column, px);\n if (clamped === null) return;\n runtime.store.write(\n 'columnSizing',\n (previous) => ({ ...previous, [id]: clamped }),\n defaultSource,\n );\n },\n\n resetColumnState() {\n const runtime = getRuntime();\n const defaults = runtime.getColumnDefaults();\n runtime.clearSavedColumnState();\n runtime.store.writeMany(\n [\n { slice: 'columnVisibility', next: defaults.columnVisibility },\n { slice: 'columnPinning', next: defaults.columnPinning },\n { slice: 'columnSizing', next: defaults.columnSizing },\n { slice: 'columnOrder', next: defaults.columnOrder },\n ],\n defaultSource,\n );\n },\n\n getUserTouchedColumns: () =>\n Object.keys(getRuntime().store.get('columnVisibility')),\n\n markColumnsUserTouched(ids) {\n const runtime = getRuntime();\n const effective = runtime.getEffectiveVisibility();\n runtime.store.write(\n 'columnVisibility',\n (previous) => {\n const next = { ...previous };\n for (const id of ids) {\n if (runtime.model.kitColumns.has(id) && id in effective) {\n next[id] = effective[id];\n }\n }\n return next;\n },\n defaultSource,\n );\n },\n\n /* ---- focus, scroll, print ---- */\n\n scrollToRow(id) {\n const runtime = getRuntime();\n if (!runtime.isKnownRowId(id)) {\n warn(`scrollToRow: unknown row \"${id}\".`);\n return;\n }\n runtime.getBindings()?.scrollToRow(id);\n },\n\n focusRow(id, columnId) {\n const runtime = getRuntime();\n if (!runtime.isKnownRowId(id)) {\n warn(`focusRow: unknown row \"${id}\".`);\n return;\n }\n runtime.getBindings()?.focusRow(id, columnId);\n },\n\n print() {\n const bindings = getRuntime().getBindings();\n return bindings ? bindings.print() : Promise.resolve();\n },\n\n subscribe: (listener) => getRuntime().store.subscribe(listener),\n };\n\n return handle;\n}\n","/* -------------------------------------------------------------------- */\n/* DataGrid: column state saved under `gridId` (design § 9). */\n/* */\n/* localStorage[\"data-grid-col-state:<gridId>\"] = */\n/* { v: 1, order?, sizing?, pinning?, visibility? } */\n/* */\n/* - Read once, before the first render, into the uncontrolled slices. */\n/* - Written on `user` and `api` column changes only, debounced 250 ms, */\n/* flushed on `pagehide`. Controlled slices are never read or written. */\n/* - Each field is validated on its own; a bad field is dropped and the */\n/* others kept. Every storage access is guarded (private mode, quota). */\n/* - Pins are logical (`start` / `end`), so no direction is stored. */\n/* -------------------------------------------------------------------- */\n\nimport { isDevelopment } from '../_shared/is-development';\nimport {\n clampDataGridColumnSize,\n getDataGridColumnRules,\n isUtilityColumnId,\n} from './columns';\nimport type { DataGridStoreImpl } from './state';\nimport type {\n DataGridColumn,\n DataGridColumnPinning,\n DataGridColumnStateEnvelopeV1,\n DataGridSliceName,\n} from './types';\nimport { DATA_GRID_COLUMN_STATE_PREFIX } from './types';\n\n/** The four persisted column slices. */\nexport const DATA_GRID_PERSISTED_SLICES = [\n 'columnOrder',\n 'columnSizing',\n 'columnPinning',\n 'columnVisibility',\n] as const satisfies readonly DataGridSliceName[];\n\nexport type DataGridPersistedSlice =\n (typeof DATA_GRID_PERSISTED_SLICES)[number];\n\n/** Debounce of the save after a column change. */\nexport const DATA_GRID_PERSIST_DEBOUNCE_MS = 250;\n\nexport function getDataGridColumnStateKey(gridId: string): string {\n return `${DATA_GRID_COLUMN_STATE_PREFIX}${gridId}`;\n}\n\nfunction getStorage(): Storage | null {\n try {\n return typeof window === 'undefined' ? null : window.localStorage;\n } catch {\n return null;\n }\n}\n\n/** What the grid knows about its columns, for validation. */\nexport interface DataGridPersistenceColumns<TData> {\n kitColumns: ReadonlyMap<string, DataGridColumn<TData>>;\n groupOf: ReadonlyMap<string, string>;\n defaultRowHeaderId: string | null;\n privacyMode: boolean;\n}\n\n/** Validated saved state, in kit slice shapes. */\nexport interface DataGridLoadedColumnState {\n columnOrder?: string[];\n columnSizing?: Record<string, number>;\n columnPinning?: DataGridColumnPinning;\n columnVisibility?: Record<string, boolean>;\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n value !== null && typeof value === 'object' && !Array.isArray(value);\n\nconst isStringArray = (value: unknown): value is string[] =>\n Array.isArray(value) && value.every((item) => typeof item === 'string');\n\nfunction validateOrder<TData>(\n raw: unknown,\n ctx: DataGridPersistenceColumns<TData>,\n): string[] | undefined {\n if (!isStringArray(raw)) return undefined;\n const seen = new Set<string>();\n const order = raw.filter((id) => {\n if (isUtilityColumnId(id) || !ctx.kitColumns.has(id) || seen.has(id)) {\n return false;\n }\n seen.add(id);\n return true;\n });\n return order.length > 0 ? order : undefined;\n}\n\nfunction validateSizing<TData>(\n raw: unknown,\n ctx: DataGridPersistenceColumns<TData>,\n): Record<string, number> | undefined {\n if (!isRecord(raw)) return undefined;\n const sizing: Record<string, number> = {};\n for (const [id, value] of Object.entries(raw)) {\n const column = ctx.kitColumns.get(id);\n if (!column || isUtilityColumnId(id) || typeof value !== 'number') continue;\n const clamped = clampDataGridColumnSize(column, value);\n if (clamped !== null) sizing[id] = clamped;\n }\n return Object.keys(sizing).length > 0 ? sizing : undefined;\n}\n\n/** Drops pins on unknown or non-pinnable columns, pins that split a\n * group, and duplicates (`end` loses the overlap). */\nexport function sanitiseDataGridPinning<TData>(\n pinning: { start: readonly string[]; end: readonly string[] },\n ctx: DataGridPersistenceColumns<TData>,\n): DataGridColumnPinning {\n const allowed = (id: string): boolean => {\n const column = ctx.kitColumns.get(id);\n if (!column || isUtilityColumnId(id)) return false;\n return getDataGridColumnRules(\n column,\n ctx.defaultRowHeaderId,\n ctx.privacyMode,\n ).canPin;\n };\n const start = [...new Set(pinning.start)].filter(allowed);\n const startSet = new Set(start);\n const end = [...new Set(pinning.end)].filter(\n (id) => allowed(id) && !startSet.has(id),\n );\n // A group keeps a pin only when every leaf has the same one.\n const side = new Map<string, 'start' | 'end'>();\n start.forEach((id) => side.set(id, 'start'));\n end.forEach((id) => side.set(id, 'end'));\n const breaksGroup = (id: string): boolean => {\n const groupId = ctx.groupOf.get(id);\n if (groupId === undefined) return false;\n const mySide = side.get(id);\n for (const [leaf, group] of ctx.groupOf) {\n if (group === groupId && side.get(leaf) !== mySide) return true;\n }\n return false;\n };\n return {\n start: start.filter((id) => !breaksGroup(id)),\n end: end.filter((id) => !breaksGroup(id)),\n };\n}\n\nfunction validatePinning<TData>(\n raw: unknown,\n ctx: DataGridPersistenceColumns<TData>,\n): DataGridColumnPinning | undefined {\n if (!isRecord(raw) || !isStringArray(raw.start) || !isStringArray(raw.end)) {\n return undefined;\n }\n return sanitiseDataGridPinning({ start: raw.start, end: raw.end }, ctx);\n}\n\nfunction validateVisibility<TData>(\n raw: unknown,\n ctx: DataGridPersistenceColumns<TData>,\n): Record<string, boolean> | undefined {\n if (!isRecord(raw)) return undefined;\n const visibility: Record<string, boolean> = {};\n for (const [id, value] of Object.entries(raw)) {\n const column = ctx.kitColumns.get(id);\n if (!column || isUtilityColumnId(id) || typeof value !== 'boolean')\n continue;\n const { canHide } = getDataGridColumnRules(\n column,\n ctx.defaultRowHeaderId,\n ctx.privacyMode,\n );\n // A column that cannot be hidden is forced visible.\n visibility[id] = canHide ? value : true;\n }\n return Object.keys(visibility).length > 0 ? visibility : undefined;\n}\n\n/**\n * Validates a parsed envelope. Non-object or `v !== 1`: `null` (defaults\n * used, overwritten on the next user change). Each field alone otherwise.\n */\nexport function validateDataGridColumnState<TData>(\n raw: unknown,\n ctx: DataGridPersistenceColumns<TData>,\n): DataGridLoadedColumnState | null {\n if (!isRecord(raw) || raw.v !== 1) return null;\n const loaded: DataGridLoadedColumnState = {};\n const order = validateOrder(raw.order, ctx);\n if (order) loaded.columnOrder = order;\n const sizing = validateSizing(raw.sizing, ctx);\n if (sizing) loaded.columnSizing = sizing;\n const pinning = validatePinning(raw.pinning, ctx);\n if (pinning) loaded.columnPinning = pinning;\n const visibility = validateVisibility(raw.visibility, ctx);\n if (visibility) loaded.columnVisibility = visibility;\n return loaded;\n}\n\n/** Reads and validates the saved state; `null` when absent or unusable. */\nexport function loadDataGridColumnState<TData>(\n gridId: string,\n ctx: DataGridPersistenceColumns<TData>,\n): DataGridLoadedColumnState | null {\n const storage = getStorage();\n if (!storage) return null;\n try {\n const text = storage.getItem(getDataGridColumnStateKey(gridId));\n if (text === null) return null;\n return validateDataGridColumnState(JSON.parse(text) as unknown, ctx);\n } catch {\n return null;\n }\n}\n\n/** Builds the envelope from the store's uncontrolled column slices. */\nexport function buildDataGridColumnStateEnvelope(\n store: Pick<DataGridStoreImpl, 'get' | 'isControlled'>,\n): DataGridColumnStateEnvelopeV1 {\n const envelope: DataGridColumnStateEnvelopeV1 = { v: 1 };\n const strip = (ids: readonly string[]): string[] =>\n ids.filter((id) => !isUtilityColumnId(id));\n if (!store.isControlled('columnOrder')) {\n const order = strip(store.get('columnOrder'));\n if (order.length > 0) envelope.order = order;\n }\n if (!store.isControlled('columnSizing')) {\n const sizing = Object.fromEntries(\n Object.entries(store.get('columnSizing')).filter(\n ([id, px]) => !isUtilityColumnId(id) && Number.isFinite(px),\n ),\n );\n if (Object.keys(sizing).length > 0) envelope.sizing = sizing;\n }\n if (!store.isControlled('columnPinning')) {\n const pinning = store.get('columnPinning');\n envelope.pinning = { start: strip(pinning.start), end: strip(pinning.end) };\n }\n if (!store.isControlled('columnVisibility')) {\n const visibility = Object.fromEntries(\n Object.entries(store.get('columnVisibility')).filter(\n ([id]) => !isUtilityColumnId(id),\n ),\n );\n if (Object.keys(visibility).length > 0) envelope.visibility = visibility;\n }\n return envelope;\n}\n\nexport function saveDataGridColumnState(\n gridId: string,\n envelope: DataGridColumnStateEnvelopeV1,\n): void {\n const storage = getStorage();\n if (!storage) return;\n try {\n storage.setItem(\n getDataGridColumnStateKey(gridId),\n JSON.stringify(envelope),\n );\n } catch {\n // Quota or blocked storage: the grid keeps working without saving.\n }\n}\n\nexport function clearDataGridColumnState(gridId: string): void {\n const storage = getStorage();\n if (!storage) return;\n try {\n storage.removeItem(getDataGridColumnStateKey(gridId));\n } catch {\n // Blocked storage: nothing to remove.\n }\n}\n\n/** DEV warning when persistence and a controlled column slice overlap. */\nexport function warnControlledPersistenceOverlap(\n gridId: string,\n store: Pick<DataGridStoreImpl, 'isControlled'>,\n): void {\n if (!isDevelopment()) return;\n const overlap = DATA_GRID_PERSISTED_SLICES.filter((slice) =>\n store.isControlled(slice),\n );\n if (overlap.length > 0) {\n console.warn(\n `[DataGrid] gridId \"${gridId}\" saves column state, but ${overlap.join(', ')} ${overlap.length === 1 ? 'is' : 'are'} controlled; controlled slices are never saved or restored.`,\n );\n }\n}\n\nexport interface DataGridColumnStatePersister {\n /** Writes any pending save now. */\n flush(): void;\n /** Cancels the pending save without writing (after a reset). */\n cancel(): void;\n dispose(): void;\n}\n\n/**\n * Subscribes to the store and saves on `user` and `api` column changes.\n * `isDefault()` lets a reset to declared defaults remove the key instead of\n * writing the defaults back.\n */\nexport function createDataGridColumnStatePersister(options: {\n gridId: string;\n store: DataGridStoreImpl;\n isDefault?: () => boolean;\n debounceMs?: number;\n}): DataGridColumnStatePersister {\n const { gridId, store } = options;\n const debounceMs = options.debounceMs ?? DATA_GRID_PERSIST_DEBOUNCE_MS;\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n const write = (): void => {\n timer = null;\n if (options.isDefault?.()) {\n clearDataGridColumnState(gridId);\n return;\n }\n saveDataGridColumnState(gridId, buildDataGridColumnStateEnvelope(store));\n };\n\n const cancel = (): void => {\n if (timer !== null) clearTimeout(timer);\n timer = null;\n };\n\n const flush = (): void => {\n if (timer === null) return;\n cancel();\n write();\n };\n\n const unsubscribe = store.subscribe((change) => {\n if (change.event !== 'columns') return;\n if (change.source !== 'user' && change.source !== 'api') return;\n cancel();\n timer = setTimeout(write, debounceMs);\n });\n\n const onPageHide = (): void => flush();\n if (typeof window !== 'undefined') {\n window.addEventListener('pagehide', onPageHide);\n }\n\n return {\n flush,\n cancel,\n dispose() {\n flush();\n unsubscribe();\n if (typeof window !== 'undefined') {\n window.removeEventListener('pagehide', onPageHide);\n }\n },\n };\n}\n","/* -------------------------------------------------------------------- */\n/* DataGrid: effective column visibility (design § 9). */\n/* */\n/* effectiveVisible(col) = */\n/* privacyMode && col.privacy === 'hide' -> false */\n/* col.id in explicit visibility -> explicit */\n/* responsive on && col.responsiveTier && width < breakpoint -> false */\n/* otherwise -> !defaultHidden */\n/* */\n/* The explicit map holds only user, host or storage choices; its keys */\n/* are the user-touched set. Responsive hiding is derived on every render */\n/* from the grid's measured width and never written anywhere. */\n/* -------------------------------------------------------------------- */\n\nimport {\n getDataGridColumnRules,\n isDataGridColumnPrivacyHidden,\n} from './columns';\nimport type { DataGridColumn } from './types';\nimport { DATA_GRID_RESPONSIVE_BREAKPOINTS } from './types';\n\nexport interface DataGridVisibilityInput<TData> {\n /** Data columns (no utility columns), any order. */\n columns: readonly DataGridColumn<TData>[];\n /** Explicit visibility (user, host, storage). */\n explicit: Readonly<Record<string, boolean>>;\n privacyMode: boolean;\n /** `responsiveColumns`; default on when any column has a tier. */\n responsive: boolean;\n /** Grid inline size in px; `null` before layout (nothing is hidden by\n * width until the grid is measured). */\n containerInlineSize: number | null;\n /** The row-header column by default (cannot be hidden unless `hideable`). */\n defaultRowHeaderId: string | null;\n /** A column holding focus is never hidden by width. */\n focusedColumnId?: string | null;\n}\n\n/** Is this tier hidden at this width? */\nexport function isTierHidden(\n tier: 1 | 2 | 3 | undefined,\n containerInlineSize: number | null,\n): boolean {\n if (tier === undefined || containerInlineSize === null) return false;\n return containerInlineSize < DATA_GRID_RESPONSIVE_BREAKPOINTS[tier - 1];\n}\n\n/** `responsiveColumns` default: on when any column declares a tier. */\nexport function defaultResponsiveColumns<TData>(\n columns: readonly DataGridColumn<TData>[],\n): boolean {\n return columns.some((column) => column.responsiveTier !== undefined);\n}\n\n/** Ids hidden by width alone (for announcements and tests). */\nexport function computeResponsiveHidden<TData>(\n input: Pick<\n DataGridVisibilityInput<TData>,\n | 'columns'\n | 'explicit'\n | 'responsive'\n | 'containerInlineSize'\n | 'focusedColumnId'\n >,\n): string[] {\n if (!input.responsive) return [];\n return input.columns\n .filter(\n (column) =>\n !(column.id in input.explicit) &&\n column.id !== input.focusedColumnId &&\n isTierHidden(column.responsiveTier, input.containerInlineSize),\n )\n .map((column) => column.id);\n}\n\n/** One column's effective visibility. */\nexport function isColumnEffectivelyVisible<TData>(\n column: DataGridColumn<TData>,\n input: DataGridVisibilityInput<TData>,\n): boolean {\n if (isDataGridColumnPrivacyHidden(column, input.privacyMode)) return false;\n const rules = getDataGridColumnRules(\n column,\n input.defaultRowHeaderId,\n input.privacyMode,\n );\n if (column.id in input.explicit) {\n // A column the user cannot hide stays visible whatever is stored.\n return rules.canHide ? input.explicit[column.id] : true;\n }\n if (\n input.responsive &&\n column.id !== input.focusedColumnId &&\n isTierHidden(column.responsiveTier, input.containerInlineSize)\n ) {\n return false;\n }\n return !column.defaultHidden;\n}\n\n/** Effective map for every data column (v9 `columnVisibility`). */\nexport function computeEffectiveVisibility<TData>(\n input: DataGridVisibilityInput<TData>,\n): Record<string, boolean> {\n const out: Record<string, boolean> = {};\n for (const column of input.columns) {\n out[column.id] = isColumnEffectivelyVisible(column, input);\n }\n return out;\n}\n\n/**\n * v9's `onColumnVisibilityChange` updater runs over the effective map; only\n * the keys it changed become explicit (design § 9).\n */\nexport function mergeVisibilityChange(\n explicit: Readonly<Record<string, boolean>>,\n effectiveBefore: Readonly<Record<string, boolean>>,\n effectiveAfter: Readonly<Record<string, boolean>>,\n isDataColumn: (id: string) => boolean,\n): Record<string, boolean> {\n const next = { ...explicit };\n for (const id of Object.keys(effectiveAfter)) {\n if (!isDataColumn(id)) continue;\n const before = effectiveBefore[id] ?? true;\n const after = effectiveAfter[id];\n if (before !== after) next[id] = after;\n }\n return next;\n}\n\n/** `markColumnsUserTouched`: copies the current effective values into the\n * explicit map (DataTable parity). */\nexport function markUserTouched(\n explicit: Readonly<Record<string, boolean>>,\n effective: Readonly<Record<string, boolean>>,\n ids: readonly string[],\n): Record<string, boolean> {\n const next = { ...explicit };\n for (const id of ids) {\n if (id in effective) next[id] = effective[id];\n }\n return next;\n}\n","/* -------------------------------------------------------------------- */\n/* DataGrid implementation of the table toolbar seam (design § 7.4). */\n/* */\n/* Built from the user handle alone (writes tagged `'user'`), plus the */\n/* engine's export snapshot, the host-key labels and the caption. No */\n/* TanStack object reaches the toolbar. */\n/* -------------------------------------------------------------------- */\n\nimport {\n exportFileName,\n snapshotToTable,\n writeTableCsv,\n} from '../_shared/table-toolbar/export-files';\nimport type {\n TableExportSnapshot,\n TableFacetValue,\n TableToolbarChangeKind,\n TableToolbarSeam,\n} from '../_shared/table-toolbar/seam';\nimport { isDevelopment } from '../_shared/is-development';\nimport type {\n CreateDataGridToolbarSeam,\n DataGridChangeEvent,\n DataGridColumnInfo,\n DataGridToolbarSeamDeps,\n} from './types';\n\n/** Grid change events mapped to the seam's coarser kinds. */\nconst CHANGE_KIND: Readonly<\n Record<DataGridChangeEvent, TableToolbarChangeKind | null>\n> = {\n filter: 'filter',\n quickFilter: 'quickFilter',\n selection: 'selection',\n columns: 'columns',\n sort: 'rows',\n pagination: 'rows',\n rows: 'rows',\n expanded: null,\n};\n\n/** Masked while privacy mode is on (`DataGridColumnInfo.masked`, filled by\n * the engine). */\nconst isMasked = (column: DataGridColumnInfo | undefined): boolean =>\n column?.masked === true;\n\nconst captions = new WeakMap<TableToolbarSeam, () => string | undefined>();\n\n/** @internal The grid caption behind a DataGrid seam, for default export\n * file names (`DataGridToolbar.ExportMenu`). */\nexport function dataGridSeamCaption(\n seam: TableToolbarSeam,\n): string | undefined {\n return captions.get(seam)?.();\n}\n\nexport const createDataGridToolbarSeam: CreateDataGridToolbarSeam = (\n deps: DataGridToolbarSeamDeps,\n): TableToolbarSeam => {\n const { userHandle } = deps;\n const isServer = (): boolean =>\n userHandle.getFeatures().dataMode === 'server';\n const columnById = (id: string): DataGridColumnInfo | undefined =>\n userHandle.getColumns().find((c) => c.id === id);\n\n /** Where a facet may be written: a `select` column (any mode) or, in\n * server mode, a host key. Never a masked column. */\n const facetAllowed = (id: string): boolean => {\n const column = columnById(id);\n if (column) return column.filterKind === 'select' && !isMasked(column);\n return isServer();\n };\n\n const warn = (message: string): void => {\n if (isDevelopment()) console.warn(`DataGridToolbar: ${message}`);\n };\n\n const seam: TableToolbarSeam = {\n get features() {\n return {\n syncsFilterInputs: true,\n exportsAllRows: !isServer(),\n keyboardReorder: true,\n // Chips label select values and format numbers and dates.\n formatsFilterValues: true,\n };\n },\n\n isReady: () => true,\n\n subscribe: (listener) =>\n userHandle.subscribe((change) => {\n const kind = CHANGE_KIND[change.event];\n if (kind) listener(kind);\n }),\n\n getColumns: () =>\n userHandle.getColumns().map((column) => {\n const masked = isMasked(column);\n const info = deps.getColumnToolbarInfo?.(column.id);\n return {\n id: column.id,\n label: column.label,\n visible: column.visible,\n canHide: column.canHide,\n canMove: column.canMove,\n canPin: column.canPin,\n pinned: column.pinned,\n groupId: column.groupId,\n filterKind: column.filterKind,\n masked,\n hiddenByPrivacy: info?.hiddenByPrivacy === true,\n // A masked column's chip names the column only: no option list.\n ...(!masked && info?.filterOptions?.length\n ? { filterOptions: info.filterOptions }\n : {}),\n };\n }),\n\n setColumnVisible: (id, visible) => userHandle.setColumnVisible(id, visible),\n resetColumns: () => userHandle.resetColumnState(),\n moveColumn: (id, toIndex) => userHandle.moveColumn(id, toIndex),\n\n getQuickFilter: () => userHandle.getQuickFilter(),\n setQuickFilter: (text) => userHandle.setQuickFilter(text),\n getFilterModel: () => userHandle.getFilter(),\n\n setColumnFilter(id, model) {\n // Read-modify-write: the handle's reads return the last write even for\n // controlled filters, so two calls in one tick both survive.\n const next = { ...userHandle.getFilter() };\n if (model === null) delete next[id];\n else next[id] = model;\n userHandle.setFilter(next);\n },\n\n clearAllFilters: () => userHandle.clearFilters(),\n\n setFacet(id, value: TableFacetValue | null) {\n if (!facetAllowed(id)) {\n warn(\n `FacetFilter field \"${id}\" must be a column with filter { kind: 'select' }` +\n ' (or, in server mode, a host key); nothing was written.',\n );\n return;\n }\n if (value !== null && typeof value === 'boolean') {\n warn(`FacetFilter values must be strings or numbers (\"${id}\").`);\n return;\n }\n const next = { ...userHandle.getFilter() };\n if (value === null) delete next[id];\n else next[id] = { type: 'set', values: [value] };\n userHandle.setFilter(next);\n },\n\n getFacet(id) {\n const model = userHandle.getFilter()[id] as\n | { type?: unknown; values?: unknown }\n | null\n | undefined;\n if (!model || model.type !== 'set' || !Array.isArray(model.values)) {\n return null;\n }\n if (model.values.length !== 1) return null;\n const v: unknown = model.values[0];\n return typeof v === 'string' || typeof v === 'number' ? v : null;\n },\n\n getFilterLabel: (key) => deps.getFilterLabel(key),\n\n getSelectionCount: () => userHandle.getSelection().length,\n getSelectedRowIds: () => userHandle.getSelection(),\n\n getExportSnapshot: (): TableExportSnapshot => deps.getExportSnapshot(),\n\n exportCsv(fileName) {\n writeTableCsv(snapshotToTable(deps.getExportSnapshot()), {\n fileName: fileName ?? exportFileName(deps.getCaption?.(), 'csv'),\n });\n },\n\n print: () => userHandle.print(),\n };\n captions.set(seam, () => deps.getCaption?.());\n return seam;\n};\n","/* -------------------------------------------------------------------- */\n/* DataGrid: the engine hook (types.ts `DataGridEngine`). */\n/* */\n/* One `useTable` call over the static feature set, fed every slice from */\n/* the kit store (v9 never owns state: design § 2.4). Returns the v9 */\n/* table for the renderer, the store, the typed kit column maps, the two */\n/* handles' public one, the toolbar seam, the selection API and the */\n/* status and layout facts. The v9 table never leaves the data-grid */\n/* folder. */\n/* -------------------------------------------------------------------- */\n\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n functionalUpdate,\n useTable,\n type ColumnFiltersState,\n type ColumnOrderState,\n type ColumnPinningState,\n type ColumnSizingState,\n type ColumnVisibilityState,\n type ExpandedState,\n type PaginationState,\n type ReactTable,\n type Row,\n type RowSelectionState,\n type SortingState,\n type Updater,\n} from '@tanstack/react-table';\n\nimport { useIsomorphicLayoutEffect } from '../../hooks/use-isomorphic-layout-effect';\nimport { formatNumber } from '../_shared/format-number';\nimport { isDevelopment } from '../_shared/is-development';\nimport { privacyMask } from '../_shared/privacy-mask-text';\nimport {\n buildDataGridColumns,\n clampDataGridColumnSize,\n getDataGridColumnLabel,\n getDataGridHostMask,\n getDataGridSelectOptions,\n isDataGridCellMasked,\n isDataGridColumnFilterable,\n isDataGridColumnMasked,\n isDataGridColumnPrivacyHidden,\n isDataGridColumnSearchable,\n isDataGridColumnSortable,\n isUtilityColumnId,\n resolveDataGridColumnOrder,\n resolveDataGridRowHeaderId,\n} from './columns';\nimport { buildDataGridExportSnapshot } from './export-snapshot';\nimport { dataGridFeatures, type DataGridFeatures } from './features';\nimport {\n createDataGridHandle,\n getDataGridDisplayColumns,\n type DataGridColumnDefaults,\n type DataGridHandleRuntime,\n} from './handle';\nimport {\n clearDataGridColumnState,\n createDataGridColumnStatePersister,\n loadDataGridColumnState,\n warnControlledPersistenceOverlap,\n type DataGridColumnStatePersister,\n} from './persistence';\nimport {\n computeEffectiveVisibility,\n defaultResponsiveColumns,\n mergeVisibilityChange,\n} from './responsive';\nimport {\n createDataGridSelectionApi,\n resolveDataGridSelectAllScope,\n resolveDataGridSelectability,\n type DataGridSelectionAnchor,\n type DataGridSelectionRuntime,\n} from './selection';\nimport {\n createDataGridStore,\n fromV9Expanded,\n fromV9Order,\n fromV9Pinning,\n fromV9RowSelection,\n fromV9Sorting,\n mergeV9ColumnFilters,\n stableEqual,\n toV9ColumnFilters,\n toV9Expanded,\n toV9Pinning,\n toV9RowSelection,\n toV9Sorting,\n type DataGridStoreContext,\n type DataGridStoreImpl,\n} from './state';\nimport { createDataGridToolbarSeam } from './toolbar-seam';\nimport type {\n DataGridColumn,\n DataGridEngine,\n DataGridEngineOptions,\n DataGridFeatureInfo,\n DataGridFooterContext,\n DataGridLayoutInfo,\n DataGridOption,\n DataGridRendererBindings,\n DataGridResolvedSelectability,\n DataGridSliceName,\n DataGridSlices,\n DataGridStatusInfo,\n DataGridTableMeta,\n} from './types';\nimport {\n DATA_GRID_DEFAULT_PAGE_SIZE,\n DATA_GRID_MAX_SORT_LEVELS,\n DATA_GRID_VIRTUALIZE_ABOVE,\n} from './types';\n\n/** The v9 table the renderer reads (never leaves the data-grid folder). */\nexport type DataGridTable<TData extends object> = ReactTable<\n DataGridFeatures,\n TData\n>;\n\n/** What `useDataGridEngine` returns. */\nexport type DataGridEngineResult<TData extends object> = DataGridEngine<\n TData,\n DataGridTable<TData>\n>;\n\n/* ------------------------------------------------------------------ */\n/* Row index (independent of v9, available before the table exists) */\n/* ------------------------------------------------------------------ */\n\ninterface DataGridRowEntry<TData> {\n original: TData;\n depth: number;\n parentId: string | null;\n /** Walk order (depth-first). */\n index: number;\n hasChildren: boolean;\n}\n\nfunction indexRows<TData>(\n rows: readonly TData[],\n getRowId: (row: TData) => string,\n getSubRows: ((row: TData) => readonly TData[] | undefined) | undefined,\n): Map<string, DataGridRowEntry<TData>> {\n const index = new Map<string, DataGridRowEntry<TData>>();\n const walk = (\n list: readonly TData[],\n depth: number,\n parentId: string | null,\n ): void => {\n for (const original of list) {\n const id = getRowId(original);\n const children = getSubRows?.(original) ?? [];\n index.set(id, {\n original,\n depth,\n parentId,\n index: index.size,\n hasChildren: children.length > 0,\n });\n if (children.length > 0) walk(children, depth + 1, id);\n }\n };\n walk(rows, 0, null);\n return index;\n}\n\nfunction warn(message: string): void {\n if (isDevelopment()) console.warn(`[DataGrid] ${message}`);\n}\n\nconst PERSISTED: readonly DataGridSliceName[] = [\n 'columnVisibility',\n 'columnPinning',\n 'columnSizing',\n 'columnOrder',\n];\n\n/** Plain text of a cell value, for the default row label. */\nfunction valueText(value: unknown): string {\n if (value === null || value === undefined) return '';\n if (value instanceof Date) {\n return Number.isNaN(value.getTime())\n ? ''\n : value.toISOString().slice(0, 10);\n }\n return String(value).trim();\n}\n\n/* ------------------------------------------------------------------ */\n/* Hook */\n/* ------------------------------------------------------------------ */\n\nexport function useDataGridEngine<TData extends object>(\n options: DataGridEngineOptions<TData>,\n): DataGridEngineResult<TData> {\n const { t, i18n } = useTranslation('ui');\n const locale = i18n.language ?? 'en';\n\n const {\n columns,\n columnGroups,\n rows,\n getRowId,\n getSubRows,\n renderDetail,\n getRowCanExpand,\n getRowSelectability,\n rowCount,\n gridId,\n } = options;\n const dataMode = options.dataMode ?? 'client';\n const server = dataMode === 'server';\n const selectionMode = options.selectionMode ?? 'none';\n const expandable = Boolean(getSubRows || renderDetail);\n const privacyMode = options.privacyMode ?? false;\n const columnResizing = options.columnResizing ?? false;\n const paginated = Boolean(options.pagination);\n const paginationConfig =\n typeof options.pagination === 'object' ? options.pagination : undefined;\n const printing = options.printing ?? false;\n const multiSort = options.multiSort ?? true;\n const maxSortLevels = multiSort\n ? Math.max(1, options.maxSortLevels ?? DATA_GRID_MAX_SORT_LEVELS)\n : 1;\n const expandMode = options.expandMode ?? 'multiple';\n const rangeSelection = options.rangeSelection ?? selectionMode === 'multiple';\n const persistEnabled =\n gridId !== undefined &&\n gridId !== '' &&\n options.persistColumnState !== false;\n const responsive =\n options.responsiveColumns ?? defaultResponsiveColumns(columns);\n const focusedColumnId = options.focusedColumnId ?? null;\n\n /* ---- columns ---- */\n\n const model = useMemo(\n () =>\n buildDataGridColumns<TData>({\n columns,\n columnGroups,\n selectionMode,\n expandable,\n privacyMode,\n columnResizing,\n }),\n [\n columns,\n columnGroups,\n selectionMode,\n expandable,\n privacyMode,\n columnResizing,\n ],\n );\n const dataColumns = useMemo(() => [...model.kitColumns.values()], [model]);\n // Columns privacy mode masks: left out of the effective query (state.ts).\n const maskedColumnIds = useMemo(\n () =>\n dataColumns\n .filter((column) => isDataGridColumnMasked(column, privacyMode))\n .map((column) => column.id),\n [dataColumns, privacyMode],\n );\n\n /* ---- rows ---- */\n\n const rowIndex = useMemo(\n () => indexRows(rows, getRowId, getSubRows),\n // getRowId and getSubRows are usually inline arrows; rows drive it.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [rows],\n );\n\n const selectabilityCache = useMemo(\n () => new Map<string, DataGridResolvedSelectability>(),\n // A new rows array, selectability function, column set, privacy mode\n // or language invalidates the cache (the reason depends on masking).\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n rows,\n getRowSelectability,\n dataColumns,\n privacyMode,\n options.hostTextPrivacySafe,\n t,\n ],\n );\n const getSelectability = (rowId: string): DataGridResolvedSelectability => {\n const cached = selectabilityCache.get(rowId);\n if (cached) return cached;\n const entry = rowIndex.get(rowId);\n let resolved = resolveDataGridSelectability(\n entry && getRowSelectability\n ? getRowSelectability(entry.original)\n : undefined,\n );\n // Privacy mode: a host reason may name the person (\"Paid by <name>\"),\n // so a masked row shows neutral kit copy instead, unless the host\n // promises its reasons hold no masked data (`hostTextPrivacySafe`).\n if (\n privacyMode &&\n !options.hostTextPrivacySafe &&\n entry &&\n resolved.reason !== null &&\n dataColumns.some((column) =>\n isDataGridCellMasked(column, entry.original, privacyMode),\n )\n ) {\n resolved = {\n state: resolved.state,\n reason:\n resolved.state === 'selectable'\n ? null\n : resolved.state === 'locked'\n ? t(\n 'dataGrid.selection.lockedReasonPrivacy',\n 'Always selected (reason hidden in privacy mode)',\n )\n : t(\n 'dataGrid.selection.noneReasonPrivacy',\n 'Cannot be selected (reason hidden in privacy mode)',\n ),\n };\n }\n selectabilityCache.set(rowId, resolved);\n return resolved;\n };\n\n const lockedRowIds = useMemo(() => {\n if (selectionMode === 'none') return [];\n const ids: string[] = [];\n for (const id of rowIndex.keys()) {\n if (getSelectability(id).state === 'locked') ids.push(id);\n }\n return ids;\n // getSelectability reads rowIndex and the cache, both listed.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [rowIndex, selectabilityCache, selectionMode]);\n\n /** Prop ids to the stored slice: locked and `none` rows never stored. */\n const toStoredSelection = (ids: readonly string[]): string[] =>\n ids.filter((id) => {\n if (!rowIndex.has(id)) return true;\n return getSelectability(id).state === 'selectable';\n });\n\n /* ---- column defaults (declared, then default props) ---- */\n\n const getColumnDefaults = (): DataGridColumnDefaults => ({\n columnVisibility: { ...(options.defaultColumnVisibility ?? {}) },\n columnPinning: options.defaultColumnPinning\n ? {\n start: [...options.defaultColumnPinning.start],\n end: [...options.defaultColumnPinning.end],\n }\n : {\n start: [...model.declaredPinning.start],\n end: [...model.declaredPinning.end],\n },\n columnSizing: { ...(options.defaultColumnSizing ?? {}) },\n columnOrder: [...(options.defaultColumnOrder ?? [])],\n });\n\n /* ---- store ---- */\n\n const optionsRef = useRef(options);\n optionsRef.current = options;\n const lockedRef = useRef(lockedRowIds);\n lockedRef.current = lockedRowIds;\n\n const storeContext: DataGridStoreContext = {\n callbacks: {\n onSortingChange: options.onSortingChange,\n onFiltersChange: options.onFiltersChange,\n onQuickFilterChange: options.onQuickFilterChange,\n onPageChange: options.onPageChange,\n onRowSelectionChange: options.onRowSelectionChange,\n onExpandedChange: options.onExpandedChange,\n onColumnVisibilityChange: options.onColumnVisibilityChange,\n onColumnPinningChange: options.onColumnPinningChange,\n onColumnSizingChange: options.onColumnSizingChange,\n onColumnOrderChange: options.onColumnOrderChange,\n onQueryChange: options.onQueryChange,\n },\n clearSelectionOnFilterChange: options.clearSelectionOnFilterChange ?? false,\n getLockedRowIds: () => lockedRef.current,\n getMaskedColumnIds: () => maskedColumnIds,\n };\n\n const seededRef = useRef<DataGridSliceName[]>([]);\n const [store] = useState<DataGridStoreImpl>(() => {\n const loaded = persistEnabled\n ? loadDataGridColumnState(gridId as string, {\n kitColumns: model.kitColumns,\n groupOf: model.groupOf,\n defaultRowHeaderId: model.defaultRowHeaderId,\n privacyMode,\n })\n : null;\n const defaults = getColumnDefaults();\n const sizeOptions = paginationConfig?.pageSizeOptions;\n const defaultPageSize =\n sizeOptions &&\n sizeOptions.length > 0 &&\n !sizeOptions.includes(DATA_GRID_DEFAULT_PAGE_SIZE)\n ? sizeOptions[0]\n : DATA_GRID_DEFAULT_PAGE_SIZE;\n const initialPage = options.page ?? options.defaultPage;\n const initial: DataGridSlices = {\n sorting: (options.sorting ?? options.defaultSorting ?? []).map(\n (entry) => ({\n ...entry,\n }),\n ),\n filters: { ...(options.filters ?? options.defaultFilters ?? {}) },\n quickFilter: options.quickFilter ?? options.defaultQuickFilter ?? '',\n page: initialPage\n ? { pageIndex: initialPage.pageIndex, pageSize: initialPage.pageSize }\n : { pageIndex: 0, pageSize: defaultPageSize },\n rowSelection: toStoredSelection(\n options.rowSelection ?? options.defaultRowSelection ?? [],\n ),\n expanded: [...(options.expanded ?? options.defaultExpanded ?? [])],\n columnVisibility: { ...defaults.columnVisibility },\n columnPinning: defaults.columnPinning,\n columnSizing: defaults.columnSizing,\n columnOrder: defaults.columnOrder,\n };\n const seeded: DataGridSliceName[] = [];\n if (options.columnVisibility === undefined && loaded?.columnVisibility) {\n initial.columnVisibility = loaded.columnVisibility;\n seeded.push('columnVisibility');\n }\n if (options.columnPinning === undefined && loaded?.columnPinning) {\n initial.columnPinning = loaded.columnPinning;\n seeded.push('columnPinning');\n }\n if (options.columnSizing === undefined && loaded?.columnSizing) {\n initial.columnSizing = loaded.columnSizing;\n seeded.push('columnSizing');\n }\n if (options.columnOrder === undefined && loaded?.columnOrder) {\n initial.columnOrder = loaded.columnOrder;\n seeded.push('columnOrder');\n }\n if (options.columnVisibility)\n initial.columnVisibility = { ...options.columnVisibility };\n if (options.columnPinning) {\n initial.columnPinning = {\n start: [...options.columnPinning.start],\n end: [...options.columnPinning.end],\n };\n }\n if (options.columnSizing)\n initial.columnSizing = { ...options.columnSizing };\n if (options.columnOrder) initial.columnOrder = [...options.columnOrder];\n seededRef.current = seeded;\n\n const controlled: DataGridSliceName[] = [];\n if (options.sorting !== undefined) controlled.push('sorting');\n if (options.filters !== undefined) controlled.push('filters');\n if (options.quickFilter !== undefined) controlled.push('quickFilter');\n if (options.page !== undefined) controlled.push('page');\n if (options.rowSelection !== undefined) controlled.push('rowSelection');\n if (options.expanded !== undefined) controlled.push('expanded');\n if (options.columnVisibility !== undefined)\n controlled.push('columnVisibility');\n if (options.columnPinning !== undefined) controlled.push('columnPinning');\n if (options.columnSizing !== undefined) controlled.push('columnSizing');\n if (options.columnOrder !== undefined) controlled.push('columnOrder');\n return createDataGridStore({ initial, controlled, context: storeContext });\n });\n store.setContext(storeContext);\n\n // Controlled props: recorded now, delivered in the layout effect below.\n store.syncFromProps({\n ...(options.sorting !== undefined\n ? { sorting: options.sorting.map((entry) => ({ ...entry })) }\n : {}),\n ...(options.filters !== undefined\n ? { filters: { ...options.filters } }\n : {}),\n ...(options.quickFilter !== undefined\n ? { quickFilter: options.quickFilter }\n : {}),\n ...(options.page !== undefined\n ? {\n page: {\n pageIndex: options.page.pageIndex,\n pageSize: options.page.pageSize,\n },\n }\n : {}),\n ...(options.rowSelection !== undefined\n ? { rowSelection: toStoredSelection(options.rowSelection) }\n : {}),\n ...(options.expanded !== undefined\n ? { expanded: [...options.expanded] }\n : {}),\n ...(options.columnVisibility !== undefined\n ? { columnVisibility: { ...options.columnVisibility } }\n : {}),\n ...(options.columnPinning !== undefined\n ? {\n columnPinning: {\n start: [...options.columnPinning.start],\n end: [...options.columnPinning.end],\n },\n }\n : {}),\n ...(options.columnSizing !== undefined\n ? { columnSizing: { ...options.columnSizing } }\n : {}),\n ...(options.columnOrder !== undefined\n ? { columnOrder: [...options.columnOrder] }\n : {}),\n });\n\n const subscribeStore = useCallback(\n (onChange: () => void) => store.subscribe(() => onChange()),\n [store],\n );\n useSyncExternalStore(subscribeStore, store.getVersion, store.getVersion);\n\n /* ---- derived kit facts ---- */\n\n const sorting = store.get('sorting');\n const filters = store.get('filters');\n const quickFilter = store.get('quickFilter');\n const page = store.get('page');\n const rowSelection = store.get('rowSelection');\n const expanded = store.get('expanded');\n const explicitVisibility = store.get('columnVisibility');\n const columnPinning = store.get('columnPinning');\n const columnSizing = store.get('columnSizing');\n const columnOrder = store.get('columnOrder');\n\n const visibilityInput = {\n columns: dataColumns,\n privacyMode,\n responsive,\n containerInlineSize: options.containerInlineSize,\n defaultRowHeaderId: model.defaultRowHeaderId,\n focusedColumnId,\n };\n const effectiveVisibility = useMemo(\n () =>\n computeEffectiveVisibility({\n ...visibilityInput,\n explicit: explicitVisibility,\n }),\n // visibilityInput is rebuilt each render from the listed values.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n dataColumns,\n explicitVisibility,\n privacyMode,\n responsive,\n options.containerInlineSize,\n model.defaultRowHeaderId,\n focusedColumnId,\n ],\n );\n\n const isEffectiveSortColumn = (colId: string): boolean => {\n const column = model.kitColumns.get(colId);\n return (\n column !== undefined &&\n isDataGridColumnSortable(column) &&\n !isDataGridColumnMasked(column, privacyMode)\n );\n };\n const isEvaluatedFilterKey = (key: string): boolean => {\n const column = model.kitColumns.get(key);\n return (\n column !== undefined &&\n isDataGridColumnFilterable(column) &&\n !isDataGridColumnMasked(column, privacyMode)\n );\n };\n\n /* ---- v9 state (memoised per slice so row models survive renders) ---- */\n\n const v9Sorting = useMemo(\n () => toV9Sorting(sorting, isEffectiveSortColumn),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [sorting, model, privacyMode],\n );\n const v9ColumnFilters = useMemo(\n () => toV9ColumnFilters(filters, isEvaluatedFilterKey),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [filters, model, privacyMode],\n );\n const pageForV9 = paginated && !(printing && !server);\n const v9Pagination = useMemo<PaginationState>(\n () =>\n pageForV9\n ? { pageIndex: page.pageIndex, pageSize: page.pageSize }\n : { pageIndex: 0, pageSize: Number.POSITIVE_INFINITY },\n [pageForV9, page],\n );\n const v9RowSelection = useMemo(\n () => toV9RowSelection(rowSelection),\n [rowSelection],\n );\n const v9Expanded = useMemo(() => toV9Expanded(expanded), [expanded]);\n const v9Visibility = useMemo<ColumnVisibilityState>(() => {\n const out: ColumnVisibilityState = { ...effectiveVisibility };\n for (const id of model.utilityIds) out[id] = true;\n return out;\n }, [effectiveVisibility, model]);\n const v9Pinning = useMemo(\n () => toV9Pinning(columnPinning, model.utilityIds),\n [columnPinning, model],\n );\n const v9Order = useMemo<ColumnOrderState>(\n () => [\n ...model.utilityIds,\n ...resolveDataGridColumnOrder(columnOrder, model.declaredOrder),\n ],\n [columnOrder, model],\n );\n\n /* ---- v9 write-backs: every slice goes through the store as 'user' ---- */\n\n const latest = useRef({\n isEffectiveSortColumn,\n isEvaluatedFilterKey,\n effectiveVisibility,\n model,\n expandMode,\n maxSortLevels,\n paginated,\n rowIndex,\n getSelectability,\n getExpandableIds: (): string[] => [],\n });\n latest.current = {\n isEffectiveSortColumn,\n isEvaluatedFilterKey,\n effectiveVisibility,\n model,\n expandMode,\n maxSortLevels,\n paginated,\n rowIndex,\n getSelectability,\n getExpandableIds: () => [],\n };\n\n const [v9Handlers] = useState(() => ({\n onSortingChange: (updater: Updater<SortingState>) => {\n const l = latest.current;\n const previous = toV9Sorting(\n store.get('sorting'),\n l.isEffectiveSortColumn,\n );\n const next = functionalUpdate(updater, previous);\n store.write(\n 'sorting',\n fromV9Sorting(next).slice(0, l.maxSortLevels),\n 'user',\n );\n },\n onColumnFiltersChange: (updater: Updater<ColumnFiltersState>) => {\n const l = latest.current;\n const current = store.get('filters');\n const previous = toV9ColumnFilters(current, l.isEvaluatedFilterKey);\n const next = functionalUpdate(updater, previous);\n store.write(\n 'filters',\n mergeV9ColumnFilters(current, next, l.isEvaluatedFilterKey),\n 'user',\n );\n },\n onGlobalFilterChange: (updater: Updater<unknown>) => {\n const next = functionalUpdate(updater, store.get('quickFilter'));\n store.write('quickFilter', typeof next === 'string' ? next : '', 'user');\n },\n onPaginationChange: (updater: Updater<PaginationState>) => {\n if (!latest.current.paginated) return;\n const next = functionalUpdate(updater, store.get('page'));\n store.write(\n 'page',\n { pageIndex: next.pageIndex, pageSize: next.pageSize },\n 'user',\n );\n },\n onRowSelectionChange: (updater: Updater<RowSelectionState>) => {\n const l = latest.current;\n const previous = toV9RowSelection(store.get('rowSelection'));\n const next = fromV9RowSelection(\n functionalUpdate(updater, previous),\n ).filter(\n (id) =>\n !l.rowIndex.has(id) || l.getSelectability(id).state === 'selectable',\n );\n store.write('rowSelection', next, 'user');\n },\n onExpandedChange: (updater: Updater<ExpandedState>) => {\n const l = latest.current;\n const previousIds = store.get('expanded');\n const nextIds = fromV9Expanded(\n functionalUpdate(updater, toV9Expanded(previousIds)),\n l.getExpandableIds,\n );\n let result = nextIds;\n if (l.expandMode === 'single') {\n const opened = nextIds.filter((id) => !previousIds.includes(id));\n if (opened.length > 0) {\n const newest = opened[opened.length - 1];\n const keep = new Set<string>();\n let parent = l.rowIndex.get(newest)?.parentId ?? null;\n while (parent !== null) {\n keep.add(parent);\n parent = l.rowIndex.get(parent)?.parentId ?? null;\n }\n result = [...nextIds.filter((id) => keep.has(id)), newest];\n }\n }\n store.write('expanded', result, 'user');\n },\n onColumnVisibilityChange: (updater: Updater<ColumnVisibilityState>) => {\n const l = latest.current;\n const before = l.effectiveVisibility;\n const after = functionalUpdate(updater, { ...before });\n store.write(\n 'columnVisibility',\n mergeVisibilityChange(\n store.get('columnVisibility'),\n before,\n after,\n (id) => l.model.kitColumns.has(id),\n ),\n 'user',\n );\n },\n onColumnPinningChange: (updater: Updater<ColumnPinningState>) => {\n const l = latest.current;\n const previous = toV9Pinning(\n store.get('columnPinning'),\n l.model.utilityIds,\n );\n const next = fromV9Pinning(\n functionalUpdate(updater, previous),\n isUtilityColumnId,\n );\n store.write('columnPinning', next, 'user');\n },\n onColumnSizingChange: (updater: Updater<ColumnSizingState>) => {\n const l = latest.current;\n const next = functionalUpdate(updater, { ...store.get('columnSizing') });\n const sizing: Record<string, number> = {};\n for (const [id, px] of Object.entries(next)) {\n const column = l.model.kitColumns.get(id);\n if (!column) continue;\n const clamped = clampDataGridColumnSize(column, px);\n if (clamped !== null) sizing[id] = clamped;\n }\n store.write('columnSizing', sizing, 'user');\n },\n onColumnOrderChange: (updater: Updater<ColumnOrderState>) => {\n const l = latest.current;\n const previous = [\n ...l.model.utilityIds,\n ...resolveDataGridColumnOrder(\n store.get('columnOrder'),\n l.model.declaredOrder,\n ),\n ];\n store.write(\n 'columnOrder',\n fromV9Order(functionalUpdate(updater, previous), isUtilityColumnId),\n 'user',\n );\n },\n }));\n\n /* ---- table meta ---- */\n\n const tableRef = useRef<DataGridTable<TData> | null>(null);\n\n const isRowMaskedAnywhere = (original: TData): boolean =>\n dataColumns.some((column) =>\n isDataGridCellMasked(column, original, privacyMode),\n );\n\n const visibleOrderedDataIds = (): string[] =>\n getDataGridDisplayColumns(\n model,\n store.get('columnOrder'),\n store.get('columnPinning'),\n )\n .map((entry) => entry.id)\n .filter((id) => effectiveVisibility[id] !== false);\n\n const getRowLabel = (rowId: string): string => {\n const entry = rowIndex.get(rowId);\n const table = tableRef.current;\n let position = entry ? entry.index + 1 : 1;\n if (table && entry) {\n try {\n const displayIndex = table.getRow(rowId, true).getDisplayIndex();\n if (displayIndex >= 0) position = displayIndex + 1;\n } catch {\n // Row not in the current model: keep the walk position.\n }\n }\n const fallback = t('dataGrid.rowFallback', {\n number: formatNumber(position, locale),\n });\n if (!entry) return fallback;\n if (\n privacyMode &&\n !options.rowLabelPrivacySafe &&\n isRowMaskedAnywhere(entry.original)\n ) {\n return fallback;\n }\n const host = options.getRowLabel?.(entry.original);\n if (host !== undefined && host.trim() !== '') return host;\n const headerId = resolveDataGridRowHeaderId(\n model.kitColumns,\n visibleOrderedDataIds(),\n );\n const headerColumn = headerId ? model.kitColumns.get(headerId) : undefined;\n if (headerColumn) {\n const text = valueText(\n headerColumn.exportValue\n ? headerColumn.exportValue(entry.original)\n : headerColumn.value?.(entry.original),\n );\n if (text !== '') return text;\n }\n return fallback;\n };\n\n const tableMeta: DataGridTableMeta = {\n privacyMode,\n locale,\n getRowLabel,\n getSelectability,\n isRowReadOnly: (rowId) => {\n const entry = rowIndex.get(rowId);\n return (\n entry !== undefined && options.isRowReadOnly?.(entry.original) === true\n );\n },\n isMasked: (rowId, columnId) => {\n const entry = rowIndex.get(rowId);\n const column = model.kitColumns.get(columnId);\n return (\n entry !== undefined &&\n column !== undefined &&\n isDataGridCellMasked(column, entry.original, privacyMode)\n );\n },\n isRowMasked: (rowId) => {\n const entry = rowIndex.get(rowId);\n return (\n privacyMode &&\n !options.hostTextPrivacySafe &&\n entry !== undefined &&\n isRowMaskedAnywhere(entry.original)\n );\n },\n getSearchValue: (rowId, columnId) => {\n const entry = rowIndex.get(rowId);\n const column = model.kitColumns.get(columnId);\n if (entry === undefined || column === undefined) return null;\n return column.exportValue\n ? column.exportValue(entry.original)\n : column.value?.(entry.original);\n },\n };\n\n /* ---- the v9 table ---- */\n\n const table = useTable<DataGridFeatures, TData>({\n features: dataGridFeatures,\n columns: model.defs,\n data: rows,\n getRowId: (row) => getRowId(row),\n ...(getSubRows\n ? {\n getSubRows: (row: TData) =>\n getSubRows(row) as ReadonlyArray<TData> | undefined,\n }\n : {}),\n getRowCanExpand: (row: Row<DataGridFeatures, TData>) =>\n getRowCanExpand\n ? getRowCanExpand(row.original)\n : Boolean(renderDetail) || row.subRows.length > 0,\n paginateExpandedRows: false,\n state: {\n sorting: v9Sorting,\n columnFilters: v9ColumnFilters,\n globalFilter: quickFilter,\n pagination: v9Pagination,\n rowSelection: v9RowSelection,\n expanded: v9Expanded,\n columnVisibility: v9Visibility,\n columnPinning: v9Pinning,\n columnSizing,\n columnOrder: v9Order,\n },\n ...v9Handlers,\n manualSorting: server,\n manualFiltering: server,\n manualPagination: server,\n rowCount:\n server && rowCount !== undefined && rowCount !== -1\n ? rowCount\n : undefined,\n pageCount: server && rowCount === -1 ? -1 : undefined,\n autoResetPageIndex: false,\n autoResetExpanded: false,\n filterFromLeafRows: true,\n sortDescFirst: false,\n enableSortingRemoval: true,\n enableMultiSort: multiSort,\n maxMultiSortColCount: maxSortLevels,\n enableRowSelection: (row: Row<DataGridFeatures, TData>) =>\n selectionMode !== 'none' &&\n getSelectability(row.id).state === 'selectable',\n enableMultiRowSelection: selectionMode === 'multiple',\n enableSubRowSelection: false,\n // Ranges go through the kit's own anchor (selection.ts), never v9's\n // `@internal` `_lastSelectedRowId` (design R11).\n enableRowRangeSelection: false,\n enableColumnResizing: columnResizing,\n columnResizeMode: 'onEnd',\n columnResizeDirection: options.direction,\n globalFilterFn: 'kitQuick',\n getColumnCanGlobalFilter: (column) => {\n const kit = model.kitColumns.get(column.id);\n return (\n kit !== undefined &&\n isDataGridColumnSearchable(kit) &&\n !isDataGridColumnMasked(kit, privacyMode)\n );\n },\n meta: tableMeta,\n });\n tableRef.current = table;\n\n latest.current.getExpandableIds = () =>\n table\n .getCoreRowModel()\n .flatRows.filter((row) => row.getCanExpand())\n .map((row) => row.id);\n\n /* ---- counts ---- */\n\n const getRowCount = (): number => {\n if (server) {\n if (rowCount === -1) return -1;\n return rowCount ?? rows.length;\n }\n return table.getFilteredRowModel().rows.length;\n };\n\n const getPageCount = (): number => {\n if (!paginated) return 1;\n const size = store.get('page').pageSize;\n if (server) {\n if (rowCount === -1) return -1;\n const total = rowCount ?? rows.length;\n return Math.max(1, Math.ceil(total / size));\n }\n return Math.max(\n 1,\n Math.ceil(table.getFilteredRowModel().rows.length / size),\n );\n };\n\n /** Page count the store clamps to; `null` never clamps. */\n const getClampPageCount = (): number | null => {\n if (!paginated) return null;\n if (server && (rowCount === -1 || rowCount === undefined)) return null;\n return getPageCount();\n };\n\n /* ---- selection ---- */\n\n const selectAllScope = resolveDataGridSelectAllScope({\n selectionMode,\n selectAllScope: options.selectAllScope,\n paginated,\n dataMode,\n });\n const [anchor] = useState<DataGridSelectionAnchor>(() => ({ current: null }));\n const selectionRuntime: DataGridSelectionRuntime = {\n store,\n mode: selectionMode,\n scope: selectAllScope,\n rangeSelection,\n dataMode,\n getSelectability,\n getDisplayOrderIds: () =>\n table.getRowsInDisplayOrder().map((row) => row.id),\n getScopeRowIds: () =>\n (selectAllScope === 'page'\n ? table.getPaginatedRowModel().rows\n : table.getFilteredRowModel().rows\n ).map((row) => row.id),\n isKnownRowId: (id) => rowIndex.has(id),\n };\n const selection = createDataGridSelectionApi(selectionRuntime, anchor);\n\n /* ---- features, status, layout ---- */\n\n const features: DataGridFeatureInfo = {\n dataMode,\n selectionMode,\n sorting: dataColumns.some(\n (column) =>\n isDataGridColumnSortable(column) &&\n !isDataGridColumnMasked(column, privacyMode),\n ),\n filtering: dataColumns.some(\n (column) =>\n isDataGridColumnFilterable(column) &&\n !isDataGridColumnMasked(column, privacyMode),\n ),\n quickFilter: dataColumns.some(\n (column) =>\n isDataGridColumnSearchable(column) &&\n !isDataGridColumnMasked(column, privacyMode),\n ),\n pagination: paginated,\n expansion: expandable,\n columnResizing,\n privacyMode,\n };\n\n const pageRows = table.getRowModel().rows;\n const openDetails = renderDetail\n ? pageRows.filter((row) => row.getIsExpanded()).length\n : 0;\n const renderedItemCount = pageRows.length + openDetails;\n const virtualised =\n !printing &&\n (options.virtualization ?? 'auto') !== 'off' &&\n renderedItemCount > DATA_GRID_VIRTUALIZE_ABOVE;\n\n const status: DataGridStatusInfo = {\n dataMode,\n status: options.status ?? 'ready',\n isEmpty: pageRows.length === 0,\n anyFilterActive:\n Object.values(filters).some(\n (value) => value !== null && value !== undefined,\n ) || quickFilter.trim() !== '',\n rowCount: getRowCount(),\n pageCount: getPageCount(),\n renderedItemCount,\n virtualised,\n headerRowCount: table.getHeaderGroups().length,\n };\n\n const hasKnownSize = (id: string): boolean =>\n columnSizing[id] !== undefined ||\n model.kitColumns.get(id)?.size !== undefined;\n const fixed =\n dataColumns.some((column) => column.size !== undefined) ||\n columnResizing ||\n virtualised;\n const visibleStart = [...model.utilityIds, ...columnPinning.start].filter(\n (id) => v9Visibility[id] !== false,\n );\n const visibleEnd = columnPinning.end.filter(\n (id) => v9Visibility[id] !== false,\n );\n const layout: DataGridLayoutInfo = {\n fixed,\n hasFooter: dataColumns.some((column) => column.footer !== undefined),\n hasPinned:\n columnPinning.start.some((id) => effectiveVisibility[id]) ||\n columnPinning.end.some((id) => effectiveVisibility[id]),\n startPinnedTotalPx:\n fixed && visibleStart.length > 0 && visibleStart.every(hasKnownSize)\n ? table.getStartTotalSize()\n : null,\n endPinnedTotalPx:\n fixed && visibleEnd.length > 0 && visibleEnd.every(hasKnownSize)\n ? table.getEndTotalSize()\n : null,\n };\n\n const getFooterContext = (): DataGridFooterContext<TData> => ({\n rows: (server\n ? table.getCoreRowModel().rows\n : table.getFilteredRowModel().rows\n ).map((row) => row.original),\n selectedRowIds: store.getReportedSelection(),\n scope: server ? 'current-page' : 'all-filtered',\n });\n\n const getExportSnapshot = () => {\n const visible = getDataGridDisplayColumns(\n model,\n store.get('columnOrder'),\n store.get('columnPinning'),\n ).filter((entry) => effectiveVisibility[entry.id] !== false);\n const exportColumns = visible\n .map((entry) => model.kitColumns.get(entry.id) as DataGridColumn<TData>)\n .filter(\n (column) =>\n column.exportable ??\n (column.value !== undefined || column.exportValue !== undefined),\n )\n .map((column) => ({\n id: column.id,\n label: getDataGridColumnLabel(column),\n align: column.align ?? 'start',\n column,\n }));\n const flat: Array<{ id: string; original: TData }> = [];\n const seen = new Set<string>();\n const walk = (list: readonly Row<DataGridFeatures, TData>[]): void => {\n for (const row of list) {\n if (seen.has(row.id)) continue;\n seen.add(row.id);\n flat.push({ id: row.id, original: row.original });\n if (row.subRows.length > 0) walk(row.subRows);\n }\n };\n walk(table.getPrePaginatedRowModel().rows);\n return buildDataGridExportSnapshot<TData>({\n scope: server ? 'current-page' : 'all-filtered',\n columns: exportColumns,\n rows: flat,\n isMasked: (row, columnId) => {\n const column = model.kitColumns.get(columnId);\n return (\n column !== undefined && isDataGridCellMasked(column, row, privacyMode)\n );\n },\n maskFor: (row, columnId) => {\n const column = model.kitColumns.get(columnId);\n return privacyMask(\n column ? getDataGridHostMask(column, row) : undefined,\n );\n },\n footer: layout.hasFooter ? getFooterContext() : null,\n locale,\n });\n };\n\n /* ---- toolbar-only column facts (chip labels, privacy hide) ---- */\n\n // Derived select options are cached per core row model, so the toolbar\n // re-reading its columns on every change does not rescan the rows.\n const toolbarOptionsCacheRef = useRef(\n new WeakMap<object, Map<string, readonly DataGridOption[]>>(),\n );\n const getColumnToolbarInfo = (id: string) => {\n const column = model.kitColumns.get(id);\n if (!column) return { hiddenByPrivacy: false };\n const hiddenByPrivacy = isDataGridColumnPrivacyHidden(column, privacyMode);\n if (column.filter?.kind !== 'select' || hiddenByPrivacy) {\n return { hiddenByPrivacy };\n }\n const coreRows = table.getCoreRowModel().flatRows;\n let perRows = toolbarOptionsCacheRef.current.get(coreRows);\n if (!perRows) {\n perRows = new Map();\n toolbarOptionsCacheRef.current.set(coreRows, perRows);\n }\n let options = perRows.get(id);\n if (!options) {\n options = getDataGridSelectOptions(column, coreRows, dataMode, locale);\n perRows.set(id, options);\n }\n return { hiddenByPrivacy, filterOptions: options };\n };\n\n /* ---- handles and seam (stable) ---- */\n\n const bindingsRef = useRef<DataGridRendererBindings | null>(null);\n const persisterRef = useRef<DataGridColumnStatePersister | null>(null);\n\n const runtime: DataGridHandleRuntime<TData> & {\n getExportSnapshot: typeof getExportSnapshot;\n getColumnToolbarInfo: typeof getColumnToolbarInfo;\n } = {\n store,\n model,\n selection: selectionRuntime,\n anchor,\n features,\n privacyMode,\n paginated,\n maxSortLevels,\n expandMode,\n fixedLayout: fixed,\n getEffectiveVisibility: () =>\n computeEffectiveVisibility({\n ...visibilityInput,\n explicit: store.get('columnVisibility'),\n }),\n getPageCount,\n getRowCount,\n getRowIds: () => table.getRowsInDisplayOrder().map((row) => row.id),\n canExpand: (rowId) => {\n const entry = rowIndex.get(rowId);\n if (!entry) return null;\n return getRowCanExpand\n ? getRowCanExpand(entry.original)\n : Boolean(renderDetail) || entry.hasChildren;\n },\n getAncestorIds: (rowId) => {\n const ids: string[] = [];\n let parent = rowIndex.get(rowId)?.parentId ?? null;\n while (parent !== null) {\n ids.unshift(parent);\n parent = rowIndex.get(parent)?.parentId ?? null;\n }\n return ids;\n },\n isKnownRowId: (rowId) => rowIndex.has(rowId),\n getColumnDefaults,\n clearSavedColumnState: () => {\n persisterRef.current?.cancel();\n if (persistEnabled) clearDataGridColumnState(gridId as string);\n },\n getBindings: () => bindingsRef.current,\n getExportSnapshot,\n getColumnToolbarInfo,\n };\n const runtimeRef = useRef(runtime);\n runtimeRef.current = runtime;\n\n const [handle] = useState(() =>\n createDataGridHandle<TData>(() => runtimeRef.current, 'api'),\n );\n const [toolbarSeam] = useState(() =>\n createDataGridToolbarSeam({\n userHandle: createDataGridHandle<TData>(() => runtimeRef.current, 'user'),\n getExportSnapshot: () => runtimeRef.current.getExportSnapshot(),\n getFilterLabel: (key) => optionsRef.current.filterLabels?.[key],\n getCaption: () => optionsRef.current.caption ?? '',\n getColumnToolbarInfo: (id) => runtimeRef.current.getColumnToolbarInfo(id),\n }),\n );\n\n const bindRenderer = useCallback((bindings: DataGridRendererBindings) => {\n bindingsRef.current = bindings;\n return () => {\n if (bindingsRef.current === bindings) bindingsRef.current = null;\n };\n }, []);\n\n /* ---- after every commit: host changes, pruning, clamping, rows ---- */\n\n const lastRowsRef = useRef({ rows, rowCount, mounted: false });\n // Client mode: a filter or quick-search write is applied to the v9 row\n // model only on the next render, so `getRowCount()` / `getRowIds()` read\n // inside the synchronous 'filter' event still see the old rows. Once the\n // new row model commits, a 'rows' change tells subscribers to read again.\n const lastFilteredRef = useRef<{\n model: unknown;\n key: string | null;\n }>({ model: null, key: null });\n // Privacy mode changes what a column reports (`masked`) and the\n // effective query, though no slice changes.\n const lastPrivacyRef = useRef(privacyMode);\n useIsomorphicLayoutEffect(() => {\n store.flushHostChanges();\n if (lastPrivacyRef.current !== privacyMode) {\n lastPrivacyRef.current = privacyMode;\n // 'host': neither announced nor saved. The handle subscription and\n // the toolbar seam both carry it, so FilterChips, ColumnToggle and\n // the agent re-read `masked` and `hiddenByPrivacy`.\n store.notify({ event: 'columns', source: 'host' });\n }\n // Masked sort entries and filter keys pause (state.ts): one page reset\n // and one `onQueryChange` when that alone changed the effective query.\n // A host change flushed above already reported it, so never twice.\n store.refreshEffectiveQuery('host');\n const r = runtimeRef.current;\n store.reconcile({\n keepSelectedId: server\n ? null\n : (id) =>\n r.isKnownRowId(id) &&\n r.selection.getSelectability(id).state === 'selectable',\n keepExpandedId: (id) => r.isKnownRowId(id),\n pageCount: getClampPageCount(),\n });\n const last = lastRowsRef.current;\n const rowsChanged =\n last.mounted && (last.rows !== rows || last.rowCount !== rowCount);\n let filteredChanged = false;\n if (!server) {\n const filtered = table.getFilteredRowModel();\n const lastFiltered = lastFilteredRef.current;\n if (filtered !== lastFiltered.model) {\n const key = filtered.rows.map((row) => row.id).join('\\u0000');\n filteredChanged = lastFiltered.key !== null && key !== lastFiltered.key;\n lastFilteredRef.current = { model: filtered, key };\n }\n }\n if (rowsChanged || filteredChanged) {\n store.notify({ event: 'rows', source: 'host' });\n }\n lastRowsRef.current = { rows, rowCount, mounted: true };\n });\n\n /* ---- persistence: announce what storage seeded, then save ---- */\n\n useEffect(() => {\n if (!persistEnabled) return undefined;\n const id = gridId as string;\n warnControlledPersistenceOverlap(id, store);\n const seeded = seededRef.current.filter((slice) =>\n PERSISTED.includes(slice),\n );\n seededRef.current = [];\n store.announceSeeded(seeded, 'storage');\n const persister = createDataGridColumnStatePersister({\n gridId: id,\n store,\n isDefault: () => {\n const defaults = runtimeRef.current.getColumnDefaults();\n return (\n stableEqual(\n store.get('columnVisibility'),\n defaults.columnVisibility,\n ) &&\n stableEqual(store.get('columnPinning'), defaults.columnPinning) &&\n stableEqual(store.get('columnSizing'), defaults.columnSizing) &&\n stableEqual(store.get('columnOrder'), defaults.columnOrder)\n );\n },\n });\n persisterRef.current = persister;\n return () => {\n persister.dispose();\n if (persisterRef.current === persister) persisterRef.current = null;\n };\n }, [persistEnabled, gridId, store]);\n\n /* ---- DEV warnings ---- */\n\n const rowCountMissing = rowCount === undefined;\n\n useEffect(() => {\n if (!isDevelopment()) return;\n if (server && rowCountMissing) {\n warn(\n \"dataMode 'server' needs rowCount (use -1 when the total is unknown).\",\n );\n }\n if (server) {\n for (const column of dataColumns) {\n if (column.filter?.kind === 'select' && !column.filter.options) {\n warn(\n `column \"${column.id}\" has a select filter without options in server mode.`,\n );\n }\n }\n }\n resolveDataGridSelectAllScope({\n selectionMode,\n selectAllScope: options.selectAllScope,\n paginated,\n dataMode,\n warn: true,\n });\n // Once per configuration change, not per render.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n server,\n rowCountMissing,\n dataColumns,\n selectionMode,\n options.selectAllScope,\n ]);\n\n useEffect(() => {\n if (!isDevelopment()) return;\n for (const key of Object.keys(filters)) {\n if (\n !model.kitColumns.has(key) &&\n optionsRef.current.filterLabels?.[key] === undefined\n ) {\n warn(\n `filter key \"${key}\" matches no column and has no filterLabels entry.`,\n );\n }\n }\n }, [filters, model]);\n\n useEffect(() => {\n if (\n isDevelopment() &&\n options.virtualization === 'off' &&\n renderedItemCount > 500\n ) {\n warn('virtualization=\"off\" with more than 500 rows will be slow.');\n }\n }, [options.virtualization, renderedItemCount]);\n\n return {\n table,\n store,\n kitColumns: model.kitColumns,\n kitGroups: model.kitGroups,\n handle,\n toolbarSeam,\n selection,\n status,\n layout,\n getFooterContext,\n getExportSnapshot,\n bindRenderer,\n };\n}\n","/* -------------------------------------------------------------------- */\n/* DataGrid row virtualisation (design § 5). */\n/* */\n/* Above `DATA_GRID_VIRTUALIZE_ABOVE` rendered body items the grid mounts */\n/* only the rows in view plus an overscan of 8, between spacer rows. No */\n/* `transform` or `top` on rows: spacer rows keep native table layout, */\n/* `colSpan`, sticky header, totals and pinned columns, and table */\n/* semantics. The hook always runs; below the threshold it gets */\n/* `count: 0` (transcript-panel precedent). */\n/* */\n/* Focus retention: the range extractor always keeps the focused item */\n/* mounted, and the body renders a gap spacer wherever an item starts */\n/* after the previous one ended, so layout stays right while the focused */\n/* row sits far outside the window. */\n/* -------------------------------------------------------------------- */\n\nimport { useCallback, useMemo, useRef } from 'react';\nimport {\n defaultRangeExtractor,\n useVirtualizer,\n type Range,\n} from '@tanstack/react-virtual';\n\n/** Rows kept mounted beyond the viewport on each side (transcript-panel). */\nexport const DATA_GRID_OVERSCAN = 8;\n\n/** Fallback row size in px until a rendered row has been measured: the\n * light theme's `--min-target-size`. Only an estimate; `measureElement`\n * corrects every mounted row. */\nconst FALLBACK_ROW_PX = 44;\n\nexport interface VirtualRowsOptions {\n /** Virtualise at all (engine `status.virtualised`). */\n enabled: boolean;\n /** Body items: rows, expanded sub-rows and open detail panels. */\n count: number;\n getScrollElement: () => HTMLElement | null;\n /** Stable key per item (row id, or row id plus a detail suffix). */\n getItemKey: (index: number) => string;\n /** Measured block size of one body row, or `null` before layout. */\n rowSizePx: number | null;\n /** Measured `<thead>` block size: the list starts below it. */\n headSize: number;\n /** Measured `<tfoot>` block size, kept clear when scrolling to an item. */\n footSize: number;\n}\n\nexport interface VirtualRowItem {\n index: number;\n /** Space between the previous mounted item and this one (px), from the\n * virtualiser's own offsets; > 0 only when the focused item is kept\n * mounted outside the window. */\n gapBefore: number;\n}\n\nexport interface VirtualRows {\n enabled: boolean;\n /** Mounted items in index order. Every item when not virtualised. */\n items: VirtualRowItem[];\n /** Spacer heights (px) before the first and after the last mounted item. */\n padStart: number;\n padEnd: number;\n /** `ref` for each virtualised `<tr>` (with `data-index`). */\n measureElement: (node: HTMLTableRowElement | null) => void;\n /** Scrolls an item into view (no-op when not virtualised). */\n scrollToIndex: (index: number) => void;\n /** Keeps this item mounted (the focused row); `null` releases it. */\n setFocusedIndex: (index: number | null) => void;\n /** Re-measures every row (density or theme change). */\n measure: () => void;\n}\n\n/** Window over the body items. */\nexport function useVirtualRows({\n enabled,\n count,\n getScrollElement,\n getItemKey,\n rowSizePx,\n headSize,\n footSize,\n}: VirtualRowsOptions): VirtualRows {\n const focusedRef = useRef<number | null>(null);\n\n const rangeExtractor = useCallback((range: Range): number[] => {\n const indexes = defaultRangeExtractor(range);\n const focused = focusedRef.current;\n if (\n focused === null ||\n focused >= range.count ||\n indexes.includes(focused)\n ) {\n return indexes;\n }\n return [...indexes, focused].sort((a, b) => a - b);\n }, []);\n\n const estimate = rowSizePx ?? FALLBACK_ROW_PX;\n const virtualizer = useVirtualizer<HTMLElement, HTMLTableRowElement>({\n count: enabled ? count : 0,\n getScrollElement,\n estimateSize: () => estimate,\n overscan: DATA_GRID_OVERSCAN,\n getItemKey: (index) => getItemKey(index),\n scrollMargin: headSize,\n scrollPaddingStart: headSize,\n scrollPaddingEnd: footSize,\n rangeExtractor,\n // Lets items render before layout (jsdom, first paint). Replaced by the\n // measured scroll element as soon as it exists.\n initialRect: { width: 0, height: 800 },\n });\n\n const virtualItems = virtualizer.getVirtualItems();\n const totalSize = virtualizer.getTotalSize();\n\n const { items, padStart, padEnd } = useMemo(() => {\n if (!enabled) {\n return {\n items: Array.from({ length: count }, (_, index) => ({\n index,\n gapBefore: 0,\n })),\n padStart: 0,\n padEnd: 0,\n };\n }\n if (virtualItems.length === 0) {\n return { items: [], padStart: 0, padEnd: 0 };\n }\n const mounted: VirtualRowItem[] = [];\n let previousEnd: number | null = null;\n for (const item of virtualItems) {\n const gap =\n previousEnd === null ? 0 : Math.max(0, item.start - previousEnd);\n mounted.push({ index: item.index, gapBefore: gap });\n previousEnd = item.end;\n }\n const first = virtualItems[0];\n const last = virtualItems[virtualItems.length - 1];\n return {\n items: mounted,\n padStart: Math.max(0, first.start - headSize),\n padEnd: Math.max(0, totalSize - (last.end - headSize)),\n };\n }, [enabled, count, virtualItems, totalSize, headSize]);\n\n const scrollToIndex = useCallback(\n (index: number) => {\n if (!enabled) return;\n virtualizer.scrollToIndex(index, { align: 'auto' });\n },\n [enabled, virtualizer],\n );\n\n const setFocusedIndex = useCallback((index: number | null) => {\n focusedRef.current = index;\n }, []);\n\n return {\n enabled,\n items,\n padStart,\n padEnd,\n measureElement: virtualizer.measureElement,\n scrollToIndex,\n setFocusedIndex,\n measure: () => virtualizer.measure(),\n };\n}\n","/* -------------------------------------------------------------------- */\n/* DataGrid: the kit's table on TanStack Table v9. */\n/* */\n/* A semantic `<table>` (native table keyboard model: Tab through every */\n/* control, always-on editors included) with sorting, column filters, */\n/* quick search, client or server paging, tri-state row selection, */\n/* expanding rows and detail panels, editors, grouped headers, pinned, */\n/* resizable, reorderable and responsive columns, a pinned totals row, */\n/* virtualisation above 100 rendered rows, print of every row, privacy */\n/* masking and a curated handle. No TanStack type in a public prop; the */\n/* public types live in `types.ts`. */\n/* */\n/* Two DOM shapes (design § 3.1): without `toolbar` or `pagination` the */\n/* root is the scroll region (today's DOM: care-plan-margin keeps its */\n/* test id and `aria-describedby` on one element); with either, a frame */\n/* holds the toolbar slot, the scroll region and the pager, and naming */\n/* ARIA goes to the scroll region. */\n/* -------------------------------------------------------------------- */\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type ForwardedRef,\n type ReactElement,\n type ReactNode,\n type Ref,\n} from 'react';\nimport { flushSync } from 'react-dom';\nimport { useTranslation } from 'react-i18next';\n\nimport { useAgentRegistration } from '../../agent';\nimport { composeRefs } from '../_shared/compose-refs';\nimport { isDevelopment } from '../_shared/is-development';\nimport { useDirection } from '../_shared/use-direction';\nimport { ScrollArea } from '../scroll-area';\nimport { Spinner } from '../spinner';\nimport { DataGridAnnouncer, useDataGridAnnouncer } from './announcer';\nimport {\n DataGridBody,\n columnKind,\n type DataGridBodyItem,\n type DataGridPinPresentation,\n type DataGridRenderModel,\n type DgColumn,\n type DgRow,\n} from './body';\nimport { dataGridAgent } from './data-grid.agent';\nimport {\n busyVariants,\n colVariants,\n frameVariants,\n scrollerVariants,\n slotVariants,\n tableVariants,\n} from './data-grid.variants';\nimport { DataGridFooter } from './footer';\nimport {\n DataGridContext,\n dataGridMountSignal,\n DataGridRegistryContext,\n registerDataGridToolbarSeam,\n useDataGridRegistry,\n} from './grid-context';\nimport { DataGridHeader } from './header';\nimport {\n findOwnRow,\n handleBodyKeyDown,\n ownRows,\n useFocusMemory,\n type DataGridRowControl,\n type RowNavigation,\n} from './keyboard';\nimport { DataGridPager } from './pager';\nimport { useDataGridPrint } from './print';\nimport { DataGridSkeletonRows, DataGridStateRow } from './states';\nimport {\n DATA_GRID_PAGE_SIZE_OPTIONS,\n DATA_GRID_VIRTUALIZE_ABOVE,\n type DataGridColumn,\n type DataGridContextValue,\n type DataGridHandle,\n type DataGridProps,\n} from './types';\nimport { useDataGridEngine } from './use-data-grid-engine';\nimport { useVirtualRows } from './virtual-rows';\n\nexport type { DataGridColumn, DataGridProps } from './types';\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\n/** The context a grid gives everything it renders. The DataGridTabs\n * registry is cut here, so a grid nested inside (a cell, a detail panel,\n * a dialog opened from either: context crosses portals) never registers\n * with the outer grid's tabs, even when it mounts in the same commit. */\nfunction GridScope({\n value,\n children,\n}: {\n value: DataGridContextValue;\n children: ReactNode;\n}) {\n return (\n <DataGridContext.Provider value={value}>\n <DataGridRegistryContext.Provider value={null}>\n {children}\n </DataGridRegistryContext.Provider>\n </DataGridContext.Provider>\n );\n}\n\n/** Body items on this page: rows (expanded sub-rows included, in the order\n * the row model gives) and a detail panel after each expanded row. */\nfunction pageItems<TData extends object>(\n rows: readonly DgRow<TData>[],\n withDetail: boolean,\n): DataGridBodyItem<TData>[] {\n const items: DataGridBodyItem<TData>[] = [];\n for (const row of rows) {\n items.push({ kind: 'row', key: row.id, row });\n if (withDetail && row.getIsExpanded()) {\n items.push({ kind: 'detail', key: `${row.id}:detail`, row });\n }\n }\n return items;\n}\n\n/** Body items a top-level row stands for (itself, its open detail panel,\n * its expanded descendants), for `aria-rowindex` over unrendered pages. */\nfunction itemCount<TData extends object>(\n row: DgRow<TData>,\n withDetail: boolean,\n): number {\n if (!row.getIsExpanded()) return 1;\n let count = 1 + (withDetail ? 1 : 0);\n for (const child of row.subRows) count += itemCount(child, withDetail);\n return count;\n}\n\n/** `<col>` width kind for a column without a host size or resize. */\nfunction colKind<TData>(\n kind: ReturnType<typeof columnKind>,\n kit: DataGridColumn<TData> | undefined,\n): 'text' | 'number' | 'date' | 'utility' {\n if (kind === 'select' || kind === 'expand') return 'utility';\n if (!kit) return 'text';\n if (kit.filter?.kind === 'dateRange' || kit.sort === 'date') return 'date';\n if (kit.filter?.kind === 'number' || kit.sort === 'number') return 'number';\n if (kit.edit?.kind === 'number' || kit.align === 'end') return 'number';\n return 'text';\n}\n\nfunction warn(message: string): void {\n if (isDevelopment()) console.warn(`[DataGrid] ${message}`);\n}\n\n/** Observes an element's block size (border box). */\nfunction useBlockSize(): [(node: HTMLElement | null) => void, number] {\n const [size, setSize] = useState(0);\n const observer = useRef<ResizeObserver | null>(null);\n const ref = useCallback((node: HTMLElement | null) => {\n observer.current?.disconnect();\n observer.current = null;\n if (!node) {\n setSize(0);\n return;\n }\n const read = () => {\n const next = Math.round(node.getBoundingClientRect().height);\n setSize((previous) => (previous === next ? previous : next));\n };\n read();\n if (typeof ResizeObserver === 'function') {\n observer.current = new ResizeObserver(read);\n observer.current.observe(node);\n }\n }, []);\n return [ref, size];\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nfunction DataGridInner<TData extends object>(\n props: DataGridProps<TData>,\n ref: ForwardedRef<DataGridHandle>,\n) {\n const {\n /* today's props */\n columns,\n rows,\n getRowId,\n caption,\n /* identity */\n gridId,\n persistColumnState,\n registerAgent = true,\n /* data mode */\n dataMode = 'client',\n rowCount,\n onQueryChange,\n /* sorting */\n sorting,\n defaultSorting,\n onSortingChange,\n multiSort,\n maxSortLevels,\n /* filtering */\n filters,\n defaultFilters,\n onFiltersChange,\n quickFilter,\n defaultQuickFilter,\n onQuickFilterChange,\n filterLabels,\n /* paging */\n pagination,\n page,\n defaultPage,\n onPageChange,\n /* selection */\n selectionMode = 'none',\n rowSelection,\n defaultRowSelection,\n onRowSelectionChange,\n getRowSelectability,\n selectAllScope,\n rangeSelection,\n clearSelectionOnFilterChange = false,\n /* columns */\n columnGroups,\n columnResizing = false,\n columnVisibility,\n defaultColumnVisibility,\n onColumnVisibilityChange,\n columnPinning,\n defaultColumnPinning,\n onColumnPinningChange,\n columnSizing,\n defaultColumnSizing,\n onColumnSizingChange,\n columnOrder,\n defaultColumnOrder,\n onColumnOrderChange,\n responsiveColumns,\n /* expanding */\n getSubRows,\n renderDetail,\n getRowCanExpand,\n expanded,\n defaultExpanded,\n onExpandedChange,\n expandMode,\n /* editing and names */\n isRowReadOnly,\n readOnly = false,\n getRowLabel,\n rowLabelPrivacySafe,\n hostTextPrivacySafe,\n /* states */\n status = 'ready',\n error,\n empty,\n /* chrome */\n toolbar,\n density = 'default',\n height = 'auto',\n virtualization = 'auto',\n privacyMode = false,\n /* DOM */\n className,\n style,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n 'aria-describedby': ariaDescribedBy,\n ...rest\n } = props;\n\n const { t } = useTranslation('ui');\n const idBase = useId();\n const captionId = `${idBase}-caption`;\n\n const rootRef = useRef<HTMLDivElement | null>(null);\n const scrollRef = useRef<HTMLDivElement | null>(null);\n const bodyRef = useRef<HTMLTableSectionElement | null>(null);\n const rootScrollRef = useMemo(\n () => composeRefs<HTMLDivElement>(rootRef, scrollRef),\n [],\n );\n const direction = useDirection(rootRef);\n const { printing, print } = useDataGridPrint(scrollRef);\n const [focusedColumnId, setFocusedColumnId] = useState<string | null>(null);\n\n // Grid width for responsive tiers (the grid's own root, not the\n // viewport; recorded deviation from 15-responsive).\n const [containerInlineSize, setContainerInlineSize] = useState<number | null>(\n null,\n );\n useLayoutEffect(() => {\n const node = rootRef.current;\n if (!node || typeof ResizeObserver !== 'function') return undefined;\n const read = () => {\n const width = Math.round(node.getBoundingClientRect().width);\n setContainerInlineSize((previous) =>\n previous === width || width === 0 ? previous : width,\n );\n };\n read();\n const observer = new ResizeObserver(read);\n observer.observe(node);\n return () => observer.disconnect();\n }, []);\n\n const engine = useDataGridEngine<TData>({\n columns,\n rows,\n getRowId,\n gridId,\n persistColumnState,\n dataMode,\n rowCount,\n onQueryChange,\n sorting,\n defaultSorting,\n onSortingChange,\n multiSort,\n maxSortLevels,\n filters,\n defaultFilters,\n onFiltersChange,\n quickFilter,\n defaultQuickFilter,\n onQuickFilterChange,\n filterLabels,\n pagination,\n page,\n defaultPage,\n onPageChange,\n selectionMode,\n rowSelection,\n defaultRowSelection,\n onRowSelectionChange,\n getRowSelectability,\n selectAllScope,\n rangeSelection,\n clearSelectionOnFilterChange,\n columnGroups,\n columnResizing,\n columnVisibility,\n defaultColumnVisibility,\n onColumnVisibilityChange,\n columnPinning,\n defaultColumnPinning,\n onColumnPinningChange,\n columnSizing,\n defaultColumnSizing,\n onColumnSizingChange,\n columnOrder,\n defaultColumnOrder,\n onColumnOrderChange,\n responsiveColumns,\n getSubRows,\n renderDetail,\n getRowCanExpand,\n expanded,\n defaultExpanded,\n onExpandedChange,\n expandMode,\n isRowReadOnly,\n getRowLabel,\n rowLabelPrivacySafe,\n hostTextPrivacySafe,\n status,\n virtualization,\n privacyMode,\n direction,\n containerInlineSize,\n printing,\n focusedColumnId,\n caption,\n });\n const { table, store, handle, toolbarSeam, selection, layout } = engine;\n const meta = table.options.meta!;\n\n useImperativeHandle(ref, () => handle, [handle]);\n // `registerAgent={false}`: a component with its own agent surface wraps\n // this grid, so the grid registers nothing (`gridId` still keys the saved\n // column state) and writes no `data-component-id`.\n useAgentRegistration(\n dataGridAgent,\n registerAgent ? handle : null,\n registerAgent ? gridId : undefined,\n );\n const componentId = registerAgent ? gridId : undefined;\n // Grid-wide read-only: the reason every disabled box gives, or `null`.\n // Under privacy mode the host's text gives way to kit copy, as host\n // selectability reasons do: it may name a person. `hostTextPrivacySafe`\n // keeps it, as it keeps the other host text.\n const readOnlyReason =\n readOnly === false\n ? null\n : typeof readOnly === 'object' &&\n readOnly.reason &&\n (!privacyMode || hostTextPrivacySafe)\n ? readOnly.reason\n : t('dataGrid.readOnly.reason', 'Unavailable while the table is busy');\n\n // DataGridTabs above: register so the tabs need no `getTable`. A layout\n // effect: the grid is bound before first paint, so the tabs can read its\n // privacy state and a typed name never flashes as \"Saved view N\".\n const registry = useDataGridRegistry();\n useLayoutEffect(() => registry?.register(handle), [registry, handle]);\n\n // The toolbar seam for a lifted toolbar, then the mount signal (in this\n // order, so a woken provider finds the seam; on unmount the seam goes\n // first, then the signal).\n useEffect(\n () => registerDataGridToolbarSeam(handle, toolbarSeam),\n [handle, toolbarSeam],\n );\n useEffect(() => {\n dataGridMountSignal.notify();\n return () => dataGridMountSignal.notify();\n }, []);\n\n /* ---------------- columns and pins ---------------- */\n\n const startColumns = table.getStartVisibleLeafColumns();\n const centreColumns = table.getCenterVisibleLeafColumns();\n const endColumns = table.getEndVisibleLeafColumns();\n const visibleColumns: DgColumn<TData>[] = [\n ...startColumns,\n ...centreColumns,\n ...endColumns,\n ];\n\n // Pinned offsets are measured from the pinned leaf header cells (case 2):\n // in fixed layout an unsized column's width comes from a rem token, so\n // v9's own sizes would not match the rendered widths. Measured in a layout\n // effect (React commits the result before the first paint) and again by a\n // ResizeObserver when a pinned cell changes width without a render (a web\n // font swapping in), committed with `flushSync` so no frame shows stale\n // offsets.\n const pinnedNodes = useRef(new Map<string, HTMLElement>());\n const [pinWidths, setPinWidths] = useState<Record<string, number>>({});\n const readPinWidths = useCallback(() => {\n const next: Record<string, number> = {};\n for (const [id, node] of pinnedNodes.current) {\n next[id] = Math.round(node.getBoundingClientRect().width);\n }\n setPinWidths((previous) => {\n const keys = Object.keys(next);\n const same =\n keys.length === Object.keys(previous).length &&\n keys.every((id) => previous[id] === next[id]);\n return same ? previous : next;\n });\n }, []);\n const pinObserver = useRef<ResizeObserver | null>(null);\n const measurePinned = useCallback(\n (columnId: string, node: HTMLElement | null) => {\n if (\n pinObserver.current === null &&\n typeof ResizeObserver === 'function'\n ) {\n pinObserver.current = new ResizeObserver(() =>\n flushSync(readPinWidths),\n );\n }\n const previous = pinnedNodes.current.get(columnId);\n if (previous && previous !== node) {\n pinObserver.current?.unobserve(previous);\n }\n if (node) {\n pinnedNodes.current.set(columnId, node);\n pinObserver.current?.observe(node);\n } else {\n pinnedNodes.current.delete(columnId);\n }\n },\n [readPinWidths],\n );\n useEffect(\n () => () => {\n pinObserver.current?.disconnect();\n pinObserver.current = null;\n },\n [],\n );\n // Runs after every render (widths change with content and resizing); the\n // state only changes when a width does, so it settles.\n useLayoutEffect(() => {\n readPinWidths();\n });\n\n const startKey = startColumns.map((c) => c.id).join('|');\n const endKey = endColumns.map((c) => c.id).join('|');\n const pins = useMemo(() => {\n const map = new Map<string, DataGridPinPresentation>();\n let offset = 0;\n startColumns.forEach((column, index) => {\n map.set(column.id, {\n pin: index === 0 ? 'start' : 'startOffset',\n divider: index === startColumns.length - 1 ? 'end' : 'none',\n offset: index === 0 ? null : offset,\n });\n offset += pinWidths[column.id] ?? 0;\n });\n offset = 0;\n for (let index = endColumns.length - 1; index >= 0; index -= 1) {\n const column = endColumns[index];\n const last = index === endColumns.length - 1;\n map.set(column.id, {\n pin: last ? 'end' : 'endOffset',\n divider: index === 0 ? 'start' : 'none',\n offset: last ? null : offset,\n });\n offset += pinWidths[column.id] ?? 0;\n }\n return map;\n // The column arrays are rebuilt every render; their ids drive this.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [startKey, endKey, pinWidths]);\n const startPinnedTotal = startColumns.reduce(\n (sum, column) => sum + (pinWidths[column.id] ?? 0),\n 0,\n );\n const endPinnedTotal = endColumns.reduce(\n (sum, column) => sum + (pinWidths[column.id] ?? 0),\n 0,\n );\n const hasPinned = startColumns.length + endColumns.length > 0;\n\n const rowHeaderColumnId = useMemo(() => {\n const data = visibleColumns.filter((c) => columnKind(c) === 'data');\n return (\n data.find((c) => c.columnDef.meta?.isRowHeader)?.id ?? data[0]?.id ?? null\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [visibleColumns.map((c) => c.id).join('|')]);\n\n /* ---------------- body items and virtualisation ---------------- */\n\n const withDetail = renderDetail !== undefined;\n const pageRows = table.getRowModel().rows;\n // Rebuilt every render (one pass): expansion and detail panels change it\n // without a new row model.\n const items = pageItems(pageRows, withDetail);\n const indexById = new Map<string, number>();\n items.forEach((item, index) => {\n if (item.kind === 'row') indexById.set(item.row.id, index);\n });\n\n const virtualised =\n virtualization !== 'off' &&\n !printing &&\n items.length > DATA_GRID_VIRTUALIZE_ABOVE;\n const fixedLayout = layout.fixed || virtualised;\n\n const [headRef, headSize] = useBlockSize();\n const [footRef, footSize] = useBlockSize();\n const [groupRowRef, groupRowSize] = useBlockSize();\n const theadRef = useRef<HTMLTableSectionElement | null>(null);\n const composedHeadRef = useMemo(\n () => composeRefs<HTMLTableSectionElement>(theadRef, headRef),\n [headRef],\n );\n\n // Row block size for the virtualiser's estimate: a custom property reads\n // back as its declared text, so measure a rendered row instead.\n const [rowSizePx, setRowSizePx] = useState<number | null>(null);\n useLayoutEffect(() => {\n setRowSizePx(null);\n }, [density]);\n // Until a row has been measured (then never again until density changes).\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useLayoutEffect(() => {\n if (rowSizePx !== null) return;\n const row = bodyRef.current?.querySelector('tr[data-row-id]');\n const size = row ? Math.round(row.getBoundingClientRect().height) : 0;\n if (size > 0) setRowSizePx(size);\n });\n\n const virtual = useVirtualRows({\n enabled: virtualised,\n count: items.length,\n getScrollElement: () => scrollRef.current,\n getItemKey: (index) => items[index]?.key ?? String(index),\n rowSizePx,\n headSize,\n footSize,\n });\n useEffect(() => {\n if (virtualised) virtual.measure();\n // Density changes every row's size at once.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [density, virtualised]);\n\n // DEV: virtualising in a scroller that never scrolls renders every row\n // in a very tall box and loses the sticky header.\n useEffect(() => {\n const scroller = scrollRef.current;\n if (!virtualised || !scroller || scroller.clientHeight === 0) return;\n if (scroller.scrollHeight <= scroller.clientHeight + 1) return;\n const computed = window.getComputedStyle(scroller);\n if (\n computed.maxHeight === 'none' &&\n computed.height === `${scroller.scrollHeight}px`\n ) {\n warn(\n 'virtualising in an unbounded scroller: give the grid a bounded block size (height=\"fill\" in a flex column, or a max-block-size class).',\n );\n }\n }, [virtualised]);\n\n /* ---------------- aria-rowcount and aria-rowindex ---------------- */\n\n const headerRowCount = table.getHeaderGroups().length;\n const paginated = Boolean(pagination) && !(printing && dataMode === 'client');\n const rowsMissing = virtualised || dataMode === 'server' || paginated;\n const isEmpty = items.length === 0;\n const showRows = status !== 'error' && !isEmpty;\n const { pageIndex, pageSize } = store.get('page');\n\n const rowNumbers = useMemo(() => {\n if (!rowsMissing || !showRows) return null;\n if (dataMode === 'server') {\n const details = items.filter((item) => item.kind === 'detail').length;\n const total = handle.getRowCount();\n const base = headerRowCount + pageIndex * pageSize;\n return {\n rowCount:\n total < 0\n ? -1\n : headerRowCount + total + details + (layout.hasFooter ? 1 : 0),\n rowIndexOf: (index: number) => base + index + 1,\n footerIndex:\n total < 0 ? undefined : headerRowCount + total + details + 1,\n };\n }\n const all = table.getPrePaginatedRowModel().rows;\n let before = 0;\n let totalItems = 0;\n const firstOnPage = paginated ? pageIndex * pageSize : 0;\n all.forEach((row, index) => {\n const count = itemCount(row, withDetail);\n totalItems += count;\n if (index < firstOnPage) before += count;\n });\n return {\n rowCount: headerRowCount + totalItems + (layout.hasFooter ? 1 : 0),\n rowIndexOf: (index: number) => headerRowCount + before + index + 1,\n footerIndex: headerRowCount + totalItems + 1,\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n rowsMissing,\n showRows,\n dataMode,\n items,\n headerRowCount,\n pageIndex,\n pageSize,\n layout.hasFooter,\n paginated,\n withDetail,\n rowCount,\n ]);\n\n /* ---------------- keyboard ---------------- */\n\n const navigation: RowNavigation = {\n indexesWith: (control: DataGridRowControl) =>\n items.flatMap((item, index) => {\n if (item.kind !== 'row') return [];\n if (control === 'select') {\n // Locked boxes stay focusable (their reason is a Tooltip on\n // focus), so Arrow keys land on them too; a 'none' row has no box.\n return selection.getSelectability(item.row.id).state !== 'none'\n ? [index]\n : [];\n }\n return item.row.getCanExpand() ? [index] : [];\n }),\n rowIdAt: (index) => {\n const item = items[index];\n return item?.kind === 'row' ? item.row.id : undefined;\n },\n indexOf: (rowId) => indexById.get(rowId),\n reveal: (index) => {\n virtual.setFocusedIndex(index);\n virtual.scrollToIndex(index);\n },\n };\n const visibleIdsRef = useRef<string[]>([]);\n visibleIdsRef.current = visibleColumns.map((column) => column.id);\n const onFocusedColumnIndex = useCallback((cellIndex: number | null) => {\n const id =\n cellIndex === null ? null : (visibleIdsRef.current[cellIndex] ?? null);\n setFocusedColumnId((previous) => (previous === id ? previous : id));\n }, []);\n useFocusMemory({\n bodyRef,\n scrollRef,\n navigation,\n keepMounted: virtual.setFocusedIndex,\n onFocusedColumnIndex,\n });\n\n /* ---------------- renderer bindings (handle methods) ---------------- */\n\n const live = useRef({\n items,\n indexById,\n visibleIds: visibleIdsRef,\n virtual,\n navigation,\n });\n live.current = {\n items,\n indexById,\n visibleIds: visibleIdsRef,\n virtual,\n navigation,\n };\n useEffect(\n () =>\n engine.bindRenderer({\n print,\n scrollToRow: (id) => {\n const { indexById: map, virtual: window_ } = live.current;\n const index = map.get(id);\n if (index === undefined) return;\n if (window_.enabled) {\n window_.scrollToIndex(index);\n return;\n }\n // This grid's own row, never a nested grid's with the same id.\n const body = bodyRef.current;\n const row = body ? findOwnRow(body, id) : null;\n row?.scrollIntoView?.({ block: 'nearest', inline: 'nearest' });\n },\n focusRow: (id, columnId) => {\n const body = bodyRef.current;\n const { indexById: map, navigation: nav, visibleIds } = live.current;\n const index = map.get(id);\n if (!body || index === undefined) return;\n const focusIn = () => {\n for (const row of ownRows(body)) {\n if (row.dataset.rowId !== id) continue;\n const cellIndex =\n columnId !== undefined\n ? visibleIds.current.indexOf(columnId)\n : -1;\n const cell =\n cellIndex >= 0\n ? (row.children[cellIndex] as HTMLElement)\n : null;\n const target =\n cell?.querySelector<HTMLElement>(\n 'button:not([disabled]), input:not([disabled]), textarea, a[href], [tabindex]:not([tabindex=\"-1\"])',\n ) ??\n row.querySelector<HTMLElement>(\n '[data-dg-control=\"select\"]:not([disabled])',\n ) ??\n row.querySelector<HTMLElement>(':scope > th[scope=\"row\"]');\n if (target) {\n if (\n target.tagName === 'TH' &&\n !target.hasAttribute('tabindex')\n ) {\n target.setAttribute('tabindex', '-1');\n }\n target.focus();\n }\n return true;\n }\n return false;\n };\n if (focusIn()) return;\n nav.reveal(index);\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(() =>\n requestAnimationFrame(() => void focusIn()),\n );\n }\n },\n }),\n [engine, print],\n );\n\n /* ---------------- announcements ---------------- */\n\n const features = handle.getFeatures();\n const announcing =\n features.sorting ||\n features.filtering ||\n features.quickFilter ||\n features.pagination ||\n features.expansion ||\n features.columnResizing ||\n selectionMode !== 'none' ||\n props.status !== undefined;\n const message = useDataGridAnnouncer({\n handle,\n getRowLabel: meta.getRowLabel,\n status,\n errorTitle: error?.title ?? t('dataGrid.error.title'),\n selectionMode,\n clearSelectionOnFilterChange,\n privacyMode,\n });\n\n /* ---------------- render model ---------------- */\n\n // The committed model, for handlers in memoised rows (body.tsx).\n const latestModel = useRef<DataGridRenderModel<TData> | null>(null);\n const model: DataGridRenderModel<TData> = {\n table,\n store,\n kitColumns: engine.kitColumns,\n kitGroups: engine.kitGroups,\n selection,\n meta,\n idBase,\n density,\n dataMode,\n direction,\n privacyMode,\n hostTextPrivacySafe: hostTextPrivacySafe ?? false,\n pins,\n visibleColumns,\n visibleColumnsKey: visibleIdsRef.current.join('|'),\n latest: latestModel,\n rowHeaderColumnId,\n renderDetail,\n readOnlyReason,\n };\n useLayoutEffect(() => {\n latestModel.current = model;\n });\n\n const loading = status === 'loading';\n let stateRows = null;\n if (status === 'error') {\n stateRows = (\n <DataGridStateRow\n kind=\"error\"\n columnCount={visibleColumns.length}\n error={error}\n onClearFilters={() => toolbarSeam.clearAllFilters()}\n />\n );\n } else if (isEmpty && loading) {\n stateRows = (\n <DataGridSkeletonRows\n rowCount={paginated ? Math.min(pageSize, 10) : 5}\n columnCount={visibleColumns.length}\n density={density}\n />\n );\n } else if (isEmpty) {\n stateRows = (\n <DataGridStateRow\n kind={engine.status.anyFilterActive ? 'no-results' : 'first-use'}\n columnCount={visibleColumns.length}\n empty={empty}\n onClearFilters={() => toolbarSeam.clearAllFilters()}\n />\n );\n }\n\n // Hints for features a screen reader cannot discover from the controls.\n const anySortable = visibleColumns.some((column) => column.getCanSort());\n const multiSortHint = anySortable && multiSort !== false;\n const rangeHint = selectionMode === 'multiple' && rangeSelection !== false;\n const hintIds = [\n multiSortHint ? `${idBase}-hint-sort` : null,\n rangeHint ? `${idBase}-hint-range` : null,\n ]\n .filter(Boolean)\n .join(' ');\n\n const sizing = store.get('columnSizing');\n const colgroups = fixedLayout\n ? (() => {\n const runs: { groupId: string | null; columns: DgColumn<TData>[] }[] =\n [];\n for (const column of visibleColumns) {\n const groupId = column.columnDef.meta?.groupId ?? null;\n const last = runs[runs.length - 1];\n if (last && last.groupId === groupId) last.columns.push(column);\n else runs.push({ groupId, columns: [column] });\n }\n return runs.map((run, runIndex) => (\n <colgroup key={`${run.groupId ?? 'run'}-${runIndex}`}>\n {run.columns.map((column) => {\n const kind = columnKind(column);\n const kit = engine.kitColumns.get(column.id);\n const sized =\n kind === 'data' &&\n (kit?.size !== undefined || sizing[column.id] !== undefined);\n return (\n <col\n key={column.id}\n className={colVariants({\n kind: sized ? 'sized' : colKind(kind, kit),\n })}\n // eslint-disable-next-line react/forbid-dom-props -- 23-constraints §Runtime-computed dimensions: `--dg-col-size` custom-property setter (case 1) for a host size or a user resize; the width rule lives in data-grid.variants.ts.\n style={\n sized\n ? ({\n '--dg-col-size': `${Math.round(column.getSize())}px`,\n } as CSSProperties)\n : undefined\n }\n />\n );\n })}\n </colgroup>\n ));\n })()\n : null;\n\n const groupRowNode = useRef<HTMLTableRowElement | null>(null);\n useLayoutEffect(() => {\n const thead = theadRef.current;\n const first =\n headerRowCount > 1 ? (thead?.querySelector('tr') ?? null) : null;\n if (first !== groupRowNode.current) {\n groupRowNode.current = first;\n groupRowRef(first);\n }\n });\n\n const table_ = (\n <table\n className={tableVariants({ fixed: fixedLayout })}\n aria-busy={loading || undefined}\n aria-rowcount={rowNumbers?.rowCount}\n aria-describedby={hintIds || undefined}\n >\n <caption id={captionId} className=\"ds:sr-only\">\n {caption}\n </caption>\n {colgroups}\n <DataGridHeader\n model={model}\n headRef={composedHeadRef}\n measurePinned={measurePinned}\n ariaRowIndexOf={(index) => (rowNumbers ? index + 1 : undefined)}\n />\n <DataGridBody\n model={model}\n bodyRef={bodyRef}\n items={items}\n mounted={virtual.items}\n virtualised={virtualised}\n padStart={virtual.padStart}\n padEnd={virtual.padEnd}\n measureElement={virtual.measureElement}\n columnCount={visibleColumns.length}\n ariaRowIndexOf={(index) => rowNumbers?.rowIndexOf(index)}\n onKeyDown={(event) => {\n if (bodyRef.current) {\n handleBodyKeyDown(event, navigation);\n }\n }}\n stateRows={stateRows}\n />\n {layout.hasFooter && showRows ? (\n <DataGridFooter\n model={model}\n footRef={footRef}\n getFooterContext={engine.getFooterContext}\n ariaRowIndex={rowNumbers?.footerIndex}\n />\n ) : null}\n </table>\n );\n\n const extras = (\n <>\n {multiSortHint ? (\n <span hidden id={`${idBase}-hint-sort`}>\n {t('dataGrid.hint.multiSort')}\n </span>\n ) : null}\n {rangeHint ? (\n <span hidden id={`${idBase}-hint-range`}>\n {t('dataGrid.hint.rangeSelection')}\n </span>\n ) : null}\n {announcing ? <DataGridAnnouncer message={message} /> : null}\n </>\n );\n\n // Custom properties the CVA rules consume, merged with a host `style`.\n const customProperties: Record<string, string> = {};\n if (headSize > 0) customProperties['--dg-head-size'] = `${headSize}px`;\n if (layout.hasFooter && footSize > 0) {\n customProperties['--dg-foot-size'] = `${footSize}px`;\n }\n if (headerRowCount > 1 && groupRowSize > 0) {\n customProperties['--dg-group-row-size'] = `${groupRowSize}px`;\n }\n if (hasPinned && startPinnedTotal > 0) {\n customProperties['--dg-pin-start-total'] = `${startPinnedTotal}px`;\n }\n if (hasPinned && endPinnedTotal > 0) {\n customProperties['--dg-pin-end-total'] = `${endPinnedTotal}px`;\n }\n const rootStyle =\n Object.keys(customProperties).length > 0 || style\n ? ({ ...style, ...customProperties } as CSSProperties)\n : undefined;\n\n const contextValue = useMemo<DataGridContextValue>(\n () => ({ handle, toolbarSeam }),\n [handle, toolbarSeam],\n );\n\n const chrome = toolbar !== undefined || Boolean(pagination);\n\n if (!chrome) {\n return (\n <GridScope value={contextValue}>\n <ScrollArea\n ref={rootScrollRef}\n type=\"native\"\n orientation=\"both\"\n role=\"group\"\n aria-labelledby={ariaLabelledBy ?? captionId}\n aria-label={ariaLabel}\n aria-describedby={ariaDescribedBy}\n data-component=\"data-grid\"\n data-component-id={componentId}\n className={scrollerVariants({\n chrome: false,\n pinned: hasPinned,\n height,\n className,\n })}\n // eslint-disable-next-line react/forbid-component-props -- 23-constraints §Runtime-computed dimensions: custom-property setters (sticky clearances and pin totals measured by ResizeObserver, case 2), merged with the host's own `style`.\n style={rootStyle}\n {...rest}\n >\n {loading && showRows ? (\n <div className={busyVariants()}>\n <Spinner size=\"sm\" label={t('dataTable.loading')} />\n </div>\n ) : null}\n {table_}\n {extras}\n </ScrollArea>\n </GridScope>\n );\n }\n\n const config = typeof pagination === 'object' ? pagination : undefined;\n const pageRowCount = pageRows.filter((row) => row.depth === 0).length;\n\n return (\n <GridScope value={contextValue}>\n <div\n ref={rootRef}\n data-component=\"data-grid\"\n data-component-id={componentId}\n className={frameVariants({ height, className })}\n // eslint-disable-next-line react/forbid-dom-props -- 23-constraints §Runtime-computed dimensions: custom-property setters (sticky clearances and pin totals measured by ResizeObserver, case 2), merged with the host's own `style`.\n style={rootStyle}\n {...rest}\n >\n {toolbar !== undefined ? (\n <div className={slotVariants({ slot: 'toolbar' })}>{toolbar}</div>\n ) : null}\n <ScrollArea\n ref={scrollRef}\n type=\"native\"\n orientation=\"both\"\n role=\"group\"\n aria-labelledby={ariaLabelledBy ?? captionId}\n aria-label={ariaLabel}\n aria-describedby={ariaDescribedBy}\n className={scrollerVariants({ chrome: true, pinned: hasPinned })}\n >\n {table_}\n </ScrollArea>\n {paginated ? (\n <DataGridPager\n caption={caption}\n pageIndex={pageIndex}\n pageSize={pageSize}\n pageCount={handle.getPageCount()}\n rowCount={handle.getRowCount()}\n pageRowCount={pageRowCount}\n pageSizeOptions={\n config?.pageSizeOptions ?? DATA_GRID_PAGE_SIZE_OPTIONS\n }\n showEndpoints={config?.showEndpoints ?? false}\n loading={loading && showRows}\n onPageChange={(next) =>\n store.write(\n 'page',\n (previous) => ({ ...previous, pageIndex: next }),\n 'user',\n )\n }\n onPageSizeChange={(next) =>\n store.write('page', { pageIndex: 0, pageSize: next }, 'user')\n }\n />\n ) : loading && showRows ? (\n <div className={slotVariants({ slot: 'pager' })}>\n <Spinner size=\"sm\" label={t('dataTable.loading')} />\n </div>\n ) : null}\n {extras}\n </div>\n </GridScope>\n );\n}\n\n/**\n * The kit's TanStack table. Pass `ref` for the curated `DataGridHandle`.\n * `forwardRef` with the generic cast DataTable uses (`data-table.tsx:1146`),\n * keeping `TData extends object` because v9 needs `RowData`.\n */\nexport const DataGrid = forwardRef(DataGridInner) as <TData extends object>(\n props: DataGridProps<TData> & { ref?: Ref<DataGridHandle> },\n) => ReactElement;\n\n(DataGrid as { displayName?: string }).displayName = 'DataGrid';\n"],"names":["DATA_GRID_VIRTUALIZE_ABOVE","DATA_GRID_DEFAULT_PAGE_SIZE","DATA_GRID_PAGE_SIZE_OPTIONS","DATA_GRID_MAX_SORT_LEVELS","DATA_GRID_RESPONSIVE_BREAKPOINTS","DATA_GRID_COLUMN_STATE_PREFIX","DATA_GRID_RESIZE_STEP_PX","DATA_GRID_SLICE_EVENT","normalise","value","record","out","key","stableStringify","stableEqual","a","b","toV9Sorting","entries","isEffective","entry","fromV9Sorting","sorting","isAbsentFilterValue","toV9ColumnFilters","filters","isEvaluated","mergeV9ColumnFilters","next","merged","compactFilterModel","toV9RowSelection","ids","id","fromV9RowSelection","state","toV9Expanded","fromV9Expanded","allExpandableIds","toV9Pinning","pinning","utilityIds","fromV9Pinning","isUtility","fromV9Order","order","clampPageIndex","pageIndex","pageCount","index","querySelectionClears","isQuerySelectionClear","change","QUERY_SLICES","PAGE_RESET_SLICES","FILTER_SLICES","SLICE_ORDER","copySlice","slice","createDataGridStore","options","held","controlledValue","pending","lastRestore","controlled","corrected","listeners","context","version","queued","get","source","emit","listener","lockedIds","getReportedSelection","selected","locked","seen","getQuery","masked","_a","query","queryKey","_unused","rest","resultSetKey","search","initialQuery","lastQueryKey","lastResultSetKey","reportQuery","_b","shouldCorrect","from","to","last","callHost","callbacks","_c","_d","_e","_f","_g","_h","_i","_j","settle","changed","callHostFor","ordered","pageReset","page","events","event","writeMany","writes","previous","controlledProps","restored","batch","sources","slices","input","keepSelectedId","keepExpandedId","kept","expanded","clamped","DATA_GRID_ANNOUNCE_SETTLE_MS","DATA_GRID_ANNOUNCE_CLEAR_MS","ANNOUNCED_SOURCES","snapshot","handle","useDataGridAnnouncer","getRowLabel","status","errorTitle","selectionMode","clearSelectionOnFilterChange","privacyMode","t","i18n","useTranslation","message","setMessage","useState","privacyRef","useRef","useEffect","timer","latest","say","text","privacyAtCall","set","sayNeutral","settleTimer","selectionBeforeFilter","fmt","formatNumber","label","column","announceRowsWhenSettled","count","onSort","primary","c","onSelection","before","after","rowLabel","beforeSet","added","afterSet","removed","onColumns","byId","old","moved","distance","delta","onPage","total","announced","queryCleared","cleared","unsubscribe","DataGridAnnouncer","jsx","isReactComponent","component","isClassComponent","isExoticComponent","proto","flexRender","Comp","props","React","FlexRender","cell","def","groupingCell","groupingDef","createReactiveSystem","update","notify","unwatched","link","unlink","propagate","checkDirty","shallowPropagate","dep","sub","prevDep","nextDep","prevSub","newLink","nextSub","stack","top","flags","isValidLink","subSubs","checkDepth","dirty","subs","firstSub","hasMultipleSubs","checkLink","toObserver","nextHandler","errorHandler","completionHandler","isObserver","self","queuedEffects","cycle","atom","effect","queuedEffectsLength","purgeDeps","notifyIndex","activeSub","batchDepth","fn","flush","depsTail","createAtom","valueOrFn","isComputed","getter","observerOrFn","obs","observed","e","getValue","compare","oldValue","newValue","run","effectObj","shallow","objA","objB","k","v","keysA","getOwnKeys","i","obj","require$$0","is","x","y","objectIs","useLayoutEffect","useDebugValue","useSyncExternalStore$2","subscribe","getSnapshot","_useState","inst","forceUpdate","checkIfSnapshotChanged","latestGetSnapshot","nextValue","useSyncExternalStore$1","shim","useSyncExternalStoreShim_production","didWarnOld18Alpha","didWarnUncachedGetSnapshot","cachedValue","useSyncExternalStoreShim_development","shimModule","require$$1","useSyncExternalStore","useMemo","withSelector_production","getServerSnapshot","selector","isEqual","instRef","memoizedSelector","nextSnapshot","hasMemo","memoizedSnapshot","currentSelection","memoizedSelection","nextSelection","maybeGetServerSnapshot","withSelector_development","withSelectorModule","defaultCompare","useSelector","s","useCallback","handleStoreChange","useSyncExternalStoreWithSelector","Subscribe","atomToStore","store","renderPhaseReactivity","primitives","commitAtom","atomOptions","hasSnapshot","reactiveAtom","createRenderPhaseSource","hasCommittedSnapshot","committedSnapshot","reactReactivity","functionalUpdate","updater","cloneState","copy","makeObjectMap","keys","copyInstancePropertiesWithoutMemos","target","targetRecord","hasOwn","makeStateUpdater","instance","isPlainContainer","getEnumerableOwnKeys","MAX_STATE_COMPARE_DEPTH","stateSlicesEqual","stateSlicesEqualAtDepth","depth","keysB","recordA","recordB","setStateSlice","onChangeKey","onChange","current","isFunction","d","flattenBy","arr","getChildren","flat","recurse","subArr","item","children","memo","memoDeps","onAfterCompare","onAfterUpdate","onBeforeCompare","onBeforeUpdate","deps","result","depArgs","newDeps","depsChanged","skipFirstRun","hasRun","pad","str","num","tableMemo","feature","fnName","objectId","table","memoOptions","startCalcTime","endCalcTime","runCount","debug","debugAll","parentName","getFunctionNameInfo","debugByParent","debugByFeature","logTime","time","runType","onAfterUpdateHandler","schedule","untrack","debugOptions","staticFnName","splitBy","fnKey","assignTableAPIs","apis","assignPrototypeAPIs","prototype","memoKey","args","callMemoOrStaticFn","staticFn","cell_getValue","cell_renderValue","cell_getContext","coreCellsFeature","getColumnPrototype","features","constructColumn","columnDef","parent","resolvedColumnDef","accessorKey","accessorKeyString","accessorFn","originalRow","columnPrototype","initFns","getIsColumnVisible","getVisibleLeafColumns","getVisibleCells","row","getVisibleCellsByColumnId","orderLeafColumns","columns","orderedTable","leafColumns","orderByColumnPinning","items","getColumnId","getItemsByColumnId","getPinnedVisibleLeafColumns","position","getGlobalFilterFn","getCanGlobalFilter","expandRowModel","rowModel","autoResetExpanded","autoResetPageIndex","autoResetSorting","autoResetCellSelection","column_getFlatColumns","col","column_getLeafColumns","table_getDefaultColumnDef","constructColumns","columnDefs","groupingColumnDef","table_getAllColumns","table_getAllFlatColumns","table_getAllFlatColumnsById","flatColumns","table_getAllLeafColumns","table_getAllLeafColumnsById","table_getColumn","columnId","coreColumnsFeature","getHeaderPrototype","constructHeader","headerPrototype","header","getMaxHeaderDepth","maxDepth","formatHeaderGroupId","headerFamily","formatHeaderId","childHeaderId","countPendingHeadersForColumn","headers","constructHeaderGroup","headersToGroup","headerGroups","headerGroupInitFns","headerGroup","pendingParentHeaders","headerToGroup","latestPendingParentHeader","isLeafHeader","isPlaceholder","updateHeaderSpans","colSpan","j","child","rowSpan","chainChild","buildHeaderGroups","allColumns","columnsToGroup","bottomHeaders","collectLeafHeaders","leafHeaders","header_getLeafHeaders","header_getContext","table_getHeaderGroups","table_getFooterGroups","table_getFlatHeaders","table_getLeafHeaders","topHeaders","coreHeadersFeature","getRowPrototype","constructRow","original","rowIndex","subRows","parentId","rowPrototype","createCoreRowModel","_createCoreRowModel","accessRows","originalRows","parentRow","rows","data","table_getCoreRowModel","table_getPreFilteredRowModel","table_getFilteredRowModel","table_getPreGroupedRowModel","table_getGroupedRowModel","table_getPreSortedRowModel","table_getSortedRowModel","table_getPreExpandedRowModel","table_getExpandedRowModel","table_getPrePaginatedRowModel","table_getPaginatedRowModel","table_getRowModel","coreRowModelsFeature","getCellPrototype","constructCell","cellPrototype","row_getDisplayIndex","displayIndex","table_getRowsInDisplayOrder","row_getValue","row_getUniqueValues","row_renderValue","row_getLeafRows","table_getMaxSubRowDepth","row_getParentRow","row_getParentRows","parentRows","currentRow","row_getAllCells","cache","cells","row_getAllCellsByColumnId","table_getRowId","table_getRow","rowId","searchAll","coreRowsFeature","table_syncExternalStateToBaseAtoms","capturedState","currentState","externalState","baseAtom","rawExternalState","table_publishExternalState","table_reset","snap","table_mergeOptions","newOptions","atoms","initialState","mergedOptions","descriptors","table_setOptions","coreTablesFeature","coreFeatures","metaHelper","getInitialTableState","constructTable","tableOptions","_reactivity","aggregationFns","_columnMeta","coreRowModel","expandedRowModel","facetedMinMaxValues","facetedRowModel","facetedUniqueValues","filterFns","_filterMeta","filteredRowModel","groupedRowModel","paginatedRowModel","sortFns","sortedRowModel","_tableMeta","featuresList","atomKey","_atom","wrappedAtom","syncExternal","syncAtomToWrappedSub","syncWrappedToAtomSub","stateKeys","externalAtom","reactiveState","controlledState","rowModels","factory","states","getDefaultColumnFiltersState","column_getAutoFilterFn","rowValue","filterFnName","filterFn","column_getFilterFn","column_getCanFilter","column_getIsFiltered","column_getFilterIndex","column_getFilterValue","column_setFilterValue","table_setColumnFilters","previousFilter","newFilter","shouldAutoRemoveFilter","newFilterObj","leafColumnsById","filter","table_resetColumnFilters","defaultState","columnFilteringFeature","getDefaultColumnOrderState","table_getColumnIndexes","buildIndexes","indexes","column_getIndex","column_getIsFirstColumn","column_getIsLastColumn","table_setColumnOrder","table_resetColumnOrder","table_getOrderColumnsFn","columnOrder","orderedColumns","remaining","orderColumns","grouping","groupedColumnMode","nonGroupingColumns","groupingColumns","columnOrderingFeature","getDefaultColumnPinningState","column_pin","columnIds","table_setColumnPinning","column_getCanPin","leafColumn","column_getIsPinned","start","end","column_getPinnedIndex","row_getCenterVisibleCells","allCells","startAndEnd","row_getStartVisibleCells","allVisibleCells","row_getEndVisibleCells","table_resetColumnPinning","table_getIsSomeColumnsPinned","pinningState","table_getStartHeaderGroups","orderedLeafColumns","table_getEndHeaderGroups","table_getCenterHeaderGroups","table_getStartFooterGroups","table_getEndFooterGroups","table_getCenterFooterGroups","table_getStartFlatHeaders","leftHeaderGroups","table_getEndFlatHeaders","rightHeaderGroups","table_getCenterFlatHeaders","centerHeaderGroups","table_getStartLeafHeaders","table_getEndLeafHeaders","table_getCenterLeafHeaders","table_getStartLeafColumns","table_getEndLeafColumns","table_getCenterLeafColumns","table_getPinnedLeafColumns","table_getStartVisibleLeafColumns","table_getEndVisibleLeafColumns","table_getCenterVisibleLeafColumns","table_getPinnedVisibleLeafColumns","columnPinning","itemsByColumnId","columnPinningFeature","getDefaultColumnSizingState","getDefaultColumnSizingColumnDef","column_getSize","defaultSizes","columnSizing","columnSize","buildColumnOffsets","starts","afters","sizes","size","table_getColumnOffsets","toOffsetsKey","column_getStart","column_getAfter","column_resetSize","table_setColumnSizing","sumHeaderSize","sum","header_getSize","header_getStart","prevSiblingHeader","table_resetColumnSizing","sumColumnSizes","table_getTotalSize","table_getStartTotalSize","table_getCenterTotalSize","table_getEndTotalSize","getDefaultColumnResizingState","column_getCanResize","column_getIsResizing","header_getResizeHandler","_contextDocument","canResize","isTouchStartEvent","startSize","columnSizingStart","leafHeader","clientX","newColumnSizing","updateOffset","eventType","clientXPos","isCommit","table_setColumnResizing","deltaDirection","deltaOffset","deltaPercentage","headerSize","moveRafId","hasPendingMove","latestMoveX","flushMove","onMove","onEnd","contextDocument","mouseEvents","touchEvents","touchEvent","removeTouchEvents","passiveIfSupported","passiveEventSupported","table_resetHeaderSizeInfo","passiveSupported","supported","noop","columnResizingFeature","columnSizingFeature","getDefaultColumnVisibilityState","column_toggleVisibility","visible","column_getCanHide","table_setColumnVisibility","nextVisible","column_getIsVisible","columnVisibility","childColumns","childColumn","column_getToggleVisibilityHandler","row_getVisibleCells","visibleCells","row_getVisibleCellsByColumnId","table_getVisibleFlatColumns","table_getVisibleLeafColumns","table_resetColumnVisibility","table_toggleAllColumnsVisible","table_getIsAllColumnsVisible","visibility","table_getIsSomeColumnsVisible","table_getToggleAllColumnsVisibilityHandler","columnVisibilityFeature","constructFilterFn","filterValue","addMeta","rawValue","dataValue","filterFn_includesString","val","testFalsy","column_getCanGlobalFilter","table_getGlobalAutoFilterFn","table_getGlobalFilterFn","globalFilterFn","table_setGlobalFilter","table_resetGlobalFilter","globalFilteringFeature","getDefaultExpandedState","table_autoResetExpanded","table_resetExpanded","table_setExpanded","table_toggleAllRowsExpanded","currentExpanded","table_getIsAllRowsExpanded","table_getCanSomeRowsExpand","initialExpanded","row_getCanExpand","table_getToggleAllRowsExpandedHandler","table_getIsSomeRowsExpanded","expandableRows","row_getIsExpanded","table_getExpandedDepth","splitId","row_toggleExpanded","currentExists","isExpandedRowId","targetExpanded","exists","oldExpanded","rowModelRow","rowIds","row_getIsAllParentsExpanded","isFullyExpanded","row_getToggleExpandedHandler","canExpand","createExpandedRowModel","_table","_createExpandedRowModel","expandRows","expandedRows","handleRow","rowExpandingFeature","defaultPageIndex","defaultPageSize","getDefaultPaginationState","table_autoResetPageIndex","table_resetPageIndex","table_setPagination","table_resetPagination","table_setPageIndex","maxPageIndex","table_resetPageSize","table_setPageSize","pageSize","topRowIndex","table_getPageOptions","table_getPageCount","pageOptions","_","table_getCanPreviousPage","table_getCanNextPage","table_getCanLastPage","table_previousPage","table_nextPage","table_firstPage","table_lastPage","configuredPageCount","rowCount","table_getRowCount","rowPaginationFeature","getDefaultRowSelectionState","table_setRowSelection","table_resetRowSelection","table_toggleAllRowsSelected","opts","table_getIsAllRowsSelected","rowSelection","preGroupedFlatRows","subtreeCache","isRowSelectableInSelectAll","row_getCanSelect","table_toggleAllPageRowsSelected","resolvedValue","table_getIsAllPageRowsSelected","mutateRowIsSelected","table_getPreSelectedRowModel","table_getSelectedRowModel","table_getIsSomeRowsSelected","selectRowsFn","table_getFilteredSelectedRowModel","table_getGroupedSelectedRowModel","table_getSelectedRowIds","isAllRowsSelected","isRowSelected","paginationFlatRows","sawSelectableRow","table_getIsSomePageRowsSelected","row_getIsSelected","row_getIsSomeSelected","table_getToggleAllRowsSelectedHandler","table_getToggleAllPageRowsSelectedHandler","row_toggleSelected","isSelected","row_getCanMultiSelect","pruneAncestorRowIds","isSubRowSelected","row_getIsAllSubRowsSelected","row_getCanSelectSubRows","row_getToggleSelectedHandler","canSelect","checked","anchorId","selectRowRange","includeChildren","anchorRow","anchorIndex","anchorAtIndex","rowAtIndex","rangeRow","respectCanSelectOnDeselect","r","cached","rowsById","visited","selectable","currentId","known","selectRowsRecursively","selectedFlatRows","selectedRowsById","newSubRows","cloned","newSelectedFlatRows","newSelectedRowsById","someSelected","allChildrenSelected","someSelectable","subRow","subRowChildrenSelected","rowSelectionFeature","rangeEvent","reSplitAlphaNumeric","constructSortFn","sortFn","rowA","rowB","dataValueA","dataValueB","resolveDataValue","sortFn_alphanumeric","toString","compareAlphanumeric","sortFn_datetime","toDateSortValue","sortFn_basic","compareBasic","aStr","bStr","ai","bi","aLen","bLen","aIsNumeric","isDigit","bIsNumeric","aEnd","findChunkEnd","bEnd","stringComparison","compareStringChunks","numericComparison","compareNumericChunks","countRemainingChunks","charCode","isNumeric","aStart","bStart","aLength","bLength","minLength","aCode","bCode","aSignificantStart","bSignificantStart","aSignificantLength","bSignificantLength","an","parseSmallInt","bn","getDefaultSortingState","table_setSorting","table_resetSorting","table_autoResetSorting","column_getAutoSortFn","firstRows","sortFnName","isString","column_getAutoSortDir","column_getSortFn","column_toggleSorting","desc","multi","nextSortingOrder","column_getNextSortingOrder","column_getCanMultiSort","hasManualValue","existingIndex","existingSorting","newSorting","sortAction","nextDesc","isMultiMode","column_getFirstSortDir","firstSortDirection","isSorted","column_getIsSorted","column_getCanSort","columnSort","column_getSortIndex","column_clearSorting","column_getToggleSortingHandler","canSort","rowSortingFeature","filterRows","filterRowImpl","filterRowModelFromLeafs","filterRowModelFromRoot","rowsToFilter","filterRow","newFilteredFlatRows","newFilteredRowsById","recurseFilterRows","filteredRows","newRow","addSubRowsToFlatArrays","filterData","flatRows","createFilteredRowModel","_createFilteredRowModel","columnFilters","globalFilter","hasGlobalFilter","resolvedColumnFilters","resolvedGlobalFilters","columnFilter","filterableIds","globallyFilterableColumns","currentColumnFilter","filterMeta","currentGlobalFilter","filterRowsImpl","createPaginatedRowModel","_createPaginatedRowModel","prePaginatedRowModel","pagination","paginatedRows","pageStart","pageEnd","seenFlatRows","createSortedRowModel","_createSortedRowModel","preSortedRowModel","sortedFlatRows","availableSorting","sort","resolvedSorting","sortEntry","compareRows","sortUndefined","isDesc","sortInt","aValue","bValue","aUndefined","bUndefined","sortData","sortedData","flatIndex","sortedSubRows","useIsomorphicLayoutEffect","useTable","rootSource","tableInstance","coreTable","prev","renderSnapshot","localeOf","meta","matchers","matcherFor","locale","matcher","makeTextMatcher","isEmptyTextModel","model","isEmptyFilterModel","m","quickText","dayOf","dataGridFilterFns","textFilterPasses","numberModelPasses","selectFilterPasses","dateRangeModelPasses","normalizeDiacritics","needle","searched","collators","getDataGridCollator","collator","isEmpty","compareEmpty","aEmpty","bEmpty","toNumber","parsed","toTime","compareDataGridText","empty","compareDataGridNumber","diff","compareDataGridDate","compareDataGridValues","kitText","kitNumber","kitDate","kitAuto","dataGridFeatures","DATA_GRID_SELECT_COLUMN_ID","DATA_GRID_EXPAND_COLUMN_ID","DATA_GRID_DEFAULT_MIN_SIZE","DATA_GRID_DEFAULT_MAX_SIZE","DATA_GRID_RESERVED_PREFIX","isUtilityColumnId","warn","isDevelopment","getDataGridColumnLabel","isDataGridColumnMasked","isDataGridCellMasked","privacy","getDataGridHostMask","isDataGridColumnPrivacyHidden","getDataGridSelectOptions","coreRows","dataMode","config","resolveDataGridSortFn","resolveDataGridFilterFn","isDataGridColumnSortable","isDataGridColumnFilterable","isDataGridColumnSearchable","getDataGridColumnRules","defaultRowHeaderId","isRowHeader","minSize","clampDataGridColumnSize","px","maxSize","resolveDataGridRowHeaderId","kitColumns","visibleOrderedIds","dataIds","resolveDataGridColumnOrder","declared","insertAt","back","at","validColumns","warnColumnDeclarations","dataColumnDef","rules","utilityColumnDef","kind","buildDataGridColumns","kitGroups","groupOf","group","leaves","declaredOrder","emittedGroups","groupId","members","candidate","positions","explicitRowHeader","leaf","defs","leafDef","doneGroups","groupDef","surface","frameVariants","cva","scrollerVariants","slotVariants","pagerRangeVariants","busyVariants","tableVariants","colVariants","spacerVariants","cellVariants","depthVariants","headerContentVariants","insetRing","sortButtonVariants","sortIconVariants","sortPriorityVariants","separatorVariants","resizableHeadCellClass","expanderIconVariants","noneMarkVariants","detailContentVariants","skeletonBarVariants","stateCellVariants","editorVariants","editorFieldVariants","EDITOR_COMPACT_FIELDS_CLASS","editorErrorVariants","inlineHiddenTextClass","maskVariants","DataGridEditor","edit","descriptionId","onNumberValidityChange","tone","invalid","describedBy","numberFieldId","useId","builtIn","unit","FormFieldContext","NumberInput","validity","TextInput","Select","option","DG_CONTROL_ATTR","isEditableTarget","rowControlOf","useShiftCapture","shift","onPointerDown","onKeyDown","take","fallback","resizeWidthForKey","shiftKey","direction","min","max","step","widen","narrow","ownRows","body","findOwnRow","ownRowOf","node","ownCellOf","ownControl","control","element","findControl","focusRowControl","navigation","now","attempt","tries","handleBodyKeyDown","useFocusMemory","bodyRef","scrollRef","keepMounted","onFocusedColumnIndex","memory","focused","lost","navigationRef","onFocusIn","cellIndex","onFocusOut","active","atBody","was","scroller","NO_PIN","columnKind","pinStyle","presentation","isPrintable","kit","nameId","idBase","itemIndex","detailId","headerNameId","SelectionCellContent","labelId","selectState","selectReason","jsxs","Fragment","VisuallyHidden","frozen","reason","Checkbox","ExpanderCellContent","controlsId","IconButton","accessibleTargetSquareClass","ChevronRight","DataCellContent","columnLabel","errorId","rowReadOnly","numberValidity","setNumberValidity","numberEditorError","numberEdit","privacyMask","editable","isReadOnly","levelText","hostError","rowMasked","formatError","error","hostDescription","labelRead","content","sameRowModel","sameBodyRow","BodyRowImpl","ariaRowIndex","virtualIndex","measureRef","detailMountedId","density","pins","rowHeaderColumnId","Tag","indent","className","style","BodyRow","DetailRow","columnCount","renderDetail","DataGridBody","mounted","virtualised","padStart","padEnd","measureElement","ariaRowIndexOf","stateRows","mountedSet","bodyStyle","gapBefore","gap","selectability","MAX_SORT_LEVELS","MASKED","isMaskedPlaceholder","canonical","_key","sorted","refuse","code","detail","findColumn","isMaskedForWrite","knownRow","readFilter","view","readQuickFilter","SELECTION_RESULT_SCHEMA","dataGridAgent","pinned","selection","DataGridFooter","footRef","getFooterContext","contextOnce","footer","TEXT_OPERATORS","NUMBER_OPERATORS","panelVariants","actionsVariants","rangeVariants","rangeFieldVariants","optionListVariants","emptyVariants","PanelForm","onSubmit","onClear","clearLabel","applyLabel","Button","accessibleTargetBlockClass","TextFilterPanel","onApply","operators","operator","setOperator","draft","setDraft","operatorOptions","op","FormField","StateBackedTextInput","NumberFilterPanel","setPrimary","secondary","setSecondary","takesValue","takesRange","mode","commit","visibleLabel","SelectFilterPanel","setPending","selectValueKey","o","allChecked","someChecked","toggle","values","DateRangeFilterPanel","lazy","triggerWrapVariants","activeDotVariants","panelLoadingVariants","DataGridFilterTrigger","open","setOpen","name","title","panelProps","Popover","Funnel","Suspense","Spinner","SortButton","Icon","ArrowUp","ArrowDown","ChevronsUpDown","ResizeSeparator","edgeDivider","clamp","width","handler","ref","unsized","measured","setMeasured","renderedWidth","observer","pinRenderedWidth","flushSync","FilterSlot","stickFor","spansAll","LeafHeaderCell","measurePinned","showAll","selectAllId","canFilter","hasControls","GroupHeaderCell","first","printable","DataGridHeader","headRef","groups","DataGridPager","caption","pageRowCount","pageSizeOptions","showEndpoints","loading","onPageChange","onPageSizeChange","unknown","totalPages","range","Pagination","nextFrame","resolve","useDataGridPrint","printing","setPrinting","savedScroll","inProgress","begin","saved","onBefore","onAfter","print","SKELETON_WIDTHS","DataGridSkeletonRows","Skeleton","DataGridStateRow","onClearFilters","EmptyState","dateFormatter","valueCell","dates","isCalendarDay","day","fromIsoDate","footerCell","buildDataGridExportSnapshot","cellOf","own","align","resolveDataGridSelectability","resolveDataGridSelectAllScope","scope","runtime","normaliseDataGridSelection","getDataGridRangeIds","fromId","toId","selectDataGridRange","drop","toggleDataGridRow","anchor","modifiers","getDataGridHeaderState","candidates","getDataGridSelectAllBlock","shared","toggleAllDataGridRows","createDataGridSelectionApi","getDataGridDisplayColumns","resolved","startSet","endSet","centre","groupsIntact","list","side","planDataGridColumnMove","toIndex","createDataGridHandle","getRuntime","defaultSource","sourceOf","columnMasked","displayColumns","other","keep","explicit","sizing","canHide","plan","defaults","effective","bindings","DATA_GRID_PERSISTED_SLICES","DATA_GRID_PERSIST_DEBOUNCE_MS","getDataGridColumnStateKey","gridId","getStorage","isRecord","isStringArray","validateOrder","raw","ctx","validateSizing","sanitiseDataGridPinning","allowed","breaksGroup","mySide","validatePinning","validateVisibility","validateDataGridColumnState","loaded","loadDataGridColumnState","storage","buildDataGridColumnStateEnvelope","envelope","strip","saveDataGridColumnState","clearDataGridColumnState","warnControlledPersistenceOverlap","overlap","createDataGridColumnStatePersister","debounceMs","write","cancel","onPageHide","isTierHidden","tier","containerInlineSize","defaultResponsiveColumns","isColumnEffectivelyVisible","computeEffectiveVisibility","mergeVisibilityChange","effectiveBefore","effectiveAfter","isDataColumn","CHANGE_KIND","isMasked","captions","dataGridSeamCaption","seam","createDataGridToolbarSeam","userHandle","isServer","columnById","facetAllowed","info","fileName","writeTableCsv","snapshotToTable","exportFileName","indexRows","getRowId","getSubRows","walk","PERSISTED","valueText","useDataGridEngine","columnGroups","getRowCanExpand","getRowSelectability","server","expandable","columnResizing","paginated","paginationConfig","multiSort","maxSortLevels","expandMode","rangeSelection","persistEnabled","responsive","focusedColumnId","dataColumns","maskedColumnIds","selectabilityCache","getSelectability","lockedRowIds","toStoredSelection","getColumnDefaults","optionsRef","lockedRef","storeContext","seededRef","sizeOptions","initialPage","initial","seeded","subscribeStore","quickFilter","explicitVisibility","visibilityInput","effectiveVisibility","isEffectiveSortColumn","colId","isEvaluatedFilterKey","v9Sorting","v9ColumnFilters","pageForV9","v9Pagination","v9RowSelection","v9Expanded","v9Visibility","v9Pinning","v9Order","v9Handlers","l","previousIds","nextIds","opened","newest","tableRef","isRowMaskedAnywhere","visibleOrderedDataIds","tableMeta","host","headerId","headerColumn","getRowCount","getPageCount","getClampPageCount","selectAllScope","selectionRuntime","pageRows","openDetails","renderedItemCount","hasKnownSize","fixed","visibleStart","visibleEnd","layout","getExportSnapshot","exportColumns","toolbarOptionsCacheRef","getColumnToolbarInfo","hiddenByPrivacy","perRows","bindingsRef","persisterRef","runtimeRef","toolbarSeam","bindRenderer","lastRowsRef","lastFilteredRef","lastPrivacyRef","rowsChanged","filteredChanged","filtered","lastFiltered","persister","rowCountMissing","DATA_GRID_OVERSCAN","FALLBACK_ROW_PX","useVirtualRows","enabled","getScrollElement","getItemKey","rowSizePx","headSize","footSize","focusedRef","rangeExtractor","defaultRangeExtractor","estimate","virtualizer","useVirtualizer","virtualItems","totalSize","previousEnd","scrollToIndex","setFocusedIndex","GridScope","DataGridContext","DataGridRegistryContext","pageItems","withDetail","itemCount","colKind","useBlockSize","setSize","read","DataGridInner","persistColumnState","registerAgent","onQueryChange","defaultSorting","onSortingChange","defaultFilters","onFiltersChange","defaultQuickFilter","onQuickFilterChange","filterLabels","defaultPage","defaultRowSelection","onRowSelectionChange","defaultColumnVisibility","onColumnVisibilityChange","defaultColumnPinning","onColumnPinningChange","defaultColumnSizing","onColumnSizingChange","defaultColumnOrder","onColumnOrderChange","responsiveColumns","defaultExpanded","onExpandedChange","isRowReadOnly","readOnly","rowLabelPrivacySafe","hostTextPrivacySafe","toolbar","height","virtualization","ariaLabel","ariaLabelledBy","ariaDescribedBy","captionId","rootRef","rootScrollRef","composeRefs","useDirection","setFocusedColumnId","setContainerInlineSize","engine","useImperativeHandle","useAgentRegistration","componentId","readOnlyReason","registry","useDataGridRegistry","registerDataGridToolbarSeam","dataGridMountSignal","startColumns","centreColumns","endColumns","visibleColumns","pinnedNodes","pinWidths","setPinWidths","readPinWidths","pinObserver","startKey","endKey","map","offset","startPinnedTotal","endPinnedTotal","hasPinned","indexById","fixedLayout","groupRowRef","groupRowSize","theadRef","composedHeadRef","setRowSizePx","virtual","computed","headerRowCount","rowsMissing","showRows","rowNumbers","details","base","all","totalItems","firstOnPage","visibleIdsRef","live","window_","nav","visibleIds","focusIn","announcing","latestModel","multiSortHint","rangeHint","hintIds","colgroups","runs","runIndex","sized","groupRowNode","thead","table_","extras","customProperties","rootStyle","contextValue","ScrollArea","DataGrid","forwardRef"],"mappings":"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","x_google_ignoreList":[3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71]}