apex-grid 3.5.0 → 4.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (215) hide show
  1. package/CHANGELOG.md +573 -0
  2. package/LICENSE.md +125 -0
  3. package/README.md +143 -23
  4. package/components/cell.d.ts +43 -5
  5. package/components/cell.js +225 -64
  6. package/components/cell.js.map +1 -1
  7. package/components/filter-row.d.ts +2 -0
  8. package/components/filter-row.js +82 -28
  9. package/components/filter-row.js.map +1 -1
  10. package/components/grid.d.ts +281 -49
  11. package/components/grid.js +600 -159
  12. package/components/grid.js.map +1 -1
  13. package/components/group-header-row.js +28 -25
  14. package/components/group-header-row.js.map +1 -1
  15. package/components/header-row.d.ts +6 -10
  16. package/components/header-row.js +12 -28
  17. package/components/header-row.js.map +1 -1
  18. package/components/header.js +71 -22
  19. package/components/header.js.map +1 -1
  20. package/components/paginator.d.ts +20 -5
  21. package/components/paginator.js +54 -17
  22. package/components/paginator.js.map +1 -1
  23. package/components/row.d.ts +19 -3
  24. package/components/row.js +211 -56
  25. package/components/row.js.map +1 -1
  26. package/components/toolbar.d.ts +5 -1
  27. package/components/toolbar.js +6 -2
  28. package/components/toolbar.js.map +1 -1
  29. package/components/virtualize-rows.d.ts +38 -0
  30. package/components/virtualize-rows.js +286 -0
  31. package/components/virtualize-rows.js.map +1 -0
  32. package/components/virtualizer.d.ts +111 -1
  33. package/components/virtualizer.js +192 -5
  34. package/components/virtualizer.js.map +1 -1
  35. package/controllers/dom.d.ts +14 -7
  36. package/controllers/dom.js +45 -27
  37. package/controllers/dom.js.map +1 -1
  38. package/controllers/editing.d.ts +104 -37
  39. package/controllers/editing.js +230 -78
  40. package/controllers/editing.js.map +1 -1
  41. package/controllers/expansion.d.ts +14 -5
  42. package/controllers/expansion.js +24 -1
  43. package/controllers/expansion.js.map +1 -1
  44. package/controllers/filter.d.ts +10 -2
  45. package/controllers/filter.js +62 -17
  46. package/controllers/filter.js.map +1 -1
  47. package/controllers/history.d.ts +45 -8
  48. package/controllers/history.js +58 -20
  49. package/controllers/history.js.map +1 -1
  50. package/controllers/navigation.d.ts +130 -13
  51. package/controllers/navigation.js +474 -60
  52. package/controllers/navigation.js.map +1 -1
  53. package/controllers/pagination.d.ts +13 -6
  54. package/controllers/pagination.js +29 -22
  55. package/controllers/pagination.js.map +1 -1
  56. package/controllers/reorder.js +38 -22
  57. package/controllers/reorder.js.map +1 -1
  58. package/controllers/resize.d.ts +17 -2
  59. package/controllers/resize.js +16 -6
  60. package/controllers/resize.js.map +1 -1
  61. package/controllers/row-pin.d.ts +26 -2
  62. package/controllers/row-pin.js +24 -11
  63. package/controllers/row-pin.js.map +1 -1
  64. package/controllers/row-reorder.d.ts +40 -12
  65. package/controllers/row-reorder.js +137 -43
  66. package/controllers/row-reorder.js.map +1 -1
  67. package/controllers/selection.d.ts +33 -4
  68. package/controllers/selection.js +49 -11
  69. package/controllers/selection.js.map +1 -1
  70. package/controllers/sort.d.ts +22 -2
  71. package/controllers/sort.js +30 -25
  72. package/controllers/sort.js.map +1 -1
  73. package/controllers/state.d.ts +74 -7
  74. package/controllers/state.js +117 -36
  75. package/controllers/state.js.map +1 -1
  76. package/controllers/tree.d.ts +15 -10
  77. package/controllers/tree.js +0 -0
  78. package/controllers/tree.js.map +1 -1
  79. package/custom-elements.json +5091 -1023
  80. package/docs/assets/hierarchy.js +1 -1
  81. package/docs/assets/highlight.css +15 -8
  82. package/docs/assets/navigation.js +1 -1
  83. package/docs/assets/search.js +1 -1
  84. package/docs/classes/ApexGrid.html +233 -87
  85. package/docs/classes/ApexGridPaginator.html +39 -8
  86. package/docs/classes/ApexGridToolbar.html +11 -7
  87. package/docs/functions/localize.html +2 -2
  88. package/docs/hierarchy.html +1 -1
  89. package/docs/index.html +159 -26
  90. package/docs/interfaces/ApexCellValidationFailedEvent.html +3 -2
  91. package/docs/interfaces/ApexCellValueChangedEvent.html +4 -2
  92. package/docs/interfaces/ApexCellValueChangingEvent.html +3 -2
  93. package/docs/interfaces/ApexGridEventMap.html +5 -2
  94. package/docs/interfaces/ApexPageChangedEvent.html +3 -1
  95. package/docs/interfaces/ApexRowEditEndedEvent.html +2 -1
  96. package/docs/interfaces/ApexRowEditStartedEvent.html +2 -1
  97. package/docs/interfaces/ApexRowMovingEvent.html +9 -3
  98. package/docs/interfaces/ApexRowPinningEvent.html +1 -1
  99. package/docs/interfaces/ApexTreeRowExpandedEvent.html +4 -1
  100. package/docs/interfaces/ApexTreeRowExpandingEvent.html +4 -1
  101. package/docs/interfaces/BaseApexCellContext.html +18 -5
  102. package/docs/interfaces/BaseApexEditorContext.html +20 -5
  103. package/docs/interfaces/BaseFilterExpression.html +3 -3
  104. package/docs/interfaces/CSVExportOptions.html +12 -4
  105. package/docs/interfaces/DataPipelineConfiguration.html +4 -9
  106. package/docs/interfaces/ExportOptions.html +5 -3
  107. package/docs/interfaces/GridExpansionConfiguration.html +6 -2
  108. package/docs/interfaces/GridRowReorderingConfiguration.html +1 -1
  109. package/docs/interfaces/GridSelectionConfiguration.html +19 -4
  110. package/docs/interfaces/PaginationConfiguration.html +11 -4
  111. package/docs/interfaces/PaginationState.html +4 -2
  112. package/docs/interfaces/SetStateResult.html +3 -2
  113. package/docs/interfaces/ValidatorContext.html +7 -2
  114. package/docs/media/_token-values.scss +118 -0
  115. package/docs/media/package.json +9 -5
  116. package/docs/modules.html +1 -1
  117. package/docs/types/DataPipelineParams.html +2 -2
  118. package/docs/types/ExportSource.html +6 -4
  119. package/docs/types/OperandKeys.html +9 -0
  120. package/docs/types/PaginationMode.html +5 -4
  121. package/docs/variables/EN_LOCALE.html +2 -2
  122. package/i18n/en.d.ts +7 -0
  123. package/i18n/en.js +7 -0
  124. package/i18n/en.js.map +1 -1
  125. package/i18n/es.js +7 -0
  126. package/i18n/es.js.map +1 -1
  127. package/internal/column-types.d.ts +38 -2
  128. package/internal/column-types.js +83 -55
  129. package/internal/column-types.js.map +1 -1
  130. package/internal/constants.d.ts +1 -2
  131. package/internal/constants.js +0 -4
  132. package/internal/constants.js.map +1 -1
  133. package/internal/document-styles.d.ts +30 -0
  134. package/internal/document-styles.js +48 -0
  135. package/internal/document-styles.js.map +1 -0
  136. package/internal/export.d.ts +45 -7
  137. package/internal/export.js +39 -34
  138. package/internal/export.js.map +1 -1
  139. package/internal/feature-module.d.ts +67 -3
  140. package/internal/feature-module.js +6 -0
  141. package/internal/feature-module.js.map +1 -1
  142. package/internal/flip.d.ts +28 -16
  143. package/internal/flip.js +42 -10
  144. package/internal/flip.js.map +1 -1
  145. package/internal/index.d.ts +7 -5
  146. package/internal/index.js +6 -4
  147. package/internal/index.js.map +1 -1
  148. package/internal/normalize-case.d.ts +8 -1
  149. package/internal/normalize-case.js +3 -2
  150. package/internal/normalize-case.js.map +1 -1
  151. package/internal/state-snapshot.d.ts +60 -8
  152. package/internal/state-snapshot.js +87 -19
  153. package/internal/state-snapshot.js.map +1 -1
  154. package/internal/types.d.ts +92 -21
  155. package/internal/types.js.map +1 -1
  156. package/internal/utils.d.ts +34 -6
  157. package/internal/utils.js +30 -21
  158. package/internal/utils.js.map +1 -1
  159. package/internal/validators.js +1 -0
  160. package/internal/validators.js.map +1 -1
  161. package/operations/filter/operands/number.js +9 -6
  162. package/operations/filter/operands/number.js.map +1 -1
  163. package/operations/filter/operands/string.js +2 -3
  164. package/operations/filter/operands/string.js.map +1 -1
  165. package/operations/filter/types.d.ts +14 -2
  166. package/operations/filter/types.js.map +1 -1
  167. package/operations/filter.d.ts +6 -0
  168. package/operations/filter.js +23 -7
  169. package/operations/filter.js.map +1 -1
  170. package/operations/quick-filter.js +2 -5
  171. package/operations/quick-filter.js.map +1 -1
  172. package/operations/sort.d.ts +21 -2
  173. package/operations/sort.js +41 -14
  174. package/operations/sort.js.map +1 -1
  175. package/package.json +9 -4
  176. package/setup.d.ts +11 -0
  177. package/setup.js +9 -19
  178. package/setup.js.map +1 -1
  179. package/styles/_token-values.css.d.ts +1 -0
  180. package/styles/_token-values.css.js +3 -0
  181. package/styles/_token-values.css.js.map +1 -0
  182. package/styles/_tokens.css.js +1 -1
  183. package/styles/_tokens.css.js.map +1 -1
  184. package/styles/body-cell/body-cell.css.js +1 -1
  185. package/styles/body-cell/body-cell.css.js.map +1 -1
  186. package/styles/body-cell/cell-renderers.css.js +1 -1
  187. package/styles/body-cell/cell-renderers.css.js.map +1 -1
  188. package/styles/body-row/body-row.css.js +1 -1
  189. package/styles/body-row/body-row.css.js.map +1 -1
  190. package/styles/document-tokens.css.d.ts +1 -0
  191. package/styles/document-tokens.css.js +3 -0
  192. package/styles/document-tokens.css.js.map +1 -0
  193. package/styles/filter-row/filter-row.css.js +1 -1
  194. package/styles/filter-row/filter-row.css.js.map +1 -1
  195. package/styles/grid/_grid.base.css.js +1 -1
  196. package/styles/grid/_grid.base.css.js.map +1 -1
  197. package/styles/grid/grid.css.js +1 -1
  198. package/styles/grid/grid.css.js.map +1 -1
  199. package/styles/group-header-row/group-header-row.css.js +1 -1
  200. package/styles/group-header-row/group-header-row.css.js.map +1 -1
  201. package/styles/header-cell/header-cell.css.js +1 -1
  202. package/styles/header-cell/header-cell.css.js.map +1 -1
  203. package/styles/header-row/header-row.base.css.js +1 -1
  204. package/styles/header-row/header-row.base.css.js.map +1 -1
  205. package/styles/paginator/paginator.css.js +1 -1
  206. package/styles/paginator/paginator.css.js.map +1 -1
  207. package/styles/toolbar/toolbar.css.js +1 -1
  208. package/styles/toolbar/toolbar.css.js.map +1 -1
  209. package/tokens.css +78 -0
  210. package/LICENSE +0 -80
  211. package/docs/media/LICENSE +0 -80
  212. package/docs/media/_tokens.scss +0 -214
  213. package/operations/pagination.d.ts +0 -19
  214. package/operations/pagination.js +0 -12
  215. package/operations/pagination.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import { ContextProvider } from '@lit/context';
2
- import { nothing } from 'lit';
2
+ import { nothing, type PropertyDeclaration } from 'lit';
3
3
  import { DataOperationsController } from '../controllers/data-operation.js';
4
4
  import { GridDOMController } from '../controllers/dom.js';
5
5
  import type { RowPinPosition } from '../controllers/row-pin.js';
@@ -116,7 +116,8 @@ export interface ApexCellValueChangingEvent<T extends object> {
116
116
  */
117
117
  key: Keys<T>;
118
118
  /**
119
- * The view-relative row index (matches {@link ApexGrid.pageItems}).
119
+ * The view-relative row index (matches {@link ApexGrid.pageItems}), or
120
+ * -1 when the record is pinned or on another page.
120
121
  */
121
122
  rowIndex: number;
122
123
  /**
@@ -142,7 +143,9 @@ export interface ApexCellValueChangedEvent<T extends object> {
142
143
  */
143
144
  key: Keys<T>;
144
145
  /**
145
- * The view-relative row index after the change.
146
+ * The view-relative row index after the change (matches
147
+ * {@link ApexGrid.pageItems}), or -1 when the record is pinned or on
148
+ * another page. Use `data` to identify the row.
146
149
  */
147
150
  rowIndex: number;
148
151
  /**
@@ -164,7 +167,8 @@ export interface ApexCellValidationFailedEvent<T extends object> {
164
167
  */
165
168
  key: Keys<T>;
166
169
  /**
167
- * The view-relative row index of the rejected cell.
170
+ * The view-relative row index of the rejected cell, or -1 when the record
171
+ * is pinned or on another page.
168
172
  */
169
173
  rowIndex: number;
170
174
  /**
@@ -203,6 +207,14 @@ export interface ApexRowMovingEvent<T extends object> {
203
207
  from: number;
204
208
  /** The target row's view index. */
205
209
  to: number;
210
+ /** Whether the row lands before or after the target row. */
211
+ position: RowDropPosition;
212
+ /**
213
+ * The view index the row lands at, resolved from `to` and `position`
214
+ * (`moveRow(0, 3)` lands the row at 2). Splice the row out of `from` and in
215
+ * at `toIndex` to mirror the move.
216
+ */
217
+ toIndex: number;
206
218
  /** The row being moved (a live reference into {@link ApexGrid.data}). */
207
219
  data: T;
208
220
  }
@@ -227,7 +239,8 @@ export interface ApexStateChangedEvent {
227
239
  */
228
240
  export interface ApexRowEditStartedEvent {
229
241
  /**
230
- * The view-relative row index entering edit mode.
242
+ * The view-relative row index entering edit mode, or -1 when the record is
243
+ * pinned or on another page.
231
244
  */
232
245
  rowIndex: number;
233
246
  }
@@ -236,7 +249,8 @@ export interface ApexRowEditStartedEvent {
236
249
  */
237
250
  export interface ApexRowEditEndedEvent {
238
251
  /**
239
- * The view-relative row index that left edit mode.
252
+ * The view-relative row index that left edit mode, or -1 when the record is
253
+ * pinned or on another page.
240
254
  */
241
255
  rowIndex: number;
242
256
  /**
@@ -324,6 +338,11 @@ export interface ApexRowSelectedEvent<T extends object> {
324
338
  }
325
339
  /**
326
340
  * Event payload for the cancellable `treeRowExpanding` event.
341
+ *
342
+ * @remarks
343
+ * A parent that exists only as a path segment (no row of its own in
344
+ * {@link ApexGrid.data}) appears in these arrays as a synthesized placeholder
345
+ * row, not as one of your records.
327
346
  */
328
347
  export interface ApexTreeRowExpandingEvent<T extends object> {
329
348
  /** Rows that will become expanded by this change. */
@@ -337,6 +356,11 @@ export interface ApexTreeRowExpandingEvent<T extends object> {
337
356
  }
338
357
  /**
339
358
  * Event payload for the `treeRowExpanded` event.
359
+ *
360
+ * @remarks
361
+ * A parent that exists only as a path segment (no row of its own in
362
+ * {@link ApexGrid.data}) appears in these arrays as a synthesized placeholder
363
+ * row, not as one of your records.
340
364
  */
341
365
  export interface ApexTreeRowExpandedEvent<T extends object> {
342
366
  /** Rows that became expanded in this change. */
@@ -550,6 +574,9 @@ export interface ApexGridEventMap<T extends object> {
550
574
  * Fires for programmatic changes (including `setState`) as well as user
551
575
  * interaction. To avoid a save loop, compare the snapshot to your last-saved
552
576
  * one before persisting (identical snapshots never fire a second time).
577
+ * Attach the listener to the grid element itself: the snapshot is computed
578
+ * only for listeners registered on the grid, so a listener on an ancestor
579
+ * (event delegation) receives nothing while none is attached to the grid.
553
580
  *
554
581
  * @event
555
582
  */
@@ -700,11 +727,37 @@ export interface ApexGridEventMap<T extends object> {
700
727
  * @fires treeRowExpanding - Cancellable. Emitted before a tree-row expansion change (tree mode).
701
728
  * @fires treeRowExpanded - Emitted after a tree-row expansion change has been applied.
702
729
  *
730
+ * @csspart table - The element with the `grid` (or `treegrid`) role, `aria-rowcount` and `aria-colcount`: holds the header rows, pinned rows and body.
703
731
  * @csspart live-region - Visually-hidden ARIA live region used for screen-reader announcements.
732
+ * @csspart paginator-host - The `<apex-grid-paginator>` element; the grid re-exports its parts below.
733
+ * @csspart paginator - The paginator's root container.
734
+ * @csspart paginator-size - The page-size selector wrapper.
735
+ * @csspart paginator-info - The "1-25 of 100" summary.
736
+ * @csspart paginator-controls - The first/prev/next/last button cluster.
737
+ * @csspart paginator-page - The "page / count" label.
738
+ * @csspart paginator-button - Each of the first, previous, next and last buttons.
739
+ * @csspart paginator-first - The first page button.
740
+ * @csspart paginator-prev - The previous page button.
741
+ * @csspart paginator-next - The next page button.
742
+ * @csspart paginator-last - The last page button.
743
+ * @csspart toolbar-host - The `<apex-grid-toolbar>` element; the grid re-exports its parts below.
744
+ * @csspart toolbar - The toolbar's container.
745
+ * @csspart toolbar-search - The quick-filter input wrapper.
746
+ * @csspart search-field - The bordered field holding the search icon and input.
747
+ * @csspart search-icon - The leading search icon.
748
+ * @csspart search-input - The quick-filter input.
749
+ * @csspart toolbar-actions - The trailing actions area.
750
+ * @csspart toolbar-action - A host-contributed action button.
751
+ * @csspart export - The export menu wrapper.
752
+ * @csspart export-trigger - The export menu trigger button.
753
+ * @csspart export-icon - The download icon in the trigger.
754
+ * @csspart export-caret - The caret icon in the trigger.
755
+ * @csspart export-menu - The export dropdown menu.
756
+ * @csspart export-menu-item - An item in the export menu.
704
757
  *
705
758
  * @cssprop [--ag-brand] - Brand color for selection, focus rings, and accents. Auto-tints from `--ig-primary-500` where an Ignite UI palette is present.
706
759
  * @cssprop [--ag-brand-strong] - Brand color for hover / pressed states.
707
- * @cssprop [--ag-grid-shadow] - Grid edge/shadow override. Default is a flat 1px hairline edge; set to `var(--ag-shadow-card)` for the elevated card look, or `none` to remove it.
760
+ * @cssprop [--ag-grid-shadow] - Grid edge/shadow override. Default is a flat 1px hairline edge; set to `var(--ag-shadow-card)` (`var(--ag-dark-shadow-card)` on a dark grid) for the elevated card look, or `none` to remove it.
708
761
  * @cssprop [--ag-grid-bg] - Host card background. Defaults to a subtle light gradient; override with a flat color (or use `theme="dark"`) for dark themes.
709
762
  * @cssprop [--ag-surface] - Grid card background (must be opaque).
710
763
  * @cssprop [--ag-surface-alt] - Alternating row tint.
@@ -715,6 +768,17 @@ export interface ApexGridEventMap<T extends object> {
715
768
  * @cssprop [--ag-text-body] - Row text color.
716
769
  * @cssprop [--ag-text-muted] - Muted text (roles, labels).
717
770
  * @cssprop [--ag-row-hover] - Row hover wash.
771
+ * @cssprop [--ag-dark-grid-bg] - Host card background on `theme="dark"` grids. Dark grids read the `--ag-dark-*` colours instead of the light ones.
772
+ * @cssprop [--ag-dark-surface] - Grid card background on dark grids (must be opaque).
773
+ * @cssprop [--ag-dark-surface-alt] - Alternating row tint on dark grids.
774
+ * @cssprop [--ag-dark-surface-elevated] - Header background on dark grids.
775
+ * @cssprop [--ag-dark-hairline] - Header / structural gridline color on dark grids.
776
+ * @cssprop [--ag-dark-border] - Row separator color on dark grids.
777
+ * @cssprop [--ag-dark-text] - Primary text color on dark grids.
778
+ * @cssprop [--ag-dark-text-body] - Row text color on dark grids.
779
+ * @cssprop [--ag-dark-text-muted] - Muted text (roles, labels) on dark grids.
780
+ * @cssprop [--ag-dark-row-hover] - Row hover wash on dark grids.
781
+ * @cssprop [--ag-dark-shadow-card] - Elevated card shadow for dark grids (see `--ag-grid-shadow`).
718
782
  * @cssprop [--ag-row-h] - Row height.
719
783
  * @cssprop [--ag-header-h] - Header height.
720
784
  * @cssprop [--ag-radius] - Outer card corner radius.
@@ -735,6 +799,14 @@ export declare class ApexGrid<T extends object> extends EventEmitterBase<ApexGri
735
799
  #private;
736
800
  static get tagName(): string;
737
801
  static styles: import("lit").CSSResult;
802
+ /**
803
+ * The `rowRecycling` every grid starts with: `true` unless the page global
804
+ * `__apexRowKeying` is `'item'`, which the test runner sets for its second
805
+ * suite run so every grid in it keeps record-keyed rows.
806
+ *
807
+ * @internal Test-only, for the suite-wide keying switch. Not public API.
808
+ */
809
+ static defaultRowRecycling: boolean;
738
810
  /**
739
811
  * Registers `<apex-grid>` and its internal dependencies with the custom-element
740
812
  * registry. Idempotent — safe to call more than once.
@@ -769,8 +841,14 @@ export declare class ApexGrid<T extends object> extends EventEmitterBase<ApexGri
769
841
  protected _rows: NodeListOf<ApexGridRow<T>>;
770
842
  /** Column configuration for the grid. */
771
843
  columns: Array<ColumnConfiguration<T>>;
772
- /** The data source for the grid. */
773
- data: Array<T>;
844
+ /**
845
+ * The data source for the grid. `null` or `undefined` (a framework prop that
846
+ * is still loading) is stored as an empty array.
847
+ *
848
+ * @default []
849
+ */
850
+ get data(): Array<T>;
851
+ set data(value: Array<T>);
774
852
  /**
775
853
  * Optional stable row-identity resolver.
776
854
  *
@@ -841,8 +919,10 @@ export declare class ApexGrid<T extends object> extends EventEmitterBase<ApexGri
841
919
  * {@link DataPipelineConfiguration.quickFilter}.
842
920
  *
843
921
  * @attr quick-filter
922
+ * @default ''
844
923
  */
845
- quickFilter: string;
924
+ get quickFilter(): string;
925
+ set quickFilter(value: string);
846
926
  /**
847
927
  * Whether the built-in quick-filter input is rendered in the toolbar.
848
928
  *
@@ -931,6 +1011,33 @@ export declare class ApexGrid<T extends object> extends EventEmitterBase<ApexGri
931
1011
  * @attr column-separator
932
1012
  */
933
1013
  columnSeparator: boolean;
1014
+ /**
1015
+ * Reuses body row elements across records. On by default: a scroll, sort or
1016
+ * filter re-binds the rendered rows to the records now in view instead of
1017
+ * building rows for them, which makes jumps and sorts cheaper on large
1018
+ * grids. Set to `false` (or the `row-recycling="false"` attribute) to
1019
+ * restore record-keyed rows, where each row element stays with its record.
1020
+ * `undefined` or `null` (a framework prop that was set and then dropped)
1021
+ * restores the default, so only `false` opts out.
1022
+ *
1023
+ * @remarks
1024
+ * A row element (and its cells) shows another record after a scroll or a
1025
+ * sort, so cell and editor templates must derive everything they render
1026
+ * from their context on each render, and must not keep state in the
1027
+ * elements they create. `ctx.row` and `ctx.parent` are row and cell
1028
+ * elements that may show another record later: read `ctx.data` for the
1029
+ * record, and do not hold `ctx.row` or `ctx.parent` across an `await`. A
1030
+ * template that keeps element state wraps itself in
1031
+ * `keyed(ctx.data, html...)` so the state never shows on the wrong record
1032
+ * (it is rebuilt on every rebind). Turn recycling off for templates that
1033
+ * must keep element state across a sort or a move, such as some
1034
+ * third-party widgets.
1035
+ *
1036
+ * @attr row-recycling
1037
+ * @default true
1038
+ */
1039
+ get rowRecycling(): boolean;
1040
+ set rowRecycling(value: boolean);
934
1041
  /**
935
1042
  * Inline editing configuration for the grid.
936
1043
  *
@@ -951,13 +1058,14 @@ export declare class ApexGrid<T extends object> extends EventEmitterBase<ApexGri
951
1058
  * @remarks
952
1059
  * Selection is disabled by default. Set `enabled: true` and (optionally)
953
1060
  * `mode` (`'single' | 'multiple'`) and `showCheckboxColumn` to opt in.
1061
+ * `isRowSelectable` keeps chosen rows (a pinned total row) out of it.
954
1062
  *
955
1063
  * @example
956
1064
  * ```ts
957
1065
  * grid.selection = { enabled: true, mode: 'multiple', showCheckboxColumn: true };
958
1066
  * ```
959
1067
  */
960
- selection?: GridSelectionConfiguration;
1068
+ selection?: GridSelectionConfiguration<T>;
961
1069
  /**
962
1070
  * The currently selected rows, in insertion order.
963
1071
  *
@@ -974,7 +1082,8 @@ export declare class ApexGrid<T extends object> extends EventEmitterBase<ApexGri
974
1082
  * adding to it in `'multiple'` mode.
975
1083
  *
976
1084
  * @returns `true` if the selection changed, `false` if the change was
977
- * rejected by a `rowSelecting` listener or selection is disabled.
1085
+ * rejected by a `rowSelecting` listener, the row is not selectable
1086
+ * (`selection.isRowSelectable`) or selection is disabled.
978
1087
  */
979
1088
  selectRow(row: T): Promise<boolean>;
980
1089
  /**
@@ -986,8 +1095,8 @@ export declare class ApexGrid<T extends object> extends EventEmitterBase<ApexGri
986
1095
  */
987
1096
  toggleRowSelection(row: T): Promise<boolean>;
988
1097
  /**
989
- * Selects every row in the current view ({@link dataView}). No-op in
990
- * `'single'` selection mode.
1098
+ * Selects every selectable row in the current view ({@link dataView}).
1099
+ * No-op in `'single'` selection mode.
991
1100
  */
992
1101
  selectAllRows(): Promise<boolean>;
993
1102
  /**
@@ -1061,6 +1170,25 @@ export declare class ApexGrid<T extends object> extends EventEmitterBase<ApexGri
1061
1170
  * stay `true` by default.
1062
1171
  */
1063
1172
  columnMenu: boolean;
1173
+ /**
1174
+ * Whether the column header rows are shown. On by default. Set to `false`
1175
+ * (or the `show-header="false"` attribute) for a compact table, such as a
1176
+ * short dashboard tile, where the rows get the header's room.
1177
+ *
1178
+ * @remarks
1179
+ * Hidden headers take no space, paint nothing and take no pointer, and the
1180
+ * built-in header controls leave the tab order, so resizing, the column
1181
+ * menu, drag reorder and the filter panel are unavailable until the header
1182
+ * returns (an open column menu closes). A focusable control rendered by a
1183
+ * `headerTemplate` stays in the tab order: give it `tabindex="-1"` while
1184
+ * the header is hidden. The column header row
1185
+ * stays in the accessibility tree, so screen readers still announce the
1186
+ * column names, and `aria-rowcount` / `aria-rowindex` do not change. Sort,
1187
+ * filter, column widths and the page are kept.
1188
+ *
1189
+ * @attr show-header
1190
+ */
1191
+ showHeader: boolean;
1064
1192
  /**
1065
1193
  * Column groups rendered as spanning headers above the column header row.
1066
1194
  *
@@ -1165,16 +1293,24 @@ export declare class ApexGrid<T extends object> extends EventEmitterBase<ApexGri
1165
1293
  isTreeRowExpanded(row: T): boolean;
1166
1294
  /**
1167
1295
  * Set the sort state for the grid.
1296
+ *
1297
+ * @remarks
1298
+ * Replaces the current sort; `[]`, `null` or `undefined` clears it. Applied
1299
+ * at the next update, against the columns as they are then.
1168
1300
  */
1169
- set sortExpressions(expressions: SortExpression<T>[]);
1301
+ set sortExpressions(expressions: SortExpression<T>[] | null | undefined);
1170
1302
  /**
1171
1303
  * Get the sort state for the grid.
1172
1304
  */
1173
1305
  get sortExpressions(): SortExpression<T>[];
1174
1306
  /**
1175
1307
  * Set the filter state for the grid.
1308
+ *
1309
+ * @remarks
1310
+ * Replaces the current filter; `[]`, `null` or `undefined` clears it. Applied
1311
+ * at the next update, against the columns as they are then.
1176
1312
  */
1177
- set filterExpressions(expressions: FilterExpression<T>[]);
1313
+ set filterExpressions(expressions: FilterExpression<T>[] | null | undefined);
1178
1314
  /**
1179
1315
  * Get the filter state for the grid.
1180
1316
  */
@@ -1184,7 +1320,9 @@ export declare class ApexGrid<T extends object> extends EventEmitterBase<ApexGri
1184
1320
  *
1185
1321
  * @remarks
1186
1322
  * Since the grid has virtualization, this property returns only the currently rendered
1187
- * chunk of elements in the DOM.
1323
+ * chunk of elements in the DOM. With `rowRecycling` on (the default) an element can
1324
+ * show another record after a scroll, sort or filter; read its `data` each time
1325
+ * rather than keeping the element as a handle to a record.
1188
1326
  */
1189
1327
  get rows(): ApexGridRow<T>[];
1190
1328
  /**
@@ -1200,30 +1338,49 @@ export declare class ApexGrid<T extends object> extends EventEmitterBase<ApexGri
1200
1338
  * Use this when you need to iterate the columns in the same order the grid
1201
1339
  * actually displays them (for example to build a column chooser). Public APIs
1202
1340
  * like {@link ApexGrid.getColumn} continue to operate on the user-supplied
1203
- * {@link ApexGrid.columns} array.
1341
+ * {@link ApexGrid.columns} array. Each read builds a new array, so read it
1342
+ * once and keep the result rather than reading it inside a loop.
1204
1343
  */
1205
1344
  get displayColumns(): ReadonlyArray<ColumnConfiguration<T>>;
1206
1345
  /**
1207
- * The total number of items in the {@link ApexGrid.dataView} collection.
1346
+ * The post-filter, post-sort row count. With pagination enabled it counts
1347
+ * the rows paged through, so rows pinned to the top or bottom (they show on
1348
+ * every page) are left out. In `'remote'` pagination mode, the
1349
+ * `pagination.totalItems` you supplied (the rows the server holds for the
1350
+ * current filter).
1208
1351
  *
1209
1352
  * @remarks
1210
- * This is always the post-filter, post-sort row count — pagination does not change it.
1211
- * Use {@link ApexGrid.pageItems} to read the rows currently rendered into the body.
1353
+ * The current page does not change it. Use {@link ApexGrid.pageItems} to read
1354
+ * the rows currently rendered into the body.
1212
1355
  */
1213
1356
  get totalItems(): number;
1357
+ /**
1358
+ * The rows the body pages through: {@link ApexGrid.dataView} without the
1359
+ * pinned rows, which render in their own sticky bands on every page. The
1360
+ * page slice and the page count both read it, so they always agree.
1361
+ */
1362
+ protected get bodyRows(): ReadonlyArray<T>;
1214
1363
  /**
1215
1364
  * The records currently rendered into the virtualized body.
1216
1365
  *
1217
1366
  * @remarks
1218
- * Equal to {@link ApexGrid.dataView} when pagination is disabled. With pagination
1219
- * enabled (`'local'` mode) this is the active page slice.
1367
+ * Equal to {@link ApexGrid.dataView} without the pinned rows when pagination is
1368
+ * disabled. With pagination enabled (`'local'` mode) this is the active page slice.
1220
1369
  */
1221
1370
  get pageItems(): ReadonlyArray<T>;
1222
1371
  /**
1223
1372
  * The current zero-based page index.
1373
+ *
1374
+ * @remarks
1375
+ * Navigates like {@link ApexGrid.gotoPage}, with the cancellable
1376
+ * `pageChanging` and the `pageChanged` events. Assigned before the first
1377
+ * render, or while a data, filter or quick filter change has yet to render,
1378
+ * the page is kept as given and clamped once the view settles, without those
1379
+ * events.
1224
1380
  */
1225
1381
  get page(): number;
1226
1382
  set page(value: number);
1383
+ requestUpdate(name?: PropertyKey, oldValue?: unknown, options?: PropertyDeclaration, useNewValue?: boolean, newValue?: unknown): void;
1227
1384
  /**
1228
1385
  * The current page size.
1229
1386
  */
@@ -1234,13 +1391,34 @@ export declare class ApexGrid<T extends object> extends EventEmitterBase<ApexGri
1234
1391
  */
1235
1392
  get pageCount(): number;
1236
1393
  protected watchColumns(_: ColumnConfiguration<T>[], newConfig?: ColumnConfiguration<T>[]): void;
1394
+ /**
1395
+ * The records undo history, the manual row order and row pins may still
1396
+ * name after {@link ApexGrid.data} changes; anything naming another record is
1397
+ * dropped. Defaults to `data`. A row model that writes only part of a larger
1398
+ * record set into `data` (rows under a collapsed group leave `data` but stay
1399
+ * cached and come back as the same objects) overrides this to also yield the
1400
+ * records it keeps, so a collapse does not wipe them. Read only while there
1401
+ * is history, a manual order or a pin to reconcile.
1402
+ */
1403
+ protected historyRecords(): Iterable<T>;
1237
1404
  protected dataChanged(): void;
1238
- protected pipeline(): Promise<void>;
1239
1405
  protected paginationChanged(): void;
1240
1406
  protected quickFilterChanged(): void;
1407
+ /** The first render shapes the tree in dataChanged; later changes rebuild it. */
1408
+ protected treeChanged(previous?: GridTreeConfiguration<T>): void;
1409
+ protected pipeline(): Promise<void>;
1410
+ /**
1411
+ * Resolves once the pending update, the pipeline runs it started and the
1412
+ * render of their result have settled. Events that report the new view
1413
+ * (`sorted`, `filtered`, `pageChanged`, `quickFilterChanged`) await this,
1414
+ * so with an async pipeline hook they fire after the rows changed.
1415
+ */
1416
+ protected pipelineSettled(): Promise<void>;
1417
+ protected willUpdate(changed: Map<PropertyKey, unknown>): void;
1241
1418
  protected updated(): void;
1242
1419
  addEventListener<K extends keyof M, M extends ApexGridEventMap<T> & HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: M[K]) => unknown, options?: boolean | AddEventListenerOptions): void;
1243
1420
  removeEventListener<K extends keyof M, M extends ApexGridEventMap<T> & HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: M[K]) => unknown, options?: boolean | EventListenerOptions): void;
1421
+ connectedCallback(): void;
1244
1422
  protected firstUpdated(): void;
1245
1423
  /**
1246
1424
  * Performs a filter operation in the grid based on the passed expression(s).
@@ -1357,7 +1535,7 @@ export declare class ApexGrid<T extends object> extends EventEmitterBase<ApexGri
1357
1535
  /**
1358
1536
  * Applies a new quick-filter (global search) value, emitting the cancellable
1359
1537
  * `quickFilterChanging` event first and the `quickFilterChanged` event after the
1360
- * pipeline has run.
1538
+ * pipeline has run. Moving back to the first page fires `pageChanged` too.
1361
1539
  *
1362
1540
  * @param value - The new quick-filter value. Pass `''` to clear.
1363
1541
  * @returns `true` if the change was applied, `false` if cancelled or a no-op.
@@ -1409,7 +1587,9 @@ export declare class ApexGrid<T extends object> extends EventEmitterBase<ApexGri
1409
1587
  */
1410
1588
  unpinColumn(key: Keys<T>): Promise<boolean>;
1411
1589
  /**
1412
- * The cell currently in edit mode, or `null`.
1590
+ * The cell currently in edit mode, or `null`. `rowIndex` is view-relative
1591
+ * (matches {@link ApexGrid.pageItems}), or -1 when the edited record is
1592
+ * pinned or on another page.
1413
1593
  */
1414
1594
  get editingCell(): {
1415
1595
  rowIndex: number;
@@ -1417,7 +1597,8 @@ export declare class ApexGrid<T extends object> extends EventEmitterBase<ApexGri
1417
1597
  } | null;
1418
1598
  /**
1419
1599
  * The view-relative index of the row currently in edit mode (row edit mode
1420
- * only), or `null`.
1600
+ * only), or `null`. It is -1 when the edited record is pinned or on another
1601
+ * page.
1421
1602
  */
1422
1603
  get editingRow(): number | null;
1423
1604
  /**
@@ -1458,11 +1639,19 @@ export declare class ApexGrid<T extends object> extends EventEmitterBase<ApexGri
1458
1639
  * point: a thousand `editCell` round-trips would be a thousand entries in the
1459
1640
  * undo stack and a thousand re-renders.
1460
1641
  *
1461
- * `rowIndex` is view-relative and matches {@link ApexGrid.pageItems}, the same
1462
- * as {@link editCell}. Edits naming an unknown column, a row index out of
1463
- * range, or a column the user could not edit either (editing off, not
1464
- * `editable`, or hidden — the same gate interactive editing uses) are skipped
1465
- * rather than throwing, so a partially-stale batch still applies what it can.
1642
+ * Name each target cell's row in one of two ways. `rowIndex` is
1643
+ * view-relative and matches {@link ApexGrid.pageItems}, the same as
1644
+ * {@link editCell}, so it reaches the current page only. `row` is the record
1645
+ * itself (a live reference into {@link ApexGrid.data}), which also reaches
1646
+ * rows on other pages, pinned rows and rows under a collapsed tree parent;
1647
+ * their events and validators see `rowIndex` -1. A `rowIndex` must be a
1648
+ * whole number from 0 to `pageItems.length - 1`. Edits naming an unknown
1649
+ * column, any other row index (negative, fractional or past the end of the
1650
+ * page), a row a feature synthesized (a group header, a total, a row a
1651
+ * server has not sent yet), or a column the user could not edit
1652
+ * either (editing off, not `editable`, or hidden: the same gate interactive
1653
+ * editing uses) are skipped rather than throwing, so a partially-stale batch
1654
+ * still applies what it can.
1466
1655
  *
1467
1656
  * @param edits Cells to write. Order is preserved, so later edits to the same
1468
1657
  * cell win.
@@ -1470,22 +1659,21 @@ export declare class ApexGrid<T extends object> extends EventEmitterBase<ApexGri
1470
1659
  * changed; `unchanged`, `invalid` and `cancelled` explain the rest, so a caller
1471
1660
  * can tell a rejected batch from a no-op one.
1472
1661
  *
1473
- * @example Bulk-clear a column for the rows the user selected
1662
+ * @example Bulk-clear a column for the rows the user selected, on any page
1474
1663
  * ```ts
1475
- * grid.applyEdits(
1476
- * grid.selectedRows.map((row) => ({
1477
- * rowIndex: grid.pageItems.indexOf(row),
1478
- * column: 'discount',
1479
- * value: 0,
1480
- * }))
1481
- * );
1664
+ * grid.applyEdits(grid.selectedRows.map((row) => ({ row, column: 'discount', value: 0 })));
1482
1665
  * ```
1483
1666
  */
1484
1667
  applyEdits(edits: ReadonlyArray<{
1485
- rowIndex: number;
1486
1668
  column: Keys<T>;
1487
1669
  value: unknown;
1488
- }>): {
1670
+ } & ({
1671
+ rowIndex: number;
1672
+ row?: never;
1673
+ } | {
1674
+ row: T;
1675
+ rowIndex?: never;
1676
+ })>): {
1489
1677
  applied: number;
1490
1678
  unchanged: number;
1491
1679
  invalid: number;
@@ -1554,12 +1742,13 @@ export declare class ApexGrid<T extends object> extends EventEmitterBase<ApexGri
1554
1742
  * {@link ApexGrid.pageItems}.
1555
1743
  *
1556
1744
  * @remarks
1557
- * Requires `rowReordering.enabled`. Establishes a manual order (mutually
1558
- * exclusive with column sorting), goes through the cancellable `rowMoving`
1559
- * event, emits `rowMoved`, and animates the affected rows.
1745
+ * Requires `rowReordering.enabled`. Establishes a manual order and clears
1746
+ * any column sort (the two are mutually exclusive), goes through the
1747
+ * cancellable `rowMoving` event, emits `rowMoved`, and animates the affected
1748
+ * rows. Rows hidden by a filter keep their place in the order.
1560
1749
  *
1561
- * @returns `true` when applied, `false` when disabled, out of range, or
1562
- * cancelled.
1750
+ * @returns `true` when applied, `false` when disabled, out of range, a no-op
1751
+ * (the row would land where it already is), or cancelled.
1563
1752
  */
1564
1753
  moveRow(from: number, to: number, position?: RowDropPosition): boolean;
1565
1754
  /**
@@ -1631,13 +1820,38 @@ export declare class ApexGrid<T extends object> extends EventEmitterBase<ApexGri
1631
1820
  * ```
1632
1821
  */
1633
1822
  moveColumn(fromKey: Keys<T>, toKey: Keys<T>, position?: ColumnDropPosition): Promise<boolean>;
1823
+ /**
1824
+ * Whether `event` belongs to this grid, rather than to a grid nested inside
1825
+ * it (the grid in a master-detail panel renders inside one of this grid's
1826
+ * rows, so its events cross this grid's body on their way out). The first
1827
+ * grid, or grid body, on the composed path from the event origin outward is
1828
+ * the one that owns it.
1829
+ *
1830
+ * @param event - an event that reached this grid.
1831
+ */
1832
+ ownsEvent(event: Event): boolean;
1833
+ /**
1834
+ * The virtualizer is about to re-render a new range of rows. When the row
1835
+ * holding focus leaves it, its cell is removed and focus would fall to the
1836
+ * document, so the scroll container takes focus first and the keyboard
1837
+ * keeps working from the active cell.
1838
+ */
1839
+ protected bodyRangeChanged(event: Event): void;
1634
1840
  protected bodyClickHandler(event: MouseEvent): void;
1635
1841
  protected bodyKeydownHandler(event: KeyboardEvent): void;
1636
1842
  /**
1637
1843
  * Tabbing into the grid body lands on the scroll container; forward focus to
1638
1844
  * the active cell (when one exists) so the roving tab stop is honored.
1845
+ * Also tells navigation whether this body, not a grid nested in it, now
1846
+ * holds focus.
1639
1847
  */
1640
1848
  protected bodyFocusHandler(event: FocusEvent): void;
1849
+ /**
1850
+ * Focus left something in the body; see {@link NavigationController.focusLeft}.
1851
+ * Captured, so the body stops owning focus before a handler further down
1852
+ * (an editor committing on focus loss) runs and lets queued work see it.
1853
+ */
1854
+ protected bodyFocusOutHandler(event: FocusEvent): void;
1641
1855
  /**
1642
1856
  * Forwards body-cell pointer interactions (press / drag-over / release) to
1643
1857
  * feature modules via {@link StateController.handleCellInteraction}. Gated on
@@ -1647,10 +1861,12 @@ export declare class ApexGrid<T extends object> extends EventEmitterBase<ApexGri
1647
1861
  */
1648
1862
  protected bodyPointerHandler(event: PointerEvent): void;
1649
1863
  protected renderGroupHeaderRow(): import("lit-html").TemplateResult<1> | typeof nothing;
1864
+ /**
1865
+ * With {@link ApexGrid.showHeader} off the header rows stay in the DOM,
1866
+ * visually hidden, so assistive technology keeps the column names.
1867
+ */
1650
1868
  protected renderHeaderRow(): import("lit-html").TemplateResult<1>;
1651
1869
  protected renderBody(): import("lit-html").TemplateResult<1>;
1652
- /** Number of chrome rows above the body (group header + header + optional filter). */
1653
- protected get headerRowCount(): number;
1654
1870
  protected renderPinnedTop(): import("lit-html").TemplateResult<1> | typeof nothing;
1655
1871
  protected renderPinnedBottom(): import("lit-html").TemplateResult<1> | typeof nothing;
1656
1872
  protected renderFilterRow(): import("lit-html").TemplateResult<1> | typeof nothing;
@@ -1663,6 +1879,13 @@ export declare class ApexGrid<T extends object> extends EventEmitterBase<ApexGri
1663
1879
  * don't have to coordinate consumer DOM placement.
1664
1880
  */
1665
1881
  protected renderLiveRegion(): import("lit-html").TemplateResult<1>;
1882
+ /**
1883
+ * Floating "ghost" of the column header being dragged for reorder. Rendered
1884
+ * here, next to the row ghost, rather than in the header row: a fixed
1885
+ * element still paints inside its parent's stacking context, so inside the
1886
+ * header row it slid under the group header row and the pinned-top band.
1887
+ */
1888
+ protected renderColumnDragGhost(): import("lit-html").TemplateResult<1> | typeof nothing;
1666
1889
  /**
1667
1890
  * Floating "ghost" of the row being pointer-dragged for reorder. Rendered at
1668
1891
  * the top of the shadow tree (outside the virtualizer) so its `position: fixed`
@@ -1670,6 +1893,15 @@ export declare class ApexGrid<T extends object> extends EventEmitterBase<ApexGri
1670
1893
  * time so it mirrors the row's visible content and column widths.
1671
1894
  */
1672
1895
  protected renderRowDragGhost(): import("lit-html").TemplateResult<1> | typeof nothing;
1896
+ /**
1897
+ * The element with the `grid` (or `treegrid`) role and the table semantics.
1898
+ * It owns only rows: the header rows, the pinned bands and the body. The
1899
+ * toolbar, filter panel, paginator and live region stay outside it. The
1900
+ * host's own `aria-label`, `aria-labelledby` and `aria-describedby` name it:
1901
+ * referenced elements go through element reflection where the browser has
1902
+ * it, and their text is copied where it does not.
1903
+ */
1904
+ protected renderTable(): import("lit-html").TemplateResult<1>;
1673
1905
  protected render(): import("lit-html").TemplateResult<1>;
1674
1906
  /**
1675
1907
  * Sets the live region's announcement text. Screen readers configured to