handsontable 16.1.1-next-895fbb8-20250923 → 16.2.0-next-216dbd0-20251112

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 (301) hide show
  1. package/3rdparty/walkontable/src/overlays.js +1 -1
  2. package/3rdparty/walkontable/src/overlays.mjs +1 -1
  3. package/3rdparty/walkontable/src/selection/border/border.js +19 -3
  4. package/3rdparty/walkontable/src/selection/border/border.mjs +19 -3
  5. package/CHANGELOG.md +40 -0
  6. package/base.js +2 -2
  7. package/base.mjs +2 -2
  8. package/core/coordsMapper/index.js +11 -0
  9. package/core/coordsMapper/index.mjs +1 -0
  10. package/core/hooks/bucket.js +7 -1
  11. package/core/hooks/bucket.mjs +7 -1
  12. package/core/hooks/constants.js +54 -0
  13. package/core/hooks/constants.mjs +54 -0
  14. package/core/hooks/index.d.ts +6 -0
  15. package/core/index.js +10 -4
  16. package/core/index.mjs +2 -1
  17. package/core.d.ts +3 -2
  18. package/core.js +67 -26
  19. package/core.mjs +56 -15
  20. package/dataMap/metaManager/metaSchema.js +197 -20
  21. package/dataMap/metaManager/metaSchema.mjs +197 -20
  22. package/dist/handsontable.css +175 -3
  23. package/dist/handsontable.full.css +175 -3
  24. package/dist/handsontable.full.js +10940 -8445
  25. package/dist/handsontable.full.min.css +5 -4
  26. package/dist/handsontable.full.min.js +193 -192
  27. package/dist/handsontable.js +6472 -4116
  28. package/dist/handsontable.min.css +4 -4
  29. package/dist/handsontable.min.js +43 -42
  30. package/dist/languages/all.js +168 -21
  31. package/dist/languages/all.min.js +1 -1
  32. package/dist/languages/ar-AR.js +8 -1
  33. package/dist/languages/ar-AR.min.js +1 -1
  34. package/dist/languages/cs-CZ.js +8 -1
  35. package/dist/languages/cs-CZ.min.js +1 -1
  36. package/dist/languages/de-CH.js +8 -1
  37. package/dist/languages/de-CH.min.js +1 -1
  38. package/dist/languages/de-DE.js +8 -1
  39. package/dist/languages/de-DE.min.js +1 -1
  40. package/dist/languages/en-US.js +8 -1
  41. package/dist/languages/en-US.min.js +1 -1
  42. package/dist/languages/es-MX.js +8 -1
  43. package/dist/languages/es-MX.min.js +1 -1
  44. package/dist/languages/fa-IR.js +8 -1
  45. package/dist/languages/fa-IR.min.js +1 -1
  46. package/dist/languages/fr-FR.js +8 -1
  47. package/dist/languages/fr-FR.min.js +1 -1
  48. package/dist/languages/hr-HR.js +8 -1
  49. package/dist/languages/hr-HR.min.js +1 -1
  50. package/dist/languages/it-IT.js +8 -1
  51. package/dist/languages/it-IT.min.js +1 -1
  52. package/dist/languages/ja-JP.js +8 -1
  53. package/dist/languages/ja-JP.min.js +1 -1
  54. package/dist/languages/ko-KR.js +8 -1
  55. package/dist/languages/ko-KR.min.js +1 -1
  56. package/dist/languages/lv-LV.js +8 -1
  57. package/dist/languages/lv-LV.min.js +1 -1
  58. package/dist/languages/nb-NO.js +8 -1
  59. package/dist/languages/nb-NO.min.js +1 -1
  60. package/dist/languages/nl-NL.js +8 -1
  61. package/dist/languages/nl-NL.min.js +1 -1
  62. package/dist/languages/pl-PL.js +8 -1
  63. package/dist/languages/pl-PL.min.js +1 -1
  64. package/dist/languages/pt-BR.js +8 -1
  65. package/dist/languages/pt-BR.min.js +1 -1
  66. package/dist/languages/ru-RU.js +8 -1
  67. package/dist/languages/ru-RU.min.js +1 -1
  68. package/dist/languages/sr-SP.js +8 -1
  69. package/dist/languages/sr-SP.min.js +1 -1
  70. package/dist/languages/zh-CN.js +8 -1
  71. package/dist/languages/zh-CN.min.js +1 -1
  72. package/dist/languages/zh-TW.js +8 -1
  73. package/dist/languages/zh-TW.min.js +1 -1
  74. package/editors/autocompleteEditor/autocompleteEditor.js +21 -1
  75. package/editors/autocompleteEditor/autocompleteEditor.mjs +22 -2
  76. package/focusManager/constants.js +25 -0
  77. package/focusManager/constants.mjs +22 -0
  78. package/focusManager/eventListener.js +107 -0
  79. package/focusManager/eventListener.mjs +103 -0
  80. package/{focusManager.d.ts → focusManager/grid.d.ts} +1 -1
  81. package/{focusManager.js → focusManager/grid.js} +48 -17
  82. package/{focusManager.mjs → focusManager/grid.mjs} +47 -16
  83. package/focusManager/index.d.ts +2 -0
  84. package/focusManager/index.js +20 -0
  85. package/focusManager/index.mjs +20 -0
  86. package/focusManager/scope.js +133 -0
  87. package/focusManager/scope.mjs +129 -0
  88. package/focusManager/scopeManager.d.ts +19 -0
  89. package/focusManager/scopeManager.js +268 -0
  90. package/focusManager/scopeManager.mjs +263 -0
  91. package/focusManager/scopes/grid.js +120 -0
  92. package/focusManager/scopes/grid.mjs +116 -0
  93. package/focusManager/scopes/index.js +13 -0
  94. package/focusManager/scopes/index.mjs +9 -0
  95. package/{utils → focusManager/utils}/focusDetector.js +21 -31
  96. package/{utils → focusManager/utils}/focusDetector.mjs +21 -31
  97. package/focusManager/utils/utils.js +95 -0
  98. package/focusManager/utils/utils.mjs +89 -0
  99. package/helpers/dom/element.js +1 -1
  100. package/helpers/dom/element.mjs +2 -2
  101. package/helpers/dom/event.js +1 -1
  102. package/helpers/dom/event.mjs +1 -1
  103. package/helpers/mixed.js +2 -65
  104. package/helpers/mixed.mjs +2 -63
  105. package/i18n/constants.js +10 -1
  106. package/i18n/constants.mjs +10 -1
  107. package/i18n/languages/ar-AR.js +8 -1
  108. package/i18n/languages/ar-AR.mjs +8 -1
  109. package/i18n/languages/cs-CZ.js +8 -1
  110. package/i18n/languages/cs-CZ.mjs +8 -1
  111. package/i18n/languages/de-CH.js +8 -1
  112. package/i18n/languages/de-CH.mjs +8 -1
  113. package/i18n/languages/de-DE.js +8 -1
  114. package/i18n/languages/de-DE.mjs +8 -1
  115. package/i18n/languages/en-US.js +8 -1
  116. package/i18n/languages/en-US.mjs +8 -1
  117. package/i18n/languages/es-MX.js +8 -1
  118. package/i18n/languages/es-MX.mjs +8 -1
  119. package/i18n/languages/fa-IR.js +8 -1
  120. package/i18n/languages/fa-IR.mjs +8 -1
  121. package/i18n/languages/fr-FR.js +8 -1
  122. package/i18n/languages/fr-FR.mjs +8 -1
  123. package/i18n/languages/hr-HR.js +8 -1
  124. package/i18n/languages/hr-HR.mjs +8 -1
  125. package/i18n/languages/it-IT.js +8 -1
  126. package/i18n/languages/it-IT.mjs +8 -1
  127. package/i18n/languages/ja-JP.js +8 -1
  128. package/i18n/languages/ja-JP.mjs +8 -1
  129. package/i18n/languages/ko-KR.js +8 -1
  130. package/i18n/languages/ko-KR.mjs +8 -1
  131. package/i18n/languages/lv-LV.js +8 -1
  132. package/i18n/languages/lv-LV.mjs +8 -1
  133. package/i18n/languages/nb-NO.js +8 -1
  134. package/i18n/languages/nb-NO.mjs +8 -1
  135. package/i18n/languages/nl-NL.js +8 -1
  136. package/i18n/languages/nl-NL.mjs +8 -1
  137. package/i18n/languages/pl-PL.js +8 -1
  138. package/i18n/languages/pl-PL.mjs +8 -1
  139. package/i18n/languages/pt-BR.js +8 -1
  140. package/i18n/languages/pt-BR.mjs +8 -1
  141. package/i18n/languages/ru-RU.js +8 -1
  142. package/i18n/languages/ru-RU.mjs +8 -1
  143. package/i18n/languages/sr-SP.js +8 -1
  144. package/i18n/languages/sr-SP.mjs +8 -1
  145. package/i18n/languages/zh-CN.js +8 -1
  146. package/i18n/languages/zh-CN.mjs +8 -1
  147. package/i18n/languages/zh-TW.js +8 -1
  148. package/i18n/languages/zh-TW.mjs +8 -1
  149. package/index.d.ts +9 -0
  150. package/languages/all.js +168 -21
  151. package/languages/ar-AR.js +8 -1
  152. package/languages/ar-AR.mjs +8 -1
  153. package/languages/cs-CZ.js +8 -1
  154. package/languages/cs-CZ.mjs +8 -1
  155. package/languages/de-CH.js +8 -1
  156. package/languages/de-CH.mjs +8 -1
  157. package/languages/de-DE.js +8 -1
  158. package/languages/de-DE.mjs +8 -1
  159. package/languages/en-US.js +8 -1
  160. package/languages/en-US.mjs +8 -1
  161. package/languages/es-MX.js +8 -1
  162. package/languages/es-MX.mjs +8 -1
  163. package/languages/fa-IR.js +8 -1
  164. package/languages/fa-IR.mjs +8 -1
  165. package/languages/fr-FR.js +8 -1
  166. package/languages/fr-FR.mjs +8 -1
  167. package/languages/hr-HR.js +8 -1
  168. package/languages/hr-HR.mjs +8 -1
  169. package/languages/index.js +168 -21
  170. package/languages/it-IT.js +8 -1
  171. package/languages/it-IT.mjs +8 -1
  172. package/languages/ja-JP.js +8 -1
  173. package/languages/ja-JP.mjs +8 -1
  174. package/languages/ko-KR.js +8 -1
  175. package/languages/ko-KR.mjs +8 -1
  176. package/languages/lv-LV.js +8 -1
  177. package/languages/lv-LV.mjs +8 -1
  178. package/languages/nb-NO.js +8 -1
  179. package/languages/nb-NO.mjs +8 -1
  180. package/languages/nl-NL.js +8 -1
  181. package/languages/nl-NL.mjs +8 -1
  182. package/languages/pl-PL.js +8 -1
  183. package/languages/pl-PL.mjs +8 -1
  184. package/languages/pt-BR.js +8 -1
  185. package/languages/pt-BR.mjs +8 -1
  186. package/languages/ru-RU.js +8 -1
  187. package/languages/ru-RU.mjs +8 -1
  188. package/languages/sr-SP.js +8 -1
  189. package/languages/sr-SP.mjs +8 -1
  190. package/languages/zh-CN.js +8 -1
  191. package/languages/zh-CN.mjs +8 -1
  192. package/languages/zh-TW.js +8 -1
  193. package/languages/zh-TW.mjs +8 -1
  194. package/package.json +25 -7
  195. package/plugins/autoRowSize/autoRowSize.js +8 -1
  196. package/plugins/autoRowSize/autoRowSize.mjs +8 -1
  197. package/plugins/base/base.js +36 -10
  198. package/plugins/base/base.mjs +36 -10
  199. package/plugins/columnSummary/columnSummary.d.ts +2 -2
  200. package/plugins/columnSummary/columnSummary.js +44 -10
  201. package/plugins/columnSummary/columnSummary.mjs +44 -10
  202. package/plugins/columnSummary/endpoints.js +15 -13
  203. package/plugins/columnSummary/endpoints.mjs +15 -13
  204. package/plugins/columnSummary/utils.js +31 -0
  205. package/plugins/columnSummary/utils.mjs +30 -0
  206. package/plugins/customBorders/customBorders.d.ts +1 -0
  207. package/plugins/customBorders/customBorders.js +32 -2
  208. package/plugins/customBorders/customBorders.mjs +32 -2
  209. package/plugins/dialog/constants.js +7 -0
  210. package/plugins/dialog/constants.mjs +4 -0
  211. package/plugins/dialog/dialog.d.ts +22 -2
  212. package/plugins/dialog/dialog.js +197 -81
  213. package/plugins/dialog/dialog.mjs +196 -81
  214. package/plugins/dialog/templates/base.js +60 -0
  215. package/plugins/dialog/templates/base.mjs +56 -0
  216. package/plugins/dialog/templates/confirm.js +106 -0
  217. package/plugins/dialog/templates/confirm.mjs +102 -0
  218. package/plugins/dialog/templates/index.js +6 -0
  219. package/plugins/dialog/templates/index.mjs +4 -0
  220. package/plugins/dialog/ui.js +125 -41
  221. package/plugins/dialog/ui.mjs +119 -35
  222. package/plugins/emptyDataState/emptyDataState.d.ts +24 -0
  223. package/plugins/emptyDataState/emptyDataState.js +526 -0
  224. package/plugins/emptyDataState/emptyDataState.mjs +521 -0
  225. package/plugins/emptyDataState/index.d.ts +1 -0
  226. package/plugins/emptyDataState/index.js +7 -0
  227. package/plugins/emptyDataState/index.mjs +1 -0
  228. package/plugins/emptyDataState/ui.js +282 -0
  229. package/plugins/emptyDataState/ui.mjs +278 -0
  230. package/plugins/filters/component/value.js +16 -1
  231. package/plugins/filters/component/value.mjs +16 -1
  232. package/plugins/filters/filters.d.ts +5 -1
  233. package/plugins/filters/filters.js +22 -1
  234. package/plugins/filters/filters.mjs +22 -1
  235. package/plugins/filters/ui/multipleSelect.js +90 -79
  236. package/plugins/filters/ui/multipleSelect.mjs +90 -79
  237. package/plugins/index.d.ts +3 -0
  238. package/plugins/index.js +3 -0
  239. package/plugins/index.mjs +3 -1
  240. package/plugins/mergeCells/utils.js +1 -5
  241. package/plugins/mergeCells/utils.mjs +1 -5
  242. package/plugins/pagination/pagination.js +37 -175
  243. package/plugins/pagination/pagination.mjs +37 -175
  244. package/plugins/pagination/strategies/autoPageSize.js +2 -2
  245. package/plugins/pagination/strategies/autoPageSize.mjs +2 -2
  246. package/plugins/pagination/ui.js +6 -10
  247. package/plugins/pagination/ui.mjs +7 -11
  248. package/plugins/stretchColumns/calculator.js +3 -1
  249. package/plugins/stretchColumns/calculator.mjs +3 -1
  250. package/plugins/undoRedo/undoRedo.js +16 -6
  251. package/plugins/undoRedo/undoRedo.mjs +16 -5
  252. package/renderers/checkboxRenderer/checkboxRenderer.js +12 -15
  253. package/renderers/checkboxRenderer/checkboxRenderer.mjs +12 -15
  254. package/selection/selection.js +1 -1
  255. package/selection/selection.mjs +1 -1
  256. package/settings.d.ts +3 -0
  257. package/shortcutContexts/commands/index.js +2 -1
  258. package/shortcutContexts/commands/index.mjs +2 -1
  259. package/shortcutContexts/commands/tabNavigation.js +51 -0
  260. package/shortcutContexts/commands/tabNavigation.mjs +48 -0
  261. package/shortcutContexts/constants.js +16 -1
  262. package/shortcutContexts/constants.mjs +16 -1
  263. package/shortcutContexts/editor.js +2 -2
  264. package/shortcutContexts/editor.mjs +3 -3
  265. package/shortcutContexts/grid.js +19 -3
  266. package/shortcutContexts/grid.mjs +20 -4
  267. package/shortcuts/manager.d.ts +1 -0
  268. package/shortcuts/manager.js +17 -2
  269. package/shortcuts/manager.mjs +17 -2
  270. package/styles/handsontable.css +192 -35
  271. package/styles/handsontable.min.css +3 -3
  272. package/styles/ht-icons-horizon.css +233 -0
  273. package/styles/ht-icons-horizon.min.css +30 -0
  274. package/styles/ht-icons-main.css +233 -0
  275. package/styles/ht-icons-main.min.css +30 -0
  276. package/styles/ht-theme-classic-no-icons.css +399 -0
  277. package/styles/ht-theme-classic-no-icons.min.css +30 -0
  278. package/styles/ht-theme-classic.css +308 -556
  279. package/styles/ht-theme-classic.min.css +3 -3
  280. package/styles/ht-theme-horizon-no-icons.css +405 -0
  281. package/styles/ht-theme-horizon-no-icons.min.css +30 -0
  282. package/styles/ht-theme-horizon.css +312 -556
  283. package/styles/ht-theme-horizon.min.css +3 -3
  284. package/styles/ht-theme-main-no-icons.css +396 -0
  285. package/styles/ht-theme-main-no-icons.min.css +30 -0
  286. package/styles/ht-theme-main.css +303 -556
  287. package/styles/ht-theme-main.min.css +3 -3
  288. package/tableView.js +23 -5
  289. package/tableView.mjs +23 -5
  290. package/utils/dataStructures/uniqueMap.js +10 -0
  291. package/utils/dataStructures/uniqueMap.mjs +10 -0
  292. package/utils/ghostTable.js +0 -3
  293. package/utils/ghostTable.mjs +0 -3
  294. package/utils/stylesHandler.js +19 -4
  295. package/utils/stylesHandler.mjs +19 -4
  296. package/core/focusCatcher/index.js +0 -131
  297. package/core/focusCatcher/index.mjs +0 -127
  298. package/core/focusCatcher/utils.js +0 -31
  299. package/core/focusCatcher/utils.mjs +0 -27
  300. package/plugins/pagination/focusController.js +0 -27
  301. package/plugins/pagination/focusController.mjs +0 -23
@@ -624,7 +624,7 @@ class Overlays {
624
624
  // The internal row height calculator contains a known issue that results in a 1px miscalculation.
625
625
  // Ideally, this should be addressed at the core level. However, resolving it is non-trivial,
626
626
  // as the flaw is embedded across multiple core modules and corresponding test cases.
627
- // This limitation does not affect when the the external calculator is used (AutoRowSize), which
627
+ // This limitation does not affect when the external calculator is used (AutoRowSize), which
628
628
  // computes heights accurately, so no adjustment is required when using it.
629
629
  const hiderHeightComp = this.wtSettings.getSetting('externalRowCalculator') ? 0 : 1;
630
630
  const proposedHiderHeight = headerColumnSize + this.topOverlay.sumCellSizes(0, totalRows) + hiderHeightComp;
@@ -621,7 +621,7 @@ class Overlays {
621
621
  // The internal row height calculator contains a known issue that results in a 1px miscalculation.
622
622
  // Ideally, this should be addressed at the core level. However, resolving it is non-trivial,
623
623
  // as the flaw is embedded across multiple core modules and corresponding test cases.
624
- // This limitation does not affect when the the external calculator is used (AutoRowSize), which
624
+ // This limitation does not affect when the external calculator is used (AutoRowSize), which
625
625
  // computes heights accurately, so no adjustment is required when using it.
626
626
  const hiderHeightComp = this.wtSettings.getSetting('externalRowCalculator') ? 0 : 1;
627
627
  const proposedHiderHeight = headerColumnSize + this.topOverlay.sumCellSizes(0, totalRows) + hiderHeightComp;
@@ -6,6 +6,10 @@ var _event = require("../../../../../helpers/dom/event");
6
6
  var _object = require("../../../../../helpers/object");
7
7
  var _browser = require("../../../../../helpers/browser");
8
8
  var _utils = require("./utils");
9
+ const BORDER_STYLE_CLASS_PREFIX = 'ht-border-style-';
10
+ const BORDER_STYLE_VERTICAL_SUFFIX = '-vertical';
11
+ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
12
+
9
13
  /**
10
14
  *
11
15
  */
@@ -144,15 +148,27 @@ class Border {
144
148
  for (let i = 0; i < 5; i++) {
145
149
  const position = borderDivs[i];
146
150
  const div = rootDocument.createElement('div');
151
+ const getSettingsProperty = property => this.settings[position] && this.settings[position][property] ? this.settings[position][property] : settings.border[property];
147
152
  div.className = `wtBorder ${this.settings.className || ''}`; // + borderDivs[i];
148
153
 
149
154
  if (this.settings[position] && this.settings[position].hide) {
150
155
  div.className += ' hidden';
151
156
  }
152
157
  style = div.style;
153
- style.backgroundColor = this.settings[position] && this.settings[position].color ? this.settings[position].color : settings.border.color;
154
- style.height = this.settings[position] && this.settings[position].width ? `${this.settings[position].width}px` : `${settings.border.width}px`;
155
- style.width = this.settings[position] && this.settings[position].width ? `${this.settings[position].width}px` : `${settings.border.width}px`;
158
+ const borderStyle = getSettingsProperty('style');
159
+ if (borderStyle) {
160
+ if (['start', 'end'].includes(position)) {
161
+ div.className += ` ${BORDER_STYLE_CLASS_PREFIX}${borderStyle}${BORDER_STYLE_VERTICAL_SUFFIX}`;
162
+ } else {
163
+ div.className += ` ${BORDER_STYLE_CLASS_PREFIX}${borderStyle}${BORDER_STYLE_HORIZONTAL_SUFFIX}`;
164
+ }
165
+ style.setProperty('--ht-custom-border-size', `${getSettingsProperty('width')}px`);
166
+ style.setProperty('--ht-custom-border-color', getSettingsProperty('color'));
167
+ } else {
168
+ style.backgroundColor = getSettingsProperty('color');
169
+ }
170
+ style.height = `${getSettingsProperty('width')}px`;
171
+ style.width = `${getSettingsProperty('width')}px`;
156
172
  this.main.appendChild(div);
157
173
  }
158
174
  this.top = this.main.childNodes[0];
@@ -3,6 +3,10 @@ import { stopImmediatePropagation } from "../../../../../helpers/dom/event.mjs";
3
3
  import { objectEach } from "../../../../../helpers/object.mjs";
4
4
  import { isMobileBrowser } from "../../../../../helpers/browser.mjs";
5
5
  import { getCornerStyle } from "./utils.mjs";
6
+ const BORDER_STYLE_CLASS_PREFIX = 'ht-border-style-';
7
+ const BORDER_STYLE_VERTICAL_SUFFIX = '-vertical';
8
+ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
9
+
6
10
  /**
7
11
  *
8
12
  */
@@ -141,15 +145,27 @@ class Border {
141
145
  for (let i = 0; i < 5; i++) {
142
146
  const position = borderDivs[i];
143
147
  const div = rootDocument.createElement('div');
148
+ const getSettingsProperty = property => this.settings[position] && this.settings[position][property] ? this.settings[position][property] : settings.border[property];
144
149
  div.className = `wtBorder ${this.settings.className || ''}`; // + borderDivs[i];
145
150
 
146
151
  if (this.settings[position] && this.settings[position].hide) {
147
152
  div.className += ' hidden';
148
153
  }
149
154
  style = div.style;
150
- style.backgroundColor = this.settings[position] && this.settings[position].color ? this.settings[position].color : settings.border.color;
151
- style.height = this.settings[position] && this.settings[position].width ? `${this.settings[position].width}px` : `${settings.border.width}px`;
152
- style.width = this.settings[position] && this.settings[position].width ? `${this.settings[position].width}px` : `${settings.border.width}px`;
155
+ const borderStyle = getSettingsProperty('style');
156
+ if (borderStyle) {
157
+ if (['start', 'end'].includes(position)) {
158
+ div.className += ` ${BORDER_STYLE_CLASS_PREFIX}${borderStyle}${BORDER_STYLE_VERTICAL_SUFFIX}`;
159
+ } else {
160
+ div.className += ` ${BORDER_STYLE_CLASS_PREFIX}${borderStyle}${BORDER_STYLE_HORIZONTAL_SUFFIX}`;
161
+ }
162
+ style.setProperty('--ht-custom-border-size', `${getSettingsProperty('width')}px`);
163
+ style.setProperty('--ht-custom-border-color', getSettingsProperty('color'));
164
+ } else {
165
+ style.backgroundColor = getSettingsProperty('color');
166
+ }
167
+ style.height = `${getSettingsProperty('width')}px`;
168
+ style.width = `${getSettingsProperty('width')}px`;
153
169
  this.main.appendChild(div);
154
170
  }
155
171
  this.top = this.main.childNodes[0];
package/CHANGELOG.md CHANGED
@@ -9,6 +9,43 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
9
9
 
10
10
  <!-- UNVERSIONED -->
11
11
 
12
+ ## [16.2.0] - 2025-11-19
13
+
14
+ ### Added
15
+ - Improved focus management by introducing a focus scopes mechanism. [#11804](https://github.com/handsontable/handsontable/pull/11804)
16
+ - Introduced an "auto" option for the `roundFloat` setting in the Column Summary plugin and ensured proper recalculation of endpoints after data updates. [#11833](https://github.com/handsontable/handsontable/pull/11833)
17
+ - Added an Enter key handler and a new `searchMode` option to the Filters plugin. [#11871](https://github.com/handsontable/handsontable/pull/11871)
18
+ - Implemented a `style` option for the Custom Borders plugin, enabling style customization. [#11876](https://github.com/handsontable/handsontable/pull/11876)
19
+ - Introduced a new "dotted" border style to the Custom Borders plugin. [#11877](https://github.com/handsontable/handsontable/pull/11877)
20
+ - Added the EmptyDataState plugin to improve UX when no data is available. [#11879](https://github.com/handsontable/handsontable/pull/11879)
21
+ - Added a `settings` entry to the Handsontable exports. [#11883](https://github.com/handsontable/handsontable/pull/11883)
22
+ - Added new global button CSS class names. [#11896](https://github.com/handsontable/handsontable/pull/11896)
23
+ - Introduced `minRowHeights` as an alias for `rowHeights` for API consistency. [#11898](https://github.com/handsontable/handsontable/pull/11898)
24
+ - Added a new `template` option to the Dialog plugin. [#11902](https://github.com/handsontable/handsontable/pull/11902)
25
+ - Added new theme variables and implemented `no-icons` and `icons-only` style variants. [#11913](https://github.com/handsontable/handsontable/pull/11913)
26
+
27
+ ### Changed
28
+ - Refined dropdown behavior when the input is empty - focus now remains on the input field. [#11863](https://github.com/handsontable/handsontable/pull/11863)
29
+ - Improved how the Autocomplete and Dropdown editors respond to clicks outside the open editor. [#11873](https://github.com/handsontable/handsontable/pull/11873)
30
+
31
+ ### Fixed
32
+ - Fixed the datepicker icon size issue on iPad. [#11860](https://github.com/handsontable/handsontable/pull/11860)
33
+ - Corrected header size rendering on iPad. [#11861](https://github.com/handsontable/handsontable/pull/11861)
34
+ - Fixed an issue with header text size with `collapsibleColumns` enabled. [#11864](https://github.com/handsontable/handsontable/pull/11864)
35
+ - Fixed an issue with an unwanted empty space on the right side of the table when using the modern themes. [#11868](https://github.com/handsontable/handsontable/pull/11868)
36
+ - Fixed row misalignment for multi-line cell content. [#11872](https://github.com/handsontable/handsontable/pull/11872)
37
+ - Improved column width calculations for checkbox-typed cells. [#11891](https://github.com/handsontable/handsontable/pull/11891)
38
+ - Fixed a problem, where using `minSpareRows` would crash the table when configured alongside the Column Summary plugin. [#11911](https://github.com/handsontable/handsontable/pull/11911)
39
+ - Fixed an issue preventing re-adding a previously removed hook callback. [#11914](https://github.com/handsontable/handsontable/pull/11914)
40
+ - Stabilized the height of the first row when it's empty. [#11918](https://github.com/handsontable/handsontable/pull/11918)
41
+ - Fixed a problem where resizing the window vertically did not resize the table. [#11919](https://github.com/handsontable/handsontable/pull/11919)
42
+ - Fixed an issue where the dialog overlay could make the table unresponsive after rapid show/hide calls. [#11925](https://github.com/handsontable/handsontable/pull/11925)
43
+ - Fixed an issue with TouchEvent on Firefox. [#11928](https://github.com/handsontable/handsontable/pull/11928)
44
+ - React: Fixed and issue with Collapsible Columns being reset in React wrapper. [#11923](https://github.com/handsontable/handsontable/pull/11923)
45
+
46
+ ### Security
47
+ - Updated dev dependencies to address high-severity vulnerabilities. [#11895](https://github.com/handsontable/handsontable/pull/11895)
48
+
12
49
  ## [16.1.1] - 2025-09-23
13
50
 
14
51
  ### Fixed
@@ -25,6 +62,8 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
25
62
  - Added a new `initialState` configuration option. [#11777](https://github.com/handsontable/handsontable/pull/11777)
26
63
  - Introduced the Loading plugin. [#11792](https://github.com/handsontable/handsontable/pull/11792)
27
64
  - Added a new "classic" theme. [#11790](https://github.com/handsontable/handsontable/pull/11790)
65
+ - Added a [Deprecation policy](https://handsontable.com/docs/deprecation-policy/) page to the documentation.
66
+ - Added a [Long Term Support (LTS)](https://handsontable.com/docs/long-term-support/) page to the documentation.
28
67
 
29
68
  ### Changed
30
69
  - Enabled focus navigation between multiple selection layers. [#11756](https://github.com/handsontable/handsontable/pull/11756)
@@ -56,6 +95,7 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
56
95
  ### Deprecated
57
96
  - Deprecated the legacy style (to be removed in version `17.0.0`). [#11790](https://github.com/handsontable/handsontable/pull/11790)
58
97
  - Deprecated the PersistentState plugin (to be removed in version `17.0.0`). [#11835](https://github.com/handsontable/handsontable/pull/11835)
98
+ - Deprecated the `@handsontable/vue` wrapper. [#11839](https://github.com/handsontable/handsontable/pull/11839)
59
99
 
60
100
  ## [16.0.1] - 2025-07-10
61
101
 
package/base.js CHANGED
@@ -45,8 +45,8 @@ Handsontable.hooks = _hooks.Hooks.getSingleton();
45
45
  Handsontable.CellCoords = _src.CellCoords;
46
46
  Handsontable.CellRange = _src.CellRange;
47
47
  Handsontable.packageName = 'handsontable';
48
- Handsontable.buildDate = "23/09/2025 08:54:12";
49
- Handsontable.version = "16.1.1-next-895fbb8-20250923";
48
+ Handsontable.buildDate = "12/11/2025 14:05:05";
49
+ Handsontable.version = "16.2.0-next-216dbd0-20251112";
50
50
  Handsontable.languages = {
51
51
  dictionaryKeys: _registry.dictionaryKeys,
52
52
  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 = "23/09/2025 08:54:18";
39
- Handsontable.version = "16.1.1-next-895fbb8-20250923";
38
+ Handsontable.buildDate = "12/11/2025 14:05:11";
39
+ Handsontable.version = "16.2.0-next-216dbd0-20251112";
40
40
  Handsontable.languages = {
41
41
  dictionaryKeys,
42
42
  getLanguageDictionary,
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+
3
+ require("core-js/modules/esnext.iterator.constructor.js");
4
+ require("core-js/modules/esnext.iterator.for-each.js");
5
+ exports.__esModule = true;
6
+ var _rangeToRenderableMapper = require("./rangeToRenderableMapper");
7
+ Object.keys(_rangeToRenderableMapper).forEach(function (key) {
8
+ if (key === "default" || key === "__esModule") return;
9
+ if (key in exports && exports[key] === _rangeToRenderableMapper[key]) return;
10
+ exports[key] = _rangeToRenderableMapper[key];
11
+ });
@@ -0,0 +1 @@
1
+ export * from "./rangeToRenderableMapper.mjs";
@@ -95,7 +95,13 @@ class HooksBucket {
95
95
  _constants.REGISTERED_HOOKS.push(hookName);
96
96
  }
97
97
  const hooks = _classPrivateFieldGet(_hooks, this).get(hookName);
98
- if (hooks.find(hook => hook.callback === callback)) {
98
+ const existingHook = hooks.find(hook => hook.callback === callback);
99
+ if (existingHook) {
100
+ if (existingHook.skip === true) {
101
+ // Re-enable the hook if it was previously added and then removed.
102
+ existingHook.skip = false;
103
+ }
104
+
99
105
  // adding the same hook twice is now silently ignored
100
106
  return;
101
107
  }
@@ -92,7 +92,13 @@ export class HooksBucket {
92
92
  REGISTERED_HOOKS.push(hookName);
93
93
  }
94
94
  const hooks = _classPrivateFieldGet(_hooks, this).get(hookName);
95
- if (hooks.find(hook => hook.callback === callback)) {
95
+ const existingHook = hooks.find(hook => hook.callback === callback);
96
+ if (existingHook) {
97
+ if (existingHook.skip === true) {
98
+ // Re-enable the hook if it was previously added and then removed.
99
+ existingHook.skip = false;
100
+ }
101
+
96
102
  // adding the same hook twice is now silently ignored
97
103
  return;
98
104
  }
@@ -305,6 +305,17 @@ const REGISTERED_HOOKS = exports.REGISTERED_HOOKS = [/* eslint-disable jsdoc/req
305
305
  * :::
306
306
  */
307
307
  'beforeCreateCol',
308
+ /**
309
+ * Fired after the cache of the column sequence has been updated.
310
+ *
311
+ * @since 16.2.0
312
+ * @event Hooks#afterColumnSequenceCacheUpdate
313
+ * @param {object} indexesChangesState Object containing information about the changes to the column sequence.
314
+ * @param {boolean} indexesChangesState.indexesSequenceChanged Indicates if the sequence of indexes has changed.
315
+ * @param {boolean} indexesChangesState.trimmedIndexesChanged Indicates if the trimmed indexes have changed.
316
+ * @param {boolean} indexesChangesState.hiddenIndexesChanged Indicates if the hidden indexes have changed.
317
+ */
318
+ 'afterColumnSequenceCacheUpdate',
308
319
  /**
309
320
  * Fired after the order of columns has changed.
310
321
  * This hook is fired by changing column indexes of any type supported by the {@link IndexMapper}.
@@ -583,6 +594,17 @@ const REGISTERED_HOOKS = exports.REGISTERED_HOOKS = [/* eslint-disable jsdoc/req
583
594
  * @param {object} cellProperties Object containing the cell's properties.
584
595
  */
585
596
  'afterRenderer',
597
+ /**
598
+ * Fired after the cache of the row sequence has been updated.
599
+ *
600
+ * @since 16.2.0
601
+ * @event Hooks#afterRowSequenceCacheUpdate
602
+ * @param {object} indexesChangesState Object containing information about the changes to the row sequence.
603
+ * @param {boolean} indexesChangesState.indexesSequenceChanged Indicates if the sequence of indexes has changed.
604
+ * @param {boolean} indexesChangesState.trimmedIndexesChanged Indicates if the trimmed indexes have changed.
605
+ * @param {boolean} indexesChangesState.hiddenIndexesChanged Indicates if the hidden indexes have changed.
606
+ */
607
+ 'afterRowSequenceCacheUpdate',
586
608
  /**
587
609
  * Fired after the order of rows has changed.
588
610
  * This hook is fired by changing row indexes of any type supported by the {@link IndexMapper}.
@@ -3029,6 +3051,38 @@ const REGISTERED_HOOKS = exports.REGISTERED_HOOKS = [/* eslint-disable jsdoc/req
3029
3051
  * @event Hooks#afterLoadingHide
3030
3052
  */
3031
3053
  'afterLoadingHide',
3054
+ /**
3055
+ * Fired by {@link EmptyDataState} plugin before showing the empty data state overlay. This hook is fired when {@link Options#emptyDataState}
3056
+ * option is enabled.
3057
+ *
3058
+ * @since 16.2.0
3059
+ * @event Hooks#beforeEmptyDataStateShow
3060
+ */
3061
+ 'beforeEmptyDataStateShow',
3062
+ /**
3063
+ * Fired by {@link EmptyDataState} plugin after showing the empty data state overlay. This hook is fired when {@link Options#emptyDataState}
3064
+ * option is enabled.
3065
+ *
3066
+ * @since 16.2.0
3067
+ * @event Hooks#afterEmptyDataStateShow
3068
+ */
3069
+ 'afterEmptyDataStateShow',
3070
+ /**
3071
+ * Fired by {@link EmptyDataState} plugin before hiding the empty data state overlay. This hook is fired when {@link Options#emptyDataState}
3072
+ * option is enabled.
3073
+ *
3074
+ * @since 16.2.0
3075
+ * @event Hooks#beforeEmptyDataStateHide
3076
+ */
3077
+ 'beforeEmptyDataStateHide',
3078
+ /**
3079
+ * Fired by {@link EmptyDataState} plugin after hiding the empty data state overlay. This hook is fired when {@link Options#emptyDataState}
3080
+ * option is enabled.
3081
+ *
3082
+ * @since 16.2.0
3083
+ * @event Hooks#afterEmptyDataStateHide
3084
+ */
3085
+ 'afterEmptyDataStateHide',
3032
3086
  /**
3033
3087
  * Fired after the editor is opened and rendered.
3034
3088
  *
@@ -302,6 +302,17 @@ export const REGISTERED_HOOKS = [/* eslint-disable jsdoc/require-description-com
302
302
  * :::
303
303
  */
304
304
  'beforeCreateCol',
305
+ /**
306
+ * Fired after the cache of the column sequence has been updated.
307
+ *
308
+ * @since 16.2.0
309
+ * @event Hooks#afterColumnSequenceCacheUpdate
310
+ * @param {object} indexesChangesState Object containing information about the changes to the column sequence.
311
+ * @param {boolean} indexesChangesState.indexesSequenceChanged Indicates if the sequence of indexes has changed.
312
+ * @param {boolean} indexesChangesState.trimmedIndexesChanged Indicates if the trimmed indexes have changed.
313
+ * @param {boolean} indexesChangesState.hiddenIndexesChanged Indicates if the hidden indexes have changed.
314
+ */
315
+ 'afterColumnSequenceCacheUpdate',
305
316
  /**
306
317
  * Fired after the order of columns has changed.
307
318
  * This hook is fired by changing column indexes of any type supported by the {@link IndexMapper}.
@@ -580,6 +591,17 @@ export const REGISTERED_HOOKS = [/* eslint-disable jsdoc/require-description-com
580
591
  * @param {object} cellProperties Object containing the cell's properties.
581
592
  */
582
593
  'afterRenderer',
594
+ /**
595
+ * Fired after the cache of the row sequence has been updated.
596
+ *
597
+ * @since 16.2.0
598
+ * @event Hooks#afterRowSequenceCacheUpdate
599
+ * @param {object} indexesChangesState Object containing information about the changes to the row sequence.
600
+ * @param {boolean} indexesChangesState.indexesSequenceChanged Indicates if the sequence of indexes has changed.
601
+ * @param {boolean} indexesChangesState.trimmedIndexesChanged Indicates if the trimmed indexes have changed.
602
+ * @param {boolean} indexesChangesState.hiddenIndexesChanged Indicates if the hidden indexes have changed.
603
+ */
604
+ 'afterRowSequenceCacheUpdate',
583
605
  /**
584
606
  * Fired after the order of rows has changed.
585
607
  * This hook is fired by changing row indexes of any type supported by the {@link IndexMapper}.
@@ -3026,6 +3048,38 @@ export const REGISTERED_HOOKS = [/* eslint-disable jsdoc/require-description-com
3026
3048
  * @event Hooks#afterLoadingHide
3027
3049
  */
3028
3050
  'afterLoadingHide',
3051
+ /**
3052
+ * Fired by {@link EmptyDataState} plugin before showing the empty data state overlay. This hook is fired when {@link Options#emptyDataState}
3053
+ * option is enabled.
3054
+ *
3055
+ * @since 16.2.0
3056
+ * @event Hooks#beforeEmptyDataStateShow
3057
+ */
3058
+ 'beforeEmptyDataStateShow',
3059
+ /**
3060
+ * Fired by {@link EmptyDataState} plugin after showing the empty data state overlay. This hook is fired when {@link Options#emptyDataState}
3061
+ * option is enabled.
3062
+ *
3063
+ * @since 16.2.0
3064
+ * @event Hooks#afterEmptyDataStateShow
3065
+ */
3066
+ 'afterEmptyDataStateShow',
3067
+ /**
3068
+ * Fired by {@link EmptyDataState} plugin before hiding the empty data state overlay. This hook is fired when {@link Options#emptyDataState}
3069
+ * option is enabled.
3070
+ *
3071
+ * @since 16.2.0
3072
+ * @event Hooks#beforeEmptyDataStateHide
3073
+ */
3074
+ 'beforeEmptyDataStateHide',
3075
+ /**
3076
+ * Fired by {@link EmptyDataState} plugin after hiding the empty data state overlay. This hook is fired when {@link Options#emptyDataState}
3077
+ * option is enabled.
3078
+ *
3079
+ * @since 16.2.0
3080
+ * @event Hooks#afterEmptyDataStateHide
3081
+ */
3082
+ 'afterEmptyDataStateHide',
3029
3083
  /**
3030
3084
  * Fired after the editor is opened and rendered.
3031
3085
  *
@@ -61,6 +61,7 @@ export interface Events {
61
61
  afterColumnFreeze?: (columnIndex: number, isFreezingPerformed: boolean) => void;
62
62
  afterColumnMove?: (movedColumns: number[], finalIndex: number, dropIndex: number | undefined, movePossible: boolean, orderChanged: boolean) => void;
63
63
  afterColumnResize?: (newSize: number, column: number, isDoubleClick: boolean) => void;
64
+ afterColumnSequenceCacheUpdate?: (indexesChangesState: { indexesSequenceChanged: boolean, trimmedIndexesChanged: boolean, hiddenIndexesChanged: boolean }) => void;
64
65
  afterColumnSequenceChange?: (source: 'init' | 'move' | 'insert' | 'remove' | 'update') => void;
65
66
  afterColumnSort?: (currentSortConfig: ColumnSortingConfig[], destinationSortConfigs: ColumnSortingConfig[]) => void;
66
67
  afterColumnUnfreeze?: (columnIndex: number, isUnfreezingPerformed: boolean) => void;
@@ -75,6 +76,10 @@ export interface Events {
75
76
  afterLoadingShow?: () => void;
76
77
  beforeLoadingHide?: () => boolean | void;
77
78
  afterLoadingHide?: () => void;
79
+ beforeEmptyDataStateShow?: () => void;
80
+ afterEmptyDataStateShow?: () => void;
81
+ beforeEmptyDataStateHide?: () => void;
82
+ afterEmptyDataStateHide?: () => void;
78
83
  afterCopyLimit?: (selectedRows: number, selectedColumns: number, copyRowsLimit: number, copyColumnsLimit: number) => void;
79
84
  afterCreateCol?: (index: number, amount: number, source?: ChangeSource) => void;
80
85
  afterCreateRow?: (index: number, amount: number, source?: ChangeSource) => void;
@@ -131,6 +136,7 @@ export interface Events {
131
136
  afterRenderer?: (TD: HTMLTableCellElement, row: number, column: number, prop: string | number, value: string, cellProperties: CellProperties) => void;
132
137
  afterRowMove?: (movedRows: number[], finalIndex: number, dropIndex: number | undefined, movePossible: boolean, orderChanged: boolean) => void;
133
138
  afterRowResize?: (newSize: number, row: number, isDoubleClick: boolean) => void;
139
+ afterRowSequenceCacheUpdate?: (indexesChangesState: { indexesSequenceChanged: boolean, trimmedIndexesChanged: boolean, hiddenIndexesChanged: boolean }) => void;
134
140
  afterRowSequenceChange?: (source: 'init' | 'move' | 'insert' | 'remove' | 'update') => void;
135
141
  afterScrollHorizontally?: () => void;
136
142
  afterScrollVertically?: () => void;
package/core/index.js CHANGED
@@ -3,11 +3,17 @@
3
3
  require("core-js/modules/esnext.iterator.constructor.js");
4
4
  require("core-js/modules/esnext.iterator.for-each.js");
5
5
  exports.__esModule = true;
6
- var _focusCatcher = require("./focusCatcher");
7
- Object.keys(_focusCatcher).forEach(function (key) {
6
+ var _coordsMapper = require("./coordsMapper");
7
+ Object.keys(_coordsMapper).forEach(function (key) {
8
8
  if (key === "default" || key === "__esModule") return;
9
- if (key in exports && exports[key] === _focusCatcher[key]) return;
10
- exports[key] = _focusCatcher[key];
9
+ if (key in exports && exports[key] === _coordsMapper[key]) return;
10
+ exports[key] = _coordsMapper[key];
11
+ });
12
+ var _hooks = require("./hooks");
13
+ Object.keys(_hooks).forEach(function (key) {
14
+ if (key === "default" || key === "__esModule") return;
15
+ if (key in exports && exports[key] === _hooks[key]) return;
16
+ exports[key] = _hooks[key];
11
17
  });
12
18
  var _viewportScroll = require("./viewportScroll");
13
19
  Object.keys(_viewportScroll).forEach(function (key) {
package/core/index.mjs CHANGED
@@ -1,2 +1,3 @@
1
- export * from "./focusCatcher/index.mjs";
1
+ export * from "./coordsMapper/index.mjs";
2
+ export * from "./hooks/index.mjs";
2
3
  export * from "./viewportScroll/index.mjs";
package/core.d.ts CHANGED
@@ -19,7 +19,7 @@ import { BaseValidator } from './validators/base';
19
19
  import { Plugins } from './plugins';
20
20
  import { CellType } from './cellTypes';
21
21
  import { ShortcutManager } from './shortcuts';
22
- import { FocusManager } from './focusManager';
22
+ import { GridFocusManager, FocusScopeManager } from './focusManager';
23
23
 
24
24
  type AlterActions = 'insert_row_above' | 'insert_row_below' |
25
25
  'insert_col_start' | 'insert_col_end' |
@@ -90,7 +90,8 @@ export default class Core {
90
90
  getFirstPartiallyVisibleRow(): number | null;
91
91
  getFirstRenderedVisibleColumn(): number | null;
92
92
  getFirstRenderedVisibleRow(): number | null;
93
- getFocusManager(): FocusManager;
93
+ getFocusManager(): GridFocusManager;
94
+ getFocusScopeManager(): FocusScopeManager;
94
95
  getInstance(): Core;
95
96
  getLastFullyVisibleColumn(): number | null;
96
97
  getLastFullyVisibleRow(): number | null;