ApexGrid 3.6 and Enterprise 0.8: Themes From Any Ancestor, Formula-Safe Exports
ApexGrid 3.6.0 and ApexGrid Enterprise 0.8.0 shipped on October 21, 2026, built from a full code-quality audit. No exported symbol was removed or renamed, but several documented contracts now hold where they did not, so check the table below before upgrading.
Key takeaways
--ag-*tokens reach the grid from any ancestor, including the shadow host of a web component.- Dark grids read
--ag-dark-*inputs, so one shared light palette no longer breaks them. - CSV export and copy neutralise spreadsheet formulas by default.
- Server row models retry failed requests and report each failure in an event.
- Paste and fill need editing on the target column (Enterprise).
- Upgrading is
npm install apex-grid@3.6.0 apex-grid-enterprise@0.8.0.
Which behaviours changed?
| Change | Release | What you will see | How to reverse it |
|---|---|---|---|
| Light tokens no longer style a dark grid | 3.6.0 | --ag-surface set above or on a theme="dark" grid is ignored | Set --ag-dark-surface and the other --ag-dark-* inputs |
--ag-brand has no root default | 3.6.0 | Page CSS reading var(--ag-brand) gets nothing | Give it a fallback: var(--ag-brand, #0d6fd3) |
| CSV escapes formula-like text | 3.6.0 | '=SUM(...) and '+44 ... in the file | exportToCSV({ escapeFormulas: false }) |
sortExpressions and filterExpressions replace | 3.6.0 | Assigning one expression clears the others | Assign the full list, or call sort() / filter() |
| Currency, rating and progress filter as numbers | 3.6.0 | Text conditions on them are dropped with a warning | Use number conditions |
| A row move on a sorted grid clears the sort | 3.6.0 | The sort indicator goes on the first move | None |
New grid.data clears undo history | 3.6.0 | Undo stops at a data replacement | Keep the same records in the new data |
| Paste and fill need editing | 0.8.0 | Read-only columns are not written | editing.enabled and editable: true |
| Copy escapes formula-like text | 0.8.0 | '=HYPERLINK(...) on the clipboard | escapeFormulas = false on the range selection controller |
| The server gets the advanced filter | 0.8.0 | Loaded rows are no longer filtered locally | Apply advancedFilterModel in getRows |
| Pivot headers use source column text | 0.8.0 | Salary (Average) instead of salary (avg) | Update tests that match header text |
How do I theme a grid from my own component?
Set the tokens on any ancestor. Before 3.6 the grid declared every default on its own host, which beat inherited values; now the defaults sit on :where(:root) and the grid reads whatever reaches it, shadow host included.
my-dashboard {
--ag-brand: #7c3aed;
--ag-dark-surface: #0f172a; /* used by theme="dark" grids only */
}
apex-grid/tokens.css ships the defaults as a plain stylesheet for server rendering, and setup({ tokenStyles: false }) skips adopting them. See Styles and Themes.
What happens when a server request fails?
Both server row models retry a rejected getRows up to maxRetries times (default 2), retryDelay milliseconds apart and doubling, and fire apex-rows-load-failed or apex-server-rows-load-failed with retrying in the detail. After the last attempt the rows stay placeholders until a refresh. See Infinite rows.
Other fixes
applyEdits()entries can name their row by record, which reaches other pages and pinned rows.ownsEvent(event)tells a master grid's events from a nested detail grid's.pivotOptions.maxValueColumns(default 200) stops a high-cardinality pivot freezing the grid.- Text filters no longer throw on empty or non-string cells.
- Number range filters no longer match empty cells.
- An open editor stays on its record when data, sort or page change.
- Formula results follow spreadsheet rules: see Formulas.
- Integrated charts show cell text as text, and follow a dark grid.
- Every row part, not only
cell, can be styled with::part(). setup()host sizing reaches grids inside a shadow root.
The full lists are in the core and enterprise CHANGELOG files in the apex-grid repository.
Upgrading
npm install apex-grid@3.6.0 apex-grid-enterprise@0.8.0
Enterprise 0.8.0 needs apex-grid 3.6.0. Then check:
- Dark grids: move light tokens set for them to
--ag-dark-*. - Code that assigns
sortExpressionsorfilterExpressionsone entry at a time. - Paste and fill targets: turn on editing for the columns that should accept them.
- Infinite or server-side datasources with an advanced filter: apply
advancedFilterModel.
Previous release: ApexGrid 3.5 and Enterprise 0.7.
Frequently asked questions
Why does my dark ApexGrid ignore --ag-surface after upgrading to 3.6?
From 3.6 a grid with theme="dark" reads the --ag-dark-* inputs instead of the light tokens, so a light palette on a shared ancestor cannot put a white surface under dark text. Rename the values you set for dark grids, for example --ag-surface to --ag-dark-surface.
Why do some CSV cells start with an apostrophe in ApexGrid 3.6?
Text that starts with =, +, -, @, a tab or a carriage return is written with a leading apostrophe so a spreadsheet shows it as text instead of running it as a formula. Plain signed numbers such as -5 are untouched. Pass exportToCSV({ escapeFormulas: false }) for the old output.