@opencorestack/opengridx 3.9.0 → 3.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/README.md +11 -7
- package/docs/architecture/datagrid-orchestration.md +4 -2
- package/docs/architecture/use-grid-virtualization.md +2 -0
- package/docs/components/pagination.md +1 -1
- package/docs/features/rtl.md +1 -1
- package/docs/performance.md +19 -1
- package/docs/roadmap.md +26 -5
- package/llms.txt +1 -1
- package/package.json +4 -2
- package/lib/theme/__baseline__/default-theme.darwin.chromium.json +0 -1
- package/lib/theme/__baseline__/default-theme.darwin.firefox.json +0 -1
- package/lib/theme/__baseline__/default-theme.darwin.webkit.json +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,23 @@
|
|
|
5
5
|
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
+
## [3.9.1] — 2026-10-13
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- **The npm package no longer ships the theme test baselines.** `lib/theme/__baseline__/` (three JSON files, 1.6 MB, added in 3.7.0) was published because `files` excluded tests, screenshots and snapshots but not that folder. Unpacked size 9.4 → 7.8 MB.
|
|
13
|
+
- The demo's home page badge showed v3.7.0; it and the header now read the version from `package.json`.
|
|
14
|
+
|
|
15
|
+
### Internal
|
|
16
|
+
|
|
17
|
+
- **`npm run check:package`**, run in CI and before publishing: fails when `npm pack` would ship a test artifact or when `DataGrid` alone, minified and gzipped, grows past its budget (92 KB; 85.5 KB now).
|
|
18
|
+
|
|
19
|
+
### Documentation
|
|
20
|
+
|
|
21
|
+
- Roadmap brought up to date (3.5.1 – 3.9.1 shipped; new features on hold until the backlog of fixes, refactors and performance work is closed; the 4.0 feature-modules proposal). `docs/performance.md`: edit, paste, fill, group toggle and select-all timings at 1M rows and how to keep rows memoised. README: spreadsheet editing, Ask AI panel, `localeText`, RTL and Theme Builder in the feature list; bundle sizes re-measured. `rtl.md` and `components/pagination.md` no longer say their labels cannot be translated. Architecture notes on the column-window memo and the locale context. The wiki home links the newer feature pages.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
8
25
|
## [3.9.0] — 2026-10-13
|
|
9
26
|
|
|
10
27
|
### Added
|
package/README.md
CHANGED
|
@@ -76,11 +76,13 @@ Without a `height` prop the grid fills its container (`height: 100%`, or the fre
|
|
|
76
76
|
- **Fully Customizable**: Slots system for replacing any component (pagination, overlays, toolbar).
|
|
77
77
|
- **Export Functionality**: Built-in CSV, Excel (HTML `.xls`, or real `.xlsx` with the optional ExcelJS peer), JSON, PDF (optional jsPDF peer) and Print export.
|
|
78
78
|
- **Clipboard**: `Ctrl+C` / `Cmd+C` copies the selected rows' visible columns as TSV for Excel/Sheets.
|
|
79
|
+
- **Spreadsheet editing** (v3.4–3.5): paste from Excel / Google Sheets into a cell range (parsed per column type, through `processRowUpdate`), Delete clears a range, **undo / redo** (`undoRedo`, Ctrl+Z / Ctrl+Shift+Z), and a **fill handle** that extends series, patterns or copies (Ctrl/Cmd+D / R).
|
|
79
80
|
- **Header Filters** (v3.5): `headerFilters` adds a filter row under the column headers (text, number, date and select controls with an operator menu) that edits the same `filterModel` as the filter panel and the quick filter.
|
|
80
81
|
- **Cell Range Selection** (v3.3): drag, Shift+click or Shift+arrows select a rectangle of cells; copy it as TSV and see its count, sum and average in a status bar (`cellSelection`, `showCellSelectionStats`).
|
|
81
|
-
- **AI Toolkit** (v3.4): `@opencorestack/opengridx/ai` turns your columns into a JSON Schema for your own model and validates its reply before the grid applies it (`getGridAiSchema`, `validateGridAiState`). No AI SDK, no row data sent by default.
|
|
82
|
+
- **AI Toolkit** (v3.4–3.5): `@opencorestack/opengridx/ai` turns your columns into a JSON Schema for your own model and validates its reply before the grid applies it (`getGridAiSchema`, `validateGridAiState`); `aiAssistant` adds an **Ask AI panel** whose changes show as removable chips with one-click undo, and `createGridAgentTools` gives agents typed tools. No AI SDK, no row data sent by default.
|
|
83
|
+
- **Internationalisation** (v3.9): every built-in string (menus, toolbar, panels, AI panel, pagination, screen-reader announcements) is a `localeText` key, and **right-to-left** layouts work with `dir="rtl"` (v3.6), including pinned columns.
|
|
82
84
|
- **Accessibility**: WCAG 2.1 AA — full ARIA roles and keyboard navigation.
|
|
83
|
-
- **Theming**: CSS variable API, `DataGridThemeProvider` with 5 built-in themes (`darkTheme`, `roseTheme`, `emeraldTheme`, `amberTheme`, `compactTheme`) and custom themes.
|
|
85
|
+
- **Theming**: CSS variable API, `DataGridThemeProvider` with 5 built-in themes (`darkTheme`, `roseTheme`, `emeraldTheme`, `amberTheme`, `compactTheme`) and custom themes; the demo's **Theme Builder** edits every theme key live and exports the result as code.
|
|
84
86
|
- **Column & Row Reordering**: Drag-and-drop column reordering and row reordering.
|
|
85
87
|
- **Inline Cell Editing**: Full inline editing with `processRowUpdate` validation.
|
|
86
88
|
- **State Persistence**: Save and restore grid state (sort, filter, pagination, columns, density) via `useGridStateStorage`.
|
|
@@ -120,7 +122,7 @@ This means that **Cursor**, **GitHub Copilot**, **Windsurf**, and other AI agent
|
|
|
120
122
|
| `rowHeight` | `number` | `52` | Row height in pixels. |
|
|
121
123
|
| `headerHeight` | `number` | `56` | Header height in pixels. |
|
|
122
124
|
| `noRowsLabel` | `string` | `'No Data'` | Custom empty-state message. |
|
|
123
|
-
| `localeText` | `GridLocaleText` | — | Overrides for
|
|
125
|
+
| `localeText` | `GridLocaleText` | — | Overrides for every built-in UI string (v3.9; pagination and the empty state before). |
|
|
124
126
|
| `ariaLabel` | `string` | — | Accessible name for the grid. |
|
|
125
127
|
| `initialState` | `GridInitialState` | — | Starting sort, filter, pagination, column and density state (uncontrolled). |
|
|
126
128
|
| `onStateChange` | `(state: GridState) => void` | — | Fires when sort, filter, pagination, columns or density change. |
|
|
@@ -490,12 +492,14 @@ Built-in themes: `darkTheme`, `roseTheme`, `emeraldTheme`, `amberTheme`, `compac
|
|
|
490
492
|
|
|
491
493
|
| Artifact | Size | Gzipped | Notes |
|
|
492
494
|
| :--- | :--- | :--- | :--- |
|
|
493
|
-
| **
|
|
494
|
-
| **Core
|
|
495
|
-
| **
|
|
495
|
+
| **What an app ships for `DataGrid`** (your bundler minifies) | 271 KB | **87 KB** | Measured v3.9.0: esbuild, minified, React external, `DataGrid` only |
|
|
496
|
+
| **Core ES Module** (`opengridx.es.js`, as published) | 493 KB | 130 KB | Unminified with readable names; use this — tree-shakeable |
|
|
497
|
+
| **Core UMD** (`opengridx.umd.js`) | 357 KB | 112 KB | CommonJS / CDN compat |
|
|
498
|
+
| **Styles** (`opengridx.css`) | 81 KB | **12 KB** | `import '@opencorestack/opengridx/styles'` |
|
|
499
|
+
| **AI toolkit** (`/ai`, optional import) | 20 KB | **7 KB** | Adds nothing unless imported |
|
|
496
500
|
| **ExcelJS** (optional peer dep) | — | — | `npm install exceljs` |
|
|
497
501
|
| **jsPDF** (optional peer dep) | — | — | `npm install jspdf jspdf-autotable` |
|
|
498
|
-
| **npm package download** | — | **~
|
|
502
|
+
| **npm package download** | — | **~2.5 MB** | Compressed tarball (includes `lib/` source, docs and source maps; 7.8 MB unpacked) |
|
|
499
503
|
|
|
500
504
|
- **Tree-shaking Ready**: ES Module build — bundlers (Vite, Webpack) only include what you use.
|
|
501
505
|
- **Zero UI Dependencies**: No MUI, Ant Design, or Radix. Pure React + vanilla CSS.
|
|
@@ -113,10 +113,12 @@ in an effect, so **keep the call order when you move or add a hook**. In particu
|
|
|
113
113
|
`GridToolbarSlot`, `GridAiAssistantArea` (the `aiAssistant` panel or `slots.aiAssistantPanel` while open, anchored under the toolbar), `GridStandaloneColumnPanel`, `GridListView` (list view) or `GridViewport` (`components/DataGrid/GridViewport.tsx`, the `role="grid"` viewport:
|
|
114
114
|
`Header`, `GridPinnedRows` top, `GridEmptyState`, `GridVirtualRows`, `GridPinnedRows` bottom,
|
|
115
115
|
`GridAggregationFooter`), `GridCellSelectionStatsArea` (`showCellSelectionStats` with `cellSelection`), then `slots.footer` or `GridPaginationArea`, `GridLiveRegion`,
|
|
116
|
-
`GridLoadingOverlay` and `GridErrorOverlay`. `GridRoot` builds the overlay slot elements and passes the
|
|
116
|
+
`GridLoadingOverlay` and `GridErrorOverlay`. `GridRoot` also provides `GridLocaleContext` (v3.9) around all of them: `localeText`, kept stable while shallowly equal (`useShallowStableValue`), resolved once by `resolveGridLocale` (`lib/utils/gridLocale.ts`); components and `Row` read it with `useGridLocale()` instead of a prop, so `Row` gets no prop that changes per render. `GridRoot` builds the overlay slot elements and passes the
|
|
117
117
|
rest of its props on to `GridViewport`. The props all three row renderers take alike are built once in
|
|
118
118
|
`GridViewport` (`rowRenderProps`) and spread into each. `rowRenderProps.cellRange` is the cell range's
|
|
119
119
|
render rectangle; each row renderer turns it into a per-row `cellRange` (`getRowCellRange`), `null` for rows
|
|
120
120
|
outside it, and `Row` is memoised with a value comparison of that prop, so a drag only re-renders the rows the
|
|
121
|
-
range enters or leaves.
|
|
121
|
+
range enters or leaves. The same rule holds for every row prop (v3.9): `editingCell` goes only to the row being
|
|
122
|
+
edited, `focusedCellField` only to the focused row, and the row click and checkbox handlers keep one identity
|
|
123
|
+
(`useGridRowInteractions` reads the latest handlers when called). `DataGrid.rowMemo.test.tsx` guards it. `rowRenderProps.fillHandle` (v3.5) adds `fillHandleCol` to the one row that draws the fill
|
|
122
124
|
handle (a single selected cell gets an empty column interval, so it draws the handle but no range).
|
|
@@ -90,6 +90,8 @@ Row heights include an expanded detail panel's height, so the prefix sums accoun
|
|
|
90
90
|
|
|
91
91
|
Columns use the same search on `unpinnedAccWidths` (also inclusive), relative to the left edge of the unpinned area (`scrollLeft - leftPinnedWidth`), widened by 6 columns on each side. The skipped widths become `__spacer_left__` / `__spacer_right__` entries (`isSpacer: true`) in `virtualColumns`.
|
|
92
92
|
|
|
93
|
+
The column window is computed in its own `useMemo` (v3.9), over the column parts of the layout (`unpinnedAccWidths`, `unpinnedColsWithWidth`, the pinned column lists and widths), `scrollLeft` and the viewport width only. A row change (an edit), a vertical scroll or a row-height change therefore keeps the same `virtualColumns` array, and `Row`, which is memoised on its props, does not re-render for it. `useLayout` returns the row and column parts from separate memos (v3.7.1), so the column fields keep their identity while rows change.
|
|
94
|
+
|
|
93
95
|
When a column declares `colSpan` / `rowSpan`, `DataGrid` widens this window afterwards (`useGridSpanRowWindow` / `useGridSpanColumnWindow`) so a span whose origin is outside the window is not cut.
|
|
94
96
|
|
|
95
97
|
---
|
|
@@ -41,7 +41,7 @@ You can replace the internal pagination UI using the `pagination` slot:
|
|
|
41
41
|
|
|
42
42
|
## 🌍 Internationalisation
|
|
43
43
|
|
|
44
|
-
Pass `localeText` on `<DataGrid />` to override the text labels in the Pagination component (rows-per-page, range, and page-counter labels). The rows-per-page select takes its accessible name from the `paginationRowsPerPage` label.
|
|
44
|
+
Pass `localeText` on `<DataGrid />` to override the text labels in the Pagination component (rows-per-page, range, and page-counter labels). The rows-per-page select takes its accessible name from the `paginationRowsPerPage` label. Since v3.9 the navigation landmark label (`paginationLabel`, default `"Pagination"`) and each button's label and tooltip (`paginationNextPageLabel` / `paginationNextPageTooltip` → `"Go to next page"` / `"Next page"`, and the same for First, Previous and Last) are `localeText` keys as well.
|
|
45
45
|
|
|
46
46
|
| Key | Type | Default |
|
|
47
47
|
| :--- | :--- | :--- |
|
package/docs/features/rtl.md
CHANGED
|
@@ -42,7 +42,7 @@ The column menu is labelled by screen side: in RTL *Pin to Left* adds the column
|
|
|
42
42
|
|
|
43
43
|
## Known limitations
|
|
44
44
|
|
|
45
|
-
-
|
|
45
|
+
- ~~Menu and panel labels are hard-coded English~~: since v3.9 every built-in string, including the column menu (`columnMenuPinLeft`, `columnMenuSortAscending`, …), is a `localeText` key. See *Locale text for every UI string* in [`API_REFERENCE.md`](../API_REFERENCE.md).
|
|
46
46
|
- **Header filter operator symbols** are mirrored by the browser's bidi rules (`∋` shows as `∈`), as in any RTL text.
|
|
47
47
|
- **`direction` set through CSS** (a class or stylesheet, not the `dir` attribute) and changed at runtime is not detected; scroll the grid or remount it with a `key`.
|
|
48
48
|
- **Headless Chromium tests:** Playwright launches Chromium with `--hide-scrollbars`. With classic scrollbars (Linux) `scrollbar-gutter: stable` still reserves the gutter, and in RTL Chromium then cannot scroll the last gutter-width of the start into view (`scrollLeft` stops at minus the gutter). A plain scroller without the grid does the same and real browsers with visible scrollbars do not. Tests must compare with the browser's scroll origin, as `DataGrid.rtl.browser.test.tsx` does. To reproduce on macOS: `defaults write chrome-headless-shell AppleShowScrollBars Always` (undo with `defaults delete chrome-headless-shell`).
|
package/docs/performance.md
CHANGED
|
@@ -136,7 +136,7 @@ Measured with `npm run bench` (`bench/`), which installs the packed npm package
|
|
|
136
136
|
| 500,000 (3.5.0) | 295 ms | 493 / 641 ms | 59 ms | 958 ms | 331 ms | 0 % | 39.4 MB |
|
|
137
137
|
| 1,000,000 | 621 ms | 467 / 467 ms | 109 ms | 1,813 ms | 693 ms | 0 % | 76.9 MB |
|
|
138
138
|
|
|
139
|
-
### Before and after the faster sort, quick filter and grouping (
|
|
139
|
+
### Before and after the faster sort, quick filter and grouping (3.6.0)
|
|
140
140
|
|
|
141
141
|
Medians of 5 runs, the same machine, the 3.5.1 code (`122d431`) and the changed code (`e1df2f1`) measured back to back on 2026-10-12 (`bench/results/2026-10-12-apple-m1-darwin-before.json` and `bench/results/2026-10-12-apple-m1-darwin.json`). Load average at the start of each run: 2.9 (before) and 4.6 (after); an IDE, a browser and other tools were open. Row counts after every filter and grouping were identical in both runs.
|
|
142
142
|
|
|
@@ -162,6 +162,24 @@ What changed: sort keys are read once per row into typed arrays and strings are
|
|
|
162
162
|
- **Sorting, the quick filter and grouping run on the main thread in one piece.** Up to 100k rows they finish in a few frames; at 1M a sort blocks the page for about 0.35–0.6 s in every engine, grouping for 0.7 s (1.8 s in Firefox), and the first quick-filter keystroke for about 1.8–3 s. For sorting or searching a million rows interactively, use server-side sorting and filtering.
|
|
163
163
|
- **Reach:** past the browser's height cap rows cannot be scrolled to, and in Firefox the grid stops scrolling altogether. See [Reach](#reach-the-browser-height-ceiling).
|
|
164
164
|
|
|
165
|
+
### Editing, selection and grouping at 1M rows (3.8 – 3.9)
|
|
166
|
+
|
|
167
|
+
Measured in Chromium on an Apple M1, 1,000,000 rows, from the event to the end of its long task (best of three; not part of `npm run bench`, which covers mount, scroll, sort and filter).
|
|
168
|
+
|
|
169
|
+
| Interaction | 3.7.0 | 3.8.0 | |
|
|
170
|
+
| :--- | ---: | ---: | :--- |
|
|
171
|
+
| Edit one cell | 561 ms | ~35 ms | the row store is updated in place; id lists over the visible rows are reused |
|
|
172
|
+
| Paste 1,000 × 10 cells | ~790 ms | ~45 ms | |
|
|
173
|
+
| Undo / redo of that paste | ~790 ms | ~45 ms | |
|
|
174
|
+
| Fill 1,000 cells | 809 ms | ~50 ms | |
|
|
175
|
+
| Expand a group | 279 ms | ~135 ms | leaf row metadata built once per tree |
|
|
176
|
+
| Collapse a group | ~120 ms | ~1 ms | |
|
|
177
|
+
| Select all | ~270 ms | ~270 ms | bounded by building 1M-id sets for the array `rowSelectionModel` |
|
|
178
|
+
|
|
179
|
+
3.9.0 keeps rows memoised: selecting a row, starting or committing an edit, and vertical scrolling re-render only the rows they change (a click re-rendered every visible row, now one). React's own work per interaction is about 3–5 ms at 100k rows.
|
|
180
|
+
|
|
181
|
+
To keep this, change rows by passing new row objects (never mutate them), keep `columns` and `localeText` shallowly stable (inline objects of plain values are fine; define function entries outside the render). Handlers such as `onRowClick` may be inline: the grid passes rows its own stable handlers.
|
|
182
|
+
|
|
165
183
|
### Method
|
|
166
184
|
|
|
167
185
|
- **The app is the built package.** `bench/app` installs the tarball from `npm pack`, like a consumer, and is a production build (no React development checks).
|
package/docs/roadmap.md
CHANGED
|
@@ -85,14 +85,32 @@ This document tracks the current status of features in `OpenGridX` and outlines
|
|
|
85
85
|
| **3.3.0** ✅ | shipped 7 Oct | **Cell range selection** (opt-in `cellSelection` prop): mouse drag, Shift+click, Shift+arrows; Ctrl+C / Cmd+C copies the block as TSV | Selection status bar (count, sum, average of selected cells); wrapped header text; React Compiler compatibility check |
|
|
86
86
|
| **3.4.0** ✅ | shipped 8 Oct | **Paste from Excel / Google Sheets** into the selection, through `processRowUpdate` (values parsed per column type or `valueParser`, non-editable cells skipped, `onClipboardPaste` summary); **Delete clears a range**; built-in inputs and editors use the shared `Input` / `Checkbox` (`Input variant="cell"`). **Undo / redo** for cell edits and pastes (Ctrl+Z, Ctrl+Shift+Z / Ctrl+Y, `apiRef.undo()` / `redo()`) | **AI toolkit, part 1** in a new `@opencorestack/opengridx/ai` entry point: `getGridAiSchema(columns)` (JSON Schema of the filter, sort, grouping, aggregation, pivot and visibility models the columns allow) and `validateGridAiState(json, columns)` (drops unknown fields and operators, coerces values, returns errors) |
|
|
87
87
|
| **3.5.0** ✅ | shipped 9 Oct | **AI toolkit, part 2**: `aiAssistant={{ onPrompt }}` Ask AI panel (chips, Undo, voice) that calls the app's own model through `createGridAiPromptHandler`; only validated replies apply; `createGridAgentTools(apiRef, columns)` (plain tool objects for CopilotKit, the Vercel AI SDK, provider tool calling or WebMCP) | **Header filter row** (`headerFilters`); **fill handle** (series, Alt copy, Ctrl/Cmd+D / R); `rowGroupingModel` controlled/uncontrolled pair |
|
|
88
|
+
| **3.5.1** ✅ | shipped 10 Oct | **Content height capped to the browser's limit** (Firefox collapsed grids taller than ~17.9M px) | Dev warning names the reachable row count |
|
|
89
|
+
| **3.6.0** ✅ | shipped 12 Oct | **Sorting 3–5× faster** (typed-array keys) | Next.js `'use client'` banner; optional peers safe in webpack / Turbopack; **RTL parts 1 and 2** (pinned columns); header filter `localeText` |
|
|
90
|
+
| **3.7.0** ✅ | shipped 13 Oct | **Theme Builder** demo page + 16 theme keys | `DataGrid.tsx` split (`GridRoot` / `GridViewport`, composite hooks); types split per domain; demo smoke test |
|
|
91
|
+
| **3.7.1** ✅ | shipped 13 Oct | Audit fixes: exports survive a throwing `valueGetter`; **formula escaping of `valueFormatter` text** (security) | Quick filter matches shown text; date paste fixes; list view theme; CSS reset scoped to the grid |
|
|
92
|
+
| **3.8.0** ✅ | shipped 13 Oct | **Edits at 1M rows 10–20× faster** (in-place row store; edit ~35 ms, paste ~45 ms) | Group expand ~2×, collapse ~1 ms |
|
|
93
|
+
| **3.8.1** ✅ | shipped 13 Oct | **Grid buttons keep their own styles** (AI panel, toolbar active states) | Exact `bigint` sort; stricter number text; dead-code cleanup; every export documented |
|
|
94
|
+
| **3.9.0** ✅ | shipped 13 Oct | **`localeText` for every UI string** (~200 keys) | 9 theme keys + Theme Builder controls; rows stay memoised through selection and editing; demo sidebar by priority |
|
|
95
|
+
| **3.9.1** ✅ | shipped 13 Oct | **npm package no longer ships 1.6 MB of test baselines** | `check:package` guard in CI; version badges read `package.json`; docs brought up to date |
|
|
96
|
+
| 3.10.0 | open | AI change chips translatable | Backlog work below |
|
|
88
97
|
| Freeze | 19 Dec – 5 Jan | Bug fixes only | — |
|
|
89
98
|
|
|
99
|
+
### Now: backlog first (feature hold since 13 Oct)
|
|
100
|
+
|
|
101
|
+
New features (the *Next* list below) wait until the open fixes, refactors and performance work are done. Tracked in [`superpowers/plans/2026-10-13-audit-tracker.md`](superpowers/plans/2026-10-13-audit-tracker.md):
|
|
102
|
+
|
|
103
|
+
* **Refactors** (no behaviour change): about 40 `as unknown as` casts (R4), files over 600 lines such as `GridToolbar.tsx` (R5), hooks with very wide parameter lists such as keyboard navigation (R6).
|
|
104
|
+
* **Performance**: the time-sliced filter / sort pipeline (held: 1.5–2× slower in total, needs to be within ~20 %); select-all at 1M rows (~270 ms, bounded by the array `rowSelectionModel`).
|
|
105
|
+
* **Demo**: syntax highlighting in the source viewer.
|
|
106
|
+
* **Bundle size (4.0)**: an app using only `DataGrid` ships 87 KB gzipped; opt-in [feature modules](superpowers/specs/2026-10-13-feature-modules-proposal.md) would save ~20 KB. Breaking, so planned for 4.0.
|
|
107
|
+
|
|
90
108
|
### Across the quarter
|
|
91
109
|
|
|
92
110
|
* ✅ **Published benchmark** (done 9 Oct): reproducible 10k / 100k / 500k / 1M-row numbers (scroll frame times, sort, filter and grouping time, memory, the reachable row) in [`docs/performance.md`](performance.md#benchmarks); rerun with `npm run bench`.
|
|
93
111
|
* ✅ **Next.js App Router guide** (done 12 Oct): [`docs/features/nextjs.md`](features/nextjs.md), verified with `next build` / `next start` on Next.js 15.5 and 16.4. The ES bundle now starts with `'use client'`.
|
|
94
|
-
* ✅ **RTL check** (done 12 Oct): [`docs/features/rtl.md`](features/rtl.md). Fixed: text alignment, horizontal scrolling and column virtualization, arrow keys, the resize and fill handles, range outlines and auto-scroll, toolbar panel placement
|
|
95
|
-
* **Demo site**: source viewer on
|
|
112
|
+
* ✅ **RTL check** (done 12 Oct): [`docs/features/rtl.md`](features/rtl.md). Fixed: text alignment, horizontal scrolling and column virtualization, arrow keys, the resize and fill handles, range outlines and auto-scroll, toolbar panel placement; pinned columns followed in RTL part 2.
|
|
113
|
+
* **Demo site**: ✅ source viewer on every example (`DocsLayout` with Vite `?raw`); syntax highlighting still open.
|
|
96
114
|
|
|
97
115
|
### Definition of done for each feature
|
|
98
116
|
|
|
@@ -115,7 +133,7 @@ This document tracks the current status of features in `OpenGridX` and outlines
|
|
|
115
133
|
* **Undo must cover rejected updates**: a `processRowUpdate` that throws or a paste that partly fails must leave the history consistent.
|
|
116
134
|
* **Wrong AI filters** that look plausible: the validator, visible chips and undo are required, not optional.
|
|
117
135
|
|
|
118
|
-
## 🔭 Next (Q1 2027)
|
|
136
|
+
## 🔭 Next (Q1 2027) — on hold until the backlog above is closed
|
|
119
137
|
|
|
120
138
|
|
|
121
139
|
* **Row reordering inside tree data and row groups**, touch-friendly (MUI #4821, 405 👍, not in MUI X).
|
|
@@ -125,7 +143,7 @@ This document tracks the current status of features in `OpenGridX` and outlines
|
|
|
125
143
|
* **Sparklines** and a charts adapter that passes grid state to any chart library.
|
|
126
144
|
* **AI toolkit, part 3**: smart paste (unstructured text → pending rows) and `apiRef.getAiContext()` for "summarise selection"; an `opengridx-mcp` docs server for coding assistants.
|
|
127
145
|
* **Tailwind / shadcn theme preset**, sticky header against page scroll.
|
|
128
|
-
* ✅ **RTL, part 2** (done 12 Oct, [`rtl.md`](features/rtl.md)): pinned columns and pinned system columns with logical sticky offsets and mirrored shadows, column menu pinning by screen side, mirrored pagination arrows and tree chevrons, a direction change on a mounted grid, column reorder by drag checked. Remaining:
|
|
146
|
+
* ✅ **RTL, part 2** (done 12 Oct, [`rtl.md`](features/rtl.md)): pinned columns and pinned system columns with logical sticky offsets and mirrored shadows, column menu pinning by screen side, mirrored pagination arrows and tree chevrons, a direction change on a mounted grid, column reorder by drag checked. Remaining: the bidi-mirrored header filter operator symbols (the menu labels became `localeText` keys in 3.9).
|
|
129
147
|
|
|
130
148
|
### Not planned
|
|
131
149
|
|
|
@@ -136,6 +154,9 @@ This document tracks the current status of features in `OpenGridX` and outlines
|
|
|
136
154
|
|
|
137
155
|
## ✅ Implemented Features (Recent)
|
|
138
156
|
|
|
157
|
+
### 3.3 – 3.9 *(2026-10-07 → 2026-10-13)*
|
|
158
|
+
- Spreadsheet editing (range selection, paste, undo / redo, fill handle), the AI toolkit (schema, validator, Ask AI panel, agent tools), header filters, the 1M-row benchmark and height cap, 3–5× faster sorting, RTL, the Theme Builder, a full audit with security and correctness fixes, 10–20× faster edits at 1M rows and `localeText` for every string. See the release table above and [CHANGELOG.md](../CHANGELOG.md).
|
|
159
|
+
|
|
139
160
|
### 3.x releases *(2026-09-29 → 2026-10-01)*
|
|
140
161
|
- **3.0.0** correctness release (rows never modified, typed generics, React 18 support), **3.0.1** fill-height layout fix, **3.1.0** `sortComparator` and column auto-size, **3.2.0** non-blocking PDF export, **3.2.1** Safari boolean editor fix, **3.2.2** linear-time export regexes. Details in [CHANGELOG.md](../CHANGELOG.md); upgrade guide in [migration/v2-to-v3.md](migration/v2-to-v3.md).
|
|
141
162
|
- Package smoke suite against the packed tarball in React 18 and 19 apps, pull-request CI, community files and a wiki generated from these docs.
|
|
@@ -158,5 +179,5 @@ This document tracks the current status of features in `OpenGridX` and outlines
|
|
|
158
179
|
- **Core hook tests**: `useGridRowPipeline`, `useGridControlledState`, `useGridKeyboardNavigation` now have full test coverage (25 new tests).
|
|
159
180
|
- **`CLAUDE.md`**: Root-level AI context file auto-loaded by Claude Code and other AI coding assistants.
|
|
160
181
|
|
|
161
|
-
* **Demo app
|
|
182
|
+
* **Demo app**: 56 pages in 13 categories ordered by what developers look for first (3.9), a per-page table of contents, the source viewer on every example, and public deployment on GitHub Pages with a smoke test of every route. Syntax highlighting is still open.
|
|
162
183
|
* **Quickstart & Installation Guides**: Comprehensive onboarding documentation for developers.
|
package/llms.txt
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opencorestack/opengridx",
|
|
3
|
-
"version": "3.9.
|
|
3
|
+
"version": "3.9.1",
|
|
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.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/opengridx.umd.js",
|
|
@@ -29,6 +29,7 @@
|
|
|
29
29
|
"!lib/**/*.test.tsx",
|
|
30
30
|
"!lib/**/__screenshots__",
|
|
31
31
|
"!lib/**/__snapshots__",
|
|
32
|
+
"!lib/**/__baseline__",
|
|
32
33
|
"docs/architecture",
|
|
33
34
|
"docs/assets",
|
|
34
35
|
"docs/components",
|
|
@@ -65,7 +66,8 @@
|
|
|
65
66
|
"coverage": "vitest run --coverage",
|
|
66
67
|
"prepublishOnly": "npm run build:lib",
|
|
67
68
|
"wiki:build": "node scripts/build-wiki.mjs",
|
|
68
|
-
"check:compiler": "node scripts/check-react-compiler.mjs"
|
|
69
|
+
"check:compiler": "node scripts/check-react-compiler.mjs",
|
|
70
|
+
"check:package": "node scripts/check-package.mjs"
|
|
69
71
|
},
|
|
70
72
|
"keywords": [
|
|
71
73
|
"react",
|