# Handsontable > Handsontable is a JavaScript data grid component with spreadsheet-like UX, available for React, Angular, Vue, and vanilla JavaScript. It ships editing, sorting, filtering, validation, and Excel-compatible formulas (via HyperFormula) as one embeddable component. Handsontable is developed by Handsoncode. The documentation below covers the JavaScript data grid and its framework wrappers. Guides exist in a JavaScript, React, Angular, and Vue variant at the same slug; to switch, swap the framework segment of a URL. Framework-specific guides are listed under their own framework prefix. ## Site - [Landing page](https://handsontable.com/): Product overview and pricing - [Documentation home](https://handsontable.com/docs/): Guides, API reference, and examples - [Sitemap](https://handsontable.com/docs/sitemap-index.xml): XML sitemap of all docs URLs - [robots.txt](https://handsontable.com/robots.txt): Crawl policy ## Documentation for agents - [Full guides corpus (Markdown)](https://handsontable.com/docs/llms-full.txt): Every guide page concatenated into one plain-text file - [Docs pages as Markdown](https://handsontable.com/docs/_md/javascript-data-grid/installation.md): Every docs page, guides and API alike, has a Markdown twin at /docs/_md/{framework}/{slug}.md - [Skills for Claude Code](https://handsontable.com/docs/javascript-data-grid/skills-for-claude-code/): Versioned skills for Handsontable and HyperFormula (repo: https://github.com/handsontable/handsontable-skills) - [Docs MCP server](https://handsontable.com/docs/javascript-data-grid/docs-mcp-server/): First-party MCP server (streamable HTTP) with semantic search over Handsontable and HyperFormula docs guides, API reference, code recipes, release notes, blog posts, and GitHub issues, always current with the latest release (endpoint: https://docs-assistant.handsontable.com/mcp) - [Context7](https://context7.com/handsontable/handsontable): Third-party MCP route serving these docs to any agent ## API reference - [API introduction](https://handsontable.com/docs/javascript-data-grid/api/): Entry point to the API reference - [Configuration options](https://handsontable.com/docs/javascript-data-grid/api/options/): Every grid option - [Core methods](https://handsontable.com/docs/javascript-data-grid/api/core/): Instance methods - [Hooks](https://handsontable.com/docs/javascript-data-grid/api/hooks/): Lifecycle and event hooks ## Getting started - [Introduction](https://handsontable.com/docs/javascript-data-grid/): An overview of Handsontable's developer documentation. Handsontable is a client-side, spreadsheet-like data grid for editing data in web applications. - [Demo](https://handsontable.com/docs/javascript-data-grid/demo/): Play around with a demo of Handsontable, in your favorite framework. - [Installation](https://handsontable.com/docs/javascript-data-grid/installation/): Install Handsontable through your preferred package manager, or import Handsontable's assets directly from a CDN. - [Configuration options](https://handsontable.com/docs/javascript-data-grid/configuration-options/): Configure the data grid down to each column, row, and cell, using various built-in options that control Handsontable's behavior and user interface. - [Grid size](https://handsontable.com/docs/javascript-data-grid/grid-size/): Set the width and height of the grid, using either absolute values or values relative to the parent container. - [Custom ID, class, and style](https://handsontable.com/docs/javascript-data-grid/custom-id-class-style/): Apply a custom ID, class, and inline style to the Handsontable container, to target the grid with your own CSS or JavaScript selectors. - [License key](https://handsontable.com/docs/javascript-data-grid/license-key/): Activate Handsontable, passing your license key in the configuration object. Use a special key for non-commercial and evaluation purposes. - [Instance methods](https://handsontable.com/docs/react-data-grid/instance-methods/): Reference a Handsontable instance from within a React component, to programmatically perform actions such as selecting cells. - [Integration with Redux](https://handsontable.com/docs/react-data-grid/redux/): Maintain the data and configuration options of your grid by using the Redux state container. - [Instance access](https://handsontable.com/docs/angular-data-grid/instance-access/): Reference a Handsontable instance from within a Angular component, to programmatically perform actions. - [Instance reference](https://handsontable.com/docs/vue-data-grid/vue-instance-reference/): Reference a Handsontable instance from within a Vue 3 component, to programmatically perform actions such as selecting cells. - [HotColumn component](https://handsontable.com/docs/vue-data-grid/vue-hot-column/): Configure the Vue 3 data grid's columns, using the props of the "HotColumn" component. Define a custom cell editor or a custom cell renderer. - [Vuex state management](https://handsontable.com/docs/vue-data-grid/vue-vuex/): Use the Vuex state management pattern to maintain the data and configuration options of your Vue 3 data grid. - [Pinia state management](https://handsontable.com/docs/vue-data-grid/vue-pinia/): Use the Pinia store to maintain the data and configuration options of your Vue 3 data grid. - [Use Handsontable in Nuxt](https://handsontable.com/docs/vue-data-grid/vue-nuxt/): Set up Handsontable in a Nuxt 3 application using the ClientOnly component or the .client.vue suffix to avoid SSR errors. ## AI Tools - [Skills for Claude Code](https://handsontable.com/docs/javascript-data-grid/skills-for-claude-code/): Reusable instructions that teach the Claude coding agent how to work with Handsontable, covering plugin development, cell editors, tests, and documentation examples. - [AI Theme Builder](https://handsontable.com/docs/javascript-data-grid/ai-theme-builder/): An AI-assisted tool that turns a written description into a complete Handsontable theme, generating the CSS variables that drive the grid's appearance. - [AI Docs Assistant](https://handsontable.com/docs/javascript-data-grid/ai-docs-assistant/): The Ask AI assistant in the docs header that answers questions about Handsontable APIs, configuration options, hooks, and integration patterns. - [Docs MCP Server](https://handsontable.com/docs/javascript-data-grid/docs-mcp-server/): A public MCP server that gives any AI agent semantic search over the Handsontable and HyperFormula docs, API reference, release notes, GitHub issues, and more. ## Styling - [Themes](https://handsontable.com/docs/javascript-data-grid/themes/): Apply themes using the Theme API or CSS files. Built-in themes include main, horizon, and classic with automatic light and dark modes. - [Design system](https://handsontable.com/docs/javascript-data-grid/handsontable-design-system/): Design, prototype, and customize spreadsheet-like components with the Design System for Figma. - [Theme customization](https://handsontable.com/docs/javascript-data-grid/theme-customization/): Customize Handsontable's appearance using the Theme API, Figma Theme Generator, CSS variables, or the visual Theme Builder. - [Legacy style](https://handsontable.com/docs/javascript-data-grid/legacy-style/): The legacy stylesheet was removed in Handsontable 17.0.0. Learn how to migrate to the Classic theme using the Theme API or CSS imports. ## Columns - [Column headers](https://handsontable.com/docs/javascript-data-grid/column-header/): Use default column headers (A, B, C), or set them to custom values provided by an array or a function. - [Column groups](https://handsontable.com/docs/javascript-data-grid/column-groups/): Group your columns, using multiple levels of nested column headers, to better reflect the structure of your data. - [Column hiding](https://handsontable.com/docs/javascript-data-grid/column-hiding/): Hide individual columns to avoid rendering them as DOM elements. It helps you reduce screen clutter and improve the grid's performance. - [Adding and removing columns](https://handsontable.com/docs/javascript-data-grid/column-adding/): Insert and remove columns programmatically with the alter() method, through the context menu, or automatically with spare columns. - [Column moving](https://handsontable.com/docs/javascript-data-grid/column-moving/): Change the order of columns, either manually (dragging them to another location), or programmatically (using Handsontable's API methods). - [Column freezing](https://handsontable.com/docs/javascript-data-grid/column-freezing/): Lock (freeze) the position of specified columns, keeping them visible while scrolling to another area of the grid. - [Column widths](https://handsontable.com/docs/javascript-data-grid/column-width/): Configure column widths, using an array or a function. Let your users manually change column widths using Handsontable's interface. - [Column summary](https://handsontable.com/docs/javascript-data-grid/column-summary/): Calculate sum, min, max, count, average or custom aggregates of individual columns' data, using Handsontable's aggregate functions. - [Column virtualization](https://handsontable.com/docs/javascript-data-grid/column-virtualization/): Render hundreds of columns without freezing the browser, using column virtualization. - [Column filter](https://handsontable.com/docs/javascript-data-grid/column-filter/): Filter your data by values or by a set of conditions. - [Column component](https://handsontable.com/docs/react-data-grid/hot-column/): Configure the React data grid's columns, using the props of the "HotColumn" component. Pass your component as a custom cell editor or a custom cell renderer. ## Rows - [Row headers](https://handsontable.com/docs/javascript-data-grid/row-header/): Use default row headers (1, 2, 3), or set them to custom values provided by an array or a function. - [Row parent-child](https://handsontable.com/docs/javascript-data-grid/row-parent-child/): Reflect the parent-child relationship of your data, using Handsontable's interactive UI elements such as expand and collapse buttons or an extended context menu. - [Row hiding](https://handsontable.com/docs/javascript-data-grid/row-hiding/): Hide individual rows to avoid rendering them as DOM elements. It helps you reduce screen clutter and improve the grid's performance. - [Row moving](https://handsontable.com/docs/javascript-data-grid/row-moving/): Change the order of rows, either manually (dragging them to another location), or programmatically (using Handsontable's API methods). - [Row freezing](https://handsontable.com/docs/javascript-data-grid/row-freezing/): Lock (freeze) the position of specified rows, keeping them visible while scrolling to another area of the grid. This feature is sometimes called "pinned rows". - [Row heights](https://handsontable.com/docs/javascript-data-grid/row-height/): Configure row heights, using a number, an array or a function. Let your users manually change row heights using Handsontable's interface. - [Row virtualization](https://handsontable.com/docs/javascript-data-grid/row-virtualization/): Render thousands of rows without freezing the browser, using row virtualization. - [Rows sorting](https://handsontable.com/docs/javascript-data-grid/rows-sorting/): Sort rows alphabetically or numerically, in ascending, descending or a custom order, by one or multiple columns. - [Rows pagination](https://handsontable.com/docs/javascript-data-grid/rows-pagination/): The pagination component splits the data into a range of pages, allowing users to easily navigate through large data sets. - [Row trimming](https://handsontable.com/docs/javascript-data-grid/row-trimming/): Hide individual rows from your interface and exclude them from the rendering process and DataMap. This feature is similar, but not the same, as "hiding rows". - [Row pre-populating](https://handsontable.com/docs/javascript-data-grid/row-prepopulating/): Pre-populate spare rows with default values using minSpareRows, custom placeholder renderers, or auto-filling template values. ## Cell features - [Selection](https://handsontable.com/docs/javascript-data-grid/selection/): Select a single cell, a range of adjacent cells, or multiple non-adjacent ranges of cells. - [Move cells](https://handsontable.com/docs/javascript-data-grid/move-cells/): Move or copy a selected range of cells by dragging its border. Formula references adjust automatically when the Formulas plugin is active. - [Merge cells](https://handsontable.com/docs/javascript-data-grid/merge-cells/): Merge adjacent cells, using the "Ctrl + M" shortcut or the context menu. Control merged cells, using Handsontable's API. - [Conditional formatting](https://handsontable.com/docs/javascript-data-grid/conditional-formatting/): Style cells dynamically based on their values, using CSS classes, custom renderers, or a color scale. - [Text alignment](https://handsontable.com/docs/javascript-data-grid/text-alignment/): Align values within cells: horizontally (to the right, left, center, or by justifying them), and vertically (to the top, middle, or bottom of the cell). - [Read-only cells](https://handsontable.com/docs/javascript-data-grid/read-only-cells/): Make specified cells read-only to protect them from unwanted changes but still allow navigation and copying of data. - [Comments](https://handsontable.com/docs/javascript-data-grid/comments/): Add a comment (a note) to a cell, using the context menu, just like in Excel. Edit and delete comments. Make comments read-only. - [Autofill values](https://handsontable.com/docs/javascript-data-grid/autofill-values/): Copy a cell's value into multiple other cells, using the "fill handle" UI element. Configure the direction of copying, and more, through Handsontable's API. - [Formatting cells](https://handsontable.com/docs/javascript-data-grid/formatting-cells/): Change the appearance of cells, using custom CSS classes, inline styles, or custom cell borders. ## Cell functions - [Cell functions](https://handsontable.com/docs/javascript-data-grid/cell-function/): Render, edit, and validate the contents of your cells, using Handsontable's cell functions. Quickly set up your cells, using cell types. - [Cell renderer](https://handsontable.com/docs/javascript-data-grid/cell-renderer/): Create a custom cell renderer function, to have full control over how a cell looks. - [Cell editor](https://handsontable.com/docs/javascript-data-grid/cell-editor/): Create a custom cell editor function, to have full control over how editing works in the cells of your data grid. - [Cell validator](https://handsontable.com/docs/javascript-data-grid/cell-validator/): Validate data added or changed by the user, with predefined or custom rules. Validation helps you make sure that the data matches the expected format. - [Custom cells](https://handsontable.com/docs/javascript-data-grid/custom-cells/): Validate data added or changed by the user, with predefined or custom rules. Validation helps you make sure that the data matches the expected format. ## Cell types - [Cell type](https://handsontable.com/docs/javascript-data-grid/cell-type/): Use Handsontable's built-in cell types such as autocomplete, date, time, and more, for consistent UI across cell renderer, editor, and validator. - [Text cell type](https://handsontable.com/docs/javascript-data-grid/text-cell-type/): Use the text cell type, the default cell type in Handsontable, to display and edit plain text values. - [Numeric cell type](https://handsontable.com/docs/javascript-data-grid/numeric-cell-type/): Display, format, sort, and filter numbers correctly by using the numeric cell type. - [Date cell type](https://handsontable.com/docs/javascript-data-grid/date-cell-type/): Display, format, sort, and filter dates correctly by using the date cell type. - [Time cell type](https://handsontable.com/docs/javascript-data-grid/time-cell-type/): Display, format, sort, and filter time values correctly by using the time cell type. - [Date-time cell type](https://handsontable.com/docs/javascript-data-grid/datetime-cell-type/): Display, format, sort, and filter combined date and time values by using the datetime cell type. - [Checkbox cell type](https://handsontable.com/docs/javascript-data-grid/checkbox-cell-type/): Create interactive elements that can be checked or unchecked, by using the checkbox cell type. - [Select cell type](https://handsontable.com/docs/javascript-data-grid/select-cell-type/): Use the select cell type to collect user input with an HTML