handsontable 18.0.0 → 18.1.0-rc7

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