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?

ChangeReleaseWhat you will seeHow to reverse it
Light tokens no longer style a dark grid3.6.0--ag-surface set above or on a theme="dark" grid is ignoredSet --ag-dark-surface and the other --ag-dark-* inputs
--ag-brand has no root default3.6.0Page CSS reading var(--ag-brand) gets nothingGive it a fallback: var(--ag-brand, #0d6fd3)
CSV escapes formula-like text3.6.0'=SUM(...) and '+44 ... in the fileexportToCSV({ escapeFormulas: false })
sortExpressions and filterExpressions replace3.6.0Assigning one expression clears the othersAssign the full list, or call sort() / filter()
Currency, rating and progress filter as numbers3.6.0Text conditions on them are dropped with a warningUse number conditions
A row move on a sorted grid clears the sort3.6.0The sort indicator goes on the first moveNone
New grid.data clears undo history3.6.0Undo stops at a data replacementKeep the same records in the new data
Paste and fill need editing0.8.0Read-only columns are not writtenediting.enabled and editable: true
Copy escapes formula-like text0.8.0'=HYPERLINK(...) on the clipboardescapeFormulas = false on the range selection controller
The server gets the advanced filter0.8.0Loaded rows are no longer filtered locallyApply advancedFilterModel in getRows
Pivot headers use source column text0.8.0Salary (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 sortExpressions or filterExpressions one 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.