handsontable 16.1.1 → 16.2.0-next-216dbd0-20251112

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (296) hide show
  1. package/3rdparty/walkontable/src/overlays.js +1 -1
  2. package/3rdparty/walkontable/src/overlays.mjs +1 -1
  3. package/3rdparty/walkontable/src/selection/border/border.js +19 -3
  4. package/3rdparty/walkontable/src/selection/border/border.mjs +19 -3
  5. package/CHANGELOG.md +39 -0
  6. package/base.js +2 -2
  7. package/base.mjs +2 -2
  8. package/core/coordsMapper/index.js +11 -0
  9. package/core/coordsMapper/index.mjs +1 -0
  10. package/core/hooks/bucket.js +7 -1
  11. package/core/hooks/bucket.mjs +7 -1
  12. package/core/hooks/constants.js +54 -0
  13. package/core/hooks/constants.mjs +54 -0
  14. package/core/hooks/index.d.ts +6 -0
  15. package/core/index.js +10 -4
  16. package/core/index.mjs +2 -1
  17. package/core.d.ts +3 -2
  18. package/core.js +67 -26
  19. package/core.mjs +56 -15
  20. package/dataMap/metaManager/metaSchema.js +197 -20
  21. package/dataMap/metaManager/metaSchema.mjs +197 -20
  22. package/dist/handsontable.css +175 -3
  23. package/dist/handsontable.full.css +175 -3
  24. package/dist/handsontable.full.js +10864 -8426
  25. package/dist/handsontable.full.min.css +5 -4
  26. package/dist/handsontable.full.min.js +194 -193
  27. package/dist/handsontable.js +7126 -4827
  28. package/dist/handsontable.min.css +4 -4
  29. package/dist/handsontable.min.js +43 -42
  30. package/dist/languages/all.js +168 -21
  31. package/dist/languages/all.min.js +1 -1
  32. package/dist/languages/ar-AR.js +8 -1
  33. package/dist/languages/ar-AR.min.js +1 -1
  34. package/dist/languages/cs-CZ.js +8 -1
  35. package/dist/languages/cs-CZ.min.js +1 -1
  36. package/dist/languages/de-CH.js +8 -1
  37. package/dist/languages/de-CH.min.js +1 -1
  38. package/dist/languages/de-DE.js +8 -1
  39. package/dist/languages/de-DE.min.js +1 -1
  40. package/dist/languages/en-US.js +8 -1
  41. package/dist/languages/en-US.min.js +1 -1
  42. package/dist/languages/es-MX.js +8 -1
  43. package/dist/languages/es-MX.min.js +1 -1
  44. package/dist/languages/fa-IR.js +8 -1
  45. package/dist/languages/fa-IR.min.js +1 -1
  46. package/dist/languages/fr-FR.js +8 -1
  47. package/dist/languages/fr-FR.min.js +1 -1
  48. package/dist/languages/hr-HR.js +8 -1
  49. package/dist/languages/hr-HR.min.js +1 -1
  50. package/dist/languages/it-IT.js +8 -1
  51. package/dist/languages/it-IT.min.js +1 -1
  52. package/dist/languages/ja-JP.js +8 -1
  53. package/dist/languages/ja-JP.min.js +1 -1
  54. package/dist/languages/ko-KR.js +8 -1
  55. package/dist/languages/ko-KR.min.js +1 -1
  56. package/dist/languages/lv-LV.js +8 -1
  57. package/dist/languages/lv-LV.min.js +1 -1
  58. package/dist/languages/nb-NO.js +8 -1
  59. package/dist/languages/nb-NO.min.js +1 -1
  60. package/dist/languages/nl-NL.js +8 -1
  61. package/dist/languages/nl-NL.min.js +1 -1
  62. package/dist/languages/pl-PL.js +8 -1
  63. package/dist/languages/pl-PL.min.js +1 -1
  64. package/dist/languages/pt-BR.js +8 -1
  65. package/dist/languages/pt-BR.min.js +1 -1
  66. package/dist/languages/ru-RU.js +8 -1
  67. package/dist/languages/ru-RU.min.js +1 -1
  68. package/dist/languages/sr-SP.js +8 -1
  69. package/dist/languages/sr-SP.min.js +1 -1
  70. package/dist/languages/zh-CN.js +8 -1
  71. package/dist/languages/zh-CN.min.js +1 -1
  72. package/dist/languages/zh-TW.js +8 -1
  73. package/dist/languages/zh-TW.min.js +1 -1
  74. package/editors/autocompleteEditor/autocompleteEditor.js +21 -1
  75. package/editors/autocompleteEditor/autocompleteEditor.mjs +22 -2
  76. package/focusManager/constants.js +25 -0
  77. package/focusManager/constants.mjs +22 -0
  78. package/focusManager/eventListener.js +107 -0
  79. package/focusManager/eventListener.mjs +103 -0
  80. package/{focusManager.d.ts → focusManager/grid.d.ts} +1 -1
  81. package/{focusManager.js → focusManager/grid.js} +48 -17
  82. package/{focusManager.mjs → focusManager/grid.mjs} +47 -16
  83. package/focusManager/index.d.ts +2 -0
  84. package/focusManager/index.js +20 -0
  85. package/focusManager/index.mjs +20 -0
  86. package/focusManager/scope.js +133 -0
  87. package/focusManager/scope.mjs +129 -0
  88. package/focusManager/scopeManager.d.ts +19 -0
  89. package/focusManager/scopeManager.js +268 -0
  90. package/focusManager/scopeManager.mjs +263 -0
  91. package/focusManager/scopes/grid.js +120 -0
  92. package/focusManager/scopes/grid.mjs +116 -0
  93. package/focusManager/scopes/index.js +13 -0
  94. package/focusManager/scopes/index.mjs +9 -0
  95. package/{utils → focusManager/utils}/focusDetector.js +21 -31
  96. package/{utils → focusManager/utils}/focusDetector.mjs +21 -31
  97. package/focusManager/utils/utils.js +95 -0
  98. package/focusManager/utils/utils.mjs +89 -0
  99. package/helpers/dom/element.js +1 -1
  100. package/helpers/dom/element.mjs +2 -2
  101. package/helpers/dom/event.js +1 -1
  102. package/helpers/dom/event.mjs +1 -1
  103. package/helpers/mixed.js +2 -65
  104. package/helpers/mixed.mjs +2 -63
  105. package/i18n/constants.js +10 -1
  106. package/i18n/constants.mjs +10 -1
  107. package/i18n/languages/ar-AR.js +8 -1
  108. package/i18n/languages/ar-AR.mjs +8 -1
  109. package/i18n/languages/cs-CZ.js +8 -1
  110. package/i18n/languages/cs-CZ.mjs +8 -1
  111. package/i18n/languages/de-CH.js +8 -1
  112. package/i18n/languages/de-CH.mjs +8 -1
  113. package/i18n/languages/de-DE.js +8 -1
  114. package/i18n/languages/de-DE.mjs +8 -1
  115. package/i18n/languages/en-US.js +8 -1
  116. package/i18n/languages/en-US.mjs +8 -1
  117. package/i18n/languages/es-MX.js +8 -1
  118. package/i18n/languages/es-MX.mjs +8 -1
  119. package/i18n/languages/fa-IR.js +8 -1
  120. package/i18n/languages/fa-IR.mjs +8 -1
  121. package/i18n/languages/fr-FR.js +8 -1
  122. package/i18n/languages/fr-FR.mjs +8 -1
  123. package/i18n/languages/hr-HR.js +8 -1
  124. package/i18n/languages/hr-HR.mjs +8 -1
  125. package/i18n/languages/it-IT.js +8 -1
  126. package/i18n/languages/it-IT.mjs +8 -1
  127. package/i18n/languages/ja-JP.js +8 -1
  128. package/i18n/languages/ja-JP.mjs +8 -1
  129. package/i18n/languages/ko-KR.js +8 -1
  130. package/i18n/languages/ko-KR.mjs +8 -1
  131. package/i18n/languages/lv-LV.js +8 -1
  132. package/i18n/languages/lv-LV.mjs +8 -1
  133. package/i18n/languages/nb-NO.js +8 -1
  134. package/i18n/languages/nb-NO.mjs +8 -1
  135. package/i18n/languages/nl-NL.js +8 -1
  136. package/i18n/languages/nl-NL.mjs +8 -1
  137. package/i18n/languages/pl-PL.js +8 -1
  138. package/i18n/languages/pl-PL.mjs +8 -1
  139. package/i18n/languages/pt-BR.js +8 -1
  140. package/i18n/languages/pt-BR.mjs +8 -1
  141. package/i18n/languages/ru-RU.js +8 -1
  142. package/i18n/languages/ru-RU.mjs +8 -1
  143. package/i18n/languages/sr-SP.js +8 -1
  144. package/i18n/languages/sr-SP.mjs +8 -1
  145. package/i18n/languages/zh-CN.js +8 -1
  146. package/i18n/languages/zh-CN.mjs +8 -1
  147. package/i18n/languages/zh-TW.js +8 -1
  148. package/i18n/languages/zh-TW.mjs +8 -1
  149. package/index.d.ts +9 -0
  150. package/languages/all.js +168 -21
  151. package/languages/ar-AR.js +8 -1
  152. package/languages/ar-AR.mjs +8 -1
  153. package/languages/cs-CZ.js +8 -1
  154. package/languages/cs-CZ.mjs +8 -1
  155. package/languages/de-CH.js +8 -1
  156. package/languages/de-CH.mjs +8 -1
  157. package/languages/de-DE.js +8 -1
  158. package/languages/de-DE.mjs +8 -1
  159. package/languages/en-US.js +8 -1
  160. package/languages/en-US.mjs +8 -1
  161. package/languages/es-MX.js +8 -1
  162. package/languages/es-MX.mjs +8 -1
  163. package/languages/fa-IR.js +8 -1
  164. package/languages/fa-IR.mjs +8 -1
  165. package/languages/fr-FR.js +8 -1
  166. package/languages/fr-FR.mjs +8 -1
  167. package/languages/hr-HR.js +8 -1
  168. package/languages/hr-HR.mjs +8 -1
  169. package/languages/index.js +168 -21
  170. package/languages/it-IT.js +8 -1
  171. package/languages/it-IT.mjs +8 -1
  172. package/languages/ja-JP.js +8 -1
  173. package/languages/ja-JP.mjs +8 -1
  174. package/languages/ko-KR.js +8 -1
  175. package/languages/ko-KR.mjs +8 -1
  176. package/languages/lv-LV.js +8 -1
  177. package/languages/lv-LV.mjs +8 -1
  178. package/languages/nb-NO.js +8 -1
  179. package/languages/nb-NO.mjs +8 -1
  180. package/languages/nl-NL.js +8 -1
  181. package/languages/nl-NL.mjs +8 -1
  182. package/languages/pl-PL.js +8 -1
  183. package/languages/pl-PL.mjs +8 -1
  184. package/languages/pt-BR.js +8 -1
  185. package/languages/pt-BR.mjs +8 -1
  186. package/languages/ru-RU.js +8 -1
  187. package/languages/ru-RU.mjs +8 -1
  188. package/languages/sr-SP.js +8 -1
  189. package/languages/sr-SP.mjs +8 -1
  190. package/languages/zh-CN.js +8 -1
  191. package/languages/zh-CN.mjs +8 -1
  192. package/languages/zh-TW.js +8 -1
  193. package/languages/zh-TW.mjs +8 -1
  194. package/package.json +25 -7
  195. package/plugins/autoRowSize/autoRowSize.js +8 -1
  196. package/plugins/autoRowSize/autoRowSize.mjs +8 -1
  197. package/plugins/base/base.js +36 -10
  198. package/plugins/base/base.mjs +36 -10
  199. package/plugins/columnSummary/endpoints.js +13 -3
  200. package/plugins/columnSummary/endpoints.mjs +13 -3
  201. package/plugins/customBorders/customBorders.d.ts +1 -0
  202. package/plugins/customBorders/customBorders.js +32 -2
  203. package/plugins/customBorders/customBorders.mjs +32 -2
  204. package/plugins/dialog/constants.js +7 -0
  205. package/plugins/dialog/constants.mjs +4 -0
  206. package/plugins/dialog/dialog.d.ts +22 -2
  207. package/plugins/dialog/dialog.js +197 -81
  208. package/plugins/dialog/dialog.mjs +196 -81
  209. package/plugins/dialog/templates/base.js +60 -0
  210. package/plugins/dialog/templates/base.mjs +56 -0
  211. package/plugins/dialog/templates/confirm.js +106 -0
  212. package/plugins/dialog/templates/confirm.mjs +102 -0
  213. package/plugins/dialog/templates/index.js +6 -0
  214. package/plugins/dialog/templates/index.mjs +4 -0
  215. package/plugins/dialog/ui.js +125 -41
  216. package/plugins/dialog/ui.mjs +119 -35
  217. package/plugins/emptyDataState/emptyDataState.d.ts +24 -0
  218. package/plugins/emptyDataState/emptyDataState.js +526 -0
  219. package/plugins/emptyDataState/emptyDataState.mjs +521 -0
  220. package/plugins/emptyDataState/index.d.ts +1 -0
  221. package/plugins/emptyDataState/index.js +7 -0
  222. package/plugins/emptyDataState/index.mjs +1 -0
  223. package/plugins/emptyDataState/ui.js +282 -0
  224. package/plugins/emptyDataState/ui.mjs +278 -0
  225. package/plugins/filters/component/value.js +16 -1
  226. package/plugins/filters/component/value.mjs +16 -1
  227. package/plugins/filters/filters.d.ts +5 -1
  228. package/plugins/filters/filters.js +22 -1
  229. package/plugins/filters/filters.mjs +22 -1
  230. package/plugins/filters/ui/multipleSelect.js +90 -79
  231. package/plugins/filters/ui/multipleSelect.mjs +90 -79
  232. package/plugins/index.d.ts +3 -0
  233. package/plugins/index.js +3 -0
  234. package/plugins/index.mjs +3 -1
  235. package/plugins/mergeCells/utils.js +1 -5
  236. package/plugins/mergeCells/utils.mjs +1 -5
  237. package/plugins/pagination/pagination.js +37 -175
  238. package/plugins/pagination/pagination.mjs +37 -175
  239. package/plugins/pagination/strategies/autoPageSize.js +2 -2
  240. package/plugins/pagination/strategies/autoPageSize.mjs +2 -2
  241. package/plugins/pagination/ui.js +6 -10
  242. package/plugins/pagination/ui.mjs +7 -11
  243. package/plugins/stretchColumns/calculator.js +3 -1
  244. package/plugins/stretchColumns/calculator.mjs +3 -1
  245. package/plugins/undoRedo/undoRedo.js +16 -6
  246. package/plugins/undoRedo/undoRedo.mjs +16 -5
  247. package/renderers/checkboxRenderer/checkboxRenderer.js +12 -15
  248. package/renderers/checkboxRenderer/checkboxRenderer.mjs +12 -15
  249. package/selection/selection.js +1 -1
  250. package/selection/selection.mjs +1 -1
  251. package/settings.d.ts +3 -0
  252. package/shortcutContexts/commands/index.js +2 -1
  253. package/shortcutContexts/commands/index.mjs +2 -1
  254. package/shortcutContexts/commands/tabNavigation.js +51 -0
  255. package/shortcutContexts/commands/tabNavigation.mjs +48 -0
  256. package/shortcutContexts/constants.js +16 -1
  257. package/shortcutContexts/constants.mjs +16 -1
  258. package/shortcutContexts/editor.js +2 -2
  259. package/shortcutContexts/editor.mjs +3 -3
  260. package/shortcutContexts/grid.js +19 -3
  261. package/shortcutContexts/grid.mjs +20 -4
  262. package/shortcuts/manager.d.ts +1 -0
  263. package/shortcuts/manager.js +17 -2
  264. package/shortcuts/manager.mjs +17 -2
  265. package/styles/handsontable.css +192 -35
  266. package/styles/handsontable.min.css +3 -3
  267. package/styles/ht-icons-horizon.css +233 -0
  268. package/styles/ht-icons-horizon.min.css +30 -0
  269. package/styles/ht-icons-main.css +233 -0
  270. package/styles/ht-icons-main.min.css +30 -0
  271. package/styles/ht-theme-classic-no-icons.css +399 -0
  272. package/styles/ht-theme-classic-no-icons.min.css +30 -0
  273. package/styles/ht-theme-classic.css +308 -556
  274. package/styles/ht-theme-classic.min.css +3 -3
  275. package/styles/ht-theme-horizon-no-icons.css +405 -0
  276. package/styles/ht-theme-horizon-no-icons.min.css +30 -0
  277. package/styles/ht-theme-horizon.css +312 -556
  278. package/styles/ht-theme-horizon.min.css +3 -3
  279. package/styles/ht-theme-main-no-icons.css +396 -0
  280. package/styles/ht-theme-main-no-icons.min.css +30 -0
  281. package/styles/ht-theme-main.css +303 -556
  282. package/styles/ht-theme-main.min.css +3 -3
  283. package/tableView.js +23 -5
  284. package/tableView.mjs +23 -5
  285. package/utils/dataStructures/uniqueMap.js +10 -0
  286. package/utils/dataStructures/uniqueMap.mjs +10 -0
  287. package/utils/ghostTable.js +0 -3
  288. package/utils/ghostTable.mjs +0 -3
  289. package/utils/stylesHandler.js +19 -4
  290. package/utils/stylesHandler.mjs +19 -4
  291. package/core/focusCatcher/index.js +0 -131
  292. package/core/focusCatcher/index.mjs +0 -127
  293. package/core/focusCatcher/utils.js +0 -31
  294. package/core/focusCatcher/utils.mjs +0 -27
  295. package/plugins/pagination/focusController.js +0 -27
  296. package/plugins/pagination/focusController.mjs +0 -23
@@ -11,7 +11,7 @@ var _commands = require("./commands");
11
11
  * @param {Handsontable} hot The Handsontable instance.
12
12
  */
13
13
  function shortcutsGridContext(hot) {
14
- const context = hot.getShortcutManager().addContext('grid');
14
+ const context = hot.getShortcutManager().addContext(_constants.GRID_SCOPE);
15
15
  const commandsPool = (0, _commands.createKeyboardShortcutCommandsPool)(hot);
16
16
  const config = {
17
17
  runOnlyIf: () => {
@@ -168,16 +168,32 @@ function shortcutsGridContext(hot) {
168
168
  callback: () => commandsPool.extendCellsSelectionDownByViewportHeight()
169
169
  }, {
170
170
  keys: [['Tab']],
171
- // The property value is controlled by focusCatcher module (https://github.com/handsontable/handsontable/blob/master/handsontable/src/core/focusCatcher/index.js)
172
171
  preventDefault: false,
173
172
  callback: event => commandsPool.moveCellSelectionInlineStart(event)
174
173
  }, {
175
174
  keys: [['Shift', 'Tab']],
176
- // The property value is controlled by focusCatcher module (https://github.com/handsontable/handsontable/blob/master/handsontable/src/core/focusCatcher/index.js)
177
175
  preventDefault: false,
178
176
  callback: event => commandsPool.moveCellSelectionInlineEnd(event)
179
177
  }, {
180
178
  keys: [['Control/Meta', 'Backspace']],
181
179
  callback: () => commandsPool.scrollToFocusedCell()
182
180
  }], config);
181
+ const tabNavigationCommand = commandsPool.tabNavigation();
182
+ context.addShortcuts([{
183
+ keys: [['Tab'], ['Shift', 'Tab']],
184
+ preventDefault: false,
185
+ stopPropagation: false,
186
+ relativeToGroup: _constants.GRID_GROUP,
187
+ group: _constants.GRID_TAB_NAVIGATION_GROUP,
188
+ position: 'before',
189
+ callback: event => tabNavigationCommand.before(event)
190
+ }, {
191
+ keys: [['Tab'], ['Shift', 'Tab']],
192
+ preventDefault: false,
193
+ stopPropagation: false,
194
+ relativeToGroup: _constants.GRID_GROUP,
195
+ group: _constants.GRID_TAB_NAVIGATION_GROUP,
196
+ callback: event => tabNavigationCommand.after(event),
197
+ position: 'after'
198
+ }]);
183
199
  }
@@ -1,5 +1,5 @@
1
1
  import { isDefined } from "../helpers/mixed.mjs";
2
- import { GRID_GROUP, EDITOR_EDIT_GROUP } from "./constants.mjs";
2
+ import { GRID_GROUP, EDITOR_EDIT_GROUP, GRID_SCOPE, GRID_TAB_NAVIGATION_GROUP } from "./constants.mjs";
3
3
  import { createKeyboardShortcutCommandsPool } from "./commands/index.mjs";
4
4
  /**
5
5
  * The context that defines shortcut list available for selected cell or cells.
@@ -7,7 +7,7 @@ import { createKeyboardShortcutCommandsPool } from "./commands/index.mjs";
7
7
  * @param {Handsontable} hot The Handsontable instance.
8
8
  */
9
9
  export function shortcutsGridContext(hot) {
10
- const context = hot.getShortcutManager().addContext('grid');
10
+ const context = hot.getShortcutManager().addContext(GRID_SCOPE);
11
11
  const commandsPool = createKeyboardShortcutCommandsPool(hot);
12
12
  const config = {
13
13
  runOnlyIf: () => {
@@ -164,16 +164,32 @@ export function shortcutsGridContext(hot) {
164
164
  callback: () => commandsPool.extendCellsSelectionDownByViewportHeight()
165
165
  }, {
166
166
  keys: [['Tab']],
167
- // The property value is controlled by focusCatcher module (https://github.com/handsontable/handsontable/blob/master/handsontable/src/core/focusCatcher/index.js)
168
167
  preventDefault: false,
169
168
  callback: event => commandsPool.moveCellSelectionInlineStart(event)
170
169
  }, {
171
170
  keys: [['Shift', 'Tab']],
172
- // The property value is controlled by focusCatcher module (https://github.com/handsontable/handsontable/blob/master/handsontable/src/core/focusCatcher/index.js)
173
171
  preventDefault: false,
174
172
  callback: event => commandsPool.moveCellSelectionInlineEnd(event)
175
173
  }, {
176
174
  keys: [['Control/Meta', 'Backspace']],
177
175
  callback: () => commandsPool.scrollToFocusedCell()
178
176
  }], config);
177
+ const tabNavigationCommand = commandsPool.tabNavigation();
178
+ context.addShortcuts([{
179
+ keys: [['Tab'], ['Shift', 'Tab']],
180
+ preventDefault: false,
181
+ stopPropagation: false,
182
+ relativeToGroup: GRID_GROUP,
183
+ group: GRID_TAB_NAVIGATION_GROUP,
184
+ position: 'before',
185
+ callback: event => tabNavigationCommand.before(event)
186
+ }, {
187
+ keys: [['Tab'], ['Shift', 'Tab']],
188
+ preventDefault: false,
189
+ stopPropagation: false,
190
+ relativeToGroup: GRID_GROUP,
191
+ group: GRID_TAB_NAVIGATION_GROUP,
192
+ callback: event => tabNavigationCommand.after(event),
193
+ position: 'after'
194
+ }]);
179
195
  }
@@ -4,6 +4,7 @@ export interface ShortcutManager {
4
4
  addContext(contextName: string): Context;
5
5
  getActiveContextName(): string;
6
6
  getContext(contextName: string): Context | undefined;
7
+ getOrCreateContext(contextName: string): Context;
7
8
  setActiveContextName(contextName: string): void;
8
9
  isCtrlPressed(): boolean;
9
10
  destroy(): void;
@@ -74,13 +74,27 @@ const createShortcutManager = _ref => {
74
74
  * Get a keyboard shortcut context by its name.
75
75
  *
76
76
  * @memberof ShortcutManager#
77
- * @param {string} contextName The name of the shortcut context
78
- * @returns {object|undefined} A [`ShortcutContext`](@/api/shortcutContext.md) object that stores registered shortcuts
77
+ * @param {string} contextName The name of the shortcut context.
78
+ * @returns {object|undefined} A [`ShortcutContext`](@/api/shortcutContext.md) object that stores registered shortcuts.
79
79
  */
80
80
  const getContext = contextName => {
81
81
  return CONTEXTS.getItem(contextName);
82
82
  };
83
83
 
84
+ /**
85
+ * Get a keyboard shortcut context by its name, or create it if it doesn't exist.
86
+ *
87
+ * @memberof ShortcutManager#
88
+ * @param {string} contextName The name of the shortcut context
89
+ * @param {string} [scope='table'] The scope of the shortcut: `'table'` or `'global'`
90
+ * @returns {object} A [`ShortcutContext`](@/api/shortcutContext.md) object that stores registered shortcuts
91
+ */
92
+ const getOrCreateContext = function (contextName) {
93
+ var _getContext;
94
+ let scope = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'table';
95
+ return (_getContext = getContext(contextName)) !== null && _getContext !== void 0 ? _getContext : addContext(contextName, scope);
96
+ };
97
+
84
98
  /**
85
99
  * Start listening to keyboard shortcuts within a given [`ShortcutContext`](@/api/shortcutContext.md).
86
100
  *
@@ -178,6 +192,7 @@ const createShortcutManager = _ref => {
178
192
  addContext,
179
193
  getActiveContextName,
180
194
  getContext,
195
+ getOrCreateContext,
181
196
  setActiveContextName,
182
197
  /**
183
198
  * Returns whether `control` or `meta` keys are pressed.
@@ -71,13 +71,27 @@ export const createShortcutManager = _ref => {
71
71
  * Get a keyboard shortcut context by its name.
72
72
  *
73
73
  * @memberof ShortcutManager#
74
- * @param {string} contextName The name of the shortcut context
75
- * @returns {object|undefined} A [`ShortcutContext`](@/api/shortcutContext.md) object that stores registered shortcuts
74
+ * @param {string} contextName The name of the shortcut context.
75
+ * @returns {object|undefined} A [`ShortcutContext`](@/api/shortcutContext.md) object that stores registered shortcuts.
76
76
  */
77
77
  const getContext = contextName => {
78
78
  return CONTEXTS.getItem(contextName);
79
79
  };
80
80
 
81
+ /**
82
+ * Get a keyboard shortcut context by its name, or create it if it doesn't exist.
83
+ *
84
+ * @memberof ShortcutManager#
85
+ * @param {string} contextName The name of the shortcut context
86
+ * @param {string} [scope='table'] The scope of the shortcut: `'table'` or `'global'`
87
+ * @returns {object} A [`ShortcutContext`](@/api/shortcutContext.md) object that stores registered shortcuts
88
+ */
89
+ const getOrCreateContext = function (contextName) {
90
+ var _getContext;
91
+ let scope = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'table';
92
+ return (_getContext = getContext(contextName)) !== null && _getContext !== void 0 ? _getContext : addContext(contextName, scope);
93
+ };
94
+
81
95
  /**
82
96
  * Start listening to keyboard shortcuts within a given [`ShortcutContext`](@/api/shortcutContext.md).
83
97
  *
@@ -175,6 +189,7 @@ export const createShortcutManager = _ref => {
175
189
  addContext,
176
190
  getActiveContextName,
177
191
  getContext,
192
+ getOrCreateContext,
178
193
  setActiveContextName,
179
194
  /**
180
195
  * Returns whether `control` or `meta` keys are pressed.
@@ -25,9 +25,26 @@
25
25
  * INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER ARISING FROM
26
26
  * USE OR INABILITY TO USE THIS SOFTWARE.
27
27
  *
28
- * Version: 16.1.1
29
- * Release date: 23/09/2025 (built at 23/09/2025 14:16:58)
28
+ * Version: 16.2.0-next-216dbd0-20251112
29
+ * Release date: 19/11/2025 (built at 12/11/2025 14:05:16)
30
30
  */
31
+ .htBorders .wtBorder.ht-border-style-dashed-vertical {
32
+ background-image: repeating-linear-gradient(to bottom, var(--ht-custom-border-color) 0 5px, transparent 0 10px);
33
+ }
34
+ .htBorders .wtBorder.ht-border-style-dashed-horizontal {
35
+ background-image: repeating-linear-gradient(to right, var(--ht-custom-border-color) 0 5px, transparent 0 10px);
36
+ }
37
+ .htBorders .wtBorder.ht-border-style-dotted-horizontal {
38
+ background-image: radial-gradient(circle, var(--ht-custom-border-color) calc(var(--ht-custom-border-size) / 2), transparent 0);
39
+ background-size: calc(var(--ht-custom-border-size) * 2) var(--ht-custom-border-size);
40
+ background-repeat: repeat-x;
41
+ }
42
+ .htBorders .wtBorder.ht-border-style-dotted-vertical {
43
+ background-image: radial-gradient(circle, var(--ht-custom-border-color) calc(var(--ht-custom-border-size) / 2), transparent 0);
44
+ background-size: var(--ht-custom-border-size) calc(var(--ht-custom-border-size) * 2);
45
+ background-repeat: repeat-y;
46
+ }
47
+
31
48
  .ht-root-wrapper:not([class*=ht-theme]),
32
49
  .ht-portal:not([class*=ht-theme]) {
33
50
  --ht-gap-size: 4px;
@@ -111,6 +128,8 @@
111
128
  }
112
129
  .handsontable.ht-wrapper {
113
130
  border-radius: var(--ht-wrapper-border-radius, 0);
131
+ height: 100%;
132
+ width: 100%;
114
133
  }
115
134
  .handsontable.ht-wrapper:not(.htFirstDatasetColumnNotRendered) td:first-of-type {
116
135
  border-inline-start-width: 1px;
@@ -138,11 +157,6 @@
138
157
  border-top-width: 0;
139
158
  height: calc(var(--ht-cell-vertical-padding) * 2 + var(--ht-line-height) + 1px);
140
159
  }
141
- .handsontable.htGhostTable table.htGhostTableFirstRow tbody tr th,
142
- .handsontable.htGhostTable table.htGhostTableFirstRow tbody tr td {
143
- border-top-width: 1px;
144
- height: calc(var(--ht-cell-vertical-padding) * 2 + var(--ht-line-height) + 2px);
145
- }
146
160
  .handsontable.htHasScrollX:not(.htHorizontallyScrollableByWindow) .ht_master .wtHolder, .handsontable.htHasScrollY:not(.htVerticallyScrollableByWindow) .ht_master .wtHolder {
147
161
  border-radius: var(--ht-wrapper-border-radius, 0);
148
162
  }
@@ -245,9 +259,11 @@
245
259
  color: var(--ht-header-row-active-foreground-color);
246
260
  background-color: var(--ht-header-row-active-background-color);
247
261
  }
248
- .handsontable tbody tr:first-of-type th:first-child,
249
- .handsontable tbody tr:first-of-type td:first-child {
250
- height: calc(var(--ht-cell-vertical-padding) * 2 + var(--ht-line-height) + 2px);
262
+ .handsontable tbody tr:first-of-type th:first-child:empty::after,
263
+ .handsontable tbody tr:first-of-type td:first-child:empty::after {
264
+ content: "";
265
+ display: block;
266
+ min-height: var(--ht-line-height);
251
267
  }
252
268
  .handsontable tbody tr th {
253
269
  padding: 0;
@@ -283,7 +299,7 @@
283
299
  max-width: calc(100% + 1px);
284
300
  }
285
301
  .handsontable thead tr th .relative:has(.collapsibleIndicator, .changeType) .colHeader {
286
- max-width: calc(100% - (var(--ht-icon-size) + var(--ht-gap-size)));
302
+ max-width: calc(100% - (var(--ht-icon-size) + var(--ht-gap-size)) - 1px);
287
303
  }
288
304
  .handsontable tr:first-child th,
289
305
  .handsontable tr:first-child td {
@@ -427,12 +443,12 @@
427
443
  .handsontable .ht_master:not(.innerBorderTop):not(.innerBorderBottom) thead tr.lastChild th, .handsontable .ht_master:not(.innerBorderTop):not(.innerBorderBottom) ~ .handsontable thead tr.lastChild th {
428
444
  border-bottom-width: 0;
429
445
  }
430
- .handsontable .ht_master.innerBorderTop tbody tr:first-child th,
431
- .handsontable .ht_master.innerBorderTop tbody tr:first-child td {
446
+ .handsontable.htAutoRowSize .ht_master.innerBorderTop tbody tr:first-child th,
447
+ .handsontable.htAutoRowSize .ht_master.innerBorderTop tbody tr:first-child td {
432
448
  border-top-width: 0;
433
449
  }
434
- .handsontable .ht_master.innerBorderTop ~ .ht_clone_inline_start tbody tr:first-child th,
435
- .handsontable .ht_master.innerBorderTop ~ .ht_clone_inline_start tbody tr:first-child td {
450
+ .handsontable.htAutoRowSize .ht_master.innerBorderTop ~ .ht_clone_inline_start tbody tr:first-child th,
451
+ .handsontable.htAutoRowSize .ht_master.innerBorderTop ~ .ht_clone_inline_start tbody tr:first-child td {
436
452
  border-top-width: 0;
437
453
  }
438
454
  .handsontable .ht_master table.htCore > thead,
@@ -1196,6 +1212,7 @@
1196
1212
  color: var(--ht-accent-color);
1197
1213
  background: none;
1198
1214
  border: none;
1215
+ padding: 0;
1199
1216
  }
1200
1217
  .pika-single .pika-prev {
1201
1218
  order: 1;
@@ -1369,11 +1386,7 @@
1369
1386
  position: absolute;
1370
1387
  }
1371
1388
 
1372
- .handsontable .htUIInput.htUIButton {
1373
- cursor: pointer;
1374
- display: inline-block;
1375
- }
1376
- .handsontable .htUIInput.htUIButton input {
1389
+ .handsontable .htUIInput.htUIButton input, .handsontable .ht-button {
1377
1390
  min-width: 64px;
1378
1391
  padding: var(--ht-button-vertical-padding) var(--ht-button-horizontal-padding);
1379
1392
  font-family: inherit;
@@ -1381,50 +1394,51 @@
1381
1394
  line-height: var(--ht-line-height);
1382
1395
  font-weight: var(--ht-font-weight);
1383
1396
  border-radius: var(--ht-button-border-radius);
1397
+ border-width: 1px;
1398
+ border-style: solid;
1384
1399
  box-sizing: border-box;
1385
- cursor: pointer;
1386
1400
  outline: none !important;
1387
- border: 1px solid var(--ht-secondary-button-border-color);
1401
+ cursor: pointer;
1402
+ transition: var(--ht-table-transition) all ease-in-out;
1403
+ }
1404
+ .handsontable .htUIInput.htUIButtonCancel input, .handsontable .ht-button--secondary {
1405
+ border-color: var(--ht-secondary-button-border-color);
1388
1406
  background-color: var(--ht-secondary-button-background-color);
1389
1407
  color: var(--ht-secondary-button-foreground-color);
1390
- transition: var(--ht-table-transition) all ease-in-out;
1391
1408
  }
1392
- .handsontable .htUIInput.htUIButton input:hover {
1409
+ .handsontable .htUIInput.htUIButtonCancel input:hover, .handsontable .ht-button--secondary:hover {
1393
1410
  border-color: var(--ht-secondary-button-hover-border-color);
1394
1411
  background-color: var(--ht-secondary-button-hover-background-color);
1395
1412
  color: var(--ht-secondary-button-hover-foreground-color);
1396
1413
  }
1397
- .handsontable .htUIInput.htUIButton input:disabled {
1414
+ .handsontable .htUIInput.htUIButtonCancel input:disabled, .handsontable .ht-button--secondary:disabled {
1398
1415
  border-color: var(--ht-secondary-button-disabled-border-color);
1399
1416
  background-color: var(--ht-secondary-button-disabled-background-color);
1400
1417
  color: var(--ht-secondary-button-disabled-foreground-color);
1401
1418
  }
1402
- .handsontable .htUIInput.htUIButton input:focus {
1419
+ .handsontable .htUIInput.htUIButtonCancel input:focus, .handsontable .ht-button--secondary:focus {
1403
1420
  border-color: var(--ht-secondary-button-focus-border-color);
1404
1421
  background-color: var(--ht-secondary-button-focus-background-color);
1405
1422
  color: var(--ht-secondary-button-focus-foreground-color);
1406
1423
  box-shadow: 0 0 0 1px var(--ht-accent-color);
1407
1424
  }
1408
- .handsontable .htUIInput.htUIButtonOK {
1409
- margin-inline-start: 0;
1410
- margin-inline-end: calc(2 * var(--ht-gap-size, 2px));
1411
- }
1412
- .handsontable .htUIInput.htUIButtonOK input {
1425
+
1426
+ .htUIInput.htUIButtonOK input, .ht-button--primary {
1413
1427
  border-color: var(--ht-primary-button-border-color);
1414
1428
  background-color: var(--ht-primary-button-background-color);
1415
1429
  color: var(--ht-primary-button-foreground-color);
1416
1430
  }
1417
- .handsontable .htUIInput.htUIButtonOK input:hover {
1431
+ .htUIInput.htUIButtonOK input:hover, .ht-button--primary:hover {
1418
1432
  border-color: var(--ht-primary-button-hover-border-color);
1419
1433
  background-color: var(--ht-primary-button-hover-background-color);
1420
1434
  color: var(--ht-primary-button-hover-foreground-color);
1421
1435
  }
1422
- .handsontable .htUIInput.htUIButtonOK input:disabled {
1436
+ .htUIInput.htUIButtonOK input:disabled, .ht-button--primary:disabled {
1423
1437
  border-color: var(--ht-primary-button-disabled-border-color);
1424
1438
  background-color: var(--ht-primary-button-disabled-background-color);
1425
1439
  color: var(--ht-primary-button-disabled-foreground-color);
1426
1440
  }
1427
- .handsontable .htUIInput.htUIButtonOK input:focus {
1441
+ .htUIInput.htUIButtonOK input:focus, .ht-button--primary:focus {
1428
1442
  border-color: var(--ht-primary-button-focus-border-color);
1429
1443
  background-color: var(--ht-primary-button-focus-background-color);
1430
1444
  color: var(--ht-primary-button-focus-foreground-color);
@@ -2035,6 +2049,14 @@
2035
2049
  .handsontable .htUIMultipleSelect .ht_master .wtHolder td {
2036
2050
  background: none;
2037
2051
  }
2052
+ .handsontable .htUIInput.htUIButton {
2053
+ cursor: pointer;
2054
+ display: inline-block;
2055
+ }
2056
+ .handsontable .htUIInput.htUIButtonOK {
2057
+ margin-inline-start: 0;
2058
+ margin-inline-end: calc(2 * var(--ht-gap-size, 2px));
2059
+ }
2038
2060
 
2039
2061
  .handsontable .htCommentCell {
2040
2062
  position: relative;
@@ -2087,7 +2109,7 @@
2087
2109
  padding-inline-start: calc(var(--ht-icon-size, 16px) + 2px);
2088
2110
  padding-inline-end: calc(var(--ht-icon-size, 16px) + 2px);
2089
2111
  min-width: calc(var(--ht-icon-size, 16px) + 8px);
2090
- max-width: calc(100% - var(--ht-icon-size, 16px) * 2 - 4px);
2112
+ max-width: calc(100% - var(--ht-icon-size, 16px) * 2 - 5px) !important;
2091
2113
  }
2092
2114
  .handsontable .columnSorting:not(.indicatorDisabled).sortAction:hover {
2093
2115
  text-decoration: none;
@@ -2491,6 +2513,58 @@
2491
2513
  border-radius: var(--ht-dialog-content-border-radius);
2492
2514
  background-color: var(--ht-dialog-content-background-color);
2493
2515
  }
2516
+ .ht-dialog--confirm .ht-dialog__content-wrapper {
2517
+ text-align: center;
2518
+ padding: calc(var(--ht-gap-size) * 2);
2519
+ }
2520
+ .ht-dialog--confirm .ht-dialog__content-wrapper-inner {
2521
+ display: flex;
2522
+ flex-direction: column;
2523
+ align-items: center;
2524
+ justify-content: center;
2525
+ max-width: 480px;
2526
+ padding: calc(var(--ht-gap-size) * 2);
2527
+ border-radius: var(--ht-wrapper-border-radius);
2528
+ }
2529
+ .ht-dialog--confirm .ht-dialog__content-wrapper-inner--background {
2530
+ box-shadow: var(--ht-shadow-x, 0) var(--ht-shadow-y, 0) var(--ht-shadow-blur, 8px) var(--ht-shadow-color, rgba(0, 0, 0, 0.08));
2531
+ border-radius: var(--ht-dialog-content-border-radius);
2532
+ background-color: var(--ht-dialog-content-background-color);
2533
+ }
2534
+ .ht-dialog--confirm .ht-dialog__content-wrapper-inner:focus {
2535
+ outline: none;
2536
+ box-shadow: 0 0 0 1px var(--ht-accent-color);
2537
+ }
2538
+ .ht-dialog--confirm .ht-dialog__content {
2539
+ display: flex;
2540
+ flex-direction: column;
2541
+ align-items: center;
2542
+ justify-content: center;
2543
+ gap: var(--ht-gap-size);
2544
+ }
2545
+ .ht-dialog--confirm .ht-dialog__content:has(.ht-dialog__buttons) {
2546
+ gap: calc(var(--ht-gap-size) * 2);
2547
+ }
2548
+ .ht-dialog--confirm .ht-dialog__title {
2549
+ margin: 0;
2550
+ font-size: var(--ht-font-size);
2551
+ font-weight: var(--ht-font-weight);
2552
+ line-height: var(--ht-line-height);
2553
+ }
2554
+ .ht-dialog--confirm .ht-dialog__description {
2555
+ margin: 0;
2556
+ color: var(--ht-foreground-secondary-color);
2557
+ font-size: var(--ht-font-size-small);
2558
+ line-height: var(--ht-line-height-small);
2559
+ font-weight: var(--ht-font-weight);
2560
+ }
2561
+ .ht-dialog--confirm .ht-dialog__buttons {
2562
+ display: flex;
2563
+ justify-content: center;
2564
+ flex-direction: row;
2565
+ flex-wrap: wrap;
2566
+ gap: calc(var(--ht-gap-size) * 2);
2567
+ }
2494
2568
 
2495
2569
  .handsontable.ht-pagination {
2496
2570
  color: var(--ht-pagination-bar-foreground-color);
@@ -2660,3 +2734,86 @@
2660
2734
  transform: rotate(360deg);
2661
2735
  }
2662
2736
  }
2737
+ .ht-empty-data-state {
2738
+ display: none;
2739
+ position: absolute;
2740
+ width: 100%;
2741
+ left: 0;
2742
+ z-index: 999;
2743
+ overflow-y: auto;
2744
+ border: 1px solid var(--ht-border-color);
2745
+ border-radius: var(--ht-wrapper-border-radius);
2746
+ box-sizing: border-box;
2747
+ background-color: var(--ht-background-color);
2748
+ }
2749
+ .ht-empty-data-state * {
2750
+ box-sizing: border-box !important;
2751
+ }
2752
+ .ht-empty-data-state__content-wrapper {
2753
+ display: flex;
2754
+ align-items: center;
2755
+ justify-content: center;
2756
+ text-align: center;
2757
+ width: 100%;
2758
+ min-height: 100%;
2759
+ padding: calc(var(--ht-gap-size) * 2);
2760
+ border-radius: var(--ht-wrapper-border-radius);
2761
+ }
2762
+ .ht-empty-data-state__content-wrapper-inner {
2763
+ display: flex;
2764
+ flex-direction: column;
2765
+ align-items: center;
2766
+ justify-content: center;
2767
+ max-width: 480px;
2768
+ padding: calc(var(--ht-gap-size) * 2);
2769
+ border-radius: var(--ht-wrapper-border-radius);
2770
+ }
2771
+ .ht-empty-data-state__content-wrapper-inner:focus {
2772
+ outline: none;
2773
+ box-shadow: 0 0 0 1px var(--ht-accent-color);
2774
+ }
2775
+ .ht-empty-data-state__content {
2776
+ display: flex;
2777
+ flex-direction: column;
2778
+ align-items: center;
2779
+ justify-content: center;
2780
+ gap: var(--ht-gap-size);
2781
+ }
2782
+ .ht-empty-data-state__title {
2783
+ margin: 0;
2784
+ font-size: var(--ht-font-size);
2785
+ font-weight: var(--ht-font-weight);
2786
+ line-height: var(--ht-line-height);
2787
+ }
2788
+ .ht-empty-data-state__description {
2789
+ margin: 0;
2790
+ color: var(--ht-foreground-secondary-color);
2791
+ font-size: var(--ht-font-size-small);
2792
+ line-height: var(--ht-line-height-small);
2793
+ font-weight: var(--ht-font-weight);
2794
+ }
2795
+ .ht-empty-data-state__buttons {
2796
+ display: flex;
2797
+ justify-content: center;
2798
+ flex-direction: row;
2799
+ flex-wrap: wrap;
2800
+ gap: calc(var(--ht-gap-size) * 2);
2801
+ }
2802
+ .ht-empty-data-state__buttons--has-buttons {
2803
+ margin-top: calc(var(--ht-gap-size) * 2);
2804
+ }
2805
+ .ht-empty-data-state--disable-top-border {
2806
+ border-start-start-radius: 0;
2807
+ border-start-end-radius: 0;
2808
+ border-top-width: 0;
2809
+ }
2810
+ .ht-empty-data-state--disable-inline-border {
2811
+ border-start-start-radius: 0;
2812
+ border-end-start-radius: 0;
2813
+ border-inline-start-width: 0;
2814
+ }
2815
+ .ht-empty-data-state--disable-bottom-border, .ht-empty-data-state:has(~ .ht-pagination) {
2816
+ border-end-start-radius: 0;
2817
+ border-end-end-radius: 0;
2818
+ border-bottom-width: 0;
2819
+ }