handsontable 18.0.0 → 18.1.0-rc7

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 (1128) hide show
  1. package/3rdparty/walkontable/src/axisSizing/axisSizeSource.d.mts +1 -0
  2. package/3rdparty/walkontable/src/axisSizing/axisSizeSource.d.ts +55 -0
  3. package/3rdparty/walkontable/src/axisSizing/axisSizeSource.js +15 -0
  4. package/3rdparty/walkontable/src/axisSizing/axisSizeSource.mjs +14 -0
  5. package/3rdparty/walkontable/src/axisSizing/boxModel.d.mts +1 -0
  6. package/3rdparty/walkontable/src/axisSizing/boxModel.d.ts +32 -0
  7. package/3rdparty/walkontable/src/axisSizing/boxModel.js +45 -0
  8. package/3rdparty/walkontable/src/axisSizing/boxModel.mjs +33 -0
  9. package/3rdparty/walkontable/src/axisSizing/columnUtils.d.mts +2 -0
  10. package/3rdparty/walkontable/src/{utils/column.d.ts → axisSizing/columnUtils.d.ts} +12 -10
  11. package/3rdparty/walkontable/src/axisSizing/columnUtils.js +147 -0
  12. package/3rdparty/walkontable/src/axisSizing/columnUtils.mjs +142 -0
  13. package/3rdparty/walkontable/src/axisSizing/defaultSizeSource.d.mts +1 -0
  14. package/3rdparty/walkontable/src/axisSizing/defaultSizeSource.d.ts +58 -0
  15. package/3rdparty/walkontable/src/axisSizing/defaultSizeSource.js +129 -0
  16. package/3rdparty/walkontable/src/axisSizing/defaultSizeSource.mjs +119 -0
  17. package/3rdparty/walkontable/src/axisSizing/oversizedRows.d.mts +1 -0
  18. package/3rdparty/walkontable/src/axisSizing/oversizedRows.d.ts +162 -0
  19. package/3rdparty/walkontable/src/axisSizing/oversizedRows.js +424 -0
  20. package/3rdparty/walkontable/src/axisSizing/oversizedRows.mjs +522 -0
  21. package/3rdparty/walkontable/src/axisSizing/positionCache/index.d.ts +130 -0
  22. package/3rdparty/walkontable/src/axisSizing/positionCache/index.js +256 -0
  23. package/3rdparty/walkontable/src/axisSizing/positionCache/index.mjs +262 -0
  24. package/3rdparty/walkontable/src/axisSizing/positionCache/prefixSumStrategy.d.mts +1 -0
  25. package/3rdparty/walkontable/src/axisSizing/positionCache/prefixSumStrategy.d.ts +51 -0
  26. package/3rdparty/walkontable/src/axisSizing/positionCache/prefixSumStrategy.js +121 -0
  27. package/3rdparty/walkontable/src/axisSizing/positionCache/prefixSumStrategy.mjs +117 -0
  28. package/3rdparty/walkontable/src/axisSizing/positionCache/sparseStrategy.d.mts +1 -0
  29. package/3rdparty/walkontable/src/axisSizing/positionCache/sparseStrategy.d.ts +53 -0
  30. package/3rdparty/walkontable/src/axisSizing/positionCache/sparseStrategy.js +206 -0
  31. package/3rdparty/walkontable/src/axisSizing/positionCache/sparseStrategy.mjs +203 -0
  32. package/3rdparty/walkontable/src/axisSizing/positionCache/strategy.d.mts +1 -0
  33. package/3rdparty/walkontable/src/axisSizing/positionCache/strategy.d.ts +53 -0
  34. package/3rdparty/walkontable/src/axisSizing/positionCache/strategy.js +40 -0
  35. package/3rdparty/walkontable/src/axisSizing/positionCache/strategy.mjs +41 -0
  36. package/3rdparty/walkontable/src/axisSizing/positionCache/uniformStrategy.d.mts +1 -0
  37. package/3rdparty/walkontable/src/axisSizing/positionCache/uniformStrategy.d.ts +47 -0
  38. package/3rdparty/walkontable/src/axisSizing/positionCache/uniformStrategy.js +121 -0
  39. package/3rdparty/walkontable/src/axisSizing/positionCache/uniformStrategy.mjs +115 -0
  40. package/3rdparty/walkontable/src/axisSizing/rowUtils.d.mts +2 -0
  41. package/3rdparty/walkontable/src/{utils/row.d.ts → axisSizing/rowUtils.d.ts} +11 -9
  42. package/3rdparty/walkontable/src/axisSizing/rowUtils.js +111 -0
  43. package/3rdparty/walkontable/src/axisSizing/rowUtils.mjs +106 -0
  44. package/3rdparty/walkontable/src/axisSizing/sizeGetters.d.mts +2 -0
  45. package/3rdparty/walkontable/src/axisSizing/sizeGetters.d.ts +84 -0
  46. package/3rdparty/walkontable/src/axisSizing/sizeGetters.js +102 -0
  47. package/3rdparty/walkontable/src/axisSizing/sizeGetters.mjs +92 -0
  48. package/3rdparty/walkontable/src/calculator/axisCalculation.d.ts +1 -1
  49. package/3rdparty/walkontable/src/calculator/calculationType/renderedColumns.d.ts +10 -0
  50. package/3rdparty/walkontable/src/calculator/calculationType/renderedColumns.js +10 -1
  51. package/3rdparty/walkontable/src/calculator/calculationType/renderedColumns.mjs +10 -1
  52. package/3rdparty/walkontable/src/calculator/calculationType/renderedRows.d.ts +9 -0
  53. package/3rdparty/walkontable/src/calculator/calculationType/renderedRows.js +9 -1
  54. package/3rdparty/walkontable/src/calculator/calculationType/renderedRows.mjs +9 -1
  55. package/3rdparty/walkontable/src/calculator/viewportColumns.d.ts +1 -1
  56. package/3rdparty/walkontable/src/calculator/viewportRows.d.ts +1 -1
  57. package/3rdparty/walkontable/src/cell/range.d.ts +10 -0
  58. package/3rdparty/walkontable/src/cell/range.js +14 -3
  59. package/3rdparty/walkontable/src/cell/range.mjs +11 -0
  60. package/3rdparty/walkontable/src/core/_base.d.ts +21 -21
  61. package/3rdparty/walkontable/src/core/_base.js +58 -147
  62. package/3rdparty/walkontable/src/core/_base.mjs +17 -147
  63. package/3rdparty/walkontable/src/core/clone.d.ts +4 -14
  64. package/3rdparty/walkontable/src/core/clone.js +51 -5
  65. package/3rdparty/walkontable/src/core/clone.mjs +10 -5
  66. package/3rdparty/walkontable/src/core/core.d.ts +1 -5
  67. package/3rdparty/walkontable/src/core/core.js +52 -47
  68. package/3rdparty/walkontable/src/core/core.mjs +12 -48
  69. package/3rdparty/walkontable/src/domMeasure/geometryReader.d.mts +1 -0
  70. package/3rdparty/walkontable/src/domMeasure/geometryReader.d.ts +172 -0
  71. package/3rdparty/walkontable/src/domMeasure/geometryReader.js +19 -0
  72. package/3rdparty/walkontable/src/domMeasure/geometryReader.mjs +16 -0
  73. package/3rdparty/walkontable/src/domMeasure/liveGeometryReader.d.mts +1 -0
  74. package/3rdparty/walkontable/src/domMeasure/liveGeometryReader.d.ts +134 -0
  75. package/3rdparty/walkontable/src/domMeasure/liveGeometryReader.js +200 -0
  76. package/3rdparty/walkontable/src/domMeasure/liveGeometryReader.mjs +198 -0
  77. package/3rdparty/walkontable/src/event.d.ts +25 -12
  78. package/3rdparty/walkontable/src/event.js +91 -224
  79. package/3rdparty/walkontable/src/event.mjs +90 -224
  80. package/3rdparty/walkontable/src/facade/core.d.ts +6 -6
  81. package/3rdparty/walkontable/src/index.d.ts +1 -1
  82. package/3rdparty/walkontable/src/index.js +2 -2
  83. package/3rdparty/walkontable/src/index.mjs +1 -1
  84. package/3rdparty/walkontable/src/overlay/index.d.ts +6 -6
  85. package/3rdparty/walkontable/src/overlay/index.js +11 -11
  86. package/3rdparty/walkontable/src/overlay/index.mjs +6 -6
  87. package/3rdparty/walkontable/src/overlay/overlays.d.ts +375 -0
  88. package/3rdparty/walkontable/src/overlay/overlays.js +612 -0
  89. package/3rdparty/walkontable/src/overlay/overlays.mjs +601 -0
  90. package/3rdparty/walkontable/src/overlay/{_base.d.ts → regions/_base.d.ts} +65 -16
  91. package/3rdparty/walkontable/src/overlay/{_base.js → regions/_base.js} +160 -50
  92. package/3rdparty/walkontable/src/overlay/{_base.mjs → regions/_base.mjs} +163 -47
  93. package/3rdparty/walkontable/src/overlay/regions/bottomInlineStartCornerOverlay.d.mts +1 -0
  94. package/3rdparty/walkontable/src/overlay/{bottomInlineStartCorner.d.ts → regions/bottomInlineStartCornerOverlay.d.ts} +5 -10
  95. package/3rdparty/walkontable/src/overlay/{bottomInlineStartCorner.js → regions/bottomInlineStartCornerOverlay.js} +18 -20
  96. package/3rdparty/walkontable/src/overlay/{bottomInlineStartCorner.mjs → regions/bottomInlineStartCornerOverlay.mjs} +18 -20
  97. package/3rdparty/walkontable/src/overlay/regions/bottomOverlay.d.mts +1 -0
  98. package/3rdparty/walkontable/src/overlay/{bottom.d.ts → regions/bottomOverlay.d.ts} +16 -11
  99. package/3rdparty/walkontable/src/overlay/{bottom.js → regions/bottomOverlay.js} +113 -66
  100. package/3rdparty/walkontable/src/overlay/{bottom.mjs → regions/bottomOverlay.mjs} +113 -66
  101. package/3rdparty/walkontable/src/overlay/regions/inlineStartOverlay.d.mts +1 -0
  102. package/3rdparty/walkontable/src/overlay/{inlineStart.d.ts → regions/inlineStartOverlay.d.ts} +17 -11
  103. package/3rdparty/walkontable/src/overlay/{inlineStart.js → regions/inlineStartOverlay.js} +122 -67
  104. package/3rdparty/walkontable/src/overlay/{inlineStart.mjs → regions/inlineStartOverlay.mjs} +122 -67
  105. package/3rdparty/walkontable/src/overlay/regions/topInlineStartCornerOverlay.d.mts +1 -0
  106. package/3rdparty/walkontable/src/overlay/{topInlineStartCorner.d.ts → regions/topInlineStartCornerOverlay.d.ts} +5 -10
  107. package/3rdparty/walkontable/src/overlay/{topInlineStartCorner.js → regions/topInlineStartCornerOverlay.js} +13 -16
  108. package/3rdparty/walkontable/src/overlay/{topInlineStartCorner.mjs → regions/topInlineStartCornerOverlay.mjs} +13 -16
  109. package/3rdparty/walkontable/src/overlay/regions/topOverlay.d.mts +1 -0
  110. package/3rdparty/walkontable/src/overlay/{top.d.ts → regions/topOverlay.d.ts} +32 -11
  111. package/3rdparty/walkontable/src/overlay/{top.js → regions/topOverlay.js} +163 -77
  112. package/3rdparty/walkontable/src/overlay/{top.mjs → regions/topOverlay.mjs} +163 -77
  113. package/3rdparty/walkontable/src/overlay/resizeMonitor.d.mts +1 -0
  114. package/3rdparty/walkontable/src/overlay/resizeMonitor.d.ts +49 -0
  115. package/3rdparty/walkontable/src/overlay/resizeMonitor.js +154 -0
  116. package/3rdparty/walkontable/src/overlay/resizeMonitor.mjs +153 -0
  117. package/3rdparty/walkontable/src/overlay/scroll/nativeScrollInput.d.mts +1 -0
  118. package/3rdparty/walkontable/src/overlay/scroll/nativeScrollInput.d.ts +62 -0
  119. package/3rdparty/walkontable/src/overlay/scroll/nativeScrollInput.js +290 -0
  120. package/3rdparty/walkontable/src/overlay/scroll/nativeScrollInput.mjs +295 -0
  121. package/3rdparty/walkontable/src/overlay/scroll/scrollSync.d.mts +1 -0
  122. package/3rdparty/walkontable/src/overlay/scroll/scrollSync.d.ts +176 -0
  123. package/3rdparty/walkontable/src/overlay/scroll/scrollSync.js +549 -0
  124. package/3rdparty/walkontable/src/overlay/scroll/scrollSync.mjs +557 -0
  125. package/3rdparty/walkontable/src/overlay/spreaderSize.d.mts +1 -0
  126. package/3rdparty/walkontable/src/overlay/spreaderSize.d.ts +67 -0
  127. package/3rdparty/walkontable/src/overlay/spreaderSize.js +178 -0
  128. package/3rdparty/walkontable/src/overlay/spreaderSize.mjs +179 -0
  129. package/3rdparty/walkontable/src/{stickyScrollStrategy.d.ts → overlay/strategies/stickyScrollStrategy.d.ts} +33 -21
  130. package/3rdparty/walkontable/src/{stickyScrollStrategy.js → overlay/strategies/stickyScrollStrategy.js} +60 -41
  131. package/3rdparty/walkontable/src/{stickyScrollStrategy.mjs → overlay/strategies/stickyScrollStrategy.mjs} +58 -38
  132. package/3rdparty/walkontable/src/ports.d.mts +1 -0
  133. package/3rdparty/walkontable/src/ports.d.ts +54 -0
  134. package/3rdparty/walkontable/src/ports.js +23 -0
  135. package/3rdparty/walkontable/src/ports.mjs +24 -0
  136. package/3rdparty/walkontable/src/{renderer → render}/_base.d.ts +1 -1
  137. package/3rdparty/walkontable/src/{renderer → render}/cells.js +1 -1
  138. package/3rdparty/walkontable/src/{renderer → render}/cells.mjs +1 -1
  139. package/3rdparty/walkontable/src/{renderer → render}/columnHeaders.d.ts +1 -0
  140. package/3rdparty/walkontable/src/{renderer → render}/columnHeaders.js +43 -1
  141. package/3rdparty/walkontable/src/{renderer → render}/columnHeaders.mjs +44 -2
  142. package/3rdparty/walkontable/src/render/index.d.mts +1 -0
  143. package/3rdparty/walkontable/src/{renderer → render}/index.d.ts +11 -3
  144. package/3rdparty/walkontable/src/{renderer → render}/index.js +13 -3
  145. package/3rdparty/walkontable/src/{renderer → render}/index.mjs +11 -1
  146. package/3rdparty/walkontable/src/{renderer → render}/rows.js +1 -1
  147. package/3rdparty/walkontable/src/{renderer → render}/rows.mjs +1 -1
  148. package/3rdparty/walkontable/src/render/tableRenderer.d.mts +1 -0
  149. package/3rdparty/walkontable/src/{renderer/table.d.ts → render/tableRenderer.d.ts} +12 -2
  150. package/3rdparty/walkontable/src/render/tableRenderer.js +382 -0
  151. package/3rdparty/walkontable/src/{renderer/table.mjs → render/tableRenderer.mjs} +159 -6
  152. package/3rdparty/walkontable/src/{scroll.d.ts → scroll/scroll.d.ts} +27 -10
  153. package/3rdparty/walkontable/src/{scroll.js → scroll/scroll.js} +108 -32
  154. package/3rdparty/walkontable/src/{scroll.mjs → scroll/scroll.mjs} +106 -29
  155. package/3rdparty/walkontable/src/selection/border/border.d.ts +313 -5
  156. package/3rdparty/walkontable/src/selection/border/border.js +861 -51
  157. package/3rdparty/walkontable/src/selection/border/border.mjs +863 -53
  158. package/3rdparty/walkontable/src/selection/border/types.d.ts +30 -0
  159. package/3rdparty/walkontable/src/selection/manager.js +237 -0
  160. package/3rdparty/walkontable/src/selection/manager.mjs +238 -1
  161. package/3rdparty/walkontable/src/settings/accessor.d.mts +2 -0
  162. package/3rdparty/walkontable/src/settings/accessor.d.ts +74 -0
  163. package/3rdparty/walkontable/src/settings/accessor.js +78 -0
  164. package/3rdparty/walkontable/src/settings/accessor.mjs +71 -0
  165. package/3rdparty/walkontable/src/settings/defaults.d.mts +1 -0
  166. package/3rdparty/walkontable/src/{settings.d.ts → settings/defaults.d.ts} +16 -77
  167. package/3rdparty/walkontable/src/settings/defaults.js +146 -0
  168. package/3rdparty/walkontable/src/settings/defaults.mjs +225 -0
  169. package/3rdparty/walkontable/src/settings/index.d.mts +1 -0
  170. package/3rdparty/walkontable/src/settings/index.d.ts +6 -0
  171. package/3rdparty/walkontable/src/settings/index.js +20 -0
  172. package/3rdparty/walkontable/src/settings/index.mjs +5 -0
  173. package/3rdparty/walkontable/src/table/baseTable.d.mts +2 -0
  174. package/3rdparty/walkontable/src/table/baseTable.d.ts +284 -0
  175. package/3rdparty/walkontable/src/table/baseTable.js +295 -0
  176. package/3rdparty/walkontable/src/table/baseTable.mjs +283 -0
  177. package/3rdparty/walkontable/src/table/cellAccess.d.mts +1 -0
  178. package/3rdparty/walkontable/src/table/cellAccess.d.ts +101 -0
  179. package/3rdparty/walkontable/src/table/cellAccess.js +238 -0
  180. package/3rdparty/walkontable/src/table/cellAccess.mjs +229 -0
  181. package/3rdparty/walkontable/src/table/domScaffold.d.mts +1 -0
  182. package/3rdparty/walkontable/src/table/domScaffold.d.ts +37 -0
  183. package/3rdparty/walkontable/src/table/domScaffold.js +145 -0
  184. package/3rdparty/walkontable/src/table/domScaffold.mjs +136 -0
  185. package/3rdparty/walkontable/src/table/drawCycle.d.mts +1 -0
  186. package/3rdparty/walkontable/src/table/drawCycle.d.ts +16 -0
  187. package/3rdparty/walkontable/src/table/drawCycle.js +405 -0
  188. package/3rdparty/walkontable/src/table/drawCycle.mjs +403 -0
  189. package/3rdparty/walkontable/src/table/rangeQuery/renderedRange.d.mts +1 -0
  190. package/3rdparty/walkontable/src/table/rangeQuery/renderedRange.d.ts +38 -0
  191. package/3rdparty/walkontable/src/table/rangeQuery/renderedRange.js +15 -0
  192. package/3rdparty/walkontable/src/table/rangeQuery/renderedRange.mjs +14 -0
  193. package/3rdparty/walkontable/src/table/{mixin → rangeQuery}/stickyColumnsStart.d.ts +1 -1
  194. package/3rdparty/walkontable/src/table/{mixin → rangeQuery}/stickyColumnsStart.js +1 -1
  195. package/3rdparty/walkontable/src/table/{mixin → rangeQuery}/stickyColumnsStart.mjs +1 -1
  196. package/3rdparty/walkontable/src/table/{mixin → rangeQuery}/stickyRowsBottom.d.ts +1 -1
  197. package/3rdparty/walkontable/src/table/{mixin → rangeQuery}/stickyRowsTop.d.ts +1 -1
  198. package/3rdparty/walkontable/src/table/{mixin → rangeQuery}/stickyRowsTop.js +1 -1
  199. package/3rdparty/walkontable/src/table/{mixin → rangeQuery}/stickyRowsTop.mjs +1 -1
  200. package/3rdparty/walkontable/src/table/rangeQuery/viewportPredicates.d.mts +2 -0
  201. package/3rdparty/walkontable/src/table/rangeQuery/viewportPredicates.d.ts +226 -0
  202. package/3rdparty/walkontable/src/table/rangeQuery/viewportPredicates.js +251 -0
  203. package/3rdparty/walkontable/src/table/rangeQuery/viewportPredicates.mjs +241 -0
  204. package/3rdparty/walkontable/src/table/rangeQuery/virtualRange.d.mts +1 -0
  205. package/3rdparty/walkontable/src/table/rangeQuery/virtualRange.d.ts +14 -0
  206. package/3rdparty/walkontable/src/table/rangeQuery/virtualRange.js +196 -0
  207. package/3rdparty/walkontable/src/table/rangeQuery/virtualRange.mjs +179 -0
  208. package/3rdparty/walkontable/src/table/regions/bottomInlineStartCornerTable.d.mts +2 -0
  209. package/3rdparty/walkontable/src/table/regions/bottomInlineStartCornerTable.d.ts +16 -0
  210. package/3rdparty/walkontable/src/table/{bottomInlineStartCorner.js → regions/bottomInlineStartCornerTable.js} +9 -12
  211. package/3rdparty/walkontable/src/table/regions/bottomInlineStartCornerTable.mjs +21 -0
  212. package/3rdparty/walkontable/src/table/regions/bottomTable.d.mts +2 -0
  213. package/3rdparty/walkontable/src/table/regions/bottomTable.d.ts +15 -0
  214. package/3rdparty/walkontable/src/table/regions/bottomTable.js +35 -0
  215. package/3rdparty/walkontable/src/table/regions/bottomTable.mjs +20 -0
  216. package/3rdparty/walkontable/src/table/regions/inlineStartTable.d.mts +2 -0
  217. package/3rdparty/walkontable/src/table/regions/inlineStartTable.d.ts +12 -0
  218. package/3rdparty/walkontable/src/table/regions/inlineStartTable.js +32 -0
  219. package/3rdparty/walkontable/src/table/regions/inlineStartTable.mjs +17 -0
  220. package/3rdparty/walkontable/src/table/regions/masterTable.d.mts +2 -0
  221. package/3rdparty/walkontable/src/table/{master.d.ts → regions/masterTable.d.ts} +4 -13
  222. package/3rdparty/walkontable/src/table/{master.js → regions/masterTable.js} +23 -48
  223. package/3rdparty/walkontable/src/table/{master.mjs → regions/masterTable.mjs} +22 -47
  224. package/3rdparty/walkontable/src/table/regions/topInlineStartCornerTable.d.mts +2 -0
  225. package/3rdparty/walkontable/src/table/regions/topInlineStartCornerTable.d.ts +16 -0
  226. package/3rdparty/walkontable/src/table/{topInlineStartCorner.js → regions/topInlineStartCornerTable.js} +9 -12
  227. package/3rdparty/walkontable/src/table/regions/topInlineStartCornerTable.mjs +21 -0
  228. package/3rdparty/walkontable/src/table/regions/topTable.d.mts +2 -0
  229. package/3rdparty/walkontable/src/table/regions/topTable.d.ts +15 -0
  230. package/3rdparty/walkontable/src/table/regions/topTable.js +35 -0
  231. package/3rdparty/walkontable/src/table/regions/topTable.mjs +20 -0
  232. package/3rdparty/walkontable/src/types.d.ts +7 -69
  233. package/3rdparty/walkontable/src/types.mjs +2 -1
  234. package/3rdparty/walkontable/src/utils/pointerToCoords.d.mts +1 -0
  235. package/3rdparty/walkontable/src/utils/{cellCoords.d.ts → pointerToCoords.d.ts} +24 -0
  236. package/3rdparty/walkontable/src/utils/pointerToCoords.js +181 -0
  237. package/3rdparty/walkontable/src/utils/pointerToCoords.mjs +186 -0
  238. package/3rdparty/walkontable/src/viewport/boxLayout/gatherLayoutInput.d.mts +1 -0
  239. package/3rdparty/walkontable/src/viewport/boxLayout/gatherLayoutInput.d.ts +40 -0
  240. package/3rdparty/walkontable/src/viewport/boxLayout/gatherLayoutInput.js +139 -0
  241. package/3rdparty/walkontable/src/viewport/boxLayout/gatherLayoutInput.mjs +131 -0
  242. package/3rdparty/walkontable/src/viewport/boxLayout/layoutSnapshot.d.mts +1 -0
  243. package/3rdparty/walkontable/src/viewport/boxLayout/layoutSnapshot.d.ts +133 -0
  244. package/3rdparty/walkontable/src/viewport/boxLayout/layoutSnapshot.js +18 -0
  245. package/3rdparty/walkontable/src/viewport/boxLayout/layoutSnapshot.mjs +18 -0
  246. package/3rdparty/walkontable/src/viewport/boxLayout/resolveLayout.d.mts +1 -0
  247. package/3rdparty/walkontable/src/viewport/boxLayout/resolveLayout.d.ts +17 -0
  248. package/3rdparty/walkontable/src/viewport/boxLayout/resolveLayout.js +104 -0
  249. package/3rdparty/walkontable/src/viewport/boxLayout/resolveLayout.mjs +99 -0
  250. package/3rdparty/walkontable/src/viewport/calculatorFactory.d.mts +1 -0
  251. package/3rdparty/walkontable/src/viewport/calculatorFactory.d.ts +84 -0
  252. package/3rdparty/walkontable/src/viewport/calculatorFactory.js +588 -0
  253. package/3rdparty/walkontable/src/viewport/calculatorFactory.mjs +601 -0
  254. package/3rdparty/walkontable/src/viewport/viewport.d.ts +267 -0
  255. package/3rdparty/walkontable/src/viewport/viewport.js +368 -0
  256. package/3rdparty/walkontable/src/viewport/viewport.mjs +360 -0
  257. package/3rdparty/walkontable/src/viewport/workspaceSize.d.mts +1 -0
  258. package/3rdparty/walkontable/src/viewport/workspaceSize.d.ts +59 -0
  259. package/3rdparty/walkontable/src/viewport/workspaceSize.js +284 -0
  260. package/3rdparty/walkontable/src/viewport/workspaceSize.mjs +282 -0
  261. package/3rdparty/walkontable/src/wire.d.mts +1 -0
  262. package/3rdparty/walkontable/src/wire.d.ts +81 -0
  263. package/3rdparty/walkontable/src/wire.js +56 -0
  264. package/3rdparty/walkontable/src/wire.mjs +56 -0
  265. package/CHANGELOG.md +114 -1
  266. package/LICENSE.txt +1 -1
  267. package/README.md +2 -2
  268. package/base.d.ts +13 -4
  269. package/base.js +2 -2
  270. package/base.mjs +2 -2
  271. package/cellTypes/checkboxType/accessors/valueSetter.d.ts +1 -1
  272. package/cellTypes/checkboxType/accessors/valueSetter.js +3 -1
  273. package/cellTypes/checkboxType/accessors/valueSetter.mjs +3 -1
  274. package/cellTypes/index.d.ts +3 -2
  275. package/cellTypes/index.js +9 -0
  276. package/cellTypes/index.mjs +5 -2
  277. package/cellTypes/intlDatetimeType/index.d.mts +1 -0
  278. package/cellTypes/intlDatetimeType/index.d.ts +1 -0
  279. package/cellTypes/intlDatetimeType/index.js +19 -0
  280. package/cellTypes/intlDatetimeType/index.mjs +1 -0
  281. package/cellTypes/intlDatetimeType/intlDatetimeType.d.mts +1 -0
  282. package/cellTypes/intlDatetimeType/intlDatetimeType.d.ts +16 -0
  283. package/cellTypes/intlDatetimeType/intlDatetimeType.js +31 -0
  284. package/cellTypes/intlDatetimeType/intlDatetimeType.mjs +15 -0
  285. package/cellTypes/multiSelectType/index.d.ts +1 -1
  286. package/cellTypes/multiSelectType/index.js +3 -0
  287. package/cellTypes/multiSelectType/index.mjs +1 -1
  288. package/cellTypes/multiSelectType/multiSelectType.d.ts +1 -0
  289. package/cellTypes/multiSelectType/multiSelectType.js +4 -0
  290. package/cellTypes/multiSelectType/multiSelectType.mjs +1 -0
  291. package/cellTypes/numericType/accessors/valueSetter.js +30 -2
  292. package/cellTypes/numericType/accessors/valueSetter.mjs +31 -3
  293. package/core/hooks/bucket.d.ts +40 -6
  294. package/core/hooks/bucket.js +108 -72
  295. package/core/hooks/bucket.mjs +113 -72
  296. package/core/hooks/constants.js +254 -16
  297. package/core/hooks/constants.mjs +254 -16
  298. package/core/hooks/index.js +27 -22
  299. package/core/hooks/index.mjs +27 -22
  300. package/core/layout/constants.d.ts +11 -0
  301. package/core/layout/constants.js +6 -0
  302. package/core/layout/constants.mjs +12 -0
  303. package/core/layout/domSlot.d.ts +3 -1
  304. package/core/layout/domSlot.js +16 -2
  305. package/core/layout/domSlot.mjs +16 -2
  306. package/core/layout/index.d.ts +2 -2
  307. package/core/layout/index.js +6 -0
  308. package/core/layout/index.mjs +2 -2
  309. package/core/layout/layoutManager.d.ts +13 -0
  310. package/core/layout/layoutManager.js +21 -4
  311. package/core/layout/layoutManager.mjs +22 -2
  312. package/core/settings.d.ts +102 -6
  313. package/core/types.d.ts +15 -1
  314. package/core/types.mjs +9 -0
  315. package/core.js +534 -88
  316. package/core.mjs +537 -91
  317. package/dataMap/dataMap.d.ts +3 -13
  318. package/dataMap/dataMap.js +100 -41
  319. package/dataMap/dataMap.mjs +101 -42
  320. package/dataMap/dataSource.js +4 -1
  321. package/dataMap/dataSource.mjs +4 -1
  322. package/dataMap/metaManager/index.d.ts +62 -8
  323. package/dataMap/metaManager/index.js +66 -0
  324. package/dataMap/metaManager/index.mjs +66 -0
  325. package/dataMap/metaManager/lazyFactoryMap.d.ts +68 -43
  326. package/dataMap/metaManager/lazyFactoryMap.js +497 -110
  327. package/dataMap/metaManager/lazyFactoryMap.mjs +511 -111
  328. package/dataMap/metaManager/metaLayers/cellMeta.d.ts +55 -8
  329. package/dataMap/metaManager/metaLayers/cellMeta.js +108 -8
  330. package/dataMap/metaManager/metaLayers/cellMeta.mjs +108 -8
  331. package/dataMap/metaManager/metaLayers/columnMeta.d.ts +2 -1
  332. package/dataMap/metaManager/metaLayers/columnMeta.js +1 -0
  333. package/dataMap/metaManager/metaLayers/columnMeta.mjs +1 -0
  334. package/dataMap/metaManager/metaSchema.js +759 -39
  335. package/dataMap/metaManager/metaSchema.mjs +759 -39
  336. package/dataMap/metaManager/mods/dynamicCellMeta.d.ts +24 -10
  337. package/dataMap/metaManager/mods/dynamicCellMeta.js +252 -28
  338. package/dataMap/metaManager/mods/dynamicCellMeta.mjs +253 -29
  339. package/dataMap/sourceDataValidator.d.ts +13 -21
  340. package/dataMap/sourceDataValidator.js +39 -29
  341. package/dataMap/sourceDataValidator.mjs +50 -33
  342. package/dist/handsontable.full.js +30027 -11261
  343. package/dist/handsontable.full.min.js +168 -112
  344. package/dist/handsontable.js +32468 -13762
  345. package/dist/handsontable.min.js +172 -116
  346. package/dist/languages/all.js +2 -1
  347. package/dist/languages/all.min.js +1 -1
  348. package/dist/languages/fa-IR.js +2 -1
  349. package/dist/languages/fa-IR.min.js +1 -1
  350. package/dist/themes/classic.js +9 -3
  351. package/dist/themes/classic.min.js +4 -4
  352. package/dist/themes/horizon.js +9 -3
  353. package/dist/themes/horizon.min.js +4 -4
  354. package/dist/themes/main.js +9 -3
  355. package/dist/themes/main.min.js +4 -4
  356. package/dist/themes/static/variables/colors/ant.js +3 -3
  357. package/dist/themes/static/variables/colors/ant.min.js +3 -3
  358. package/dist/themes/static/variables/colors/classic.js +3 -3
  359. package/dist/themes/static/variables/colors/classic.min.js +3 -3
  360. package/dist/themes/static/variables/colors/horizon.js +3 -3
  361. package/dist/themes/static/variables/colors/horizon.min.js +3 -3
  362. package/dist/themes/static/variables/colors/main.js +3 -3
  363. package/dist/themes/static/variables/colors/main.min.js +3 -3
  364. package/dist/themes/static/variables/colors/material.js +3 -3
  365. package/dist/themes/static/variables/colors/material.min.js +3 -3
  366. package/dist/themes/static/variables/colors/shadcn.js +3 -3
  367. package/dist/themes/static/variables/colors/shadcn.min.js +3 -3
  368. package/dist/themes/static/variables/density.js +3 -3
  369. package/dist/themes/static/variables/density.min.js +3 -3
  370. package/dist/themes/static/variables/helpers/iconsMap.js +4 -9
  371. package/dist/themes/static/variables/helpers/iconsMap.min.js +4 -9
  372. package/dist/themes/static/variables/icons/horizon.js +3 -3
  373. package/dist/themes/static/variables/icons/horizon.min.js +3 -3
  374. package/dist/themes/static/variables/icons/main.js +3 -3
  375. package/dist/themes/static/variables/icons/main.min.js +3 -3
  376. package/dist/themes/static/variables/sizing.js +3 -3
  377. package/dist/themes/static/variables/sizing.min.js +3 -3
  378. package/dist/themes/static/variables/tokens/classic.js +9 -3
  379. package/dist/themes/static/variables/tokens/classic.min.js +4 -4
  380. package/dist/themes/static/variables/tokens/horizon.js +9 -3
  381. package/dist/themes/static/variables/tokens/horizon.min.js +4 -4
  382. package/dist/themes/static/variables/tokens/main.js +9 -3
  383. package/dist/themes/static/variables/tokens/main.min.js +4 -4
  384. package/editorManager.js +152 -3
  385. package/editorManager.mjs +152 -3
  386. package/editors/autocompleteEditor/autocompleteEditor.js +58 -11
  387. package/editors/autocompleteEditor/autocompleteEditor.mjs +59 -12
  388. package/editors/baseEditor/baseEditor.d.ts +15 -3
  389. package/editors/baseEditor/baseEditor.js +5 -3
  390. package/editors/baseEditor/baseEditor.mjs +15 -3
  391. package/editors/factory.js +5 -2
  392. package/editors/factory.mjs +5 -2
  393. package/editors/index.d.ts +3 -2
  394. package/editors/index.js +8 -0
  395. package/editors/index.mjs +3 -1
  396. package/editors/intlDatetimeEditor/index.d.mts +1 -0
  397. package/editors/intlDatetimeEditor/index.d.ts +1 -0
  398. package/editors/intlDatetimeEditor/index.js +19 -0
  399. package/editors/intlDatetimeEditor/index.mjs +1 -0
  400. package/editors/intlDatetimeEditor/intlDatetimeEditor.d.mts +1 -0
  401. package/editors/intlDatetimeEditor/intlDatetimeEditor.d.ts +42 -0
  402. package/editors/intlDatetimeEditor/intlDatetimeEditor.js +108 -0
  403. package/editors/intlDatetimeEditor/intlDatetimeEditor.mjs +93 -0
  404. package/editors/multiSelectEditor/multiSelectEditor.js +11 -9
  405. package/editors/multiSelectEditor/multiSelectEditor.mjs +12 -10
  406. package/editors/selectEditor/selectEditor.js +2 -1
  407. package/editors/selectEditor/selectEditor.mjs +2 -1
  408. package/editors/textEditor/textEditor.js +1 -1
  409. package/editors/textEditor/textEditor.mjs +2 -2
  410. package/eventManager.d.ts +3 -3
  411. package/focusManager/grid.d.ts +28 -0
  412. package/focusManager/grid.js +85 -2
  413. package/focusManager/grid.mjs +81 -3
  414. package/focusManager/scopeManager.js +1 -1
  415. package/focusManager/scopeManager.mjs +2 -2
  416. package/handsontable-non-commercial-license.pdf +0 -0
  417. package/helpers/array.d.ts +25 -0
  418. package/helpers/array.js +41 -4
  419. package/helpers/array.mjs +56 -4
  420. package/helpers/console.d.ts +25 -3
  421. package/helpers/console.js +40 -7
  422. package/helpers/console.mjs +52 -7
  423. package/helpers/dateTime.d.ts +14 -0
  424. package/helpers/dateTime.js +74 -2
  425. package/helpers/dateTime.mjs +73 -2
  426. package/helpers/dom/cellCoords.js +156 -13
  427. package/helpers/dom/cellCoords.mjs +156 -13
  428. package/helpers/dom/element.d.ts +47 -8
  429. package/helpers/dom/element.js +104 -18
  430. package/helpers/dom/element.mjs +132 -23
  431. package/helpers/dom/event.d.ts +58 -0
  432. package/helpers/dom/event.js +39 -0
  433. package/helpers/dom/event.mjs +63 -0
  434. package/helpers/errors.d.ts +5 -0
  435. package/helpers/errors.js +10 -6
  436. package/helpers/errors.mjs +10 -6
  437. package/helpers/feature.d.ts +19 -0
  438. package/helpers/feature.js +21 -0
  439. package/helpers/feature.mjs +30 -0
  440. package/helpers/function.d.ts +1 -1
  441. package/helpers/function.js +4 -1
  442. package/helpers/function.mjs +4 -1
  443. package/helpers/mixed.d.ts +103 -0
  444. package/helpers/mixed.js +373 -4
  445. package/helpers/mixed.mjs +413 -4
  446. package/helpers/moves.js +2 -1
  447. package/helpers/moves.mjs +2 -1
  448. package/helpers/number.d.ts +22 -0
  449. package/helpers/number.js +49 -0
  450. package/helpers/number.mjs +66 -0
  451. package/helpers/string.d.ts +14 -10
  452. package/helpers/string.js +17 -9
  453. package/helpers/string.mjs +27 -17
  454. package/helpers/templateString.d.mts +1 -0
  455. package/helpers/templateString.d.ts +13 -0
  456. package/helpers/templateString.js +29 -0
  457. package/helpers/templateString.mjs +19 -0
  458. package/helpers/uiButton.d.mts +1 -0
  459. package/helpers/uiButton.d.ts +21 -0
  460. package/helpers/uiButton.js +37 -0
  461. package/helpers/uiButton.mjs +31 -0
  462. package/i18n/languages/fa-IR.d.ts +1 -0
  463. package/i18n/languages/fa-IR.js +1 -0
  464. package/i18n/languages/fa-IR.mjs +1 -0
  465. package/index.d.ts +3 -3
  466. package/languages/all.js +2 -1
  467. package/languages/fa-IR.js +2 -1
  468. package/languages/fa-IR.mjs +1 -0
  469. package/languages/index.js +2 -1
  470. package/package.json +61 -1
  471. package/plugins/autoColumnSize/autoColumnSize.d.ts +24 -1
  472. package/plugins/autoColumnSize/autoColumnSize.js +501 -82
  473. package/plugins/autoColumnSize/autoColumnSize.mjs +508 -83
  474. package/plugins/autoRowSize/autoRowSize.d.ts +40 -5
  475. package/plugins/autoRowSize/autoRowSize.js +68 -24
  476. package/plugins/autoRowSize/autoRowSize.mjs +98 -29
  477. package/plugins/autofill/autofill.js +30 -12
  478. package/plugins/autofill/autofill.mjs +30 -12
  479. package/plugins/base/base.d.ts +10 -0
  480. package/plugins/collapsibleColumns/collapsibleColumns.d.ts +4 -0
  481. package/plugins/collapsibleColumns/collapsibleColumns.js +89 -8
  482. package/plugins/collapsibleColumns/collapsibleColumns.mjs +93 -8
  483. package/plugins/columnSorting/columnSorting.d.ts +31 -2
  484. package/plugins/columnSorting/columnSorting.js +151 -24
  485. package/plugins/columnSorting/columnSorting.mjs +153 -26
  486. package/plugins/columnSorting/columnStatesManager.d.ts +1 -1
  487. package/plugins/columnSorting/columnStatesManager.js +1 -7
  488. package/plugins/columnSorting/columnStatesManager.mjs +1 -7
  489. package/plugins/columnSorting/domHelpers.d.ts +3 -0
  490. package/plugins/columnSorting/domHelpers.js +9 -0
  491. package/plugins/columnSorting/domHelpers.mjs +3 -3
  492. package/plugins/columnSorting/rootComparator.js +21 -16
  493. package/plugins/columnSorting/rootComparator.mjs +21 -16
  494. package/plugins/columnSorting/sortFunction/checkbox.js +7 -5
  495. package/plugins/columnSorting/sortFunction/checkbox.mjs +7 -5
  496. package/plugins/columnSorting/sortFunction/default.js +15 -4
  497. package/plugins/columnSorting/sortFunction/default.mjs +15 -4
  498. package/plugins/columnSorting/sortFunction/intlDatetime.d.mts +1 -0
  499. package/plugins/columnSorting/sortFunction/intlDatetime.d.ts +10 -0
  500. package/plugins/columnSorting/sortFunction/intlDatetime.js +23 -0
  501. package/plugins/columnSorting/sortFunction/intlDatetime.mjs +12 -0
  502. package/plugins/columnSorting/sortService/registry.js +2 -0
  503. package/plugins/columnSorting/sortService/registry.mjs +2 -0
  504. package/plugins/columnSorting/utils.d.ts +8 -0
  505. package/plugins/columnSorting/utils.js +37 -45
  506. package/plugins/columnSorting/utils.mjs +42 -47
  507. package/plugins/columnSummary/columnSummary.js +9 -5
  508. package/plugins/columnSummary/columnSummary.mjs +9 -5
  509. package/plugins/columnSummary/endpoints.d.ts +69 -2
  510. package/plugins/columnSummary/endpoints.js +181 -29
  511. package/plugins/columnSummary/endpoints.mjs +181 -29
  512. package/plugins/comments/commentEditor.js +1 -1
  513. package/plugins/comments/commentEditor.mjs +2 -2
  514. package/plugins/contextMenu/contextMenu.d.ts +12 -1
  515. package/plugins/contextMenu/contextMenu.js +30 -6
  516. package/plugins/contextMenu/contextMenu.mjs +30 -6
  517. package/plugins/contextMenu/index.d.ts +1 -1
  518. package/plugins/contextMenu/menu/menu.d.ts +22 -1
  519. package/plugins/contextMenu/menu/menu.js +211 -3
  520. package/plugins/contextMenu/menu/menu.mjs +212 -4
  521. package/plugins/contextMenu/menu/menuItemRenderer.js +2 -2
  522. package/plugins/contextMenu/menu/menuItemRenderer.mjs +2 -2
  523. package/plugins/contextMenu/predefinedItems/alignment.js +14 -14
  524. package/plugins/contextMenu/predefinedItems/alignment.mjs +14 -14
  525. package/plugins/contextMenu/predefinedItems/clearColumn.js +1 -1
  526. package/plugins/contextMenu/predefinedItems/clearColumn.mjs +1 -1
  527. package/plugins/contextMenu/predefinedItems/readOnly.js +3 -3
  528. package/plugins/contextMenu/predefinedItems/readOnly.mjs +3 -3
  529. package/plugins/contextMenu/utils.js +1 -1
  530. package/plugins/contextMenu/utils.mjs +1 -1
  531. package/plugins/copyPaste/copyPaste.js +70 -16
  532. package/plugins/copyPaste/copyPaste.mjs +71 -17
  533. package/plugins/copyPaste/copyableRanges.js +6 -2
  534. package/plugins/copyPaste/copyableRanges.mjs +6 -2
  535. package/plugins/copyPaste/pasteEvent.d.ts +1 -1
  536. package/plugins/customBorders/customBorders.d.ts +21 -40
  537. package/plugins/customBorders/customBorders.js +1080 -201
  538. package/plugins/customBorders/customBorders.mjs +1082 -203
  539. package/plugins/customBorders/utils.d.ts +71 -0
  540. package/plugins/customBorders/utils.js +63 -0
  541. package/plugins/customBorders/utils.mjs +101 -0
  542. package/plugins/dataProvider/dataProvider.d.ts +2 -1
  543. package/plugins/dataProvider/dataProvider.js +22 -7
  544. package/plugins/dataProvider/dataProvider.mjs +22 -7
  545. package/plugins/dataProvider/query/crud.js +1 -1
  546. package/plugins/dataProvider/query/crud.mjs +1 -1
  547. package/plugins/dialog/dialog.js +14 -9
  548. package/plugins/dialog/dialog.mjs +14 -9
  549. package/plugins/dialog/templates/confirm.d.ts +1 -1
  550. package/plugins/dialog/templates/confirm.js +2 -1
  551. package/plugins/dialog/templates/confirm.mjs +2 -1
  552. package/plugins/dialog/ui.d.ts +5 -3
  553. package/plugins/dialog/ui.js +12 -4
  554. package/plugins/dialog/ui.mjs +12 -4
  555. package/plugins/dragToScroll/dragToScroll.d.ts +2 -2
  556. package/plugins/dragToScroll/dragToScroll.js +150 -14
  557. package/plugins/dragToScroll/dragToScroll.mjs +151 -15
  558. package/plugins/dropdownMenu/dropdownMenu.d.ts +5 -1
  559. package/plugins/dropdownMenu/dropdownMenu.js +45 -3
  560. package/plugins/dropdownMenu/dropdownMenu.mjs +46 -4
  561. package/plugins/dropdownMenu/index.d.ts +1 -0
  562. package/plugins/emptyDataState/emptyDataState.js +4 -6
  563. package/plugins/emptyDataState/emptyDataState.mjs +4 -6
  564. package/plugins/emptyDataState/ui.js +2 -1
  565. package/plugins/emptyDataState/ui.mjs +2 -1
  566. package/plugins/exportFile/dataProvider.js +7 -9
  567. package/plugins/exportFile/dataProvider.mjs +7 -9
  568. package/plugins/exportFile/exportFile.d.ts +10 -3
  569. package/plugins/exportFile/types/_base.js +4 -10
  570. package/plugins/exportFile/types/_base.mjs +4 -10
  571. package/plugins/exportFile/types/xlsx/cell-style.js +4 -2
  572. package/plugins/exportFile/types/xlsx/cell-style.mjs +4 -2
  573. package/plugins/exportFile/types/xlsx/date-utils.d.ts +15 -0
  574. package/plugins/exportFile/types/xlsx/date-utils.js +31 -0
  575. package/plugins/exportFile/types/xlsx/date-utils.mjs +36 -0
  576. package/plugins/exportFile/types/xlsx.js +13 -9
  577. package/plugins/exportFile/types/xlsx.mjs +14 -10
  578. package/plugins/exportFile/utils.d.ts +9 -1
  579. package/plugins/exportFile/utils.js +27 -4
  580. package/plugins/exportFile/utils.mjs +40 -2
  581. package/plugins/filters/component/_base.d.ts +1 -2
  582. package/plugins/filters/component/_base.js +1 -2
  583. package/plugins/filters/component/_base.mjs +1 -2
  584. package/plugins/filters/component/condition.d.ts +1 -0
  585. package/plugins/filters/component/condition.js +2 -0
  586. package/plugins/filters/component/condition.mjs +2 -0
  587. package/plugins/filters/component/value.d.ts +5 -6
  588. package/plugins/filters/component/value.js +53 -34
  589. package/plugins/filters/component/value.mjs +54 -35
  590. package/plugins/filters/condition/date/after.js +2 -1
  591. package/plugins/filters/condition/date/after.mjs +2 -1
  592. package/plugins/filters/condition/date/afterOrEqual.js +2 -1
  593. package/plugins/filters/condition/date/afterOrEqual.mjs +2 -1
  594. package/plugins/filters/condition/date/before.js +2 -1
  595. package/plugins/filters/condition/date/before.mjs +2 -1
  596. package/plugins/filters/condition/date/beforeOrEqual.js +2 -1
  597. package/plugins/filters/condition/date/beforeOrEqual.mjs +2 -1
  598. package/plugins/filters/condition/equal.d.ts +7 -0
  599. package/plugins/filters/condition/equal.js +4 -0
  600. package/plugins/filters/condition/equal.mjs +10 -0
  601. package/plugins/filters/condition/intlDatetime/after.d.mts +1 -0
  602. package/plugins/filters/condition/intlDatetime/after.d.ts +18 -0
  603. package/plugins/filters/condition/intlDatetime/after.js +77 -0
  604. package/plugins/filters/condition/intlDatetime/after.mjs +22 -0
  605. package/plugins/filters/condition/intlDatetime/afterOrEqual.d.mts +1 -0
  606. package/plugins/filters/condition/intlDatetime/afterOrEqual.d.ts +18 -0
  607. package/plugins/filters/condition/intlDatetime/afterOrEqual.js +77 -0
  608. package/plugins/filters/condition/intlDatetime/afterOrEqual.mjs +22 -0
  609. package/plugins/filters/condition/intlDatetime/before.d.mts +1 -0
  610. package/plugins/filters/condition/intlDatetime/before.d.ts +18 -0
  611. package/plugins/filters/condition/intlDatetime/before.js +77 -0
  612. package/plugins/filters/condition/intlDatetime/before.mjs +22 -0
  613. package/plugins/filters/condition/intlDatetime/beforeOrEqual.d.mts +1 -0
  614. package/plugins/filters/condition/intlDatetime/beforeOrEqual.d.ts +18 -0
  615. package/plugins/filters/condition/intlDatetime/beforeOrEqual.js +77 -0
  616. package/plugins/filters/condition/intlDatetime/beforeOrEqual.mjs +22 -0
  617. package/plugins/filters/condition/intlDatetime/between.d.mts +1 -0
  618. package/plugins/filters/condition/intlDatetime/between.d.ts +18 -0
  619. package/plugins/filters/condition/intlDatetime/between.js +78 -0
  620. package/plugins/filters/condition/intlDatetime/between.mjs +23 -0
  621. package/plugins/filters/condition/intlDatetime/today.d.mts +1 -0
  622. package/plugins/filters/condition/intlDatetime/today.d.ts +17 -0
  623. package/plugins/filters/condition/intlDatetime/today.js +76 -0
  624. package/plugins/filters/condition/intlDatetime/today.mjs +20 -0
  625. package/plugins/filters/condition/intlDatetime/tomorrow.d.mts +1 -0
  626. package/plugins/filters/condition/intlDatetime/tomorrow.d.ts +17 -0
  627. package/plugins/filters/condition/intlDatetime/tomorrow.js +77 -0
  628. package/plugins/filters/condition/intlDatetime/tomorrow.mjs +21 -0
  629. package/plugins/filters/condition/intlDatetime/yesterday.d.mts +1 -0
  630. package/plugins/filters/condition/intlDatetime/yesterday.d.ts +17 -0
  631. package/plugins/filters/condition/intlDatetime/yesterday.js +77 -0
  632. package/plugins/filters/condition/intlDatetime/yesterday.mjs +21 -0
  633. package/plugins/filters/conditionCollection.js +4 -7
  634. package/plugins/filters/conditionCollection.mjs +4 -7
  635. package/plugins/filters/conditionUpdateObserver.d.ts +2 -2
  636. package/plugins/filters/conditionUpdateObserver.js +148 -49
  637. package/plugins/filters/conditionUpdateObserver.mjs +148 -49
  638. package/plugins/filters/constants.d.ts +1 -0
  639. package/plugins/filters/constants.js +31 -0
  640. package/plugins/filters/constants.mjs +28 -0
  641. package/plugins/filters/dataFilter.d.ts +4 -12
  642. package/plugins/filters/dataFilter.js +7 -19
  643. package/plugins/filters/dataFilter.mjs +8 -20
  644. package/plugins/filters/filters.d.ts +33 -9
  645. package/plugins/filters/filters.js +91 -31
  646. package/plugins/filters/filters.mjs +92 -32
  647. package/plugins/filters/sortComparators.d.ts +9 -2
  648. package/plugins/filters/sortComparators.js +34 -1
  649. package/plugins/filters/sortComparators.mjs +38 -3
  650. package/plugins/filters/ui/input.d.ts +4 -0
  651. package/plugins/filters/ui/input.js +18 -6
  652. package/plugins/filters/ui/input.mjs +18 -6
  653. package/plugins/filters/ui/multipleSelect.js +27 -4
  654. package/plugins/filters/ui/multipleSelect.mjs +27 -4
  655. package/plugins/filters/ui/select.js +1 -1
  656. package/plugins/filters/ui/select.mjs +1 -1
  657. package/plugins/formulas/engine/register.d.ts +5 -4
  658. package/plugins/formulas/engine/register.js +5 -2
  659. package/plugins/formulas/engine/register.mjs +9 -5
  660. package/plugins/formulas/engine/settings.d.ts +2 -6
  661. package/plugins/formulas/engine/settings.js +29 -4
  662. package/plugins/formulas/engine/settings.mjs +29 -4
  663. package/plugins/formulas/engine/types.d.ts +12 -2
  664. package/plugins/formulas/formulas.d.ts +39 -0
  665. package/plugins/formulas/formulas.js +789 -47
  666. package/plugins/formulas/formulas.mjs +793 -49
  667. package/plugins/formulas/hyperlinkUrl.d.mts +1 -0
  668. package/plugins/formulas/hyperlinkUrl.d.ts +12 -0
  669. package/plugins/formulas/hyperlinkUrl.js +32 -0
  670. package/plugins/formulas/hyperlinkUrl.mjs +32 -0
  671. package/plugins/formulas/indexSyncer/axisSyncer.d.ts +1 -0
  672. package/plugins/formulas/indexSyncer/axisSyncer.js +72 -15
  673. package/plugins/formulas/indexSyncer/axisSyncer.mjs +72 -15
  674. package/plugins/formulas/utils.d.ts +9 -0
  675. package/plugins/formulas/utils.js +21 -0
  676. package/plugins/formulas/utils.mjs +25 -0
  677. package/plugins/hiddenColumns/contextMenuItem/showColumn.js +6 -1
  678. package/plugins/hiddenColumns/contextMenuItem/showColumn.mjs +6 -1
  679. package/plugins/hiddenColumns/hiddenColumns.js +6 -3
  680. package/plugins/hiddenColumns/hiddenColumns.mjs +6 -3
  681. package/plugins/hiddenRows/contextMenuItem/showRow.js +6 -1
  682. package/plugins/hiddenRows/contextMenuItem/showRow.mjs +6 -1
  683. package/plugins/hiddenRows/hiddenRows.js +6 -3
  684. package/plugins/hiddenRows/hiddenRows.mjs +6 -3
  685. package/plugins/index.d.ts +5 -1
  686. package/plugins/index.js +10 -0
  687. package/plugins/index.mjs +5 -1
  688. package/plugins/loading/content.d.ts +5 -3
  689. package/plugins/loading/content.js +3 -2
  690. package/plugins/loading/content.mjs +8 -5
  691. package/plugins/loading/loading.d.ts +5 -2
  692. package/plugins/loading/loading.mjs +5 -2
  693. package/plugins/manualColumnMove/manualColumnMove.d.ts +10 -0
  694. package/plugins/manualColumnMove/manualColumnMove.js +122 -20
  695. package/plugins/manualColumnMove/manualColumnMove.mjs +123 -21
  696. package/plugins/manualColumnResize/manualColumnResize.d.ts +20 -7
  697. package/plugins/manualColumnResize/manualColumnResize.js +33 -13
  698. package/plugins/manualColumnResize/manualColumnResize.mjs +34 -14
  699. package/plugins/manualRowResize/manualRowResize.d.ts +21 -8
  700. package/plugins/manualRowResize/manualRowResize.js +34 -14
  701. package/plugins/manualRowResize/manualRowResize.mjs +35 -15
  702. package/plugins/mergeCells/cellCoords.d.ts +8 -0
  703. package/plugins/mergeCells/cellCoords.js +11 -0
  704. package/plugins/mergeCells/cellCoords.mjs +11 -0
  705. package/plugins/mergeCells/cellsCollection.d.ts +46 -2
  706. package/plugins/mergeCells/cellsCollection.js +189 -68
  707. package/plugins/mergeCells/cellsCollection.mjs +189 -68
  708. package/plugins/mergeCells/focusOrder.d.ts +26 -20
  709. package/plugins/mergeCells/focusOrder.js +358 -177
  710. package/plugins/mergeCells/focusOrder.mjs +363 -172
  711. package/plugins/mergeCells/mergeCells.d.ts +13 -8
  712. package/plugins/mergeCells/mergeCells.js +322 -64
  713. package/plugins/mergeCells/mergeCells.mjs +322 -64
  714. package/plugins/moveCells/helpers.d.mts +1 -0
  715. package/plugins/moveCells/helpers.d.ts +21 -0
  716. package/plugins/moveCells/helpers.js +20 -0
  717. package/plugins/moveCells/helpers.mjs +15 -0
  718. package/plugins/moveCells/index.d.mts +1 -0
  719. package/plugins/moveCells/index.d.ts +1 -0
  720. package/plugins/moveCells/index.js +22 -0
  721. package/plugins/moveCells/index.mjs +1 -0
  722. package/plugins/moveCells/moveCells.d.mts +1 -0
  723. package/plugins/moveCells/moveCells.d.ts +80 -0
  724. package/plugins/moveCells/moveCells.js +602 -0
  725. package/plugins/moveCells/moveCells.mjs +587 -0
  726. package/plugins/multiColumnSorting/multiColumnSorting.d.ts +8 -8
  727. package/plugins/multiColumnSorting/multiColumnSorting.js +11 -16
  728. package/plugins/multiColumnSorting/multiColumnSorting.mjs +11 -16
  729. package/plugins/multiColumnSorting/rootComparator.js +26 -19
  730. package/plugins/multiColumnSorting/rootComparator.mjs +26 -19
  731. package/plugins/multipleSelectionHandles/multipleSelectionHandles.d.ts +19 -4
  732. package/plugins/multipleSelectionHandles/multipleSelectionHandles.js +273 -58
  733. package/plugins/multipleSelectionHandles/multipleSelectionHandles.mjs +273 -58
  734. package/plugins/nestedHeaders/nestedHeaders.d.ts +10 -1
  735. package/plugins/nestedHeaders/nestedHeaders.js +222 -23
  736. package/plugins/nestedHeaders/nestedHeaders.mjs +222 -23
  737. package/plugins/nestedHeaders/stateManager/columnArrangement.d.mts +1 -0
  738. package/plugins/nestedHeaders/stateManager/columnArrangement.d.ts +37 -0
  739. package/plugins/nestedHeaders/stateManager/columnArrangement.js +35 -0
  740. package/plugins/nestedHeaders/stateManager/columnArrangement.mjs +30 -0
  741. package/plugins/nestedHeaders/stateManager/deriveSettings.d.mts +1 -0
  742. package/plugins/nestedHeaders/stateManager/deriveSettings.d.ts +57 -0
  743. package/plugins/nestedHeaders/stateManager/deriveSettings.js +115 -0
  744. package/plugins/nestedHeaders/stateManager/deriveSettings.mjs +135 -0
  745. package/plugins/nestedHeaders/stateManager/headersTree.d.ts +14 -1
  746. package/plugins/nestedHeaders/stateManager/index.d.ts +76 -13
  747. package/plugins/nestedHeaders/stateManager/index.js +381 -38
  748. package/plugins/nestedHeaders/stateManager/index.mjs +382 -39
  749. package/plugins/nestedHeaders/stateManager/matrixGenerator.js +3 -2
  750. package/plugins/nestedHeaders/stateManager/matrixGenerator.mjs +3 -2
  751. package/plugins/nestedHeaders/stateManager/settingsNormalizer.js +5 -1
  752. package/plugins/nestedHeaders/stateManager/settingsNormalizer.mjs +5 -1
  753. package/plugins/nestedHeaders/stateManager/sourceSettings.d.ts +23 -6
  754. package/plugins/nestedHeaders/stateManager/sourceSettings.js +20 -4
  755. package/plugins/nestedHeaders/stateManager/sourceSettings.mjs +20 -4
  756. package/plugins/nestedHeaders/stateManager/utils.d.ts +17 -1
  757. package/plugins/nestedHeaders/stateManager/utils.js +6 -1
  758. package/plugins/nestedHeaders/stateManager/utils.mjs +6 -1
  759. package/plugins/nestedHeaders/utils/ghostTable.js +21 -8
  760. package/plugins/nestedHeaders/utils/ghostTable.mjs +21 -8
  761. package/plugins/nestedRows/data/dataManager.d.ts +4 -1
  762. package/plugins/nestedRows/data/dataManager.js +10 -4
  763. package/plugins/nestedRows/data/dataManager.mjs +10 -4
  764. package/plugins/nestedRows/nestedRows.d.ts +127 -1
  765. package/plugins/nestedRows/nestedRows.js +330 -8
  766. package/plugins/nestedRows/nestedRows.mjs +330 -8
  767. package/plugins/nestedRows/ui/collapsing.d.ts +58 -0
  768. package/plugins/nestedRows/ui/collapsing.js +236 -40
  769. package/plugins/nestedRows/ui/collapsing.mjs +236 -40
  770. package/plugins/notification/notification.d.ts +2 -1
  771. package/plugins/notification/notification.js +6 -3
  772. package/plugins/notification/notification.mjs +6 -3
  773. package/plugins/notification/ui.d.ts +8 -5
  774. package/plugins/notification/ui.js +18 -6
  775. package/plugins/notification/ui.mjs +18 -6
  776. package/plugins/pagination/pagination.js +2 -2
  777. package/plugins/pagination/pagination.mjs +2 -2
  778. package/plugins/search/search.js +23 -2
  779. package/plugins/search/search.mjs +23 -2
  780. package/plugins/selectionHandles/helpers.d.mts +1 -0
  781. package/plugins/selectionHandles/helpers.d.ts +17 -0
  782. package/plugins/selectionHandles/helpers.js +16 -0
  783. package/plugins/selectionHandles/helpers.mjs +11 -0
  784. package/plugins/selectionHandles/index.d.mts +1 -0
  785. package/plugins/selectionHandles/index.d.ts +1 -0
  786. package/plugins/selectionHandles/index.js +22 -0
  787. package/plugins/selectionHandles/index.mjs +1 -0
  788. package/plugins/selectionHandles/selectionHandles.d.mts +1 -0
  789. package/plugins/selectionHandles/selectionHandles.d.ts +52 -0
  790. package/plugins/selectionHandles/selectionHandles.js +342 -0
  791. package/plugins/selectionHandles/selectionHandles.mjs +323 -0
  792. package/plugins/trimRows/trimRows.d.ts +1 -1
  793. package/plugins/trimRows/trimRows.js +6 -2
  794. package/plugins/trimRows/trimRows.mjs +6 -2
  795. package/plugins/types.d.ts +4 -0
  796. package/plugins/undoRedo/actions/cellAlignment.js +1 -1
  797. package/plugins/undoRedo/actions/cellAlignment.mjs +1 -1
  798. package/plugins/undoRedo/actions/createColumn.js +4 -1
  799. package/plugins/undoRedo/actions/createColumn.mjs +4 -1
  800. package/plugins/undoRedo/actions/createRow.js +4 -1
  801. package/plugins/undoRedo/actions/createRow.mjs +4 -1
  802. package/plugins/undoRedo/actions/fixedCounts.d.mts +1 -0
  803. package/plugins/undoRedo/actions/fixedCounts.d.ts +36 -0
  804. package/plugins/undoRedo/actions/fixedCounts.js +63 -0
  805. package/plugins/undoRedo/actions/fixedCounts.mjs +62 -0
  806. package/plugins/undoRedo/actions/index.js +2 -0
  807. package/plugins/undoRedo/actions/index.mjs +2 -0
  808. package/plugins/undoRedo/actions/moveCells.d.mts +1 -0
  809. package/plugins/undoRedo/actions/moveCells.d.ts +104 -0
  810. package/plugins/undoRedo/actions/moveCells.js +225 -0
  811. package/plugins/undoRedo/actions/moveCells.mjs +227 -0
  812. package/plugins/undoRedo/actions/removeColumn.d.ts +18 -2
  813. package/plugins/undoRedo/actions/removeColumn.js +11 -4
  814. package/plugins/undoRedo/actions/removeColumn.mjs +12 -5
  815. package/plugins/undoRedo/actions/removeRow.js +2 -57
  816. package/plugins/undoRedo/actions/removeRow.mjs +2 -57
  817. package/plugins/undoRedo/undoRedo.d.ts +26 -0
  818. package/plugins/undoRedo/undoRedo.js +36 -2
  819. package/plugins/undoRedo/undoRedo.mjs +36 -2
  820. package/plugins/undoRedo/utils.d.ts +29 -0
  821. package/plugins/undoRedo/utils.js +55 -3
  822. package/plugins/undoRedo/utils.mjs +59 -0
  823. package/renderSizeProbe.d.mts +1 -0
  824. package/renderSizeProbe.d.ts +60 -0
  825. package/renderSizeProbe.js +163 -0
  826. package/renderSizeProbe.mjs +176 -0
  827. package/renderers/checkboxRenderer/checkboxRenderer.js +9 -4
  828. package/renderers/checkboxRenderer/checkboxRenderer.mjs +9 -4
  829. package/renderers/index.d.ts +3 -2
  830. package/renderers/index.js +8 -0
  831. package/renderers/index.mjs +3 -1
  832. package/renderers/intlDatetimeRenderer/index.d.mts +1 -0
  833. package/renderers/intlDatetimeRenderer/index.d.ts +1 -0
  834. package/renderers/intlDatetimeRenderer/index.js +22 -0
  835. package/renderers/intlDatetimeRenderer/index.mjs +1 -0
  836. package/renderers/intlDatetimeRenderer/intlDatetimeRenderer.d.mts +1 -0
  837. package/renderers/intlDatetimeRenderer/intlDatetimeRenderer.d.ts +26 -0
  838. package/renderers/intlDatetimeRenderer/intlDatetimeRenderer.js +82 -0
  839. package/renderers/intlDatetimeRenderer/intlDatetimeRenderer.mjs +67 -0
  840. package/renderers/multiSelectRenderer/multiSelectRenderer.js +2 -3
  841. package/renderers/multiSelectRenderer/multiSelectRenderer.mjs +2 -3
  842. package/renderers/multiSelectRenderer/utils/utils.d.ts +1 -1
  843. package/renderers/multiSelectRenderer/utils/utils.js +11 -8
  844. package/renderers/multiSelectRenderer/utils/utils.mjs +11 -8
  845. package/renderers/passwordRenderer/passwordRenderer.js +6 -1
  846. package/renderers/passwordRenderer/passwordRenderer.mjs +6 -1
  847. package/renderers/renderCell.d.mts +1 -0
  848. package/renderers/renderCell.d.ts +37 -0
  849. package/renderers/renderCell.js +43 -0
  850. package/renderers/renderCell.mjs +48 -0
  851. package/selection/highlight/types/areaLayered.d.ts +3 -1
  852. package/selection/highlight/types/areaLayered.js +4 -2
  853. package/selection/highlight/types/areaLayered.mjs +6 -2
  854. package/selection/highlight/types/focus.d.ts +3 -1
  855. package/selection/highlight/types/focus.js +3 -2
  856. package/selection/highlight/types/focus.mjs +5 -2
  857. package/selection/mouseEventHandler.js +29 -26
  858. package/selection/mouseEventHandler.mjs +29 -26
  859. package/selection/moveCells.d.mts +1 -0
  860. package/selection/moveCells.d.ts +15 -0
  861. package/selection/moveCells.js +13 -0
  862. package/selection/moveCells.mjs +9 -0
  863. package/selection/selection.d.ts +56 -2
  864. package/selection/selection.js +149 -5
  865. package/selection/selection.mjs +149 -5
  866. package/selection/types.d.ts +3 -0
  867. package/settings.d.ts +24 -3
  868. package/shortcuts/context.d.ts +4 -0
  869. package/shortcuts/context.js +16 -8
  870. package/shortcuts/context.mjs +20 -8
  871. package/shortcuts/contexts/commands/populateSelectedCellsData.js +1 -1
  872. package/shortcuts/contexts/commands/populateSelectedCellsData.mjs +1 -1
  873. package/styles/handsontable.css +504 -158
  874. package/styles/handsontable.min.css +4 -4
  875. package/styles/handsontableStyles.d.mts +2 -0
  876. package/styles/handsontableStyles.d.ts +2 -0
  877. package/styles/handsontableStyles.js +1 -1
  878. package/styles/handsontableStyles.mjs +1 -1
  879. package/styles/ht-icons-horizon.css +1 -10
  880. package/styles/ht-icons-horizon.min.css +4 -4
  881. package/styles/ht-icons-main.css +1 -10
  882. package/styles/ht-icons-main.min.css +4 -4
  883. package/styles/ht-theme-classic-no-icons.css +6 -0
  884. package/styles/ht-theme-classic-no-icons.min.css +4 -4
  885. package/styles/ht-theme-classic.css +7 -10
  886. package/styles/ht-theme-classic.min.css +4 -4
  887. package/styles/ht-theme-horizon-no-icons.css +6 -0
  888. package/styles/ht-theme-horizon-no-icons.min.css +4 -4
  889. package/styles/ht-theme-horizon.css +7 -10
  890. package/styles/ht-theme-horizon.min.css +4 -4
  891. package/styles/ht-theme-main-no-icons.css +6 -0
  892. package/styles/ht-theme-main-no-icons.min.css +4 -4
  893. package/styles/ht-theme-main.css +7 -10
  894. package/styles/ht-theme-main.min.css +4 -4
  895. package/tableView.d.ts +17 -4
  896. package/tableView.js +208 -42
  897. package/tableView.mjs +209 -43
  898. package/themes/engine/index.d.ts +2 -1
  899. package/themes/engine/index.js +3 -0
  900. package/themes/engine/index.mjs +1 -1
  901. package/themes/engine/manager.d.ts +75 -3
  902. package/themes/engine/manager.js +242 -6
  903. package/themes/engine/manager.mjs +249 -6
  904. package/themes/engine/utils/cssVariables.d.ts +18 -1
  905. package/themes/engine/utils/cssVariables.js +27 -11
  906. package/themes/engine/utils/cssVariables.mjs +28 -11
  907. package/themes/engine/utils/validation.js +7 -0
  908. package/themes/engine/utils/validation.mjs +7 -0
  909. package/themes/static/variables/helpers/iconsMap.js +1 -6
  910. package/themes/static/variables/helpers/iconsMap.mjs +1 -6
  911. package/themes/static/variables/tokens/classic.js +6 -0
  912. package/themes/static/variables/tokens/classic.mjs +6 -0
  913. package/themes/static/variables/tokens/horizon.js +6 -0
  914. package/themes/static/variables/tokens/horizon.mjs +6 -0
  915. package/themes/static/variables/tokens/main.js +6 -0
  916. package/themes/static/variables/tokens/main.mjs +6 -0
  917. package/themes/types.d.ts +1 -1
  918. package/translations/indexMapper.d.ts +14 -9
  919. package/translations/indexMapper.js +104 -43
  920. package/translations/indexMapper.mjs +104 -43
  921. package/translations/mapCollections/aggregatedCollection.js +20 -35
  922. package/translations/mapCollections/aggregatedCollection.mjs +20 -35
  923. package/translations/mapCollections/mapCollection.d.ts +10 -4
  924. package/translations/mapCollections/mapCollection.js +2 -2
  925. package/translations/mapCollections/mapCollection.mjs +2 -2
  926. package/translations/maps/booleanMap.d.mts +1 -0
  927. package/translations/maps/booleanMap.d.ts +86 -0
  928. package/translations/maps/booleanMap.js +300 -0
  929. package/translations/maps/booleanMap.mjs +308 -0
  930. package/translations/maps/hidingMap.d.ts +5 -2
  931. package/translations/maps/hidingMap.js +8 -3
  932. package/translations/maps/hidingMap.mjs +8 -3
  933. package/translations/maps/index.d.ts +5 -2
  934. package/translations/maps/index.js +7 -3
  935. package/translations/maps/index.mjs +10 -2
  936. package/translations/maps/indexMap.d.ts +26 -2
  937. package/translations/maps/indexMap.js +78 -6
  938. package/translations/maps/indexMap.mjs +78 -6
  939. package/translations/maps/indexesSequence.d.ts +53 -2
  940. package/translations/maps/indexesSequence.js +225 -3
  941. package/translations/maps/indexesSequence.mjs +233 -3
  942. package/translations/maps/trimmingMap.d.ts +5 -2
  943. package/translations/maps/trimmingMap.js +8 -3
  944. package/translations/maps/trimmingMap.mjs +8 -3
  945. package/translations/maps/utils/actionsOnIndexes.js +20 -1
  946. package/translations/maps/utils/actionsOnIndexes.mjs +20 -1
  947. package/translations/maps/utils/indexesSequence.js +12 -3
  948. package/translations/maps/utils/indexesSequence.mjs +12 -3
  949. package/translations/maps/utils/physicallyIndexed.js +12 -1
  950. package/translations/maps/utils/physicallyIndexed.mjs +12 -1
  951. package/utils/entitlementLicenseKey/classify.d.mts +1 -0
  952. package/utils/entitlementLicenseKey/classify.d.ts +34 -0
  953. package/utils/entitlementLicenseKey/classify.js +97 -0
  954. package/utils/entitlementLicenseKey/classify.mjs +96 -0
  955. package/utils/entitlementLicenseKey/constants.d.mts +1 -0
  956. package/utils/entitlementLicenseKey/constants.d.ts +69 -0
  957. package/utils/entitlementLicenseKey/constants.js +54 -0
  958. package/utils/entitlementLicenseKey/constants.mjs +66 -0
  959. package/utils/entitlementLicenseKey/detectFormat.d.mts +1 -0
  960. package/utils/entitlementLicenseKey/detectFormat.d.ts +23 -0
  961. package/utils/entitlementLicenseKey/detectFormat.js +60 -0
  962. package/utils/entitlementLicenseKey/detectFormat.mjs +60 -0
  963. package/utils/entitlementLicenseKey/encoding.d.mts +1 -0
  964. package/utils/entitlementLicenseKey/encoding.d.ts +58 -0
  965. package/utils/entitlementLicenseKey/encoding.js +161 -0
  966. package/utils/entitlementLicenseKey/encoding.mjs +172 -0
  967. package/utils/entitlementLicenseKey/extractKeyData.d.mts +1 -0
  968. package/utils/entitlementLicenseKey/extractKeyData.d.ts +47 -0
  969. package/utils/entitlementLicenseKey/extractKeyData.js +213 -0
  970. package/utils/entitlementLicenseKey/extractKeyData.mjs +232 -0
  971. package/utils/entitlementLicenseKey/grants.d.mts +1 -0
  972. package/utils/entitlementLicenseKey/grants.d.ts +54 -0
  973. package/utils/entitlementLicenseKey/grants.js +68 -0
  974. package/utils/entitlementLicenseKey/grants.mjs +84 -0
  975. package/utils/entitlementLicenseKey/index.d.mts +1 -0
  976. package/utils/entitlementLicenseKey/index.d.ts +8 -0
  977. package/utils/entitlementLicenseKey/index.js +53 -0
  978. package/utils/entitlementLicenseKey/index.mjs +6 -0
  979. package/utils/entitlementLicenseKey/sha512.d.mts +1 -0
  980. package/utils/entitlementLicenseKey/sha512.d.ts +11 -0
  981. package/utils/entitlementLicenseKey/sha512.js +328 -0
  982. package/utils/entitlementLicenseKey/sha512.mjs +327 -0
  983. package/utils/entitlementLicenseKey/types.d.mts +1 -0
  984. package/utils/entitlementLicenseKey/types.d.ts +84 -0
  985. package/utils/entitlementLicenseKey/types.js +8 -0
  986. package/utils/entitlementLicenseKey/types.mjs +10 -0
  987. package/utils/ghostTable.d.ts +1 -0
  988. package/utils/ghostTable.js +60 -11
  989. package/utils/ghostTable.mjs +60 -11
  990. package/utils/licenseBranding/badge.d.mts +1 -0
  991. package/utils/licenseBranding/badge.d.ts +21 -0
  992. package/utils/licenseBranding/badge.js +237 -0
  993. package/utils/licenseBranding/badge.mjs +244 -0
  994. package/utils/licenseBranding/content.d.mts +1 -0
  995. package/utils/licenseBranding/content.d.ts +54 -0
  996. package/utils/licenseBranding/content.js +93 -0
  997. package/utils/licenseBranding/content.mjs +79 -0
  998. package/utils/licenseBranding/index.d.mts +1 -0
  999. package/utils/licenseBranding/index.d.ts +14 -0
  1000. package/utils/licenseBranding/index.js +55 -0
  1001. package/utils/licenseBranding/index.mjs +56 -0
  1002. package/utils/licenseBranding/lockScreen.d.mts +1 -0
  1003. package/utils/licenseBranding/lockScreen.d.ts +23 -0
  1004. package/utils/licenseBranding/lockScreen.js +150 -0
  1005. package/utils/licenseBranding/lockScreen.mjs +159 -0
  1006. package/utils/licenseNotification.d.ts +19 -0
  1007. package/utils/licenseNotification.js +56 -29
  1008. package/utils/licenseNotification.mjs +61 -29
  1009. package/utils/movableMeta.d.mts +1 -0
  1010. package/utils/movableMeta.d.ts +40 -0
  1011. package/utils/movableMeta.js +47 -0
  1012. package/utils/movableMeta.mjs +46 -0
  1013. package/utils/parseTable.js +16 -7
  1014. package/utils/parseTable.mjs +16 -7
  1015. package/utils/samplesGenerator.d.ts +41 -14
  1016. package/utils/samplesGenerator.js +114 -42
  1017. package/utils/samplesGenerator.mjs +114 -42
  1018. package/utils/sanitizer.d.mts +1 -0
  1019. package/utils/sanitizer.d.ts +47 -0
  1020. package/utils/sanitizer.js +43 -0
  1021. package/utils/sanitizer.mjs +55 -0
  1022. package/utils/stylesHandler.d.ts +13 -0
  1023. package/utils/stylesHandler.js +55 -2
  1024. package/utils/stylesHandler.mjs +55 -2
  1025. package/validators/autocompleteValidator/autocompleteValidator.js +3 -0
  1026. package/validators/autocompleteValidator/autocompleteValidator.mjs +3 -0
  1027. package/validators/index.d.ts +3 -2
  1028. package/validators/index.js +8 -0
  1029. package/validators/index.mjs +3 -1
  1030. package/validators/intlDatetimeValidator/index.d.mts +1 -0
  1031. package/validators/intlDatetimeValidator/index.d.ts +1 -0
  1032. package/validators/intlDatetimeValidator/index.js +25 -0
  1033. package/validators/intlDatetimeValidator/index.mjs +1 -0
  1034. package/validators/intlDatetimeValidator/intlDatetimeValidator.d.mts +1 -0
  1035. package/validators/intlDatetimeValidator/intlDatetimeValidator.d.ts +28 -0
  1036. package/validators/intlDatetimeValidator/intlDatetimeValidator.js +49 -0
  1037. package/validators/intlDatetimeValidator/intlDatetimeValidator.mjs +37 -0
  1038. package/3rdparty/walkontable/src/overlay/bottom.d.mts +0 -1
  1039. package/3rdparty/walkontable/src/overlay/bottomInlineStartCorner.d.mts +0 -1
  1040. package/3rdparty/walkontable/src/overlay/inlineStart.d.mts +0 -1
  1041. package/3rdparty/walkontable/src/overlay/top.d.mts +0 -1
  1042. package/3rdparty/walkontable/src/overlay/topInlineStartCorner.d.mts +0 -1
  1043. package/3rdparty/walkontable/src/overlays.d.ts +0 -329
  1044. package/3rdparty/walkontable/src/overlays.js +0 -870
  1045. package/3rdparty/walkontable/src/overlays.mjs +0 -860
  1046. package/3rdparty/walkontable/src/renderer/table.d.mts +0 -1
  1047. package/3rdparty/walkontable/src/renderer/table.js +0 -229
  1048. package/3rdparty/walkontable/src/settings.d.mts +0 -2
  1049. package/3rdparty/walkontable/src/settings.js +0 -196
  1050. package/3rdparty/walkontable/src/settings.mjs +0 -263
  1051. package/3rdparty/walkontable/src/table/bottom.d.mts +0 -2
  1052. package/3rdparty/walkontable/src/table/bottom.d.ts +0 -19
  1053. package/3rdparty/walkontable/src/table/bottom.js +0 -38
  1054. package/3rdparty/walkontable/src/table/bottom.mjs +0 -23
  1055. package/3rdparty/walkontable/src/table/bottomInlineStartCorner.d.mts +0 -2
  1056. package/3rdparty/walkontable/src/table/bottomInlineStartCorner.d.ts +0 -20
  1057. package/3rdparty/walkontable/src/table/bottomInlineStartCorner.mjs +0 -24
  1058. package/3rdparty/walkontable/src/table/inlineStart.d.mts +0 -2
  1059. package/3rdparty/walkontable/src/table/inlineStart.d.ts +0 -16
  1060. package/3rdparty/walkontable/src/table/inlineStart.js +0 -35
  1061. package/3rdparty/walkontable/src/table/inlineStart.mjs +0 -20
  1062. package/3rdparty/walkontable/src/table/master.d.mts +0 -2
  1063. package/3rdparty/walkontable/src/table/mixin/calculatedColumns.d.mts +0 -2
  1064. package/3rdparty/walkontable/src/table/mixin/calculatedColumns.d.ts +0 -75
  1065. package/3rdparty/walkontable/src/table/mixin/calculatedColumns.js +0 -122
  1066. package/3rdparty/walkontable/src/table/mixin/calculatedColumns.mjs +0 -112
  1067. package/3rdparty/walkontable/src/table/mixin/calculatedRows.d.mts +0 -2
  1068. package/3rdparty/walkontable/src/table/mixin/calculatedRows.d.ts +0 -75
  1069. package/3rdparty/walkontable/src/table/mixin/calculatedRows.js +0 -122
  1070. package/3rdparty/walkontable/src/table/mixin/calculatedRows.mjs +0 -112
  1071. package/3rdparty/walkontable/src/table/top.d.mts +0 -2
  1072. package/3rdparty/walkontable/src/table/top.d.ts +0 -19
  1073. package/3rdparty/walkontable/src/table/top.js +0 -38
  1074. package/3rdparty/walkontable/src/table/top.mjs +0 -23
  1075. package/3rdparty/walkontable/src/table/topInlineStartCorner.d.mts +0 -2
  1076. package/3rdparty/walkontable/src/table/topInlineStartCorner.d.ts +0 -20
  1077. package/3rdparty/walkontable/src/table/topInlineStartCorner.mjs +0 -24
  1078. package/3rdparty/walkontable/src/table.d.mts +0 -2
  1079. package/3rdparty/walkontable/src/table.d.ts +0 -741
  1080. package/3rdparty/walkontable/src/table.js +0 -1120
  1081. package/3rdparty/walkontable/src/table.mjs +0 -1105
  1082. package/3rdparty/walkontable/src/utils/cellCoords.d.mts +0 -1
  1083. package/3rdparty/walkontable/src/utils/cellCoords.js +0 -54
  1084. package/3rdparty/walkontable/src/utils/cellCoords.mjs +0 -54
  1085. package/3rdparty/walkontable/src/utils/column.d.mts +0 -2
  1086. package/3rdparty/walkontable/src/utils/column.js +0 -75
  1087. package/3rdparty/walkontable/src/utils/column.mjs +0 -70
  1088. package/3rdparty/walkontable/src/utils/positionCache.d.mts +0 -1
  1089. package/3rdparty/walkontable/src/utils/positionCache.d.ts +0 -91
  1090. package/3rdparty/walkontable/src/utils/positionCache.js +0 -193
  1091. package/3rdparty/walkontable/src/utils/positionCache.mjs +0 -194
  1092. package/3rdparty/walkontable/src/utils/row.d.mts +0 -2
  1093. package/3rdparty/walkontable/src/utils/row.js +0 -46
  1094. package/3rdparty/walkontable/src/utils/row.mjs +0 -41
  1095. package/3rdparty/walkontable/src/viewport.d.ts +0 -254
  1096. package/3rdparty/walkontable/src/viewport.js +0 -533
  1097. package/3rdparty/walkontable/src/viewport.mjs +0 -523
  1098. /package/3rdparty/walkontable/src/{renderer → axisSizing/positionCache}/index.d.mts +0 -0
  1099. /package/3rdparty/walkontable/src/{overlays.d.mts → overlay/overlays.d.mts} +0 -0
  1100. /package/3rdparty/walkontable/src/overlay/{_base.d.mts → regions/_base.d.mts} +0 -0
  1101. /package/3rdparty/walkontable/src/{stickyScrollStrategy.d.mts → overlay/strategies/stickyScrollStrategy.d.mts} +0 -0
  1102. /package/3rdparty/walkontable/src/{renderer → render}/_base.d.mts +0 -0
  1103. /package/3rdparty/walkontable/src/{renderer → render}/_base.js +0 -0
  1104. /package/3rdparty/walkontable/src/{renderer → render}/_base.mjs +0 -0
  1105. /package/3rdparty/walkontable/src/{renderer → render}/cells.d.mts +0 -0
  1106. /package/3rdparty/walkontable/src/{renderer → render}/cells.d.ts +0 -0
  1107. /package/3rdparty/walkontable/src/{renderer → render}/colGroup.d.mts +0 -0
  1108. /package/3rdparty/walkontable/src/{renderer → render}/colGroup.d.ts +0 -0
  1109. /package/3rdparty/walkontable/src/{renderer → render}/colGroup.js +0 -0
  1110. /package/3rdparty/walkontable/src/{renderer → render}/colGroup.mjs +0 -0
  1111. /package/3rdparty/walkontable/src/{renderer → render}/columnHeaderRows.d.mts +0 -0
  1112. /package/3rdparty/walkontable/src/{renderer → render}/columnHeaderRows.d.ts +0 -0
  1113. /package/3rdparty/walkontable/src/{renderer → render}/columnHeaderRows.js +0 -0
  1114. /package/3rdparty/walkontable/src/{renderer → render}/columnHeaderRows.mjs +0 -0
  1115. /package/3rdparty/walkontable/src/{renderer → render}/columnHeaders.d.mts +0 -0
  1116. /package/3rdparty/walkontable/src/{renderer → render}/rowHeaders.d.mts +0 -0
  1117. /package/3rdparty/walkontable/src/{renderer → render}/rowHeaders.d.ts +0 -0
  1118. /package/3rdparty/walkontable/src/{renderer → render}/rowHeaders.js +0 -0
  1119. /package/3rdparty/walkontable/src/{renderer → render}/rowHeaders.mjs +0 -0
  1120. /package/3rdparty/walkontable/src/{renderer → render}/rows.d.mts +0 -0
  1121. /package/3rdparty/walkontable/src/{renderer → render}/rows.d.ts +0 -0
  1122. /package/3rdparty/walkontable/src/{scroll.d.mts → scroll/scroll.d.mts} +0 -0
  1123. /package/3rdparty/walkontable/src/table/{mixin → rangeQuery}/stickyColumnsStart.d.mts +0 -0
  1124. /package/3rdparty/walkontable/src/table/{mixin → rangeQuery}/stickyRowsBottom.d.mts +0 -0
  1125. /package/3rdparty/walkontable/src/table/{mixin → rangeQuery}/stickyRowsBottom.js +0 -0
  1126. /package/3rdparty/walkontable/src/table/{mixin → rangeQuery}/stickyRowsBottom.mjs +0 -0
  1127. /package/3rdparty/walkontable/src/table/{mixin → rangeQuery}/stickyRowsTop.d.mts +0 -0
  1128. /package/3rdparty/walkontable/src/{viewport.d.mts → viewport/viewport.d.mts} +0 -0
package/core.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { addClass, empty, observeVisibilityChangeOnce, removeClass } from './helpers/dom/element.mjs';
1
+ import { addClass, empty, isShadowRoot, observeVisibilityChangeOnce, removeClass } from './helpers/dom/element.mjs';
2
2
  import { isFunction } from './helpers/function.mjs';
3
3
  import { isDefined, isUndefined, isRegExp, isEmpty } from './helpers/mixed.mjs';
4
4
  import { isMobileBrowser, isIpadOS } from './helpers/browser.mjs';
@@ -30,12 +30,13 @@ import { createShortcutManager } from './shortcuts/index.mjs';
30
30
  import { registerAllShortcutContexts } from './shortcuts/contexts/index.mjs';
31
31
  import { getThemeClassName } from './helpers/themes.mjs';
32
32
  import { StylesHandler } from './utils/stylesHandler.mjs';
33
- import { warn } from './helpers/console.mjs';
33
+ import { warn, removedWarnOnce } from './helpers/console.mjs';
34
34
  import { throwWithCause } from './helpers/errors.mjs';
35
35
  import { install as installAccessibilityAnnouncer, uninstall as uninstallAccessibilityAnnouncer } from './utils/a11yAnnouncer.mjs';
36
36
  import { initLicenseNotification } from './utils/licenseNotification.mjs';
37
+ import { initLicenseBranding } from './utils/licenseBranding/index.mjs';
37
38
  import { getValueSetterValue } from './utils/valueAccessors.mjs';
38
- import { createThemeManager } from './themes/engine/index.mjs';
39
+ import { createThemeManager, isThemeOverrideEmpty } from './themes/engine/index.mjs';
39
40
  import { LayoutManager } from './core/layout/index.mjs';
40
41
  import { getTheme, hasTheme, registerTheme, mainTheme } from './themes/index.mjs';
41
42
  import DataMap from './dataMap/dataMap.mjs';
@@ -88,10 +89,59 @@ let activeGuid = null;
88
89
  * @type {Map<string, Core>}
89
90
  */ const foreignHotInstances = new Map();
90
91
  /**
91
- * A set of deprecated feature names.
92
+ * Configuration options removed from the public API, with the version that removed them.
93
+ * Configuring one prints a one-time warning; the value is ignored.
92
94
  *
93
- * @type {Set<string>}
94
- */ const deprecationWarns = new Set();
95
+ * `persistentState` says 17.0.0, not 18.0.0: #12015 removed the plugin, its option, and its hooks
96
+ * in 17.0.0, and no published 17.x or 18.x package carries them. The 18.0.0 changelog entry for
97
+ * #12727 describes deleting a copy that the TypeScript conversion re-created on `develop` after
98
+ * 17.1.0 and that never shipped.
99
+ *
100
+ * `datePickerConfig` is deliberately absent: `DateEditor#prepare` already warns about it, and it
101
+ * also sees the per-cell forms that `warnAboutRemovedOptions` cannot.
102
+ *
103
+ * @type {ReadonlyArray<RemovedOption>}
104
+ */ const REMOVED_OPTIONS = [
105
+ {
106
+ name: 'persistentState',
107
+ version: '17.0.0',
108
+ migrationUrl: 'https://handsontable.com/docs/javascript-data-grid/changelog-17/'
109
+ },
110
+ {
111
+ name: 'correctFormat',
112
+ version: '18.0.0',
113
+ migrationUrl: 'https://handsontable.com/docs/javascript-data-grid/migration-from-17.1-to-18.0/'
114
+ }
115
+ ];
116
+ /**
117
+ * Warns once per removed option found anywhere in the passed settings.
118
+ *
119
+ * Scans the top level, every entry of an array-form `columns`, and every entry of the declarative
120
+ * `cell` array, because the removed options are not all global: `correctFormat` is a cell option,
121
+ * so `columns: [{ correctFormat: true }]` and `cell: [{ row, col, correctFormat: true }]` are its
122
+ * common forms, and a top-level-only check would leave those callers with a clean console and
123
+ * silently dropped date auto-correction.
124
+ *
125
+ * The remaining per-cell forms - a `cells` function, or meta set through `setCellMeta` - stay
126
+ * uncovered. Reaching them means inspecting resolved meta for every cell on every render, which
127
+ * costs more than the warning is worth.
128
+ *
129
+ * @param {object} settings Settings object passed to `updateSettings`.
130
+ */ function warnAboutRemovedOptions(settings) {
131
+ const columns = Array.isArray(settings.columns) ? settings.columns : [];
132
+ const cells = Array.isArray(settings.cell) ? settings.cell : [];
133
+ const scopes = [
134
+ settings,
135
+ ...columns,
136
+ ...cells
137
+ ];
138
+ REMOVED_OPTIONS.forEach(({ name, version, migrationUrl })=>{
139
+ const isUsed = scopes.some((scope)=>isObject(scope) && isDefined(scope[name]));
140
+ if (isUsed) {
141
+ removedWarnOnce(`Core.removedOption.${name}`, `The "${name}" setting was removed in Handsontable ${version} and is ignored. ` + `See ${migrationUrl} for the migration path.`);
142
+ }
143
+ });
144
+ }
95
145
  /**
96
146
  * Handsontable constructor.
97
147
  *
@@ -189,6 +239,12 @@ let activeGuid = null;
189
239
  let focusGridManager;
190
240
  let viewportScroller;
191
241
  let firstRun = true;
242
+ // Guards the "colorScheme/density need the theme engine" warning so it is logged once per
243
+ // instance instead of on every `updateSettings()` call that carries the options.
244
+ let themeOverridesWarningShown = false;
245
+ // Set only when the table is initialized while invisible (see the `init` method). Kept in the closure, not on
246
+ // the instance, because `destroy` nulls every instance property before it could be read there.
247
+ let visibilityObserver = null;
192
248
  const mergedUserSettings = {
193
249
  ...userSettings.initialState,
194
250
  ...userSettings
@@ -280,6 +336,9 @@ let activeGuid = null;
280
336
  'handsontable'
281
337
  ]);
282
338
  addClass(this.rootWrapperElement, 'ht-root-wrapper');
339
+ if (isShadowRoot(this.rootContainer.getRootNode())) {
340
+ addClass(this.rootWrapperElement, 'ht-shadow-dom');
341
+ }
283
342
  addClass(this.rootSlotTopElement, 'ht-slot-top');
284
343
  addClass(this.rootGridElement, 'ht-grid');
285
344
  addClass(this.rootGridContentElement, 'ht-grid-content');
@@ -478,6 +537,7 @@ let activeGuid = null;
478
537
  const editor = instance.getActiveEditor();
479
538
  return editor ? editor.isOpened() : false;
480
539
  },
540
+ isPluginEnabled: (pluginName)=>instance.getPlugin(pluginName)?.enabled === true,
481
541
  countRenderableColumns: ()=>instance.view.countRenderableColumns(),
482
542
  countRenderableRows: ()=>instance.view.countRenderableRows(),
483
543
  countRowHeaders: ()=>instance.countRowHeaders(),
@@ -625,8 +685,8 @@ let activeGuid = null;
625
685
  * format `[[index, amount], [index, amount]...]` this can be used to remove
626
686
  * non-consecutive columns or rows in one call.
627
687
  * @param {number} [amount=1] Amount of rows or columns to remove.
628
- * @param {string} [source] Optional. Source of hook runner.
629
- * @param {boolean} [keepEmptyRows] Optional. Flag for preventing deletion of empty rows.
688
+ * @param {string} [source] Optional. Source indicator passed to related hooks.
689
+ * @param {boolean} [keepEmptyRows] Optional. Flag for skipping the post-alter empty row and column adjustment.
630
690
  */ alter (action, index, amount = 1, source, keepEmptyRows) {
631
691
  const skipAlter = instance.runHooks('beforeAlter', action, index, amount, source, keepEmptyRows);
632
692
  if (skipAlter === false) {
@@ -684,6 +744,7 @@ let activeGuid = null;
684
744
  if (Number.isInteger(groupIndex)) {
685
745
  groupIndex = Math.max(groupIndex - offset, 0);
686
746
  }
747
+ const totalRowsBefore = instance.countRows();
687
748
  // TODO: for datamap.removeRow index should be passed as it is (with undefined and null values). If not, the logic
688
749
  // inside the datamap.removeRow breaks the removing functionality.
689
750
  const wasRemoved = datamap.removeRow(groupIndex, groupAmount, source);
@@ -702,8 +763,22 @@ let activeGuid = null;
702
763
  tableMeta.fixedRowsTop -= Math.min(groupAmount, fixedRowsTop - calcIndex);
703
764
  }
704
765
  const fixedRowsBottom = tableMeta.fixedRowsBottom;
705
- if (fixedRowsBottom && calcIndex >= totalRows - fixedRowsBottom) {
706
- tableMeta.fixedRowsBottom -= Math.min(groupAmount, fixedRowsBottom);
766
+ if (fixedRowsBottom) {
767
+ // Count how many of the removed rows belonged to the bottom fixed rows. Those rows occupied
768
+ // the `[totalRowsBefore - fixedRowsBottom, totalRowsBefore - 1]` range, so the boundary has
769
+ // to be compared with the row count from *before* the removal. Rows removed above that
770
+ // range keep the setting untouched (DEV-2551).
771
+ const removedRowsCount = totalRowsBefore - totalRows;
772
+ // With no index passed, `datamap.removeRow` takes the rows from the end, so the removal
773
+ // starts that many rows before the last one. `calcIndex` points at the last row then, not
774
+ // at the first removed one.
775
+ const firstRemovedRowIndex = Number.isInteger(groupIndex) ? calcIndex : Math.max(totalRowsBefore - removedRowsCount, 0);
776
+ const firstFixedRowIndex = totalRowsBefore - fixedRowsBottom;
777
+ const lastRemovedRowIndex = Math.min(firstRemovedRowIndex + removedRowsCount - 1, totalRowsBefore - 1);
778
+ const removedFixedRowsCount = lastRemovedRowIndex - Math.max(firstRemovedRowIndex, firstFixedRowIndex) + 1;
779
+ if (removedFixedRowsCount > 0) {
780
+ tableMeta.fixedRowsBottom -= Math.min(removedFixedRowsCount, fixedRowsBottom);
781
+ }
707
782
  }
708
783
  if (totalRows === 0) {
709
784
  selection.deselect();
@@ -766,7 +841,11 @@ let activeGuid = null;
766
841
  }
767
842
  const fixedColumnsStart = tableMeta.fixedColumnsStart;
768
843
  if (fixedColumnsStart >= calcIndex + 1) {
769
- tableMeta.fixedColumnsStart -= Math.min(groupAmount, fixedColumnsStart - calcIndex);
844
+ // Since 12.0.0, the "fixedColumnsLeft" is replaced with the "fixedColumnsStart" option.
845
+ // However, keeping the old name still in effect. When both option names are used together,
846
+ // the error is thrown. To prevent that, the engine needs to modify the original option key
847
+ // to bypass the validation.
848
+ tableMeta._fixedColumnsStart -= Math.min(groupAmount, fixedColumnsStart - calcIndex);
770
849
  }
771
850
  if (Array.isArray(tableMeta.colHeaders)) {
772
851
  if (typeof physicalColumnIndex === 'undefined') {
@@ -832,9 +911,22 @@ let activeGuid = null;
832
911
  }
833
912
  {
834
913
  let emptyCols = 0;
835
- // count currently empty cols
836
- if (minCols || minSpareCols) {
837
- emptyCols = instance.countEmptyCols(true);
914
+ const canCreateSpareCols = minSpareCols > 0 && !tableMeta.columns && instance.dataType === 'array';
915
+ // Count trailing empty columns, but only when the `minSpareCols` branch below can consume
916
+ // the result, and never beyond `minSpareCols` itself. Verifying that a column is empty
917
+ // scans every row of that column, and this method runs after every change batch - an
918
+ // uncapped count (the previous `countEmptyCols(true)` call) paid O(empty columns * rows)
919
+ // per edit and also ran when only `minCols` was set, where the result was never used.
920
+ if (canCreateSpareCols) {
921
+ for(let visualIndex = instance.countCols() - 1; visualIndex >= 0; visualIndex--){
922
+ if (!instance.isEmptyCol(visualIndex)) {
923
+ break;
924
+ }
925
+ emptyCols += 1;
926
+ if (emptyCols >= minSpareCols) {
927
+ break;
928
+ }
929
+ }
838
930
  }
839
931
  let nrOfColumns = instance.countCols();
840
932
  // should I add empty cols to meet minCols?
@@ -848,7 +940,7 @@ let activeGuid = null;
848
940
  });
849
941
  }
850
942
  // should I add empty cols to meet minSpareCols?
851
- if (minSpareCols && !tableMeta.columns && instance.dataType === 'array' && emptyCols < minSpareCols) {
943
+ if (canCreateSpareCols && emptyCols < minSpareCols) {
852
944
  nrOfColumns = instance.countCols();
853
945
  const emptyColsMissing = minSpareCols - emptyCols;
854
946
  const colsToCreate = Math.min(emptyColsMissing, tableMeta.maxCols - nrOfColumns);
@@ -986,7 +1078,11 @@ let activeGuid = null;
986
1078
  clen = Math.max(colInputLength, colSelectionLength);
987
1079
  }
988
1080
  current.col = start.col;
989
- cellMeta = instance.getCellMeta(current.row, current.col);
1081
+ // The transient read keeps a bulk paste/fill from permanently materializing one meta
1082
+ // object per target cell - this loop only reads (`skipRowOnPaste`, `skipColumnOnPaste`,
1083
+ // `readOnly`, `valueSetter`, `parsePastedValue`); the write itself goes through the
1084
+ // data layer.
1085
+ cellMeta = instance.getCellMetaTransient(current.row, current.col);
990
1086
  if ((source === 'CopyPaste.paste' || source === 'Autofill.fill' || source === 'autofill.fill') && cellMeta.skipRowOnPaste) {
991
1087
  skippedRow += 1;
992
1088
  current.row += 1;
@@ -1000,7 +1096,7 @@ let activeGuid = null;
1000
1096
  if (end && current.col > end.col && colSelectionLength > colInputLength || !tableMeta.allowInsertColumn && current.col > instance.countCols() - 1 || current.col >= tableMeta.maxCols) {
1001
1097
  break;
1002
1098
  }
1003
- cellMeta = instance.getCellMeta(current.row, current.col);
1099
+ cellMeta = instance.getCellMetaTransient(current.row, current.col);
1004
1100
  if ((source === 'CopyPaste.paste' || source === 'Autofill.fill' || source === 'autofill.fill') && cellMeta.skipColumnOnPaste) {
1005
1101
  skippedColumn += 1;
1006
1102
  current.col += 1;
@@ -1123,7 +1219,7 @@ let activeGuid = null;
1123
1219
  const themeName = tableMeta.themeName;
1124
1220
  const rootContainerThemeClassName = getThemeClassName(instance.rootContainer);
1125
1221
  if (isRootInstance(instance) && !rootContainerThemeClassName && (isObject(theme) || !theme && !themeName)) {
1126
- initializeThemeManager(theme);
1222
+ initializeThemeManager(theme, readStoredThemeOverrides());
1127
1223
  }
1128
1224
  dataSource.setData(tableMeta.data);
1129
1225
  instance.runHooks('beforeInit');
@@ -1138,6 +1234,7 @@ let activeGuid = null;
1138
1234
  if (isRootInstance(this)) {
1139
1235
  installAccessibilityAnnouncer(instance.rootPortalElement);
1140
1236
  initLicenseNotification(instance);
1237
+ initLicenseBranding(instance);
1141
1238
  // Keep the edge slots (top, bottom) as wide as the table so their content
1142
1239
  // (toolbars, pagination, license notification) aligns with the grid.
1143
1240
  const lastEdgeWidths = {
@@ -1173,7 +1270,12 @@ let activeGuid = null;
1173
1270
  this.render();
1174
1271
  // Run the logic only if it's the table's initialization and the root element is not visible.
1175
1272
  if (!!firstRun && instance.rootElement.offsetParent === null) {
1176
- observeVisibilityChangeOnce(instance.rootElement, ()=>{
1273
+ visibilityObserver = observeVisibilityChangeOnce(instance.rootElement, ()=>{
1274
+ // A delivery carries the state from the moment its snapshot was taken, so it can arrive after the
1275
+ // instance is gone even though `destroy` disconnects the observer.
1276
+ if (!instance || instance.isDestroyed || !instance.view) {
1277
+ return;
1278
+ }
1177
1279
  // Update the spreader size cache before rendering.
1178
1280
  instance.view._wt.wtOverlays.updateLastSpreaderSize();
1179
1281
  instance.view.adjustElementsSize();
@@ -1187,11 +1289,85 @@ let activeGuid = null;
1187
1289
  instance.runHooks('afterInit');
1188
1290
  };
1189
1291
  /**
1292
+ * Reads the per-instance color scheme and density overrides from a settings object.
1293
+ *
1294
+ * Only the keys actually present are returned, so a missing key keeps the value already applied
1295
+ * instead of resetting it to the theme default.
1296
+ *
1297
+ * @param {object} settings - The settings object to read the overrides from.
1298
+ * @returns {object} The theme overrides object.
1299
+ */ function readThemeOverrides(settings) {
1300
+ const overrides = {};
1301
+ if (hasOwnProperty(settings, 'colorScheme')) {
1302
+ overrides.colorScheme = settings.colorScheme;
1303
+ }
1304
+ if (hasOwnProperty(settings, 'density')) {
1305
+ overrides.density = settings.density;
1306
+ }
1307
+ return overrides;
1308
+ }
1309
+ /**
1310
+ * Reads the color scheme and density currently configured on this instance.
1311
+ *
1312
+ * Unlike `readThemeOverrides()`, this reads the effective values rather than only the keys that
1313
+ * one payload carries. `updateSettings()` stores grid options on the global meta, which the table
1314
+ * meta inherits through its prototype, so an own-property check would miss them. Use this when
1315
+ * rebuilding a ThemeManager, which has to pick up options set by an earlier call.
1316
+ *
1317
+ * @returns {object} The theme overrides object.
1318
+ */ function readStoredThemeOverrides() {
1319
+ return {
1320
+ colorScheme: tableMeta.colorScheme,
1321
+ density: tableMeta.density
1322
+ };
1323
+ }
1324
+ /**
1325
+ * Applies the `colorScheme` and `density` options to the ThemeManager of this instance.
1326
+ *
1327
+ * The options are per-instance overrides, so the shared theme object stays untouched and other
1328
+ * grids using the same theme keep their own look.
1329
+ *
1330
+ * @param {object} settings - The settings object that may carry the overrides.
1331
+ * @param {boolean} init - `true` when called during initialization. The initial styles are
1332
+ * injected by the ThemeManager constructor, so nothing has to be refreshed in that case.
1333
+ * @returns {boolean} `true` when the overrides changed and `afterSetTheme` still has to run.
1334
+ */ function applyThemeOverrides(settings, init) {
1335
+ const overrides = readThemeOverrides(settings);
1336
+ if (!hasOwnProperty(overrides, 'colorScheme') && !hasOwnProperty(overrides, 'density')) {
1337
+ return false;
1338
+ }
1339
+ if (!instance.themeManager) {
1340
+ // Only complain when a value is actually asked for. Clearing the options is documented, and a
1341
+ // framework wrapper re-sends every prop on each render, so warning on key presence alone
1342
+ // would fill the console for grids that never used these options.
1343
+ const isValueRequested = !isThemeOverrideEmpty(overrides.colorScheme) || !isThemeOverrideEmpty(overrides.density);
1344
+ if (isValueRequested && !themeOverridesWarningShown) {
1345
+ themeOverridesWarningShown = true;
1346
+ warn('The `colorScheme` and `density` options require the theme engine, so they have no ' + 'effect when the theme is enabled by a CSS class name. Pass a theme config object or a ' + '`ThemeBuilder` instance to the `theme` option, or remove the `ht-theme-*` class from ' + 'the container element to use the default theme.');
1347
+ }
1348
+ return false;
1349
+ }
1350
+ const hasChanged = instance.themeManager.setOverrides(overrides);
1351
+ if (!hasChanged || init) {
1352
+ return false;
1353
+ }
1354
+ // Clear the cache here so the render at the end of `updateSettings` measures the new sizes.
1355
+ // Rendering here as well would paint once with stale meta and then immediately paint again.
1356
+ instance.stylesHandler.clearCache();
1357
+ return true;
1358
+ }
1359
+ /**
1190
1360
  * Initializes the ThemeManager with the given theme configuration.
1191
1361
  *
1192
1362
  * @param {object|boolean} theme - The theme configuration object or `true` to use the default theme.
1193
- */ function initializeThemeManager(theme) {
1363
+ * @param {object} [overrides] - The per-instance color scheme and density overrides.
1364
+ */ function initializeThemeManager(theme, overrides) {
1194
1365
  let themeObject;
1366
+ // Tear the previous manager down first. Without this its `<style>` node stays in the wrapper,
1367
+ // and because a new manager prepends its own node the orphan ends up LATER in source order —
1368
+ // so at the same specificity the orphan's override rules win and the grid can never change or
1369
+ // reset a `colorScheme` or `density` that was set at construction time.
1370
+ instance.themeManager?.destroy();
1195
1371
  if (typeof theme === 'undefined') {
1196
1372
  if (hasTheme('main')) {
1197
1373
  themeObject = getTheme('main');
@@ -1206,7 +1382,8 @@ let activeGuid = null;
1206
1382
  }
1207
1383
  instance.themeManager = createThemeManager({
1208
1384
  hot: instance,
1209
- themeObject
1385
+ themeObject,
1386
+ overrides
1210
1387
  });
1211
1388
  }
1212
1389
  /**
@@ -1294,7 +1471,14 @@ let activeGuid = null;
1294
1471
  const visualCol = datamap.propToCol(prop);
1295
1472
  let cellProperties;
1296
1473
  if (Number.isInteger(visualCol)) {
1297
- cellProperties = instance.getCellMeta(row, visualCol);
1474
+ // The transient read keeps a bulk change set from permanently materializing one meta
1475
+ // object per changed cell while the validator is looked up. Cells that DO have a
1476
+ // validator switch to the eagerly stored meta object below - validation writes its
1477
+ // `valid` result on the meta, and that result must survive on the stored object.
1478
+ cellProperties = instance.getCellMetaTransient(row, visualCol);
1479
+ if (instance.getCellValidator(cellProperties)) {
1480
+ cellProperties = instance.getCellMeta(row, visualCol);
1481
+ }
1298
1482
  } else {
1299
1483
  // If there's no requested visual column, we can use the table meta as the cell properties when retrieving
1300
1484
  // the cell validator.
@@ -1329,7 +1513,7 @@ let activeGuid = null;
1329
1513
  *
1330
1514
  * @private
1331
1515
  * @param {Array} changes Array in form of [row, prop, oldValue, newValue].
1332
- * @param {string} source String that identifies how this change will be described in changes array (useful in onChange callback).
1516
+ * @param {string} source String that identifies how this change will be described in changes array (useful in {@link Hooks#afterChange} or {@link Hooks#beforeChange} callbacks).
1333
1517
  * @fires Hooks#beforeChangeRender
1334
1518
  * @fires Hooks#afterChange
1335
1519
  */ function applyChanges(changes, source) {
@@ -1343,8 +1527,13 @@ let activeGuid = null;
1343
1527
  continue;
1344
1528
  }
1345
1529
  if (tableMeta.allowInsertRow) {
1530
+ // Create the whole missing range in one call - one index-mapper insert and one hook
1531
+ // round instead of one per row. Creating row by row made a paste reaching far below
1532
+ // the last row quadratic in the gap size. The loop re-checks the count so a partial
1533
+ // creation (e.g. a `maxRows` clamp) is detected and the change is skipped.
1346
1534
  while(changes[i][0] > instance.countRows() - 1){
1347
- const { delta: numberOfCreatedRows } = datamap.createRow(undefined, undefined, {
1535
+ const missingRows = changes[i][0] - (instance.countRows() - 1);
1536
+ const { delta: numberOfCreatedRows } = datamap.createRow(undefined, missingRows, {
1348
1537
  source: 'auto'
1349
1538
  });
1350
1539
  if (numberOfCreatedRows === 0) {
@@ -1355,7 +1544,8 @@ let activeGuid = null;
1355
1544
  }
1356
1545
  if (instance.dataType === 'array' && (!tableMeta.columns || tableMeta.columns.length === 0) && tableMeta.allowInsertColumn) {
1357
1546
  while(Number(datamap.propToCol(changes[i][1])) > instance.countCols() - 1){
1358
- const { delta: numberOfCreatedColumns } = datamap.createCol(undefined, undefined, {
1547
+ const missingColumns = Number(datamap.propToCol(changes[i][1])) - (instance.countCols() - 1);
1548
+ const { delta: numberOfCreatedColumns } = datamap.createCol(undefined, missingColumns, {
1359
1549
  source: 'auto'
1360
1550
  });
1361
1551
  if (numberOfCreatedColumns === 0) {
@@ -1525,7 +1715,10 @@ let activeGuid = null;
1525
1715
  const visualColumn = datamap.propToCol(prop);
1526
1716
  let cellProperties;
1527
1717
  if (Number.isInteger(visualColumn)) {
1528
- cellProperties = instance.getCellMeta(row, visualColumn);
1718
+ // The transient read keeps a bulk change set (paste, fill, checkbox toggle over a large
1719
+ // selection) from permanently materializing one meta object per changed cell - the meta
1720
+ // is only read here (`valueSetter`).
1721
+ cellProperties = instance.getCellMetaTransient(row, visualColumn);
1529
1722
  } else {
1530
1723
  // If there's no requested visual column, we can use the table meta as the cell properties
1531
1724
  cellProperties = {
@@ -1547,7 +1740,9 @@ let activeGuid = null;
1547
1740
  * @param {number|Array} row Visual row index or array of changes in format `[[row, col, value],...]`.
1548
1741
  * @param {number} [column] Visual column index.
1549
1742
  * @param {string} [value] New value.
1550
- * @param {string} [source] String that identifies how this change will be described in the changes array (useful in afterChange or beforeChange callback). Set to 'edit' if left empty.
1743
+ * @param {string} [source] String that identifies how this change will be described in the changes array (useful in {@link Hooks#afterChange} or {@link Hooks#beforeChange} callbacks). Set to 'edit' if left empty.
1744
+ * @fires Hooks#beforeChange
1745
+ * @fires Hooks#afterChange
1551
1746
  */ this.setDataAtCell = function(row, column, value, source) {
1552
1747
  const input = setDataInputToArray(row, column, value);
1553
1748
  const changes = [];
@@ -1597,7 +1792,9 @@ let activeGuid = null;
1597
1792
  * @param {number|Array} row Visual row index or array of changes in format `[[row, prop, value], ...]`.
1598
1793
  * @param {string} prop Property name or the source string (e.g. `'first.name'` or `'0'`).
1599
1794
  * @param {string} value Value to be set.
1600
- * @param {string} [source] String that identifies how this change will be described in changes array (useful in onChange callback).
1795
+ * @param {string} [source] String that identifies how this change will be described in changes array (useful in {@link Hooks#afterChange} or {@link Hooks#beforeChange} callbacks).
1796
+ * @fires Hooks#beforeChange
1797
+ * @fires Hooks#afterChange
1601
1798
  */ this.setDataAtRowProp = function(row, prop, value, source) {
1602
1799
  const input = setDataInputToArray(row, prop, value);
1603
1800
  const changes = [];
@@ -1669,7 +1866,7 @@ let activeGuid = null;
1669
1866
  * @memberof Core#
1670
1867
  * @function destroyEditor
1671
1868
  * @param {boolean} [revertOriginal=false] If `true`, the previous value will be restored. Otherwise, the edited value will be saved.
1672
- * @param {boolean} [prepareEditorIfNeeded=true] If `true` the editor under the selected cell will be prepared to open.
1869
+ * @param {boolean} [prepareEditorIfNeeded=true] If `true`, the editor under the selected cell will be prepared to open.
1673
1870
  */ this.destroyEditor = function(revertOriginal = false, prepareEditorIfNeeded = true) {
1674
1871
  editorManager.closeEditor(revertOriginal);
1675
1872
  instance.view.render();
@@ -1843,8 +2040,10 @@ let activeGuid = null;
1843
2040
  *
1844
2041
  * @memberof Core#
1845
2042
  * @function emptySelectedCells
1846
- * @param {string} [source] String that identifies how this change will be described in the changes array (useful in afterChange or beforeChange callback). Set to 'edit' if left empty.
2043
+ * @param {string} [source] String that identifies how this change will be described in the changes array (useful in {@link Hooks#afterChange} or {@link Hooks#beforeChange} callbacks). Set to 'edit' if left empty.
1847
2044
  * @since 0.36.0
2045
+ * @fires Hooks#beforeChange
2046
+ * @fires Hooks#afterChange
1848
2047
  */ this.emptySelectedCells = function(source) {
1849
2048
  if (!selection.isSelected() || this.countRows() === 0 || this.countCols() === 0) {
1850
2049
  return;
@@ -1865,7 +2064,9 @@ let activeGuid = null;
1865
2064
  }
1866
2065
  const collectEmptyCellChanges = (row)=>{
1867
2066
  rangeEach(fromColumn, toColumn, (column)=>{
1868
- if (!this.getCellMeta(row, column).readOnly) {
2067
+ // The transient read keeps clearing a large selection from permanently materializing
2068
+ // one meta object per cell - only `readOnly` is read here.
2069
+ if (!this.getCellMetaTransient(row, column).readOnly) {
1869
2070
  changes.push([
1870
2071
  row,
1871
2072
  column,
@@ -1967,7 +2168,8 @@ let activeGuid = null;
1967
2168
  * to the DOM. While rendering the table all cell renderers are recalled.
1968
2169
  *
1969
2170
  * Calling this method manually is not recommended. Handsontable tries to render itself by choosing the most
1970
- * optimal moments in its lifecycle.
2171
+ * optimal moments in its lifecycle. After [setCellMeta()](@/api/core.md#setcellmeta) changes visual cell
2172
+ * properties, call this method to apply them, or wrap multiple calls in [batch()](@/api/core.md#batch).
1971
2173
  *
1972
2174
  * @memberof Core#
1973
2175
  * @function render
@@ -2208,8 +2410,8 @@ let activeGuid = null;
2208
2410
  * @memberof Core#
2209
2411
  * @function updateData
2210
2412
  * @since 11.1.0
2211
- * @param {Array} data An [array of arrays](@/guides/getting-started/binding-to-data/binding-to-data.md#array-of-arrays), or an [array of objects](@/guides/getting-started/binding-to-data/binding-to-data.md#array-of-objects), that contains Handsontable's data
2212
- * @param {string} [source] The source of the `updateData()` call
2413
+ * @param {Array} data An [array of arrays](@/guides/getting-started/binding-to-data/binding-to-data.md#array-of-arrays), or an [array of objects](@/guides/getting-started/binding-to-data/binding-to-data.md#array-of-objects), that contains Handsontable's data.
2414
+ * @param {string} [source] The source of the `updateData()` call.
2213
2415
  * @fires Hooks#beforeUpdateData
2214
2416
  * @fires Hooks#afterUpdateData
2215
2417
  * @fires Hooks#afterChange
@@ -2250,8 +2452,8 @@ let activeGuid = null;
2250
2452
  *
2251
2453
  * @memberof Core#
2252
2454
  * @function loadData
2253
- * @param {Array} data An [array of arrays](@/guides/getting-started/binding-to-data/binding-to-data.md#array-of-arrays), or an [array of objects](@/guides/getting-started/binding-to-data/binding-to-data.md#array-of-objects), that contains Handsontable's data
2254
- * @param {string} [source] The source of the `loadData()` call
2455
+ * @param {Array} data An [array of arrays](@/guides/getting-started/binding-to-data/binding-to-data.md#array-of-arrays), or an [array of objects](@/guides/getting-started/binding-to-data/binding-to-data.md#array-of-objects), that contains Handsontable's data.
2456
+ * @param {string} [source] The source of the `loadData()` call.
2255
2457
  * @fires Hooks#beforeLoadData
2256
2458
  * @fires Hooks#afterLoadData
2257
2459
  * @fires Hooks#afterChange
@@ -2325,11 +2527,17 @@ let activeGuid = null;
2325
2527
  this.rowIndexMapper.initToLength(this.countSourceRows());
2326
2528
  };
2327
2529
  /**
2328
- * Returns the current data object (the same one that was passed by `data` configuration option or `loadData` method,
2329
- * unless some modifications have been applied (i.e. Sequence of rows/columns was changed, some row/column was skipped).
2330
- * If that's the case - use the {@link Core#getSourceData} method.).
2530
+ * Returns the current visual data as a 2D array.
2531
+ *
2532
+ * Unlike the source data (which may be an array of objects), `getData()` always
2533
+ * returns an array of arrays regardless of the original data format. The returned
2534
+ * data reflects the current visual state of the grid: rows and columns are in their
2535
+ * current visual order, after any sorting, filtering, or reordering.
2331
2536
  *
2332
- * Optionally you can provide cell range by defining `row`, `column`, `row2`, `column2` to get only a fragment of table data.
2537
+ * To retrieve the data in its original source format, use the {@link Core#getSourceData} method instead.
2538
+ *
2539
+ * Optionally you can provide a cell range by defining `row`, `column`, `row2`, `column2`
2540
+ * to get only a fragment of the data.
2333
2541
  *
2334
2542
  * @memberof Core#
2335
2543
  * @function getData
@@ -2337,7 +2545,7 @@ let activeGuid = null;
2337
2545
  * @param {number} [column] From visual column index.
2338
2546
  * @param {number} [row2] To visual row index.
2339
2547
  * @param {number} [column2] To visual column index.
2340
- * @returns {Array[]} Array with the data.
2548
+ * @returns {Array[]} A 2D array of cell values in the current visual order.
2341
2549
  * @example
2342
2550
  * ```js
2343
2551
  * // Get all data (in order how it is rendered in the table).
@@ -2407,11 +2615,19 @@ let activeGuid = null;
2407
2615
  * __Note__, that although the `updateSettings` method doesn't overwrite the previously declared settings, it might reset
2408
2616
  * the settings made post-initialization. (for example - ignore changes made using the columnResize feature).
2409
2617
  *
2410
- * Since 8.0.0 passing `columns` or `data` inside `settings` objects will result in resetting states corresponding to rows and columns
2411
- * (for example, row/column sequence, column width, row height, frozen columns etc.).
2618
+ * Passing `columns` inside the `settings` object resets the states corresponding to rows and columns
2619
+ * (for example, row/column sequence, column width, row height, frozen columns etc.). Passing `data` does not reset these states.
2620
+ *
2621
+ * After initialization, passing `data` calls [`updateData()`](@/api/core.md#updatedata) internally.
2622
+ * The resulting [`beforeUpdateData`](@/api/hooks.md#beforeupdatedata) and
2623
+ * [`afterUpdateData`](@/api/hooks.md#afterupdatedata) hooks receive `"updateSettings"` as their
2624
+ * `source`, while [`afterChange`](@/api/hooks.md#afterchange) receives `null` as its `changes`
2625
+ * argument and `"updateData"` as its `source`. If you call `updateSettings` with `data` inside
2626
+ * `afterChange`, check the hook's `source` to prevent an infinite loop.
2412
2627
  *
2413
- * Since 12.0.0 passing `data` inside `settings` objects no longer results in resetting states corresponding to rows and columns
2414
- * (for example, row/column sequence, column width, row height, frozen columns etc.).
2628
+ * Cell meta set imperatively through [[setCellMeta]] (for example, by the user or the context menu) is preserved across
2629
+ * `updateSettings`, even when `settings` includes `cell`, `cells`, or `columns`. On a direct conflict, a value re-stated
2630
+ * through the declarative `cell` option takes precedence over the preserved imperative value.
2415
2631
  *
2416
2632
  * Cell meta set imperatively through [[setCellMeta]] (for example, by the user or the context menu) is preserved across
2417
2633
  * `updateSettings`, even when `settings` includes `cell`, `cells`, or `columns`. On a direct conflict, a value re-stated
@@ -2448,6 +2664,10 @@ let activeGuid = null;
2448
2664
  if (isDefined(settings.ganttChart)) {
2449
2665
  throwWithCause('Since 8.0.0 the "ganttChart" setting is no longer supported.');
2450
2666
  }
2667
+ warnAboutRemovedOptions(settings);
2668
+ // The `columns` option (or the state its function form reads) may change in this call - drop
2669
+ // getColHeader's index translation cache so it rebuilds against the updated settings.
2670
+ columnsSettingIndexes = null;
2451
2671
  if (isDefined(settings.rowHeights) && isDefined(settings.minRowHeights)) {
2452
2672
  warn('Both `rowHeights` and `minRowHeights` are defined in your configuration. ' + 'As one is the alias of the other, only one of them can be used at a time. ' + '`rowHeights` will be used as the row height configuration.');
2453
2673
  }
@@ -2498,20 +2718,26 @@ let activeGuid = null;
2498
2718
  const currentThemeName = instance.getCurrentThemeName();
2499
2719
  // Use `theme` option if it's a string and differs from current theme (takes priority over `themeName`).
2500
2720
  if (themeOptionExists && typeof settings.theme === 'string' && currentThemeName !== settings.theme) {
2501
- instance.themeManager?.unmount();
2502
- instance.themeManager = null;
2721
+ // `destroy()`, not `unmount()`. Unmounting removes the style node but leaves the manager
2722
+ // subscribed to the shared theme object, so the next theme change re-injects its scoped
2723
+ // rules and the grid gets stuck on whatever override the dead manager still holds.
2724
+ instance.themeManager?.destroy();
2503
2725
  instance.useTheme(settings.theme);
2504
2726
  // Use `themeName` option if `theme` is not provided and the name differs from current theme.
2505
2727
  } else if (themeNameOptionExists && !themeOptionExists && currentThemeName !== settings.themeName) {
2506
- instance.themeManager?.unmount();
2507
- instance.themeManager = null;
2728
+ // `destroy()`, not `unmount()`. Unmounting removes the style node but leaves the manager
2729
+ // subscribed to the shared theme object, so the next theme change re-injects its scoped
2730
+ // rules and the grid gets stuck on whatever override the dead manager still holds.
2731
+ instance.themeManager?.destroy();
2508
2732
  tableMeta.theme = settings.themeName;
2509
2733
  tableMeta.themeName = undefined;
2510
2734
  instance.useTheme(settings.themeName);
2511
2735
  // Initialize or update the themeManager when theme is an object.
2512
2736
  } else if (isRootInstance(instance) && !rootContainerThemeClassName && isObject(settings.theme)) {
2513
2737
  if (instance.themeManager === null) {
2514
- initializeThemeManager(settings.theme);
2738
+ // Read the overrides from `tableMeta`, not from this payload. The options may have been
2739
+ // set by an earlier call, and the manager being rebuilt here starts with none of them.
2740
+ initializeThemeManager(settings.theme, readStoredThemeOverrides());
2515
2741
  instance.useTheme(instance.themeManager.getClassName());
2516
2742
  } else {
2517
2743
  let themeObject;
@@ -2525,6 +2751,7 @@ let activeGuid = null;
2525
2751
  }
2526
2752
  }
2527
2753
  }
2754
+ const themeOverridesChanged = applyThemeOverrides(settings, init);
2528
2755
  // Load data or create data map
2529
2756
  if (instance.runHooks('hasExternalDataSource') === true) {
2530
2757
  // When dataProvider is a complete server-backed config, ignore static data, the plugin loads rows.
@@ -2642,11 +2869,23 @@ let activeGuid = null;
2642
2869
  // width blocks ran) so partial updateSettings calls see the correct state.
2643
2870
  // When height IS set, the height block's `overflow: clip` shorthand handles both axes — leave
2644
2871
  // overflowX untouched to avoid breaking that shorthand.
2872
+ // Only clip for a definite width. A relative width (`100%`, other percentages, viewport units,
2873
+ // or a `calc()` that mixes them in) fills its container, and content wider than that scrolls
2874
+ // with the window — matching the long-standing behavior where the page gains a horizontal
2875
+ // scrollbar and every column stays reachable. Clipping those would silently hide the off-width
2876
+ // columns with no scrollbar. A definite width (`px`, `em`, `rem`, and other absolute lengths)
2877
+ // establishes a fixed box the table must not visually overflow, so it is clipped.
2645
2878
  // Browser compatibility: `overflow-x: clip` requires Safari 16+. On Safari 14.1–15.x it silently
2646
2879
  // falls back to `visible` (graceful degradation — pre-existing behavior, not a new regression).
2647
2880
  if (typeof settings.height !== 'undefined' || typeof settings.width !== 'undefined') {
2648
2881
  const effectiveHeight = instance.rootElement.style.height;
2649
2882
  const effectiveWidth = instance.rootElement.style.width;
2883
+ // Relative: percentages and viewport units resolve against an ancestor, so a `%` or a viewport
2884
+ // unit (`vw`/`vh`/`vmin`/`vmax`, and dynamic `dvh`/`svh`/`lvh` via the `vh` match) anywhere —
2885
+ // including inside `calc()` — marks the width as container-driven. No word boundaries: the unit
2886
+ // is preceded by digits (`100vw`), which are word characters, so `\bv` would never match.
2887
+ const isRelativeWidth = /%|v(?:w|h|min|max)/i.test(effectiveWidth);
2888
+ const isDefiniteWidth = effectiveWidth !== '' && effectiveWidth !== 'auto' && !isRelativeWidth;
2650
2889
  if (!effectiveHeight) {
2651
2890
  const currentOverflowX = instance.rootElement.style.overflowX;
2652
2891
  // Only manage the overflow-x we own (`clip`) or that is unset. Preserve a user-defined
@@ -2654,7 +2893,7 @@ let activeGuid = null;
2654
2893
  // by `clip`. Unlike `hidden`, `clip` creates no block formatting context and allows no
2655
2894
  // programmatic scroll.
2656
2895
  if (currentOverflowX === '' || currentOverflowX === 'clip') {
2657
- instance.rootElement.style.overflowX = effectiveWidth && effectiveWidth !== 'auto' ? 'clip' : '';
2896
+ instance.rootElement.style.overflowX = isDefiniteWidth ? 'clip' : '';
2658
2897
  }
2659
2898
  }
2660
2899
  }
@@ -2672,6 +2911,12 @@ let activeGuid = null;
2672
2911
  instance.render();
2673
2912
  instance.view._wt.wtOverlays.adjustElementsSize();
2674
2913
  }
2914
+ // Fired after the render above, so a listener reading cell sizes sees the new density. The
2915
+ // manager can be gone by now: an `afterUpdateSettings` listener is free to move the grid to a
2916
+ // class-name theme, which tears the engine down.
2917
+ if (themeOverridesChanged && instance.themeManager) {
2918
+ instance.runHooks('afterSetTheme', instance.themeManager.getClassName(), false);
2919
+ }
2675
2920
  if (!init && instance.view && (currentHeight === '' || height === '' || height === undefined) && currentHeight !== height) {
2676
2921
  instance.view._wt.wtOverlays.updateMainScrollableElements();
2677
2922
  }
@@ -2703,11 +2948,36 @@ let activeGuid = null;
2703
2948
  return null;
2704
2949
  };
2705
2950
  /**
2706
- * Returns the object settings.
2951
+ * Returns the current global grid settings object.
2952
+ *
2953
+ * The returned object contains the settings passed to the constructor or the most recent
2954
+ * `updateSettings()` call. It reflects the
2955
+ * [grid-level](@/guides/getting-started/configuration-options/configuration-options.md#set-grid-options)
2956
+ * configuration only.
2957
+ *
2958
+ * It does not include merged per-cell or per-column values. Configuration options cascade from
2959
+ * grid to column to cell (see
2960
+ * [Cascading configuration](@/guides/getting-started/configuration-options/configuration-options.md#cascading-configuration)).
2961
+ * To read the effective value for a specific cell, use [[getCellMeta]]. To read column-level meta, use [[getColumnMeta]].
2707
2962
  *
2708
2963
  * @memberof Core#
2709
2964
  * @function getSettings
2710
- * @returns {TableMeta} Object containing the current table settings.
2965
+ * @returns {TableMeta} Object containing the current global grid settings.
2966
+ * @example
2967
+ * ```js
2968
+ * const hot = new Handsontable(container, {
2969
+ * readOnly: false,
2970
+ * columns: (index) => ({
2971
+ * readOnly: index === 2 || index === 8,
2972
+ * }),
2973
+ * });
2974
+ *
2975
+ * // returns `false` (global grid-level setting)
2976
+ * hot.getSettings().readOnly;
2977
+ *
2978
+ * // returns `true` for column 2 (merged column and cell meta)
2979
+ * hot.getCellMeta(0, 2).readOnly;
2980
+ * ```
2711
2981
  */ this.getSettings = function() {
2712
2982
  return tableMeta;
2713
2983
  };
@@ -2762,8 +3032,10 @@ let activeGuid = null;
2762
3032
  * @param {number|number[]} [index] A visual index of the row/column before or after which the new row/column will be
2763
3033
  * inserted or removed. Can also be an array of arrays, in format `[[index, amount],...]`.
2764
3034
  * @param {number} [amount] The amount of rows or columns to be inserted or removed (default: `1`).
2765
- * @param {string} [source] Source indicator.
2766
- * @param {boolean} [keepEmptyRows] If set to `true`: prevents removing empty rows.
3035
+ * @param {string} [source] Source indicator passed to related hooks.
3036
+ * @param {boolean} [keepEmptyRows] If set to `true`, skips the automatic adjustment that normally adds empty rows
3037
+ * or columns after the operation to satisfy `minRows`, `minSpareRows`,
3038
+ * `minCols`, or `minSpareCols`.
2767
3039
  * @example
2768
3040
  * ```js
2769
3041
  * // above row 10 (by visual index), insert 1 new row
@@ -2783,9 +3055,23 @@ let activeGuid = null;
2783
3055
  * // remove 2 rows, starting from row 10 (by visual index)
2784
3056
  * hot.alter('remove_row', 10, 2);
2785
3057
  *
3058
+ * // remove 2 columns, starting from column 3 (by visual index)
3059
+ * hot.alter('remove_col', 3, 2);
3060
+ *
2786
3061
  * // remove 3 rows, starting from row 1 (by visual index)
2787
3062
  * // remove 2 rows, starting from row 5 (by visual index)
2788
3063
  * hot.alter('remove_row', [[1, 3], [5, 2]]);
3064
+ *
3065
+ * // pass a custom source string to hooks
3066
+ * hot.addHook('afterCreateRow', (index, amount, source) => {
3067
+ * if (source === 'inventory-import') {
3068
+ * // Run logic only for rows created by the inventory import.
3069
+ * }
3070
+ * });
3071
+ * hot.alter('insert_row_above', 0, 1, 'inventory-import');
3072
+ *
3073
+ * // remove a row without immediately adding empty rows required by `minRows` or `minSpareRows`
3074
+ * hot.alter('remove_row', 4, 1, 'inventory-cleanup', true);
2789
3075
  * ```
2790
3076
  */ this.alter = function(action, index, amount, source, keepEmptyRows) {
2791
3077
  grid.alter(action, index, amount, source, keepEmptyRows);
@@ -3061,9 +3347,14 @@ let activeGuid = null;
3061
3347
  const visualRow = instance.toVisualRow(changeRow);
3062
3348
  const visualColumn = instance.toVisualColumn(changeProp);
3063
3349
  if (Number.isInteger(visualColumn)) {
3064
- return instance.getCellMeta(visualRow, visualColumn);
3350
+ // The transient read keeps a bulk source-data write from permanently materializing one
3351
+ // meta object per changed cell - the meta only feeds the `valueSetter` and the
3352
+ // source-data validator, both read-only.
3353
+ return instance.getCellMetaTransient(visualRow, visualColumn);
3065
3354
  }
3066
- // If there's no requested visual column, we can use the table meta as the cell properties
3355
+ // If there's no requested visual column, we can use the table meta as the cell properties.
3356
+ // The snapshot lacks the per-cell coordinate properties, but every consumer here reads
3357
+ // settings-level keys only.
3067
3358
  return {
3068
3359
  ...Object.getPrototypeOf(tableMeta),
3069
3360
  ...tableMeta
@@ -3176,7 +3467,7 @@ let activeGuid = null;
3176
3467
  rangeEach(Math.max(Math.min(rowStart, rowEnd), 0), Math.max(rowStart, rowEnd), (row)=>{
3177
3468
  let isTypeEqual = true;
3178
3469
  rangeEach(Math.max(Math.min(columnStart, columnEnd), 0), Math.max(columnStart, columnEnd), (column)=>{
3179
- const cellType = instance.getCellMeta(row, column);
3470
+ const cellType = instance.getCellMetaTransient(row, column);
3180
3471
  currentType = cellType.type ?? null;
3181
3472
  if (previousType) {
3182
3473
  isTypeEqual = previousType === currentType;
@@ -3255,8 +3546,52 @@ let activeGuid = null;
3255
3546
  }
3256
3547
  };
3257
3548
  /**
3549
+ * Writes a configuration-derived cell meta value declaratively. The value is applied to the cell meta
3550
+ * (so it is retained while the cell is released from the viewport by the meta eviction), but is NOT
3551
+ * recorded as user-defined, so an `updateSettings` cache reset clears it and it is re-applied from the
3552
+ * current configuration - exactly like the `cell` option. Used by built-in plugins that derive cell
3553
+ * meta from their own configuration (for example ColumnSummary) and re-apply it on each update.
3554
+ *
3555
+ * Unlike the public `setCellMeta`, this does NOT fire `beforeSetCellMeta`/`afterSetCellMeta` and is
3556
+ * not vetoable: the write is plugin-internal render state the user never requested, so it must not
3557
+ * surface through public hooks or be blocked by a `beforeSetCellMeta` veto. This matches the direct
3558
+ * meta-object write these plugins used before the viewport meta eviction was introduced.
3559
+ *
3560
+ * Internal API: deliberately NOT declared on the public `HotInstance` type (`core/types.ts`), so it
3561
+ * is not exposed to third-party code or the published `.d.ts`. Built-in consumers reach it through a
3562
+ * local internal type (see `HotInstanceInternal` in the ColumnSummary plugin). Do not add it to
3563
+ * `HotInstance` - that would turn an implementation detail into a supported public API.
3564
+ *
3565
+ * @private
3566
+ * @memberof Core#
3567
+ * @function _setCellMetaDeclarative
3568
+ * @param {number} row Visual row index.
3569
+ * @param {number} column Visual column index.
3570
+ * @param {string} key The property name to set.
3571
+ * @param {*} value The value to write.
3572
+ */ this._setCellMetaDeclarative = function(row, column, key, value) {
3573
+ let physicalRow = row;
3574
+ let physicalColumn = column;
3575
+ if (row < instance.countRows()) {
3576
+ physicalRow = instance.toPhysicalRow(row);
3577
+ }
3578
+ if (column < instance.countCols()) {
3579
+ physicalColumn = instance.toPhysicalColumn(column);
3580
+ }
3581
+ metaManager.disableUserDefinedMetaRecording();
3582
+ try {
3583
+ metaManager.setCellMeta(physicalRow, physicalColumn, key, value);
3584
+ } finally{
3585
+ metaManager.enableUserDefinedMetaRecording();
3586
+ }
3587
+ };
3588
+ /**
3258
3589
  * Sets a property defined by the `key` property to the meta object of a cell corresponding to params `row` and `column`.
3259
3590
  *
3591
+ * This method updates internal cell metadata only. It does not repaint the grid. To reflect visual changes (such as
3592
+ * `className`, `type`, or `readOnly`), call [render()](@/api/core.md#render) afterward, or wrap multiple calls in
3593
+ * [batch()](@/api/core.md#batch).
3594
+ *
3260
3595
  * @memberof Core#
3261
3596
  * @function setCellMeta
3262
3597
  * @param {number} row Visual row index.
@@ -3293,6 +3628,11 @@ let activeGuid = null;
3293
3628
  /**
3294
3629
  * Returns the cell properties object for the given `row` and `column` coordinates.
3295
3630
  *
3631
+ * The returned object reflects the effective cell configuration after
3632
+ * [cascading configuration](@/guides/getting-started/configuration-options/configuration-options.md#cascading-configuration)
3633
+ * (grid, column, and cell levels). To read global grid settings only, use [[getSettings]].
3634
+ * To read column-level meta, use [[getColumnMeta]].
3635
+ *
3296
3636
  * @memberof Core#
3297
3637
  * @function getCellMeta
3298
3638
  * @param {number} row Visual row index.
@@ -3320,8 +3660,52 @@ let activeGuid = null;
3320
3660
  });
3321
3661
  };
3322
3662
  /**
3663
+ * Returns the cell properties object for the given `row` and `column` coordinates without
3664
+ * retaining it in the cell meta cache.
3665
+ *
3666
+ * Like [[getCellMeta]], the returned object reflects the effective cell configuration after
3667
+ * [cascading configuration](@/guides/getting-started/configuration-options/configuration-options.md#cascading-configuration)
3668
+ * and dynamic extension (the `cells` function and the `beforeGetCellMeta`/`afterGetCellMeta`
3669
+ * hooks run). Unlike `getCellMeta`, when the cell has no stored meta object the extension runs
3670
+ * on a temporary object that is not saved, so scanning many cells (for example, a whole column
3671
+ * or the entire dataset) does not permanently allocate one meta object per visited cell. Cells
3672
+ * that already carry stored meta (for example, written by [[setCellMeta]] or the `cell` option)
3673
+ * return their stored object, exactly as `getCellMeta` would.
3674
+ *
3675
+ * Use this method for read-only bulk scans. Do not write to the returned object - for cells
3676
+ * without stored meta the write lands on the temporary object and is lost; use `setCellMeta`
3677
+ * to persist values.
3678
+ *
3679
+ * @memberof Core#
3680
+ * @function getCellMetaTransient
3681
+ * @since 18.1.0
3682
+ * @param {number} row Visual row index.
3683
+ * @param {number} column Visual column index.
3684
+ * @returns {object} The cell properties object.
3685
+ * @fires Hooks#beforeGetCellMeta
3686
+ * @fires Hooks#afterGetCellMeta
3687
+ */ this.getCellMetaTransient = function(row, column) {
3688
+ let physicalRow = instance.toPhysicalRow(row);
3689
+ let physicalColumn = instance.toPhysicalColumn(column);
3690
+ if (physicalRow === null) {
3691
+ physicalRow = row;
3692
+ }
3693
+ if (physicalColumn === null) {
3694
+ physicalColumn = column;
3695
+ }
3696
+ return metaManager.getCellMetaTransient(physicalRow, physicalColumn, {
3697
+ visualRow: row,
3698
+ visualColumn: column
3699
+ });
3700
+ };
3701
+ /**
3323
3702
  * Returns the meta information for the provided column.
3324
3703
  *
3704
+ * The returned object reflects the column-level configuration after
3705
+ * [cascading configuration](@/guides/getting-started/configuration-options/configuration-options.md#cascading-configuration)
3706
+ * (grid and column levels). To read global grid settings only, use [[getSettings]].
3707
+ * To read the effective configuration for a specific cell, use [[getCellMeta]].
3708
+ *
3325
3709
  * @since 14.5.0
3326
3710
  * @memberof Core#
3327
3711
  * @function getColumnMeta
@@ -3526,12 +3910,27 @@ let activeGuid = null;
3526
3910
  continue;
3527
3911
  }
3528
3912
  waitingForValidator.addValidatorToQueue();
3529
- instance.validateCell(instance.getDataAtCell(i, j), instance.getCellMeta(i, j), (result)=>{
3913
+ // The transient read keeps a bulk validation from permanently materializing one meta
3914
+ // object per validated cell (O(rows x columns) retention). Cells with stored meta -
3915
+ // including every currently rendered cell - still receive their `valid` result on the
3916
+ // stored object, because the transient read returns the stored object for them.
3917
+ const row = i;
3918
+ const column = j;
3919
+ const cellMeta = instance.getCellMetaTransient(row, column);
3920
+ instance.validateCell(instance.getDataAtCell(row, column), cellMeta, (result)=>{
3530
3921
  if (typeof result !== 'boolean') {
3531
3922
  throwWithCause('Validation error: result is not boolean');
3532
3923
  }
3533
3924
  if (result === false) {
3534
3925
  waitingForValidator.valid = false;
3926
+ // A failed result written on a throwaway object would be lost - persist it on the
3927
+ // stored meta (a DIRECT write, exactly like the edit-path validation flow; NOT
3928
+ // `setCellMeta`, which would mark the property as user-persisted and change
3929
+ // updateSettings/eviction semantics). Only failures materialize, so retention stays
3930
+ // O(invalid cells); the eviction pass already keeps `valid === false` cells.
3931
+ instance.getCellMeta(row, column, {
3932
+ skipMetaExtension: true
3933
+ }).valid = false;
3535
3934
  }
3536
3935
  waitingForValidator.removeValidatorFormQueue();
3537
3936
  }, 'validateCells');
@@ -3597,6 +3996,13 @@ let activeGuid = null;
3597
3996
  return false;
3598
3997
  };
3599
3998
  /**
3999
+ * Caches the index translation that `getColHeader` derives from the `columns` option when that
4000
+ * option is a function: the source column indexes for which `columns(index)` returns a truthy
4001
+ * settings object. Only the membership array is cached — titles are still read live from the
4002
+ * `columns` function. Rebuilt when the function reference or the column count changes; cleared
4003
+ * by `updateSettings`.
4004
+ */ let columnsSettingIndexes = null;
4005
+ /**
3600
4006
  * Gets the values of column headers (if column headers are [enabled](@/api/options.md#colheaders)).
3601
4007
  *
3602
4008
  * To get an array with the values of all
@@ -3646,23 +4052,30 @@ let activeGuid = null;
3646
4052
  }
3647
4053
  let result = tableMeta.colHeaders;
3648
4054
  const columns = tableMeta.columns;
3649
- const translateVisualIndexToColumns = function(visualColumnIndex) {
3650
- const arr = [];
4055
+ const columnsFn = typeof columns === 'function' ? columns : null;
4056
+ const physicalColumn = instance.toPhysicalColumn(columnIndex);
4057
+ let columnSettings = null;
4058
+ if (columnsFn !== null) {
3651
4059
  const columnsLen = instance.countCols();
3652
- let index = 0;
3653
- for(; index < columnsLen; index++){
3654
- if (isFunction(columns) && columns(index)) {
3655
- arr.push(index);
4060
+ if (columnsSettingIndexes === null || columnsSettingIndexes.columns !== columnsFn || columnsSettingIndexes.columnsLen !== columnsLen) {
4061
+ const indexes = [];
4062
+ for(let index = 0; index < columnsLen; index++){
4063
+ if (columnsFn(index)) {
4064
+ indexes.push(index);
4065
+ }
3656
4066
  }
4067
+ columnsSettingIndexes = {
4068
+ columns: columnsFn,
4069
+ columnsLen,
4070
+ indexes
4071
+ };
3657
4072
  }
3658
- return arr[visualColumnIndex];
3659
- };
3660
- const physicalColumn = instance.toPhysicalColumn(columnIndex);
3661
- const prop = translateVisualIndexToColumns(physicalColumn);
4073
+ columnSettings = columnsFn(columnsSettingIndexes.indexes[physicalColumn]) ?? null;
4074
+ }
3662
4075
  if (tableMeta.colHeaders === false) {
3663
4076
  result = null;
3664
- } else if (columns && isFunction(columns) && columns(prop) && columns(prop).title) {
3665
- result = columns(prop).title;
4077
+ } else if (columnSettings && columnSettings.title) {
4078
+ result = columnSettings.title;
3666
4079
  } else if (columns && !isFunction(columns) && columns[physicalColumn] && columns[physicalColumn].title) {
3667
4080
  result = columns[physicalColumn].title;
3668
4081
  } else if (Array.isArray(tableMeta.colHeaders) && tableMeta.colHeaders[physicalColumn] !== undefined) {
@@ -3835,7 +4248,7 @@ let activeGuid = null;
3835
4248
  * @returns {number} Returns -1 if table is not visible.
3836
4249
  */ this.countRenderedRows = function() {
3837
4250
  const view = instance.view;
3838
- return view._wt.drawn ? view._wt.wtTable.getRenderedRowsCount() : -1;
4251
+ return view?._wt.drawn ? view._wt.wtTable.getRenderedRowsCount() : -1;
3839
4252
  };
3840
4253
  /**
3841
4254
  * Returns the number of rendered rows that are only visible in the table viewport.
@@ -3846,7 +4259,7 @@ let activeGuid = null;
3846
4259
  * @returns {number} Number of visible rows or -1.
3847
4260
  */ this.countVisibleRows = function() {
3848
4261
  const view = instance.view;
3849
- return view._wt.drawn ? view._wt.wtTable.getVisibleRowsCount() : -1;
4262
+ return view?._wt.drawn ? view._wt.wtTable.getVisibleRowsCount() : -1;
3850
4263
  };
3851
4264
  /**
3852
4265
  * Returns the number of rendered rows including columns that are partially or fully rendered
@@ -3857,7 +4270,7 @@ let activeGuid = null;
3857
4270
  * @returns {number} Returns -1 if table is not visible.
3858
4271
  */ this.countRenderedCols = function() {
3859
4272
  const view = instance.view;
3860
- return view._wt.drawn ? view._wt.wtTable.getRenderedColumnsCount() : -1;
4273
+ return view?._wt.drawn ? view._wt.wtTable.getRenderedColumnsCount() : -1;
3861
4274
  };
3862
4275
  /**
3863
4276
  * Returns the number of rendered columns that are only visible in the table viewport.
@@ -3868,7 +4281,7 @@ let activeGuid = null;
3868
4281
  * @returns {number} Number of visible columns or -1.
3869
4282
  */ this.countVisibleCols = function() {
3870
4283
  const view = instance.view;
3871
- return view._wt.drawn ? view._wt.wtTable.getVisibleColumnsCount() : -1;
4284
+ return view?._wt.drawn ? view._wt.wtTable.getVisibleColumnsCount() : -1;
3872
4285
  };
3873
4286
  /**
3874
4287
  * Returns the number of rendered row headers.
@@ -3878,7 +4291,8 @@ let activeGuid = null;
3878
4291
  * @function countRowHeaders
3879
4292
  * @returns {number} Number of row headers.
3880
4293
  */ this.countRowHeaders = function() {
3881
- return instance.view.getRowHeadersCount();
4294
+ const view = instance.view;
4295
+ return view ? view.getRowHeadersCount() : 0;
3882
4296
  };
3883
4297
  /**
3884
4298
  * Returns the number of rendered column headers.
@@ -3888,7 +4302,8 @@ let activeGuid = null;
3888
4302
  * @function countColHeaders
3889
4303
  * @returns {number} Number of column headers.
3890
4304
  */ this.countColHeaders = function() {
3891
- return instance.view.getColumnHeadersCount();
4305
+ const view = instance.view;
4306
+ return view ? view.getColumnHeadersCount() : 0;
3892
4307
  };
3893
4308
  /**
3894
4309
  * Returns the number of empty rows. If the optional ending parameter is `true`, returns the
@@ -3988,8 +4403,8 @@ let activeGuid = null;
3988
4403
  * @param {number|string} column A visual column index (`number`), or a column property's value (`string`).
3989
4404
  * @param {number} [endRow] If selecting a range: the visual row index of the last cell in the range.
3990
4405
  * @param {number|string} [endColumn] If selecting a range: the visual column index (or a column property's value) of the last cell in the range.
3991
- * @param {boolean} [scrollToCell=true] `true`: scroll the viewport to the newly-selected cells. `false`: keep the previous viewport.
3992
- * @param {boolean} [changeListener=true] `true`: switch the keyboard focus to Handsontable. `false`: keep the
4406
+ * @param {boolean} [scrollToCell=true] If `true`, scrolls the viewport to the newly-selected cells. If `false`, keeps the previous viewport.
4407
+ * @param {boolean} [changeListener=true] If `true`, switches the keyboard focus to Handsontable. If `false`, keeps the
3993
4408
  * previous keyboard focus. If an element outside Handsontable (such as a custom input) currently owns the browser
3994
4409
  * focus, it remains focused after the call.
3995
4410
  * @returns {boolean} `true`: the selection was successful, `false`: the selection failed.
@@ -4062,8 +4477,8 @@ let activeGuid = null;
4062
4477
  * @param {Array[]|CellRange[]} coords Visual coordinates,
4063
4478
  * passed either as an array of arrays (`[[rowStart, columnStart, rowEnd, columnEnd], ...]`)
4064
4479
  * or as an array of [`CellRange`](@/api/cellRange.md) objects.
4065
- * @param {boolean} [scrollToCell=true] `true`: scroll the viewport to the newly-selected cells. `false`: keep the previous viewport.
4066
- * @param {boolean} [changeListener=true] `true`: switch the keyboard focus to Handsontable. `false`: keep the
4480
+ * @param {boolean} [scrollToCell=true] If `true`, scrolls the viewport to the newly-selected cells. If `false`, keeps the previous viewport.
4481
+ * @param {boolean} [changeListener=true] If `true`, switches the keyboard focus to Handsontable. If `false`, keeps the
4067
4482
  * previous keyboard focus. If an element outside Handsontable (such as a custom input) currently owns the browser
4068
4483
  * focus, it remains focused after the call.
4069
4484
  * @returns {boolean} `true`: the selection was successful, `false`: the selection failed.
@@ -4114,8 +4529,8 @@ let activeGuid = null;
4114
4529
  * @memberof Core#
4115
4530
  * @since 0.38.0
4116
4531
  * @function selectColumns
4117
- * @param {number} startColumn The visual column index from which the selection starts.
4118
- * @param {number} [endColumn=startColumn] The visual column index to which the selection finishes. If `endColumn`
4532
+ * @param {number | string} startColumn The visual column index or column property from which the selection starts.
4533
+ * @param {number | string} [endColumn=startColumn] The visual column index or column property to which the selection finishes. If `endColumn`
4119
4534
  * is not defined the column defined by `startColumn` will be selected.
4120
4535
  * @param {number | { row: number, col: number } | CellCoords} [focusPosition=0] The argument allows changing the cell/header focus
4121
4536
  * position. The value can take visual row index from -N to N, where negative values point to the headers and positive
@@ -4190,16 +4605,15 @@ let activeGuid = null;
4190
4605
  * @since 0.38.2
4191
4606
  * @memberof Core#
4192
4607
  * @function selectAll
4193
- * @param {boolean} [includeRowHeaders=false] `true` If the selection should include the row headers,
4194
- * `false` otherwise.
4195
- * @param {boolean} [includeColumnHeaders=false] `true` If the selection should include the column
4196
- * headers, `false` otherwise.
4608
+ * @param {boolean} [includeRowHeaders=false] If `true`, includes the row headers in the selection.
4609
+ * @param {boolean} [includeColumnHeaders=false] If `true`, includes the column headers in the selection.
4197
4610
  *
4198
- * @param {object} [options] Additional object with options. Since 14.0.0
4611
+ * @param {object} [options] Additional object with options. Since 14.0.0.
4199
4612
  * @param {{row: number, col: number} | boolean} [options.focusPosition] The argument allows changing the cell/header
4200
4613
  * focus position. The value takes an object with a `row` and `col` properties from -N to N, where
4201
4614
  * negative values point to the headers and positive values point to the cell range. If `false`, the focus
4202
- * position won't be changed. Example:
4615
+ * position won't be changed. When the {@link Options#navigableHeaders} option is disabled (the default), a
4616
+ * `focusPosition` that points to a header is relocated to the nearest cell in the data set. Example:
4203
4617
  * ```js
4204
4618
  * hot.selectAll(0, 0, {
4205
4619
  * focusPosition: { row: 0, col: 1 },
@@ -4208,7 +4622,9 @@ let activeGuid = null;
4208
4622
  * ```
4209
4623
  *
4210
4624
  * @param {boolean} [options.disableHeadersHighlight] If `true`, disables highlighting the headers even when
4211
- * the logical coordinates points on them.
4625
+ * the logical coordinates points on them. This only suppresses the highlight shown on headers of a fully-selected
4626
+ * row or column. It doesn't affect the focus indicator on the individual cell or header that holds the focus,
4627
+ * which stays visible even when {@link Options#navigableHeaders} moves the focus onto a header.
4212
4628
  */ this.selectAll = function(includeRowHeaders = true, includeColumnHeaders = includeRowHeaders, options) {
4213
4629
  viewportScroller.skipNextScrollCycle();
4214
4630
  selection.selectAll(includeRowHeaders, includeColumnHeaders, options);
@@ -4242,6 +4658,9 @@ let activeGuid = null;
4242
4658
  /**
4243
4659
  * Scroll viewport to coordinates specified by the `row` and/or `col` object properties.
4244
4660
  *
4661
+ * The object-based signature was introduced in v14.0.0. The positional arguments form is retained
4662
+ * for backward compatibility.
4663
+ *
4245
4664
  * ```js
4246
4665
  * // scroll the viewport to the visual row index (leave the horizontal scroll untouched)
4247
4666
  * hot.scrollViewportTo({ row: 50 });
@@ -4256,6 +4675,9 @@ let activeGuid = null;
4256
4675
  * }, () => {
4257
4676
  * // callback function executed after the viewport is scrolled
4258
4677
  * });
4678
+ *
4679
+ * // scroll the viewport using the backward-compatible positional arguments form
4680
+ * hot.scrollViewportTo(50, 50, true, true);
4259
4681
  * ```
4260
4682
  *
4261
4683
  * @memberof Core#
@@ -4361,6 +4783,10 @@ let activeGuid = null;
4361
4783
  */ this.destroy = function() {
4362
4784
  instance._clearTimeouts();
4363
4785
  instance._clearMicrotasks();
4786
+ // Drop the hidden-init visibility observer before the teardown below nulls the instance. Otherwise a
4787
+ // delivery queued while the table was becoming visible runs its callback on a destroyed instance.
4788
+ visibilityObserver?.disconnect();
4789
+ visibilityObserver = null;
4364
4790
  if (instance.view) {
4365
4791
  instance.view.destroy();
4366
4792
  }
@@ -4452,6 +4878,11 @@ let activeGuid = null;
4452
4878
  /**
4453
4879
  * Returns the first rendered row in the DOM (usually, it is not visible in the table's viewport).
4454
4880
  *
4881
+ * When the {@link MergeCells} plugin is enabled with its default `virtualized: false` setting, a merged
4882
+ * cell that crosses the viewport edge extends the rendered row range, so this method can return a row
4883
+ * index further from the viewport than usual. For the actual visible viewport, use
4884
+ * {@link Core#getFirstFullyVisibleRow} or {@link Core#getFirstPartiallyVisibleRow}.
4885
+ *
4455
4886
  * @since 14.6.0
4456
4887
  * @memberof Core#
4457
4888
  * @function getFirstRenderedVisibleRow
@@ -4462,6 +4893,11 @@ let activeGuid = null;
4462
4893
  /**
4463
4894
  * Returns the last rendered row in the DOM (usually, it is not visible in the table's viewport).
4464
4895
  *
4896
+ * When the {@link MergeCells} plugin is enabled with its default `virtualized: false` setting, a merged
4897
+ * cell that crosses the viewport edge extends the rendered row range, so this method can return a row
4898
+ * index further from the viewport than usual. For the actual visible viewport, use
4899
+ * {@link Core#getLastFullyVisibleRow} or {@link Core#getLastPartiallyVisibleRow}.
4900
+ *
4465
4901
  * @since 14.6.0
4466
4902
  * @memberof Core#
4467
4903
  * @function getLastRenderedVisibleRow
@@ -4472,6 +4908,11 @@ let activeGuid = null;
4472
4908
  /**
4473
4909
  * Returns the first rendered column in the DOM (usually, it is not visible in the table's viewport).
4474
4910
  *
4911
+ * When the {@link MergeCells} plugin is enabled with its default `virtualized: false` setting, a merged
4912
+ * cell that crosses the viewport edge extends the rendered column range, so this method can return a
4913
+ * column index further from the viewport than usual. For the actual visible viewport, use
4914
+ * {@link Core#getFirstFullyVisibleColumn} or {@link Core#getFirstPartiallyVisibleColumn}.
4915
+ *
4475
4916
  * @since 14.6.0
4476
4917
  * @memberof Core#
4477
4918
  * @function getFirstRenderedVisibleColumn
@@ -4482,6 +4923,11 @@ let activeGuid = null;
4482
4923
  /**
4483
4924
  * Returns the last rendered column in the DOM (usually, it is not visible in the table's viewport).
4484
4925
  *
4926
+ * When the {@link MergeCells} plugin is enabled with its default `virtualized: false` setting, a merged
4927
+ * cell that crosses the viewport edge extends the rendered column range, so this method can return a
4928
+ * column index further from the viewport than usual. For the actual visible viewport, use
4929
+ * {@link Core#getLastFullyVisibleColumn} or {@link Core#getLastPartiallyVisibleColumn}.
4930
+ *
4485
4931
  * @since 14.6.0
4486
4932
  * @memberof Core#
4487
4933
  * @function getLastRenderedVisibleColumn
@@ -4964,7 +5410,7 @@ let activeGuid = null;
4964
5410
  const themeName = mergedUserSettings.themeName;
4965
5411
  const rootContainerThemeClassName = getThemeClassName(instance.rootContainer);
4966
5412
  if (isRootInstance(instance) && !rootContainerThemeClassName && (isObject(theme) || !theme && !themeName)) {
4967
- initializeThemeManager(theme);
5413
+ initializeThemeManager(theme, readThemeOverrides(mergedUserSettings));
4968
5414
  }
4969
5415
  getPluginsNames().forEach((pluginName)=>{
4970
5416
  const PluginClass = getPlugin(pluginName);