Powerful virtual data table smartsheet with advanced customization. Best features from excel plus incredible performance 🔋
See the codeRender 1M+ rows, millions of cells, and thousands of columns efficiently with no hard row limit in the grid.
Used by some of the largest companies in Europe and the United States.
Demo and API • Key Features • Pro Features • How To Use • Installation • Docs • License
RevoGrid material theme.
High Performance: Render 1M+ rows and millions of cells with no hard row limit in the grid. Virtualization keeps the DOM focused on the visible viewport.
Accessibility: Follows WAI-ARIA best practices.
RTL Support: Comprehensive Right-to-Left language support for Arabic, Hebrew, Persian, and other RTL languages. Features automatic column reordering, proper text alignment, and layout adjustments for RTL interfaces.
Lightweight: Minimal initial bundle size. Can be imported with polyfills or as a module for modern browsers.
Intelligent Virtual DOM: Smart row recombination to minimize redraws.
Virtual Scroll: Handles large datasets without rendering every row or column into the DOM.
Drag and Drop: Drag and drop in rows and columns.
Sorting: Multiple options, customizable per column, with advanced event handling.
Blank filters preserve source-value identity and own-property presence. By default,
null, owned undefined, exactly "", and missing own properties are blank;
whitespace-only strings, false, 0, NaN, arrays, and objects are not. The
policy can be configured at grid level and overridden field-by-field per column
with blankSemantics. Existing saved empty and notEmpty operator IDs remain
compatible and are labeled “Is blank” and “Is not blank.”
const filter = {
blankSemantics: {
whitespaceOnlyString: true,
emptyArray: true,
isBlank(value, context, fallbackResult) {
return value === 'N/A' || fallbackResult;
},
},
};
const columns = [{
prop: 'tags',
filter: 'array',
// Partial column policy; other fields inherit the grid policy.
blankSemantics: { emptyArray: false },
}];
An inherited property counts as missing. A cellParser supplies the value for
ordinary comparisons but does not replace the raw value used for blank checks.
The callback receives the source value, row model, column, property, parsed
value, own-property status, effective policy, and fallback result. “Is not
blank” is the exact inverse of the resolved blank predicate. Typed operators
remain strict; blank configuration never normalizes false, 0, or arrays
into another source value.
@revolist/revogrid-pdf-export plugin.Custom Sizes: Define custom sizes for columns and rows. Automatic sizing based on content.
Column Resizing: Adjust column widths.
Row Resizing: Resize from row-header edges or enable full-row resize edges with optional height limits.
Auto Size Columns: Intelligent column width adjustment that automatically adapts to content, ensuring optimal readability and layout efficiency.
Pinned/Sticky/Freezed Elements:
Grouping:
Column Types: More details
Range Operations:
Extensibility: Modern VNode features and tsx support for easy extension.
Trimmed Rows: Hide rows on demand.
Plugin System: Create custom plugins or extend existing ones easily.
Customizations:
AI Agents and MCP: Connect Codex, Cursor, Claude Code, and VS Code to version-aware RevoGrid docs, examples, migrations, feature availability, and typed API context.
Rich API & Additional Improvements: Explore hundreds of other small customizations and improvements in RevoGrid.
RevoGrid Pro extends the core grid with production plugins for advanced data entry, analytics, layout, validation, remote data workflows, and enterprise planning.
Advanced Data Structures:
Headers, Columns, and Grid Structure:
Remote Data and Large Dataset Workflows:
Data Management and Change Tracking:
xlsx, xlsm, xlsb, and xls.Selection and Range Operations:
Filtering, Search, and Grouping:
Calculations and Formulas:
Data Visualization and Cell Rendering:
Editing and Data Entry:
User Interaction and UX:
Development and Integration:
Enterprise Analytics and Planning:
Advanced Support:
I am RevoGrid, your solution for efficiently representing large datasets
in an "Excel-like" data table or as a list. Render native components inside each cell!
The library published as a scoped NPM package in the NPMJS Revolist account. Check for more info on our demo side.
With NPM:
npm i @revolist/revogrid --save;
With Yarn:
yarn add @revolist/revogrid;
![]() | ![]() | ![]() | ![]() | ![]() |
|---|---|---|---|---|
| Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ |
In <revo-grid /> we have developed a sophisticated Continuous Delivery (CD) system powered by GitHub Actions. This advanced system automatically builds and delivers grid versions across multiple frameworks, including React, Angular, Svelte, Vue 2, Vue 3, and Plotly Dash for Python, with full type support. This ensures continuous version delivery, providing the latest grid enhancements and upgrades across all supported frameworks ✨. In the future (version 5), we are planning to switch to monorepo-based development.
RevoGrid functions as a web component. Simply place the component on your page and access its properties as you would with any other HTML element. It also offers multiple ways to integrate our grid into your project:
// Select the RevoGrid element from the DOM
const grid = document.querySelector('revo-grid');
// Define the columns for the grid
grid.columns = [{ prop: 'name', name: 'First Column' }, { prop: 'details' }];
// Define the data source for the grid
grid.source = [{ name: 'New Item', details: 'Item Description' }];
// Select the RevoGrid element from the DOM
const grid = document.querySelector('revo-grid');
// Define the columns for the grid
grid.columns = [
{
prop: 'name',
name: 'Custom cell template',
// Custom cell template
cellTemplate(h, { value }) {
return h(
'div',
{
style: { backgroundColor: 'red' }, // Styling the cell background
class: { 'inner-cell': true }, // Adding a CSS class
},
value || '' // Display the cell content or an empty string if undefined
);
},
},
];
// Define the data source for the grid
grid.source = [{ name: 'New Item' }];
2.0+: Introduced the plugin system, grouping, sorting, and filtering.
3.0+: Breaking changes introduced:
row -> rgRowcol -> rgColdata-cell -> rgCelldata-header-cell -> rgHeaderCellafterEdit is now afteredit. Check the API for details.4.0+: Breaking changes introduced. See the migration guide.
Redesigned type support:
- Removed deprecated namespaces:
- Before: RevoGrid.ColumnRegular
- Now: ColumnRegular;
- Improved type import:
- Before: import { RevoGrid } from '@revolist/revogrid/dist/types/interfaces'
- Now: import { ColumnRegular } from '@revolist/revogrid'.
- Changed viewport type names everywhere. For example, before: rowDefinitions: [{ type: "row", index: 0, size: 145 }], after: rowDefinitions: [{ type: "rgRow", index: 0, size: 145 }].
afterEdit -> afteredit.BeforeRowRenderEvent. Check all events for details.Major improvements:
additionalData for templates and editors. Prop gives access to parent/root app context.What next?
We would like to extend our heartfelt gratitude to our sponsors for their generous support. Their contributions help us maintain and develop RevoGrid.
If you or your company would like to support the ongoing development of RevoGrid, please consider or use a Pro version. Your support will help us continue to improve the project and provide the best possible tool for the community.
Thank you for supporting RevoGrid! 🙏
RevoGrid is thoroughly tested to ensure reliability and stability.
| Suite | Command | Scope |
|---|---|---|
| Unit | npm run test | Services, utilities, pure logic |
| E2E (Playwright) | npm run test:e2e | Real browser rendering & interaction |
End-to-end tests use @stencil/playwright to run <revo-grid> in a real Chromium browser. The dev server starts automatically when you run:
npm run test:e2e
Test files live in e2e/ and share helpers from e2e/helpers.ts:
For targeted local work, confirm a new or changed test is discoverable before starting the dev server:
./node_modules/.bin/playwright test e2e/pinning.spec.ts --grep "test name" --list
Then run a non-watch Stencil build to catch compile errors without invoking the Playwright web-server lifecycle:
./node_modules/.bin/stencil build --dev --serve --no-open
If Playwright fails before any tests run with a Stencil dev-server startup error such as ERR_SOCKET_BAD_PORT and port 65536, treat it as an environment/startup issue rather than an e2e assertion failure. Check node -v and whether another local server is already using localhost:3333, then retry only after changing that environment state.
By getting involved, you'll have the opportunity to enhance your skills, gain valuable experience, and make a significant impact on an innovative project. Your contribution, no matter how big or small, is valuable.
MIT
Overall
Maintained
Code review
Latest release
Releases this year
802 followers · starred Feb 2026
429 followers · starred Jan 2021
601 followers · starred Jan 2021
104 followers · starred May 2022
Powerful virtual data table smartsheet with advanced customization. Best features from excel plus incredible performance 🔋
See the codeRender 1M+ rows, millions of cells, and thousands of columns efficiently with no hard row limit in the grid.
Used by some of the largest companies in Europe and the United States.
Demo and API • Key Features • Pro Features • How To Use • Installation • Docs • License
RevoGrid material theme.
High Performance: Render 1M+ rows and millions of cells with no hard row limit in the grid. Virtualization keeps the DOM focused on the visible viewport.
Accessibility: Follows WAI-ARIA best practices.
RTL Support: Comprehensive Right-to-Left language support for Arabic, Hebrew, Persian, and other RTL languages. Features automatic column reordering, proper text alignment, and layout adjustments for RTL interfaces.
Lightweight: Minimal initial bundle size. Can be imported with polyfills or as a module for modern browsers.
Intelligent Virtual DOM: Smart row recombination to minimize redraws.
Virtual Scroll: Handles large datasets without rendering every row or column into the DOM.
Drag and Drop: Drag and drop in rows and columns.
Sorting: Multiple options, customizable per column, with advanced event handling.
Blank filters preserve source-value identity and own-property presence. By default,
null, owned undefined, exactly "", and missing own properties are blank;
whitespace-only strings, false, 0, NaN, arrays, and objects are not. The
policy can be configured at grid level and overridden field-by-field per column
with blankSemantics. Existing saved empty and notEmpty operator IDs remain
compatible and are labeled “Is blank” and “Is not blank.”
const filter = {
blankSemantics: {
whitespaceOnlyString: true,
emptyArray: true,
isBlank(value, context, fallbackResult) {
return value === 'N/A' || fallbackResult;
},
},
};
const columns = [{
prop: 'tags',
filter: 'array',
// Partial column policy; other fields inherit the grid policy.
blankSemantics: { emptyArray: false },
}];
An inherited property counts as missing. A cellParser supplies the value for
ordinary comparisons but does not replace the raw value used for blank checks.
The callback receives the source value, row model, column, property, parsed
value, own-property status, effective policy, and fallback result. “Is not
blank” is the exact inverse of the resolved blank predicate. Typed operators
remain strict; blank configuration never normalizes false, 0, or arrays
into another source value.
@revolist/revogrid-pdf-export plugin.Custom Sizes: Define custom sizes for columns and rows. Automatic sizing based on content.
Column Resizing: Adjust column widths.
Row Resizing: Resize from row-header edges or enable full-row resize edges with optional height limits.
Auto Size Columns: Intelligent column width adjustment that automatically adapts to content, ensuring optimal readability and layout efficiency.
Pinned/Sticky/Freezed Elements:
Grouping:
Column Types: More details
Range Operations:
Extensibility: Modern VNode features and tsx support for easy extension.
Trimmed Rows: Hide rows on demand.
Plugin System: Create custom plugins or extend existing ones easily.
Customizations:
AI Agents and MCP: Connect Codex, Cursor, Claude Code, and VS Code to version-aware RevoGrid docs, examples, migrations, feature availability, and typed API context.
Rich API & Additional Improvements: Explore hundreds of other small customizations and improvements in RevoGrid.
RevoGrid Pro extends the core grid with production plugins for advanced data entry, analytics, layout, validation, remote data workflows, and enterprise planning.
Advanced Data Structures:
Headers, Columns, and Grid Structure:
Remote Data and Large Dataset Workflows:
Data Management and Change Tracking:
xlsx, xlsm, xlsb, and xls.Selection and Range Operations:
Filtering, Search, and Grouping:
Calculations and Formulas:
Data Visualization and Cell Rendering:
Editing and Data Entry:
User Interaction and UX:
Development and Integration:
Enterprise Analytics and Planning:
Advanced Support:
I am RevoGrid, your solution for efficiently representing large datasets
in an "Excel-like" data table or as a list. Render native components inside each cell!
The library published as a scoped NPM package in the NPMJS Revolist account. Check for more info on our demo side.
With NPM:
npm i @revolist/revogrid --save;
With Yarn:
yarn add @revolist/revogrid;
![]() | ![]() | ![]() | ![]() | ![]() |
|---|---|---|---|---|
| Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ |
In <revo-grid /> we have developed a sophisticated Continuous Delivery (CD) system powered by GitHub Actions. This advanced system automatically builds and delivers grid versions across multiple frameworks, including React, Angular, Svelte, Vue 2, Vue 3, and Plotly Dash for Python, with full type support. This ensures continuous version delivery, providing the latest grid enhancements and upgrades across all supported frameworks ✨. In the future (version 5), we are planning to switch to monorepo-based development.
RevoGrid functions as a web component. Simply place the component on your page and access its properties as you would with any other HTML element. It also offers multiple ways to integrate our grid into your project:
// Select the RevoGrid element from the DOM
const grid = document.querySelector('revo-grid');
// Define the columns for the grid
grid.columns = [{ prop: 'name', name: 'First Column' }, { prop: 'details' }];
// Define the data source for the grid
grid.source = [{ name: 'New Item', details: 'Item Description' }];
// Select the RevoGrid element from the DOM
const grid = document.querySelector('revo-grid');
// Define the columns for the grid
grid.columns = [
{
prop: 'name',
name: 'Custom cell template',
// Custom cell template
cellTemplate(h, { value }) {
return h(
'div',
{
style: { backgroundColor: 'red' }, // Styling the cell background
class: { 'inner-cell': true }, // Adding a CSS class
},
value || '' // Display the cell content or an empty string if undefined
);
},
},
];
// Define the data source for the grid
grid.source = [{ name: 'New Item' }];
2.0+: Introduced the plugin system, grouping, sorting, and filtering.
3.0+: Breaking changes introduced:
row -> rgRowcol -> rgColdata-cell -> rgCelldata-header-cell -> rgHeaderCellafterEdit is now afteredit. Check the API for details.4.0+: Breaking changes introduced. See the migration guide.
Redesigned type support:
- Removed deprecated namespaces:
- Before: RevoGrid.ColumnRegular
- Now: ColumnRegular;
- Improved type import:
- Before: import { RevoGrid } from '@revolist/revogrid/dist/types/interfaces'
- Now: import { ColumnRegular } from '@revolist/revogrid'.
- Changed viewport type names everywhere. For example, before: rowDefinitions: [{ type: "row", index: 0, size: 145 }], after: rowDefinitions: [{ type: "rgRow", index: 0, size: 145 }].
afterEdit -> afteredit.BeforeRowRenderEvent. Check all events for details.Major improvements:
additionalData for templates and editors. Prop gives access to parent/root app context.What next?
We would like to extend our heartfelt gratitude to our sponsors for their generous support. Their contributions help us maintain and develop RevoGrid.
If you or your company would like to support the ongoing development of RevoGrid, please consider or use a Pro version. Your support will help us continue to improve the project and provide the best possible tool for the community.
Thank you for supporting RevoGrid! 🙏
RevoGrid is thoroughly tested to ensure reliability and stability.
| Suite | Command | Scope |
|---|---|---|
| Unit | npm run test | Services, utilities, pure logic |
| E2E (Playwright) | npm run test:e2e | Real browser rendering & interaction |
End-to-end tests use @stencil/playwright to run <revo-grid> in a real Chromium browser. The dev server starts automatically when you run:
npm run test:e2e
Test files live in e2e/ and share helpers from e2e/helpers.ts:
For targeted local work, confirm a new or changed test is discoverable before starting the dev server:
./node_modules/.bin/playwright test e2e/pinning.spec.ts --grep "test name" --list
Then run a non-watch Stencil build to catch compile errors without invoking the Playwright web-server lifecycle:
./node_modules/.bin/stencil build --dev --serve --no-open
If Playwright fails before any tests run with a Stencil dev-server startup error such as ERR_SOCKET_BAD_PORT and port 65536, treat it as an environment/startup issue rather than an e2e assertion failure. Check node -v and whether another local server is already using localhost:3333, then retry only after changing that environment state.
By getting involved, you'll have the opportunity to enhance your skills, gain valuable experience, and make a significant impact on an innovative project. Your contribution, no matter how big or small, is valuable.
MIT
Overall
Maintained
Code review
Latest release
Releases this year
802 followers · starred Feb 2026
429 followers · starred Jan 2021
601 followers · starred Jan 2021
104 followers · starred May 2022