You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 14643a2
Browse filesBrowse the repository at this point in the historyBrowse files
Copy file name to clipboardExpand all lines: CLAUDE.md
+15-1Lines changed: 15 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -14,7 +14,7 @@ This file is auto-loaded by Claude Code and other AI coding assistants. It provi
14
14
-**Build:**`npm run build:lib` produces the published `dist/opengridx.es.js` / `dist/opengridx.umd.js`. `npm run build` type-checks the lib and builds the **demo site**.
15
15
-**Published:** yes — on npm as `@opencorestack/opengridx` with external consumers. Treat public types and behaviour changes as semver-relevant.
16
16
-**Lint:**`npm run lint` (ESLint). Must pass before every commit.
17
-
-**Current version:** 3.5.1
17
+
-**Current version:** 3.6.0
18
18
19
19
---
20
20
@@ -153,6 +153,20 @@ The GitHub wiki is generated from `docs/` + `wiki/` by `scripts/build-wiki.mjs`
153
153
154
154
---
155
155
156
+
## v3.6.0 — significant changes
157
+
158
+
-**Sorting** encodes each key into typed arrays (`encodeSortColumn`): rank 0–4 (number, date, boolean, string, other), empty = 5, plus a number per row; strings/other get their position among the distinct texts in collator order. Only keys where an item carries both `comparator` and `params` use the per-pair `callSortComparator` path. Never call the collator inside a comparator over rows
159
+
-`getCellValue` returns `row[field]` without allocating when the column has no `valueGetter` — keep it allocation-free. Built-in aggregations go through `aggregateRows` (row by row, same addition order); `AGGREGATION_FUNCTIONS` stays the value-array API for pivot and cell selection
160
+
- Quick filter: `filterRows` keeps texts by index for the last rows array per `GridColumnLookup` (reused when the same object is at the same index); `createRowFilter` keeps a per-row WeakMap. Joining texts into one string was measured and rejected
161
+
- Row-grouping leaf `GridRowMeta` objects are one per row (sharing per depth was reverted: `params.rowMeta` is public). Equivalence tests with the old code as oracles: `*.equivalence.test.ts`
162
+
-**`dist/opengridx.es.js` starts with `'use client'`** (banner in `vite.config.lib.js`, checked by check-bundle); the UMD build has none
163
+
-**Every optional-peer `import()` (`exceljs`, `jspdf`, `jspdf-autotable`) must stay inside `try`** — webpack and Turbopack only treat it as optional there; a hidden variable specifier breaks apps that install the peers. The `nopeers` smoke fixture (webpack 5, no peers, port 4321, `e2e/nopeers.spec.ts`) guards it; fixtures must keep webpack from resolving the root `node_modules`
164
+
-`validateGridAiState` skips a top-level string `message`; the prompt handler surfaces it as `result.message` for object, JSON-string and fenced input
165
+
-**RTL**: read/write horizontal scroll only through `getScrollStart` / `setScrollStart` (`lib/utils/direction.ts`; scroll state is the offset from the inline start, never negative); map arrows with `logicalArrowKey(key, isRtl(el))`; panels with `getPanelPosition`. `pinnedColumns.left` / `right` are logical (inline start / end): sticky offsets use `insetInlineStart` / `insetInlineEnd` (jsdom: `style.getPropertyValue('inset-inline-start')`), borders `border-inline-*`, box-shadow x-offsets need `:dir(rtl)` mirrors. The column menu pins by screen side. `useGridScrollSync` observes `dir` mutations
166
+
- Testing RTL: Playwright's headless Chromium runs with `--hide-scrollbars`; with classic scrollbars and `scrollbar-gutter: stable`, RTL cannot reach `scrollLeft` 0 — compare against the scroll origin. Reproduce on macOS with `defaults write chrome-headless-shell AppleShowScrollBars Always`. The grid's `scrollbar-width` / `scrollbar-color` disable `::-webkit-scrollbar` in Chromium
167
+
- Header filter strings are in `localeText` (`headerFilter*`, resolved in `lib/utils/headerFilterLocale.ts`)
168
+
- Not in this release: the time-sliced pipeline (Option A of `docs/superpowers/specs/2026-10-12-nonblocking-pipeline-proposal.md`) is held for 3.7.0 until its overhead is within ~20 %
169
+
156
170
## v3.5.1 — significant changes
157
171
158
172
-**Content height is capped to the browser's limit.** Firefox lays out elements up to about 17.9M px and collapses a taller one (it does not clamp like Chromium/WebKit at about 33.5M px), which made large grids unscrollable there. `useGridMaxContentHeight` (hook 32a, before `useGridVirtualization`) measures the limit once per document with an invisible probe (`lib/utils/maxElementHeight.ts`: `getMaxElementHeight`, `countReachableRows`; `undefined` until measured, `Infinity` without a layout engine), and `useGridVirtualization` returns `virtualContainerHeight` capped to it — always render the rows' container with that, never `totalHeight - pinned heights`
Copy file name to clipboardExpand all lines: package.json
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
{
2
2
"name": "@opencorestack/opengridx",
3
-
"version": "3.5.1",
3
+
"version": "3.6.0",
4
4
"description": "OpenGridX: High-performance React data infrastructure. Unlock advanced Row Grouping, Excel Export, and Column Pinning without the usual \"Pro\" gatekeeping. Built for speed, scale, and complete architectural freedom. Fully open, virtualization-ready, and feature-complete.",
0 commit comments