handsontable 17.1.0-rc9 → 17.1.0

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.
Files changed (72) hide show
  1. package/CHANGELOG.md +6 -1
  2. package/base.js +2 -2
  3. package/base.mjs +2 -2
  4. package/core.js +12 -5
  5. package/core.mjs +12 -5
  6. package/dist/handsontable.full.js +281 -126
  7. package/dist/handsontable.full.min.js +108 -108
  8. package/dist/handsontable.js +66 -27
  9. package/dist/handsontable.min.js +30 -30
  10. package/dist/languages/all.min.js +1 -1
  11. package/dist/themes/classic.js +2 -2
  12. package/dist/themes/classic.min.js +2 -2
  13. package/dist/themes/horizon.js +2 -2
  14. package/dist/themes/horizon.min.js +2 -2
  15. package/dist/themes/main.js +2 -2
  16. package/dist/themes/main.min.js +2 -2
  17. package/dist/themes/static/variables/colors/ant.js +2 -2
  18. package/dist/themes/static/variables/colors/ant.min.js +2 -2
  19. package/dist/themes/static/variables/colors/classic.js +2 -2
  20. package/dist/themes/static/variables/colors/classic.min.js +2 -2
  21. package/dist/themes/static/variables/colors/horizon.js +2 -2
  22. package/dist/themes/static/variables/colors/horizon.min.js +2 -2
  23. package/dist/themes/static/variables/colors/main.js +2 -2
  24. package/dist/themes/static/variables/colors/main.min.js +2 -2
  25. package/dist/themes/static/variables/colors/material.js +2 -2
  26. package/dist/themes/static/variables/colors/material.min.js +2 -2
  27. package/dist/themes/static/variables/colors/shadcn.js +2 -2
  28. package/dist/themes/static/variables/colors/shadcn.min.js +2 -2
  29. package/dist/themes/static/variables/density.js +2 -2
  30. package/dist/themes/static/variables/density.min.js +2 -2
  31. package/dist/themes/static/variables/helpers/iconsMap.js +2 -2
  32. package/dist/themes/static/variables/helpers/iconsMap.min.js +2 -2
  33. package/dist/themes/static/variables/icons/horizon.js +2 -2
  34. package/dist/themes/static/variables/icons/horizon.min.js +2 -2
  35. package/dist/themes/static/variables/icons/main.js +2 -2
  36. package/dist/themes/static/variables/icons/main.min.js +2 -2
  37. package/dist/themes/static/variables/sizing.js +2 -2
  38. package/dist/themes/static/variables/sizing.min.js +2 -2
  39. package/dist/themes/static/variables/tokens/classic.js +2 -2
  40. package/dist/themes/static/variables/tokens/classic.min.js +2 -2
  41. package/dist/themes/static/variables/tokens/horizon.js +2 -2
  42. package/dist/themes/static/variables/tokens/horizon.min.js +2 -2
  43. package/dist/themes/static/variables/tokens/main.js +2 -2
  44. package/dist/themes/static/variables/tokens/main.min.js +2 -2
  45. package/helpers/dom/element.js +2 -4
  46. package/helpers/dom/element.mjs +2 -4
  47. package/helpers/mixed.js +1 -1
  48. package/helpers/mixed.mjs +1 -1
  49. package/package.json +1 -1
  50. package/plugins/dataProvider/query/pagination.js +6 -3
  51. package/plugins/dataProvider/query/pagination.mjs +17 -7
  52. package/plugins/emptyDataState/emptyDataState.js +1 -1
  53. package/plugins/emptyDataState/emptyDataState.mjs +1 -1
  54. package/plugins/pagination/pagination.d.ts +1 -0
  55. package/plugins/pagination/pagination.js +7 -0
  56. package/plugins/pagination/pagination.mjs +7 -0
  57. package/selection/mouseEventHandler.js +12 -2
  58. package/selection/mouseEventHandler.mjs +12 -2
  59. package/styles/handsontable.css +2 -2
  60. package/styles/handsontable.min.css +2 -2
  61. package/styles/handsontableStyles.js +1 -1
  62. package/styles/handsontableStyles.mjs +1 -1
  63. package/styles/ht-icons-horizon.min.css +2 -2
  64. package/styles/ht-icons-main.min.css +2 -2
  65. package/styles/ht-theme-classic-no-icons.min.css +2 -2
  66. package/styles/ht-theme-classic.min.css +2 -2
  67. package/styles/ht-theme-horizon-no-icons.min.css +2 -2
  68. package/styles/ht-theme-horizon.min.css +2 -2
  69. package/styles/ht-theme-main-no-icons.min.css +2 -2
  70. package/styles/ht-theme-main.min.css +2 -2
  71. package/themes/engine/manager.js +50 -2
  72. package/themes/engine/manager.mjs +50 -2
package/CHANGELOG.md CHANGED
@@ -9,7 +9,7 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
9
9
 
10
10
  <!-- UNVERSIONED -->
11
11
 
12
- ## [17.1.0-rc8] - 2026-05-08
12
+ ## [17.1.0] - 2026-05-19
13
13
 
14
14
  ### Added
15
15
  - Added a hit area for dropdown menu and collapsible buttons [#12070](https://github.com/handsontable/handsontable/pull/12070)
@@ -78,6 +78,11 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
78
78
  - Fixed one-pixel horizontal alignment for the left pagination caret [#2791](https://github.com/handsontable/handsontable/pull/2791)
79
79
  - Fixed setDataAtRowProp interrupting edits in progress [#4305](https://github.com/handsontable/handsontable/issues/4305)
80
80
  - React: Fixed the React wrapper skipping settings updates when `dataSchema` or `columns` contains non-plain objects such as `Date`, `Set`, or `Map`. [#12207](https://github.com/handsontable/handsontable/pull/12207)
81
+ - Fixed the loading overlay resetting the grid scroll position to the top when no cell was selected before showing the overlay. [#12514](https://github.com/handsontable/handsontable/issues/12514)
82
+ - Fixed a memory leak caused by ThemeManager not unsubscribing from the shared theme object on destroy. [#12570](https://github.com/handsontable/handsontable/issues/12570)
83
+ - Fixed viewport scroll jump when Ctrl+clicking a selected cell to deselect it. [#12574](https://github.com/handsontable/handsontable/issues/12574)
84
+ - Fixed a memory leak where IntersectionObserver instances were not properly disconnected when `document.body` had zero height. [#12578](https://github.com/handsontable/handsontable/issues/12578)
85
+ - Fixed the browser page scrolling to the grid when `dataProvider` loads rows for the first time into an empty grid with `emptyDataState` enabled. [#12591](https://github.com/handsontable/handsontable/issues/12591)
81
86
 
82
87
  ### Security
83
88
  - Patched critical and high dependency vulnerabilities across the monorepo and aligned Angular wrapper tooling for compatibility. [#12237](https://github.com/handsontable/handsontable/issues/12237)
package/base.js CHANGED
@@ -60,8 +60,8 @@ Handsontable.hooks = _hooks.Hooks.getSingleton();
60
60
  Handsontable.CellCoords = _src.CellCoords;
61
61
  Handsontable.CellRange = _src.CellRange;
62
62
  Handsontable.packageName = 'handsontable';
63
- Handsontable.buildDate = "13/05/2026 10:01:32";
64
- Handsontable.version = "17.1.0-rc9";
63
+ Handsontable.buildDate = "19/05/2026 14:51:41";
64
+ Handsontable.version = "17.1.0";
65
65
  Handsontable.languages = {
66
66
  dictionaryKeys: _registry.dictionaryKeys,
67
67
  getLanguageDictionary: _registry.getLanguageDictionary,
package/base.mjs CHANGED
@@ -35,8 +35,8 @@ Handsontable.hooks = Hooks.getSingleton();
35
35
  Handsontable.CellCoords = CellCoords;
36
36
  Handsontable.CellRange = CellRange;
37
37
  Handsontable.packageName = 'handsontable';
38
- Handsontable.buildDate = "13/05/2026 10:01:32";
39
- Handsontable.version = "17.1.0-rc9";
38
+ Handsontable.buildDate = "19/05/2026 14:51:41";
39
+ Handsontable.version = "17.1.0";
40
40
  Handsontable.languages = {
41
41
  dictionaryKeys,
42
42
  getLanguageDictionary,
package/core.js CHANGED
@@ -453,7 +453,9 @@ function Core(rootContainer, userSettings, rootInstanceSymbol = false) {
453
453
  const selectionSource = selection.getSelectionSource();
454
454
  const ignoreScrollSources = [
455
455
  'loadData',
456
- 'updateData'
456
+ 'updateData',
457
+ 'deselect',
458
+ 'shift'
457
459
  ];
458
460
  if (isLastSelectionLayer && !ignoreScrollSources.includes(selectionSource) && (!preventScrolling.isTouched() || preventScrolling.isTouched() && !preventScrolling.value)) {
459
461
  viewportScroller.scrollTo(cellCoords);
@@ -484,14 +486,16 @@ function Core(rootContainer, userSettings, rootInstanceSymbol = false) {
484
486
  'shift',
485
487
  'refresh',
486
488
  'loadData',
487
- 'updateData'
489
+ 'updateData',
490
+ 'deselect'
488
491
  ].includes(selectionSource)) {
489
492
  editorManager.closeEditor(null);
490
493
  }
491
494
  if (![
492
495
  'refresh',
493
496
  'loadData',
494
- 'updateData'
497
+ 'updateData',
498
+ 'deselect'
495
499
  ].includes(selectionSource)) {
496
500
  instance.view.render();
497
501
  editorManager.prepareEditor();
@@ -515,7 +519,10 @@ function Core(rootContainer, userSettings, rootInstanceSymbol = false) {
515
519
  const { from, to } = cellRanges[selectionLayerLevel];
516
520
  this.runHooks('afterSelectionEnd', from.row, from.col, to.row, to.col, selectionLayerLevel);
517
521
  this.runHooks('afterSelectionEndByProp', from.row, instance.colToProp(from.col), to.row, instance.colToProp(to.col), selectionLayerLevel);
518
- if (selection.getSelectionSource() === 'refresh') {
522
+ if ([
523
+ 'refresh',
524
+ 'deselect'
525
+ ].includes(selection.getSelectionSource())) {
519
526
  instance.view.render();
520
527
  editorManager.prepareEditor();
521
528
  }
@@ -1081,7 +1088,7 @@ function Core(rootContainer, userSettings, rootInstanceSymbol = false) {
1081
1088
  focusGridManager.init();
1082
1089
  if ((0, _rootInstance.isRootInstance)(this)) {
1083
1090
  (0, _a11yAnnouncer.install)(instance.rootPortalElement);
1084
- (0, _mixed._injectProductInfo)(mergedUserSettings.licenseKey, this.rootWrapperElement, "13/05/2026");
1091
+ (0, _mixed._injectProductInfo)(mergedUserSettings.licenseKey, this.rootWrapperElement, "19/05/2026");
1085
1092
  }
1086
1093
  instance.runHooks('init');
1087
1094
  this.render();
package/core.mjs CHANGED
@@ -438,7 +438,9 @@ const deprecationWarns = new Set();
438
438
  const selectionSource = selection.getSelectionSource();
439
439
  const ignoreScrollSources = [
440
440
  'loadData',
441
- 'updateData'
441
+ 'updateData',
442
+ 'deselect',
443
+ 'shift'
442
444
  ];
443
445
  if (isLastSelectionLayer && !ignoreScrollSources.includes(selectionSource) && (!preventScrolling.isTouched() || preventScrolling.isTouched() && !preventScrolling.value)) {
444
446
  viewportScroller.scrollTo(cellCoords);
@@ -469,14 +471,16 @@ const deprecationWarns = new Set();
469
471
  'shift',
470
472
  'refresh',
471
473
  'loadData',
472
- 'updateData'
474
+ 'updateData',
475
+ 'deselect'
473
476
  ].includes(selectionSource)) {
474
477
  editorManager.closeEditor(null);
475
478
  }
476
479
  if (![
477
480
  'refresh',
478
481
  'loadData',
479
- 'updateData'
482
+ 'updateData',
483
+ 'deselect'
480
484
  ].includes(selectionSource)) {
481
485
  instance.view.render();
482
486
  editorManager.prepareEditor();
@@ -500,7 +504,10 @@ const deprecationWarns = new Set();
500
504
  const { from, to } = cellRanges[selectionLayerLevel];
501
505
  this.runHooks('afterSelectionEnd', from.row, from.col, to.row, to.col, selectionLayerLevel);
502
506
  this.runHooks('afterSelectionEndByProp', from.row, instance.colToProp(from.col), to.row, instance.colToProp(to.col), selectionLayerLevel);
503
- if (selection.getSelectionSource() === 'refresh') {
507
+ if ([
508
+ 'refresh',
509
+ 'deselect'
510
+ ].includes(selection.getSelectionSource())) {
504
511
  instance.view.render();
505
512
  editorManager.prepareEditor();
506
513
  }
@@ -1066,7 +1073,7 @@ const deprecationWarns = new Set();
1066
1073
  focusGridManager.init();
1067
1074
  if (isRootInstance(this)) {
1068
1075
  installAccessibilityAnnouncer(instance.rootPortalElement);
1069
- _injectProductInfo(mergedUserSettings.licenseKey, this.rootWrapperElement, "13/05/2026");
1076
+ _injectProductInfo(mergedUserSettings.licenseKey, this.rootWrapperElement, "19/05/2026");
1070
1077
  }
1071
1078
  instance.runHooks('init');
1072
1079
  this.render();