Added
- Breaking change: Added wrapper layout slots and a
layoutoption to control the order of UI elements rendered around the grid (pagination, dialog). The license notification always renders last in the bottom area and is not orderable. Built-in UI now mounts into dedicated wrapper containers, which changes the root DOM structure. #12094 - Re-exported
CellMeta,CellProperties,ColumnSettings,GridSettingsand other public types as named top-level imports fromhandsontableandhandsontable/base. #11240 - Added
hashRevealDelayoption to the password cell type, which briefly shows each typed character before masking it. #12491 - Added the
visibleWhennested-header option ('collapsed','expanded','always') that lets you choose which columns of a collapsible group stay visible when the group is collapsed or expanded. #12776
Changed
- Breaking change: Migrated Handsontable core source from JavaScript to TypeScript #12011
- Breaking change: Renamed the
--ht-wrapper-border-radiustheme variable to--ht-border-radius(tokenwrapperBorderRadiustoborderRadius) and removed the--ht-wrapper-border-widthand--ht-wrapper-border-colorvariables (tokenswrapperBorderWidthandwrapperBorderColor). #12775 - Breaking change: Angular: Updated Angular peer dependency minimum version to 19 in
@handsontable/angular-wrapper#1836 - Dragging a selection past the viewport edge now scrolls the viewport and extends the selection to the newly-scrolled cells. #12344
- Improved getSourceData() performance when called repeatedly inside the cells function or custom renderers. #12480
- Improved scroll performance by caching overlay alignment calculations and using native visibility checks. #12659
- Upgraded ESLint to 8.57 and @typescript-eslint to v8; enabled type-aware TypeScript lint rules (
no-explicit-any,consistent-type-imports,no-floating-promises,no-misused-promises). Theno-unsafe-assignmentandno-unsafe-returnrules are active at warning level pending incremental cleanup. #12664 - Improved TypeScript type annotations in built-in renderers and internal Core methods for strict-mode compatibility. #12722
- Strengthened the TypeScript type of the cell-properties parameter in all built-in renderers, editors, and validators from Record<string, unknown> to the canonical CellProperties interface. #12726
- Included Walkontable in the main tsconfig.json type-check program and reduced as unknown escape-hatch casts in Walkontable from 68 to 10 (-85%) by using generics, union types, and direct structural assignments. #12734
- Added typing for the
handsontablecell type configuration and thegetValuesetting. #12763 - Changed the Notification plugin to render its toasts in the grid's overlay layer. #12777
- Angular: Modernized the Angular wrapper to align with Angular 17–19, simplify setup, reduce dependencies, and clean up tooling. #12451
- Angular: Added support for installing Angular 16 through 22, without the --force flag #12752
Removed
- Breaking change: Removed the numbro, moment.js, DOMPurify, and @handsontable/pikaday dependencies. #12689
- Breaking change: Removed the deprecated
PersistentStateplugin, itspersistentStateoption, and thepersistentStateSave,persistentStateLoad, andpersistentStateResethooks. DeprecatedsaveManualColumnWidths(),loadManualColumnWidths(),saveManualRowHeights(), andloadManualRowHeights()— these now no-op and will be removed in the next major release. #0 - Breaking change: Removed the deprecated Core-level undo/redo methods (
hot.undo(),hot.redo(),hot.clearUndo(),hot.isUndoAvailable(),hot.isRedoAvailable(),hot.undoRedo). Usehot.getPlugin('undoRedo')instead. #12728
Fixed
- Fixed the React and Vue 3 wrappers hiding the table when
height: '100%'was set inside a fixed-height parent. #12445 - Fixed cell selection re-triggering on every scroll gesture on mobile devices. #12450
- Fixed a bug where placing Handsontable inside a container with
overflow-y: hiddenand no explicit height caused the container to expand to the browser's CSS height limit (~2²⁵ px). #12453 - Fixed
alter('remove_row', null, N)not removing the last rows when rows were trimmed. #12460 - Fixed
nestedHeadersoverridingcolWidthswith measured header label widths whenautoColumnSizeis explicitly disabled #12465 - Fixed the select cell editor losing its scroll-tracking behavior after being closed and reopened. #12468
- Fixed sort order for date and intl-date cell type values in the "Filter by value" dropdown. #12471
- Fixed a sub-pixel gap at the grid bottom at non-integer browser zoom levels and misalignment between the master table and the bottom overlay when
fixedRowsBottomis configured. #12472 - Fixed the date filter "before" and "after" conditions including the boundary date in results. #12473
- Fixed
clear()selecting all cells after the table data is cleared. #12477 - Fixed column sorting not working for boolean data when the column type is set to
text. #12479 - Fixed numeric cell type incorrectly parsing dot-thousands values in European locales (e.g.
7.000stored as 7 instead of 7000 withde-DElocale). #12482 - Fixed an infinite loop when pasting a value that cannot be auto-corrected into a date cell with
correctFormat: trueandallowInvalid: false. #12483 - Fixed date and time format correction being overwritten when pasting data alongside columns with async autocomplete validators. #12485
- Fixed the select cell type not preserving the order of numeric selectOptions values. #12487
- Fixed pasting cells from Apple Numbers losing bare mid-cell quote characters and splitting into multiple rows. #12488
- Fixed
columnSummaryto include cells calculated by theformulasplugin in sum, min, max, average and count results. #12489 - Fixed option
dragToScroll#12490 - Fixed an issue where the active cell flipped to the top-start corner after autofill, causing
getSelectedto report incorrect start/end coordinates. The selection direction now matches the drag direction (like Google Sheets and Excel). #12498 - Fixed undo not restoring merged cells after a row containing or overlapping a merged area was removed. #12499
- Fixed the text renderer showing a placeholder instead of the value 0. #12505
- Fixed the dropdown/autocomplete editor overflowing the table's right boundary when
trimDropdownis set tofalse. #12506 - Fixed merged cells not following their data when columns or rows are reordered with
manualColumnMove,manualRowMove, ormanualColumnFreeze. Merges now translate with the underlying data; merges whose physical span becomes non-contiguous after a reorder auto-split into smaller merges, and any single-cell fragment left behind is dropped. #12508 - Fixed the
handsontablecell type editor closing unexpectedly when using filters or dropdown menu on the inner Handsontable instance. #12510 - Fixed the loading overlay resetting the grid scroll position to the top when no cell was selected before showing the overlay. #12514
- Fixed manual column and row resize handle position after scrolling when
preventOverflowis set. #12515 - Fixed the table visually overflowing the configured
widthwhenheightwas not set. #12517 - Fixed Prevent crash when Handsontable is initialized inside a hidden container, rowsRenderCalculator and columnsRenderCalculator on Viewport are never assigned and remain undefined. #12533
- Fixed HTML entity decoding in autocomplete/dropdown when allowHtml is false #12553
- Fixed
allowEmpty: falsebeing ignored in the autocomplete cell type whenstrictmode is disabled. #12555 - Fixed autofill being silently blocked when object-typed cells contain undefined-valued properties or have different key insertion order. #12556
- Fixed
selectCell()andselectCells()so that calling them withchangeListenerset tofalseno longer moves the browser focus away from an externally focused input, textarea, select, or contenteditable element. #12557 - Fixed the
beforeValidate,afterValidate, andpostAfterValidatehooks receiving the data accessor function instead of the visual column index whencolumns[i].datais a function. #12560 - Fixed
getSourceData()andgetData()returning incorrect values when theformulasplugin was used together with an initialmanualColumnMove(ormanualRowMove) configuration. #12561 - Fixed custom editor object values with a different schema being silently discarded by populateFromArray. #12562
- Fixed
beforeColumnResizeandbeforeRowResizehook return values being ignored during drag resize. #12566 - Fixed formulas not being evaluated for array-of-arrays datasets when the
columnsoption skips physical column indexes. #12569 - Fixed a memory leak caused by ThemeManager not unsubscribing from the shared theme object on destroy. #12570
- Fixed viewport scroll jump when Ctrl+clicking a selected cell to deselect it. #12574
- Fixed a memory leak where IntersectionObserver instances were not properly disconnected when
document.bodyhad zero height. #12578 - Fixed a crash when calling
setSourceDataAtCell()inside theafterLoadData()hook during initialization. #12585 - Fixed context menu items in object form (e.g.
add_child,detach_from_parent) not rendering plugin-provided callbacks and translated labels. #12586 - Fixed page scroll jump when inserting or removing a row/column near the bottom of the page on a grid with no fixed height. #12587
- Fixed NestedRows context menu "Insert row above/below" destroying sibling branches on a deeply-nested leaf. #12590
- Fixed the browser page scrolling to the grid when
dataProviderloads rows for the first time into an empty grid withemptyDataStateenabled. #12591 - Fixed a crash when
updateSettingswas called from thebeforeContextMenuShoworbeforeDropdownMenuShowhook. #12593 - Fixed the comment editor rendering off-screen on narrow viewports such as mobile portrait. #12594
- Fixed nested headers rendering incorrectly when manualColumnMove and hiddenColumns are combined. #12610
- Fixed the Comments plugin not showing the popup when the first row of object data has fewer keys than the columns declared via
dataSchemaorcolumns. #12611 - Fixed the "Filter by value" list not showing newly added values after
updateDatais called while a filter is active. #12613 - Fixed the
afterFormulasValuesUpdatehook andgetDataAtCellreturning raw HyperFormula numerics for formula cells of typetimeordate. #12618 - Fixed
Filter by valueselection being lost in dependent column when editing an earlier filtered column #12620 - Fixed column widths widening for merged cells after
loadDatawhenautoColumnSizeis enabled. #12622 - Fixed
scrollViewportTo()not scrolling when a constrained dimension (heightorwidth) is combined with the matchingpreventOverflowvalue. #12624 - Fixed column sorting permuting rows pinned by
fixedRowsToporfixedRowsBottom, which previously corrupted absolute-address formulas in footer rows. #12627 - Fixed undoing row removal to restore all source-data fields, including columns that are not exposed via the
columnsconfiguration. #12629 - Fixed nested headers not expanding column widths to content after resetting
colWidthstoundefinedviaupdateSettings. #12630 - Adjusted TypeScript source code to comply with strict: true compiler option. #12635
- Fixed checkbox cells not toggling on mobile touch when disableVisualSelection is 'current' or true. #12637
- Fixed Ctrl/Cmd+click selection highlight jumping between cells when
disableVisualSelectionis set to a non-falsevalue. #12638 - Fixed pasting a single cell from Excel erasing the cell below the paste target when a custom
sanitizerstrips the HTML. #12640 - Fixed autofill and paste skipping a row or column that was hidden and then shown again, when
hiddenRows/hiddenColumnshadcopyPasteEnabledset tofalse. #12647 - Fixed a TypeError thrown when the StretchColumns ResizeObserver callback fires while the table view is not yet available. #12655
- Made the published TypeScript definitions compatible with TypeScript 5.1+. #12658
- Fixed resize handles moving out of sync during manual resize and after double-click auto-sizing. #12675
- Fixed the setDataAtCell TypeScript signature so the documented array form setDataAtCell(changes, source) type-checks again #12685
- Fixed broken and ambiguous type declarations in the published npm package for ESM and CJS consumers. #12696
- Fixed private
indexSyncermodule leaking through the package exports wildcard pattern. #12724 - Removed stale hand-written type-cast interfaces in the Filters plugin (DropdownMenuPluginInterface, DropdownMenuInterface, MenuFocusNavigatorInterface) and replaced them with canonical types. #12725
- Fixed additive
Ctrl/Cmd+click selection not working in a Handsontable instance rendered inside a separate iframe (or any instance that was not the first one created). #12737 - Fixed rows in frozen columns becoming misaligned with the rest of the grid when column headers wrap onto multiple lines. #12741
- Fixed the middle mouse button (scroll wheel) not starting the browser's native autoscroll when clicked over the grid on Windows and Linux. #12754
- Fixed Page Up and Page Down not scrolling the master viewport to align with the frozen rows overlay. #12755
- Fixed multiple code quality issues reported by SonarCloud static analysis. #12761
- Improved the performance of locale-aware text comparisons (search, filtering, sorting, autocomplete, and checkbox rendering) on large datasets. #12762
- Fixed nested headers not staying aligned with the grid body when hiding or collapsing columns, made them follow column insertion and removal, made collapsing a group take effect (and stay collapsed) even when one of its columns is already hidden, and stopped column removal from leaving the selection on a hidden column (it now moves to the nearest visible one). #12766
- Fixed filter menu components being wrongly hidden when dropdownMenu starts with a '---------' separator. #12781
- Vue: Fixed a Vue 3 wrapper crash on cell edit when
contextMenuordropdownMenuhaduiContainerset to a DOM element under the Vue mount root. #12475 - React: Fixed React component renderers being unmounted and visibly cleared on every grid render after a cell edit. #12494
- React: Fixed an issue where
HotColumnchildren removed from aHotTableleft phantom columns behind in the React wrapper. #12596 - Angular: Fixed subscription leak, missing EmbeddedViewRef cleanup, repeated registerRenderer calls, wrong constructor.name, incorrect prop type, missing null guard in ngOnDestroy, premature editor destruction, redundant double-destroy of already-swept renderer refs, and stale editor reuse when a different column takes an index. #12657