handsontable 16.0.1 → 16.1.0-next-abd8f2e-20250904

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 (489) hide show
  1. package/3rdparty/walkontable/src/overlays.js +12 -2
  2. package/3rdparty/walkontable/src/overlays.mjs +12 -2
  3. package/3rdparty/walkontable/src/viewport.js +2 -6
  4. package/3rdparty/walkontable/src/viewport.mjs +2 -6
  5. package/CHANGELOG.md +37 -0
  6. package/base.js +2 -2
  7. package/base.mjs +2 -2
  8. package/cellTypes/autocompleteType/accessors/index.js +7 -0
  9. package/cellTypes/autocompleteType/accessors/index.mjs +2 -0
  10. package/cellTypes/autocompleteType/accessors/valueGetter.js +14 -0
  11. package/cellTypes/autocompleteType/accessors/valueGetter.mjs +10 -0
  12. package/cellTypes/autocompleteType/accessors/valueSetter.js +25 -0
  13. package/cellTypes/autocompleteType/accessors/valueSetter.mjs +21 -0
  14. package/cellTypes/autocompleteType/autocompleteType.js +4 -1
  15. package/cellTypes/autocompleteType/autocompleteType.mjs +4 -1
  16. package/cellTypes/checkboxType/accessors/index.js +5 -0
  17. package/cellTypes/checkboxType/accessors/index.mjs +1 -0
  18. package/cellTypes/checkboxType/accessors/valueSetter.js +26 -0
  19. package/cellTypes/checkboxType/accessors/valueSetter.mjs +22 -0
  20. package/cellTypes/checkboxType/checkboxType.js +3 -1
  21. package/cellTypes/checkboxType/checkboxType.mjs +3 -1
  22. package/cellTypes/dropdownType/accessors/index.js +7 -0
  23. package/cellTypes/dropdownType/accessors/index.mjs +2 -0
  24. package/cellTypes/dropdownType/accessors/valueGetter.js +14 -0
  25. package/cellTypes/dropdownType/accessors/valueGetter.mjs +10 -0
  26. package/cellTypes/dropdownType/accessors/valueSetter.js +17 -0
  27. package/cellTypes/dropdownType/accessors/valueSetter.mjs +13 -0
  28. package/cellTypes/dropdownType/dropdownType.js +4 -1
  29. package/cellTypes/dropdownType/dropdownType.mjs +4 -1
  30. package/cellTypes/numericType/accessors/index.js +5 -0
  31. package/cellTypes/numericType/accessors/index.mjs +1 -0
  32. package/cellTypes/numericType/accessors/valueSetter.js +19 -0
  33. package/cellTypes/numericType/accessors/valueSetter.mjs +15 -0
  34. package/cellTypes/numericType/numericType.js +3 -1
  35. package/cellTypes/numericType/numericType.mjs +3 -1
  36. package/core/focusCatcher/index.js +37 -112
  37. package/core/focusCatcher/index.mjs +35 -110
  38. package/core/focusCatcher/utils.js +31 -0
  39. package/core/focusCatcher/utils.mjs +27 -0
  40. package/core/hooks/constants.js +242 -0
  41. package/core/hooks/constants.mjs +242 -0
  42. package/core/hooks/index.d.ts +22 -0
  43. package/core/viewportScroll/scrollStrategies/focusScroll.js +5 -1
  44. package/core/viewportScroll/scrollStrategies/focusScroll.mjs +5 -1
  45. package/core/viewportScroll/utils.js +1 -1
  46. package/core/viewportScroll/utils.mjs +1 -1
  47. package/core.d.ts +4 -0
  48. package/core.js +237 -139
  49. package/core.mjs +240 -142
  50. package/dataMap/dataMap.js +13 -3
  51. package/dataMap/dataMap.mjs +14 -4
  52. package/dataMap/dataSource.js +16 -0
  53. package/dataMap/dataSource.mjs +16 -0
  54. package/dataMap/metaManager/lazyFactoryMap.js +4 -3
  55. package/dataMap/metaManager/lazyFactoryMap.mjs +2 -1
  56. package/dataMap/metaManager/metaLayers/cellMeta.js +3 -2
  57. package/dataMap/metaManager/metaLayers/cellMeta.mjs +3 -2
  58. package/dataMap/metaManager/metaSchema.js +289 -4
  59. package/dataMap/metaManager/metaSchema.mjs +289 -4
  60. package/dataMap/metaManager/utils.js +0 -11
  61. package/dataMap/metaManager/utils.mjs +0 -10
  62. package/dataMap/replaceData.js +1 -0
  63. package/dataMap/replaceData.mjs +1 -0
  64. package/dist/handsontable.css +281 -4
  65. package/dist/handsontable.full.css +281 -4
  66. package/dist/handsontable.full.js +7844 -2990
  67. package/dist/handsontable.full.min.css +4 -5
  68. package/dist/handsontable.full.min.js +167 -165
  69. package/dist/handsontable.js +9639 -4806
  70. package/dist/handsontable.min.css +4 -4
  71. package/dist/handsontable.min.js +52 -50
  72. package/dist/languages/all.js +231 -21
  73. package/dist/languages/all.min.js +1 -1
  74. package/dist/languages/ar-AR.js +11 -1
  75. package/dist/languages/ar-AR.min.js +1 -1
  76. package/dist/languages/cs-CZ.js +11 -1
  77. package/dist/languages/cs-CZ.min.js +1 -1
  78. package/dist/languages/de-CH.js +11 -1
  79. package/dist/languages/de-CH.min.js +1 -1
  80. package/dist/languages/de-DE.js +11 -1
  81. package/dist/languages/de-DE.min.js +1 -1
  82. package/dist/languages/en-US.js +11 -1
  83. package/dist/languages/en-US.min.js +1 -1
  84. package/dist/languages/es-MX.js +11 -1
  85. package/dist/languages/es-MX.min.js +1 -1
  86. package/dist/languages/fa-IR.js +11 -1
  87. package/dist/languages/fa-IR.min.js +1 -1
  88. package/dist/languages/fr-FR.js +11 -1
  89. package/dist/languages/fr-FR.min.js +1 -1
  90. package/dist/languages/hr-HR.js +11 -1
  91. package/dist/languages/hr-HR.min.js +1 -1
  92. package/dist/languages/it-IT.js +11 -1
  93. package/dist/languages/it-IT.min.js +1 -1
  94. package/dist/languages/ja-JP.js +11 -1
  95. package/dist/languages/ja-JP.min.js +1 -1
  96. package/dist/languages/ko-KR.js +11 -1
  97. package/dist/languages/ko-KR.min.js +1 -1
  98. package/dist/languages/lv-LV.js +11 -1
  99. package/dist/languages/lv-LV.min.js +1 -1
  100. package/dist/languages/nb-NO.js +11 -1
  101. package/dist/languages/nb-NO.min.js +1 -1
  102. package/dist/languages/nl-NL.js +11 -1
  103. package/dist/languages/nl-NL.min.js +1 -1
  104. package/dist/languages/pl-PL.js +11 -1
  105. package/dist/languages/pl-PL.min.js +1 -1
  106. package/dist/languages/pt-BR.js +11 -1
  107. package/dist/languages/pt-BR.min.js +1 -1
  108. package/dist/languages/ru-RU.js +11 -1
  109. package/dist/languages/ru-RU.min.js +1 -1
  110. package/dist/languages/sr-SP.js +11 -1
  111. package/dist/languages/sr-SP.min.js +1 -1
  112. package/dist/languages/zh-CN.js +11 -1
  113. package/dist/languages/zh-CN.min.js +1 -1
  114. package/dist/languages/zh-TW.js +11 -1
  115. package/dist/languages/zh-TW.min.js +1 -1
  116. package/editorManager.js +4 -4
  117. package/editorManager.mjs +4 -4
  118. package/editors/autocompleteEditor/autocompleteEditor.js +50 -112
  119. package/editors/autocompleteEditor/autocompleteEditor.mjs +51 -113
  120. package/editors/baseEditor/baseEditor.js +10 -6
  121. package/editors/baseEditor/baseEditor.mjs +10 -6
  122. package/editors/handsontableEditor/handsontableEditor.js +9 -9
  123. package/editors/handsontableEditor/handsontableEditor.mjs +9 -9
  124. package/editors/textEditor/textEditor.js +0 -7
  125. package/editors/textEditor/textEditor.mjs +0 -7
  126. package/focusManager.js +2 -2
  127. package/focusManager.mjs +2 -2
  128. package/helpers/a11y.js +15 -2
  129. package/helpers/a11y.mjs +10 -2
  130. package/helpers/console.js +12 -0
  131. package/helpers/console.mjs +11 -0
  132. package/helpers/dom/element.js +4 -4
  133. package/helpers/dom/element.mjs +4 -4
  134. package/helpers/mixed.js +65 -2
  135. package/helpers/mixed.mjs +63 -2
  136. package/helpers/number.js +28 -0
  137. package/helpers/number.mjs +26 -0
  138. package/helpers/object.js +35 -0
  139. package/helpers/object.mjs +34 -0
  140. package/helpers/string.js +19 -0
  141. package/helpers/string.mjs +18 -0
  142. package/helpers/templateLiteralTag.js +57 -1
  143. package/helpers/templateLiteralTag.mjs +56 -1
  144. package/i18n/constants.js +13 -1
  145. package/i18n/constants.mjs +13 -1
  146. package/i18n/languages/ar-AR.js +11 -1
  147. package/i18n/languages/ar-AR.mjs +11 -1
  148. package/i18n/languages/cs-CZ.js +11 -1
  149. package/i18n/languages/cs-CZ.mjs +11 -1
  150. package/i18n/languages/de-CH.js +11 -1
  151. package/i18n/languages/de-CH.mjs +11 -1
  152. package/i18n/languages/de-DE.js +11 -1
  153. package/i18n/languages/de-DE.mjs +11 -1
  154. package/i18n/languages/en-US.js +11 -1
  155. package/i18n/languages/en-US.mjs +11 -1
  156. package/i18n/languages/es-MX.js +11 -1
  157. package/i18n/languages/es-MX.mjs +11 -1
  158. package/i18n/languages/fa-IR.js +11 -1
  159. package/i18n/languages/fa-IR.mjs +11 -1
  160. package/i18n/languages/fr-FR.js +11 -1
  161. package/i18n/languages/fr-FR.mjs +11 -1
  162. package/i18n/languages/hr-HR.js +11 -1
  163. package/i18n/languages/hr-HR.mjs +11 -1
  164. package/i18n/languages/it-IT.js +11 -1
  165. package/i18n/languages/it-IT.mjs +11 -1
  166. package/i18n/languages/ja-JP.js +11 -1
  167. package/i18n/languages/ja-JP.mjs +11 -1
  168. package/i18n/languages/ko-KR.js +11 -1
  169. package/i18n/languages/ko-KR.mjs +11 -1
  170. package/i18n/languages/lv-LV.js +11 -1
  171. package/i18n/languages/lv-LV.mjs +11 -1
  172. package/i18n/languages/nb-NO.js +11 -1
  173. package/i18n/languages/nb-NO.mjs +11 -1
  174. package/i18n/languages/nl-NL.js +11 -1
  175. package/i18n/languages/nl-NL.mjs +11 -1
  176. package/i18n/languages/pl-PL.js +11 -1
  177. package/i18n/languages/pl-PL.mjs +11 -1
  178. package/i18n/languages/pt-BR.js +11 -1
  179. package/i18n/languages/pt-BR.mjs +11 -1
  180. package/i18n/languages/ru-RU.js +11 -1
  181. package/i18n/languages/ru-RU.mjs +11 -1
  182. package/i18n/languages/sr-SP.js +11 -1
  183. package/i18n/languages/sr-SP.mjs +11 -1
  184. package/i18n/languages/zh-CN.js +11 -1
  185. package/i18n/languages/zh-CN.mjs +11 -1
  186. package/i18n/languages/zh-TW.js +11 -1
  187. package/i18n/languages/zh-TW.mjs +11 -1
  188. package/i18n/phraseFormatters/index.js +3 -1
  189. package/i18n/phraseFormatters/index.mjs +3 -1
  190. package/i18n/registry.js +5 -6
  191. package/i18n/registry.mjs +5 -6
  192. package/index.d.ts +27 -0
  193. package/languages/all.js +231 -21
  194. package/languages/ar-AR.js +11 -1
  195. package/languages/ar-AR.mjs +11 -1
  196. package/languages/cs-CZ.js +11 -1
  197. package/languages/cs-CZ.mjs +11 -1
  198. package/languages/de-CH.js +11 -1
  199. package/languages/de-CH.mjs +11 -1
  200. package/languages/de-DE.js +11 -1
  201. package/languages/de-DE.mjs +11 -1
  202. package/languages/en-US.js +11 -1
  203. package/languages/en-US.mjs +11 -1
  204. package/languages/es-MX.js +11 -1
  205. package/languages/es-MX.mjs +11 -1
  206. package/languages/fa-IR.js +11 -1
  207. package/languages/fa-IR.mjs +11 -1
  208. package/languages/fr-FR.js +11 -1
  209. package/languages/fr-FR.mjs +11 -1
  210. package/languages/hr-HR.js +11 -1
  211. package/languages/hr-HR.mjs +11 -1
  212. package/languages/index.js +231 -21
  213. package/languages/it-IT.js +11 -1
  214. package/languages/it-IT.mjs +11 -1
  215. package/languages/ja-JP.js +11 -1
  216. package/languages/ja-JP.mjs +11 -1
  217. package/languages/ko-KR.js +11 -1
  218. package/languages/ko-KR.mjs +11 -1
  219. package/languages/lv-LV.js +11 -1
  220. package/languages/lv-LV.mjs +11 -1
  221. package/languages/nb-NO.js +11 -1
  222. package/languages/nb-NO.mjs +11 -1
  223. package/languages/nl-NL.js +11 -1
  224. package/languages/nl-NL.mjs +11 -1
  225. package/languages/pl-PL.js +11 -1
  226. package/languages/pl-PL.mjs +11 -1
  227. package/languages/pt-BR.js +11 -1
  228. package/languages/pt-BR.mjs +11 -1
  229. package/languages/ru-RU.js +11 -1
  230. package/languages/ru-RU.mjs +11 -1
  231. package/languages/sr-SP.js +11 -1
  232. package/languages/sr-SP.mjs +11 -1
  233. package/languages/zh-CN.js +11 -1
  234. package/languages/zh-CN.mjs +11 -1
  235. package/languages/zh-TW.js +11 -1
  236. package/languages/zh-TW.mjs +11 -1
  237. package/mixins/localHooks.js +16 -0
  238. package/mixins/localHooks.mjs +16 -0
  239. package/package.json +19 -1
  240. package/plugins/autoRowSize/autoRowSize.js +43 -6
  241. package/plugins/autoRowSize/autoRowSize.mjs +43 -6
  242. package/plugins/autofill/autofill.js +50 -3
  243. package/plugins/autofill/autofill.mjs +50 -3
  244. package/plugins/base/base.js +86 -15
  245. package/plugins/base/base.mjs +87 -16
  246. package/plugins/collapsibleColumns/collapsibleColumns.js +4 -4
  247. package/plugins/collapsibleColumns/collapsibleColumns.mjs +4 -4
  248. package/plugins/columnSorting/columnSorting.js +3 -3
  249. package/plugins/columnSorting/columnSorting.mjs +3 -3
  250. package/plugins/comments/comments.js +52 -22
  251. package/plugins/comments/comments.mjs +52 -22
  252. package/plugins/comments/contextMenuItem/addEditComment.js +3 -3
  253. package/plugins/comments/contextMenuItem/addEditComment.mjs +3 -3
  254. package/plugins/comments/contextMenuItem/readOnlyComment.js +2 -2
  255. package/plugins/comments/contextMenuItem/readOnlyComment.mjs +2 -2
  256. package/plugins/comments/contextMenuItem/removeComment.js +2 -2
  257. package/plugins/comments/contextMenuItem/removeComment.mjs +2 -2
  258. package/plugins/contextMenu/contextMenu.js +4 -5
  259. package/plugins/contextMenu/contextMenu.mjs +4 -5
  260. package/plugins/contextMenu/menu/cursor.js +1 -1
  261. package/plugins/contextMenu/menu/cursor.mjs +1 -1
  262. package/plugins/contextMenu/menu/defaultShortcutsList.js +5 -5
  263. package/plugins/contextMenu/menu/defaultShortcutsList.mjs +5 -5
  264. package/plugins/contextMenu/menu/menu.js +3 -3
  265. package/plugins/contextMenu/menu/menu.mjs +3 -3
  266. package/plugins/contextMenu/menu/positioner.js +1 -1
  267. package/plugins/contextMenu/menu/positioner.mjs +1 -1
  268. package/plugins/contextMenu/predefinedItems/alignment.js +1 -1
  269. package/plugins/contextMenu/predefinedItems/alignment.mjs +1 -1
  270. package/plugins/contextMenu/predefinedItems/clearColumn.js +1 -1
  271. package/plugins/contextMenu/predefinedItems/clearColumn.mjs +1 -1
  272. package/plugins/contextMenu/predefinedItems/columnLeft.js +3 -3
  273. package/plugins/contextMenu/predefinedItems/columnLeft.mjs +3 -3
  274. package/plugins/contextMenu/predefinedItems/columnRight.js +3 -3
  275. package/plugins/contextMenu/predefinedItems/columnRight.mjs +3 -3
  276. package/plugins/contextMenu/predefinedItems/readOnly.js +1 -1
  277. package/plugins/contextMenu/predefinedItems/readOnly.mjs +1 -1
  278. package/plugins/contextMenu/predefinedItems/removeColumn.js +1 -1
  279. package/plugins/contextMenu/predefinedItems/removeColumn.mjs +1 -1
  280. package/plugins/contextMenu/predefinedItems/removeRow.js +1 -1
  281. package/plugins/contextMenu/predefinedItems/removeRow.mjs +1 -1
  282. package/plugins/contextMenu/predefinedItems/rowAbove.js +3 -3
  283. package/plugins/contextMenu/predefinedItems/rowAbove.mjs +3 -3
  284. package/plugins/contextMenu/predefinedItems/rowBelow.js +3 -3
  285. package/plugins/contextMenu/predefinedItems/rowBelow.mjs +3 -3
  286. package/plugins/copyPaste/contextMenuItem/copy.js +1 -1
  287. package/plugins/copyPaste/contextMenuItem/copy.mjs +1 -1
  288. package/plugins/copyPaste/contextMenuItem/copyColumnHeadersOnly.js +3 -3
  289. package/plugins/copyPaste/contextMenuItem/copyColumnHeadersOnly.mjs +3 -3
  290. package/plugins/copyPaste/contextMenuItem/copyWithColumnGroupHeaders.js +3 -3
  291. package/plugins/copyPaste/contextMenuItem/copyWithColumnGroupHeaders.mjs +3 -3
  292. package/plugins/copyPaste/contextMenuItem/copyWithColumnHeaders.js +3 -3
  293. package/plugins/copyPaste/contextMenuItem/copyWithColumnHeaders.mjs +3 -3
  294. package/plugins/copyPaste/contextMenuItem/cut.js +1 -1
  295. package/plugins/copyPaste/contextMenuItem/cut.mjs +1 -1
  296. package/plugins/copyPaste/copyPaste.js +75 -40
  297. package/plugins/copyPaste/copyPaste.mjs +76 -41
  298. package/plugins/customBorders/customBorders.js +1 -1
  299. package/plugins/customBorders/customBorders.mjs +1 -1
  300. package/plugins/dialog/dialog.d.ts +23 -0
  301. package/plugins/dialog/dialog.js +489 -0
  302. package/plugins/dialog/dialog.mjs +485 -0
  303. package/plugins/dialog/index.d.ts +1 -0
  304. package/plugins/dialog/index.js +7 -0
  305. package/plugins/dialog/index.mjs +1 -0
  306. package/plugins/dialog/ui.js +264 -0
  307. package/plugins/dialog/ui.mjs +259 -0
  308. package/plugins/dropdownMenu/dropdownMenu.js +5 -4
  309. package/plugins/dropdownMenu/dropdownMenu.mjs +5 -4
  310. package/plugins/filters/filters.js +2 -2
  311. package/plugins/filters/filters.mjs +2 -2
  312. package/plugins/hiddenColumns/contextMenuItem/hideColumn.js +3 -3
  313. package/plugins/hiddenColumns/contextMenuItem/hideColumn.mjs +3 -3
  314. package/plugins/hiddenColumns/contextMenuItem/showColumn.js +4 -4
  315. package/plugins/hiddenColumns/contextMenuItem/showColumn.mjs +4 -4
  316. package/plugins/hiddenRows/contextMenuItem/hideRow.js +3 -3
  317. package/plugins/hiddenRows/contextMenuItem/hideRow.mjs +3 -3
  318. package/plugins/hiddenRows/contextMenuItem/showRow.js +4 -4
  319. package/plugins/hiddenRows/contextMenuItem/showRow.mjs +4 -4
  320. package/plugins/index.d.ts +9 -0
  321. package/plugins/index.js +9 -0
  322. package/plugins/index.mjs +7 -1
  323. package/plugins/loading/content.js +36 -0
  324. package/plugins/loading/content.mjs +31 -0
  325. package/plugins/loading/index.d.ts +1 -0
  326. package/plugins/loading/index.js +7 -0
  327. package/plugins/loading/index.mjs +1 -0
  328. package/plugins/loading/loading.d.ts +19 -0
  329. package/plugins/loading/loading.js +292 -0
  330. package/plugins/loading/loading.mjs +287 -0
  331. package/plugins/manualColumnFreeze/contextMenuItem/freezeColumn.js +1 -1
  332. package/plugins/manualColumnFreeze/contextMenuItem/freezeColumn.mjs +1 -1
  333. package/plugins/manualColumnFreeze/contextMenuItem/unfreezeColumn.js +1 -1
  334. package/plugins/manualColumnFreeze/contextMenuItem/unfreezeColumn.mjs +1 -1
  335. package/plugins/manualColumnMove/manualColumnMove.js +3 -3
  336. package/plugins/manualColumnMove/manualColumnMove.mjs +3 -3
  337. package/plugins/manualColumnResize/manualColumnResize.js +3 -3
  338. package/plugins/manualColumnResize/manualColumnResize.mjs +3 -3
  339. package/plugins/manualRowMove/manualRowMove.js +4 -4
  340. package/plugins/manualRowMove/manualRowMove.mjs +4 -4
  341. package/plugins/manualRowResize/manualRowResize.js +5 -2
  342. package/plugins/manualRowResize/manualRowResize.mjs +5 -2
  343. package/plugins/mergeCells/contextMenuItem/toggleMerge.js +15 -15
  344. package/plugins/mergeCells/contextMenuItem/toggleMerge.mjs +15 -15
  345. package/plugins/mergeCells/focusOrder.js +75 -39
  346. package/plugins/mergeCells/focusOrder.mjs +75 -39
  347. package/plugins/mergeCells/mergeCells.js +26 -19
  348. package/plugins/mergeCells/mergeCells.mjs +26 -19
  349. package/plugins/mergeCells/renderer.js +14 -8
  350. package/plugins/mergeCells/renderer.mjs +14 -8
  351. package/plugins/multiColumnSorting/multiColumnSorting.js +3 -3
  352. package/plugins/multiColumnSorting/multiColumnSorting.mjs +3 -3
  353. package/plugins/multipleSelectionHandles/multipleSelectionHandles.js +3 -3
  354. package/plugins/multipleSelectionHandles/multipleSelectionHandles.mjs +3 -3
  355. package/plugins/nestedHeaders/nestedHeaders.js +47 -41
  356. package/plugins/nestedHeaders/nestedHeaders.mjs +47 -41
  357. package/plugins/nestedRows/nestedRows.js +3 -3
  358. package/plugins/nestedRows/nestedRows.mjs +3 -3
  359. package/plugins/nestedRows/ui/collapsing.js +1 -2
  360. package/plugins/nestedRows/ui/collapsing.mjs +1 -2
  361. package/plugins/nestedRows/ui/contextMenu.js +4 -4
  362. package/plugins/nestedRows/ui/contextMenu.mjs +4 -4
  363. package/plugins/nestedRows/ui/headers.js +4 -1
  364. package/plugins/nestedRows/ui/headers.mjs +4 -1
  365. package/plugins/pagination/focusController.js +27 -0
  366. package/plugins/pagination/focusController.mjs +23 -0
  367. package/plugins/pagination/index.d.ts +1 -0
  368. package/plugins/pagination/index.js +7 -0
  369. package/plugins/pagination/index.mjs +1 -0
  370. package/plugins/pagination/pagination.d.ts +52 -0
  371. package/plugins/pagination/pagination.js +1034 -0
  372. package/plugins/pagination/pagination.mjs +1030 -0
  373. package/plugins/pagination/strategies/autoPageSize.js +96 -0
  374. package/plugins/pagination/strategies/autoPageSize.mjs +92 -0
  375. package/plugins/pagination/strategies/fixedPageSize.js +88 -0
  376. package/plugins/pagination/strategies/fixedPageSize.mjs +84 -0
  377. package/plugins/pagination/strategies/index.js +22 -0
  378. package/plugins/pagination/strategies/index.mjs +18 -0
  379. package/plugins/pagination/ui.js +449 -0
  380. package/plugins/pagination/ui.mjs +443 -0
  381. package/plugins/pagination/utils.js +28 -0
  382. package/plugins/pagination/utils.mjs +24 -0
  383. package/plugins/stretchColumns/calculator.js +4 -0
  384. package/plugins/stretchColumns/calculator.mjs +4 -0
  385. package/plugins/stretchColumns/stretchColumns.js +1 -1
  386. package/plugins/stretchColumns/stretchColumns.mjs +1 -1
  387. package/plugins/undoRedo/actions/dataChange.js +17 -15
  388. package/plugins/undoRedo/actions/dataChange.mjs +17 -15
  389. package/renderers/checkboxRenderer/checkboxRenderer.js +3 -3
  390. package/renderers/checkboxRenderer/checkboxRenderer.mjs +3 -3
  391. package/selection/range.js +11 -0
  392. package/selection/range.mjs +11 -0
  393. package/selection/selection.js +163 -124
  394. package/selection/selection.mjs +163 -124
  395. package/selection/transformation/_base.js +448 -0
  396. package/selection/transformation/_base.mjs +443 -0
  397. package/selection/transformation/extender.js +55 -0
  398. package/selection/transformation/extender.mjs +51 -0
  399. package/selection/transformation/focus.js +77 -0
  400. package/selection/transformation/focus.mjs +73 -0
  401. package/selection/transformation/index.js +7 -0
  402. package/selection/transformation/index.mjs +2 -0
  403. package/selection/utils.js +2 -1
  404. package/selection/utils.mjs +2 -1
  405. package/settings.d.ts +10 -1
  406. package/shortcutContexts/commands/editor/fastOpen.js +1 -1
  407. package/shortcutContexts/commands/editor/fastOpen.mjs +1 -1
  408. package/shortcutContexts/commands/editor/open.js +10 -4
  409. package/shortcutContexts/commands/editor/open.mjs +10 -4
  410. package/shortcutContexts/commands/extendCellsSelection/down.js +1 -1
  411. package/shortcutContexts/commands/extendCellsSelection/down.mjs +1 -1
  412. package/shortcutContexts/commands/extendCellsSelection/downByViewportHeight.js +2 -2
  413. package/shortcutContexts/commands/extendCellsSelection/downByViewportHeight.mjs +2 -2
  414. package/shortcutContexts/commands/extendCellsSelection/left.js +1 -1
  415. package/shortcutContexts/commands/extendCellsSelection/left.mjs +1 -1
  416. package/shortcutContexts/commands/extendCellsSelection/right.js +1 -1
  417. package/shortcutContexts/commands/extendCellsSelection/right.mjs +1 -1
  418. package/shortcutContexts/commands/extendCellsSelection/toColumns.js +1 -1
  419. package/shortcutContexts/commands/extendCellsSelection/toColumns.mjs +1 -1
  420. package/shortcutContexts/commands/extendCellsSelection/toMostBottom.js +1 -1
  421. package/shortcutContexts/commands/extendCellsSelection/toMostBottom.mjs +1 -1
  422. package/shortcutContexts/commands/extendCellsSelection/toMostInlineEnd.js +1 -1
  423. package/shortcutContexts/commands/extendCellsSelection/toMostInlineEnd.mjs +1 -1
  424. package/shortcutContexts/commands/extendCellsSelection/toMostInlineStart.js +1 -1
  425. package/shortcutContexts/commands/extendCellsSelection/toMostInlineStart.mjs +1 -1
  426. package/shortcutContexts/commands/extendCellsSelection/toMostLeft.js +1 -1
  427. package/shortcutContexts/commands/extendCellsSelection/toMostLeft.mjs +1 -1
  428. package/shortcutContexts/commands/extendCellsSelection/toMostRight.js +1 -1
  429. package/shortcutContexts/commands/extendCellsSelection/toMostRight.mjs +1 -1
  430. package/shortcutContexts/commands/extendCellsSelection/toMostTop.js +1 -1
  431. package/shortcutContexts/commands/extendCellsSelection/toMostTop.mjs +1 -1
  432. package/shortcutContexts/commands/extendCellsSelection/toRows.js +1 -1
  433. package/shortcutContexts/commands/extendCellsSelection/toRows.mjs +1 -1
  434. package/shortcutContexts/commands/extendCellsSelection/up.js +1 -1
  435. package/shortcutContexts/commands/extendCellsSelection/up.mjs +1 -1
  436. package/shortcutContexts/commands/extendCellsSelection/upByViewportHeight.js +2 -2
  437. package/shortcutContexts/commands/extendCellsSelection/upByViewportHeight.mjs +2 -2
  438. package/shortcutContexts/commands/moveCellSelection/downByViewportHeight.js +2 -2
  439. package/shortcutContexts/commands/moveCellSelection/downByViewportHeight.mjs +2 -2
  440. package/shortcutContexts/commands/moveCellSelection/inlineEnd.js +5 -2
  441. package/shortcutContexts/commands/moveCellSelection/inlineEnd.mjs +5 -2
  442. package/shortcutContexts/commands/moveCellSelection/inlineStart.js +5 -2
  443. package/shortcutContexts/commands/moveCellSelection/inlineStart.mjs +5 -2
  444. package/shortcutContexts/commands/moveCellSelection/toMostBottom.js +1 -1
  445. package/shortcutContexts/commands/moveCellSelection/toMostBottom.mjs +1 -1
  446. package/shortcutContexts/commands/moveCellSelection/toMostInlineEnd.js +1 -1
  447. package/shortcutContexts/commands/moveCellSelection/toMostInlineEnd.mjs +1 -1
  448. package/shortcutContexts/commands/moveCellSelection/toMostInlineStart.js +1 -1
  449. package/shortcutContexts/commands/moveCellSelection/toMostInlineStart.mjs +1 -1
  450. package/shortcutContexts/commands/moveCellSelection/toMostLeft.js +1 -1
  451. package/shortcutContexts/commands/moveCellSelection/toMostLeft.mjs +1 -1
  452. package/shortcutContexts/commands/moveCellSelection/toMostRight.js +1 -1
  453. package/shortcutContexts/commands/moveCellSelection/toMostRight.mjs +1 -1
  454. package/shortcutContexts/commands/moveCellSelection/toMostTop.js +1 -1
  455. package/shortcutContexts/commands/moveCellSelection/toMostTop.mjs +1 -1
  456. package/shortcutContexts/commands/moveCellSelection/upByViewportHeight.js +2 -2
  457. package/shortcutContexts/commands/moveCellSelection/upByViewportHeight.mjs +2 -2
  458. package/shortcutContexts/commands/scrollToFocusedCell.js +1 -1
  459. package/shortcutContexts/commands/scrollToFocusedCell.mjs +1 -1
  460. package/shortcutContexts/grid.js +3 -3
  461. package/shortcutContexts/grid.mjs +3 -3
  462. package/shortcuts/context.js +4 -1
  463. package/shortcuts/context.mjs +4 -1
  464. package/shortcuts/manager.js +17 -3
  465. package/shortcuts/manager.mjs +17 -3
  466. package/styles/handsontable.css +288 -22
  467. package/styles/handsontable.min.css +3 -3
  468. package/styles/ht-theme-classic.css +828 -0
  469. package/styles/ht-theme-classic.min.css +30 -0
  470. package/styles/ht-theme-horizon.css +122 -26
  471. package/styles/ht-theme-horizon.min.css +3 -3
  472. package/styles/ht-theme-main.css +124 -28
  473. package/styles/ht-theme-main.min.css +3 -3
  474. package/tableView.js +61 -25
  475. package/tableView.mjs +61 -25
  476. package/utils/a11yAnnouncer.js +70 -0
  477. package/utils/a11yAnnouncer.mjs +64 -0
  478. package/{core/focusCatcher → utils}/focusDetector.js +30 -12
  479. package/{core/focusCatcher → utils}/focusDetector.mjs +30 -12
  480. package/utils/samplesGenerator.js +17 -1
  481. package/utils/samplesGenerator.mjs +17 -1
  482. package/utils/stylesHandler.js +23 -8
  483. package/utils/stylesHandler.mjs +23 -8
  484. package/utils/valueAccessors.js +45 -0
  485. package/utils/valueAccessors.mjs +40 -0
  486. package/validators/autocompleteValidator/autocompleteValidator.js +2 -1
  487. package/validators/autocompleteValidator/autocompleteValidator.mjs +2 -1
  488. package/selection/transformation.js +0 -335
  489. package/selection/transformation.mjs +0 -331
@@ -342,13 +342,6 @@ export class TextEditor extends BaseEditor {
342
342
  });
343
343
  }
344
344
 
345
- /**
346
- * Ugly hack for autocompleteEditor.
347
- *
348
- * @private
349
- */
350
- allowKeyEventPropagation() {}
351
-
352
345
  /**
353
346
  * Destroys the internal event manager and clears attached hooks.
354
347
  *
package/focusManager.js CHANGED
@@ -178,7 +178,7 @@ class FocusManager {
178
178
  focusOnHighlightedCell(selectedCell) {
179
179
  const focusElement = element => {
180
180
  var _classPrivateFieldGet3, _classPrivateFieldGet4;
181
- const currentHighlightCoords = (_classPrivateFieldGet3 = _classPrivateFieldGet(_hot, this).getSelectedRangeLast()) === null || _classPrivateFieldGet3 === void 0 ? void 0 : _classPrivateFieldGet3.highlight;
181
+ const currentHighlightCoords = (_classPrivateFieldGet3 = _classPrivateFieldGet(_hot, this).getSelectedRangeActive()) === null || _classPrivateFieldGet3 === void 0 ? void 0 : _classPrivateFieldGet3.highlight;
182
182
  if (!currentHighlightCoords) {
183
183
  return;
184
184
  }
@@ -227,7 +227,7 @@ class FocusManager {
227
227
  exports.FocusManager = FocusManager;
228
228
  function _getSelectedCell(callback) {
229
229
  var _classPrivateFieldGet8;
230
- const highlight = (_classPrivateFieldGet8 = _classPrivateFieldGet(_hot, this).getSelectedRangeLast()) === null || _classPrivateFieldGet8 === void 0 ? void 0 : _classPrivateFieldGet8.highlight;
230
+ const highlight = (_classPrivateFieldGet8 = _classPrivateFieldGet(_hot, this).getSelectedRangeActive()) === null || _classPrivateFieldGet8 === void 0 ? void 0 : _classPrivateFieldGet8.highlight;
231
231
  if (!highlight || !_classPrivateFieldGet(_hot, this).selection.isCellVisible(highlight)) {
232
232
  callback(null);
233
233
  return;
package/focusManager.mjs CHANGED
@@ -175,7 +175,7 @@ export class FocusManager {
175
175
  focusOnHighlightedCell(selectedCell) {
176
176
  const focusElement = element => {
177
177
  var _classPrivateFieldGet3, _classPrivateFieldGet4;
178
- const currentHighlightCoords = (_classPrivateFieldGet3 = _classPrivateFieldGet(_hot, this).getSelectedRangeLast()) === null || _classPrivateFieldGet3 === void 0 ? void 0 : _classPrivateFieldGet3.highlight;
178
+ const currentHighlightCoords = (_classPrivateFieldGet3 = _classPrivateFieldGet(_hot, this).getSelectedRangeActive()) === null || _classPrivateFieldGet3 === void 0 ? void 0 : _classPrivateFieldGet3.highlight;
179
179
  if (!currentHighlightCoords) {
180
180
  return;
181
181
  }
@@ -223,7 +223,7 @@ export class FocusManager {
223
223
  }
224
224
  function _getSelectedCell(callback) {
225
225
  var _classPrivateFieldGet8;
226
- const highlight = (_classPrivateFieldGet8 = _classPrivateFieldGet(_hot, this).getSelectedRangeLast()) === null || _classPrivateFieldGet8 === void 0 ? void 0 : _classPrivateFieldGet8.highlight;
226
+ const highlight = (_classPrivateFieldGet8 = _classPrivateFieldGet(_hot, this).getSelectedRangeActive()) === null || _classPrivateFieldGet8 === void 0 ? void 0 : _classPrivateFieldGet8.highlight;
227
227
  if (!highlight || !_classPrivateFieldGet(_hot, this).selection.isCellVisible(highlight)) {
228
228
  callback(null);
229
229
  return;
package/helpers/a11y.js CHANGED
@@ -33,6 +33,10 @@ const A11Y_OPTION = () => ['role', 'option'];
33
33
  exports.A11Y_OPTION = A11Y_OPTION;
34
34
  const A11Y_CHECKBOX = () => ['role', 'checkbox'];
35
35
  exports.A11Y_CHECKBOX = A11Y_CHECKBOX;
36
+ const A11Y_DIALOG = () => ['role', 'dialog'];
37
+ exports.A11Y_DIALOG = A11Y_DIALOG;
38
+ const A11Y_ALERTDIALOG = () => ['role', 'alertdialog'];
39
+ exports.A11Y_ALERTDIALOG = A11Y_ALERTDIALOG;
36
40
  const A11Y_SCOPE_COL = () => ['scope', 'col'];
37
41
  exports.A11Y_SCOPE_COL = A11Y_SCOPE_COL;
38
42
  const A11Y_SCOPE_ROW = () => ['scope', 'row'];
@@ -41,9 +45,16 @@ const A11Y_TEXT = () => ['type', 'text'];
41
45
  exports.A11Y_TEXT = A11Y_TEXT;
42
46
  const A11Y_LABEL = val => ['aria-label', val];
43
47
  exports.A11Y_LABEL = A11Y_LABEL;
48
+ const A11Y_LABELED_BY = val => ['aria-labelledby', val];
49
+ exports.A11Y_LABELED_BY = A11Y_LABELED_BY;
50
+ const A11Y_DESCRIBED_BY = val => ['aria-describedby', val];
51
+ exports.A11Y_DESCRIBED_BY = A11Y_DESCRIBED_BY;
44
52
  const A11Y_HIDDEN = () => ['aria-hidden', 'true'];
45
53
  exports.A11Y_HIDDEN = A11Y_HIDDEN;
46
- const A11Y_DISABLED = () => ['aria-disabled', 'true'];
54
+ const A11Y_DISABLED = function () {
55
+ let val = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
56
+ return ['aria-disabled', val];
57
+ };
47
58
  exports.A11Y_DISABLED = A11Y_DISABLED;
48
59
  const A11Y_MULTISELECTABLE = () => ['aria-multiselectable', 'true'];
49
60
  exports.A11Y_MULTISELECTABLE = A11Y_MULTISELECTABLE;
@@ -82,4 +93,6 @@ exports.A11Y_RELEVANT = A11Y_RELEVANT;
82
93
  const A11Y_SETSIZE = val => ['aria-setsize', val];
83
94
  exports.A11Y_SETSIZE = A11Y_SETSIZE;
84
95
  const A11Y_POSINSET = val => ['aria-posinset', val];
85
- exports.A11Y_POSINSET = A11Y_POSINSET;
96
+ exports.A11Y_POSINSET = A11Y_POSINSET;
97
+ const A11Y_MODAL = () => ['aria-modal', 'true'];
98
+ exports.A11Y_MODAL = A11Y_MODAL;
package/helpers/a11y.mjs CHANGED
@@ -14,12 +14,19 @@ export const A11Y_COMBOBOX = () => ['role', 'combobox'];
14
14
  export const A11Y_LISTBOX = () => ['role', 'listbox'];
15
15
  export const A11Y_OPTION = () => ['role', 'option'];
16
16
  export const A11Y_CHECKBOX = () => ['role', 'checkbox'];
17
+ export const A11Y_DIALOG = () => ['role', 'dialog'];
18
+ export const A11Y_ALERTDIALOG = () => ['role', 'alertdialog'];
17
19
  export const A11Y_SCOPE_COL = () => ['scope', 'col'];
18
20
  export const A11Y_SCOPE_ROW = () => ['scope', 'row'];
19
21
  export const A11Y_TEXT = () => ['type', 'text'];
20
22
  export const A11Y_LABEL = val => ['aria-label', val];
23
+ export const A11Y_LABELED_BY = val => ['aria-labelledby', val];
24
+ export const A11Y_DESCRIBED_BY = val => ['aria-describedby', val];
21
25
  export const A11Y_HIDDEN = () => ['aria-hidden', 'true'];
22
- export const A11Y_DISABLED = () => ['aria-disabled', 'true'];
26
+ export const A11Y_DISABLED = function () {
27
+ let val = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
28
+ return ['aria-disabled', val];
29
+ };
23
30
  export const A11Y_MULTISELECTABLE = () => ['aria-multiselectable', 'true'];
24
31
  export const A11Y_HASPOPUP = val => ['aria-haspopup', val];
25
32
  export const A11Y_ROWCOUNT = val => ['aria-rowcount', val];
@@ -38,4 +45,5 @@ export const A11Y_ACTIVEDESCENDANT = val => ['aria-activedescendant', val];
38
45
  export const A11Y_LIVE = val => ['aria-live', val];
39
46
  export const A11Y_RELEVANT = val => ['aria-relevant', val];
40
47
  export const A11Y_SETSIZE = val => ['aria-setsize', val];
41
- export const A11Y_POSINSET = val => ['aria-posinset', val];
48
+ export const A11Y_POSINSET = val => ['aria-posinset', val];
49
+ export const A11Y_MODAL = () => ['aria-modal', 'true'];
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  exports.__esModule = true;
4
+ exports.deprecatedWarn = deprecatedWarn;
4
5
  exports.error = error;
5
6
  exports.info = info;
6
7
  exports.log = log;
@@ -38,6 +39,17 @@ function warn() {
38
39
  }
39
40
  }
40
41
 
42
+ /**
43
+ * Logs deprecated warn to the console if the `console` object is exposed.
44
+ *
45
+ * @param {string} message The message to log.
46
+ */
47
+ function deprecatedWarn(message) {
48
+ if ((0, _mixed.isDefined)(console)) {
49
+ console.warn(`Deprecated: ${message}`);
50
+ }
51
+ }
52
+
41
53
  /**
42
54
  * Logs info to the console if the `console` object is exposed.
43
55
  *
@@ -29,6 +29,17 @@ export function warn() {
29
29
  }
30
30
  }
31
31
 
32
+ /**
33
+ * Logs deprecated warn to the console if the `console` object is exposed.
34
+ *
35
+ * @param {string} message The message to log.
36
+ */
37
+ export function deprecatedWarn(message) {
38
+ if (isDefined(console)) {
39
+ console.warn(`Deprecated: ${message}`);
40
+ }
41
+ }
42
+
32
43
  /**
33
44
  * Logs info to the console if the `console` object is exposed.
34
45
  *
@@ -840,7 +840,7 @@ function outerWidth(element) {
840
840
  * @returns {number} Element's outer height.
841
841
  */
842
842
  function outerHeight(element) {
843
- return element.offsetHeight;
843
+ return element.getBoundingClientRect().height;
844
844
  }
845
845
 
846
846
  /**
@@ -1022,14 +1022,14 @@ function walkontableCalculateScrollbarWidth() {
1022
1022
  outer.style.visibility = 'hidden';
1023
1023
  outer.appendChild(inner);
1024
1024
  (rootDocument.body || rootDocument.documentElement).appendChild(outer);
1025
- const w1 = inner.offsetWidth;
1025
+ const w1 = inner.getBoundingClientRect().width;
1026
1026
  outer.style.overflow = 'scroll';
1027
- let w2 = inner.offsetWidth;
1027
+ let w2 = inner.getBoundingClientRect().width;
1028
1028
  if (w1 === w2) {
1029
1029
  w2 = outer.clientWidth;
1030
1030
  }
1031
1031
  (rootDocument.body || rootDocument.documentElement).removeChild(outer);
1032
- return w1 - w2 + getFractionalScalingCompensation(rootDocument);
1032
+ return parseFloat((w1 - w2).toFixed(3));
1033
1033
  }
1034
1034
 
1035
1035
  /**
@@ -777,7 +777,7 @@ export function outerWidth(element) {
777
777
  * @returns {number} Element's outer height.
778
778
  */
779
779
  export function outerHeight(element) {
780
- return element.offsetHeight;
780
+ return element.getBoundingClientRect().height;
781
781
  }
782
782
 
783
783
  /**
@@ -959,14 +959,14 @@ function walkontableCalculateScrollbarWidth() {
959
959
  outer.style.visibility = 'hidden';
960
960
  outer.appendChild(inner);
961
961
  (rootDocument.body || rootDocument.documentElement).appendChild(outer);
962
- const w1 = inner.offsetWidth;
962
+ const w1 = inner.getBoundingClientRect().width;
963
963
  outer.style.overflow = 'scroll';
964
- let w2 = inner.offsetWidth;
964
+ let w2 = inner.getBoundingClientRect().width;
965
965
  if (w1 === w2) {
966
966
  w2 = outer.clientWidth;
967
967
  }
968
968
  (rootDocument.body || rootDocument.documentElement).removeChild(outer);
969
- return w1 - w2 + getFractionalScalingCompensation(rootDocument);
969
+ return parseFloat((w1 - w2).toFixed(3));
970
970
  }
971
971
 
972
972
  /**
package/helpers/mixed.js CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  exports.__esModule = true;
4
4
  exports._injectProductInfo = _injectProductInfo;
5
+ exports.getMostBottomEndPosition = getMostBottomEndPosition;
6
+ exports.getMostTopStartPosition = getMostTopStartPosition;
5
7
  exports.isDefined = isDefined;
6
8
  exports.isEmpty = isEmpty;
7
9
  exports.isRegExp = isRegExp;
@@ -134,7 +136,7 @@ const domMessages = {
134
136
  function _injectProductInfo(key, element) {
135
137
  const hasValidType = !isEmpty(key);
136
138
  const isNonCommercial = typeof key === 'string' && key.toLowerCase() === 'non-commercial-and-evaluation';
137
- const hotVersion = "16.0.1";
139
+ const hotVersion = "16.1.0-next-abd8f2e-20250904";
138
140
  let keyValidityDate;
139
141
  let consoleMessageState = 'invalid';
140
142
  let domMessageState = 'invalid';
@@ -142,7 +144,7 @@ function _injectProductInfo(key, element) {
142
144
  const schemaValidity = _checkKeySchema(key);
143
145
  if (hasValidType || isNonCommercial || schemaValidity) {
144
146
  if (schemaValidity) {
145
- const releaseDate = (0, _moment.default)("10/07/2025", 'DD/MM/YYYY');
147
+ const releaseDate = (0, _moment.default)("11/09/2025", 'DD/MM/YYYY');
146
148
  const releaseDays = Math.floor(releaseDate.toDate().getTime() / 8.64e7);
147
149
  const keyValidityDays = _extractTime(key);
148
150
  keyValidityDate = (0, _moment.default)((keyValidityDays + 1) * 8.64e7, 'x').format('MMMM DD, YYYY');
@@ -208,4 +210,65 @@ function _checkKeySchema(v) {
208
210
  }
209
211
  return p === z;
210
212
  }
213
+
214
+ /**
215
+ * Gets the coordinates of the most top-start cell or header (depends on the table settings and its size).
216
+ *
217
+ * @param {Core} hot The Handsontable instance.
218
+ * @returns {CellCoords|null}
219
+ */
220
+ function getMostTopStartPosition(hot) {
221
+ const {
222
+ rowIndexMapper,
223
+ columnIndexMapper
224
+ } = hot;
225
+ const {
226
+ navigableHeaders
227
+ } = hot.getSettings();
228
+ let topRow = navigableHeaders && hot.countColHeaders() > 0 ? -hot.countColHeaders() : 0;
229
+ let startColumn = navigableHeaders && hot.countRowHeaders() > 0 ? -hot.countRowHeaders() : 0;
230
+ if (topRow === 0) {
231
+ topRow = rowIndexMapper.getVisualFromRenderableIndex(topRow);
232
+ }
233
+ if (startColumn === 0) {
234
+ startColumn = columnIndexMapper.getVisualFromRenderableIndex(startColumn);
235
+ }
236
+ if (topRow === null || startColumn === null) {
237
+ return null;
238
+ }
239
+ return hot._createCellCoords(topRow, startColumn);
240
+ }
241
+
242
+ /**
243
+ * Gets the coordinates of the most bottom-end cell or header (depends on the table settings and its size).
244
+ *
245
+ * @param {Core} hot The Handsontable instance.
246
+ * @returns {CellCoords|null}
247
+ */
248
+ function getMostBottomEndPosition(hot) {
249
+ var _rowIndexMapper$getVi, _columnIndexMapper$ge;
250
+ const {
251
+ rowIndexMapper,
252
+ columnIndexMapper
253
+ } = hot;
254
+ const {
255
+ navigableHeaders
256
+ } = hot.getSettings();
257
+ let bottomRow = rowIndexMapper.getRenderableIndexesLength() - 1;
258
+ let endColumn = columnIndexMapper.getRenderableIndexesLength() - 1;
259
+ if (bottomRow < 0) {
260
+ if (!navigableHeaders || hot.countColHeaders() === 0) {
261
+ return null;
262
+ }
263
+ bottomRow = -1;
264
+ }
265
+ if (endColumn < 0) {
266
+ if (!navigableHeaders || hot.countColHeaders() === 0) {
267
+ return null;
268
+ }
269
+ endColumn = -1;
270
+ }
271
+ return hot._createCellCoords((_rowIndexMapper$getVi = rowIndexMapper.getVisualFromRenderableIndex(bottomRow)) !== null && _rowIndexMapper$getVi !== void 0 ? _rowIndexMapper$getVi : bottomRow, (_columnIndexMapper$ge = columnIndexMapper.getVisualFromRenderableIndex(endColumn)) !== null && _columnIndexMapper$ge !== void 0 ? _columnIndexMapper$ge : endColumn);
272
+ }
273
+
211
274
  /* eslint-enable */
package/helpers/mixed.mjs CHANGED
@@ -124,7 +124,7 @@ const domMessages = {
124
124
  export function _injectProductInfo(key, element) {
125
125
  const hasValidType = !isEmpty(key);
126
126
  const isNonCommercial = typeof key === 'string' && key.toLowerCase() === 'non-commercial-and-evaluation';
127
- const hotVersion = "16.0.1";
127
+ const hotVersion = "16.1.0-next-abd8f2e-20250904";
128
128
  let keyValidityDate;
129
129
  let consoleMessageState = 'invalid';
130
130
  let domMessageState = 'invalid';
@@ -132,7 +132,7 @@ export function _injectProductInfo(key, element) {
132
132
  const schemaValidity = _checkKeySchema(key);
133
133
  if (hasValidType || isNonCommercial || schemaValidity) {
134
134
  if (schemaValidity) {
135
- const releaseDate = moment("10/07/2025", 'DD/MM/YYYY');
135
+ const releaseDate = moment("11/09/2025", 'DD/MM/YYYY');
136
136
  const releaseDays = Math.floor(releaseDate.toDate().getTime() / 8.64e7);
137
137
  const keyValidityDays = _extractTime(key);
138
138
  keyValidityDate = moment((keyValidityDays + 1) * 8.64e7, 'x').format('MMMM DD, YYYY');
@@ -198,4 +198,65 @@ function _checkKeySchema(v) {
198
198
  }
199
199
  return p === z;
200
200
  }
201
+
202
+ /**
203
+ * Gets the coordinates of the most top-start cell or header (depends on the table settings and its size).
204
+ *
205
+ * @param {Core} hot The Handsontable instance.
206
+ * @returns {CellCoords|null}
207
+ */
208
+ export function getMostTopStartPosition(hot) {
209
+ const {
210
+ rowIndexMapper,
211
+ columnIndexMapper
212
+ } = hot;
213
+ const {
214
+ navigableHeaders
215
+ } = hot.getSettings();
216
+ let topRow = navigableHeaders && hot.countColHeaders() > 0 ? -hot.countColHeaders() : 0;
217
+ let startColumn = navigableHeaders && hot.countRowHeaders() > 0 ? -hot.countRowHeaders() : 0;
218
+ if (topRow === 0) {
219
+ topRow = rowIndexMapper.getVisualFromRenderableIndex(topRow);
220
+ }
221
+ if (startColumn === 0) {
222
+ startColumn = columnIndexMapper.getVisualFromRenderableIndex(startColumn);
223
+ }
224
+ if (topRow === null || startColumn === null) {
225
+ return null;
226
+ }
227
+ return hot._createCellCoords(topRow, startColumn);
228
+ }
229
+
230
+ /**
231
+ * Gets the coordinates of the most bottom-end cell or header (depends on the table settings and its size).
232
+ *
233
+ * @param {Core} hot The Handsontable instance.
234
+ * @returns {CellCoords|null}
235
+ */
236
+ export function getMostBottomEndPosition(hot) {
237
+ var _rowIndexMapper$getVi, _columnIndexMapper$ge;
238
+ const {
239
+ rowIndexMapper,
240
+ columnIndexMapper
241
+ } = hot;
242
+ const {
243
+ navigableHeaders
244
+ } = hot.getSettings();
245
+ let bottomRow = rowIndexMapper.getRenderableIndexesLength() - 1;
246
+ let endColumn = columnIndexMapper.getRenderableIndexesLength() - 1;
247
+ if (bottomRow < 0) {
248
+ if (!navigableHeaders || hot.countColHeaders() === 0) {
249
+ return null;
250
+ }
251
+ bottomRow = -1;
252
+ }
253
+ if (endColumn < 0) {
254
+ if (!navigableHeaders || hot.countColHeaders() === 0) {
255
+ return null;
256
+ }
257
+ endColumn = -1;
258
+ }
259
+ return hot._createCellCoords((_rowIndexMapper$getVi = rowIndexMapper.getVisualFromRenderableIndex(bottomRow)) !== null && _rowIndexMapper$getVi !== void 0 ? _rowIndexMapper$getVi : bottomRow, (_columnIndexMapper$ge = columnIndexMapper.getVisualFromRenderableIndex(endColumn)) !== null && _columnIndexMapper$ge !== void 0 ? _columnIndexMapper$ge : endColumn);
260
+ }
261
+
201
262
  /* eslint-enable */
package/helpers/number.js CHANGED
@@ -2,8 +2,10 @@
2
2
 
3
3
  exports.__esModule = true;
4
4
  exports.clamp = clamp;
5
+ exports.getParsedNumber = getParsedNumber;
5
6
  exports.isNumeric = isNumeric;
6
7
  exports.isNumericLike = isNumericLike;
8
+ exports.isUnsignedNumber = isUnsignedNumber;
7
9
  exports.rangeEach = rangeEach;
8
10
  exports.rangeEachReverse = rangeEachReverse;
9
11
  exports.valueAccordingPercent = valueAccordingPercent;
@@ -141,4 +143,30 @@ function clamp(value, minValue, maxValue) {
141
143
  return maxValue;
142
144
  }
143
145
  return value;
146
+ }
147
+
148
+ /**
149
+ * Get parsed number from numeric string.
150
+ *
151
+ * @param {string} numericData Float (separated by a dot or a comma) or integer.
152
+ * @returns {number|null} Number if we get data in parsable format, not changed value otherwise.
153
+ */
154
+ function getParsedNumber(numericData) {
155
+ // Unifying "float like" string. Change from value with comma determiner to value with dot determiner,
156
+ // for example from `450,65` to `450.65`.
157
+ const unifiedNumericData = numericData.replace(',', '.');
158
+ if (isNaN(parseFloat(unifiedNumericData)) === false) {
159
+ return parseFloat(unifiedNumericData);
160
+ }
161
+ return null;
162
+ }
163
+
164
+ /**
165
+ * Check if the provided argument is an unsigned number.
166
+ *
167
+ * @param {*} value Value to check.
168
+ * @returns {boolean}
169
+ */
170
+ function isUnsignedNumber(value) {
171
+ return Number.isInteger(value) && value >= 0;
144
172
  }
@@ -132,4 +132,30 @@ export function clamp(value, minValue, maxValue) {
132
132
  return maxValue;
133
133
  }
134
134
  return value;
135
+ }
136
+
137
+ /**
138
+ * Get parsed number from numeric string.
139
+ *
140
+ * @param {string} numericData Float (separated by a dot or a comma) or integer.
141
+ * @returns {number|null} Number if we get data in parsable format, not changed value otherwise.
142
+ */
143
+ export function getParsedNumber(numericData) {
144
+ // Unifying "float like" string. Change from value with comma determiner to value with dot determiner,
145
+ // for example from `450,65` to `450.65`.
146
+ const unifiedNumericData = numericData.replace(',', '.');
147
+ if (isNaN(parseFloat(unifiedNumericData)) === false) {
148
+ return parseFloat(unifiedNumericData);
149
+ }
150
+ return null;
151
+ }
152
+
153
+ /**
154
+ * Check if the provided argument is an unsigned number.
155
+ *
156
+ * @param {*} value Value to check.
157
+ * @returns {boolean}
158
+ */
159
+ export function isUnsignedNumber(value) {
160
+ return Number.isInteger(value) && value >= 0;
135
161
  }
package/helpers/object.js CHANGED
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  exports.__esModule = true;
4
+ exports.assignObjectDefaults = assignObjectDefaults;
4
5
  exports.clone = clone;
5
6
  exports.createObjectPropListener = createObjectPropListener;
6
7
  exports.deepClone = deepClone;
@@ -369,4 +370,38 @@ function createObjectPropListener(defaultValue) {
369
370
  */
370
371
  function hasOwnProperty(object, key) {
371
372
  return Object.prototype.hasOwnProperty.call(object, key);
373
+ }
374
+
375
+ /**
376
+ * Assign default values to an object.
377
+ *
378
+ * @param {object} target The object to assign defaults to.
379
+ * @param {object} defaults The default values to assign.
380
+ * @returns {object} The object with defaults assigned.
381
+ */
382
+ function assignObjectDefaults(target, defaults) {
383
+ if (typeof target !== 'object' || target === null) {
384
+ return defaults;
385
+ }
386
+ if (typeof defaults !== 'object' || defaults === null) {
387
+ return target;
388
+ }
389
+ const result = {};
390
+
391
+ // Assign defaults
392
+ Object.keys(defaults).forEach(key => {
393
+ if (typeof defaults[key] === 'object' && defaults[key] !== null && !Array.isArray(defaults[key])) {
394
+ result[key] = assignObjectDefaults(target[key], defaults[key]);
395
+ } else {
396
+ result[key] = hasOwnProperty(target, key) && target[key] !== undefined ? target[key] : defaults[key];
397
+ }
398
+ });
399
+
400
+ // Copy extra keys from target that aren't in defaults
401
+ Object.keys(target).forEach(key => {
402
+ if (!hasOwnProperty(result, key)) {
403
+ result[key] = target[key];
404
+ }
405
+ });
406
+ return result;
372
407
  }
@@ -350,4 +350,38 @@ export function createObjectPropListener(defaultValue) {
350
350
  */
351
351
  export function hasOwnProperty(object, key) {
352
352
  return Object.prototype.hasOwnProperty.call(object, key);
353
+ }
354
+
355
+ /**
356
+ * Assign default values to an object.
357
+ *
358
+ * @param {object} target The object to assign defaults to.
359
+ * @param {object} defaults The default values to assign.
360
+ * @returns {object} The object with defaults assigned.
361
+ */
362
+ export function assignObjectDefaults(target, defaults) {
363
+ if (typeof target !== 'object' || target === null) {
364
+ return defaults;
365
+ }
366
+ if (typeof defaults !== 'object' || defaults === null) {
367
+ return target;
368
+ }
369
+ const result = {};
370
+
371
+ // Assign defaults
372
+ Object.keys(defaults).forEach(key => {
373
+ if (typeof defaults[key] === 'object' && defaults[key] !== null && !Array.isArray(defaults[key])) {
374
+ result[key] = assignObjectDefaults(target[key], defaults[key]);
375
+ } else {
376
+ result[key] = hasOwnProperty(target, key) && target[key] !== undefined ? target[key] : defaults[key];
377
+ }
378
+ });
379
+
380
+ // Copy extra keys from target that aren't in defaults
381
+ Object.keys(target).forEach(key => {
382
+ if (!hasOwnProperty(result, key)) {
383
+ result[key] = target[key];
384
+ }
385
+ });
386
+ return result;
353
387
  }
package/helpers/string.js CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  exports.__esModule = true;
4
4
  exports.equalsIgnoreCase = equalsIgnoreCase;
5
+ exports.isJSON = isJSON;
5
6
  exports.isPercentValue = isPercentValue;
6
7
  exports.randomString = randomString;
7
8
  exports.sanitize = sanitize;
@@ -59,6 +60,24 @@ function randomString() {
59
60
  return s4() + s4() + s4() + s4();
60
61
  }
61
62
 
63
+ /**
64
+ * Checks if a string is a valid JSON object.
65
+ *
66
+ * @param {string} string The string to check.
67
+ * @returns {boolean}
68
+ */
69
+ function isJSON(string) {
70
+ if (typeof string !== 'string') {
71
+ return false;
72
+ }
73
+ try {
74
+ const parsed = JSON.parse(string);
75
+ return typeof parsed === 'object' && parsed !== null;
76
+ } catch {
77
+ return false;
78
+ }
79
+ }
80
+
62
81
  /**
63
82
  * Checks if value is valid percent.
64
83
  *
@@ -48,6 +48,24 @@ export function randomString() {
48
48
  return s4() + s4() + s4() + s4();
49
49
  }
50
50
 
51
+ /**
52
+ * Checks if a string is a valid JSON object.
53
+ *
54
+ * @param {string} string The string to check.
55
+ * @returns {boolean}
56
+ */
57
+ export function isJSON(string) {
58
+ if (typeof string !== 'string') {
59
+ return false;
60
+ }
61
+ try {
62
+ const parsed = JSON.parse(string);
63
+ return typeof parsed === 'object' && parsed !== null;
64
+ } catch {
65
+ return false;
66
+ }
67
+ }
68
+
51
69
  /**
52
70
  * Checks if value is valid percent.
53
71
  *