handsontable 18.0.0 → 18.1.0-rc1

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 (1238) 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 +142 -0
  12. package/3rdparty/walkontable/src/axisSizing/columnUtils.mjs +137 -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 +124 -0
  16. package/3rdparty/walkontable/src/axisSizing/defaultSizeSource.mjs +114 -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 +251 -0
  23. package/3rdparty/walkontable/src/axisSizing/positionCache/index.mjs +257 -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 +116 -0
  27. package/3rdparty/walkontable/src/axisSizing/positionCache/prefixSumStrategy.mjs +112 -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 +199 -0
  31. package/3rdparty/walkontable/src/axisSizing/positionCache/sparseStrategy.mjs +196 -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 +116 -0
  39. package/3rdparty/walkontable/src/axisSizing/positionCache/uniformStrategy.mjs +110 -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 +106 -0
  43. package/3rdparty/walkontable/src/axisSizing/rowUtils.mjs +101 -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/coords.js +4 -9
  58. package/3rdparty/walkontable/src/cell/coords.mjs +4 -9
  59. package/3rdparty/walkontable/src/cell/range.d.ts +10 -0
  60. package/3rdparty/walkontable/src/cell/range.js +19 -15
  61. package/3rdparty/walkontable/src/cell/range.mjs +16 -12
  62. package/3rdparty/walkontable/src/core/_base.d.ts +21 -21
  63. package/3rdparty/walkontable/src/core/_base.js +47 -147
  64. package/3rdparty/walkontable/src/core/_base.mjs +17 -147
  65. package/3rdparty/walkontable/src/core/clone.d.ts +4 -14
  66. package/3rdparty/walkontable/src/core/clone.js +40 -5
  67. package/3rdparty/walkontable/src/core/clone.mjs +10 -5
  68. package/3rdparty/walkontable/src/core/core.d.ts +1 -5
  69. package/3rdparty/walkontable/src/core/core.js +41 -47
  70. package/3rdparty/walkontable/src/core/core.mjs +12 -48
  71. package/3rdparty/walkontable/src/domMeasure/geometryReader.d.mts +1 -0
  72. package/3rdparty/walkontable/src/domMeasure/geometryReader.d.ts +172 -0
  73. package/3rdparty/walkontable/src/domMeasure/geometryReader.js +19 -0
  74. package/3rdparty/walkontable/src/domMeasure/geometryReader.mjs +16 -0
  75. package/3rdparty/walkontable/src/domMeasure/liveGeometryReader.d.mts +1 -0
  76. package/3rdparty/walkontable/src/domMeasure/liveGeometryReader.d.ts +134 -0
  77. package/3rdparty/walkontable/src/domMeasure/liveGeometryReader.js +195 -0
  78. package/3rdparty/walkontable/src/domMeasure/liveGeometryReader.mjs +193 -0
  79. package/3rdparty/walkontable/src/event.d.ts +25 -12
  80. package/3rdparty/walkontable/src/event.js +96 -236
  81. package/3rdparty/walkontable/src/event.mjs +95 -236
  82. package/3rdparty/walkontable/src/facade/core.d.ts +6 -6
  83. package/3rdparty/walkontable/src/index.d.ts +1 -1
  84. package/3rdparty/walkontable/src/index.js +10 -21
  85. package/3rdparty/walkontable/src/index.mjs +1 -1
  86. package/3rdparty/walkontable/src/overlay/index.d.ts +6 -6
  87. package/3rdparty/walkontable/src/overlay/index.js +11 -11
  88. package/3rdparty/walkontable/src/overlay/index.mjs +6 -6
  89. package/3rdparty/walkontable/src/overlay/overlays.d.ts +375 -0
  90. package/3rdparty/walkontable/src/overlay/overlays.js +605 -0
  91. package/3rdparty/walkontable/src/overlay/overlays.mjs +594 -0
  92. package/3rdparty/walkontable/src/overlay/{_base.d.ts → regions/_base.d.ts} +65 -16
  93. package/3rdparty/walkontable/src/overlay/{_base.js → regions/_base.js} +155 -50
  94. package/3rdparty/walkontable/src/overlay/{_base.mjs → regions/_base.mjs} +158 -47
  95. package/3rdparty/walkontable/src/overlay/regions/bottomInlineStartCornerOverlay.d.mts +1 -0
  96. package/3rdparty/walkontable/src/overlay/{bottomInlineStartCorner.d.ts → regions/bottomInlineStartCornerOverlay.d.ts} +5 -10
  97. package/3rdparty/walkontable/src/overlay/{bottomInlineStartCorner.js → regions/bottomInlineStartCornerOverlay.js} +18 -20
  98. package/3rdparty/walkontable/src/overlay/{bottomInlineStartCorner.mjs → regions/bottomInlineStartCornerOverlay.mjs} +18 -20
  99. package/3rdparty/walkontable/src/overlay/regions/bottomOverlay.d.mts +1 -0
  100. package/3rdparty/walkontable/src/overlay/{bottom.d.ts → regions/bottomOverlay.d.ts} +16 -11
  101. package/3rdparty/walkontable/src/overlay/{bottom.js → regions/bottomOverlay.js} +111 -66
  102. package/3rdparty/walkontable/src/overlay/{bottom.mjs → regions/bottomOverlay.mjs} +111 -66
  103. package/3rdparty/walkontable/src/overlay/regions/inlineStartOverlay.d.mts +1 -0
  104. package/3rdparty/walkontable/src/overlay/{inlineStart.d.ts → regions/inlineStartOverlay.d.ts} +17 -11
  105. package/3rdparty/walkontable/src/overlay/{inlineStart.js → regions/inlineStartOverlay.js} +120 -67
  106. package/3rdparty/walkontable/src/overlay/{inlineStart.mjs → regions/inlineStartOverlay.mjs} +120 -67
  107. package/3rdparty/walkontable/src/overlay/regions/topInlineStartCornerOverlay.d.mts +1 -0
  108. package/3rdparty/walkontable/src/overlay/{topInlineStartCorner.d.ts → regions/topInlineStartCornerOverlay.d.ts} +5 -10
  109. package/3rdparty/walkontable/src/overlay/{topInlineStartCorner.js → regions/topInlineStartCornerOverlay.js} +13 -16
  110. package/3rdparty/walkontable/src/overlay/{topInlineStartCorner.mjs → regions/topInlineStartCornerOverlay.mjs} +13 -16
  111. package/3rdparty/walkontable/src/overlay/regions/topOverlay.d.mts +1 -0
  112. package/3rdparty/walkontable/src/overlay/{top.d.ts → regions/topOverlay.d.ts} +32 -11
  113. package/3rdparty/walkontable/src/overlay/{top.js → regions/topOverlay.js} +161 -77
  114. package/3rdparty/walkontable/src/overlay/{top.mjs → regions/topOverlay.mjs} +161 -77
  115. package/3rdparty/walkontable/src/overlay/resizeMonitor.d.mts +1 -0
  116. package/3rdparty/walkontable/src/overlay/resizeMonitor.d.ts +49 -0
  117. package/3rdparty/walkontable/src/overlay/resizeMonitor.js +149 -0
  118. package/3rdparty/walkontable/src/overlay/resizeMonitor.mjs +148 -0
  119. package/3rdparty/walkontable/src/overlay/scroll/nativeScrollInput.d.mts +1 -0
  120. package/3rdparty/walkontable/src/overlay/scroll/nativeScrollInput.d.ts +62 -0
  121. package/3rdparty/walkontable/src/overlay/scroll/nativeScrollInput.js +283 -0
  122. package/3rdparty/walkontable/src/overlay/scroll/nativeScrollInput.mjs +288 -0
  123. package/3rdparty/walkontable/src/overlay/scroll/scrollSync.d.mts +1 -0
  124. package/3rdparty/walkontable/src/overlay/scroll/scrollSync.d.ts +176 -0
  125. package/3rdparty/walkontable/src/overlay/scroll/scrollSync.js +542 -0
  126. package/3rdparty/walkontable/src/overlay/scroll/scrollSync.mjs +550 -0
  127. package/3rdparty/walkontable/src/overlay/spreaderSize.d.mts +1 -0
  128. package/3rdparty/walkontable/src/overlay/spreaderSize.d.ts +67 -0
  129. package/3rdparty/walkontable/src/overlay/spreaderSize.js +173 -0
  130. package/3rdparty/walkontable/src/overlay/spreaderSize.mjs +174 -0
  131. package/3rdparty/walkontable/src/{stickyScrollStrategy.d.ts → overlay/strategies/stickyScrollStrategy.d.ts} +33 -21
  132. package/3rdparty/walkontable/src/{stickyScrollStrategy.js → overlay/strategies/stickyScrollStrategy.js} +65 -53
  133. package/3rdparty/walkontable/src/{stickyScrollStrategy.mjs → overlay/strategies/stickyScrollStrategy.mjs} +63 -50
  134. package/3rdparty/walkontable/src/ports.d.mts +1 -0
  135. package/3rdparty/walkontable/src/ports.d.ts +54 -0
  136. package/3rdparty/walkontable/src/ports.js +23 -0
  137. package/3rdparty/walkontable/src/ports.mjs +24 -0
  138. package/3rdparty/walkontable/src/{renderer → render}/_base.d.ts +1 -1
  139. package/3rdparty/walkontable/src/{renderer → render}/cells.js +1 -1
  140. package/3rdparty/walkontable/src/{renderer → render}/cells.mjs +1 -1
  141. package/3rdparty/walkontable/src/{renderer → render}/columnHeaders.d.ts +1 -0
  142. package/3rdparty/walkontable/src/{renderer → render}/columnHeaders.js +41 -1
  143. package/3rdparty/walkontable/src/{renderer → render}/columnHeaders.mjs +42 -2
  144. package/3rdparty/walkontable/src/render/index.d.mts +1 -0
  145. package/3rdparty/walkontable/src/{renderer → render}/index.d.ts +11 -3
  146. package/3rdparty/walkontable/src/{renderer → render}/index.js +13 -3
  147. package/3rdparty/walkontable/src/{renderer → render}/index.mjs +11 -1
  148. package/3rdparty/walkontable/src/{renderer → render}/rows.js +1 -1
  149. package/3rdparty/walkontable/src/{renderer → render}/rows.mjs +1 -1
  150. package/3rdparty/walkontable/src/render/tableRenderer.d.mts +1 -0
  151. package/3rdparty/walkontable/src/{renderer/table.d.ts → render/tableRenderer.d.ts} +12 -2
  152. package/3rdparty/walkontable/src/render/tableRenderer.js +375 -0
  153. package/3rdparty/walkontable/src/{renderer/table.mjs → render/tableRenderer.mjs} +152 -6
  154. package/3rdparty/walkontable/src/{scroll.d.ts → scroll/scroll.d.ts} +27 -10
  155. package/3rdparty/walkontable/src/{scroll.js → scroll/scroll.js} +104 -35
  156. package/3rdparty/walkontable/src/{scroll.mjs → scroll/scroll.mjs} +102 -32
  157. package/3rdparty/walkontable/src/selection/border/border.d.ts +313 -5
  158. package/3rdparty/walkontable/src/selection/border/border.js +861 -51
  159. package/3rdparty/walkontable/src/selection/border/border.mjs +863 -53
  160. package/3rdparty/walkontable/src/selection/border/types.d.ts +30 -0
  161. package/3rdparty/walkontable/src/selection/manager.js +242 -12
  162. package/3rdparty/walkontable/src/selection/manager.mjs +243 -13
  163. package/3rdparty/walkontable/src/selection/scanner.js +5 -12
  164. package/3rdparty/walkontable/src/selection/scanner.mjs +5 -12
  165. package/3rdparty/walkontable/src/settings/accessor.d.mts +2 -0
  166. package/3rdparty/walkontable/src/settings/accessor.d.ts +74 -0
  167. package/3rdparty/walkontable/src/settings/accessor.js +78 -0
  168. package/3rdparty/walkontable/src/settings/accessor.mjs +71 -0
  169. package/3rdparty/walkontable/src/settings/defaults.d.mts +1 -0
  170. package/3rdparty/walkontable/src/{settings.d.ts → settings/defaults.d.ts} +16 -77
  171. package/3rdparty/walkontable/src/settings/defaults.js +146 -0
  172. package/3rdparty/walkontable/src/settings/defaults.mjs +225 -0
  173. package/3rdparty/walkontable/src/settings/index.d.mts +1 -0
  174. package/3rdparty/walkontable/src/settings/index.d.ts +6 -0
  175. package/3rdparty/walkontable/src/settings/index.js +20 -0
  176. package/3rdparty/walkontable/src/settings/index.mjs +5 -0
  177. package/3rdparty/walkontable/src/table/baseTable.d.mts +2 -0
  178. package/3rdparty/walkontable/src/table/baseTable.d.ts +284 -0
  179. package/3rdparty/walkontable/src/table/baseTable.js +290 -0
  180. package/3rdparty/walkontable/src/table/baseTable.mjs +278 -0
  181. package/3rdparty/walkontable/src/table/cellAccess.d.mts +1 -0
  182. package/3rdparty/walkontable/src/table/cellAccess.d.ts +101 -0
  183. package/3rdparty/walkontable/src/table/cellAccess.js +238 -0
  184. package/3rdparty/walkontable/src/table/cellAccess.mjs +229 -0
  185. package/3rdparty/walkontable/src/table/domScaffold.d.mts +1 -0
  186. package/3rdparty/walkontable/src/table/domScaffold.d.ts +37 -0
  187. package/3rdparty/walkontable/src/table/domScaffold.js +145 -0
  188. package/3rdparty/walkontable/src/table/domScaffold.mjs +136 -0
  189. package/3rdparty/walkontable/src/table/drawCycle.d.mts +1 -0
  190. package/3rdparty/walkontable/src/table/drawCycle.d.ts +16 -0
  191. package/3rdparty/walkontable/src/table/drawCycle.js +405 -0
  192. package/3rdparty/walkontable/src/table/drawCycle.mjs +403 -0
  193. package/3rdparty/walkontable/src/table/rangeQuery/renderedRange.d.mts +1 -0
  194. package/3rdparty/walkontable/src/table/rangeQuery/renderedRange.d.ts +38 -0
  195. package/3rdparty/walkontable/src/table/rangeQuery/renderedRange.js +15 -0
  196. package/3rdparty/walkontable/src/table/rangeQuery/renderedRange.mjs +14 -0
  197. package/3rdparty/walkontable/src/table/{mixin → rangeQuery}/stickyColumnsStart.d.ts +1 -1
  198. package/3rdparty/walkontable/src/table/{mixin → rangeQuery}/stickyColumnsStart.js +1 -1
  199. package/3rdparty/walkontable/src/table/{mixin → rangeQuery}/stickyColumnsStart.mjs +1 -1
  200. package/3rdparty/walkontable/src/table/{mixin → rangeQuery}/stickyRowsBottom.d.ts +1 -1
  201. package/3rdparty/walkontable/src/table/{mixin → rangeQuery}/stickyRowsTop.d.ts +1 -1
  202. package/3rdparty/walkontable/src/table/{mixin → rangeQuery}/stickyRowsTop.js +1 -1
  203. package/3rdparty/walkontable/src/table/{mixin → rangeQuery}/stickyRowsTop.mjs +1 -1
  204. package/3rdparty/walkontable/src/table/rangeQuery/viewportPredicates.d.mts +2 -0
  205. package/3rdparty/walkontable/src/table/rangeQuery/viewportPredicates.d.ts +226 -0
  206. package/3rdparty/walkontable/src/table/rangeQuery/viewportPredicates.js +251 -0
  207. package/3rdparty/walkontable/src/table/rangeQuery/viewportPredicates.mjs +241 -0
  208. package/3rdparty/walkontable/src/table/rangeQuery/virtualRange.d.mts +1 -0
  209. package/3rdparty/walkontable/src/table/rangeQuery/virtualRange.d.ts +14 -0
  210. package/3rdparty/walkontable/src/table/rangeQuery/virtualRange.js +196 -0
  211. package/3rdparty/walkontable/src/table/rangeQuery/virtualRange.mjs +179 -0
  212. package/3rdparty/walkontable/src/table/regions/bottomInlineStartCornerTable.d.mts +2 -0
  213. package/3rdparty/walkontable/src/table/regions/bottomInlineStartCornerTable.d.ts +16 -0
  214. package/3rdparty/walkontable/src/table/{bottomInlineStartCorner.js → regions/bottomInlineStartCornerTable.js} +9 -12
  215. package/3rdparty/walkontable/src/table/regions/bottomInlineStartCornerTable.mjs +21 -0
  216. package/3rdparty/walkontable/src/table/regions/bottomTable.d.mts +2 -0
  217. package/3rdparty/walkontable/src/table/regions/bottomTable.d.ts +15 -0
  218. package/3rdparty/walkontable/src/table/regions/bottomTable.js +35 -0
  219. package/3rdparty/walkontable/src/table/regions/bottomTable.mjs +20 -0
  220. package/3rdparty/walkontable/src/table/regions/inlineStartTable.d.mts +2 -0
  221. package/3rdparty/walkontable/src/table/regions/inlineStartTable.d.ts +12 -0
  222. package/3rdparty/walkontable/src/table/regions/inlineStartTable.js +32 -0
  223. package/3rdparty/walkontable/src/table/regions/inlineStartTable.mjs +17 -0
  224. package/3rdparty/walkontable/src/table/regions/masterTable.d.mts +2 -0
  225. package/3rdparty/walkontable/src/table/{master.d.ts → regions/masterTable.d.ts} +4 -13
  226. package/3rdparty/walkontable/src/table/{master.js → regions/masterTable.js} +27 -57
  227. package/3rdparty/walkontable/src/table/{master.mjs → regions/masterTable.mjs} +26 -56
  228. package/3rdparty/walkontable/src/table/regions/topInlineStartCornerTable.d.mts +2 -0
  229. package/3rdparty/walkontable/src/table/regions/topInlineStartCornerTable.d.ts +16 -0
  230. package/3rdparty/walkontable/src/table/{topInlineStartCorner.js → regions/topInlineStartCornerTable.js} +9 -12
  231. package/3rdparty/walkontable/src/table/regions/topInlineStartCornerTable.mjs +21 -0
  232. package/3rdparty/walkontable/src/table/regions/topTable.d.mts +2 -0
  233. package/3rdparty/walkontable/src/table/regions/topTable.d.ts +15 -0
  234. package/3rdparty/walkontable/src/table/regions/topTable.js +35 -0
  235. package/3rdparty/walkontable/src/table/regions/topTable.mjs +20 -0
  236. package/3rdparty/walkontable/src/types.d.ts +7 -69
  237. package/3rdparty/walkontable/src/types.mjs +2 -1
  238. package/3rdparty/walkontable/src/utils/pointerToCoords.d.mts +1 -0
  239. package/3rdparty/walkontable/src/utils/{cellCoords.d.ts → pointerToCoords.d.ts} +24 -0
  240. package/3rdparty/walkontable/src/utils/pointerToCoords.js +181 -0
  241. package/3rdparty/walkontable/src/utils/pointerToCoords.mjs +186 -0
  242. package/3rdparty/walkontable/src/viewport/boxLayout/gatherLayoutInput.d.mts +1 -0
  243. package/3rdparty/walkontable/src/viewport/boxLayout/gatherLayoutInput.d.ts +40 -0
  244. package/3rdparty/walkontable/src/viewport/boxLayout/gatherLayoutInput.js +139 -0
  245. package/3rdparty/walkontable/src/viewport/boxLayout/gatherLayoutInput.mjs +131 -0
  246. package/3rdparty/walkontable/src/viewport/boxLayout/layoutSnapshot.d.mts +1 -0
  247. package/3rdparty/walkontable/src/viewport/boxLayout/layoutSnapshot.d.ts +133 -0
  248. package/3rdparty/walkontable/src/viewport/boxLayout/layoutSnapshot.js +18 -0
  249. package/3rdparty/walkontable/src/viewport/boxLayout/layoutSnapshot.mjs +18 -0
  250. package/3rdparty/walkontable/src/viewport/boxLayout/resolveLayout.d.mts +1 -0
  251. package/3rdparty/walkontable/src/viewport/boxLayout/resolveLayout.d.ts +17 -0
  252. package/3rdparty/walkontable/src/viewport/boxLayout/resolveLayout.js +104 -0
  253. package/3rdparty/walkontable/src/viewport/boxLayout/resolveLayout.mjs +99 -0
  254. package/3rdparty/walkontable/src/viewport/calculatorFactory.d.mts +1 -0
  255. package/3rdparty/walkontable/src/viewport/calculatorFactory.d.ts +84 -0
  256. package/3rdparty/walkontable/src/viewport/calculatorFactory.js +588 -0
  257. package/3rdparty/walkontable/src/viewport/calculatorFactory.mjs +601 -0
  258. package/3rdparty/walkontable/src/viewport/viewport.d.ts +267 -0
  259. package/3rdparty/walkontable/src/viewport/viewport.js +363 -0
  260. package/3rdparty/walkontable/src/viewport/viewport.mjs +355 -0
  261. package/3rdparty/walkontable/src/viewport/workspaceSize.d.mts +1 -0
  262. package/3rdparty/walkontable/src/viewport/workspaceSize.d.ts +59 -0
  263. package/3rdparty/walkontable/src/viewport/workspaceSize.js +284 -0
  264. package/3rdparty/walkontable/src/viewport/workspaceSize.mjs +282 -0
  265. package/3rdparty/walkontable/src/wire.d.mts +1 -0
  266. package/3rdparty/walkontable/src/wire.d.ts +81 -0
  267. package/3rdparty/walkontable/src/wire.js +56 -0
  268. package/3rdparty/walkontable/src/wire.mjs +56 -0
  269. package/LICENSE.txt +1 -1
  270. package/README.md +2 -2
  271. package/base.d.ts +10 -2
  272. package/base.js +2 -2
  273. package/base.mjs +2 -2
  274. package/cellTypes/checkboxType/accessors/valueSetter.d.ts +1 -1
  275. package/cellTypes/checkboxType/accessors/valueSetter.js +3 -1
  276. package/cellTypes/checkboxType/accessors/valueSetter.mjs +3 -1
  277. package/cellTypes/index.d.ts +3 -2
  278. package/cellTypes/index.js +9 -0
  279. package/cellTypes/index.mjs +5 -2
  280. package/cellTypes/intlDatetimeType/index.d.mts +1 -0
  281. package/cellTypes/intlDatetimeType/index.d.ts +1 -0
  282. package/cellTypes/intlDatetimeType/index.js +19 -0
  283. package/cellTypes/intlDatetimeType/index.mjs +1 -0
  284. package/cellTypes/intlDatetimeType/intlDatetimeType.d.mts +1 -0
  285. package/cellTypes/intlDatetimeType/intlDatetimeType.d.ts +16 -0
  286. package/cellTypes/intlDatetimeType/intlDatetimeType.js +31 -0
  287. package/cellTypes/intlDatetimeType/intlDatetimeType.mjs +15 -0
  288. package/cellTypes/multiSelectType/index.d.ts +1 -1
  289. package/cellTypes/multiSelectType/index.js +3 -0
  290. package/cellTypes/multiSelectType/index.mjs +1 -1
  291. package/cellTypes/multiSelectType/multiSelectType.d.ts +1 -0
  292. package/cellTypes/multiSelectType/multiSelectType.js +4 -0
  293. package/cellTypes/multiSelectType/multiSelectType.mjs +1 -0
  294. package/cellTypes/numericType/accessors/valueSetter.js +30 -2
  295. package/cellTypes/numericType/accessors/valueSetter.mjs +31 -3
  296. package/core/coordsMapper/rangeToRenderableMapper.js +5 -12
  297. package/core/coordsMapper/rangeToRenderableMapper.mjs +5 -12
  298. package/core/hooks/bucket.d.ts +40 -6
  299. package/core/hooks/bucket.js +113 -84
  300. package/core/hooks/bucket.mjs +118 -84
  301. package/core/hooks/constants.js +254 -16
  302. package/core/hooks/constants.mjs +254 -16
  303. package/core/hooks/index.js +28 -25
  304. package/core/hooks/index.mjs +28 -25
  305. package/core/layout/constants.d.ts +11 -0
  306. package/core/layout/constants.js +6 -0
  307. package/core/layout/constants.mjs +12 -0
  308. package/core/layout/domSlot.d.ts +3 -1
  309. package/core/layout/domSlot.js +21 -14
  310. package/core/layout/domSlot.mjs +21 -14
  311. package/core/layout/index.d.ts +2 -2
  312. package/core/layout/index.js +6 -0
  313. package/core/layout/index.mjs +2 -2
  314. package/core/layout/layoutManager.d.ts +13 -0
  315. package/core/layout/layoutManager.js +25 -13
  316. package/core/layout/layoutManager.mjs +26 -11
  317. package/core/settings.d.ts +59 -6
  318. package/core/types.d.ts +15 -1
  319. package/core/types.mjs +9 -0
  320. package/core.js +481 -85
  321. package/core.mjs +483 -87
  322. package/dataMap/dataMap.d.ts +3 -13
  323. package/dataMap/dataMap.js +101 -44
  324. package/dataMap/dataMap.mjs +102 -45
  325. package/dataMap/dataSource.js +4 -1
  326. package/dataMap/dataSource.mjs +4 -1
  327. package/dataMap/metaManager/index.d.ts +62 -8
  328. package/dataMap/metaManager/index.js +66 -0
  329. package/dataMap/metaManager/index.mjs +66 -0
  330. package/dataMap/metaManager/lazyFactoryMap.d.ts +68 -43
  331. package/dataMap/metaManager/lazyFactoryMap.js +490 -110
  332. package/dataMap/metaManager/lazyFactoryMap.mjs +504 -111
  333. package/dataMap/metaManager/metaLayers/cellMeta.d.ts +55 -8
  334. package/dataMap/metaManager/metaLayers/cellMeta.js +112 -17
  335. package/dataMap/metaManager/metaLayers/cellMeta.mjs +112 -17
  336. package/dataMap/metaManager/metaLayers/columnMeta.d.ts +2 -1
  337. package/dataMap/metaManager/metaLayers/columnMeta.js +1 -0
  338. package/dataMap/metaManager/metaLayers/columnMeta.mjs +1 -0
  339. package/dataMap/metaManager/metaSchema.js +712 -31
  340. package/dataMap/metaManager/metaSchema.mjs +712 -31
  341. package/dataMap/metaManager/mods/dynamicCellMeta.d.ts +24 -10
  342. package/dataMap/metaManager/mods/dynamicCellMeta.js +245 -28
  343. package/dataMap/metaManager/mods/dynamicCellMeta.mjs +246 -29
  344. package/dataMap/metaManager/mods/extendMetaProperties.js +4 -9
  345. package/dataMap/metaManager/mods/extendMetaProperties.mjs +4 -9
  346. package/dataMap/sourceDataValidator.d.ts +13 -21
  347. package/dataMap/sourceDataValidator.js +39 -29
  348. package/dataMap/sourceDataValidator.mjs +50 -33
  349. package/dist/handsontable.full.js +34553 -9903
  350. package/dist/handsontable.full.min.js +168 -112
  351. package/dist/handsontable.js +31541 -13409
  352. package/dist/handsontable.min.js +172 -116
  353. package/dist/languages/all.js +2 -1
  354. package/dist/languages/all.min.js +1 -1
  355. package/dist/languages/fa-IR.js +2 -1
  356. package/dist/languages/fa-IR.min.js +1 -1
  357. package/dist/themes/classic.js +9 -3
  358. package/dist/themes/classic.min.js +4 -4
  359. package/dist/themes/horizon.js +9 -3
  360. package/dist/themes/horizon.min.js +4 -4
  361. package/dist/themes/main.js +9 -3
  362. package/dist/themes/main.min.js +4 -4
  363. package/dist/themes/static/variables/colors/ant.js +3 -3
  364. package/dist/themes/static/variables/colors/ant.min.js +3 -3
  365. package/dist/themes/static/variables/colors/classic.js +3 -3
  366. package/dist/themes/static/variables/colors/classic.min.js +3 -3
  367. package/dist/themes/static/variables/colors/horizon.js +3 -3
  368. package/dist/themes/static/variables/colors/horizon.min.js +3 -3
  369. package/dist/themes/static/variables/colors/main.js +3 -3
  370. package/dist/themes/static/variables/colors/main.min.js +3 -3
  371. package/dist/themes/static/variables/colors/material.js +3 -3
  372. package/dist/themes/static/variables/colors/material.min.js +3 -3
  373. package/dist/themes/static/variables/colors/shadcn.js +3 -3
  374. package/dist/themes/static/variables/colors/shadcn.min.js +3 -3
  375. package/dist/themes/static/variables/density.js +3 -3
  376. package/dist/themes/static/variables/density.min.js +3 -3
  377. package/dist/themes/static/variables/helpers/iconsMap.js +4 -9
  378. package/dist/themes/static/variables/helpers/iconsMap.min.js +4 -9
  379. package/dist/themes/static/variables/icons/horizon.js +3 -3
  380. package/dist/themes/static/variables/icons/horizon.min.js +3 -3
  381. package/dist/themes/static/variables/icons/main.js +3 -3
  382. package/dist/themes/static/variables/icons/main.min.js +3 -3
  383. package/dist/themes/static/variables/sizing.js +3 -3
  384. package/dist/themes/static/variables/sizing.min.js +3 -3
  385. package/dist/themes/static/variables/tokens/classic.js +9 -3
  386. package/dist/themes/static/variables/tokens/classic.min.js +4 -4
  387. package/dist/themes/static/variables/tokens/horizon.js +9 -3
  388. package/dist/themes/static/variables/tokens/horizon.min.js +4 -4
  389. package/dist/themes/static/variables/tokens/main.js +9 -3
  390. package/dist/themes/static/variables/tokens/main.min.js +4 -4
  391. package/editorManager.js +1 -3
  392. package/editorManager.mjs +1 -3
  393. package/editors/autocompleteEditor/autocompleteEditor.js +48 -22
  394. package/editors/autocompleteEditor/autocompleteEditor.mjs +48 -22
  395. package/editors/baseEditor/baseEditor.d.ts +15 -3
  396. package/editors/baseEditor/baseEditor.js +6 -6
  397. package/editors/baseEditor/baseEditor.mjs +16 -6
  398. package/editors/factory.js +5 -2
  399. package/editors/factory.mjs +5 -2
  400. package/editors/index.d.ts +3 -2
  401. package/editors/index.js +8 -0
  402. package/editors/index.mjs +3 -1
  403. package/editors/intlDatetimeEditor/index.d.mts +1 -0
  404. package/editors/intlDatetimeEditor/index.d.ts +1 -0
  405. package/editors/intlDatetimeEditor/index.js +19 -0
  406. package/editors/intlDatetimeEditor/index.mjs +1 -0
  407. package/editors/intlDatetimeEditor/intlDatetimeEditor.d.mts +1 -0
  408. package/editors/intlDatetimeEditor/intlDatetimeEditor.d.ts +42 -0
  409. package/editors/intlDatetimeEditor/intlDatetimeEditor.js +108 -0
  410. package/editors/intlDatetimeEditor/intlDatetimeEditor.mjs +93 -0
  411. package/editors/multiSelectEditor/controllers/dropdownController.js +5 -12
  412. package/editors/multiSelectEditor/controllers/dropdownController.mjs +5 -12
  413. package/editors/multiSelectEditor/controllers/inputController.js +1 -3
  414. package/editors/multiSelectEditor/controllers/inputController.mjs +1 -3
  415. package/editors/multiSelectEditor/multiSelectEditor.js +16 -21
  416. package/editors/multiSelectEditor/multiSelectEditor.mjs +17 -22
  417. package/editors/passwordEditor/passwordEditor.js +5 -12
  418. package/editors/passwordEditor/passwordEditor.mjs +5 -12
  419. package/editors/registry.js +4 -9
  420. package/editors/registry.mjs +4 -9
  421. package/editors/textEditor/textEditor.js +1 -1
  422. package/editors/textEditor/textEditor.mjs +2 -2
  423. package/eventManager.d.ts +3 -3
  424. package/focusManager/grid.d.ts +28 -0
  425. package/focusManager/grid.js +84 -14
  426. package/focusManager/grid.mjs +80 -15
  427. package/focusManager/scopeManager.js +1 -1
  428. package/focusManager/scopeManager.mjs +2 -2
  429. package/handsontable-non-commercial-license.pdf +0 -0
  430. package/helpers/array.d.ts +25 -0
  431. package/helpers/array.js +41 -4
  432. package/helpers/array.mjs +56 -4
  433. package/helpers/dateTime.d.ts +14 -0
  434. package/helpers/dateTime.js +74 -2
  435. package/helpers/dateTime.mjs +73 -2
  436. package/helpers/dom/cellCoords.js +156 -13
  437. package/helpers/dom/cellCoords.mjs +156 -13
  438. package/helpers/dom/element.d.ts +27 -3
  439. package/helpers/dom/element.js +92 -16
  440. package/helpers/dom/element.mjs +107 -17
  441. package/helpers/dom/event.d.ts +58 -0
  442. package/helpers/dom/event.js +39 -0
  443. package/helpers/dom/event.mjs +63 -0
  444. package/helpers/errors.d.ts +5 -0
  445. package/helpers/errors.js +10 -6
  446. package/helpers/errors.mjs +10 -6
  447. package/helpers/feature.d.ts +19 -0
  448. package/helpers/feature.js +21 -0
  449. package/helpers/feature.mjs +30 -0
  450. package/helpers/function.d.ts +1 -1
  451. package/helpers/function.js +4 -1
  452. package/helpers/function.mjs +4 -1
  453. package/helpers/mixed.d.ts +103 -0
  454. package/helpers/mixed.js +373 -4
  455. package/helpers/mixed.mjs +413 -4
  456. package/helpers/moves.js +2 -1
  457. package/helpers/moves.mjs +2 -1
  458. package/helpers/number.d.ts +22 -0
  459. package/helpers/number.js +49 -0
  460. package/helpers/number.mjs +66 -0
  461. package/i18n/languages/ar-AR.js +8 -19
  462. package/i18n/languages/cs-CZ.js +8 -19
  463. package/i18n/languages/de-CH.js +8 -19
  464. package/i18n/languages/de-DE.js +8 -19
  465. package/i18n/languages/en-US.js +8 -19
  466. package/i18n/languages/es-MX.js +8 -19
  467. package/i18n/languages/fa-IR.d.ts +1 -0
  468. package/i18n/languages/fa-IR.js +9 -19
  469. package/i18n/languages/fa-IR.mjs +1 -0
  470. package/i18n/languages/fr-FR.js +8 -19
  471. package/i18n/languages/hr-HR.js +8 -19
  472. package/i18n/languages/it-IT.js +8 -19
  473. package/i18n/languages/ja-JP.js +8 -19
  474. package/i18n/languages/ko-KR.js +8 -19
  475. package/i18n/languages/lv-LV.js +8 -19
  476. package/i18n/languages/nb-NO.js +8 -19
  477. package/i18n/languages/nl-NL.js +8 -19
  478. package/i18n/languages/pl-PL.js +8 -19
  479. package/i18n/languages/pt-BR.js +8 -19
  480. package/i18n/languages/ru-RU.js +8 -19
  481. package/i18n/languages/sr-SP.js +8 -19
  482. package/i18n/languages/zh-CN.js +8 -19
  483. package/i18n/languages/zh-TW.js +8 -19
  484. package/i18n/registry.js +8 -19
  485. package/index.d.ts +2 -2
  486. package/index.js +8 -19
  487. package/languages/all.js +2 -1
  488. package/languages/fa-IR.js +2 -1
  489. package/languages/fa-IR.mjs +1 -0
  490. package/languages/index.js +2 -1
  491. package/package.json +61 -1
  492. package/plugins/autoColumnSize/autoColumnSize.d.ts +24 -1
  493. package/plugins/autoColumnSize/autoColumnSize.js +506 -94
  494. package/plugins/autoColumnSize/autoColumnSize.mjs +513 -95
  495. package/plugins/autoRowSize/autoRowSize.d.ts +40 -5
  496. package/plugins/autoRowSize/autoRowSize.js +73 -36
  497. package/plugins/autoRowSize/autoRowSize.mjs +103 -41
  498. package/plugins/autofill/autofill.js +35 -24
  499. package/plugins/autofill/autofill.mjs +35 -24
  500. package/plugins/base/base.d.ts +10 -0
  501. package/plugins/base/base.js +5 -12
  502. package/plugins/base/base.mjs +5 -12
  503. package/plugins/bindRowsWithHeaders/bindRowsWithHeaders.js +4 -9
  504. package/plugins/bindRowsWithHeaders/bindRowsWithHeaders.mjs +4 -9
  505. package/plugins/collapsibleColumns/collapsibleColumns.d.ts +4 -0
  506. package/plugins/collapsibleColumns/collapsibleColumns.js +94 -20
  507. package/plugins/collapsibleColumns/collapsibleColumns.mjs +98 -20
  508. package/plugins/columnSorting/columnSorting.d.ts +31 -2
  509. package/plugins/columnSorting/columnSorting.js +153 -33
  510. package/plugins/columnSorting/columnSorting.mjs +155 -35
  511. package/plugins/columnSorting/columnStatesManager.d.ts +1 -1
  512. package/plugins/columnSorting/columnStatesManager.js +1 -7
  513. package/plugins/columnSorting/columnStatesManager.mjs +1 -7
  514. package/plugins/columnSorting/domHelpers.d.ts +3 -0
  515. package/plugins/columnSorting/domHelpers.js +9 -0
  516. package/plugins/columnSorting/domHelpers.mjs +3 -3
  517. package/plugins/columnSorting/rootComparator.js +21 -16
  518. package/plugins/columnSorting/rootComparator.mjs +21 -16
  519. package/plugins/columnSorting/sortFunction/checkbox.js +7 -5
  520. package/plugins/columnSorting/sortFunction/checkbox.mjs +7 -5
  521. package/plugins/columnSorting/sortFunction/default.js +15 -4
  522. package/plugins/columnSorting/sortFunction/default.mjs +15 -4
  523. package/plugins/columnSorting/sortFunction/intlDatetime.d.mts +1 -0
  524. package/plugins/columnSorting/sortFunction/intlDatetime.d.ts +10 -0
  525. package/plugins/columnSorting/sortFunction/intlDatetime.js +23 -0
  526. package/plugins/columnSorting/sortFunction/intlDatetime.mjs +12 -0
  527. package/plugins/columnSorting/sortService/registry.js +2 -0
  528. package/plugins/columnSorting/sortService/registry.mjs +2 -0
  529. package/plugins/columnSorting/utils.d.ts +8 -0
  530. package/plugins/columnSorting/utils.js +37 -45
  531. package/plugins/columnSorting/utils.mjs +42 -47
  532. package/plugins/columnSummary/columnSummary.js +13 -14
  533. package/plugins/columnSummary/columnSummary.mjs +13 -14
  534. package/plugins/columnSummary/endpoints.d.ts +69 -2
  535. package/plugins/columnSummary/endpoints.js +176 -29
  536. package/plugins/columnSummary/endpoints.mjs +176 -29
  537. package/plugins/comments/commentEditor.js +5 -10
  538. package/plugins/comments/commentEditor.mjs +6 -11
  539. package/plugins/comments/comments.js +5 -12
  540. package/plugins/comments/comments.mjs +5 -12
  541. package/plugins/comments/contextMenuItem/addEditComment.js +8 -19
  542. package/plugins/comments/contextMenuItem/readOnlyComment.js +8 -19
  543. package/plugins/comments/contextMenuItem/removeComment.js +8 -19
  544. package/plugins/comments/editorResizeObserver.js +5 -12
  545. package/plugins/comments/editorResizeObserver.mjs +5 -12
  546. package/plugins/contextMenu/contextMenu.d.ts +12 -1
  547. package/plugins/contextMenu/contextMenu.js +34 -15
  548. package/plugins/contextMenu/contextMenu.mjs +34 -15
  549. package/plugins/contextMenu/index.d.ts +1 -1
  550. package/plugins/contextMenu/menu/menu.d.ts +22 -1
  551. package/plugins/contextMenu/menu/menu.js +216 -15
  552. package/plugins/contextMenu/menu/menu.mjs +217 -16
  553. package/plugins/contextMenu/menu/positioner.js +4 -9
  554. package/plugins/contextMenu/menu/positioner.mjs +4 -9
  555. package/plugins/contextMenu/predefinedItems/alignment.js +22 -33
  556. package/plugins/contextMenu/predefinedItems/alignment.mjs +14 -14
  557. package/plugins/contextMenu/predefinedItems/clearColumn.js +9 -20
  558. package/plugins/contextMenu/predefinedItems/clearColumn.mjs +1 -1
  559. package/plugins/contextMenu/predefinedItems/columnLeft.js +8 -19
  560. package/plugins/contextMenu/predefinedItems/columnRight.js +8 -19
  561. package/plugins/contextMenu/predefinedItems/index.js +8 -19
  562. package/plugins/contextMenu/predefinedItems/readOnly.js +11 -22
  563. package/plugins/contextMenu/predefinedItems/readOnly.mjs +3 -3
  564. package/plugins/contextMenu/predefinedItems/redo.js +8 -19
  565. package/plugins/contextMenu/predefinedItems/removeColumn.js +8 -19
  566. package/plugins/contextMenu/predefinedItems/removeRow.js +8 -19
  567. package/plugins/contextMenu/predefinedItems/rowAbove.js +8 -19
  568. package/plugins/contextMenu/predefinedItems/rowBelow.js +8 -19
  569. package/plugins/contextMenu/predefinedItems/undo.js +8 -19
  570. package/plugins/contextMenu/utils.js +1 -1
  571. package/plugins/contextMenu/utils.mjs +1 -1
  572. package/plugins/copyPaste/contextMenuItem/cut.js +8 -19
  573. package/plugins/copyPaste/copyPaste.js +62 -20
  574. package/plugins/copyPaste/copyPaste.mjs +63 -21
  575. package/plugins/copyPaste/copyableRanges.js +11 -14
  576. package/plugins/copyPaste/copyableRanges.mjs +11 -14
  577. package/plugins/copyPaste/pasteEvent.d.ts +1 -1
  578. package/plugins/customBorders/contextMenuItem/bottom.js +8 -19
  579. package/plugins/customBorders/contextMenuItem/left.js +8 -19
  580. package/plugins/customBorders/contextMenuItem/noBorders.js +8 -19
  581. package/plugins/customBorders/contextMenuItem/right.js +8 -19
  582. package/plugins/customBorders/contextMenuItem/top.js +8 -19
  583. package/plugins/customBorders/customBorders.d.ts +21 -40
  584. package/plugins/customBorders/customBorders.js +1084 -223
  585. package/plugins/customBorders/customBorders.mjs +1078 -206
  586. package/plugins/customBorders/utils.d.ts +71 -0
  587. package/plugins/customBorders/utils.js +63 -0
  588. package/plugins/customBorders/utils.mjs +101 -0
  589. package/plugins/dataProvider/dataProvider.js +35 -38
  590. package/plugins/dataProvider/dataProvider.mjs +27 -19
  591. package/plugins/dataProvider/query/crud.js +1 -1
  592. package/plugins/dataProvider/query/crud.mjs +1 -1
  593. package/plugins/dialog/dialog.js +15 -33
  594. package/plugins/dialog/dialog.mjs +7 -14
  595. package/plugins/dialog/ui.js +5 -12
  596. package/plugins/dialog/ui.mjs +5 -12
  597. package/plugins/dragToScroll/autoScroller.js +4 -9
  598. package/plugins/dragToScroll/autoScroller.mjs +4 -9
  599. package/plugins/dragToScroll/dragToScroll.d.ts +2 -2
  600. package/plugins/dragToScroll/dragToScroll.js +155 -26
  601. package/plugins/dragToScroll/dragToScroll.mjs +156 -27
  602. package/plugins/dragToScroll/scrollTimer.js +4 -9
  603. package/plugins/dragToScroll/scrollTimer.mjs +4 -9
  604. package/plugins/dropdownMenu/dropdownMenu.d.ts +5 -1
  605. package/plugins/dropdownMenu/dropdownMenu.js +50 -15
  606. package/plugins/dropdownMenu/dropdownMenu.mjs +51 -16
  607. package/plugins/dropdownMenu/index.d.ts +1 -0
  608. package/plugins/emptyDataState/emptyDataState.js +15 -33
  609. package/plugins/emptyDataState/emptyDataState.mjs +7 -14
  610. package/plugins/emptyDataState/ui.js +4 -9
  611. package/plugins/emptyDataState/ui.mjs +4 -9
  612. package/plugins/exportFile/dataProvider.js +5 -1
  613. package/plugins/exportFile/dataProvider.mjs +5 -1
  614. package/plugins/exportFile/exportFile.js +13 -31
  615. package/plugins/exportFile/exportFile.mjs +5 -12
  616. package/plugins/exportFile/types/csv.js +1 -3
  617. package/plugins/exportFile/types/csv.mjs +1 -3
  618. package/plugins/exportFile/types/xlsx/cell-style.js +4 -2
  619. package/plugins/exportFile/types/xlsx/cell-style.mjs +4 -2
  620. package/plugins/exportFile/types/xlsx/date-utils.d.ts +15 -0
  621. package/plugins/exportFile/types/xlsx/date-utils.js +31 -0
  622. package/plugins/exportFile/types/xlsx/date-utils.mjs +36 -0
  623. package/plugins/exportFile/types/xlsx.js +10 -3
  624. package/plugins/exportFile/types/xlsx.mjs +11 -4
  625. package/plugins/filters/component/_base.d.ts +1 -2
  626. package/plugins/filters/component/_base.js +1 -2
  627. package/plugins/filters/component/_base.mjs +1 -2
  628. package/plugins/filters/component/actionBar.js +9 -22
  629. package/plugins/filters/component/actionBar.mjs +1 -3
  630. package/plugins/filters/component/condition.d.ts +1 -0
  631. package/plugins/filters/component/condition.js +11 -22
  632. package/plugins/filters/component/condition.mjs +3 -3
  633. package/plugins/filters/component/operators.js +1 -3
  634. package/plugins/filters/component/operators.mjs +1 -3
  635. package/plugins/filters/component/value.d.ts +5 -6
  636. package/plugins/filters/component/value.js +62 -56
  637. package/plugins/filters/component/value.mjs +55 -38
  638. package/plugins/filters/condition/beginsWith.js +8 -19
  639. package/plugins/filters/condition/between.js +8 -19
  640. package/plugins/filters/condition/contains.js +8 -19
  641. package/plugins/filters/condition/date/after.js +10 -20
  642. package/plugins/filters/condition/date/after.mjs +2 -1
  643. package/plugins/filters/condition/date/afterOrEqual.js +10 -20
  644. package/plugins/filters/condition/date/afterOrEqual.mjs +2 -1
  645. package/plugins/filters/condition/date/before.js +10 -20
  646. package/plugins/filters/condition/date/before.mjs +2 -1
  647. package/plugins/filters/condition/date/beforeOrEqual.js +10 -20
  648. package/plugins/filters/condition/date/beforeOrEqual.mjs +2 -1
  649. package/plugins/filters/condition/date/today.js +8 -19
  650. package/plugins/filters/condition/date/tomorrow.js +8 -19
  651. package/plugins/filters/condition/date/yesterday.js +8 -19
  652. package/plugins/filters/condition/empty.js +8 -19
  653. package/plugins/filters/condition/endsWith.js +8 -19
  654. package/plugins/filters/condition/equal.d.ts +7 -0
  655. package/plugins/filters/condition/equal.js +12 -19
  656. package/plugins/filters/condition/equal.mjs +10 -0
  657. package/plugins/filters/condition/greaterThan.js +8 -19
  658. package/plugins/filters/condition/greaterThanOrEqual.js +8 -19
  659. package/plugins/filters/condition/intlDate/after.js +8 -19
  660. package/plugins/filters/condition/intlDate/afterOrEqual.js +8 -19
  661. package/plugins/filters/condition/intlDate/before.js +8 -19
  662. package/plugins/filters/condition/intlDate/beforeOrEqual.js +8 -19
  663. package/plugins/filters/condition/intlDate/between.js +8 -19
  664. package/plugins/filters/condition/intlDate/today.js +8 -19
  665. package/plugins/filters/condition/intlDate/tomorrow.js +8 -19
  666. package/plugins/filters/condition/intlDate/yesterday.js +8 -19
  667. package/plugins/filters/condition/intlDatetime/after.d.mts +1 -0
  668. package/plugins/filters/condition/intlDatetime/after.d.ts +18 -0
  669. package/plugins/filters/condition/intlDatetime/after.js +66 -0
  670. package/plugins/filters/condition/intlDatetime/after.mjs +22 -0
  671. package/plugins/filters/condition/intlDatetime/afterOrEqual.d.mts +1 -0
  672. package/plugins/filters/condition/intlDatetime/afterOrEqual.d.ts +18 -0
  673. package/plugins/filters/condition/intlDatetime/afterOrEqual.js +66 -0
  674. package/plugins/filters/condition/intlDatetime/afterOrEqual.mjs +22 -0
  675. package/plugins/filters/condition/intlDatetime/before.d.mts +1 -0
  676. package/plugins/filters/condition/intlDatetime/before.d.ts +18 -0
  677. package/plugins/filters/condition/intlDatetime/before.js +66 -0
  678. package/plugins/filters/condition/intlDatetime/before.mjs +22 -0
  679. package/plugins/filters/condition/intlDatetime/beforeOrEqual.d.mts +1 -0
  680. package/plugins/filters/condition/intlDatetime/beforeOrEqual.d.ts +18 -0
  681. package/plugins/filters/condition/intlDatetime/beforeOrEqual.js +66 -0
  682. package/plugins/filters/condition/intlDatetime/beforeOrEqual.mjs +22 -0
  683. package/plugins/filters/condition/intlDatetime/between.d.mts +1 -0
  684. package/plugins/filters/condition/intlDatetime/between.d.ts +18 -0
  685. package/plugins/filters/condition/intlDatetime/between.js +67 -0
  686. package/plugins/filters/condition/intlDatetime/between.mjs +23 -0
  687. package/plugins/filters/condition/intlDatetime/today.d.mts +1 -0
  688. package/plugins/filters/condition/intlDatetime/today.d.ts +17 -0
  689. package/plugins/filters/condition/intlDatetime/today.js +65 -0
  690. package/plugins/filters/condition/intlDatetime/today.mjs +20 -0
  691. package/plugins/filters/condition/intlDatetime/tomorrow.d.mts +1 -0
  692. package/plugins/filters/condition/intlDatetime/tomorrow.d.ts +17 -0
  693. package/plugins/filters/condition/intlDatetime/tomorrow.js +66 -0
  694. package/plugins/filters/condition/intlDatetime/tomorrow.mjs +21 -0
  695. package/plugins/filters/condition/intlDatetime/yesterday.d.mts +1 -0
  696. package/plugins/filters/condition/intlDatetime/yesterday.d.ts +17 -0
  697. package/plugins/filters/condition/intlDatetime/yesterday.js +66 -0
  698. package/plugins/filters/condition/intlDatetime/yesterday.mjs +21 -0
  699. package/plugins/filters/condition/intlTime/after.js +8 -19
  700. package/plugins/filters/condition/intlTime/afterOrEqual.js +8 -19
  701. package/plugins/filters/condition/intlTime/before.js +8 -19
  702. package/plugins/filters/condition/intlTime/beforeOrEqual.js +8 -19
  703. package/plugins/filters/condition/intlTime/between.js +8 -19
  704. package/plugins/filters/condition/lessThan.js +8 -19
  705. package/plugins/filters/condition/lessThanOrEqual.js +8 -19
  706. package/plugins/filters/condition/none.js +8 -19
  707. package/plugins/filters/condition/notBetween.js +8 -19
  708. package/plugins/filters/condition/notContains.js +8 -19
  709. package/plugins/filters/condition/notEmpty.js +8 -19
  710. package/plugins/filters/condition/notEqual.js +8 -19
  711. package/plugins/filters/conditionCollection.js +4 -7
  712. package/plugins/filters/conditionCollection.mjs +4 -7
  713. package/plugins/filters/conditionUpdateObserver.d.ts +2 -2
  714. package/plugins/filters/conditionUpdateObserver.js +144 -52
  715. package/plugins/filters/conditionUpdateObserver.mjs +144 -52
  716. package/plugins/filters/constants.d.ts +1 -0
  717. package/plugins/filters/constants.js +31 -0
  718. package/plugins/filters/constants.mjs +28 -0
  719. package/plugins/filters/dataFilter.d.ts +4 -12
  720. package/plugins/filters/dataFilter.js +7 -19
  721. package/plugins/filters/dataFilter.mjs +8 -20
  722. package/plugins/filters/filters.d.ts +33 -9
  723. package/plugins/filters/filters.js +104 -62
  724. package/plugins/filters/filters.mjs +97 -44
  725. package/plugins/filters/logicalOperations/conjunction.js +8 -19
  726. package/plugins/filters/logicalOperations/disjunction.js +8 -19
  727. package/plugins/filters/logicalOperations/disjunctionWithExtraCondition.js +8 -19
  728. package/plugins/filters/sortComparators.d.ts +9 -2
  729. package/plugins/filters/sortComparators.js +34 -1
  730. package/plugins/filters/sortComparators.mjs +38 -3
  731. package/plugins/filters/ui/_base.js +8 -19
  732. package/plugins/filters/ui/input.d.ts +4 -0
  733. package/plugins/filters/ui/input.js +23 -18
  734. package/plugins/filters/ui/input.mjs +23 -18
  735. package/plugins/filters/ui/link.js +4 -9
  736. package/plugins/filters/ui/link.mjs +4 -9
  737. package/plugins/filters/ui/multipleSelect.js +40 -35
  738. package/plugins/filters/ui/multipleSelect.mjs +32 -16
  739. package/plugins/filters/ui/radioInput.js +4 -9
  740. package/plugins/filters/ui/radioInput.mjs +4 -9
  741. package/plugins/filters/ui/select.js +14 -32
  742. package/plugins/filters/ui/select.mjs +6 -13
  743. package/plugins/formulas/engine/register.d.ts +5 -4
  744. package/plugins/formulas/engine/register.js +5 -2
  745. package/plugins/formulas/engine/register.mjs +9 -5
  746. package/plugins/formulas/engine/settings.d.ts +2 -6
  747. package/plugins/formulas/engine/settings.js +29 -4
  748. package/plugins/formulas/engine/settings.mjs +29 -4
  749. package/plugins/formulas/engine/types.d.ts +12 -2
  750. package/plugins/formulas/formulas.d.ts +39 -0
  751. package/plugins/formulas/formulas.js +748 -55
  752. package/plugins/formulas/formulas.mjs +752 -57
  753. package/plugins/formulas/hyperlinkUrl.d.mts +1 -0
  754. package/plugins/formulas/hyperlinkUrl.d.ts +12 -0
  755. package/plugins/formulas/hyperlinkUrl.js +32 -0
  756. package/plugins/formulas/hyperlinkUrl.mjs +32 -0
  757. package/plugins/formulas/indexSyncer/axisSyncer.d.ts +1 -0
  758. package/plugins/formulas/indexSyncer/axisSyncer.js +77 -27
  759. package/plugins/formulas/indexSyncer/axisSyncer.mjs +77 -27
  760. package/plugins/formulas/indexSyncer/index.js +4 -9
  761. package/plugins/formulas/indexSyncer/index.mjs +4 -9
  762. package/plugins/formulas/utils.d.ts +9 -0
  763. package/plugins/formulas/utils.js +21 -0
  764. package/plugins/formulas/utils.mjs +25 -0
  765. package/plugins/hiddenColumns/contextMenuItem/hideColumn.js +8 -19
  766. package/plugins/hiddenColumns/contextMenuItem/showColumn.js +14 -20
  767. package/plugins/hiddenColumns/contextMenuItem/showColumn.mjs +6 -1
  768. package/plugins/hiddenColumns/hiddenColumns.js +11 -15
  769. package/plugins/hiddenColumns/hiddenColumns.mjs +11 -15
  770. package/plugins/hiddenRows/contextMenuItem/hideRow.js +8 -19
  771. package/plugins/hiddenRows/contextMenuItem/showRow.js +14 -20
  772. package/plugins/hiddenRows/contextMenuItem/showRow.mjs +6 -1
  773. package/plugins/hiddenRows/hiddenRows.js +11 -15
  774. package/plugins/hiddenRows/hiddenRows.mjs +11 -15
  775. package/plugins/index.d.ts +5 -1
  776. package/plugins/index.js +10 -0
  777. package/plugins/index.mjs +5 -1
  778. package/plugins/loading/loading.js +13 -31
  779. package/plugins/loading/loading.mjs +5 -12
  780. package/plugins/manualColumnFreeze/contextMenuItem/freezeColumn.js +8 -19
  781. package/plugins/manualColumnFreeze/contextMenuItem/unfreezeColumn.js +8 -19
  782. package/plugins/manualColumnFreeze/manualColumnFreeze.js +5 -12
  783. package/plugins/manualColumnFreeze/manualColumnFreeze.mjs +5 -12
  784. package/plugins/manualColumnMove/manualColumnMove.d.ts +10 -0
  785. package/plugins/manualColumnMove/manualColumnMove.js +128 -33
  786. package/plugins/manualColumnMove/manualColumnMove.mjs +129 -34
  787. package/plugins/manualColumnResize/manualColumnResize.d.ts +12 -1
  788. package/plugins/manualColumnResize/manualColumnResize.js +28 -17
  789. package/plugins/manualColumnResize/manualColumnResize.mjs +28 -17
  790. package/plugins/manualRowMove/manualRowMove.js +5 -12
  791. package/plugins/manualRowMove/manualRowMove.mjs +5 -12
  792. package/plugins/manualRowResize/manualRowResize.d.ts +13 -2
  793. package/plugins/manualRowResize/manualRowResize.js +29 -18
  794. package/plugins/manualRowResize/manualRowResize.mjs +29 -18
  795. package/plugins/mergeCells/cellCoords.d.ts +8 -0
  796. package/plugins/mergeCells/cellCoords.js +15 -9
  797. package/plugins/mergeCells/cellCoords.mjs +15 -9
  798. package/plugins/mergeCells/cellsCollection.d.ts +46 -2
  799. package/plugins/mergeCells/cellsCollection.js +190 -71
  800. package/plugins/mergeCells/cellsCollection.mjs +190 -71
  801. package/plugins/mergeCells/contextMenuItem/toggleMerge.js +8 -19
  802. package/plugins/mergeCells/focusOrder.d.ts +26 -20
  803. package/plugins/mergeCells/focusOrder.js +363 -189
  804. package/plugins/mergeCells/focusOrder.mjs +368 -184
  805. package/plugins/mergeCells/mergeCells.d.ts +13 -8
  806. package/plugins/mergeCells/mergeCells.js +327 -76
  807. package/plugins/mergeCells/mergeCells.mjs +327 -76
  808. package/plugins/moveCells/helpers.d.mts +1 -0
  809. package/plugins/moveCells/helpers.d.ts +21 -0
  810. package/plugins/moveCells/helpers.js +20 -0
  811. package/plugins/moveCells/helpers.mjs +15 -0
  812. package/plugins/moveCells/index.d.mts +1 -0
  813. package/plugins/moveCells/index.d.ts +1 -0
  814. package/plugins/moveCells/index.js +22 -0
  815. package/plugins/moveCells/index.mjs +1 -0
  816. package/plugins/moveCells/moveCells.d.mts +1 -0
  817. package/plugins/moveCells/moveCells.d.ts +80 -0
  818. package/plugins/moveCells/moveCells.js +595 -0
  819. package/plugins/moveCells/moveCells.mjs +580 -0
  820. package/plugins/multiColumnSorting/multiColumnSorting.d.ts +8 -8
  821. package/plugins/multiColumnSorting/multiColumnSorting.js +11 -16
  822. package/plugins/multiColumnSorting/multiColumnSorting.mjs +11 -16
  823. package/plugins/multiColumnSorting/rootComparator.js +26 -19
  824. package/plugins/multiColumnSorting/rootComparator.mjs +26 -19
  825. package/plugins/multipleSelectionHandles/multipleSelectionHandles.d.ts +19 -4
  826. package/plugins/multipleSelectionHandles/multipleSelectionHandles.js +266 -58
  827. package/plugins/multipleSelectionHandles/multipleSelectionHandles.mjs +266 -58
  828. package/plugins/nestedHeaders/nestedHeaders.d.ts +10 -1
  829. package/plugins/nestedHeaders/nestedHeaders.js +227 -35
  830. package/plugins/nestedHeaders/nestedHeaders.mjs +227 -35
  831. package/plugins/nestedHeaders/stateManager/columnArrangement.d.mts +1 -0
  832. package/plugins/nestedHeaders/stateManager/columnArrangement.d.ts +37 -0
  833. package/plugins/nestedHeaders/stateManager/columnArrangement.js +35 -0
  834. package/plugins/nestedHeaders/stateManager/columnArrangement.mjs +30 -0
  835. package/plugins/nestedHeaders/stateManager/deriveSettings.d.mts +1 -0
  836. package/plugins/nestedHeaders/stateManager/deriveSettings.d.ts +57 -0
  837. package/plugins/nestedHeaders/stateManager/deriveSettings.js +115 -0
  838. package/plugins/nestedHeaders/stateManager/deriveSettings.mjs +135 -0
  839. package/plugins/nestedHeaders/stateManager/headersTree.d.ts +14 -1
  840. package/plugins/nestedHeaders/stateManager/headersTree.js +4 -9
  841. package/plugins/nestedHeaders/stateManager/headersTree.mjs +4 -9
  842. package/plugins/nestedHeaders/stateManager/index.d.ts +76 -13
  843. package/plugins/nestedHeaders/stateManager/index.js +386 -50
  844. package/plugins/nestedHeaders/stateManager/index.mjs +387 -51
  845. package/plugins/nestedHeaders/stateManager/matrixGenerator.js +3 -2
  846. package/plugins/nestedHeaders/stateManager/matrixGenerator.mjs +3 -2
  847. package/plugins/nestedHeaders/stateManager/settingsNormalizer.js +5 -1
  848. package/plugins/nestedHeaders/stateManager/settingsNormalizer.mjs +5 -1
  849. package/plugins/nestedHeaders/stateManager/sourceSettings.d.ts +23 -6
  850. package/plugins/nestedHeaders/stateManager/sourceSettings.js +24 -13
  851. package/plugins/nestedHeaders/stateManager/sourceSettings.mjs +24 -13
  852. package/plugins/nestedHeaders/stateManager/utils.d.ts +17 -1
  853. package/plugins/nestedHeaders/stateManager/utils.js +6 -1
  854. package/plugins/nestedHeaders/stateManager/utils.mjs +6 -1
  855. package/plugins/nestedHeaders/utils/ghostTable.js +1 -3
  856. package/plugins/nestedHeaders/utils/ghostTable.mjs +1 -3
  857. package/plugins/nestedRows/data/dataManager.d.ts +4 -1
  858. package/plugins/nestedRows/data/dataManager.js +10 -4
  859. package/plugins/nestedRows/data/dataManager.mjs +10 -4
  860. package/plugins/nestedRows/nestedRows.d.ts +127 -1
  861. package/plugins/nestedRows/nestedRows.js +332 -17
  862. package/plugins/nestedRows/nestedRows.mjs +332 -17
  863. package/plugins/nestedRows/ui/collapsing.d.ts +58 -0
  864. package/plugins/nestedRows/ui/collapsing.js +234 -40
  865. package/plugins/nestedRows/ui/collapsing.mjs +234 -40
  866. package/plugins/nestedRows/ui/contextMenu.js +12 -28
  867. package/plugins/nestedRows/ui/contextMenu.mjs +4 -9
  868. package/plugins/notification/notification.js +13 -31
  869. package/plugins/notification/notification.mjs +5 -12
  870. package/plugins/notification/ui.js +4 -9
  871. package/plugins/notification/ui.mjs +4 -9
  872. package/plugins/pagination/pagination.js +7 -14
  873. package/plugins/pagination/pagination.mjs +7 -14
  874. package/plugins/pagination/ui.js +13 -31
  875. package/plugins/pagination/ui.mjs +5 -12
  876. package/plugins/search/search.js +27 -11
  877. package/plugins/search/search.mjs +27 -11
  878. package/plugins/selectionHandles/helpers.d.mts +1 -0
  879. package/plugins/selectionHandles/helpers.d.ts +17 -0
  880. package/plugins/selectionHandles/helpers.js +16 -0
  881. package/plugins/selectionHandles/helpers.mjs +11 -0
  882. package/plugins/selectionHandles/index.d.mts +1 -0
  883. package/plugins/selectionHandles/index.d.ts +1 -0
  884. package/plugins/selectionHandles/index.js +22 -0
  885. package/plugins/selectionHandles/index.mjs +1 -0
  886. package/plugins/selectionHandles/selectionHandles.d.mts +1 -0
  887. package/plugins/selectionHandles/selectionHandles.d.ts +52 -0
  888. package/plugins/selectionHandles/selectionHandles.js +335 -0
  889. package/plugins/selectionHandles/selectionHandles.mjs +316 -0
  890. package/plugins/stretchColumns/calculator.js +5 -12
  891. package/plugins/stretchColumns/calculator.mjs +5 -12
  892. package/plugins/stretchColumns/strategies/last.js +4 -9
  893. package/plugins/stretchColumns/strategies/last.mjs +4 -9
  894. package/plugins/stretchColumns/stretchColumns.js +4 -9
  895. package/plugins/stretchColumns/stretchColumns.mjs +4 -9
  896. package/plugins/touchScroll/touchScroll.js +4 -9
  897. package/plugins/touchScroll/touchScroll.mjs +4 -9
  898. package/plugins/trimRows/trimRows.d.ts +1 -1
  899. package/plugins/trimRows/trimRows.js +10 -11
  900. package/plugins/trimRows/trimRows.mjs +10 -11
  901. package/plugins/types.d.ts +4 -0
  902. package/plugins/undoRedo/actions/cellAlignment.js +1 -1
  903. package/plugins/undoRedo/actions/cellAlignment.mjs +1 -1
  904. package/plugins/undoRedo/actions/createColumn.js +4 -1
  905. package/plugins/undoRedo/actions/createColumn.mjs +4 -1
  906. package/plugins/undoRedo/actions/createRow.js +4 -1
  907. package/plugins/undoRedo/actions/createRow.mjs +4 -1
  908. package/plugins/undoRedo/actions/fixedCounts.d.mts +1 -0
  909. package/plugins/undoRedo/actions/fixedCounts.d.ts +36 -0
  910. package/plugins/undoRedo/actions/fixedCounts.js +63 -0
  911. package/plugins/undoRedo/actions/fixedCounts.mjs +62 -0
  912. package/plugins/undoRedo/actions/index.js +2 -0
  913. package/plugins/undoRedo/actions/index.mjs +2 -0
  914. package/plugins/undoRedo/actions/moveCells.d.mts +1 -0
  915. package/plugins/undoRedo/actions/moveCells.d.ts +104 -0
  916. package/plugins/undoRedo/actions/moveCells.js +225 -0
  917. package/plugins/undoRedo/actions/moveCells.mjs +227 -0
  918. package/plugins/undoRedo/actions/removeColumn.d.ts +18 -2
  919. package/plugins/undoRedo/actions/removeColumn.js +11 -4
  920. package/plugins/undoRedo/actions/removeColumn.mjs +12 -5
  921. package/plugins/undoRedo/actions/removeRow.js +2 -57
  922. package/plugins/undoRedo/actions/removeRow.mjs +2 -57
  923. package/plugins/undoRedo/undoRedo.d.ts +26 -0
  924. package/plugins/undoRedo/undoRedo.js +40 -11
  925. package/plugins/undoRedo/undoRedo.mjs +40 -11
  926. package/plugins/undoRedo/utils.d.ts +29 -0
  927. package/plugins/undoRedo/utils.js +55 -3
  928. package/plugins/undoRedo/utils.mjs +59 -0
  929. package/renderSizeProbe.d.mts +1 -0
  930. package/renderSizeProbe.d.ts +60 -0
  931. package/renderSizeProbe.js +161 -0
  932. package/renderSizeProbe.mjs +174 -0
  933. package/renderers/checkboxRenderer/checkboxRenderer.js +9 -4
  934. package/renderers/checkboxRenderer/checkboxRenderer.mjs +9 -4
  935. package/renderers/index.d.ts +3 -2
  936. package/renderers/index.js +8 -0
  937. package/renderers/index.mjs +3 -1
  938. package/renderers/intlDatetimeRenderer/index.d.mts +1 -0
  939. package/renderers/intlDatetimeRenderer/index.d.ts +1 -0
  940. package/renderers/intlDatetimeRenderer/index.js +22 -0
  941. package/renderers/intlDatetimeRenderer/index.mjs +1 -0
  942. package/renderers/intlDatetimeRenderer/intlDatetimeRenderer.d.mts +1 -0
  943. package/renderers/intlDatetimeRenderer/intlDatetimeRenderer.d.ts +26 -0
  944. package/renderers/intlDatetimeRenderer/intlDatetimeRenderer.js +82 -0
  945. package/renderers/intlDatetimeRenderer/intlDatetimeRenderer.mjs +67 -0
  946. package/renderers/multiSelectRenderer/multiSelectRenderer.js +2 -3
  947. package/renderers/multiSelectRenderer/multiSelectRenderer.mjs +2 -3
  948. package/renderers/multiSelectRenderer/utils/utils.d.ts +1 -1
  949. package/renderers/multiSelectRenderer/utils/utils.js +11 -8
  950. package/renderers/multiSelectRenderer/utils/utils.mjs +11 -8
  951. package/renderers/renderCell.d.mts +1 -0
  952. package/renderers/renderCell.d.ts +37 -0
  953. package/renderers/renderCell.js +43 -0
  954. package/renderers/renderCell.mjs +48 -0
  955. package/selection/highlight/highlight.js +1 -3
  956. package/selection/highlight/highlight.mjs +1 -3
  957. package/selection/highlight/types/areaLayered.d.ts +3 -1
  958. package/selection/highlight/types/areaLayered.js +4 -2
  959. package/selection/highlight/types/areaLayered.mjs +6 -2
  960. package/selection/highlight/types/focus.d.ts +3 -1
  961. package/selection/highlight/types/focus.js +3 -2
  962. package/selection/highlight/types/focus.mjs +5 -2
  963. package/selection/mouseEventHandler.js +29 -26
  964. package/selection/mouseEventHandler.mjs +29 -26
  965. package/selection/moveCells.d.mts +1 -0
  966. package/selection/moveCells.d.ts +15 -0
  967. package/selection/moveCells.js +13 -0
  968. package/selection/moveCells.mjs +9 -0
  969. package/selection/selection.d.ts +56 -2
  970. package/selection/selection.js +162 -36
  971. package/selection/selection.mjs +154 -17
  972. package/selection/transformation/_base.js +5 -12
  973. package/selection/transformation/_base.mjs +5 -12
  974. package/selection/types.d.ts +3 -0
  975. package/settings.d.ts +24 -3
  976. package/shortcuts/context.d.ts +4 -0
  977. package/shortcuts/context.js +16 -8
  978. package/shortcuts/context.mjs +20 -8
  979. package/shortcuts/contexts/commands/populateSelectedCellsData.js +1 -1
  980. package/shortcuts/contexts/commands/populateSelectedCellsData.mjs +1 -1
  981. package/styles/handsontable.css +504 -158
  982. package/styles/handsontable.min.css +4 -4
  983. package/styles/handsontableStyles.js +1 -1
  984. package/styles/handsontableStyles.mjs +1 -1
  985. package/styles/ht-icons-horizon.css +1 -10
  986. package/styles/ht-icons-horizon.min.css +4 -4
  987. package/styles/ht-icons-main.css +1 -10
  988. package/styles/ht-icons-main.min.css +4 -4
  989. package/styles/ht-theme-classic-no-icons.css +6 -0
  990. package/styles/ht-theme-classic-no-icons.min.css +4 -4
  991. package/styles/ht-theme-classic.css +7 -10
  992. package/styles/ht-theme-classic.min.css +4 -4
  993. package/styles/ht-theme-horizon-no-icons.css +6 -0
  994. package/styles/ht-theme-horizon-no-icons.min.css +4 -4
  995. package/styles/ht-theme-horizon.css +7 -10
  996. package/styles/ht-theme-horizon.min.css +4 -4
  997. package/styles/ht-theme-main-no-icons.css +6 -0
  998. package/styles/ht-theme-main-no-icons.min.css +4 -4
  999. package/styles/ht-theme-main.css +7 -10
  1000. package/styles/ht-theme-main.min.css +4 -4
  1001. package/tableView.d.ts +17 -4
  1002. package/tableView.js +211 -53
  1003. package/tableView.mjs +212 -54
  1004. package/themes/engine/builder.js +5 -12
  1005. package/themes/engine/builder.mjs +5 -12
  1006. package/themes/engine/index.d.ts +2 -1
  1007. package/themes/engine/index.js +3 -0
  1008. package/themes/engine/index.mjs +1 -1
  1009. package/themes/engine/manager.d.ts +75 -3
  1010. package/themes/engine/manager.js +247 -18
  1011. package/themes/engine/manager.mjs +254 -18
  1012. package/themes/engine/utils/cssVariables.d.ts +18 -1
  1013. package/themes/engine/utils/cssVariables.js +27 -11
  1014. package/themes/engine/utils/cssVariables.mjs +28 -11
  1015. package/themes/engine/utils/validation.js +7 -0
  1016. package/themes/engine/utils/validation.mjs +7 -0
  1017. package/themes/static/variables/helpers/iconsMap.js +1 -6
  1018. package/themes/static/variables/helpers/iconsMap.mjs +1 -6
  1019. package/themes/static/variables/tokens/classic.js +6 -0
  1020. package/themes/static/variables/tokens/classic.mjs +6 -0
  1021. package/themes/static/variables/tokens/horizon.js +6 -0
  1022. package/themes/static/variables/tokens/horizon.mjs +6 -0
  1023. package/themes/static/variables/tokens/main.js +6 -0
  1024. package/themes/static/variables/tokens/main.mjs +6 -0
  1025. package/themes/types.d.ts +1 -1
  1026. package/translations/changesObservable/observable.js +4 -9
  1027. package/translations/changesObservable/observable.mjs +4 -9
  1028. package/translations/changesObservable/observer.js +4 -9
  1029. package/translations/changesObservable/observer.mjs +4 -9
  1030. package/translations/indexMapper.d.ts +14 -9
  1031. package/translations/indexMapper.js +109 -49
  1032. package/translations/indexMapper.mjs +109 -49
  1033. package/translations/mapCollections/aggregatedCollection.js +20 -35
  1034. package/translations/mapCollections/aggregatedCollection.mjs +20 -35
  1035. package/translations/mapCollections/mapCollection.d.ts +10 -4
  1036. package/translations/mapCollections/mapCollection.js +2 -2
  1037. package/translations/mapCollections/mapCollection.mjs +2 -2
  1038. package/translations/maps/booleanMap.d.mts +1 -0
  1039. package/translations/maps/booleanMap.d.ts +86 -0
  1040. package/translations/maps/booleanMap.js +293 -0
  1041. package/translations/maps/booleanMap.mjs +301 -0
  1042. package/translations/maps/hidingMap.d.ts +5 -2
  1043. package/translations/maps/hidingMap.js +8 -3
  1044. package/translations/maps/hidingMap.mjs +8 -3
  1045. package/translations/maps/index.d.ts +5 -2
  1046. package/translations/maps/index.js +7 -3
  1047. package/translations/maps/index.mjs +10 -2
  1048. package/translations/maps/indexMap.d.ts +26 -2
  1049. package/translations/maps/indexMap.js +73 -6
  1050. package/translations/maps/indexMap.mjs +73 -6
  1051. package/translations/maps/indexesSequence.d.ts +53 -2
  1052. package/translations/maps/indexesSequence.js +218 -3
  1053. package/translations/maps/indexesSequence.mjs +226 -3
  1054. package/translations/maps/trimmingMap.d.ts +5 -2
  1055. package/translations/maps/trimmingMap.js +8 -3
  1056. package/translations/maps/trimmingMap.mjs +8 -3
  1057. package/translations/maps/utils/actionsOnIndexes.js +20 -1
  1058. package/translations/maps/utils/actionsOnIndexes.mjs +20 -1
  1059. package/translations/maps/utils/indexesSequence.js +12 -3
  1060. package/translations/maps/utils/indexesSequence.mjs +12 -3
  1061. package/translations/maps/utils/physicallyIndexed.js +12 -1
  1062. package/translations/maps/utils/physicallyIndexed.mjs +12 -1
  1063. package/utils/entitlementLicenseKey/classify.d.mts +1 -0
  1064. package/utils/entitlementLicenseKey/classify.d.ts +34 -0
  1065. package/utils/entitlementLicenseKey/classify.js +97 -0
  1066. package/utils/entitlementLicenseKey/classify.mjs +96 -0
  1067. package/utils/entitlementLicenseKey/constants.d.mts +1 -0
  1068. package/utils/entitlementLicenseKey/constants.d.ts +69 -0
  1069. package/utils/entitlementLicenseKey/constants.js +54 -0
  1070. package/utils/entitlementLicenseKey/constants.mjs +66 -0
  1071. package/utils/entitlementLicenseKey/detectFormat.d.mts +1 -0
  1072. package/utils/entitlementLicenseKey/detectFormat.d.ts +23 -0
  1073. package/utils/entitlementLicenseKey/detectFormat.js +60 -0
  1074. package/utils/entitlementLicenseKey/detectFormat.mjs +60 -0
  1075. package/utils/entitlementLicenseKey/encoding.d.mts +1 -0
  1076. package/utils/entitlementLicenseKey/encoding.d.ts +58 -0
  1077. package/utils/entitlementLicenseKey/encoding.js +161 -0
  1078. package/utils/entitlementLicenseKey/encoding.mjs +172 -0
  1079. package/utils/entitlementLicenseKey/extractKeyData.d.mts +1 -0
  1080. package/utils/entitlementLicenseKey/extractKeyData.d.ts +47 -0
  1081. package/utils/entitlementLicenseKey/extractKeyData.js +213 -0
  1082. package/utils/entitlementLicenseKey/extractKeyData.mjs +232 -0
  1083. package/utils/entitlementLicenseKey/grants.d.mts +1 -0
  1084. package/utils/entitlementLicenseKey/grants.d.ts +54 -0
  1085. package/utils/entitlementLicenseKey/grants.js +68 -0
  1086. package/utils/entitlementLicenseKey/grants.mjs +84 -0
  1087. package/utils/entitlementLicenseKey/index.d.mts +1 -0
  1088. package/utils/entitlementLicenseKey/index.d.ts +8 -0
  1089. package/utils/entitlementLicenseKey/index.js +53 -0
  1090. package/utils/entitlementLicenseKey/index.mjs +6 -0
  1091. package/utils/entitlementLicenseKey/sha512.d.mts +1 -0
  1092. package/utils/entitlementLicenseKey/sha512.d.ts +11 -0
  1093. package/utils/entitlementLicenseKey/sha512.js +328 -0
  1094. package/utils/entitlementLicenseKey/sha512.mjs +327 -0
  1095. package/utils/entitlementLicenseKey/types.d.mts +1 -0
  1096. package/utils/entitlementLicenseKey/types.d.ts +84 -0
  1097. package/utils/entitlementLicenseKey/types.js +8 -0
  1098. package/utils/entitlementLicenseKey/types.mjs +10 -0
  1099. package/utils/ghostTable.d.ts +1 -0
  1100. package/utils/ghostTable.js +58 -11
  1101. package/utils/ghostTable.mjs +58 -11
  1102. package/utils/interval.js +5 -12
  1103. package/utils/interval.mjs +5 -12
  1104. package/utils/licenseBranding/badge.d.mts +1 -0
  1105. package/utils/licenseBranding/badge.d.ts +21 -0
  1106. package/utils/licenseBranding/badge.js +237 -0
  1107. package/utils/licenseBranding/badge.mjs +244 -0
  1108. package/utils/licenseBranding/content.d.mts +1 -0
  1109. package/utils/licenseBranding/content.d.ts +54 -0
  1110. package/utils/licenseBranding/content.js +93 -0
  1111. package/utils/licenseBranding/content.mjs +79 -0
  1112. package/utils/licenseBranding/index.d.mts +1 -0
  1113. package/utils/licenseBranding/index.d.ts +14 -0
  1114. package/utils/licenseBranding/index.js +55 -0
  1115. package/utils/licenseBranding/index.mjs +56 -0
  1116. package/utils/licenseBranding/lockScreen.d.mts +1 -0
  1117. package/utils/licenseBranding/lockScreen.d.ts +23 -0
  1118. package/utils/licenseBranding/lockScreen.js +150 -0
  1119. package/utils/licenseBranding/lockScreen.mjs +159 -0
  1120. package/utils/licenseNotification.d.ts +19 -0
  1121. package/utils/licenseNotification.js +56 -29
  1122. package/utils/licenseNotification.mjs +61 -29
  1123. package/utils/movableMeta.d.mts +1 -0
  1124. package/utils/movableMeta.d.ts +40 -0
  1125. package/utils/movableMeta.js +47 -0
  1126. package/utils/movableMeta.mjs +46 -0
  1127. package/utils/parseTable.js +1 -1
  1128. package/utils/parseTable.mjs +1 -1
  1129. package/utils/samplesGenerator.d.ts +41 -14
  1130. package/utils/samplesGenerator.js +112 -42
  1131. package/utils/samplesGenerator.mjs +112 -42
  1132. package/utils/stylesHandler.d.ts +13 -0
  1133. package/utils/stylesHandler.js +60 -14
  1134. package/utils/stylesHandler.mjs +60 -14
  1135. package/validators/autocompleteValidator/autocompleteValidator.js +3 -0
  1136. package/validators/autocompleteValidator/autocompleteValidator.mjs +3 -0
  1137. package/validators/index.d.ts +3 -2
  1138. package/validators/index.js +8 -0
  1139. package/validators/index.mjs +3 -1
  1140. package/validators/intlDatetimeValidator/index.d.mts +1 -0
  1141. package/validators/intlDatetimeValidator/index.d.ts +1 -0
  1142. package/validators/intlDatetimeValidator/index.js +25 -0
  1143. package/validators/intlDatetimeValidator/index.mjs +1 -0
  1144. package/validators/intlDatetimeValidator/intlDatetimeValidator.d.mts +1 -0
  1145. package/validators/intlDatetimeValidator/intlDatetimeValidator.d.ts +28 -0
  1146. package/validators/intlDatetimeValidator/intlDatetimeValidator.js +49 -0
  1147. package/validators/intlDatetimeValidator/intlDatetimeValidator.mjs +37 -0
  1148. package/3rdparty/walkontable/src/overlay/bottom.d.mts +0 -1
  1149. package/3rdparty/walkontable/src/overlay/bottomInlineStartCorner.d.mts +0 -1
  1150. package/3rdparty/walkontable/src/overlay/inlineStart.d.mts +0 -1
  1151. package/3rdparty/walkontable/src/overlay/top.d.mts +0 -1
  1152. package/3rdparty/walkontable/src/overlay/topInlineStartCorner.d.mts +0 -1
  1153. package/3rdparty/walkontable/src/overlays.d.ts +0 -329
  1154. package/3rdparty/walkontable/src/overlays.js +0 -870
  1155. package/3rdparty/walkontable/src/overlays.mjs +0 -860
  1156. package/3rdparty/walkontable/src/renderer/table.d.mts +0 -1
  1157. package/3rdparty/walkontable/src/renderer/table.js +0 -229
  1158. package/3rdparty/walkontable/src/settings.d.mts +0 -2
  1159. package/3rdparty/walkontable/src/settings.js +0 -196
  1160. package/3rdparty/walkontable/src/settings.mjs +0 -263
  1161. package/3rdparty/walkontable/src/table/bottom.d.mts +0 -2
  1162. package/3rdparty/walkontable/src/table/bottom.d.ts +0 -19
  1163. package/3rdparty/walkontable/src/table/bottom.js +0 -38
  1164. package/3rdparty/walkontable/src/table/bottom.mjs +0 -23
  1165. package/3rdparty/walkontable/src/table/bottomInlineStartCorner.d.mts +0 -2
  1166. package/3rdparty/walkontable/src/table/bottomInlineStartCorner.d.ts +0 -20
  1167. package/3rdparty/walkontable/src/table/bottomInlineStartCorner.mjs +0 -24
  1168. package/3rdparty/walkontable/src/table/inlineStart.d.mts +0 -2
  1169. package/3rdparty/walkontable/src/table/inlineStart.d.ts +0 -16
  1170. package/3rdparty/walkontable/src/table/inlineStart.js +0 -35
  1171. package/3rdparty/walkontable/src/table/inlineStart.mjs +0 -20
  1172. package/3rdparty/walkontable/src/table/master.d.mts +0 -2
  1173. package/3rdparty/walkontable/src/table/mixin/calculatedColumns.d.mts +0 -2
  1174. package/3rdparty/walkontable/src/table/mixin/calculatedColumns.d.ts +0 -75
  1175. package/3rdparty/walkontable/src/table/mixin/calculatedColumns.js +0 -122
  1176. package/3rdparty/walkontable/src/table/mixin/calculatedColumns.mjs +0 -112
  1177. package/3rdparty/walkontable/src/table/mixin/calculatedRows.d.mts +0 -2
  1178. package/3rdparty/walkontable/src/table/mixin/calculatedRows.d.ts +0 -75
  1179. package/3rdparty/walkontable/src/table/mixin/calculatedRows.js +0 -122
  1180. package/3rdparty/walkontable/src/table/mixin/calculatedRows.mjs +0 -112
  1181. package/3rdparty/walkontable/src/table/top.d.mts +0 -2
  1182. package/3rdparty/walkontable/src/table/top.d.ts +0 -19
  1183. package/3rdparty/walkontable/src/table/top.js +0 -38
  1184. package/3rdparty/walkontable/src/table/top.mjs +0 -23
  1185. package/3rdparty/walkontable/src/table/topInlineStartCorner.d.mts +0 -2
  1186. package/3rdparty/walkontable/src/table/topInlineStartCorner.d.ts +0 -20
  1187. package/3rdparty/walkontable/src/table/topInlineStartCorner.mjs +0 -24
  1188. package/3rdparty/walkontable/src/table.d.mts +0 -2
  1189. package/3rdparty/walkontable/src/table.d.ts +0 -741
  1190. package/3rdparty/walkontable/src/table.js +0 -1120
  1191. package/3rdparty/walkontable/src/table.mjs +0 -1105
  1192. package/3rdparty/walkontable/src/utils/cellCoords.d.mts +0 -1
  1193. package/3rdparty/walkontable/src/utils/cellCoords.js +0 -54
  1194. package/3rdparty/walkontable/src/utils/cellCoords.mjs +0 -54
  1195. package/3rdparty/walkontable/src/utils/column.d.mts +0 -2
  1196. package/3rdparty/walkontable/src/utils/column.js +0 -75
  1197. package/3rdparty/walkontable/src/utils/column.mjs +0 -70
  1198. package/3rdparty/walkontable/src/utils/positionCache.d.mts +0 -1
  1199. package/3rdparty/walkontable/src/utils/positionCache.d.ts +0 -91
  1200. package/3rdparty/walkontable/src/utils/positionCache.js +0 -193
  1201. package/3rdparty/walkontable/src/utils/positionCache.mjs +0 -194
  1202. package/3rdparty/walkontable/src/utils/row.d.mts +0 -2
  1203. package/3rdparty/walkontable/src/utils/row.js +0 -46
  1204. package/3rdparty/walkontable/src/utils/row.mjs +0 -41
  1205. package/3rdparty/walkontable/src/viewport.d.ts +0 -254
  1206. package/3rdparty/walkontable/src/viewport.js +0 -533
  1207. package/3rdparty/walkontable/src/viewport.mjs +0 -523
  1208. /package/3rdparty/walkontable/src/{renderer → axisSizing/positionCache}/index.d.mts +0 -0
  1209. /package/3rdparty/walkontable/src/{overlays.d.mts → overlay/overlays.d.mts} +0 -0
  1210. /package/3rdparty/walkontable/src/overlay/{_base.d.mts → regions/_base.d.mts} +0 -0
  1211. /package/3rdparty/walkontable/src/{stickyScrollStrategy.d.mts → overlay/strategies/stickyScrollStrategy.d.mts} +0 -0
  1212. /package/3rdparty/walkontable/src/{renderer → render}/_base.d.mts +0 -0
  1213. /package/3rdparty/walkontable/src/{renderer → render}/_base.js +0 -0
  1214. /package/3rdparty/walkontable/src/{renderer → render}/_base.mjs +0 -0
  1215. /package/3rdparty/walkontable/src/{renderer → render}/cells.d.mts +0 -0
  1216. /package/3rdparty/walkontable/src/{renderer → render}/cells.d.ts +0 -0
  1217. /package/3rdparty/walkontable/src/{renderer → render}/colGroup.d.mts +0 -0
  1218. /package/3rdparty/walkontable/src/{renderer → render}/colGroup.d.ts +0 -0
  1219. /package/3rdparty/walkontable/src/{renderer → render}/colGroup.js +0 -0
  1220. /package/3rdparty/walkontable/src/{renderer → render}/colGroup.mjs +0 -0
  1221. /package/3rdparty/walkontable/src/{renderer → render}/columnHeaderRows.d.mts +0 -0
  1222. /package/3rdparty/walkontable/src/{renderer → render}/columnHeaderRows.d.ts +0 -0
  1223. /package/3rdparty/walkontable/src/{renderer → render}/columnHeaderRows.js +0 -0
  1224. /package/3rdparty/walkontable/src/{renderer → render}/columnHeaderRows.mjs +0 -0
  1225. /package/3rdparty/walkontable/src/{renderer → render}/columnHeaders.d.mts +0 -0
  1226. /package/3rdparty/walkontable/src/{renderer → render}/rowHeaders.d.mts +0 -0
  1227. /package/3rdparty/walkontable/src/{renderer → render}/rowHeaders.d.ts +0 -0
  1228. /package/3rdparty/walkontable/src/{renderer → render}/rowHeaders.js +0 -0
  1229. /package/3rdparty/walkontable/src/{renderer → render}/rowHeaders.mjs +0 -0
  1230. /package/3rdparty/walkontable/src/{renderer → render}/rows.d.mts +0 -0
  1231. /package/3rdparty/walkontable/src/{renderer → render}/rows.d.ts +0 -0
  1232. /package/3rdparty/walkontable/src/{scroll.d.mts → scroll/scroll.d.mts} +0 -0
  1233. /package/3rdparty/walkontable/src/table/{mixin → rangeQuery}/stickyColumnsStart.d.mts +0 -0
  1234. /package/3rdparty/walkontable/src/table/{mixin → rangeQuery}/stickyRowsBottom.d.mts +0 -0
  1235. /package/3rdparty/walkontable/src/table/{mixin → rangeQuery}/stickyRowsBottom.js +0 -0
  1236. /package/3rdparty/walkontable/src/table/{mixin → rangeQuery}/stickyRowsBottom.mjs +0 -0
  1237. /package/3rdparty/walkontable/src/table/{mixin → rangeQuery}/stickyRowsTop.d.mts +0 -0
  1238. /package/3rdparty/walkontable/src/{viewport.d.mts → viewport/viewport.d.mts} +0 -0
@@ -12,7 +12,9 @@ const _element = require("../../../../../helpers/dom/element");
12
12
  const _event = require("../../../../../helpers/dom/event");
13
13
  const _browser = require("../../../../../helpers/browser");
14
14
  const _utils = require("./utils");
15
+ const _constants = require("../constants");
15
16
  const BORDER_STYLE_CLASS_PREFIX = 'ht-border-style-';
17
+ const MOVE_ZONE_THICKNESS = 6;
16
18
  const BORDER_STYLE_VERTICAL_SUFFIX = '-vertical';
17
19
  const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
18
20
  /**
@@ -24,6 +26,11 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
24
26
  const documentBody = this.wot.rootDocument.body;
25
27
  this.eventManager.addEventListener(documentBody, 'mousedown', ()=>this.onMouseDown());
26
28
  this.eventManager.addEventListener(documentBody, 'mouseup', ()=>this.onMouseUp());
29
+ // Only the five border divs created by `createBorders` are present at this point, which is
30
+ // exactly the set that wants the fragment-selection hide-on-enter behavior. The lazily created
31
+ // `selectionHandles`/`moveCells` elements must NOT get it — `onMouseEnter` restores with an
32
+ // unconditional `display = 'block'`, which would un-hide a handle the visibility predicate
33
+ // wants hidden. Their own listeners are attached in their `create*` methods instead.
27
34
  if (this.main) {
28
35
  for(let c = 0, len = this.main.childNodes.length; c < len; c++){
29
36
  const mainNode = this.main;
@@ -59,7 +66,7 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
59
66
  event.preventDefault();
60
67
  (0, _event.stopImmediatePropagation)(event);
61
68
  const documentBody = this.wot.rootDocument.body;
62
- const bounds = parentElement.getBoundingClientRect();
69
+ const bounds = this.wot.domBindings.geometryReader.getBoundingClientRect(parentElement);
63
70
  // Hide border to prevents selection jumping when fragmentSelection is enabled.
64
71
  parentElement.style.display = 'none';
65
72
  /**
@@ -107,6 +114,13 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
107
114
  style.position = 'absolute';
108
115
  style.top = '0';
109
116
  style.left = '0';
117
+ // Custom borders can overlap (e.g. two configured ranges sharing a cell). Each EDGE is stacked by
118
+ // its own width so overlapping ranges paint deterministically - the thicker (more emphasized) edge
119
+ // consistently sits on top. Stacking per edge, not per whole border, keeps a single visual line
120
+ // uniform where it crosses a shared cell (that cell's merged border mixes a thin and a thick side).
121
+ // The `main` wrapper must NOT carry a z-index, or it would create a stacking context and trap each
122
+ // edge's z-index inside its own border instead of ordering edges across overlapping borders.
123
+ const isCustomBorder = settings.selectionType === _constants.CUSTOM_SELECTION_TYPE;
110
124
  const createdDivs = [];
111
125
  for(let i = 0; i < 5; i++){
112
126
  const position = borderDivs[i];
@@ -137,6 +151,9 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
137
151
  }
138
152
  style.height = `${getSettingsProperty('width')}px`;
139
153
  style.width = `${getSettingsProperty('width')}px`;
154
+ if (isCustomBorder) {
155
+ style.zIndex = `${getSettingsProperty('width') ?? 1}`;
156
+ }
140
157
  createdDivs.push(div);
141
158
  this.main.appendChild(div);
142
159
  }
@@ -158,9 +175,13 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
158
175
  this.cornerDefaultStyle.borderStyle,
159
176
  this.cornerDefaultStyle.borderColor
160
177
  ].join(' ');
161
- if ((0, _browser.isMobileBrowser)() && this.instance.getSetting('isDataViewInstance')) {
178
+ if ((0, _browser.isMobileBrowser)() && this.wot.getSetting('isDataViewInstance')) {
162
179
  this.createMultipleSelectorHandles();
163
180
  }
181
+ // The `selectionHandles` and `moveCells` elements are created lazily, on the first `appear()`
182
+ // whose visibility predicate resolves truthy. Creating them here would add 8 divs and their
183
+ // listeners to every border of every highlight in every overlay, for every instance — including
184
+ // the majority that leave both options off. See `appear()`.
164
185
  this.disappear();
165
186
  const { wtTable } = this.wot;
166
187
  let bordersHolder = wtTable.bordersHolder;
@@ -223,6 +244,153 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
223
244
  handleStyleTarget.background = `color-mix(in srgb, ${cellMobileHandleBackgroundColor} ${cellMobileHandleBackgroundOpacity}%, transparent)`;
224
245
  handleStyleTarget.border = `${cellMobileHandleBorderWidth}px solid ${cellMobileHandleBorderColor}`;
225
246
  }
247
+ this.main.appendChild(this.selectionHandles.top);
248
+ this.main.appendChild(this.selectionHandles.bottom);
249
+ this.main.appendChild(this.selectionHandles.topHitArea);
250
+ this.main.appendChild(this.selectionHandles.bottomHitArea);
251
+ }
252
+ /**
253
+ * Creates the four edge-adjustment handle elements used by the `selectionHandles` feature.
254
+ * Visual styling (size, background, border, border-radius, cursor, z-index) is driven entirely
255
+ * by CSS via the `--ht-cell-selection-handle-*` tokens defined in the theme stylesheets.
256
+ * JS sets only `display:none` (initial hidden state) and the positioning `top`/`left` values
257
+ * during `positionAdjustHandles`. Class names (`wtSelectionHandle--<edge>`) carry orientation.
258
+ *
259
+ * Called lazily from `appear()` on the first draw whose `adjustHandlesVisible` predicate resolves
260
+ * truthy, so the elements never exist for instances that leave `selectionHandles` off. Because
261
+ * `registerListeners` has already run by then, each handle attaches its own `mousedown` listener
262
+ * here.
263
+ *
264
+ * @returns {AdjustHandles} The created handle set, so the caller can use it without a null check.
265
+ */ createAdjustHandles() {
266
+ const { rootDocument } = this.wot;
267
+ const make = (edge)=>{
268
+ const el = rootDocument.createElement('div');
269
+ el.className = `wtSelectionHandle wtSelectionHandle--${edge}`;
270
+ el.style.display = 'none';
271
+ this.main.appendChild(el);
272
+ this.eventManager.addEventListener(el, 'mousedown', (event)=>{
273
+ // A right-press must fall through to the context menu without starting a resize drag.
274
+ if ((0, _event.isRightClick)(event)) {
275
+ return;
276
+ }
277
+ (0, _event.stopImmediatePropagation)(event);
278
+ event.preventDefault();
279
+ this.wot.getSetting('onSelectionHandleMouseDown', event, edge);
280
+ });
281
+ return el;
282
+ };
283
+ const top = make('top');
284
+ const bottom = make('bottom');
285
+ const start = make('start');
286
+ const end = make('end');
287
+ this.adjustHandles = {
288
+ top,
289
+ bottom,
290
+ start,
291
+ end,
292
+ styles: {
293
+ top: top.style,
294
+ bottom: bottom.style,
295
+ start: start.style,
296
+ end: end.style
297
+ }
298
+ };
299
+ return this.adjustHandles;
300
+ }
301
+ /**
302
+ * Creates the four edge move-zone band elements. Each band is a thin overlay div positioned along
303
+ * one selection edge. Hovering a band shows a `grab` cursor; a `mousedown` on a band calls the
304
+ * `onSelectionEdgeMouseDown` Walkontable setting so the core can initiate a move drag.
305
+ *
306
+ * Bands sit at z-index 100 — below the resize pills (z-index 115) and below the autofill fill
307
+ * handle (`.wtBorder.corner`, z-index 110), so both keep winning their own pixels in the corner
308
+ * regions where the bands overlap them. All four bands are created hidden; `positionMoveZone`
309
+ * + `appear` control their visibility.
310
+ *
311
+ * Called lazily from `appear()` on the first draw whose `moveEnabled` predicate resolves truthy,
312
+ * so the bands never exist for instances that leave `moveCells` off.
313
+ *
314
+ * @private
315
+ */ createMoveZone() {
316
+ const { rootDocument } = this.wot;
317
+ const make = (edge)=>{
318
+ const el = rootDocument.createElement('div');
319
+ el.className = 'wtMoveZone';
320
+ el.style.position = 'absolute';
321
+ el.style.display = 'none';
322
+ el.style.zIndex = '100';
323
+ el.style.pointerEvents = 'auto';
324
+ el.style.cursor = 'grab';
325
+ this.main.appendChild(el);
326
+ this.eventManager.addEventListener(el, 'mousedown', (event)=>{
327
+ // A right-press must fall through to the context menu without starting a move drag.
328
+ if ((0, _event.isRightClick)(event)) {
329
+ return;
330
+ }
331
+ (0, _event.stopImmediatePropagation)(event);
332
+ event.preventDefault();
333
+ this.wot.getSetting('onSelectionEdgeMouseDown', event, edge);
334
+ });
335
+ return el;
336
+ };
337
+ const top = make('top');
338
+ const bottom = make('bottom');
339
+ const start = make('start');
340
+ const end = make('end');
341
+ this.moveZone = {
342
+ top,
343
+ bottom,
344
+ start,
345
+ end,
346
+ styles: {
347
+ top: top.style,
348
+ bottom: bottom.style,
349
+ start: start.style,
350
+ end: end.style
351
+ }
352
+ };
353
+ }
354
+ /**
355
+ * Positions the four move-zone bands along the selection edges. Each band is `MOVE_ZONE_THICKNESS`
356
+ * pixels tall (or wide for the vertical bands) and centered on its respective edge line. RTL layout
357
+ * is handled by using `right` instead of `left` for the inline axis, mirroring `positionAdjustHandles`.
358
+ *
359
+ * @private
360
+ * @param {number} top The selection border top (px, container-relative).
361
+ * @param {number} inlineStart The selection border inline-start (px, container-relative).
362
+ * @param {number} width The selection border width (px).
363
+ * @param {number} height The selection border height (px).
364
+ */ positionMoveZone(top, inlineStart, width, height) {
365
+ const isRtl = this.wot.wtSettings.getSetting('rtlMode');
366
+ const inlineProp = isRtl ? 'right' : 'left';
367
+ // Only ever called from `appear()` after the bands have been created.
368
+ const s = this.moveZone.styles;
369
+ const half = Math.floor(MOVE_ZONE_THICKNESS / 2);
370
+ // Top band — full width, centered on the top edge.
371
+ s.top[inlineProp] = `${inlineStart}px`;
372
+ s.top.top = `${top - half}px`;
373
+ s.top.width = `${width}px`;
374
+ s.top.height = `${MOVE_ZONE_THICKNESS}px`;
375
+ s.top.display = 'block';
376
+ // Bottom band — full width, centered on the bottom edge.
377
+ s.bottom[inlineProp] = `${inlineStart}px`;
378
+ s.bottom.top = `${top + height - half}px`;
379
+ s.bottom.width = `${width}px`;
380
+ s.bottom.height = `${MOVE_ZONE_THICKNESS}px`;
381
+ s.bottom.display = 'block';
382
+ // Start band — full height, centered on the inline-start edge.
383
+ s.start[inlineProp] = `${inlineStart - half}px`;
384
+ s.start.top = `${top}px`;
385
+ s.start.width = `${MOVE_ZONE_THICKNESS}px`;
386
+ s.start.height = `${height}px`;
387
+ s.start.display = 'block';
388
+ // End band — full height, centered on the inline-end edge.
389
+ s.end[inlineProp] = `${inlineStart + width - half}px`;
390
+ s.end.top = `${top}px`;
391
+ s.end.width = `${MOVE_ZONE_THICKNESS}px`;
392
+ s.end.height = `${height}px`;
393
+ s.end.display = 'block';
226
394
  }
227
395
  /**
228
396
  * Checks if the given coordinates are south-east of the area selection. If `true` then
@@ -298,20 +466,512 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
298
466
  }
299
467
  }
300
468
  /**
469
+ * Tells whether a selection edge lands exactly on a frozen-pane boundary and is therefore owned by
470
+ * the frozen overlay. Depends only on the fixed-pane settings and the raw corner, so every overlay
471
+ * evaluates it on identical inputs.
472
+ *
473
+ * @private
474
+ * @param {'row'|'column'} axis The freeze axis to test (`row` → `fixedRowsTop`, `column` → `fixedColumnsStart`).
475
+ * @param {number} fromIndex The selection's top (`row`) or inline-start (`column`) corner index.
476
+ * @returns {boolean}
477
+ */ isFrozenBoundaryEdge(axis, fromIndex) {
478
+ if (axis === 'row') {
479
+ const fixedRowsTop = this.wot.getSetting('fixedRowsTop');
480
+ return fixedRowsTop > 0 && fromIndex === fixedRowsTop;
481
+ }
482
+ const fixedColumnsStart = this.wot.getSetting('fixedColumnsStart');
483
+ return fixedColumnsStart > 0 && fromIndex === fixedColumnsStart;
484
+ }
485
+ /**
486
+ * Tells whether a selection's bottom or end edge lands immediately before a top or start frozen pane.
487
+ *
488
+ * @private
489
+ * @param {'row'|'column'} axis The freeze axis to test.
490
+ * @param {number} toIndex The selection's bottom (`row`) or inline-end (`column`) corner index.
491
+ * @returns {boolean}
492
+ */ isFrozenStartBoundaryOppositeEdge(axis, toIndex) {
493
+ if (axis === 'row') {
494
+ const fixedRowsTop = this.wot.getSetting('fixedRowsTop');
495
+ return fixedRowsTop > 0 && toIndex === fixedRowsTop - 1;
496
+ }
497
+ const fixedColumnsStart = this.wot.getSetting('fixedColumnsStart');
498
+ return fixedColumnsStart > 0 && toIndex === fixedColumnsStart - 1;
499
+ }
500
+ /**
501
+ * Tells whether the selection's boundary corner (the cell flush with a frozen-pane line) has
502
+ * scrolled behind the frozen pane in the master viewport. The frozen overlay can't detect this
503
+ * itself (its rendered range is sticky), so we consult the scroll-aware master and stop drawing the
504
+ * edge once the cell is occluded by the pane.
505
+ *
506
+ * @private
507
+ * @param {'row'|'column'} axis The freeze axis to test (`row` → vertical, `column` → horizontal).
508
+ * @param {number} fromIndex The selection's boundary corner index on that axis.
509
+ * @returns {boolean} `true` when the boundary corner is scrolled out (edge must not be drawn).
510
+ */ isBoundaryCornerScrolledOut(axis, fromIndex) {
511
+ const masterTable = this.wot.cloneSource?.wtTable;
512
+ if (!masterTable) {
513
+ return false;
514
+ }
515
+ const firstVisible = axis === 'row' ? masterTable.getFirstVisibleRow() : masterTable.getFirstVisibleColumn();
516
+ return firstVisible >= 0 && fromIndex < firstVisible;
517
+ }
518
+ /**
519
+ * Mirror of {@link Border#isFrozenBoundaryEdge} for the bottom freeze line: tells whether the
520
+ * selection's bottom edge lands exactly on the `fixedRowsBottom` boundary (the line between the last
521
+ * non-frozen row and the first bottom-frozen row), and is therefore owned by the bottom overlay.
522
+ *
523
+ * @private
524
+ * @param {number} toIndex The selection's bottom corner row index.
525
+ * @returns {boolean}
526
+ */ isFrozenBottomBoundaryEdge(toIndex) {
527
+ const fixedRowsBottom = this.wot.getSetting('fixedRowsBottom');
528
+ const totalRows = this.wot.getSetting('totalRows');
529
+ return fixedRowsBottom > 0 && toIndex === totalRows - fixedRowsBottom - 1;
530
+ }
531
+ /**
532
+ * Mirror of {@link Border#isFrozenStartBoundaryOppositeEdge} for the bottom freeze line: tells
533
+ * whether the selection's top edge lands exactly on the `fixedRowsBottom` boundary (the selection
534
+ * starts at the first bottom-frozen row), so the top handle sits on the freeze line and must be
535
+ * suppressed there like every other frozen-seam edge.
536
+ *
537
+ * @private
538
+ * @param {number} fromIndex The selection's top corner row index.
539
+ * @returns {boolean}
540
+ */ isFrozenBottomBoundaryOppositeEdge(fromIndex) {
541
+ const fixedRowsBottom = this.wot.getSetting('fixedRowsBottom');
542
+ const totalRows = this.wot.getSetting('totalRows');
543
+ return fixedRowsBottom > 0 && fromIndex === totalRows - fixedRowsBottom;
544
+ }
545
+ /**
546
+ * Mirror of {@link Border#isBoundaryCornerScrolledOut} for the bottom freeze line: tells whether the
547
+ * selection's bottom boundary cell has scrolled behind the bottom frozen pane in the master viewport
548
+ * (it then drops below the last visible master row), so the edge must not be drawn.
549
+ *
550
+ * @private
551
+ * @param {number} toIndex The selection's bottom boundary corner row index.
552
+ * @returns {boolean} `true` when the boundary corner is scrolled out (edge must not be drawn).
553
+ */ isBottomBoundaryCornerScrolledOut(toIndex) {
554
+ const masterTable = this.wot.cloneSource?.wtTable;
555
+ if (!masterTable) {
556
+ return false;
557
+ }
558
+ const lastVisible = masterTable.getLastVisibleRow();
559
+ return lastVisible >= 0 && toIndex > lastVisible;
560
+ }
561
+ /**
562
+ * Draws the selection-border edge(s) that lie exactly on a frozen-pane boundary, where the master
563
+ * renders them on the freeze line under the occluding frozen overlay. Re-draws each such edge
564
+ * inside the frozen overlay(s) that own it (clamped to each overlay's rendered range), while
565
+ * `appear` hides the matching master edge so exactly one line is drawn per segment.
566
+ *
567
+ * @param {number[]} corners The selection corners `[fromRow, fromColumn, toRow, toColumn]`.
568
+ * @returns {boolean} `true` when a boundary edge was drawn (regular drawing should be skipped).
569
+ */ drawFrozenBoundaryEdge(corners) {
570
+ const { wtTable } = this.wot;
571
+ const overlayName = wtTable.name;
572
+ const isTopOverlay = overlayName === 'top';
573
+ const isInlineStartOverlay = overlayName === 'inline_start';
574
+ const isCornerOverlay = overlayName === 'top_inline_start_corner';
575
+ const isBottomOverlay = overlayName === 'bottom';
576
+ const isBottomCornerOverlay = overlayName === 'bottom_inline_start_corner';
577
+ if (!isTopOverlay && !isInlineStartOverlay && !isCornerOverlay && !isBottomOverlay && !isBottomCornerOverlay) {
578
+ return false;
579
+ }
580
+ // In RTL the horizontal axis is mirrored: edges are anchored with `right`, like the regular flow
581
+ // in `appear`. Row-freeze (vertical) geometry is direction-agnostic.
582
+ const isRtl = this.wot.wtSettings.getSetting('rtlMode');
583
+ const [fromRow, fromColumn, toRow, toColumn] = corners;
584
+ const borderWidth = this.settings.border?.width ?? 0;
585
+ // Along-axis length extension mirroring `appear`'s `ceil(borderWidth / 2)`, so corners meet.
586
+ // Without it the line falls short of the master's side edges for borders thicker than 1px.
587
+ const delta = Math.ceil(borderWidth / 2);
588
+ // `rowEdgeOwned`/`columnEdgeOwned` are true when the selection's top/start edge lands on the
589
+ // freeze line AND its boundary cell is still visible. Resolved once and reused by every branch
590
+ // below.
591
+ const rowEdgeOwned = this.isFrozenBoundaryEdge('row', fromRow) && !this.isBoundaryCornerScrolledOut('row', fromRow);
592
+ const columnEdgeOwned = this.isFrozenBoundaryEdge('column', fromColumn) && !this.isBoundaryCornerScrolledOut('column', fromColumn);
593
+ // The bottom-freeze counterpart of `rowEdgeOwned`: the selection's bottom edge lands on the
594
+ // `fixedRowsBottom` line and its boundary cell is still visible in the master.
595
+ const bottomRowEdgeOwned = this.isFrozenBottomBoundaryEdge(toRow) && !this.isBottomBoundaryCornerScrolledOut(toRow);
596
+ // The row-freeze edge straddles the freeze line: the master draws its lower half (below the seam)
597
+ // and the frozen overlay its upper half (above the seam, on top of the opaque pane), so together
598
+ // they show the full thickness in both selection and edit modes. Split between the `top` overlay
599
+ // (non-frozen columns) and the corner overlay (frozen columns), each clamped to its rendered range.
600
+ if (rowEdgeOwned && (isTopOverlay || isCornerOverlay)) {
601
+ const firstColumn = Math.max(fromColumn, wtTable.getFirstRenderedColumn());
602
+ const lastColumn = Math.min(toColumn, wtTable.getLastRenderedColumn());
603
+ if (this.drawRowFreezeEdge(firstColumn, lastColumn, isRtl, delta)) {
604
+ return true;
605
+ }
606
+ }
607
+ // The column-freeze edge is split between the `inline_start` overlay (non-frozen rows) and the
608
+ // top/bottom corner overlays (top-frozen / bottom-frozen rows), each clamped to its own rendered
609
+ // row range so together they cover the edge without overlap. Mirror of the row-freeze branch on
610
+ // the column axis. Without the bottom corner the slice that reaches down into the bottom-frozen
611
+ // rows would be occluded by that overlay and left undrawn.
612
+ if (columnEdgeOwned && (isInlineStartOverlay || isCornerOverlay || isBottomCornerOverlay)) {
613
+ const firstRow = Math.max(fromRow, wtTable.getFirstRenderedRow());
614
+ const lastRow = Math.min(toRow, wtTable.getLastRenderedRow());
615
+ if (this.drawColumnFreezeEdge(firstRow, lastRow, isRtl, delta)) {
616
+ return true;
617
+ }
618
+ }
619
+ // The bottom-freeze edge is split between the `bottom` overlay (non-frozen columns) and the bottom
620
+ // corner overlay (frozen columns), mirroring the row-freeze branch on the bottom axis. The bottom
621
+ // overlay occludes the master's edge on the freeze line, so re-draw it here.
622
+ if (bottomRowEdgeOwned && (isBottomOverlay || isBottomCornerOverlay)) {
623
+ const firstColumn = Math.max(fromColumn, wtTable.getFirstRenderedColumn());
624
+ const lastColumn = Math.min(toColumn, wtTable.getLastRenderedColumn());
625
+ if (this.drawRowFreezeBottomEdge(firstColumn, lastColumn, isRtl, delta)) {
626
+ return true;
627
+ }
628
+ }
629
+ // When the corner lands on BOTH freeze lines, the top and start edges meet in the frozen×frozen
630
+ // square owned by the corner overlay, which occludes both their tips and leaves a gap. Draw that
631
+ // connecting square here to close it.
632
+ if (isCornerOverlay && rowEdgeOwned && columnEdgeOwned) {
633
+ if (this.drawFrozenBoundaryCorner(isRtl, borderWidth)) {
634
+ return true;
635
+ }
636
+ }
637
+ // Bottom mirror of the branch above: when the corner lands on BOTH the bottom and column freeze
638
+ // lines, the bottom and start edges meet in the bottom corner overlay's frozen×frozen square,
639
+ // which occludes their tips. Draw that connecting square here to close the gap.
640
+ if (isBottomCornerOverlay && bottomRowEdgeOwned && columnEdgeOwned) {
641
+ if (this.drawFrozenBottomBoundaryCorner(isRtl, borderWidth)) {
642
+ return true;
643
+ }
644
+ }
645
+ return false;
646
+ }
647
+ /**
648
+ * Shared inline-axis writer for the row/bottom freeze edges. Given the boundary cells and an
649
+ * already-resolved vertical position, writes the horizontal anchor + width (RTL-aware) on the
650
+ * supplied border element and reveals it. The top and bottom freeze edges differ only in which
651
+ * gridline they sit on and which element they reuse, so they delegate the identical inline math
652
+ * here. Cheap range/cell-lookup guards run before any reflow-forcing `geometryReader.offset()`, so non-drawing
653
+ * calls leave the styles untouched.
654
+ *
655
+ * @private
656
+ * @param {number} boundaryRow The row whose edge carries the freeze line.
657
+ * @param {CSSStyleDeclaration} style The border element to position (`topStyle` or `bottomStyle`).
658
+ * @param {number} firstColumn The first column index to span (clamped to the overlay).
659
+ * @param {number} lastColumn The last column index to span (clamped to the overlay).
660
+ * @param {boolean} isRtl Whether the grid is rendered right-to-left.
661
+ * @param {number} delta The along-axis length extension (`ceil(borderWidth / 2)`).
662
+ * @param {Function} resolveTop Resolves the edge's `top` (px) from the boundary cell and offsets.
663
+ * @returns {boolean} `true` when the edge was drawn.
664
+ */ drawHorizontalFreezeEdge(boundaryRow, style, firstColumn, lastColumn, isRtl, delta, resolveTop) {
665
+ const { geometryReader } = this.wot.domBindings;
666
+ if (lastColumn < firstColumn) {
667
+ return false;
668
+ }
669
+ const { wtTable } = this.wot;
670
+ const boundaryTD = wtTable.getCell(this.wot.createCellCoords(boundaryRow, firstColumn));
671
+ const boundaryEndTD = wtTable.getCell(this.wot.createCellCoords(boundaryRow, lastColumn));
672
+ if (!(0, _element.isHTMLElement)(boundaryTD) || !(0, _element.isHTMLElement)(boundaryEndTD)) {
673
+ return false;
674
+ }
675
+ const containerOffset = geometryReader.offset(wtTable.TABLE);
676
+ const boundaryOffset = geometryReader.offset(boundaryTD);
677
+ const endOffset = geometryReader.offset(boundaryEndTD);
678
+ // The `-1` overlaps the border shared with the previous column, mirroring `appear`. At column 0
679
+ // there is no previous column, so drop the shift and shorten the line to avoid protruding past
680
+ // the pane edge.
681
+ const startShift = firstColumn === 0 ? 0 : 1;
682
+ this.disappear();
683
+ style.top = `${resolveTop(boundaryTD, boundaryOffset, containerOffset.top)}px`;
684
+ if (isRtl) {
685
+ // `firstColumn` (lowest index) is the visual-right cell, `lastColumn` the visual-left one.
686
+ const spanRightX = boundaryOffset.left + geometryReader.outerWidth(boundaryTD);
687
+ const tableRightX = containerOffset.left + geometryReader.outerWidth(wtTable.TABLE);
688
+ style.right = `${tableRightX - spanRightX - startShift}px`;
689
+ style.width = `${spanRightX - endOffset.left + delta - (1 - startShift)}px`;
690
+ } else {
691
+ style.left = `${boundaryOffset.left - containerOffset.left - startShift}px`;
692
+ const edgeWidth = endOffset.left + geometryReader.outerWidth(boundaryEndTD) - boundaryOffset.left + delta - (1 - startShift);
693
+ style.width = `${edgeWidth}px`;
694
+ }
695
+ style.display = 'block';
696
+ return true;
697
+ }
698
+ /**
699
+ * Draws the selection's top edge on the row freeze line across the given (clamped) column span,
700
+ * anchored one pixel inside the freeze line by a constant so borders of different widths line up.
701
+ *
702
+ * @private
703
+ * @param {number} firstColumn The first column index to span (clamped to the overlay).
704
+ * @param {number} lastColumn The last column index to span (clamped to the overlay).
705
+ * @param {boolean} isRtl Whether the grid is rendered right-to-left.
706
+ * @param {number} delta The along-axis length extension (`ceil(borderWidth / 2)`).
707
+ * @returns {boolean} `true` when the edge was drawn.
708
+ */ drawRowFreezeEdge(firstColumn, lastColumn, isRtl, delta) {
709
+ const boundaryRow = this.wot.getSetting('fixedRowsTop') - 1;
710
+ // The seam sits on the boundary cell's BOTTOM edge, one pixel up to overlap the shared gridline.
711
+ return this.drawHorizontalFreezeEdge(boundaryRow, this.topStyle, firstColumn, lastColumn, isRtl, delta, (boundaryTD, boundaryOffset, containerTop)=>boundaryOffset.top + this.wot.domBindings.geometryReader.outerHeight(boundaryTD) - containerTop - 1);
712
+ }
713
+ /**
714
+ * Mirror of {@link Border#drawRowFreezeEdge} for the bottom freeze line: draws the selection's
715
+ * bottom edge on the `fixedRowsBottom` line across the given (clamped) column span. The boundary
716
+ * cell is the FIRST bottom-frozen row, and the freeze line is its TOP edge (= bottom of the last
717
+ * non-frozen row). Uses the `bottom` border element.
718
+ *
719
+ * @private
720
+ * @param {number} firstColumn The first column index to span (clamped to the overlay).
721
+ * @param {number} lastColumn The last column index to span (clamped to the overlay).
722
+ * @param {boolean} isRtl Whether the grid is rendered right-to-left.
723
+ * @param {number} delta The along-axis length extension (`ceil(borderWidth / 2)`).
724
+ * @returns {boolean} `true` when the edge was drawn.
725
+ */ drawRowFreezeBottomEdge(firstColumn, lastColumn, isRtl, delta) {
726
+ const fixedRowsBottom = this.wot.getSetting('fixedRowsBottom');
727
+ const totalRows = this.wot.getSetting('totalRows');
728
+ const boundaryRow = totalRows - fixedRowsBottom;
729
+ // The freeze line is the boundary cell's TOP edge; position like `appear`'s bottom border
730
+ // (`cellBottom - thickness + delta`, where `cellBottom` is the freeze line) so borders of
731
+ // different widths stay aligned on the gridline.
732
+ return this.drawHorizontalFreezeEdge(boundaryRow, this.bottomStyle, firstColumn, lastColumn, isRtl, delta, (_boundaryTD, boundaryOffset, containerTop)=>boundaryOffset.top - containerTop - parseInt(this.bottomStyle.height, 10) + delta);
733
+ }
734
+ /**
735
+ * Draws the selection's inline-start edge on the column freeze line across the given (clamped) row
736
+ * span, anchored one pixel inside the freeze line by a constant so borders of different widths line
737
+ * up. Guard/reflow behavior mirrors `drawRowFreezeEdge`.
738
+ *
739
+ * @private
740
+ * @param {number} firstRow The first row index to span (clamped to the overlay).
741
+ * @param {number} lastRow The last row index to span (clamped to the overlay).
742
+ * @param {boolean} isRtl Whether the grid is rendered right-to-left.
743
+ * @param {number} delta The along-axis length extension (`ceil(borderWidth / 2)`).
744
+ * @returns {boolean} `true` when the edge was drawn.
745
+ */ drawColumnFreezeEdge(firstRow, lastRow, isRtl, delta) {
746
+ if (lastRow < firstRow) {
747
+ return false;
748
+ }
749
+ const { geometryReader } = this.wot.domBindings;
750
+ const { wtTable } = this.wot;
751
+ const boundaryColumn = this.wot.getSetting('fixedColumnsStart') - 1;
752
+ const boundaryTD = wtTable.getCell(this.wot.createCellCoords(firstRow, boundaryColumn));
753
+ const boundaryEndTD = wtTable.getCell(this.wot.createCellCoords(lastRow, boundaryColumn));
754
+ if (!(0, _element.isHTMLElement)(boundaryTD) || !(0, _element.isHTMLElement)(boundaryEndTD)) {
755
+ return false;
756
+ }
757
+ const containerOffset = geometryReader.offset(wtTable.TABLE);
758
+ const boundaryOffset = geometryReader.offset(boundaryTD);
759
+ const endOffset = geometryReader.offset(boundaryEndTD);
760
+ // The `-1` overlaps the border shared with the row above, like `appear`. At row 0 there is no row
761
+ // above, so drop the shift and shorten the line to avoid protruding past the pane top.
762
+ const atFirstRow = firstRow === 0;
763
+ let edgeTop = boundaryOffset.top - containerOffset.top - 1;
764
+ let edgeHeight = endOffset.top + geometryReader.outerHeight(boundaryEndTD) - boundaryOffset.top + delta;
765
+ if (atFirstRow) {
766
+ edgeTop += 1;
767
+ edgeHeight = Math.max(edgeHeight - 1, 0);
768
+ }
769
+ this.disappear();
770
+ this.startStyle.top = `${edgeTop}px`;
771
+ if (isRtl) {
772
+ // RTL: the frozen pane sits on the right, so the freeze line is the boundary cell's LEFT edge,
773
+ // and the edge is drawn one pixel inside it (to the right) via the `right` anchor.
774
+ const tableRightX = containerOffset.left + geometryReader.outerWidth(wtTable.TABLE);
775
+ this.startStyle.right = `${tableRightX - boundaryOffset.left - 1}px`;
776
+ } else {
777
+ const freezeLineX = boundaryOffset.left + geometryReader.outerWidth(boundaryTD);
778
+ this.startStyle.left = `${freezeLineX - containerOffset.left - 1}px`;
779
+ }
780
+ this.startStyle.height = `${edgeHeight}px`;
781
+ this.startStyle.display = 'block';
782
+ return true;
783
+ }
784
+ /**
785
+ * Shared writer for the freeze-corner squares. Draws the `borderWidth`-sized square bridging a
786
+ * row/bottom edge and the inline-start edge where a selection corner lands on both freeze lines,
787
+ * since that square sits in the corner overlay's frozen×frozen region that occludes both edges'
788
+ * tips. Anchored one pixel inside the freeze column; the caller resolves the vertical position and
789
+ * the border element to reuse. Reflow/guard behavior mirrors the freeze-edge helpers.
790
+ *
791
+ * @private
792
+ * @param {number} boundaryRow The row whose edge carries the freeze line.
793
+ * @param {CSSStyleDeclaration} style The border element to position (`topStyle` or `bottomStyle`).
794
+ * @param {boolean} isRtl Whether the grid is rendered right-to-left.
795
+ * @param {number} borderWidth The configured border width in pixels.
796
+ * @param {Function} resolveTop Resolves the square's `top` (px) from the boundary cell and offsets.
797
+ * @returns {boolean} `true` when the corner square was drawn.
798
+ */ drawFreezeCorner(boundaryRow, style, isRtl, borderWidth, resolveTop) {
799
+ const { geometryReader } = this.wot.domBindings;
800
+ const { wtTable } = this.wot;
801
+ const boundaryColumn = this.wot.getSetting('fixedColumnsStart') - 1;
802
+ const boundaryTD = wtTable.getCell(this.wot.createCellCoords(boundaryRow, boundaryColumn));
803
+ if (!(0, _element.isHTMLElement)(boundaryTD)) {
804
+ return false;
805
+ }
806
+ const containerOffset = geometryReader.offset(wtTable.TABLE);
807
+ const boundaryOffset = geometryReader.offset(boundaryTD);
808
+ this.disappear();
809
+ style.top = `${resolveTop(boundaryTD, boundaryOffset, containerOffset.top)}px`;
810
+ style.height = `${borderWidth}px`;
811
+ style.width = `${borderWidth}px`;
812
+ if (isRtl) {
813
+ // RTL: the frozen pane is on the right, so the freeze line is the boundary cell's LEFT edge;
814
+ // the square sits one pixel inside it (to the right) via the `right` anchor.
815
+ const tableRightX = containerOffset.left + geometryReader.outerWidth(wtTable.TABLE);
816
+ style.right = `${tableRightX - boundaryOffset.left - 1}px`;
817
+ } else {
818
+ const freezeLineX = boundaryOffset.left + geometryReader.outerWidth(boundaryTD);
819
+ style.left = `${freezeLineX - containerOffset.left - 1}px`;
820
+ }
821
+ style.display = 'block';
822
+ return true;
823
+ }
824
+ /**
825
+ * Draws the corner square bridging the top and inline-start edges where a selection corner lands on
826
+ * both the `fixedRowsTop` and `fixedColumnsStart` freeze lines. Reuses the `top` border element.
827
+ *
828
+ * @private
829
+ * @param {boolean} isRtl Whether the grid is rendered right-to-left.
830
+ * @param {number} borderWidth The configured border width in pixels.
831
+ * @returns {boolean} `true` when the corner square was drawn.
832
+ */ drawFrozenBoundaryCorner(isRtl, borderWidth) {
833
+ const boundaryRow = this.wot.getSetting('fixedRowsTop') - 1;
834
+ // The square sits on the boundary cell's BOTTOM edge (the top freeze line), one pixel up.
835
+ return this.drawFreezeCorner(boundaryRow, this.topStyle, isRtl, borderWidth, (boundaryTD, boundaryOffset, containerTop)=>boundaryOffset.top + this.wot.domBindings.geometryReader.outerHeight(boundaryTD) - containerTop - 1);
836
+ }
837
+ /**
838
+ * Bottom mirror of {@link Border#drawFrozenBoundaryCorner}: draws the corner square bridging the
839
+ * bottom and inline-start edges where a selection corner lands on both the `fixedRowsBottom` and
840
+ * `fixedColumnsStart` freeze lines. The boundary cell is the FIRST bottom-frozen row and the bottom
841
+ * freeze line is its TOP edge. Reuses the `bottom` border element.
842
+ *
843
+ * @private
844
+ * @param {boolean} isRtl Whether the grid is rendered right-to-left.
845
+ * @param {number} borderWidth The configured border width in pixels.
846
+ * @returns {boolean} `true` when the corner square was drawn.
847
+ */ drawFrozenBottomBoundaryCorner(isRtl, borderWidth) {
848
+ const fixedRowsBottom = this.wot.getSetting('fixedRowsBottom');
849
+ const totalRows = this.wot.getSetting('totalRows');
850
+ const boundaryRow = totalRows - fixedRowsBottom;
851
+ const delta = Math.ceil(borderWidth / 2);
852
+ // Align with the bottom edge's vertical position (`cellBottom - thickness + delta`, where
853
+ // `cellBottom` is the freeze line = the boundary cell's TOP edge) so it joins seamlessly.
854
+ return this.drawFreezeCorner(boundaryRow, this.bottomStyle, isRtl, borderWidth, (_boundaryTD, boundaryOffset, containerTop)=>boundaryOffset.top - containerTop - borderWidth + delta);
855
+ }
856
+ /**
857
+ * Resolves the position the fill handle's overflow checks measure from, in the same space as the
858
+ * trimming container they compare against: viewport coordinates when the window trims the grid,
859
+ * otherwise the offset inside the scrollable content.
860
+ *
861
+ * A cell's own `offsetLeft`/`offsetTop` are relative to the `<table>`, and the master shifts that
862
+ * table through the spreader by the frozen-pane size and by the first rendered column/row offset.
863
+ * That shift is missing from the cell offsets, so the handle could measure as "inside" while it
864
+ * protruded past the content edge and forced a spurious scrollbar. The hider spans the whole
865
+ * scrollable content, so measuring from it puts the shift back.
866
+ *
867
+ * @private
868
+ * @param {HTMLElement} TD The cell that carries the fill handle (the selection's bottom-end cell).
869
+ * @param {{ top: number, left: number }} TDOffset The cell's already-measured document offset.
870
+ * @param {boolean} trimToWindow Whether the grid is trimmed by the window rather than an element.
871
+ * @returns {{ top: number, left: number }}
872
+ */ getFillHandleAnchor(TD, TDOffset, trimToWindow) {
873
+ const { geometryReader } = this.wot.domBindings;
874
+ if (trimToWindow) {
875
+ const { top, left } = geometryReader.getBoundingClientRect(TD);
876
+ return {
877
+ top,
878
+ left
879
+ };
880
+ }
881
+ const hiderOffset = geometryReader.offset(this.wot.wtTable.hider);
882
+ return {
883
+ top: TDOffset.top - hiderOffset.top,
884
+ left: TDOffset.left - hiderOffset.left
885
+ };
886
+ }
887
+ /**
888
+ * Tells whether the fill handle must be pulled back inside the selection's inline-end edge instead
889
+ * of straddling it. Only the grid's last column needs that, where the overhang would spill out of
890
+ * the trimming container and force a scrollbar. A selection ending on the last frozen-start column
891
+ * does not: the frozen overlay draws that handle itself and already lands it flush against its own
892
+ * edge, which `border.spec.js` pins to the pixel — lifting it there moves it off that line.
893
+ *
894
+ * @private
895
+ * @param {number} toColumn The selection's inline-end column index.
896
+ * @param {number} anchorInlineStart The fill handle anchor's inline-start offset.
897
+ * @param {HTMLElement} TD The cell that carries the fill handle.
898
+ * @param {HTMLElement | Window} trimmingContainer The container that clips the grid.
899
+ * @param {boolean} isRtl Whether the grid renders right-to-left.
900
+ * @returns {boolean}
901
+ */ isCornerLiftedAtInlineEnd(toColumn, anchorInlineStart, TD, trimmingContainer, isRtl) {
902
+ if (toColumn !== this.wot.getSetting('totalColumns') - 1) {
903
+ return false;
904
+ }
905
+ const { geometryReader } = this.wot.domBindings;
906
+ const cornerHalfWidth = parseInt(String(this.cornerDefaultStyle.width), 10) / 2;
907
+ if (isRtl) {
908
+ return anchorInlineStart - cornerHalfWidth < 0;
909
+ }
910
+ return anchorInlineStart + geometryReader.outerWidth(TD) + cornerHalfWidth >= geometryReader.innerWidth(trimmingContainer);
911
+ }
912
+ /**
913
+ * Block-axis mirror of {@link Border#isCornerLiftedAtInlineEnd}. Two rows pull the fill handle back
914
+ * inside the selection's bottom edge: the grid's last row, where the overhang would spill out of
915
+ * the trimming container, and the last scrollable row above the `fixedRowsBottom` line, where the
916
+ * bottom overlay is painted above the master and would cover the overhang. The last frozen-top row
917
+ * is not one of them — like the frozen-start column, that handle is drawn by the overlay itself and
918
+ * already sits flush against its edge.
919
+ *
920
+ * @private
921
+ * @param {number} toRow The selection's bottom row index.
922
+ * @param {number} anchorTop The fill handle anchor's top offset.
923
+ * @param {HTMLElement} TD The cell that carries the fill handle.
924
+ * @param {HTMLElement | Window} trimmingContainer The container that clips the grid.
925
+ * @returns {boolean}
926
+ */ isCornerLiftedAtBlockEnd(toRow, anchorTop, TD, trimmingContainer) {
927
+ if (this.isFrozenBottomBoundaryEdge(toRow)) {
928
+ return true;
929
+ }
930
+ if (toRow !== this.wot.getSetting('totalRows') - 1) {
931
+ return false;
932
+ }
933
+ const { geometryReader } = this.wot.domBindings;
934
+ const cornerHalfHeight = parseInt(String(this.cornerDefaultStyle.height), 10) / 2;
935
+ return anchorTop + geometryReader.outerHeight(TD) + cornerHalfHeight >= geometryReader.innerHeight(trimmingContainer);
936
+ }
937
+ /**
301
938
  * Show border around one or many cells.
302
939
  *
940
+ * The fill handle is normally centered on the selection's bottom-end corner, so half of it hangs
941
+ * past that corner. Where that overhang cannot survive — a container edge, or a frozen pane that
942
+ * clips or covers it — the handle is pulled back inside instead, and `wtCornerInlineEndEdge` /
943
+ * `wtCornerBlockEndEdge` pull its hit area along. See {@link Border#isCornerLiftedAtInlineEnd} and
944
+ * {@link Border#isCornerLiftedAtBlockEnd} for which edges those are.
945
+ *
303
946
  * @param {Array} corners The corner coordinates.
304
947
  */ appear(corners) {
305
948
  if (this.disabled) {
306
949
  return;
307
950
  }
951
+ // A selection flush against a frozen-pane boundary has its top/inline-start edge rendered by the
952
+ // master on the freeze line, where the frozen overlay occludes it. Re-draw it inside the frozen
953
+ // overlay so it stays visible; no-op unless `fixedRowsTop`/`fixedColumnsStart` is used.
954
+ //
955
+ // When it draws, we return early and intentionally skip the rest of `appear` (corner/fill handle,
956
+ // the other edges): in these overlays the selection's cell isn't rendered here — only the seam
957
+ // edge slice is — so there is nothing else to draw.
958
+ if (this.drawFrozenBoundaryEdge(corners)) {
959
+ return;
960
+ }
308
961
  let [fromRow, fromColumn, toRow, toColumn] = corners;
962
+ // Capture the top-start corner before the clamping below mutates it — used to suppress the
963
+ // master's boundary edge (so it isn't doubled by the frozen overlay's edge).
964
+ const originalFromRow = fromRow;
965
+ const originalFromColumn = fromColumn;
966
+ const originalToRow = toRow;
967
+ const originalToColumn = toColumn;
309
968
  // borders can not be rendered on headers so hide them
310
969
  if (fromRow < 0 && toRow < 0 || fromColumn < 0 && toColumn < 0) {
311
970
  this.disappear();
312
971
  return;
313
972
  }
314
973
  const { wtTable, rootDocument, rootWindow } = this.wot;
974
+ const { geometryReader } = this.wot.domBindings;
315
975
  const isMultiple = fromRow !== toRow || fromColumn !== toColumn;
316
976
  const firstRenderedRow = wtTable.getFirstRenderedRow();
317
977
  const lastRenderedRow = wtTable.getLastRenderedRow();
@@ -347,22 +1007,22 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
347
1007
  const toTD = isMultiple ? wtTable.getCell(this.wot.createCellCoords(toRow, toColumn)) : fromTD;
348
1008
  const fromTDEl = fromTD;
349
1009
  const toTDEl = (0, _element.isHTMLElement)(toTD) ? toTD : fromTDEl;
350
- const fromOffset = (0, _element.offset)(fromTDEl);
351
- const toOffset = isMultiple ? (0, _element.offset)(toTDEl) : fromOffset;
352
- const containerOffset = (0, _element.offset)(wtTable.TABLE);
1010
+ const fromOffset = geometryReader.offset(fromTDEl);
1011
+ const toOffset = isMultiple ? geometryReader.offset(toTDEl) : fromOffset;
1012
+ const containerOffset = geometryReader.offset(wtTable.TABLE);
353
1013
  const minTop = fromOffset.top;
354
1014
  const minLeft = fromOffset.left;
355
1015
  const isRtl = this.wot.wtSettings.getSetting('rtlMode');
356
1016
  let inlineStartPos = 0;
357
1017
  let width = 0;
358
1018
  if (isRtl) {
359
- const containerWidth = (0, _element.outerWidth)(wtTable.TABLE);
360
- const fromWidth = (0, _element.outerWidth)(fromTDEl);
1019
+ const containerWidth = geometryReader.outerWidth(wtTable.TABLE);
1020
+ const fromWidth = geometryReader.outerWidth(fromTDEl);
361
1021
  const gridRightPos = rootWindow.innerWidth - containerOffset.left - containerWidth;
362
1022
  width = minLeft + fromWidth - toOffset.left;
363
1023
  inlineStartPos = rootWindow.innerWidth - minLeft - fromWidth - gridRightPos - 1;
364
1024
  } else {
365
- width = toOffset.left + (0, _element.outerWidth)(toTDEl) - minLeft;
1025
+ width = toOffset.left + geometryReader.outerWidth(toTDEl) - minLeft;
366
1026
  inlineStartPos = minLeft - containerOffset.left - 1;
367
1027
  }
368
1028
  if (this.isEntireColumnSelected(fromRow, toRow)) {
@@ -377,7 +1037,7 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
377
1037
  }
378
1038
  }
379
1039
  let top = minTop - containerOffset.top - 1;
380
- let height = toOffset.top + (0, _element.outerHeight)(toTDEl) - minTop;
1040
+ let height = toOffset.top + geometryReader.outerHeight(toTDEl) - minTop;
381
1041
  if (this.isEntireRowSelected(fromColumn, toColumn)) {
382
1042
  const columnHeader = fromColumn;
383
1043
  const modifiedValues = this.getDimensionsFromHeader('rows', fromRow, toRow, columnHeader, containerOffset);
@@ -389,7 +1049,7 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
389
1049
  fromTD = fromTH;
390
1050
  }
391
1051
  }
392
- const style = rootWindow.getComputedStyle(fromTDEl);
1052
+ const style = geometryReader.getComputedStyle(fromTDEl);
393
1053
  if (parseInt(style.borderTopWidth, 10) > 0) {
394
1054
  top += 1;
395
1055
  height = height > 0 ? height - 1 : 0;
@@ -399,23 +1059,70 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
399
1059
  width = width > 0 ? width - 1 : 0;
400
1060
  }
401
1061
  const inlinePosProperty = isRtl ? 'right' : 'left';
402
- const delta = Math.ceil((this.settings.border?.width ?? 0) / 2);
1062
+ // Corner geometry is resolved per edge rather than from a single `settings.border.width` delta,
1063
+ // which misaligns edges whose own width differs from the border-object default - e.g. a cell
1064
+ // shared by two overlapping custom-border ranges of different widths. Two distinct roles:
1065
+ // - POSITION offset (bottom `top`, end inline-start) uses the edge's OWN half-thickness, so a
1066
+ // straight run of same-width edges stays level across a shared cell.
1067
+ // - LENGTH extension (so a corner is filled) uses the PERPENDICULAR edge's half-thickness - the
1068
+ // edge it meets at that corner - so the horizontal line reaches, but does not overshoot, the
1069
+ // vertical one. Using its own half-thickness would make a thick edge stick out past a thinner
1070
+ // perpendicular edge.
1071
+ // For uniform-width borders every per-edge delta equals the old shared delta, so regular
1072
+ // selections are unaffected.
1073
+ // A corner is only filled when the perpendicular edge is actually drawn there. A horizontal edge
1074
+ // extends toward the end corner only if this cell has a visible end edge, and toward the bottom
1075
+ // only if it has a visible bottom edge. Without this, a per-cell custom border whose end/bottom
1076
+ // side is hidden (an interior or split-range edge) would still extend into the empty neighbour and
1077
+ // stick out. For regular selections the side settings are absent, so `!undefined?.hide` is `true`
1078
+ // and the extension behaves exactly as before.
1079
+ const extendToEnd = !this.settings.end?.hide;
1080
+ const extendToBottom = !this.settings.bottom?.hide;
1081
+ const bottomThickness = parseInt(this.bottomStyle.height, 10);
1082
+ const endThickness = parseInt(this.endStyle.width, 10);
1083
+ const bottomDelta = Math.ceil(bottomThickness / 2);
1084
+ const endDelta = Math.ceil(endThickness / 2);
1085
+ const horizontalExtension = extendToEnd ? endDelta : 0;
1086
+ const verticalExtension = extendToBottom ? bottomDelta : 0;
403
1087
  this.topStyle.top = `${top}px`;
404
1088
  this.topStyle[inlinePosProperty] = `${inlineStartPos}px`;
405
- this.topStyle.width = `${width + delta}px`;
1089
+ this.topStyle.width = `${width + horizontalExtension}px`;
406
1090
  this.topStyle.display = 'block';
407
1091
  this.startStyle.top = `${top}px`;
408
1092
  this.startStyle[inlinePosProperty] = `${inlineStartPos}px`;
409
- this.startStyle.height = `${height + delta}px`;
1093
+ this.startStyle.height = `${height + verticalExtension}px`;
410
1094
  this.startStyle.display = 'block';
411
- this.bottomStyle.top = `${top + height - parseInt(this.bottomStyle.height, 10) + delta}px`;
1095
+ this.bottomStyle.top = `${top + height - bottomThickness + bottomDelta}px`;
412
1096
  this.bottomStyle[inlinePosProperty] = `${inlineStartPos}px`;
413
- this.bottomStyle.width = `${width + delta}px`;
1097
+ this.bottomStyle.width = `${width + horizontalExtension}px`;
414
1098
  this.bottomStyle.display = 'block';
415
1099
  this.endStyle.top = `${top}px`;
416
- this.endStyle[inlinePosProperty] = `${inlineStartPos + width - parseInt(this.endStyle.width, 10) + delta}px`;
417
- this.endStyle.height = `${height + delta}px`;
1100
+ this.endStyle[inlinePosProperty] = `${inlineStartPos + width - endThickness + endDelta}px`;
1101
+ this.endStyle.height = `${height + verticalExtension}px`;
418
1102
  this.endStyle.display = 'block';
1103
+ // A boundary edge owned by the frozen overlay must be hidden on every other overlay that would
1104
+ // redraw it in its regular flow, so the lines don't stack into a doubled border. The row-freeze
1105
+ // edge is hidden on the master and `inline_start`; the column-freeze edge on the master and `top`.
1106
+ const overlayName = wtTable.name;
1107
+ // The master keeps drawing the seam top edge (its straddling lower half stays visible below the
1108
+ // frozen pane / editor); the frozen overlay adds the upper half on top of the pane. Only hide the
1109
+ // master when the whole selection is in frozen columns (then the inline-start pane occludes it and
1110
+ // the corner overlay owns the edge). `inline_start` always hides its row-edge duplicate.
1111
+ const seamAllFrozenCols = originalToColumn < this.wot.getSetting('fixedColumnsStart');
1112
+ if (this.isFrozenBoundaryEdge('row', originalFromRow) && (overlayName === 'inline_start' || wtTable.isMaster && seamAllFrozenCols)) {
1113
+ this.topStyle.display = 'none';
1114
+ }
1115
+ if (this.isFrozenBoundaryEdge('column', originalFromColumn) && (wtTable.isMaster || overlayName === 'top' || overlayName === 'bottom')) {
1116
+ this.startStyle.display = 'none';
1117
+ }
1118
+ // The bottom-freeze edge straddles its seam: the master draws the half above the freeze line and
1119
+ // the `bottom` overlay the half below it (on top of the opaque bottom pane), so together they show
1120
+ // the full thickness in both selection and edit modes. Hide the master only when the whole
1121
+ // selection is in frozen columns (then the inline-start pane occludes it and the bottom corner owns
1122
+ // the edge); `inline_start` always hides its duplicate.
1123
+ if (this.isFrozenBottomBoundaryEdge(originalToRow) && (overlayName === 'inline_start' || wtTable.isMaster && seamAllFrozenCols)) {
1124
+ this.bottomStyle.display = 'none';
1125
+ }
419
1126
  let cornerVisibleSetting = this.settings.border?.cornerVisible;
420
1127
  cornerVisibleSetting = typeof cornerVisibleSetting === 'function' ? cornerVisibleSetting(this.settings.layerLevel) : cornerVisibleSetting;
421
1128
  const hookResult = this.wot.getSetting('onModifyGetCellCoords', toRow, toColumn, false, 'render');
@@ -449,43 +1156,68 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
449
1156
  const cornerBorderCompensation = parseInt(String(this.cornerDefaultStyle.borderWidth), 10) - 1;
450
1157
  const cornerHalfWidth = Math.ceil(parseInt(String(this.cornerDefaultStyle.width), 10) / 2);
451
1158
  const cornerHalfHeight = Math.ceil(parseInt(String(this.cornerDefaultStyle.height), 10) / 2);
452
- if (toColumn === this.wot.getSetting('totalColumns') - 1) {
453
- const toTdOffsetLeft = trimToWindow ? toTDEl.getBoundingClientRect().left : toTDEl.offsetLeft;
454
- let cornerOverlappingContainer = false;
455
- let cornerEdge = 0;
456
- if (isRtl) {
457
- cornerEdge = toTdOffsetLeft - parseInt(String(this.cornerDefaultStyle.width), 10) / 2;
458
- cornerOverlappingContainer = cornerEdge < 0;
459
- } else {
460
- cornerEdge = toTdOffsetLeft + (0, _element.outerWidth)(toTDEl) + parseInt(String(this.cornerDefaultStyle.width), 10) / 2;
461
- cornerOverlappingContainer = cornerEdge >= (0, _element.innerWidth)(trimmingContainer);
462
- }
463
- if (cornerOverlappingContainer) {
464
- const inlineStartPosition = Math.floor(inlineStartPos + width + this.cornerCenterPointOffset - cornerHalfWidth - cornerBorderCompensation);
465
- (0, _element.addClass)(this.corner, 'wtCornerInlineEndEdge');
466
- this.cornerStyle[inlinePosProperty] = `${inlineStartPosition - 1}px`;
467
- }
1159
+ const fillHandleAnchor = this.getFillHandleAnchor(toTDEl, toOffset, trimToWindow);
1160
+ const liftsAtInlineEnd = this.isCornerLiftedAtInlineEnd(toColumn, fillHandleAnchor.left, toTDEl, trimmingContainer, isRtl);
1161
+ if (liftsAtInlineEnd) {
1162
+ const inlineStartPosition = Math.floor(inlineStartPos + width + this.cornerCenterPointOffset - cornerHalfWidth - cornerBorderCompensation);
1163
+ (0, _element.addClass)(this.corner, 'wtCornerInlineEndEdge');
1164
+ this.cornerStyle[inlinePosProperty] = `${inlineStartPosition - 1}px`;
468
1165
  } else {
469
1166
  (0, _element.removeClass)(this.corner, 'wtCornerInlineEndEdge');
470
1167
  }
471
- if (toRow === this.wot.getSetting('totalRows') - 1) {
472
- const toTdOffsetTop = trimToWindow ? toTDEl.getBoundingClientRect().top : toTDEl.offsetTop;
473
- const cornerHalfHeight = parseInt(String(this.cornerDefaultStyle.height), 10) / 2;
474
- const cornerBottomEdge = toTdOffsetTop + (0, _element.outerHeight)(toTDEl) + cornerHalfHeight;
475
- const cornerOverlappingContainer = cornerBottomEdge >= (0, _element.innerHeight)(trimmingContainer);
476
- if (cornerOverlappingContainer) {
477
- const cornerTopPosition = Math.floor(top + height + this.cornerCenterPointOffset - cornerHalfHeight - cornerBorderCompensation);
478
- (0, _element.addClass)(this.corner, 'wtCornerBlockEndEdge');
479
- this.cornerStyle.top = `${cornerTopPosition - 1}px`;
480
- }
1168
+ const liftsAtBlockEnd = this.isCornerLiftedAtBlockEnd(toRow, fillHandleAnchor.top, toTDEl, trimmingContainer);
1169
+ if (liftsAtBlockEnd) {
1170
+ const cornerTopPosition = Math.floor(top + height + this.cornerCenterPointOffset - cornerHalfHeight - cornerBorderCompensation);
1171
+ (0, _element.addClass)(this.corner, 'wtCornerBlockEndEdge');
1172
+ this.cornerStyle.top = `${cornerTopPosition - 1}px`;
481
1173
  } else {
482
1174
  (0, _element.removeClass)(this.corner, 'wtCornerBlockEndEdge');
483
1175
  }
484
1176
  this.cornerStyle.display = 'block';
485
1177
  }
486
- if ((0, _browser.isMobileBrowser)() && this.instance.getSetting('isDataViewInstance')) {
1178
+ if ((0, _browser.isMobileBrowser)() && this.wot.getSetting('isDataViewInstance')) {
487
1179
  this.updateMultipleSelectionHandlesPosition(toRow, toColumn, top, inlineStartPos, width, height);
488
1180
  }
1181
+ let adjustVisible = this.settings.border?.adjustHandlesVisible;
1182
+ adjustVisible = typeof adjustVisible === 'function' ? adjustVisible(this.settings.layerLevel) : adjustVisible;
1183
+ if (!(0, _browser.isMobileBrowser)() && adjustVisible && this.wot.getSetting('isDataViewInstance')) {
1184
+ const adjustHandles = this.adjustHandles ?? this.createAdjustHandles();
1185
+ this.positionAdjustHandles(top, inlineStartPos, width, height, corners);
1186
+ // Hide handles on an edge that lands on a frozen-pane line. This boundary rule is
1187
+ // intentionally Walkontable-local: Walkontable cannot import core helpers, so the
1188
+ // matching core-side check was removed as dead code — this is the single
1189
+ // authoritative enforcement point.
1190
+ if (this.isFrozenBoundaryEdge('row', corners[0]) || this.isFrozenBottomBoundaryOppositeEdge(corners[0])) {
1191
+ adjustHandles.styles.top.display = 'none';
1192
+ }
1193
+ if (this.isFrozenBoundaryEdge('column', corners[1])) {
1194
+ adjustHandles.styles.start.display = 'none';
1195
+ }
1196
+ if (this.isFrozenStartBoundaryOppositeEdge('row', corners[2]) || this.isFrozenBottomBoundaryEdge(corners[2])) {
1197
+ adjustHandles.styles.bottom.display = 'none';
1198
+ }
1199
+ if (this.isFrozenStartBoundaryOppositeEdge('column', corners[3])) {
1200
+ adjustHandles.styles.end.display = 'none';
1201
+ }
1202
+ } else if (this.adjustHandles) {
1203
+ this.adjustHandles.styles.top.display = 'none';
1204
+ this.adjustHandles.styles.bottom.display = 'none';
1205
+ this.adjustHandles.styles.start.display = 'none';
1206
+ this.adjustHandles.styles.end.display = 'none';
1207
+ }
1208
+ let moveEnabled = this.settings.border?.moveEnabled;
1209
+ moveEnabled = typeof moveEnabled === 'function' ? moveEnabled(this.settings.layerLevel) : moveEnabled;
1210
+ if (!(0, _browser.isMobileBrowser)() && moveEnabled && this.wot.getSetting('isDataViewInstance')) {
1211
+ if (!this.moveZone) {
1212
+ this.createMoveZone();
1213
+ }
1214
+ this.positionMoveZone(top, inlineStartPos, width, height);
1215
+ } else if (this.moveZone) {
1216
+ this.moveZone.styles.top.display = 'none';
1217
+ this.moveZone.styles.bottom.display = 'none';
1218
+ this.moveZone.styles.start.display = 'none';
1219
+ this.moveZone.styles.end.display = 'none';
1220
+ }
489
1221
  }
490
1222
  /**
491
1223
  * Check whether an entire column of cells is selected.
@@ -518,6 +1250,7 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
518
1250
  * @param {number} containerOffset Offset of the container.
519
1251
  * @returns {Array|boolean} Returns an array of [headerElement, left, width] or [headerElement, top, height], depending on `direction` (`false` in case of an error getting the headers).
520
1252
  */ getDimensionsFromHeader(direction, fromIndex, toIndex, headerIndex, containerOffset) {
1253
+ const { geometryReader } = this.wot.domBindings;
521
1254
  const { wtTable } = this.wot;
522
1255
  const rootHotElement = wtTable.wtRootElement.parentNode;
523
1256
  let getHeaderFn = null;
@@ -531,13 +1264,13 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
531
1264
  switch(direction){
532
1265
  case 'rows':
533
1266
  getHeaderFn = (...args)=>wtTable.getRowHeader(args[0], args[1]);
534
- dimensionFn = (el)=>(0, _element.outerHeight)(el);
1267
+ dimensionFn = (el)=>geometryReader.outerHeight(el);
535
1268
  entireSelectionClassname = 'ht__selection--rows';
536
1269
  dimensionProperty = 'top';
537
1270
  break;
538
1271
  case 'columns':
539
1272
  getHeaderFn = (...args)=>wtTable.getColumnHeader(args[0], args[1]);
540
- dimensionFn = (el)=>(0, _element.outerWidth)(el);
1273
+ dimensionFn = (el)=>geometryReader.outerWidth(el);
541
1274
  entireSelectionClassname = 'ht__selection--columns';
542
1275
  dimensionProperty = 'left';
543
1276
  break;
@@ -550,8 +1283,8 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
550
1283
  if (!startHeader || !endHeader) {
551
1284
  return false;
552
1285
  }
553
- const startHeaderOffset = (0, _element.offset)(startHeader);
554
- const endOffset = (0, _element.offset)(endHeader);
1286
+ const startHeaderOffset = geometryReader.offset(startHeader);
1287
+ const endOffset = geometryReader.offset(endHeader);
555
1288
  const startOff = startHeaderOffset[dimensionProperty];
556
1289
  const endOff = endOffset[dimensionProperty];
557
1290
  const contOff = containerOffset[dimensionProperty];
@@ -566,6 +1299,72 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
566
1299
  return false;
567
1300
  }
568
1301
  /**
1302
+ * Positions the four edge-adjustment handles at the midpoint of each edge, hiding any handle
1303
+ * whose edge is flush with the grid boundary. Called at the end of `appear()` when the
1304
+ * `selectionHandles` feature is enabled for this highlight.
1305
+ *
1306
+ * Handle dimensions are sourced from the `--ht-cell-selection-handle-size` and
1307
+ * `--ht-cell-selection-handle-length` CSS tokens via a cached stylesHandler read
1308
+ * (no layout-forcing DOM access). Top/bottom handles are horizontal pills
1309
+ * (width = length, height = size); start/end handles are vertical pills (width = size, height = length).
1310
+ *
1311
+ * @private
1312
+ * @param {number} top The selection border top (px, container-relative).
1313
+ * @param {number} inlineStart The selection border inline-start (px, container-relative).
1314
+ * @param {number} width The selection border width (px).
1315
+ * @param {number} height The selection border height (px).
1316
+ * @param {number[]} corners The raw `[fromRow, fromColumn, toRow, toColumn]` visual corners.
1317
+ */ positionAdjustHandles(top, inlineStart, width, height, corners) {
1318
+ const isRtl = this.wot.wtSettings.getSetting('rtlMode');
1319
+ const inlineProp = isRtl ? 'right' : 'left';
1320
+ const [fromRow, fromColumn, toRow, toColumn] = corners;
1321
+ const lastRow = this.wot.getSetting('totalRows') - 1;
1322
+ const lastColumn = this.wot.getSetting('totalColumns') - 1;
1323
+ // Handle dimensions are read from the CSS token cache (not computed style — that would be a
1324
+ // layout-forcing read). Visual sizing lives in the stylesheet; JS reads the resolved token values.
1325
+ const stylesHandler = this.wot.wtSettings.getSetting('stylesHandler');
1326
+ const sizeRaw = stylesHandler.getCSSVariableValue('cell-selection-handle-size');
1327
+ const lengthRaw = stylesHandler.getCSSVariableValue('cell-selection-handle-length');
1328
+ const size = parseInt(sizeRaw !== null && sizeRaw !== undefined ? String(sizeRaw) : '8', 10);
1329
+ const length = parseInt(lengthRaw !== null && lengthRaw !== undefined ? String(lengthRaw) : '24', 10);
1330
+ // top/bottom handles are horizontal pills: width = length, height = size.
1331
+ const topW = length;
1332
+ const topH = size;
1333
+ const bottomW = length;
1334
+ const bottomH = size;
1335
+ // start/end handles are vertical pills: width = size, height = length.
1336
+ const startW = size;
1337
+ const startH = length;
1338
+ const endW = size;
1339
+ const endH = length;
1340
+ // Only ever called from `appear()` after the handles have been created.
1341
+ const s = this.adjustHandles.styles;
1342
+ s.top.display = 'none';
1343
+ s.bottom.display = 'none';
1344
+ s.start.display = 'none';
1345
+ s.end.display = 'none';
1346
+ if (fromRow > 0) {
1347
+ s.top[inlineProp] = `${inlineStart + Math.round(width / 2) - Math.round(topW / 2)}px`;
1348
+ s.top.top = `${top - Math.round(topH / 2)}px`;
1349
+ s.top.display = 'block';
1350
+ }
1351
+ if (toRow < lastRow) {
1352
+ s.bottom[inlineProp] = `${inlineStart + Math.round(width / 2) - Math.round(bottomW / 2)}px`;
1353
+ s.bottom.top = `${top + height - Math.round(bottomH / 2)}px`;
1354
+ s.bottom.display = 'block';
1355
+ }
1356
+ if (fromColumn > 0) {
1357
+ s.start[inlineProp] = `${inlineStart - Math.round(startW / 2)}px`;
1358
+ s.start.top = `${top + Math.round(height / 2) - Math.round(startH / 2)}px`;
1359
+ s.start.display = 'block';
1360
+ }
1361
+ if (toColumn < lastColumn) {
1362
+ s.end[inlineProp] = `${inlineStart + width - Math.round(endW / 2)}px`;
1363
+ s.end.top = `${top + Math.round(height / 2) - Math.round(endH / 2)}px`;
1364
+ s.end.display = 'block';
1365
+ }
1366
+ }
1367
+ /**
569
1368
  * Change border style.
570
1369
  *
571
1370
  * @private
@@ -628,12 +1427,24 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
628
1427
  this.startStyle.display = 'none';
629
1428
  this.endStyle.display = 'none';
630
1429
  this.cornerStyle.display = 'none';
631
- if ((0, _browser.isMobileBrowser)() && this.instance.getSetting('isDataViewInstance')) {
1430
+ if ((0, _browser.isMobileBrowser)() && this.wot.getSetting('isDataViewInstance')) {
632
1431
  this.selectionHandles.styles.top.display = 'none';
633
1432
  this.selectionHandles.styles.topHitArea.display = 'none';
634
1433
  this.selectionHandles.styles.bottom.display = 'none';
635
1434
  this.selectionHandles.styles.bottomHitArea.display = 'none';
636
1435
  }
1436
+ if (this.adjustHandles) {
1437
+ this.adjustHandles.styles.top.display = 'none';
1438
+ this.adjustHandles.styles.bottom.display = 'none';
1439
+ this.adjustHandles.styles.start.display = 'none';
1440
+ this.adjustHandles.styles.end.display = 'none';
1441
+ }
1442
+ if (this.moveZone) {
1443
+ this.moveZone.styles.top.display = 'none';
1444
+ this.moveZone.styles.bottom.display = 'none';
1445
+ this.moveZone.styles.start.display = 'none';
1446
+ this.moveZone.styles.end.display = 'none';
1447
+ }
637
1448
  }
638
1449
  /**
639
1450
  * Cleans up all the DOM state related to a Border instance. Call this prior to deleting a Border instance.
@@ -652,7 +1463,6 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
652
1463
  return;
653
1464
  }
654
1465
  this.eventManager = wotInstance.eventManager;
655
- this.instance = wotInstance;
656
1466
  this.wot = wotInstance;
657
1467
  this.settings = settings;
658
1468
  this.mouseDown = false;
@@ -665,7 +1475,7 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
665
1475
  this.bottomStyle = null;
666
1476
  this.startStyle = null;
667
1477
  this.endStyle = null;
668
- this.cornerDefaultStyle = (0, _utils.getCornerStyle)(this.instance);
1478
+ this.cornerDefaultStyle = (0, _utils.getCornerStyle)(this.wot);
669
1479
  // Offset to moving the corner to be centered relative to the grid.
670
1480
  this.cornerCenterPointOffset = -Math.ceil(parseInt(String(this.cornerDefaultStyle.width), 10) / 2);
671
1481
  this.corner = null;