apex-grid 1.1.0 → 3.0.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 (231) hide show
  1. package/LICENSE +76 -5
  2. package/README.md +523 -10
  3. package/components/cell.d.ts +39 -0
  4. package/components/cell.js +334 -5
  5. package/components/cell.js.map +1 -1
  6. package/components/filter-row.d.ts +7 -5
  7. package/components/filter-row.js +151 -68
  8. package/components/filter-row.js.map +1 -1
  9. package/components/grid.d.ts +955 -4
  10. package/components/grid.js +412 -40
  11. package/components/grid.js.map +1 -1
  12. package/components/header-row.d.ts +21 -1
  13. package/components/header-row.js +140 -7
  14. package/components/header-row.js.map +1 -1
  15. package/components/header.d.ts +7 -0
  16. package/components/header.js +151 -31
  17. package/components/header.js.map +1 -1
  18. package/components/paginator.d.ts +56 -0
  19. package/components/paginator.js +148 -0
  20. package/components/paginator.js.map +1 -0
  21. package/components/row.d.ts +21 -2
  22. package/components/row.js +185 -10
  23. package/components/row.js.map +1 -1
  24. package/components/toolbar.d.ts +60 -0
  25. package/components/toolbar.js +259 -0
  26. package/components/toolbar.js.map +1 -0
  27. package/components/virtualizer.js +1 -1
  28. package/components/virtualizer.js.map +1 -1
  29. package/controllers/data-operation.d.ts +14 -0
  30. package/controllers/data-operation.js +19 -2
  31. package/controllers/data-operation.js.map +1 -1
  32. package/controllers/dom.d.ts +37 -1
  33. package/controllers/dom.js +176 -9
  34. package/controllers/dom.js.map +1 -1
  35. package/controllers/editing.d.ts +130 -0
  36. package/controllers/editing.js +197 -0
  37. package/controllers/editing.js.map +1 -0
  38. package/controllers/expansion.d.ts +68 -0
  39. package/controllers/expansion.js +126 -0
  40. package/controllers/expansion.js.map +1 -0
  41. package/controllers/navigation.d.ts +17 -6
  42. package/controllers/navigation.js +24 -8
  43. package/controllers/navigation.js.map +1 -1
  44. package/controllers/pagination.d.ts +102 -0
  45. package/controllers/pagination.js +106 -0
  46. package/controllers/pagination.js.map +1 -0
  47. package/controllers/reorder.d.ts +78 -0
  48. package/controllers/reorder.js +124 -0
  49. package/controllers/reorder.js.map +1 -0
  50. package/controllers/selection.d.ts +109 -0
  51. package/controllers/selection.js +168 -0
  52. package/controllers/selection.js.map +1 -0
  53. package/controllers/sort.js +28 -0
  54. package/controllers/sort.js.map +1 -1
  55. package/controllers/state.d.ts +47 -1
  56. package/controllers/state.js +48 -1
  57. package/controllers/state.js.map +1 -1
  58. package/controllers/tree.d.ts +87 -0
  59. package/controllers/tree.js +0 -0
  60. package/controllers/tree.js.map +1 -0
  61. package/custom-elements.json +6491 -1355
  62. package/define.js.map +1 -1
  63. package/docs/assets/hierarchy.js +1 -1
  64. package/docs/assets/highlight.css +77 -14
  65. package/docs/assets/icons.js +1 -1
  66. package/docs/assets/icons.svg +1 -1
  67. package/docs/assets/main.js +4 -4
  68. package/docs/assets/navigation.js +1 -1
  69. package/docs/assets/search.js +1 -1
  70. package/docs/assets/style.css +3 -3
  71. package/docs/classes/ApexGrid.html +320 -24
  72. package/docs/functions/setup.html +16 -0
  73. package/docs/hierarchy.html +1 -1
  74. package/docs/index.html +543 -9
  75. package/docs/interfaces/ApexCellValueChangedEvent.html +11 -0
  76. package/docs/interfaces/ApexCellValueChangingEvent.html +13 -0
  77. package/docs/interfaces/ApexColumnMovedEvent.html +8 -0
  78. package/docs/interfaces/ApexColumnMovingEvent.html +11 -0
  79. package/docs/interfaces/ApexColumnPinnedEvent.html +6 -0
  80. package/docs/interfaces/ApexColumnPinningEvent.html +8 -0
  81. package/docs/interfaces/ApexDetailContext.html +8 -0
  82. package/docs/interfaces/ApexFilteredEvent.html +4 -4
  83. package/docs/interfaces/ApexFilteringEvent.html +4 -4
  84. package/docs/interfaces/ApexGridEventMap.html +60 -9
  85. package/docs/interfaces/ApexHeaderContext.html +4 -4
  86. package/docs/interfaces/ApexPageChangedEvent.html +10 -0
  87. package/docs/interfaces/ApexPageChangingEvent.html +10 -0
  88. package/docs/interfaces/ApexQuickFilterChangedEvent.html +4 -0
  89. package/docs/interfaces/ApexQuickFilterChangingEvent.html +6 -0
  90. package/docs/interfaces/ApexRowEditEndedEvent.html +6 -0
  91. package/docs/interfaces/ApexRowEditStartedEvent.html +4 -0
  92. package/docs/interfaces/ApexRowExpandedEvent.html +8 -0
  93. package/docs/interfaces/ApexRowExpandingEvent.html +11 -0
  94. package/docs/interfaces/ApexRowSelectedEvent.html +8 -0
  95. package/docs/interfaces/ApexRowSelectingEvent.html +11 -0
  96. package/docs/interfaces/ApexTreeRowExpandedEvent.html +8 -0
  97. package/docs/interfaces/ApexTreeRowExpandingEvent.html +10 -0
  98. package/docs/interfaces/BaseApexCellContext.html +12 -6
  99. package/docs/interfaces/BaseApexEditorContext.html +19 -0
  100. package/docs/interfaces/BaseColumnConfiguration.html +88 -14
  101. package/docs/interfaces/BaseColumnSortConfiguration.html +4 -4
  102. package/docs/interfaces/BaseFilterExpression.html +5 -5
  103. package/docs/interfaces/BaseSortExpression.html +4 -4
  104. package/docs/interfaces/CSVExportOptions.html +22 -0
  105. package/docs/interfaces/ColumnFilterConfiguration.html +3 -3
  106. package/docs/interfaces/DataPipelineConfiguration.html +13 -4
  107. package/docs/interfaces/ExportFormat.html +10 -0
  108. package/docs/interfaces/ExportOptions.html +15 -0
  109. package/docs/interfaces/GridEditingConfiguration.html +10 -0
  110. package/docs/interfaces/GridExpansionConfiguration.html +15 -0
  111. package/docs/interfaces/GridSelectionConfiguration.html +11 -0
  112. package/docs/interfaces/GridSortConfiguration.html +4 -4
  113. package/docs/interfaces/GridTreeConfiguration.html +33 -0
  114. package/docs/interfaces/PaginationConfiguration.html +18 -0
  115. package/docs/interfaces/PaginationState.html +10 -0
  116. package/docs/media/LICENSE +80 -0
  117. package/docs/media/_tokens.scss +106 -0
  118. package/docs/media/package.json +85 -0
  119. package/docs/modules.html +1 -1
  120. package/docs/types/ApexCellContext.html +2 -2
  121. package/docs/types/ApexEditorContext.html +2 -0
  122. package/docs/types/BasePropertyType.html +2 -2
  123. package/docs/types/BaseSortComparer.html +2 -2
  124. package/docs/types/ColumnConfiguration.html +2 -2
  125. package/docs/types/ColumnDropPosition.html +2 -0
  126. package/docs/types/ColumnSortConfiguration.html +2 -2
  127. package/docs/types/DataPipelineHook.html +2 -2
  128. package/docs/types/DataPipelineParams.html +5 -5
  129. package/docs/types/DataType.html +47 -2
  130. package/docs/types/EditMode.html +6 -0
  131. package/docs/types/EditTrigger.html +4 -0
  132. package/docs/types/ExportCellValue.html +5 -0
  133. package/docs/types/ExportSource.html +8 -0
  134. package/docs/types/FilterCriteria.html +2 -2
  135. package/docs/types/FilterExpression.html +2 -2
  136. package/docs/types/Keys.html +2 -2
  137. package/docs/types/PaginationMode.html +6 -0
  138. package/docs/types/PinPosition.html +5 -0
  139. package/docs/types/PropertyType.html +2 -2
  140. package/docs/types/SelectionMode.html +7 -0
  141. package/docs/types/SortComparer.html +2 -2
  142. package/docs/types/SortExpression.html +2 -2
  143. package/docs/types/SortState.html +2 -2
  144. package/docs/types/SortingDirection.html +1 -1
  145. package/index.d.ts +5 -2
  146. package/index.js +1 -0
  147. package/index.js.map +1 -1
  148. package/internal/column-types.d.ts +94 -0
  149. package/internal/column-types.js +428 -0
  150. package/internal/column-types.js.map +1 -0
  151. package/internal/export.d.ts +114 -0
  152. package/internal/export.js +122 -0
  153. package/internal/export.js.map +1 -0
  154. package/internal/feature-module.d.ts +27 -0
  155. package/internal/feature-module.js +2 -0
  156. package/internal/feature-module.js.map +1 -0
  157. package/internal/flip.d.ts +80 -0
  158. package/internal/flip.js +52 -0
  159. package/internal/flip.js.map +1 -0
  160. package/internal/icons.d.ts +31 -0
  161. package/internal/icons.js +145 -0
  162. package/internal/icons.js.map +1 -0
  163. package/internal/index.d.ts +20 -0
  164. package/internal/index.js +6 -0
  165. package/internal/index.js.map +1 -0
  166. package/internal/tags.d.ts +2 -0
  167. package/internal/tags.js +2 -0
  168. package/internal/tags.js.map +1 -1
  169. package/internal/types.d.ts +473 -3
  170. package/internal/types.js.map +1 -1
  171. package/internal/utils.d.ts +24 -1
  172. package/internal/utils.js +48 -7
  173. package/internal/utils.js.map +1 -1
  174. package/operations/filter/tree.d.ts +1 -1
  175. package/operations/filter/types.js.map +1 -1
  176. package/operations/pagination.d.ts +19 -0
  177. package/operations/pagination.js +12 -0
  178. package/operations/pagination.js.map +1 -0
  179. package/operations/quick-filter.d.ts +21 -0
  180. package/operations/quick-filter.js +26 -0
  181. package/operations/quick-filter.js.map +1 -0
  182. package/operations/sort/types.js.map +1 -1
  183. package/package.json +10 -5
  184. package/setup.d.ts +51 -0
  185. package/setup.js +31 -0
  186. package/setup.js.map +1 -0
  187. package/styles/_checkbox.css.js +3 -0
  188. package/styles/_checkbox.css.js.map +1 -0
  189. package/styles/_tokens.css.js +3 -0
  190. package/styles/_tokens.css.js.map +1 -0
  191. package/styles/body-cell/body-cell.css.js +1 -1
  192. package/styles/body-cell/body-cell.css.js.map +1 -1
  193. package/styles/body-cell/cell-renderers.css.js +3 -0
  194. package/styles/body-cell/cell-renderers.css.js.map +1 -0
  195. package/styles/body-row/body-row.css.js +1 -1
  196. package/styles/body-row/body-row.css.js.map +1 -1
  197. package/styles/filter-row/filter-row.css.js +1 -1
  198. package/styles/filter-row/filter-row.css.js.map +1 -1
  199. package/styles/grid/_grid.base.css.js +1 -1
  200. package/styles/grid/_grid.base.css.js.map +1 -1
  201. package/styles/grid/grid.css.js +3 -0
  202. package/styles/grid/grid.css.js.map +1 -0
  203. package/styles/header-cell/header-cell.css.js +1 -1
  204. package/styles/header-cell/header-cell.css.js.map +1 -1
  205. package/styles/header-row/header-row.base.css.js +1 -1
  206. package/styles/header-row/header-row.base.css.js.map +1 -1
  207. package/styles/paginator/paginator.css.d.ts +1 -0
  208. package/styles/paginator/paginator.css.js +3 -0
  209. package/styles/paginator/paginator.css.js.map +1 -0
  210. package/styles/toolbar/toolbar.css.d.ts +1 -0
  211. package/styles/toolbar/toolbar.css.js +3 -0
  212. package/styles/toolbar/toolbar.css.js.map +1 -0
  213. package/styles.css +17 -0
  214. package/internal/icon-registry.d.ts +0 -1
  215. package/internal/icon-registry.js +0 -29
  216. package/internal/icon-registry.js.map +0 -1
  217. package/internal/theming.d.ts +0 -34
  218. package/internal/theming.js +0 -123
  219. package/internal/theming.js.map +0 -1
  220. package/styles/grid/themes/light/grid.bootstrap.css.js +0 -3
  221. package/styles/grid/themes/light/grid.bootstrap.css.js.map +0 -1
  222. package/styles/grid/themes/light/grid.fluent.css.js +0 -3
  223. package/styles/grid/themes/light/grid.fluent.css.js.map +0 -1
  224. package/styles/grid/themes/light/grid.indigo.css.js +0 -3
  225. package/styles/grid/themes/light/grid.indigo.css.js.map +0 -1
  226. package/styles/grid/themes/light/grid.material.css.js +0 -3
  227. package/styles/grid/themes/light/grid.material.css.js.map +0 -1
  228. /package/styles/{grid/themes/light/grid.bootstrap.css.d.ts → _checkbox.css.d.ts} +0 -0
  229. /package/styles/{grid/themes/light/grid.fluent.css.d.ts → _tokens.css.d.ts} +0 -0
  230. /package/styles/{grid/themes/light/grid.indigo.css.d.ts → body-cell/cell-renderers.css.d.ts} +0 -0
  231. /package/styles/grid/{themes/light/grid.material.css.d.ts → grid.css.d.ts} +0 -0
package/docs/index.html CHANGED
@@ -1,10 +1,544 @@
1
- <!DOCTYPE html><html class="default" lang="en" data-base="./"><head><meta charset="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>apex-grid</title><meta name="description" content="Documentation for apex-grid"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="assets/style.css"/><link rel="stylesheet" href="assets/highlight.css"/><script defer src="assets/main.js"></script><script async src="assets/icons.js" id="tsd-icons-script"></script><script async src="assets/search.js" id="tsd-search-script"></script><script async src="assets/navigation.js" id="tsd-nav-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => window.app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><a href="index.html" class="title">apex-grid</a><div id="tsd-toolbar-links"></div><button id="tsd-search-trigger" class="tsd-widget" aria-label="Search"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="assets/icons.svg#icon-search"></use></svg></button><dialog id="tsd-search" aria-label="Search"><input role="combobox" id="tsd-search-input" aria-controls="tsd-search-results" aria-autocomplete="list" aria-expanded="true" autocapitalize="off" autocomplete="off" placeholder="Search the docs" maxLength="100"/><ul role="listbox" id="tsd-search-results"></ul><div id="tsd-search-status" aria-live="polite" aria-atomic="true"><div>Preparing search index...</div></div></dialog><a href="#" class="tsd-widget menu" id="tsd-toolbar-menu-trigger" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="assets/icons.svg#icon-menu"></use></svg></a></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><h1>apex-grid</h1></div><div class="tsd-panel tsd-typography"><h1 id="apex-data-component-grid" class="tsd-anchor-link">Apex data component grid<a href="#apex-data-component-grid" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h1><p><a href="https://github.com/apexcharts/apexgrid/actions/workflows/node.js.yml"><img src="https://github.com/apexcharts/apexgrid/actions/workflows/node.js.yml/badge.svg" alt="Node.js CI"></a>
2
- <a href="https://coveralls.io/github/apexcharts/apexgrid?branch=master"><img src="https://coveralls.io/repos/github/apexcharts/apexgrid/badge.svg?branch=master" alt="Coverage Status"></a></p>
3
- <p>This is still a <strong>very</strong> early proof of concept for a web component based data grid.</p>
4
- <h2 id="local-development" class="tsd-anchor-link">Local Development<a href="#local-development" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h2><ol>
5
- <li>Clone the repository.</li>
6
- <li>Run <code>npm install</code></li>
7
- <li>Play and explore the codebase.</li>
1
+ <!DOCTYPE html><html class="default" lang="en" data-base="./"><head><meta charset="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>apex-grid</title><meta name="description" content="Documentation for apex-grid"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="assets/style.css"/><link rel="stylesheet" href="assets/highlight.css"/><script defer src="assets/main.js"></script><script async src="assets/icons.js" id="tsd-icons-script"></script><script async src="assets/search.js" id="tsd-search-script"></script><script async src="assets/navigation.js" id="tsd-nav-script"></script><script async src="assets/hierarchy.js" id="tsd-hierarchy-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => window.app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><a href="index.html" class="title">apex-grid</a><div id="tsd-toolbar-links"></div><button id="tsd-search-trigger" class="tsd-widget" aria-label="Search"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="assets/icons.svg#icon-search"></use></svg></button><dialog id="tsd-search" aria-label="Search"><input role="combobox" id="tsd-search-input" aria-controls="tsd-search-results" aria-autocomplete="list" aria-expanded="true" autocapitalize="off" autocomplete="off" placeholder="Search the docs" maxLength="100"/><ul role="listbox" id="tsd-search-results"></ul><div id="tsd-search-status" aria-live="polite" aria-atomic="true"><div>Preparing search index...</div></div></dialog><a href="#" class="tsd-widget menu" id="tsd-toolbar-menu-trigger" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="assets/icons.svg#icon-menu"></use></svg></a></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><h1>apex-grid</h1></div><div class="tsd-panel tsd-typography"><h1 id="apex-grid" class="tsd-anchor-link">Apex Grid<a href="#apex-grid" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h1>
2
+ <p><a href="https://github.com/apexcharts/apex-grid/actions/workflows/node.js.yml"><img src="https://github.com/apexcharts/apex-grid/actions/workflows/node.js.yml/badge.svg?branch=main" alt="Node.js CI"></a>
3
+ <a href="https://coveralls.io/github/apexcharts/apex-grid?branch=main"><img src="https://coveralls.io/repos/github/apexcharts/apex-grid/badge.svg?branch=main" alt="Coverage Status"></a>
4
+ <a href="https://www.npmjs.com/package/apex-grid"><img src="https://img.shields.io/npm/v/apex-grid.svg" alt="npm"></a></p>
5
+ <p>A Lit-based, framework-agnostic web component data grid. Ships as a single custom element <code>&lt;apex-grid&gt;</code> with a rich, opt-in feature set and full TypeScript types.</p>
6
+ <h2 id="features" class="tsd-anchor-link">Features<a href="#features" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h2>
7
+ <ul>
8
+ <li><strong>Row virtualization</strong> via <code>@lit-labs/virtualizer</code> — only ~20 rows in the DOM at any time, regardless of dataset size.</li>
9
+ <li><strong>Sorting</strong> — single or multi-column, tri-state (asc / desc / none), per-column comparers.</li>
10
+ <li><strong>Filtering</strong> — per-column filter chips with string / number / boolean / date operands, plus a quick-filter (global search) input.</li>
11
+ <li><strong>Pagination</strong> — local slicing or remote mode with a <code>pageChanging</code> / <code>pageChanged</code> event pair; built-in <code>&lt;apex-grid-paginator&gt;</code>.</li>
12
+ <li><strong>Column pinning</strong> — pin to start or end; visual reordering only, source <code>columns</code> array is preserved.</li>
13
+ <li><strong>Column reordering</strong> — drag-and-drop with per-column opt-out, constrained to the column's pinning group.</li>
14
+ <li><strong>Column resizing</strong> — pointer-driven, with a min-width safeguard.</li>
15
+ <li><strong>Inline editing</strong> — cell or row mode, click or double-click trigger, per-column opt-in.</li>
16
+ <li><strong>Row selection</strong> — single or multiple, optional checkbox column, full programmatic API.</li>
17
+ <li><strong>Row expansion (master-detail)</strong> — opt-in chevron column with a <code>detailTemplate</code>.</li>
18
+ <li><strong>Tree data (nested rows)</strong> — AG Grid–style <code>getDataPath</code> pattern over a flat array.</li>
19
+ <li><strong>CSV export</strong> — programmatic method plus an optional toolbar dropdown. (Excel/XLSX export is in <code>apex-grid-enterprise</code>.)</li>
20
+ <li><strong>Toolbar</strong> — opt-in <code>&lt;apex-grid-toolbar&gt;</code> with debounced quick filter and export menu.</li>
21
+ <li><strong>Templating</strong> — slot-based templates for cells, headers, editors, and detail panels.</li>
22
+ <li><strong>Theming</strong> — styled out-of-the-box; fully customizable through <code>--ag-*</code> CSS custom properties (no theme import or build step). Auto-matches an <code>igniteui-webcomponents</code> host app when one is present.</li>
23
+ <li><strong>Accessibility</strong> — WCAG 2.2 AA semantics (<code>role=&quot;grid&quot;</code> / <code>role=&quot;treegrid&quot;</code>, <code>aria-rowcount</code>, <code>aria-colcount</code>, focus + keyboard navigation).</li>
24
+ <li><strong>Provenance-signed npm releases</strong> with OIDC trusted publishing.</li>
25
+ </ul>
26
+ <hr>
27
+ <h2 id="quick-start" class="tsd-anchor-link">Quick Start<a href="#quick-start" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h2>
28
+ <h3 id="one-call-setup" class="tsd-anchor-link">One-call setup<a href="#one-call-setup" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3>
29
+ <pre><code class="ts"><span class="hl-0">import</span><span class="hl-1"> { </span><span class="hl-2">setup</span><span class="hl-1"> } </span><span class="hl-0">from</span><span class="hl-1"> </span><span class="hl-3">&#39;apex-grid&#39;</span><span class="hl-1">;</span><br/><br/><span class="hl-4">setup</span><span class="hl-1">();</span>
30
+ </code><button type="button">Copy</button></pre>
31
+
32
+ <p>That single call registers <code>&lt;apex-grid&gt;</code> and adopts a default host stylesheet (<code>height: 100%; min-height: 240px</code>). The grid is styled out-of-the-box — no theme CSS import is required.</p>
33
+ <h3 id="render-the-grid" class="tsd-anchor-link">Render the grid<a href="#render-the-grid" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3>
34
+ <pre><code class="ts"><span class="hl-0">import</span><span class="hl-1"> { </span><span class="hl-2">html</span><span class="hl-1">, </span><span class="hl-2">render</span><span class="hl-1"> } </span><span class="hl-0">from</span><span class="hl-1"> </span><span class="hl-3">&#39;lit&#39;</span><span class="hl-1">;</span><br/><span class="hl-0">import</span><span class="hl-1"> </span><span class="hl-3">&#39;apex-grid/define&#39;</span><span class="hl-1">;</span><br/><span class="hl-0">import</span><span class="hl-1"> </span><span class="hl-0">type</span><span class="hl-1"> { </span><span class="hl-2">ColumnConfiguration</span><span class="hl-1"> } </span><span class="hl-0">from</span><span class="hl-1"> </span><span class="hl-3">&#39;apex-grid&#39;</span><span class="hl-1">;</span><br/><br/><span class="hl-5">type</span><span class="hl-1"> </span><span class="hl-6">User</span><span class="hl-1"> = { </span><span class="hl-2">id</span><span class="hl-1">: </span><span class="hl-6">number</span><span class="hl-1">; </span><span class="hl-2">name</span><span class="hl-1">: </span><span class="hl-6">string</span><span class="hl-1">; </span><span class="hl-2">age</span><span class="hl-1">: </span><span class="hl-6">number</span><span class="hl-1">; </span><span class="hl-2">subscribed</span><span class="hl-1">: </span><span class="hl-6">boolean</span><span class="hl-1"> };</span><br/><br/><span class="hl-5">const</span><span class="hl-1"> </span><span class="hl-7">data</span><span class="hl-1">: </span><span class="hl-6">User</span><span class="hl-1">[] = [</span><br/><span class="hl-1"> { </span><span class="hl-2">id:</span><span class="hl-1"> </span><span class="hl-8">1</span><span class="hl-1">, </span><span class="hl-2">name:</span><span class="hl-1"> </span><span class="hl-3">&#39;Ada Lovelace&#39;</span><span class="hl-1">, </span><span class="hl-2">age:</span><span class="hl-1"> </span><span class="hl-8">36</span><span class="hl-1">, </span><span class="hl-2">subscribed:</span><span class="hl-1"> </span><span class="hl-5">true</span><span class="hl-1"> },</span><br/><span class="hl-1"> { </span><span class="hl-2">id:</span><span class="hl-1"> </span><span class="hl-8">2</span><span class="hl-1">, </span><span class="hl-2">name:</span><span class="hl-1"> </span><span class="hl-3">&#39;Carl Sagan&#39;</span><span class="hl-1">, </span><span class="hl-2">age:</span><span class="hl-1"> </span><span class="hl-8">62</span><span class="hl-1">, </span><span class="hl-2">subscribed:</span><span class="hl-1"> </span><span class="hl-5">false</span><span class="hl-1"> },</span><br/><span class="hl-1"> { </span><span class="hl-2">id:</span><span class="hl-1"> </span><span class="hl-8">3</span><span class="hl-1">, </span><span class="hl-2">name:</span><span class="hl-1"> </span><span class="hl-3">&#39;Grace Hopper&#39;</span><span class="hl-1">, </span><span class="hl-2">age:</span><span class="hl-1"> </span><span class="hl-8">85</span><span class="hl-1">, </span><span class="hl-2">subscribed:</span><span class="hl-1"> </span><span class="hl-5">true</span><span class="hl-1"> },</span><br/><span class="hl-1">];</span><br/><br/><span class="hl-5">const</span><span class="hl-1"> </span><span class="hl-7">columns</span><span class="hl-1">: </span><span class="hl-6">ColumnConfiguration</span><span class="hl-1">&lt;</span><span class="hl-6">User</span><span class="hl-1">&gt;[] = [</span><br/><span class="hl-1"> { </span><span class="hl-2">key:</span><span class="hl-1"> </span><span class="hl-3">&#39;id&#39;</span><span class="hl-1">, </span><span class="hl-2">type:</span><span class="hl-1"> </span><span class="hl-3">&#39;number&#39;</span><span class="hl-1">, </span><span class="hl-2">headerText:</span><span class="hl-1"> </span><span class="hl-3">&#39;ID&#39;</span><span class="hl-1">, </span><span class="hl-2">width:</span><span class="hl-1"> </span><span class="hl-3">&#39;80px&#39;</span><span class="hl-1">, </span><span class="hl-2">sort:</span><span class="hl-1"> </span><span class="hl-5">true</span><span class="hl-1">, </span><span class="hl-2">filter:</span><span class="hl-1"> </span><span class="hl-5">true</span><span class="hl-1"> },</span><br/><span class="hl-1"> { </span><span class="hl-2">key:</span><span class="hl-1"> </span><span class="hl-3">&#39;name&#39;</span><span class="hl-1">, </span><span class="hl-2">type:</span><span class="hl-1"> </span><span class="hl-3">&#39;string&#39;</span><span class="hl-1">, </span><span class="hl-2">headerText:</span><span class="hl-1"> </span><span class="hl-3">&#39;Name&#39;</span><span class="hl-1">, </span><span class="hl-2">width:</span><span class="hl-1"> </span><span class="hl-3">&#39;240px&#39;</span><span class="hl-1">, </span><span class="hl-2">sort:</span><span class="hl-1"> </span><span class="hl-5">true</span><span class="hl-1">, </span><span class="hl-2">filter:</span><span class="hl-1"> </span><span class="hl-5">true</span><span class="hl-1"> },</span><br/><span class="hl-1"> { </span><span class="hl-2">key:</span><span class="hl-1"> </span><span class="hl-3">&#39;age&#39;</span><span class="hl-1">, </span><span class="hl-2">type:</span><span class="hl-1"> </span><span class="hl-3">&#39;number&#39;</span><span class="hl-1">, </span><span class="hl-2">headerText:</span><span class="hl-1"> </span><span class="hl-3">&#39;Age&#39;</span><span class="hl-1">, </span><span class="hl-2">width:</span><span class="hl-1"> </span><span class="hl-3">&#39;100px&#39;</span><span class="hl-1">, </span><span class="hl-2">sort:</span><span class="hl-1"> </span><span class="hl-5">true</span><span class="hl-1">, </span><span class="hl-2">filter:</span><span class="hl-1"> </span><span class="hl-5">true</span><span class="hl-1"> },</span><br/><span class="hl-1"> { </span><span class="hl-2">key:</span><span class="hl-1"> </span><span class="hl-3">&#39;subscribed&#39;</span><span class="hl-1">, </span><span class="hl-2">type:</span><span class="hl-1"> </span><span class="hl-3">&#39;boolean&#39;</span><span class="hl-1">, </span><span class="hl-2">headerText:</span><span class="hl-1"> </span><span class="hl-3">&#39;Subscribed&#39;</span><span class="hl-1">, </span><span class="hl-2">width:</span><span class="hl-1"> </span><span class="hl-3">&#39;140px&#39;</span><span class="hl-1">, </span><span class="hl-2">sort:</span><span class="hl-1"> </span><span class="hl-5">true</span><span class="hl-1">, </span><span class="hl-2">filter:</span><span class="hl-1"> </span><span class="hl-5">true</span><span class="hl-1"> },</span><br/><span class="hl-1">];</span><br/><br/><span class="hl-4">render</span><span class="hl-1">(</span><br/><span class="hl-1"> </span><span class="hl-4">html</span><span class="hl-3">`&lt;apex-grid .data=</span><span class="hl-5">${</span><span class="hl-2">data</span><span class="hl-5">}</span><span class="hl-3"> .columns=</span><span class="hl-5">${</span><span class="hl-2">columns</span><span class="hl-5">}</span><span class="hl-3">&gt;&lt;/apex-grid&gt;`</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">document</span><span class="hl-1">.</span><span class="hl-4">getElementById</span><span class="hl-1">(</span><span class="hl-3">&#39;app&#39;</span><span class="hl-1">)!,</span><br/><span class="hl-1">);</span>
35
+ </code><button type="button">Copy</button></pre>
36
+
37
+ <pre><code class="html"><span class="hl-9">&lt;</span><span class="hl-10">style</span><span class="hl-9">&gt;</span><br/><span class="hl-11"> </span><span class="hl-10">apex-grid</span><span class="hl-11"> { </span><span class="hl-12">height</span><span class="hl-11">: </span><span class="hl-8">480px</span><span class="hl-11">; }</span><br/><span class="hl-9">&lt;/</span><span class="hl-10">style</span><span class="hl-9">&gt;</span><br/><span class="hl-9">&lt;</span><span class="hl-10">div</span><span class="hl-1"> </span><span class="hl-12">id</span><span class="hl-1">=</span><span class="hl-13">&quot;app&quot;</span><span class="hl-9">&gt;&lt;/</span><span class="hl-10">div</span><span class="hl-9">&gt;</span>
38
+ </code><button type="button">Copy</button></pre>
39
+
40
+ <hr>
41
+ <h2 id="manual-setup-four-steps" class="tsd-anchor-link">Manual setup (four steps)<a href="#manual-setup-four-steps" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h2>
42
+ <p>If you'd rather not use <code>setup()</code>, this is what it does under the hood. Skipping any step produces a grid that &quot;runs&quot; but renders broken (no borders, no filter UI, or only a few collapsed rows).</p>
43
+ <h3 id="1-install" class="tsd-anchor-link">1. Install<a href="#1-install" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3>
44
+ <pre><code class="bash"><span class="hl-4">npm</span><span class="hl-1"> </span><span class="hl-3">install</span><span class="hl-1"> </span><span class="hl-3">apex-grid</span><span class="hl-1"> </span><span class="hl-3">lit</span>
45
+ </code><button type="button">Copy</button></pre>
46
+
47
+ <p><code>igniteui-webcomponents</code> ships as a transitive dependency — no separate install.</p>
48
+ <h3 id="2-register-the-custom-element" class="tsd-anchor-link">2. Register the custom element<a href="#2-register-the-custom-element" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3>
49
+ <pre><code class="ts"><span class="hl-0">import</span><span class="hl-1"> </span><span class="hl-3">&#39;apex-grid/define&#39;</span><span class="hl-1">;</span>
50
+ </code><button type="button">Copy</button></pre>
51
+
52
+ <p>Equivalent long form:</p>
53
+ <pre><code class="ts"><span class="hl-0">import</span><span class="hl-1"> { </span><span class="hl-2">ApexGrid</span><span class="hl-1"> } </span><span class="hl-0">from</span><span class="hl-1"> </span><span class="hl-3">&#39;apex-grid&#39;</span><span class="hl-1">;</span><br/><span class="hl-2">ApexGrid</span><span class="hl-1">.</span><span class="hl-4">register</span><span class="hl-1">();</span>
54
+ </code><button type="button">Copy</button></pre>
55
+
56
+ <p>Without this, <code>&lt;apex-grid&gt;</code> is an inert unknown element.</p>
57
+ <h3 id="3-optional-customize-the-look" class="tsd-anchor-link">3. (Optional) Customize the look<a href="#3-optional-customize-the-look" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3>
58
+ <p>The grid is styled out-of-the-box — there is no theme to import. Customize it by overriding the <code>--ag-*</code> CSS custom properties on <code>apex-grid</code> (or any ancestor); a one-line brand override cascades to every tint:</p>
59
+ <pre><code class="css"><span class="hl-10">apex-grid</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-12">--ag-brand</span><span class="hl-1">: </span><span class="hl-14">#7c3aed</span><span class="hl-1">; </span><span class="hl-15">/* selection, focus, accents */</span><br/><span class="hl-1"> </span><span class="hl-12">--ag-brand-strong</span><span class="hl-1">: </span><span class="hl-14">#6d28d9</span><span class="hl-1">; </span><span class="hl-15">/* hover / pressed */</span><br/><span class="hl-1"> </span><span class="hl-12">--ag-radius</span><span class="hl-1">: </span><span class="hl-8">12px</span><span class="hl-1">; </span><span class="hl-15">/* outer card radius */</span><br/><span class="hl-1"> </span><span class="hl-12">--ag-row-h</span><span class="hl-1">: </span><span class="hl-8">40px</span><span class="hl-1">; </span><span class="hl-15">/* row height */</span><br/><span class="hl-1">}</span>
60
+ </code><button type="button">Copy</button></pre>
61
+
62
+ <p>See <a href="media/_tokens.scss"><code>src/styles/_tokens.scss</code></a> for the full token list (brand, surfaces, text, semantic state colors, typography, spacing, motion).</p>
63
+ <p>If you embed the grid alongside <code>igniteui-webcomponents</code>, the brand tokens automatically re-tint from the igniteui palette (<code>--ig-primary-500</code>) — no configuration needed.</p>
64
+ <h3 id="4-size-the-host" class="tsd-anchor-link">4. Size the host<a href="#4-size-the-host" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3>
65
+ <p><code>@lit-labs/virtualizer</code> requires a <strong>bounded height</strong>. Without one, the virtualizer collapses to its natural content height (~150px) and only a few rows ever render.</p>
66
+ <pre><code class="css"><span class="hl-10">apex-grid</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-12">height</span><span class="hl-1">: </span><span class="hl-8">480px</span><span class="hl-1">; </span><span class="hl-15">/* any explicit pixel height; % works if the parent has a height */</span><br/><span class="hl-1">}</span>
67
+ </code><button type="button">Copy</button></pre>
68
+
69
+ <div class="tsd-alert tsd-alert-tip"><div class="tsd-alert-title"><svg width="16" height="16" viewBox="0 0 16 16" aria-hidden="true"><use href="assets/icons.svg#icon-alertTip"></use></svg><span>Tip</span></div><p>
70
+ <code>import 'apex-grid/styles.css'</code> ships a default rule that sets <code>height: 100%</code> with a <code>min-height: 240px</code> fallback.</p>
71
+ </div>
72
+ <div class="tsd-alert tsd-alert-important"><div class="tsd-alert-title"><svg width="16" height="16" viewBox="0 0 16 16" aria-hidden="true"><use href="assets/icons.svg#icon-alertImportant"></use></svg><span>Important</span></div><p>
73
+ <strong>Do not set <code>display</code> on <code>&lt;apex-grid&gt;</code>.</strong> The component declares <code>:host { display: grid }</code> internally for its track layout (header / filter / body). Any consumer rule that sets <code>display</code> (including <code>block</code>, <code>flex</code>, <code>inline-block</code>) collapses the grid. If you accidentally do this, the grid emits a one-shot <code>console.warn</code> at startup pointing here.</p>
74
+ </div>
75
+ <h3 id="what-success-looks-like" class="tsd-anchor-link">What success looks like<a href="#what-success-looks-like" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3>
76
+ <p>With the element registered and the host sized, you should see:</p>
77
+ <ul>
78
+ <li><strong>Visible borders</strong> between rows and columns.</li>
79
+ <li><strong>Sort arrows</strong> (↕) next to each header when <code>sort: true</code>.</li>
80
+ <li>A <strong>filter row</strong> below the headers with a &quot;Filter&quot; chip per column when <code>filter: true</code>.</li>
81
+ <li><strong>Hover state</strong> on rows.</li>
82
+ <li><strong>Smooth scrolling</strong> — DevTools shows only ~20 <code>&lt;apex-grid-row&gt;</code> elements at any time.</li>
83
+ </ul>
84
+ <h3 id="troubleshooting" class="tsd-anchor-link">Troubleshooting<a href="#troubleshooting" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3>
85
+ <table>
86
+ <thead>
87
+ <tr>
88
+ <th>What you see</th>
89
+ <th>Likely cause</th>
90
+ </tr>
91
+ </thead>
92
+ <tbody>
93
+ <tr>
94
+ <td>Want a different look / brand color</td>
95
+ <td>Step 3 — override the <code>--ag-*</code> CSS variables</td>
96
+ </tr>
97
+ <tr>
98
+ <td>Only ~3 rows visible regardless of data size</td>
99
+ <td>Step 4 — no bounded height, <strong>or</strong> consumer CSS sets <code>display</code> on <code>&lt;apex-grid&gt;</code> (check console for the warning)</td>
100
+ </tr>
101
+ <tr>
102
+ <td><code>&lt;apex-grid&gt;</code> blank tag in DOM</td>
103
+ <td>Step 2 — element not registered</td>
104
+ </tr>
105
+ <tr>
106
+ <td>Columns shown as literal <code>[object Object]</code></td>
107
+ <td><code>columns=</code> used as an attribute — must be a <strong>property</strong> (<code>.columns=${...}</code> in Lit, <code>[columns]=</code> in Angular, <code>:columns.prop=</code> in Vue, <code>el.columns = ...</code> in vanilla JS)</td>
108
+ </tr>
109
+ </tbody>
110
+ </table>
111
+ <hr>
112
+ <h2 id="features-in-depth" class="tsd-anchor-link">Features in depth<a href="#features-in-depth" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h2>
113
+ <p>Each feature below is fully opt-in — you only pay for what you turn on. Snippets assume <code>const grid = document.querySelector('apex-grid')!</code>.</p>
114
+ <h3 id="sorting" class="tsd-anchor-link">Sorting<a href="#sorting" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3>
115
+ <pre><code class="ts"><span class="hl-5">const</span><span class="hl-1"> </span><span class="hl-7">columns</span><span class="hl-1"> = [</span><br/><span class="hl-1"> { </span><span class="hl-2">key:</span><span class="hl-1"> </span><span class="hl-3">&#39;name&#39;</span><span class="hl-1">, </span><span class="hl-2">sort:</span><span class="hl-1"> </span><span class="hl-5">true</span><span class="hl-1"> }, </span><span class="hl-15">// UI sort + tri-state</span><br/><span class="hl-1"> { </span><span class="hl-2">key:</span><span class="hl-1"> </span><span class="hl-3">&#39;age&#39;</span><span class="hl-1">, </span><span class="hl-2">sort:</span><span class="hl-1"> { </span><span class="hl-2">direction:</span><span class="hl-1"> </span><span class="hl-3">&#39;desc&#39;</span><span class="hl-1"> } }, </span><span class="hl-15">// initial state</span><br/><span class="hl-1">];</span><br/><br/><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-2">sortConfiguration</span><span class="hl-1"> = { </span><span class="hl-2">multiple:</span><span class="hl-1"> </span><span class="hl-5">true</span><span class="hl-1">, </span><span class="hl-2">triState:</span><span class="hl-1"> </span><span class="hl-5">true</span><span class="hl-1"> };</span><br/><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-4">sort</span><span class="hl-1">({ </span><span class="hl-2">key:</span><span class="hl-1"> </span><span class="hl-3">&#39;age&#39;</span><span class="hl-1">, </span><span class="hl-2">direction:</span><span class="hl-1"> </span><span class="hl-3">&#39;asc&#39;</span><span class="hl-1"> });</span><br/><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-4">clearSort</span><span class="hl-1">(); </span><span class="hl-15">// or grid.clearSort(&#39;age&#39;)</span>
116
+ </code><button type="button">Copy</button></pre>
117
+
118
+ <p>Events: <code>sorting</code> (cancellable), <code>sorted</code>.</p>
119
+ <h3 id="filtering" class="tsd-anchor-link">Filtering<a href="#filtering" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3>
120
+ <pre><code class="ts"><span class="hl-5">const</span><span class="hl-1"> </span><span class="hl-7">columns</span><span class="hl-1"> = [</span><br/><span class="hl-1"> { </span><span class="hl-2">key:</span><span class="hl-1"> </span><span class="hl-3">&#39;name&#39;</span><span class="hl-1">, </span><span class="hl-2">filter:</span><span class="hl-1"> </span><span class="hl-5">true</span><span class="hl-1"> }, </span><span class="hl-15">// UI filter chip</span><br/><span class="hl-1"> { </span><span class="hl-2">key:</span><span class="hl-1"> </span><span class="hl-3">&#39;age&#39;</span><span class="hl-1">, </span><span class="hl-2">filter:</span><span class="hl-1"> </span><span class="hl-5">true</span><span class="hl-1">, </span><span class="hl-2">type:</span><span class="hl-1"> </span><span class="hl-3">&#39;number&#39;</span><span class="hl-1"> }, </span><span class="hl-15">// operands by type</span><br/><span class="hl-1">];</span><br/><br/><span class="hl-0">import</span><span class="hl-1"> { </span><span class="hl-2">StringOperands</span><span class="hl-1"> } </span><span class="hl-0">from</span><span class="hl-1"> </span><span class="hl-3">&#39;apex-grid&#39;</span><span class="hl-1">;</span><br/><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-4">filter</span><span class="hl-1">({ </span><span class="hl-2">key:</span><span class="hl-1"> </span><span class="hl-3">&#39;name&#39;</span><span class="hl-1">, </span><span class="hl-2">condition:</span><span class="hl-1"> </span><span class="hl-2">StringOperands</span><span class="hl-1">.</span><span class="hl-2">contains</span><span class="hl-1">, </span><span class="hl-2">searchTerm:</span><span class="hl-1"> </span><span class="hl-3">&#39;Ada&#39;</span><span class="hl-1"> });</span><br/><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-4">clearFilter</span><span class="hl-1">();</span>
121
+ </code><button type="button">Copy</button></pre>
122
+
123
+ <p>Operand classes: <code>StringOperands</code>, <code>NumberOperands</code>, <code>BooleanOperands</code>. Events: <code>filtering</code> (cancellable), <code>filtered</code>.</p>
124
+ <h3 id="quick-filter-global-search" class="tsd-anchor-link">Quick filter (global search)<a href="#quick-filter-global-search" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3>
125
+ <pre><code class="ts"><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-2">showQuickFilter</span><span class="hl-1"> = </span><span class="hl-5">true</span><span class="hl-1">; </span><span class="hl-15">// renders the toolbar input</span><br/><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-2">quickFilter</span><span class="hl-1"> = </span><span class="hl-3">&#39;ada&#39;</span><span class="hl-1">; </span><span class="hl-15">// or: await grid.setQuickFilter(&#39;ada&#39;)</span>
126
+ </code><button type="button">Copy</button></pre>
127
+
128
+ <p>Custom matcher via <code>dataPipelineConfiguration.quickFilter</code>. Events: <code>quickFilterChanging</code> (cancellable), <code>quickFilterChanged</code>. Attribute: <code>show-quick-filter</code>, <code>quick-filter</code>.</p>
129
+ <h3 id="pagination" class="tsd-anchor-link">Pagination<a href="#pagination" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3>
130
+ <pre><code class="ts"><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-2">pagination</span><span class="hl-1"> = {</span><br/><span class="hl-1"> </span><span class="hl-2">enabled:</span><span class="hl-1"> </span><span class="hl-5">true</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">pageSize:</span><span class="hl-1"> </span><span class="hl-8">25</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">pageSizeOptions:</span><span class="hl-1"> [</span><span class="hl-8">10</span><span class="hl-1">, </span><span class="hl-8">25</span><span class="hl-1">, </span><span class="hl-8">50</span><span class="hl-1">, </span><span class="hl-8">100</span><span class="hl-1">],</span><br/><span class="hl-1">};</span><br/><br/><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-4">gotoPage</span><span class="hl-1">(</span><span class="hl-8">2</span><span class="hl-1">);</span><br/><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-4">setPageSize</span><span class="hl-1">(</span><span class="hl-8">50</span><span class="hl-1">);</span><br/><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-4">nextPage</span><span class="hl-1">(); </span><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-4">previousPage</span><span class="hl-1">(); </span><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-4">firstPage</span><span class="hl-1">(); </span><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-4">lastPage</span><span class="hl-1">();</span>
131
+ </code><button type="button">Copy</button></pre>
132
+
133
+ <p>Remote mode:</p>
134
+ <pre><code class="ts"><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-2">pagination</span><span class="hl-1"> = { </span><span class="hl-2">enabled:</span><span class="hl-1"> </span><span class="hl-5">true</span><span class="hl-1">, </span><span class="hl-2">mode:</span><span class="hl-1"> </span><span class="hl-3">&#39;remote&#39;</span><span class="hl-1">, </span><span class="hl-2">pageSize:</span><span class="hl-1"> </span><span class="hl-8">25</span><span class="hl-1">, </span><span class="hl-2">totalItems:</span><span class="hl-1"> </span><span class="hl-8">1280</span><span class="hl-1"> };</span><br/><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-4">addEventListener</span><span class="hl-1">(</span><span class="hl-3">&#39;pageChanged&#39;</span><span class="hl-1">, </span><span class="hl-5">async</span><span class="hl-1"> (</span><span class="hl-2">e</span><span class="hl-1">) </span><span class="hl-5">=&gt;</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-2">data</span><span class="hl-1"> = </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-4">fetchPage</span><span class="hl-1">(</span><span class="hl-2">e</span><span class="hl-1">.</span><span class="hl-2">detail</span><span class="hl-1">.</span><span class="hl-2">page</span><span class="hl-1">, </span><span class="hl-2">e</span><span class="hl-1">.</span><span class="hl-2">detail</span><span class="hl-1">.</span><span class="hl-2">pageSize</span><span class="hl-1">);</span><br/><span class="hl-1">});</span>
135
+ </code><button type="button">Copy</button></pre>
136
+
137
+ <p>Properties: <code>page</code>, <code>pageSize</code>, <code>pageCount</code>, <code>totalItems</code>, <code>pageItems</code>. Events: <code>pageChanging</code> (cancellable), <code>pageChanged</code>.</p>
138
+ <h3 id="column-pinning" class="tsd-anchor-link">Column pinning<a href="#column-pinning" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3>
139
+ <pre><code class="ts"><span class="hl-5">const</span><span class="hl-1"> </span><span class="hl-7">columns</span><span class="hl-1"> = [</span><br/><span class="hl-1"> { </span><span class="hl-2">key:</span><span class="hl-1"> </span><span class="hl-3">&#39;id&#39;</span><span class="hl-1">, </span><span class="hl-2">pinned:</span><span class="hl-1"> </span><span class="hl-3">&#39;start&#39;</span><span class="hl-1"> },</span><br/><span class="hl-1"> { </span><span class="hl-2">key:</span><span class="hl-1"> </span><span class="hl-3">&#39;name&#39;</span><span class="hl-1"> },</span><br/><span class="hl-1"> { </span><span class="hl-2">key:</span><span class="hl-1"> </span><span class="hl-3">&#39;actions&#39;</span><span class="hl-1">, </span><span class="hl-2">pinned:</span><span class="hl-1"> </span><span class="hl-3">&#39;end&#39;</span><span class="hl-1"> },</span><br/><span class="hl-1">];</span><br/><br/><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-4">pinColumn</span><span class="hl-1">(</span><span class="hl-3">&#39;name&#39;</span><span class="hl-1">, </span><span class="hl-3">&#39;start&#39;</span><span class="hl-1">);</span><br/><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-4">unpinColumn</span><span class="hl-1">(</span><span class="hl-3">&#39;name&#39;</span><span class="hl-1">); </span><span class="hl-15">// or pinColumn(&#39;name&#39;, null)</span>
140
+ </code><button type="button">Copy</button></pre>
141
+
142
+ <p>The source <code>columns</code> array is <strong>not</strong> reordered — only the visual render order changes. Read <code>grid.displayColumns</code> for the render order. Events: <code>columnPinning</code> (cancellable), <code>columnPinned</code>.</p>
143
+ <h3 id="column-reordering" class="tsd-anchor-link">Column reordering<a href="#column-reordering" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3>
144
+ <pre><code class="html"><span class="hl-9">&lt;</span><span class="hl-10">apex-grid</span><span class="hl-1"> </span><span class="hl-12">column-reordering</span><span class="hl-9">&gt;&lt;/</span><span class="hl-10">apex-grid</span><span class="hl-9">&gt;</span>
145
+ </code><button type="button">Copy</button></pre>
146
+
147
+ <p>Or programmatic:</p>
148
+ <pre><code class="ts"><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-4">moveColumn</span><span class="hl-1">(</span><span class="hl-3">&#39;email&#39;</span><span class="hl-1">, </span><span class="hl-3">&#39;name&#39;</span><span class="hl-1">, </span><span class="hl-3">&#39;after&#39;</span><span class="hl-1">);</span>
149
+ </code><button type="button">Copy</button></pre>
150
+
151
+ <p>Per-column opt-out: <code>{ key: 'id', reorderable: false }</code>. Reordering is constrained to the column's own pinning group (start / unpinned / end). Events: <code>columnMoving</code> (cancellable), <code>columnMoved</code>. Attribute: <code>column-reordering</code>.</p>
152
+ <h3 id="inline-editing" class="tsd-anchor-link">Inline editing<a href="#inline-editing" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3>
153
+ <pre><code class="ts"><span class="hl-5">const</span><span class="hl-1"> </span><span class="hl-7">columns</span><span class="hl-1"> = [</span><br/><span class="hl-1"> { </span><span class="hl-2">key:</span><span class="hl-1"> </span><span class="hl-3">&#39;name&#39;</span><span class="hl-1">, </span><span class="hl-2">editable:</span><span class="hl-1"> </span><span class="hl-5">true</span><span class="hl-1"> },</span><br/><span class="hl-1"> { </span><span class="hl-2">key:</span><span class="hl-1"> </span><span class="hl-3">&#39;age&#39;</span><span class="hl-1">, </span><span class="hl-2">editable:</span><span class="hl-1"> </span><span class="hl-5">true</span><span class="hl-1">, </span><span class="hl-2">type:</span><span class="hl-1"> </span><span class="hl-3">&#39;number&#39;</span><span class="hl-1"> },</span><br/><span class="hl-1">];</span><br/><br/><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-2">editing</span><span class="hl-1"> = { </span><span class="hl-2">enabled:</span><span class="hl-1"> </span><span class="hl-5">true</span><span class="hl-1">, </span><span class="hl-2">mode:</span><span class="hl-1"> </span><span class="hl-3">&#39;cell&#39;</span><span class="hl-1">, </span><span class="hl-2">trigger:</span><span class="hl-1"> </span><span class="hl-3">&#39;doubleClick&#39;</span><span class="hl-1"> };</span><br/><br/><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-4">editCell</span><span class="hl-1">(</span><span class="hl-8">0</span><span class="hl-1">, </span><span class="hl-3">&#39;name&#39;</span><span class="hl-1">);</span><br/><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-4">commitEdit</span><span class="hl-1">();</span><br/><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-4">cancelEdit</span><span class="hl-1">();</span>
154
+ </code><button type="button">Copy</button></pre>
155
+
156
+ <p><code>mode: 'row'</code> puts all editable cells in the row into edit together. Properties: <code>editingCell</code>, <code>editingRow</code>. Events: <code>cellValueChanging</code> (cancellable), <code>cellValueChanged</code>, plus <code>rowEditStarted</code> / <code>rowEditEnded</code> in row mode.</p>
157
+ <h3 id="row-selection" class="tsd-anchor-link">Row selection<a href="#row-selection" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3>
158
+ <pre><code class="ts"><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-2">selection</span><span class="hl-1"> = { </span><span class="hl-2">enabled:</span><span class="hl-1"> </span><span class="hl-5">true</span><span class="hl-1">, </span><span class="hl-2">mode:</span><span class="hl-1"> </span><span class="hl-3">&#39;multiple&#39;</span><span class="hl-1">, </span><span class="hl-2">showCheckboxColumn:</span><span class="hl-1"> </span><span class="hl-5">true</span><span class="hl-1"> };</span><br/><br/><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-4">selectRow</span><span class="hl-1">(</span><span class="hl-2">data</span><span class="hl-1">[</span><span class="hl-8">0</span><span class="hl-1">]);</span><br/><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-4">toggleRowSelection</span><span class="hl-1">(</span><span class="hl-2">data</span><span class="hl-1">[</span><span class="hl-8">1</span><span class="hl-1">]);</span><br/><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-4">selectAllRows</span><span class="hl-1">();</span><br/><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-4">clearSelection</span><span class="hl-1">();</span><br/><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-2">selectedRows</span><span class="hl-1">; </span><span class="hl-15">// snapshot</span><br/><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-2">selectedRows</span><span class="hl-1"> = [</span><span class="hl-2">data</span><span class="hl-1">[</span><span class="hl-8">2</span><span class="hl-1">]]; </span><span class="hl-15">// replace selection (goes through `rowSelecting`)</span>
159
+ </code><button type="button">Copy</button></pre>
160
+
161
+ <p>Events: <code>rowSelecting</code> (cancellable), <code>rowSelected</code>.</p>
162
+ <h3 id="row-expansion-master-detail" class="tsd-anchor-link">Row expansion (master-detail)<a href="#row-expansion-master-detail" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3>
163
+ <pre><code class="ts"><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-2">expansion</span><span class="hl-1"> = {</span><br/><span class="hl-1"> </span><span class="hl-2">enabled:</span><span class="hl-1"> </span><span class="hl-5">true</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">detailTemplate</span><span class="hl-2">:</span><span class="hl-1"> ({ </span><span class="hl-2">data</span><span class="hl-1"> }) </span><span class="hl-5">=&gt;</span><span class="hl-1"> </span><span class="hl-4">html</span><span class="hl-3">`&lt;order-summary .order=</span><span class="hl-5">${</span><span class="hl-2">data</span><span class="hl-5">}</span><span class="hl-3">&gt;&lt;/order-summary&gt;`</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">isExpandable</span><span class="hl-2">:</span><span class="hl-1"> (</span><span class="hl-2">row</span><span class="hl-1">) </span><span class="hl-5">=&gt;</span><span class="hl-1"> </span><span class="hl-2">row</span><span class="hl-1">.</span><span class="hl-2">hasDetails</span><span class="hl-1">,</span><br/><span class="hl-1">};</span><br/><br/><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-4">expandRow</span><span class="hl-1">(</span><span class="hl-2">data</span><span class="hl-1">[</span><span class="hl-8">0</span><span class="hl-1">]);</span><br/><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-4">toggleRowExpansion</span><span class="hl-1">(</span><span class="hl-2">data</span><span class="hl-1">[</span><span class="hl-8">0</span><span class="hl-1">]);</span><br/><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-4">expandAllRows</span><span class="hl-1">();</span><br/><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-4">collapseAllRows</span><span class="hl-1">();</span><br/><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-2">expandedRows</span><span class="hl-1">; </span><span class="hl-15">// snapshot</span>
164
+ </code><button type="button">Copy</button></pre>
165
+
166
+ <p>Events: <code>rowExpanding</code> (cancellable), <code>rowExpanded</code>.</p>
167
+ <h3 id="tree-data-nested-rows" class="tsd-anchor-link">Tree data (nested rows)<a href="#tree-data-nested-rows" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3>
168
+ <p>The data array stays <strong>flat</strong>. The grid derives the hierarchy from a <code>getDataPath(row)</code> callback that returns the path from root to that row — AG Grid's &quot;tree data&quot; pattern.</p>
169
+ <pre><code class="ts"><span class="hl-5">type</span><span class="hl-1"> </span><span class="hl-6">Person</span><span class="hl-1"> = { </span><span class="hl-2">id</span><span class="hl-1">: </span><span class="hl-6">number</span><span class="hl-1">; </span><span class="hl-2">name</span><span class="hl-1">: </span><span class="hl-6">string</span><span class="hl-1">; </span><span class="hl-2">title</span><span class="hl-1">: </span><span class="hl-6">string</span><span class="hl-1">; </span><span class="hl-2">path</span><span class="hl-1">: </span><span class="hl-6">string</span><span class="hl-1">[] };</span><br/><br/><span class="hl-5">const</span><span class="hl-1"> </span><span class="hl-7">data</span><span class="hl-1">: </span><span class="hl-6">Person</span><span class="hl-1">[] = [</span><br/><span class="hl-1"> { </span><span class="hl-2">id:</span><span class="hl-1"> </span><span class="hl-8">1</span><span class="hl-1">, </span><span class="hl-2">name:</span><span class="hl-1"> </span><span class="hl-3">&#39;Adrian&#39;</span><span class="hl-1">, </span><span class="hl-2">title:</span><span class="hl-1"> </span><span class="hl-3">&#39;CEO&#39;</span><span class="hl-1">, </span><span class="hl-2">path:</span><span class="hl-1"> [</span><span class="hl-3">&#39;Adrian&#39;</span><span class="hl-1">] },</span><br/><span class="hl-1"> { </span><span class="hl-2">id:</span><span class="hl-1"> </span><span class="hl-8">2</span><span class="hl-1">, </span><span class="hl-2">name:</span><span class="hl-1"> </span><span class="hl-3">&#39;Bryan&#39;</span><span class="hl-1">, </span><span class="hl-2">title:</span><span class="hl-1"> </span><span class="hl-3">&#39;VP Eng&#39;</span><span class="hl-1">, </span><span class="hl-2">path:</span><span class="hl-1"> [</span><span class="hl-3">&#39;Adrian&#39;</span><span class="hl-1">, </span><span class="hl-3">&#39;Bryan&#39;</span><span class="hl-1">] },</span><br/><span class="hl-1"> { </span><span class="hl-2">id:</span><span class="hl-1"> </span><span class="hl-8">3</span><span class="hl-1">, </span><span class="hl-2">name:</span><span class="hl-1"> </span><span class="hl-3">&#39;Cara&#39;</span><span class="hl-1">, </span><span class="hl-2">title:</span><span class="hl-1"> </span><span class="hl-3">&#39;Manager&#39;</span><span class="hl-1">, </span><span class="hl-2">path:</span><span class="hl-1"> [</span><span class="hl-3">&#39;Adrian&#39;</span><span class="hl-1">, </span><span class="hl-3">&#39;Bryan&#39;</span><span class="hl-1">, </span><span class="hl-3">&#39;Cara&#39;</span><span class="hl-1">] },</span><br/><span class="hl-1">];</span><br/><br/><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-2">tree</span><span class="hl-1"> = {</span><br/><span class="hl-1"> </span><span class="hl-2">enabled:</span><span class="hl-1"> </span><span class="hl-5">true</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">getDataPath</span><span class="hl-2">:</span><span class="hl-1"> (</span><span class="hl-2">row</span><span class="hl-1">) </span><span class="hl-5">=&gt;</span><span class="hl-1"> </span><span class="hl-2">row</span><span class="hl-1">.</span><span class="hl-2">path</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">defaultExpanded:</span><span class="hl-1"> </span><span class="hl-8">1</span><span class="hl-1">, </span><span class="hl-15">// boolean | number — depth to expand</span><br/><span class="hl-1"> </span><span class="hl-2">groupColumnKey:</span><span class="hl-1"> </span><span class="hl-3">&#39;name&#39;</span><span class="hl-1">, </span><span class="hl-15">// which column shows the chevron + indent</span><br/><span class="hl-1"> </span><span class="hl-2">childIndent:</span><span class="hl-1"> </span><span class="hl-8">20</span><span class="hl-1">, </span><span class="hl-15">// px per depth level</span><br/><span class="hl-1">};</span><br/><br/><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-4">toggleTreeRow</span><span class="hl-1">(</span><span class="hl-2">data</span><span class="hl-1">[</span><span class="hl-8">0</span><span class="hl-1">]);</span><br/><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-4">expandAllTreeRows</span><span class="hl-1">();</span>
170
+ </code><button type="button">Copy</button></pre>
171
+
172
+ <p>Methods: <code>toggleTreeRow</code>, <code>expandTreeRow</code>, <code>collapseTreeRow</code>, <code>expandAllTreeRows</code>, <code>collapseAllTreeRows</code>, <code>isTreeRowExpanded</code>. Events: <code>treeRowExpanding</code> (cancellable), <code>treeRowExpanded</code>. When tree mode is active, the host element advertises <code>role=&quot;treegrid&quot;</code>.</p>
173
+ <h3 id="csv-export" class="tsd-anchor-link">CSV export<a href="#csv-export" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3>
174
+ <p>Programmatic:</p>
175
+ <pre><code class="ts"><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-4">exportToCSV</span><span class="hl-1">(); </span><span class="hl-15">// downloads data.csv</span><br/><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-4">exportToCSV</span><span class="hl-1">({ </span><span class="hl-2">filename:</span><span class="hl-1"> </span><span class="hl-3">&#39;users&#39;</span><span class="hl-1">, </span><span class="hl-2">source:</span><span class="hl-1"> </span><span class="hl-3">&#39;selected&#39;</span><span class="hl-1"> });</span><br/><span class="hl-5">const</span><span class="hl-1"> </span><span class="hl-7">text</span><span class="hl-1"> = </span><span class="hl-2">grid</span><span class="hl-1">.</span><span class="hl-4">exportToCSV</span><span class="hl-1">({ </span><span class="hl-2">filename:</span><span class="hl-1"> </span><span class="hl-3">&#39;&#39;</span><span class="hl-1"> }); </span><span class="hl-15">// no download, returns the string</span>
176
+ </code><button type="button">Copy</button></pre>
177
+
178
+ <p><code>source</code> can be <code>'view'</code> (default — post-filter/post-sort), <code>'page'</code>, <code>'selected'</code>, or <code>'all'</code>. Per-column opt-out: <code>{ key: 'secret', exportable: false }</code>.</p>
179
+ <blockquote>
180
+ <p><strong>XLSX (Excel) export</strong> moved to <a href="https://www.npmjs.com/package/apex-grid-enterprise"><code>apex-grid-enterprise</code></a> in v3. <code>&lt;apex-grid-enterprise&gt;</code> adds <code>grid.exportToXLSX(...)</code> and an &quot;Export XLSX&quot; entry to this same toolbar menu. CSV stays free.</p>
181
+ </blockquote>
182
+ <p>Toolbar dropdown:</p>
183
+ <pre><code class="html"><span class="hl-9">&lt;</span><span class="hl-10">apex-grid</span><span class="hl-1"> </span><span class="hl-12">show-export</span><span class="hl-9">&gt;&lt;/</span><span class="hl-10">apex-grid</span><span class="hl-9">&gt;</span>
184
+ </code><button type="button">Copy</button></pre>
185
+
186
+ <p>Renders a download icon in the toolbar's trailing actions area; the menu has an &quot;Export CSV&quot; entry (the enterprise grid adds &quot;Export XLSX&quot;). Toolbar <code>exportFilename</code> overrides the default <code>data</code> filename. Attribute: <code>show-export</code>.</p>
187
+ <h3 id="toolbar" class="tsd-anchor-link">Toolbar<a href="#toolbar" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3>
188
+ <p>Rendered automatically above the header row when at least one of <code>show-quick-filter</code> or <code>show-export</code> is on. CSS parts:</p>
189
+ <table>
190
+ <thead>
191
+ <tr>
192
+ <th>Part</th>
193
+ <th>What</th>
194
+ </tr>
195
+ </thead>
196
+ <tbody>
197
+ <tr>
198
+ <td><code>toolbar</code></td>
199
+ <td>Root container</td>
200
+ </tr>
201
+ <tr>
202
+ <td><code>toolbar-search</code></td>
203
+ <td>Quick-filter input wrapper</td>
204
+ </tr>
205
+ <tr>
206
+ <td><code>search-field</code></td>
207
+ <td>The bordered input field</td>
208
+ </tr>
209
+ <tr>
210
+ <td><code>search-icon</code>, <code>search-input</code></td>
211
+ <td>Leading icon, input element</td>
212
+ </tr>
213
+ <tr>
214
+ <td><code>toolbar-actions</code></td>
215
+ <td>Trailing actions area</td>
216
+ </tr>
217
+ <tr>
218
+ <td><code>export-trigger</code></td>
219
+ <td>Export menu button</td>
220
+ </tr>
221
+ <tr>
222
+ <td><code>export-menu</code></td>
223
+ <td>Dropdown panel</td>
224
+ </tr>
225
+ <tr>
226
+ <td><code>export-menu-item</code></td>
227
+ <td>Menu item</td>
228
+ </tr>
229
+ </tbody>
230
+ </table>
231
+ <p>Search input has a <code>debounce</code> attribute (default <code>200</code>ms).</p>
232
+ <h3 id="theming" class="tsd-anchor-link">Theming<a href="#theming" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3>
233
+ <p>The grid styles itself through <code>--ag-*</code> CSS custom properties — override them on <code>apex-grid</code> (or any ancestor) to rebrand; see <a href="media/_tokens.scss"><code>src/styles/_tokens.scss</code></a> for the full list. When <code>igniteui-webcomponents</code> is present, the brand tokens auto-tint from its palette.</p>
234
+ <p>Style with CSS parts on the grid, paginator, and toolbar:</p>
235
+ <pre><code class="css"><span class="hl-10">apex-grid</span><span class="hl-1">::part(paginator) { </span><span class="hl-12">background</span><span class="hl-1">: </span><span class="hl-4">var</span><span class="hl-1">(</span><span class="hl-12">--surface-2</span><span class="hl-1">); }</span><br/><span class="hl-10">apex-grid-toolbar</span><span class="hl-1">::part(</span><span class="hl-10">search-input</span><span class="hl-1">) { </span><span class="hl-12">font-family</span><span class="hl-1">: </span><span class="hl-4">var</span><span class="hl-1">(</span><span class="hl-12">--font-mono</span><span class="hl-1">); }</span>
236
+ </code><button type="button">Copy</button></pre>
237
+
238
+ <hr>
239
+ <h2 id="api-reference" class="tsd-anchor-link">API Reference<a href="#api-reference" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h2>
240
+ <h3 id="properties" class="tsd-anchor-link">Properties<a href="#properties" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3>
241
+ <table>
242
+ <thead>
243
+ <tr>
244
+ <th>Property</th>
245
+ <th>Type</th>
246
+ <th>Default</th>
247
+ <th>Notes</th>
248
+ </tr>
249
+ </thead>
250
+ <tbody>
251
+ <tr>
252
+ <td><code>data</code></td>
253
+ <td><code>T[]</code></td>
254
+ <td><code>[]</code></td>
255
+ <td>Source records (property only)</td>
256
+ </tr>
257
+ <tr>
258
+ <td><code>columns</code></td>
259
+ <td><code>ColumnConfiguration&lt;T&gt;[]</code></td>
260
+ <td><code>[]</code></td>
261
+ <td>Column configuration (property only)</td>
262
+ </tr>
263
+ <tr>
264
+ <td><code>autoGenerate</code></td>
265
+ <td><code>boolean</code></td>
266
+ <td><code>false</code></td>
267
+ <td>Infer columns from <code>data[0]</code> keys. Attr <code>auto-generate</code></td>
268
+ </tr>
269
+ <tr>
270
+ <td><code>sortConfiguration</code></td>
271
+ <td><code>GridSortConfiguration</code></td>
272
+ <td><code>{ multiple, triState }</code></td>
273
+ <td></td>
274
+ </tr>
275
+ <tr>
276
+ <td><code>dataPipelineConfiguration</code></td>
277
+ <td><code>DataPipelineConfiguration&lt;T&gt;</code></td>
278
+ <td>—</td>
279
+ <td>Custom sort/filter/pagination hooks</td>
280
+ </tr>
281
+ <tr>
282
+ <td><code>pagination</code></td>
283
+ <td><code>PaginationConfiguration</code></td>
284
+ <td>—</td>
285
+ <td></td>
286
+ </tr>
287
+ <tr>
288
+ <td><code>quickFilter</code></td>
289
+ <td><code>string</code></td>
290
+ <td><code>''</code></td>
291
+ <td>Attr <code>quick-filter</code></td>
292
+ </tr>
293
+ <tr>
294
+ <td><code>showQuickFilter</code></td>
295
+ <td><code>boolean</code></td>
296
+ <td><code>false</code></td>
297
+ <td>Attr <code>show-quick-filter</code></td>
298
+ </tr>
299
+ <tr>
300
+ <td><code>showExport</code></td>
301
+ <td><code>boolean</code></td>
302
+ <td><code>false</code></td>
303
+ <td>Attr <code>show-export</code></td>
304
+ </tr>
305
+ <tr>
306
+ <td><code>columnReordering</code></td>
307
+ <td><code>boolean</code></td>
308
+ <td><code>false</code></td>
309
+ <td>Attr <code>column-reordering</code></td>
310
+ </tr>
311
+ <tr>
312
+ <td><code>editing</code></td>
313
+ <td><code>GridEditingConfiguration</code></td>
314
+ <td>—</td>
315
+ <td></td>
316
+ </tr>
317
+ <tr>
318
+ <td><code>selection</code></td>
319
+ <td><code>GridSelectionConfiguration</code></td>
320
+ <td>—</td>
321
+ <td></td>
322
+ </tr>
323
+ <tr>
324
+ <td><code>expansion</code></td>
325
+ <td><code>GridExpansionConfiguration&lt;T&gt;</code></td>
326
+ <td>—</td>
327
+ <td></td>
328
+ </tr>
329
+ <tr>
330
+ <td><code>tree</code></td>
331
+ <td><code>GridTreeConfiguration&lt;T&gt;</code></td>
332
+ <td>—</td>
333
+ <td></td>
334
+ </tr>
335
+ <tr>
336
+ <td><code>sortExpressions</code></td>
337
+ <td><code>SortExpression&lt;T&gt;[]</code></td>
338
+ <td>—</td>
339
+ <td>Get/set</td>
340
+ </tr>
341
+ <tr>
342
+ <td><code>filterExpressions</code></td>
343
+ <td><code>FilterExpression&lt;T&gt;[]</code></td>
344
+ <td>—</td>
345
+ <td>Get/set</td>
346
+ </tr>
347
+ <tr>
348
+ <td><code>selectedRows</code></td>
349
+ <td><code>T[]</code></td>
350
+ <td>—</td>
351
+ <td>Get/set</td>
352
+ </tr>
353
+ <tr>
354
+ <td><code>expandedRows</code></td>
355
+ <td><code>T[]</code></td>
356
+ <td>—</td>
357
+ <td>Get/set</td>
358
+ </tr>
359
+ <tr>
360
+ <td><code>page</code>, <code>pageSize</code>, <code>pageCount</code>, <code>totalItems</code></td>
361
+ <td><code>number</code></td>
362
+ <td>—</td>
363
+ <td></td>
364
+ </tr>
365
+ <tr>
366
+ <td><code>pageItems</code></td>
367
+ <td><code>readonly T[]</code></td>
368
+ <td>—</td>
369
+ <td>Currently rendered slice</td>
370
+ </tr>
371
+ <tr>
372
+ <td><code>dataView</code></td>
373
+ <td><code>readonly T[]</code></td>
374
+ <td>—</td>
375
+ <td>Post-filter, post-sort</td>
376
+ </tr>
377
+ <tr>
378
+ <td><code>displayColumns</code></td>
379
+ <td><code>readonly ColumnConfiguration&lt;T&gt;[]</code></td>
380
+ <td>—</td>
381
+ <td>Render order (pinned start → unpinned → pinned end)</td>
382
+ </tr>
383
+ <tr>
384
+ <td><code>editingCell</code></td>
385
+ <td><code>{ rowIndex, columnKey } | null</code></td>
386
+ <td>—</td>
387
+ <td></td>
388
+ </tr>
389
+ <tr>
390
+ <td><code>editingRow</code></td>
391
+ <td><code>number | null</code></td>
392
+ <td>—</td>
393
+ <td>Row-mode only</td>
394
+ </tr>
395
+ </tbody>
396
+ </table>
397
+ <h3 id="methods" class="tsd-anchor-link">Methods<a href="#methods" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3>
398
+ <pre><code class="ts"><span class="hl-4">sort</span><span class="hl-1">(</span><span class="hl-2">expr</span><span class="hl-1">): </span><span class="hl-5">void</span><br/><span class="hl-4">filter</span><span class="hl-1">(</span><span class="hl-2">expr</span><span class="hl-1">): </span><span class="hl-5">void</span><br/><span class="hl-4">clearSort</span><span class="hl-1">(</span><span class="hl-2">key</span><span class="hl-1">?): </span><span class="hl-5">void</span><br/><span class="hl-4">clearFilter</span><span class="hl-1">(</span><span class="hl-2">key</span><span class="hl-1">?): </span><span class="hl-5">void</span><br/><span class="hl-4">setQuickFilter</span><span class="hl-1">(</span><span class="hl-2">value</span><span class="hl-1">): </span><span class="hl-6">Promise</span><span class="hl-1">&lt;</span><span class="hl-2">boolean</span><span class="hl-1">&gt;</span><br/><br/><span class="hl-4">getColumn</span><span class="hl-1">(</span><span class="hl-2">keyOrIndex</span><span class="hl-1">): </span><span class="hl-2">ColumnConfiguration</span><span class="hl-1">&lt;</span><span class="hl-7">T</span><span class="hl-1">&gt; | </span><span class="hl-5">undefined</span><br/><span class="hl-4">updateColumns</span><span class="hl-1">(</span><span class="hl-2">columns</span><span class="hl-1">): </span><span class="hl-5">void</span><br/><span class="hl-4">pinColumn</span><span class="hl-1">(</span><span class="hl-2">key</span><span class="hl-1">, </span><span class="hl-3">&#39;start&#39;</span><span class="hl-1"> | </span><span class="hl-3">&#39;end&#39;</span><span class="hl-1"> | </span><span class="hl-5">null</span><span class="hl-1">): </span><span class="hl-6">Promise</span><span class="hl-1">&lt;</span><span class="hl-2">boolean</span><span class="hl-1">&gt;</span><br/><span class="hl-4">unpinColumn</span><span class="hl-1">(</span><span class="hl-2">key</span><span class="hl-1">): </span><span class="hl-6">Promise</span><span class="hl-1">&lt;</span><span class="hl-2">boolean</span><span class="hl-1">&gt;</span><br/><span class="hl-4">moveColumn</span><span class="hl-1">(</span><span class="hl-2">fromKey</span><span class="hl-1">, </span><span class="hl-2">toKey</span><span class="hl-1">, </span><span class="hl-3">&#39;before&#39;</span><span class="hl-1"> | </span><span class="hl-3">&#39;after&#39;</span><span class="hl-1">): </span><span class="hl-6">Promise</span><span class="hl-1">&lt;</span><span class="hl-2">boolean</span><span class="hl-1">&gt;</span><br/><br/><span class="hl-4">gotoPage</span><span class="hl-1">(</span><span class="hl-2">page</span><span class="hl-1">): </span><span class="hl-6">Promise</span><span class="hl-1">&lt;</span><span class="hl-2">boolean</span><span class="hl-1">&gt;</span><br/><span class="hl-4">setPageSize</span><span class="hl-1">(</span><span class="hl-2">size</span><span class="hl-1">): </span><span class="hl-6">Promise</span><span class="hl-1">&lt;</span><span class="hl-2">boolean</span><span class="hl-1">&gt;</span><br/><span class="hl-4">nextPage</span><span class="hl-1">(); </span><span class="hl-4">previousPage</span><span class="hl-1">(); </span><span class="hl-4">firstPage</span><span class="hl-1">(); </span><span class="hl-4">lastPage</span><span class="hl-1">()</span><br/><br/><span class="hl-4">editCell</span><span class="hl-1">(</span><span class="hl-2">rowIndex</span><span class="hl-1">, </span><span class="hl-2">columnKey</span><span class="hl-1">): </span><span class="hl-6">Promise</span><span class="hl-1">&lt;</span><span class="hl-2">boolean</span><span class="hl-1">&gt;</span><br/><span class="hl-4">editRow</span><span class="hl-1">(</span><span class="hl-2">rowIndex</span><span class="hl-1">): </span><span class="hl-6">Promise</span><span class="hl-1">&lt;</span><span class="hl-2">boolean</span><span class="hl-1">&gt;</span><br/><span class="hl-4">commitEdit</span><span class="hl-1">(): </span><span class="hl-6">Promise</span><span class="hl-1">&lt;</span><span class="hl-2">boolean</span><span class="hl-1">&gt;</span><br/><span class="hl-4">cancelEdit</span><span class="hl-1">(): </span><span class="hl-5">void</span><br/><br/><span class="hl-4">selectRow</span><span class="hl-1">(</span><span class="hl-2">row</span><span class="hl-1">); </span><span class="hl-4">deselectRow</span><span class="hl-1">(</span><span class="hl-2">row</span><span class="hl-1">); </span><span class="hl-4">toggleRowSelection</span><span class="hl-1">(</span><span class="hl-2">row</span><span class="hl-1">)</span><br/><span class="hl-4">selectAllRows</span><span class="hl-1">(); </span><span class="hl-4">clearSelection</span><span class="hl-1">(); </span><span class="hl-4">isRowSelected</span><span class="hl-1">(</span><span class="hl-2">row</span><span class="hl-1">)</span><br/><br/><span class="hl-4">expandRow</span><span class="hl-1">(</span><span class="hl-2">row</span><span class="hl-1">); </span><span class="hl-4">collapseRow</span><span class="hl-1">(</span><span class="hl-2">row</span><span class="hl-1">); </span><span class="hl-4">toggleRowExpansion</span><span class="hl-1">(</span><span class="hl-2">row</span><span class="hl-1">)</span><br/><span class="hl-4">expandAllRows</span><span class="hl-1">(); </span><span class="hl-4">collapseAllRows</span><span class="hl-1">(); </span><span class="hl-4">isRowExpanded</span><span class="hl-1">(</span><span class="hl-2">row</span><span class="hl-1">)</span><br/><br/><span class="hl-4">toggleTreeRow</span><span class="hl-1">(</span><span class="hl-2">row</span><span class="hl-1">); </span><span class="hl-4">expandTreeRow</span><span class="hl-1">(</span><span class="hl-2">row</span><span class="hl-1">); </span><span class="hl-4">collapseTreeRow</span><span class="hl-1">(</span><span class="hl-2">row</span><span class="hl-1">)</span><br/><span class="hl-4">expandAllTreeRows</span><span class="hl-1">(); </span><span class="hl-4">collapseAllTreeRows</span><span class="hl-1">(); </span><span class="hl-4">isTreeRowExpanded</span><span class="hl-1">(</span><span class="hl-2">row</span><span class="hl-1">)</span><br/><br/><span class="hl-4">exportToCSV</span><span class="hl-1">(</span><span class="hl-2">options</span><span class="hl-1">?): </span><span class="hl-2">string</span><br/><span class="hl-4">exportAs</span><span class="hl-1">(</span><span class="hl-2">formatId</span><span class="hl-1">, </span><span class="hl-2">options</span><span class="hl-1">?): </span><span class="hl-5">void</span><span class="hl-1"> </span><span class="hl-15">// toolbar dispatch; &#39;csv&#39; (community), &#39;xlsx&#39; (enterprise)</span>
399
+ </code><button type="button">Copy</button></pre>
400
+
401
+ <h3 id="events" class="tsd-anchor-link">Events<a href="#events" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3>
402
+ <p>All events bubble and are composed across shadow boundaries. Names ending in <code>-ing</code> are cancellable.</p>
403
+ <table>
404
+ <thead>
405
+ <tr>
406
+ <th>Event</th>
407
+ <th>Cancellable</th>
408
+ <th>Detail</th>
409
+ </tr>
410
+ </thead>
411
+ <tbody>
412
+ <tr>
413
+ <td><code>sorting</code> / <code>sorted</code></td>
414
+ <td>yes / no</td>
415
+ <td><code>SortExpression&lt;T&gt;[]</code></td>
416
+ </tr>
417
+ <tr>
418
+ <td><code>filtering</code> / <code>filtered</code></td>
419
+ <td>yes / no</td>
420
+ <td><code>FilterExpression&lt;T&gt;[]</code></td>
421
+ </tr>
422
+ <tr>
423
+ <td><code>quickFilterChanging</code> / <code>quickFilterChanged</code></td>
424
+ <td>yes / no</td>
425
+ <td><code>{ value, nextValue? }</code></td>
426
+ </tr>
427
+ <tr>
428
+ <td><code>pageChanging</code> / <code>pageChanged</code></td>
429
+ <td>yes / no</td>
430
+ <td><code>{ page, pageSize, pageCount, totalItems }</code></td>
431
+ </tr>
432
+ <tr>
433
+ <td><code>columnPinning</code> / <code>columnPinned</code></td>
434
+ <td>yes / no</td>
435
+ <td><code>{ key, previous, next }</code> / <code>{ key, pinned }</code></td>
436
+ </tr>
437
+ <tr>
438
+ <td><code>columnMoving</code> / <code>columnMoved</code></td>
439
+ <td>yes / no</td>
440
+ <td><code>{ key, fromIndex, toKey, position }</code> / <code>{ key, fromIndex, toIndex }</code></td>
441
+ </tr>
442
+ <tr>
443
+ <td><code>cellValueChanging</code> / <code>cellValueChanged</code></td>
444
+ <td>yes / no</td>
445
+ <td><code>{ row, column, value, newValue }</code></td>
446
+ </tr>
447
+ <tr>
448
+ <td><code>rowEditStarted</code> / <code>rowEditEnded</code></td>
449
+ <td>no / no</td>
450
+ <td>row context</td>
451
+ </tr>
452
+ <tr>
453
+ <td><code>rowSelecting</code> / <code>rowSelected</code></td>
454
+ <td>yes / no</td>
455
+ <td><code>{ added, removed }</code></td>
456
+ </tr>
457
+ <tr>
458
+ <td><code>rowExpanding</code> / <code>rowExpanded</code></td>
459
+ <td>yes / no</td>
460
+ <td>row context</td>
461
+ </tr>
462
+ <tr>
463
+ <td><code>treeRowExpanding</code> / <code>treeRowExpanded</code></td>
464
+ <td>yes / no</td>
465
+ <td>row context</td>
466
+ </tr>
467
+ </tbody>
468
+ </table>
469
+ <p>Programmatic <code>sort()</code> / <code>filter()</code> calls are silent — only UI-initiated changes emit <code>sorting</code> / <code>filtering</code>.</p>
470
+ <h3 id="attributes" class="tsd-anchor-link">Attributes<a href="#attributes" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3>
471
+ <p><code>auto-generate</code>, <code>quick-filter</code>, <code>show-quick-filter</code>, <code>show-export</code>, <code>column-reordering</code>.</p>
472
+ <h3 id="css-parts" class="tsd-anchor-link">CSS parts<a href="#css-parts" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3>
473
+ <table>
474
+ <thead>
475
+ <tr>
476
+ <th>Component</th>
477
+ <th>Parts</th>
478
+ </tr>
479
+ </thead>
480
+ <tbody>
481
+ <tr>
482
+ <td><code>&lt;apex-grid-toolbar&gt;</code></td>
483
+ <td><code>toolbar</code>, <code>toolbar-search</code>, <code>search-field</code>, <code>search-icon</code>, <code>search-input</code>, <code>toolbar-actions</code>, <code>export-trigger</code>, <code>export-menu</code>, <code>export-menu-item</code></td>
484
+ </tr>
485
+ <tr>
486
+ <td><code>&lt;apex-grid-paginator&gt;</code></td>
487
+ <td><code>paginator</code>, <code>paginator-size</code>, <code>paginator-info</code>, <code>paginator-controls</code>, <code>paginator-page</code></td>
488
+ </tr>
489
+ <tr>
490
+ <td><code>&lt;apex-grid-cell&gt;</code></td>
491
+ <td><code>cell</code>, <code>editor</code></td>
492
+ </tr>
493
+ </tbody>
494
+ </table>
495
+ <hr>
496
+ <h2 id="framework-integration" class="tsd-anchor-link">Framework integration<a href="#framework-integration" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h2>
497
+ <p><code>&lt;apex-grid&gt;</code> is a standard custom element. Bind properties (not attributes) for <code>data</code> / <code>columns</code>:</p>
498
+ <table>
499
+ <thead>
500
+ <tr>
501
+ <th>Framework</th>
502
+ <th>Syntax</th>
503
+ </tr>
504
+ </thead>
505
+ <tbody>
506
+ <tr>
507
+ <td>Lit</td>
508
+ <td><code>&lt;apex-grid .data=${data} .columns=${columns}&gt;</code></td>
509
+ </tr>
510
+ <tr>
511
+ <td>Angular</td>
512
+ <td><code>&lt;apex-grid [data]=&quot;data&quot; [columns]=&quot;columns&quot;&gt;</code> (use <code>CUSTOM_ELEMENTS_SCHEMA</code>)</td>
513
+ </tr>
514
+ <tr>
515
+ <td>Vue</td>
516
+ <td><code>&lt;apex-grid :data.prop=&quot;data&quot; :columns.prop=&quot;columns&quot;&gt;</code></td>
517
+ </tr>
518
+ <tr>
519
+ <td>React (19+)</td>
520
+ <td><code>&lt;apex-grid data={data} columns={columns}&gt;</code></td>
521
+ </tr>
522
+ <tr>
523
+ <td>Vanilla</td>
524
+ <td><code>el.data = data; el.columns = columns;</code></td>
525
+ </tr>
526
+ </tbody>
527
+ </table>
528
+ <hr>
529
+ <h2 id="local-development" class="tsd-anchor-link">Local development<a href="#local-development" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h2>
530
+ <pre><code class="bash"><span class="hl-4">git</span><span class="hl-1"> </span><span class="hl-3">clone</span><span class="hl-1"> </span><span class="hl-3">https://github.com/apexcharts/apex-grid.git</span><br/><span class="hl-4">cd</span><span class="hl-1"> </span><span class="hl-3">apex-grid</span><br/><span class="hl-4">npm</span><span class="hl-1"> </span><span class="hl-3">install</span><br/><span class="hl-4">npm</span><span class="hl-1"> </span><span class="hl-3">start</span><span class="hl-1"> </span><span class="hl-15"># demo at http://localhost:5173</span><br/><span class="hl-4">npm</span><span class="hl-1"> </span><span class="hl-3">test</span><span class="hl-1"> </span><span class="hl-15"># web-test-runner</span><br/><span class="hl-4">npm</span><span class="hl-1"> </span><span class="hl-3">run</span><span class="hl-1"> </span><span class="hl-3">lint</span><br/><span class="hl-4">npm</span><span class="hl-1"> </span><span class="hl-3">run</span><span class="hl-1"> </span><span class="hl-3">build</span><span class="hl-1"> </span><span class="hl-15"># builds dist/ + custom-elements.json + typedoc</span>
531
+ </code><button type="button">Copy</button></pre>
532
+
533
+ <h2 id="releasing" class="tsd-anchor-link">Releasing<a href="#releasing" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h2>
534
+ <p>Releases are automated by <a href=".github/workflows/publish.yml">.github/workflows/publish.yml</a>:</p>
535
+ <ol>
536
+ <li>Bump <code>&quot;version&quot;</code> in <a href="media/package.json">package.json</a> — the single source of truth. The build injects it into <code>dist/package.json</code>.</li>
537
+ <li>Commit with a message starting with <code>release:</code> and the same version, e.g. <code>release: 2.0.0</code> or <code>release: 2.0.0-rc.1</code>.</li>
538
+ <li>Push to <code>main</code>.</li>
8
539
  </ol>
9
- <h2 id="local-demo-with-vite" class="tsd-anchor-link">Local demo with Vite<a href="#local-demo-with-vite" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h2><p>Run <code>npm start</code> to open the demo page in <code>demo/index.html</code></p>
10
- </div></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="assets/icons.svg#icon-chevronDown"></use></svg><h3>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div><details open class="tsd-accordion tsd-page-navigation"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="assets/icons.svg#icon-chevronDown"></use></svg><h3>On This Page</h3></summary><div class="tsd-accordion-details"><a href="#apex-data-component-grid"><span>Apex data component grid</span></a><ul><li><a href="#local-development"><span>Local <wbr/>Development</span></a></li><li><a href="#local-demo-with-vite"><span>Local demo with <wbr/>Vite</span></a></li></ul></div></details></div><div class="site-menu"><nav class="tsd-navigation"><a href="modules.html">apex-grid</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer><p class="tsd-generator">Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></footer><div class="overlay"></div></body></html>
540
+ <p>The workflow then verifies the version triple-match, runs lint + tests + build, publishes <code>dist/</code> to npm with <code>--provenance</code> (OIDC trusted publishing — no token in secrets), and creates a <code>vX.Y.Z</code> git tag and GitHub Release with auto-generated notes. Pre-release versions (containing <code>-</code>) publish under the <code>next</code> dist-tag; stable versions under <code>latest</code>.</p>
541
+ <p>Any push whose head commit does not start with <code>release:</code> is a no-op for the workflow.</p>
542
+ <h2 id="license" class="tsd-anchor-link">License<a href="#license" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h2>
543
+ <p>See <a href="media/LICENSE">LICENSE</a>.</p>
544
+ </div></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="assets/icons.svg#icon-chevronDown"></use></svg><h3>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div><details open class="tsd-accordion tsd-page-navigation"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="assets/icons.svg#icon-chevronDown"></use></svg><h3>On This Page</h3></summary><div class="tsd-accordion-details"><a href="#apex-grid"><span>Apex <wbr/>Grid</span></a><ul><li><a href="#features"><span>Features</span></a></li><li><a href="#quick-start"><span>Quick <wbr/>Start</span></a></li><li><ul><li><a href="#one-call-setup"><span>One-<wbr/>call setup</span></a></li><li><a href="#render-the-grid"><span>Render the grid</span></a></li></ul></li><li><a href="#manual-setup-four-steps"><span>Manual setup (four steps)</span></a></li><li><ul><li><a href="#1-install"><span>1. <wbr/>Install</span></a></li><li><a href="#2-register-the-custom-element"><span>2. <wbr/>Register the custom element</span></a></li><li><a href="#3-optional-customize-the-look"><span>3. (<wbr/>Optional) <wbr/>Customize the look</span></a></li><li><a href="#4-size-the-host"><span>4. <wbr/>Size the host</span></a></li><li><a href="#what-success-looks-like"><span>What success looks like</span></a></li><li><a href="#troubleshooting"><span>Troubleshooting</span></a></li></ul></li><li><a href="#features-in-depth"><span>Features in depth</span></a></li><li><ul><li><a href="#sorting"><span>Sorting</span></a></li><li><a href="#filtering"><span>Filtering</span></a></li><li><a href="#quick-filter-global-search"><span>Quick filter (global search)</span></a></li><li><a href="#pagination"><span>Pagination</span></a></li><li><a href="#column-pinning"><span>Column pinning</span></a></li><li><a href="#column-reordering"><span>Column reordering</span></a></li><li><a href="#inline-editing"><span>Inline editing</span></a></li><li><a href="#row-selection"><span>Row selection</span></a></li><li><a href="#row-expansion-master-detail"><span>Row expansion (master-<wbr/>detail)</span></a></li><li><a href="#tree-data-nested-rows"><span>Tree data (nested rows)</span></a></li><li><a href="#csv-export"><span>CSV export</span></a></li><li><a href="#toolbar"><span>Toolbar</span></a></li><li><a href="#theming"><span>Theming</span></a></li></ul></li><li><a href="#api-reference"><span>API <wbr/>Reference</span></a></li><li><ul><li><a href="#properties"><span>Properties</span></a></li><li><a href="#methods"><span>Methods</span></a></li><li><a href="#events"><span>Events</span></a></li><li><a href="#attributes"><span>Attributes</span></a></li><li><a href="#css-parts"><span>CSS parts</span></a></li></ul></li><li><a href="#framework-integration"><span>Framework integration</span></a></li><li><a href="#local-development"><span>Local development</span></a></li><li><a href="#releasing"><span>Releasing</span></a></li><li><a href="#license"><span>License</span></a></li></ul></div></details></div><div class="site-menu"><nav class="tsd-navigation"><a href="modules.html">apex-grid</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer><p class="tsd-generator">Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></footer><div class="overlay"></div></body></html>