handsontable 13.1.0 → 14.0.0-next-e8f87aa-20231030

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 (691) hide show
  1. package/3rdparty/walkontable/src/calculator/constants.js +3 -6
  2. package/3rdparty/walkontable/src/calculator/viewportColumns.js +1 -2
  3. package/3rdparty/walkontable/src/calculator/viewportRows.js +1 -2
  4. package/3rdparty/walkontable/src/cell/coords.d.ts +8 -1
  5. package/3rdparty/walkontable/src/cell/coords.js +81 -13
  6. package/3rdparty/walkontable/src/cell/coords.mjs +80 -11
  7. package/3rdparty/walkontable/src/cell/range.d.ts +9 -2
  8. package/3rdparty/walkontable/src/cell/range.js +39 -9
  9. package/3rdparty/walkontable/src/cell/range.mjs +38 -7
  10. package/3rdparty/walkontable/src/core/_base.js +9 -3
  11. package/3rdparty/walkontable/src/core/_base.mjs +9 -3
  12. package/3rdparty/walkontable/src/core/clone.js +2 -2
  13. package/3rdparty/walkontable/src/core/clone.mjs +2 -2
  14. package/3rdparty/walkontable/src/core/core.js +3 -2
  15. package/3rdparty/walkontable/src/core/core.mjs +3 -2
  16. package/3rdparty/walkontable/src/event.js +13 -12
  17. package/3rdparty/walkontable/src/event.mjs +12 -10
  18. package/3rdparty/walkontable/src/facade/core.js +2 -2
  19. package/3rdparty/walkontable/src/facade/core.mjs +2 -2
  20. package/3rdparty/walkontable/src/filter/column.js +1 -2
  21. package/3rdparty/walkontable/src/filter/row.js +1 -2
  22. package/3rdparty/walkontable/src/index.js +12 -4
  23. package/3rdparty/walkontable/src/index.mjs +2 -2
  24. package/3rdparty/walkontable/src/overlay/_base.js +13 -2
  25. package/3rdparty/walkontable/src/overlay/_base.mjs +14 -3
  26. package/3rdparty/walkontable/src/overlay/constants.js +7 -14
  27. package/3rdparty/walkontable/src/overlay/inlineStart.js +2 -6
  28. package/3rdparty/walkontable/src/overlay/inlineStart.mjs +2 -6
  29. package/3rdparty/walkontable/src/overlay/top.js +2 -6
  30. package/3rdparty/walkontable/src/overlay/top.mjs +2 -6
  31. package/3rdparty/walkontable/src/overlays.js +1 -2
  32. package/3rdparty/walkontable/src/renderer/cells.js +10 -0
  33. package/3rdparty/walkontable/src/renderer/cells.mjs +11 -1
  34. package/3rdparty/walkontable/src/renderer/columnHeaders.js +13 -0
  35. package/3rdparty/walkontable/src/renderer/columnHeaders.mjs +14 -1
  36. package/3rdparty/walkontable/src/renderer/rowHeaders.js +8 -0
  37. package/3rdparty/walkontable/src/renderer/rowHeaders.mjs +8 -0
  38. package/3rdparty/walkontable/src/renderer/rows.js +13 -0
  39. package/3rdparty/walkontable/src/renderer/rows.mjs +13 -0
  40. package/3rdparty/walkontable/src/renderer/table.js +9 -0
  41. package/3rdparty/walkontable/src/renderer/table.mjs +9 -0
  42. package/3rdparty/walkontable/src/scroll.js +3 -2
  43. package/3rdparty/walkontable/src/scroll.mjs +2 -0
  44. package/3rdparty/walkontable/src/{border.js → selection/border/border.js} +8 -14
  45. package/3rdparty/walkontable/src/{border.mjs → selection/border/border.mjs} +7 -12
  46. package/3rdparty/walkontable/src/selection/border/constants.js +15 -0
  47. package/3rdparty/walkontable/src/selection/border/constants.mjs +12 -0
  48. package/3rdparty/walkontable/src/selection/constants.js +54 -0
  49. package/3rdparty/walkontable/src/selection/constants.mjs +51 -0
  50. package/3rdparty/walkontable/src/selection/index.js +26 -0
  51. package/3rdparty/walkontable/src/selection/index.mjs +5 -0
  52. package/3rdparty/walkontable/src/selection/manager.js +274 -0
  53. package/3rdparty/walkontable/src/selection/manager.mjs +269 -0
  54. package/3rdparty/walkontable/src/selection/scanner.js +270 -0
  55. package/3rdparty/walkontable/src/selection/scanner.mjs +267 -0
  56. package/3rdparty/walkontable/src/selection/selection.js +100 -0
  57. package/3rdparty/walkontable/src/selection/selection.mjs +96 -0
  58. package/3rdparty/walkontable/src/settings.js +13 -4
  59. package/3rdparty/walkontable/src/settings.mjs +13 -4
  60. package/3rdparty/walkontable/src/table/bottom.js +1 -2
  61. package/3rdparty/walkontable/src/table/bottomInlineStartCorner.js +1 -2
  62. package/3rdparty/walkontable/src/table/inlineStart.js +1 -2
  63. package/3rdparty/walkontable/src/table/master.js +3 -6
  64. package/3rdparty/walkontable/src/table/master.mjs +2 -4
  65. package/3rdparty/walkontable/src/table/mixin/calculatedColumns.js +10 -2
  66. package/3rdparty/walkontable/src/table/mixin/calculatedColumns.mjs +9 -0
  67. package/3rdparty/walkontable/src/table/mixin/calculatedRows.js +10 -2
  68. package/3rdparty/walkontable/src/table/mixin/calculatedRows.mjs +9 -0
  69. package/3rdparty/walkontable/src/table/mixin/stickyColumnsStart.js +10 -2
  70. package/3rdparty/walkontable/src/table/mixin/stickyColumnsStart.mjs +9 -0
  71. package/3rdparty/walkontable/src/table/mixin/stickyRowsBottom.js +10 -2
  72. package/3rdparty/walkontable/src/table/mixin/stickyRowsBottom.mjs +9 -0
  73. package/3rdparty/walkontable/src/table/mixin/stickyRowsTop.js +10 -2
  74. package/3rdparty/walkontable/src/table/mixin/stickyRowsTop.mjs +9 -0
  75. package/3rdparty/walkontable/src/table/top.js +1 -2
  76. package/3rdparty/walkontable/src/table/topInlineStartCorner.js +1 -2
  77. package/3rdparty/walkontable/src/table.js +20 -80
  78. package/3rdparty/walkontable/src/table.mjs +20 -79
  79. package/3rdparty/walkontable/src/utils/orderView/constants.js +3 -6
  80. package/3rdparty/walkontable/src/viewport.js +1 -2
  81. package/CHANGELOG.md +51 -0
  82. package/base.js +3 -4
  83. package/base.mjs +2 -2
  84. package/cellTypes/autocompleteType/autocompleteType.js +3 -5
  85. package/cellTypes/checkboxType/checkboxType.js +3 -5
  86. package/cellTypes/dateType/dateType.d.ts +3 -3
  87. package/cellTypes/dateType/dateType.js +5 -7
  88. package/cellTypes/dateType/dateType.mjs +2 -2
  89. package/cellTypes/dropdownType/dropdownType.js +3 -5
  90. package/cellTypes/handsontableType/handsontableType.d.ts +3 -3
  91. package/cellTypes/handsontableType/handsontableType.js +5 -7
  92. package/cellTypes/handsontableType/handsontableType.mjs +2 -2
  93. package/cellTypes/index.d.ts +3 -0
  94. package/cellTypes/index.js +4 -0
  95. package/cellTypes/index.mjs +3 -1
  96. package/cellTypes/numericType/numericType.js +3 -5
  97. package/cellTypes/passwordType/passwordType.js +3 -5
  98. package/cellTypes/selectType/index.d.ts +1 -0
  99. package/cellTypes/selectType/index.js +6 -0
  100. package/cellTypes/selectType/index.mjs +1 -0
  101. package/cellTypes/selectType/selectType.d.ts +14 -0
  102. package/cellTypes/selectType/selectType.js +11 -0
  103. package/cellTypes/selectType/selectType.mjs +8 -0
  104. package/cellTypes/textType/textType.js +3 -5
  105. package/cellTypes/timeType/timeType.js +3 -5
  106. package/common.d.ts +1 -1
  107. package/core/focusCatcher/focusDetector.js +63 -0
  108. package/core/focusCatcher/focusDetector.mjs +59 -0
  109. package/core/focusCatcher/index.js +148 -0
  110. package/core/focusCatcher/index.mjs +144 -0
  111. package/core/index.js +9 -0
  112. package/core/index.mjs +1 -0
  113. package/core.d.ts +10 -5
  114. package/core.js +327 -359
  115. package/core.mjs +327 -359
  116. package/dataMap/dataMap.js +1 -2
  117. package/dataMap/dataSource.js +1 -2
  118. package/dataMap/metaManager/metaSchema.js +65 -0
  119. package/dataMap/metaManager/metaSchema.mjs +65 -0
  120. package/dataMap/metaManager/mods/extendMetaProperties.js +7 -1
  121. package/dataMap/metaManager/mods/extendMetaProperties.mjs +7 -1
  122. package/dataMap/replaceData.js +5 -0
  123. package/dataMap/replaceData.mjs +5 -0
  124. package/dist/handsontable.css +94 -76
  125. package/dist/handsontable.full.css +94 -76
  126. package/dist/handsontable.full.js +23133 -15992
  127. package/dist/handsontable.full.min.css +8 -8
  128. package/dist/handsontable.full.min.js +170 -152
  129. package/dist/handsontable.js +21856 -15085
  130. package/dist/handsontable.min.css +7 -7
  131. package/dist/handsontable.min.js +30 -22
  132. package/dist/languages/all.js +47 -40
  133. package/dist/languages/all.min.js +1 -1
  134. package/dist/languages/ar-AR.js +1 -2
  135. package/dist/languages/cs-CZ.js +1 -2
  136. package/dist/languages/de-CH.js +1 -2
  137. package/dist/languages/de-DE.js +1 -2
  138. package/dist/languages/en-US.js +15 -3
  139. package/dist/languages/en-US.min.js +1 -1
  140. package/dist/languages/es-MX.js +1 -2
  141. package/dist/languages/fr-FR.js +1 -2
  142. package/dist/languages/it-IT.js +1 -2
  143. package/dist/languages/ja-JP.js +1 -2
  144. package/dist/languages/ko-KR.js +1 -2
  145. package/dist/languages/lv-LV.js +1 -2
  146. package/dist/languages/nb-NO.js +1 -2
  147. package/dist/languages/nl-NL.js +1 -2
  148. package/dist/languages/pl-PL.js +15 -3
  149. package/dist/languages/pl-PL.min.js +1 -1
  150. package/dist/languages/pt-BR.js +1 -2
  151. package/dist/languages/ru-RU.js +1 -2
  152. package/dist/languages/sr-SP.js +1 -2
  153. package/dist/languages/zh-CN.js +1 -2
  154. package/dist/languages/zh-TW.js +1 -2
  155. package/editorManager.js +17 -91
  156. package/editorManager.mjs +16 -87
  157. package/editors/autocompleteEditor/autocompleteEditor.js +65 -11
  158. package/editors/autocompleteEditor/autocompleteEditor.mjs +65 -10
  159. package/editors/baseEditor/baseEditor.js +19 -13
  160. package/editors/baseEditor/baseEditor.mjs +16 -7
  161. package/editors/checkboxEditor/checkboxEditor.js +1 -2
  162. package/editors/dateEditor/dateEditor.js +27 -9
  163. package/editors/dateEditor/dateEditor.mjs +27 -8
  164. package/editors/dropdownEditor/dropdownEditor.js +1 -2
  165. package/editors/handsontableEditor/handsontableEditor.js +14 -7
  166. package/editors/handsontableEditor/handsontableEditor.mjs +14 -6
  167. package/editors/numericEditor/numericEditor.js +1 -2
  168. package/editors/passwordEditor/passwordEditor.js +1 -2
  169. package/editors/selectEditor/selectEditor.js +1 -2
  170. package/editors/textEditor/textEditor.js +20 -29
  171. package/editors/textEditor/textEditor.mjs +22 -30
  172. package/editors/timeEditor/timeEditor.js +1 -2
  173. package/eventManager.js +1 -2
  174. package/focusManager.d.ts +12 -0
  175. package/focusManager.js +265 -0
  176. package/focusManager.mjs +261 -0
  177. package/helpers/a11y.js +81 -0
  178. package/helpers/a11y.mjs +39 -0
  179. package/helpers/dom/element.js +224 -12
  180. package/helpers/dom/element.mjs +216 -10
  181. package/helpers/dom/event.d.ts +1 -0
  182. package/helpers/dom/event.js +25 -0
  183. package/helpers/dom/event.mjs +24 -0
  184. package/helpers/mixed.js +2 -2
  185. package/helpers/mixed.mjs +2 -2
  186. package/helpers/number.d.ts +1 -0
  187. package/helpers/number.js +18 -0
  188. package/helpers/number.mjs +17 -0
  189. package/helpers/unicode.js +1 -2
  190. package/i18n/constants.js +97 -160
  191. package/i18n/constants.mjs +17 -1
  192. package/i18n/languages/ar-AR.js +3 -4
  193. package/i18n/languages/cs-CZ.js +3 -4
  194. package/i18n/languages/de-CH.js +3 -4
  195. package/i18n/languages/de-DE.js +3 -4
  196. package/i18n/languages/en-US.js +17 -5
  197. package/i18n/languages/en-US.mjs +14 -1
  198. package/i18n/languages/es-MX.js +3 -4
  199. package/i18n/languages/fr-FR.js +3 -4
  200. package/i18n/languages/it-IT.js +3 -4
  201. package/i18n/languages/ja-JP.js +3 -4
  202. package/i18n/languages/ko-KR.js +3 -4
  203. package/i18n/languages/lv-LV.js +3 -4
  204. package/i18n/languages/nb-NO.js +3 -4
  205. package/i18n/languages/nl-NL.js +3 -4
  206. package/i18n/languages/pl-PL.js +17 -5
  207. package/i18n/languages/pl-PL.mjs +14 -1
  208. package/i18n/languages/pt-BR.js +3 -4
  209. package/i18n/languages/ru-RU.js +3 -4
  210. package/i18n/languages/sr-SP.js +3 -4
  211. package/i18n/languages/zh-CN.js +3 -4
  212. package/i18n/languages/zh-TW.js +3 -4
  213. package/i18n/registry.js +4 -6
  214. package/index.js +3 -4
  215. package/languages/all.js +47 -40
  216. package/languages/ar-AR.js +1 -2
  217. package/languages/cs-CZ.js +1 -2
  218. package/languages/de-CH.js +1 -2
  219. package/languages/de-DE.js +1 -2
  220. package/languages/en-US.js +15 -3
  221. package/languages/en-US.mjs +14 -1
  222. package/languages/es-MX.js +1 -2
  223. package/languages/fr-FR.js +1 -2
  224. package/languages/index.js +47 -40
  225. package/languages/it-IT.js +1 -2
  226. package/languages/ja-JP.js +1 -2
  227. package/languages/ko-KR.js +1 -2
  228. package/languages/lv-LV.js +1 -2
  229. package/languages/nb-NO.js +1 -2
  230. package/languages/nl-NL.js +1 -2
  231. package/languages/pl-PL.js +15 -3
  232. package/languages/pl-PL.mjs +14 -1
  233. package/languages/pt-BR.js +1 -2
  234. package/languages/ru-RU.js +1 -2
  235. package/languages/sr-SP.js +1 -2
  236. package/languages/zh-CN.js +1 -2
  237. package/languages/zh-TW.js +1 -2
  238. package/mixins/hooksRefRegisterer.js +1 -2
  239. package/mixins/localHooks.js +1 -2
  240. package/package.json +119 -96
  241. package/pluginHooks.d.ts +42 -7
  242. package/pluginHooks.js +301 -65
  243. package/pluginHooks.mjs +300 -63
  244. package/plugins/autoColumnSize/autoColumnSize.d.ts +2 -0
  245. package/plugins/autoColumnSize/autoColumnSize.js +2 -4
  246. package/plugins/autoRowSize/autoRowSize.d.ts +2 -0
  247. package/plugins/autoRowSize/autoRowSize.js +15 -10
  248. package/plugins/autoRowSize/autoRowSize.mjs +13 -6
  249. package/plugins/autofill/autofill.js +2 -4
  250. package/plugins/autofill/utils.js +1 -2
  251. package/plugins/base/base.js +1 -2
  252. package/plugins/bindRowsWithHeaders/bindRowsWithHeaders.js +2 -4
  253. package/plugins/bindRowsWithHeaders/maps/looseBindsMap.js +1 -2
  254. package/plugins/bindRowsWithHeaders/maps/strictBindsMap.js +1 -2
  255. package/plugins/collapsibleColumns/collapsibleColumns.js +77 -8
  256. package/plugins/collapsibleColumns/collapsibleColumns.mjs +76 -5
  257. package/plugins/columnSorting/columnSorting.js +71 -6
  258. package/plugins/columnSorting/columnSorting.mjs +70 -3
  259. package/plugins/columnSorting/index.js +3 -1
  260. package/plugins/columnSorting/index.mjs +1 -1
  261. package/plugins/columnSorting/sortFunction/checkbox.js +1 -2
  262. package/plugins/columnSorting/sortFunction/date.js +1 -2
  263. package/plugins/columnSorting/sortFunction/default.js +1 -2
  264. package/plugins/columnSorting/sortFunction/numeric.js +1 -2
  265. package/plugins/columnSorting/sortService/engine.js +3 -6
  266. package/plugins/columnSorting/utils.js +3 -6
  267. package/plugins/columnSummary/columnSummary.js +2 -4
  268. package/plugins/columnSummary/endpoints.js +1 -2
  269. package/plugins/comments/commentEditor.js +2 -2
  270. package/plugins/comments/commentEditor.mjs +1 -0
  271. package/plugins/comments/comments.js +254 -197
  272. package/plugins/comments/comments.mjs +251 -190
  273. package/plugins/comments/contextMenuItem/addEditComment.js +41 -0
  274. package/plugins/comments/contextMenuItem/addEditComment.mjs +35 -0
  275. package/plugins/comments/contextMenuItem/readOnlyComment.js +49 -0
  276. package/plugins/comments/contextMenuItem/readOnlyComment.mjs +43 -0
  277. package/plugins/comments/contextMenuItem/removeComment.js +38 -0
  278. package/plugins/comments/contextMenuItem/removeComment.mjs +32 -0
  279. package/plugins/comments/displaySwitch.js +1 -2
  280. package/plugins/contextMenu/commandExecutor.js +2 -3
  281. package/plugins/contextMenu/commandExecutor.mjs +2 -3
  282. package/plugins/contextMenu/contextMenu.d.ts +1 -1
  283. package/plugins/contextMenu/contextMenu.js +77 -40
  284. package/plugins/contextMenu/contextMenu.mjs +74 -35
  285. package/plugins/contextMenu/itemsFactory.js +2 -3
  286. package/plugins/contextMenu/itemsFactory.mjs +3 -4
  287. package/plugins/contextMenu/{cursor.mjs → menu/cursor.js} +6 -4
  288. package/plugins/contextMenu/{cursor.js → menu/cursor.mjs} +4 -10
  289. package/plugins/contextMenu/menu/defaultShortcutsList.js +88 -0
  290. package/plugins/contextMenu/menu/defaultShortcutsList.mjs +84 -0
  291. package/plugins/contextMenu/menu/index.js +9 -0
  292. package/plugins/contextMenu/menu/index.mjs +1 -0
  293. package/plugins/contextMenu/{menu.js → menu/menu.js} +145 -421
  294. package/plugins/contextMenu/{menu.mjs → menu/menu.mjs} +146 -422
  295. package/plugins/contextMenu/menu/menuItemRenderer.js +70 -0
  296. package/plugins/contextMenu/menu/menuItemRenderer.mjs +66 -0
  297. package/plugins/contextMenu/menu/navigator.js +27 -0
  298. package/plugins/contextMenu/menu/navigator.mjs +23 -0
  299. package/plugins/contextMenu/menu/positioner.js +213 -0
  300. package/plugins/contextMenu/menu/positioner.mjs +209 -0
  301. package/plugins/contextMenu/menu/shortcuts.js +114 -0
  302. package/plugins/contextMenu/menu/shortcuts.mjs +110 -0
  303. package/plugins/contextMenu/menu/utils.js +177 -0
  304. package/plugins/contextMenu/menu/utils.mjs +163 -0
  305. package/plugins/contextMenu/predefinedItems/alignment.js +10 -4
  306. package/plugins/contextMenu/predefinedItems/alignment.mjs +7 -0
  307. package/plugins/contextMenu/predefinedItems/clearColumn.js +8 -7
  308. package/plugins/contextMenu/predefinedItems/clearColumn.mjs +5 -3
  309. package/plugins/contextMenu/predefinedItems/columnLeft.js +8 -7
  310. package/plugins/contextMenu/predefinedItems/columnLeft.mjs +5 -3
  311. package/plugins/contextMenu/predefinedItems/columnRight.js +8 -7
  312. package/plugins/contextMenu/predefinedItems/columnRight.mjs +5 -3
  313. package/plugins/contextMenu/predefinedItems/index.js +75 -0
  314. package/plugins/contextMenu/predefinedItems/index.mjs +68 -0
  315. package/plugins/contextMenu/predefinedItems/noItems.js +1 -2
  316. package/plugins/contextMenu/predefinedItems/readOnly.js +10 -4
  317. package/plugins/contextMenu/predefinedItems/readOnly.mjs +7 -0
  318. package/plugins/contextMenu/predefinedItems/redo.js +3 -4
  319. package/plugins/contextMenu/predefinedItems/removeColumn.js +10 -9
  320. package/plugins/contextMenu/predefinedItems/removeColumn.mjs +5 -3
  321. package/plugins/contextMenu/predefinedItems/removeRow.js +10 -9
  322. package/plugins/contextMenu/predefinedItems/removeRow.mjs +5 -3
  323. package/plugins/contextMenu/predefinedItems/rowAbove.js +8 -7
  324. package/plugins/contextMenu/predefinedItems/rowAbove.mjs +5 -3
  325. package/plugins/contextMenu/predefinedItems/rowBelow.js +8 -7
  326. package/plugins/contextMenu/predefinedItems/rowBelow.mjs +5 -3
  327. package/plugins/contextMenu/predefinedItems/separator.js +1 -2
  328. package/plugins/contextMenu/predefinedItems/undo.js +3 -4
  329. package/plugins/contextMenu/utils.js +35 -151
  330. package/plugins/contextMenu/utils.mjs +35 -144
  331. package/plugins/copyPaste/clipboardData/clipboardData.js +516 -0
  332. package/plugins/copyPaste/clipboardData/clipboardData.mjs +512 -0
  333. package/plugins/copyPaste/clipboardData/copyClipboardData.js +69 -0
  334. package/plugins/copyPaste/clipboardData/copyClipboardData.mjs +65 -0
  335. package/plugins/copyPaste/clipboardData/index.js +9 -0
  336. package/plugins/copyPaste/clipboardData/index.mjs +4 -0
  337. package/plugins/copyPaste/clipboardData/pasteClipboardData.js +81 -0
  338. package/plugins/copyPaste/clipboardData/pasteClipboardData.mjs +77 -0
  339. package/plugins/copyPaste/contextMenuItem/copy.js +7 -0
  340. package/plugins/copyPaste/contextMenuItem/copy.mjs +7 -0
  341. package/plugins/copyPaste/contextMenuItem/copyColumnHeadersOnly.js +9 -1
  342. package/plugins/copyPaste/contextMenuItem/copyColumnHeadersOnly.mjs +9 -1
  343. package/plugins/copyPaste/contextMenuItem/copyWithColumnGroupHeaders.js +9 -1
  344. package/plugins/copyPaste/contextMenuItem/copyWithColumnGroupHeaders.mjs +9 -1
  345. package/plugins/copyPaste/contextMenuItem/copyWithColumnHeaders.js +9 -1
  346. package/plugins/copyPaste/contextMenuItem/copyWithColumnHeaders.mjs +9 -1
  347. package/plugins/copyPaste/contextMenuItem/cut.js +9 -2
  348. package/plugins/copyPaste/contextMenuItem/cut.mjs +7 -0
  349. package/plugins/copyPaste/copyPaste.js +160 -167
  350. package/plugins/copyPaste/copyPaste.mjs +161 -166
  351. package/plugins/customBorders/contextMenuItem/bottom.js +2 -2
  352. package/plugins/customBorders/contextMenuItem/left.js +2 -2
  353. package/plugins/customBorders/contextMenuItem/noBorders.js +2 -2
  354. package/plugins/customBorders/contextMenuItem/right.js +2 -2
  355. package/plugins/customBorders/contextMenuItem/top.js +2 -2
  356. package/plugins/customBorders/customBorders.js +27 -26
  357. package/plugins/customBorders/customBorders.mjs +24 -21
  358. package/plugins/dragToScroll/dragToScroll.js +2 -4
  359. package/plugins/dropdownMenu/dropdownMenu.d.ts +1 -1
  360. package/plugins/dropdownMenu/dropdownMenu.js +130 -44
  361. package/plugins/dropdownMenu/dropdownMenu.mjs +127 -39
  362. package/plugins/exportFile/dataProvider.js +1 -2
  363. package/plugins/exportFile/exportFile.js +4 -6
  364. package/plugins/exportFile/typeFactory.js +5 -8
  365. package/plugins/exportFile/types/_base.js +1 -2
  366. package/plugins/exportFile/types/csv.js +1 -2
  367. package/plugins/filters/component/_base.js +23 -8
  368. package/plugins/filters/component/_base.mjs +23 -8
  369. package/plugins/filters/component/actionBar.js +31 -29
  370. package/plugins/filters/component/actionBar.mjs +26 -23
  371. package/plugins/filters/component/condition.js +48 -61
  372. package/plugins/filters/component/condition.mjs +40 -52
  373. package/plugins/filters/component/operators.js +21 -22
  374. package/plugins/filters/component/operators.mjs +18 -18
  375. package/plugins/filters/component/value.js +37 -28
  376. package/plugins/filters/component/value.mjs +32 -22
  377. package/plugins/filters/condition/beginsWith.js +3 -4
  378. package/plugins/filters/condition/between.js +3 -4
  379. package/plugins/filters/condition/byValue.js +1 -2
  380. package/plugins/filters/condition/contains.js +3 -4
  381. package/plugins/filters/condition/date/after.js +3 -4
  382. package/plugins/filters/condition/date/before.js +3 -4
  383. package/plugins/filters/condition/date/today.js +3 -4
  384. package/plugins/filters/condition/date/tomorrow.js +3 -4
  385. package/plugins/filters/condition/date/yesterday.js +3 -4
  386. package/plugins/filters/condition/empty.js +3 -4
  387. package/plugins/filters/condition/endsWith.js +3 -4
  388. package/plugins/filters/condition/equal.js +3 -4
  389. package/plugins/filters/condition/false.js +1 -2
  390. package/plugins/filters/condition/greaterThan.js +3 -4
  391. package/plugins/filters/condition/greaterThanOrEqual.js +3 -4
  392. package/plugins/filters/condition/lessThan.js +3 -4
  393. package/plugins/filters/condition/lessThanOrEqual.js +3 -4
  394. package/plugins/filters/condition/none.js +3 -4
  395. package/plugins/filters/condition/notBetween.js +3 -4
  396. package/plugins/filters/condition/notContains.js +3 -4
  397. package/plugins/filters/condition/notEmpty.js +3 -4
  398. package/plugins/filters/condition/notEqual.js +3 -4
  399. package/plugins/filters/condition/true.js +1 -2
  400. package/plugins/filters/conditionCollection.d.ts +3 -2
  401. package/plugins/filters/conditionCollection.js +1 -2
  402. package/plugins/filters/conditionRegisterer.js +1 -2
  403. package/plugins/filters/conditionUpdateObserver.js +1 -2
  404. package/plugins/filters/constants.js +4 -8
  405. package/plugins/filters/constants.mjs +1 -1
  406. package/plugins/filters/dataFilter.js +1 -2
  407. package/plugins/filters/filters.d.ts +3 -5
  408. package/plugins/filters/filters.js +118 -67
  409. package/plugins/filters/filters.mjs +109 -56
  410. package/plugins/filters/logicalOperationRegisterer.js +1 -2
  411. package/plugins/filters/logicalOperations/conjunction.js +4 -6
  412. package/plugins/filters/logicalOperations/disjunction.js +4 -6
  413. package/plugins/filters/logicalOperations/disjunctionWithExtraCondition.js +4 -6
  414. package/plugins/filters/menu/focusController.js +123 -0
  415. package/plugins/filters/menu/focusController.mjs +119 -0
  416. package/plugins/filters/menu/focusNavigator.js +30 -0
  417. package/plugins/filters/menu/focusNavigator.mjs +26 -0
  418. package/plugins/filters/ui/_base.js +37 -15
  419. package/plugins/filters/ui/_base.mjs +35 -13
  420. package/plugins/filters/ui/input.js +43 -35
  421. package/plugins/filters/ui/input.mjs +42 -33
  422. package/plugins/filters/ui/link.js +44 -12
  423. package/plugins/filters/ui/link.mjs +44 -11
  424. package/plugins/filters/ui/multipleSelect.js +237 -133
  425. package/plugins/filters/ui/multipleSelect.mjs +232 -127
  426. package/plugins/filters/ui/radioInput.js +42 -18
  427. package/plugins/filters/ui/radioInput.mjs +42 -17
  428. package/plugins/filters/ui/select.js +152 -77
  429. package/plugins/filters/ui/select.mjs +148 -72
  430. package/plugins/formulas/engine/settings.js +2 -4
  431. package/plugins/formulas/formulas.js +3 -6
  432. package/plugins/formulas/indexSyncer/axisSyncer.js +1 -2
  433. package/plugins/formulas/indexSyncer/index.js +1 -2
  434. package/plugins/hiddenColumns/contextMenuItem/hideColumn.js +2 -2
  435. package/plugins/hiddenColumns/contextMenuItem/showColumn.js +2 -2
  436. package/plugins/hiddenColumns/hiddenColumns.d.ts +1 -0
  437. package/plugins/hiddenColumns/hiddenColumns.js +49 -6
  438. package/plugins/hiddenColumns/hiddenColumns.mjs +48 -3
  439. package/plugins/hiddenRows/contextMenuItem/hideRow.js +2 -2
  440. package/plugins/hiddenRows/contextMenuItem/showRow.js +2 -2
  441. package/plugins/hiddenRows/hiddenRows.d.ts +1 -0
  442. package/plugins/hiddenRows/hiddenRows.js +49 -6
  443. package/plugins/hiddenRows/hiddenRows.mjs +48 -3
  444. package/plugins/manualColumnFreeze/contextMenuItem/freezeColumn.js +2 -2
  445. package/plugins/manualColumnFreeze/contextMenuItem/unfreezeColumn.js +2 -2
  446. package/plugins/manualColumnFreeze/manualColumnFreeze.js +2 -4
  447. package/plugins/manualColumnMove/manualColumnMove.js +9 -17
  448. package/plugins/manualColumnMove/manualColumnMove.mjs +7 -13
  449. package/plugins/manualColumnMove/ui/_base.js +1 -2
  450. package/plugins/manualColumnMove/ui/backlight.js +1 -2
  451. package/plugins/manualColumnMove/ui/guideline.js +1 -2
  452. package/plugins/manualColumnResize/manualColumnResize.js +2 -4
  453. package/plugins/manualRowMove/manualRowMove.js +6 -23
  454. package/plugins/manualRowMove/manualRowMove.mjs +4 -19
  455. package/plugins/manualRowMove/ui/_base.js +1 -2
  456. package/plugins/manualRowMove/ui/backlight.js +1 -2
  457. package/plugins/manualRowMove/ui/guideline.js +1 -2
  458. package/plugins/manualRowResize/manualRowResize.js +2 -4
  459. package/plugins/mergeCells/calculations/autofill.js +1 -2
  460. package/plugins/mergeCells/calculations/selection.js +1 -2
  461. package/plugins/mergeCells/cellCoords.js +1 -2
  462. package/plugins/mergeCells/cellsCollection.js +1 -2
  463. package/plugins/mergeCells/contextMenuItem/toggleMerge.js +2 -2
  464. package/plugins/mergeCells/mergeCells.js +7 -20
  465. package/plugins/mergeCells/mergeCells.mjs +5 -16
  466. package/plugins/multiColumnSorting/multiColumnSorting.js +60 -6
  467. package/plugins/multiColumnSorting/multiColumnSorting.mjs +59 -3
  468. package/plugins/multipleSelectionHandles/multipleSelectionHandles.js +2 -4
  469. package/plugins/nestedHeaders/nestedHeaders.js +263 -36
  470. package/plugins/nestedHeaders/nestedHeaders.mjs +262 -33
  471. package/plugins/nestedHeaders/stateManager/index.js +102 -3
  472. package/plugins/nestedHeaders/stateManager/index.mjs +102 -3
  473. package/plugins/nestedHeaders/stateManager/sourceSettings.js +1 -2
  474. package/plugins/nestedHeaders/utils/ghostTable.js +1 -2
  475. package/plugins/nestedRows/data/dataManager.js +1 -2
  476. package/plugins/nestedRows/nestedRows.js +47 -10
  477. package/plugins/nestedRows/nestedRows.mjs +45 -6
  478. package/plugins/nestedRows/ui/_base.js +1 -2
  479. package/plugins/nestedRows/ui/collapsing.js +1 -2
  480. package/plugins/nestedRows/ui/contextMenu.js +3 -4
  481. package/plugins/nestedRows/ui/headers.js +13 -3
  482. package/plugins/nestedRows/ui/headers.mjs +13 -2
  483. package/plugins/persistentState/persistentState.js +2 -4
  484. package/plugins/persistentState/storage.js +1 -2
  485. package/plugins/search/search.js +2 -4
  486. package/plugins/touchScroll/touchScroll.js +2 -4
  487. package/plugins/trimRows/trimRows.js +2 -4
  488. package/plugins/undoRedo/index.js +2 -2
  489. package/plugins/undoRedo/undoRedo.js +2 -4
  490. package/renderers/autocompleteRenderer/autocompleteRenderer.js +9 -2
  491. package/renderers/autocompleteRenderer/autocompleteRenderer.mjs +8 -0
  492. package/renderers/baseRenderer/baseRenderer.js +18 -2
  493. package/renderers/baseRenderer/baseRenderer.mjs +18 -1
  494. package/renderers/checkboxRenderer/checkboxRenderer.js +10 -6
  495. package/renderers/checkboxRenderer/checkboxRenderer.mjs +9 -4
  496. package/renderers/dateRenderer/dateRenderer.d.ts +5 -0
  497. package/renderers/dateRenderer/dateRenderer.js +28 -0
  498. package/renderers/dateRenderer/dateRenderer.mjs +24 -0
  499. package/renderers/dateRenderer/index.d.ts +1 -0
  500. package/renderers/dateRenderer/index.js +6 -0
  501. package/renderers/dateRenderer/index.mjs +1 -0
  502. package/renderers/handsontableRenderer/handsontableRenderer.d.ts +5 -0
  503. package/renderers/handsontableRenderer/handsontableRenderer.js +28 -0
  504. package/renderers/handsontableRenderer/handsontableRenderer.mjs +24 -0
  505. package/renderers/handsontableRenderer/index.d.ts +1 -0
  506. package/renderers/handsontableRenderer/index.js +6 -0
  507. package/renderers/handsontableRenderer/index.mjs +1 -0
  508. package/renderers/htmlRenderer/htmlRenderer.js +1 -2
  509. package/renderers/index.d.ts +9 -0
  510. package/renderers/numericRenderer/numericRenderer.js +1 -2
  511. package/renderers/passwordRenderer/passwordRenderer.js +1 -2
  512. package/renderers/selectRenderer/index.d.ts +1 -0
  513. package/renderers/selectRenderer/index.js +6 -0
  514. package/renderers/selectRenderer/index.mjs +1 -0
  515. package/renderers/selectRenderer/selectRenderer.d.ts +5 -0
  516. package/renderers/selectRenderer/selectRenderer.js +26 -0
  517. package/renderers/selectRenderer/selectRenderer.mjs +22 -0
  518. package/renderers/textRenderer/textRenderer.js +1 -2
  519. package/renderers/timeRenderer/timeRenderer.js +1 -2
  520. package/selection/highlight/highlight.js +257 -73
  521. package/selection/highlight/highlight.mjs +250 -71
  522. package/selection/highlight/types/activeHeader.js +10 -8
  523. package/selection/highlight/types/activeHeader.mjs +10 -8
  524. package/selection/highlight/types/area.js +6 -18
  525. package/selection/highlight/types/area.mjs +6 -18
  526. package/selection/highlight/types/areaLayered.js +31 -0
  527. package/selection/highlight/types/areaLayered.mjs +26 -0
  528. package/selection/highlight/types/column.js +27 -0
  529. package/selection/highlight/types/column.mjs +22 -0
  530. package/selection/highlight/types/customSelection.js +7 -9
  531. package/selection/highlight/types/customSelection.mjs +7 -9
  532. package/selection/highlight/types/fill.js +5 -7
  533. package/selection/highlight/types/fill.mjs +5 -7
  534. package/selection/highlight/types/{cell.js → focus.js} +5 -7
  535. package/selection/highlight/types/{cell.mjs → focus.mjs} +5 -7
  536. package/selection/highlight/types/header.js +9 -18
  537. package/selection/highlight/types/header.mjs +9 -18
  538. package/selection/highlight/types/row.js +27 -0
  539. package/selection/highlight/types/row.mjs +22 -0
  540. package/selection/highlight/visualSelection.js +32 -29
  541. package/selection/highlight/visualSelection.mjs +31 -27
  542. package/selection/index.js +4 -7
  543. package/selection/index.mjs +2 -3
  544. package/selection/mouseEventHandler.js +7 -1
  545. package/selection/mouseEventHandler.mjs +7 -1
  546. package/selection/range.js +9 -10
  547. package/selection/range.mjs +8 -8
  548. package/selection/selection.js +334 -154
  549. package/selection/selection.mjs +330 -151
  550. package/selection/transformation.js +233 -94
  551. package/selection/transformation.mjs +232 -92
  552. package/selection/utils.js +20 -31
  553. package/selection/utils.mjs +16 -21
  554. package/settings.d.ts +4 -0
  555. package/shortcutContexts/commands/editor/closeAndSave.js +11 -0
  556. package/shortcutContexts/commands/editor/closeAndSave.mjs +8 -0
  557. package/shortcutContexts/commands/editor/closeWithoutSaving.js +11 -0
  558. package/shortcutContexts/commands/editor/closeWithoutSaving.mjs +8 -0
  559. package/shortcutContexts/commands/editor/fastOpen.js +15 -0
  560. package/shortcutContexts/commands/editor/fastOpen.mjs +12 -0
  561. package/shortcutContexts/commands/editor/index.js +16 -0
  562. package/shortcutContexts/commands/editor/index.mjs +12 -0
  563. package/shortcutContexts/commands/editor/open.js +26 -0
  564. package/shortcutContexts/commands/editor/open.mjs +23 -0
  565. package/shortcutContexts/commands/emptySelectedCells.js +10 -0
  566. package/shortcutContexts/commands/emptySelectedCells.mjs +7 -0
  567. package/shortcutContexts/commands/extendCellsSelection/down.js +14 -0
  568. package/shortcutContexts/commands/extendCellsSelection/down.mjs +11 -0
  569. package/shortcutContexts/commands/extendCellsSelection/downByViewportHeight.js +24 -0
  570. package/shortcutContexts/commands/extendCellsSelection/downByViewportHeight.mjs +21 -0
  571. package/shortcutContexts/commands/extendCellsSelection/index.js +26 -0
  572. package/shortcutContexts/commands/extendCellsSelection/index.mjs +22 -0
  573. package/shortcutContexts/commands/extendCellsSelection/left.js +14 -0
  574. package/shortcutContexts/commands/extendCellsSelection/left.mjs +11 -0
  575. package/shortcutContexts/commands/extendCellsSelection/right.js +14 -0
  576. package/shortcutContexts/commands/extendCellsSelection/right.mjs +11 -0
  577. package/shortcutContexts/commands/extendCellsSelection/toColumns.js +18 -0
  578. package/shortcutContexts/commands/extendCellsSelection/toColumns.mjs +15 -0
  579. package/shortcutContexts/commands/extendCellsSelection/toMostBottom.js +28 -0
  580. package/shortcutContexts/commands/extendCellsSelection/toMostBottom.mjs +25 -0
  581. package/shortcutContexts/commands/extendCellsSelection/toMostInlineEnd.js +18 -0
  582. package/shortcutContexts/commands/extendCellsSelection/toMostInlineEnd.mjs +15 -0
  583. package/shortcutContexts/commands/extendCellsSelection/toMostInlineStart.js +18 -0
  584. package/shortcutContexts/commands/extendCellsSelection/toMostInlineStart.mjs +15 -0
  585. package/shortcutContexts/commands/extendCellsSelection/toMostLeft.js +28 -0
  586. package/shortcutContexts/commands/extendCellsSelection/toMostLeft.mjs +25 -0
  587. package/shortcutContexts/commands/extendCellsSelection/toMostRight.js +28 -0
  588. package/shortcutContexts/commands/extendCellsSelection/toMostRight.mjs +25 -0
  589. package/shortcutContexts/commands/extendCellsSelection/toMostTop.js +28 -0
  590. package/shortcutContexts/commands/extendCellsSelection/toMostTop.mjs +25 -0
  591. package/shortcutContexts/commands/extendCellsSelection/toRows.js +18 -0
  592. package/shortcutContexts/commands/extendCellsSelection/toRows.mjs +15 -0
  593. package/shortcutContexts/commands/extendCellsSelection/up.js +14 -0
  594. package/shortcutContexts/commands/extendCellsSelection/up.mjs +11 -0
  595. package/shortcutContexts/commands/extendCellsSelection/upByViewportHeight.js +24 -0
  596. package/shortcutContexts/commands/extendCellsSelection/upByViewportHeight.mjs +21 -0
  597. package/shortcutContexts/commands/index.js +35 -0
  598. package/shortcutContexts/commands/index.mjs +31 -0
  599. package/shortcutContexts/commands/moveCellSelection/down.js +12 -0
  600. package/shortcutContexts/commands/moveCellSelection/down.mjs +9 -0
  601. package/shortcutContexts/commands/moveCellSelection/downByViewportHeight.js +32 -0
  602. package/shortcutContexts/commands/moveCellSelection/downByViewportHeight.mjs +29 -0
  603. package/shortcutContexts/commands/moveCellSelection/index.js +28 -0
  604. package/shortcutContexts/commands/moveCellSelection/index.mjs +24 -0
  605. package/shortcutContexts/commands/moveCellSelection/inlineEnd.js +11 -0
  606. package/shortcutContexts/commands/moveCellSelection/inlineEnd.mjs +8 -0
  607. package/shortcutContexts/commands/moveCellSelection/inlineStart.js +11 -0
  608. package/shortcutContexts/commands/moveCellSelection/inlineStart.mjs +8 -0
  609. package/shortcutContexts/commands/moveCellSelection/left.js +9 -0
  610. package/shortcutContexts/commands/moveCellSelection/left.mjs +6 -0
  611. package/shortcutContexts/commands/moveCellSelection/right.js +9 -0
  612. package/shortcutContexts/commands/moveCellSelection/right.mjs +6 -0
  613. package/shortcutContexts/commands/moveCellSelection/toMostBottom.js +16 -0
  614. package/shortcutContexts/commands/moveCellSelection/toMostBottom.mjs +13 -0
  615. package/shortcutContexts/commands/moveCellSelection/toMostBottomInlineEnd.js +17 -0
  616. package/shortcutContexts/commands/moveCellSelection/toMostBottomInlineEnd.mjs +14 -0
  617. package/shortcutContexts/commands/moveCellSelection/toMostInlineEnd.js +13 -0
  618. package/shortcutContexts/commands/moveCellSelection/toMostInlineEnd.mjs +10 -0
  619. package/shortcutContexts/commands/moveCellSelection/toMostInlineStart.js +16 -0
  620. package/shortcutContexts/commands/moveCellSelection/toMostInlineStart.mjs +13 -0
  621. package/shortcutContexts/commands/moveCellSelection/toMostLeft.js +18 -0
  622. package/shortcutContexts/commands/moveCellSelection/toMostLeft.mjs +15 -0
  623. package/shortcutContexts/commands/moveCellSelection/toMostRight.js +20 -0
  624. package/shortcutContexts/commands/moveCellSelection/toMostRight.mjs +17 -0
  625. package/shortcutContexts/commands/moveCellSelection/toMostTop.js +16 -0
  626. package/shortcutContexts/commands/moveCellSelection/toMostTop.mjs +13 -0
  627. package/shortcutContexts/commands/moveCellSelection/toMostTopInlineStart.js +18 -0
  628. package/shortcutContexts/commands/moveCellSelection/toMostTopInlineStart.mjs +15 -0
  629. package/shortcutContexts/commands/moveCellSelection/up.js +12 -0
  630. package/shortcutContexts/commands/moveCellSelection/up.mjs +9 -0
  631. package/shortcutContexts/commands/moveCellSelection/upByViewportHeight.js +32 -0
  632. package/shortcutContexts/commands/moveCellSelection/upByViewportHeight.mjs +29 -0
  633. package/shortcutContexts/commands/populateSelectedCellsData.js +28 -0
  634. package/shortcutContexts/commands/populateSelectedCellsData.mjs +25 -0
  635. package/shortcutContexts/commands/scrollToFocusedCell.js +34 -0
  636. package/shortcutContexts/commands/scrollToFocusedCell.mjs +31 -0
  637. package/shortcutContexts/commands/selectAll.js +11 -0
  638. package/shortcutContexts/commands/selectAll.mjs +8 -0
  639. package/shortcutContexts/constants.js +11 -0
  640. package/shortcutContexts/constants.mjs +8 -0
  641. package/shortcutContexts/editor.js +25 -0
  642. package/shortcutContexts/editor.mjs +21 -0
  643. package/shortcutContexts/grid.js +167 -0
  644. package/shortcutContexts/grid.mjs +163 -0
  645. package/shortcutContexts/index.js +24 -0
  646. package/shortcutContexts/index.mjs +11 -0
  647. package/shortcuts/context.d.ts +1 -0
  648. package/shortcuts/context.js +23 -4
  649. package/shortcuts/context.mjs +23 -5
  650. package/shortcuts/manager.js +31 -7
  651. package/shortcuts/manager.mjs +32 -7
  652. package/shortcuts/recorder.js +30 -14
  653. package/shortcuts/recorder.mjs +30 -14
  654. package/shortcuts/utils.js +19 -5
  655. package/shortcuts/utils.mjs +18 -4
  656. package/tableView.js +113 -16
  657. package/tableView.mjs +113 -15
  658. package/utils/dataStructures/linkedList.js +1 -2
  659. package/utils/dataStructures/priorityMap.js +2 -4
  660. package/utils/dataStructures/queue.js +1 -2
  661. package/utils/dataStructures/stack.js +1 -2
  662. package/utils/dataStructures/tree.js +3 -6
  663. package/utils/ghostTable.js +32 -17
  664. package/utils/ghostTable.mjs +31 -15
  665. package/utils/interval.js +1 -2
  666. package/utils/paginator.js +151 -0
  667. package/utils/paginator.mjs +147 -0
  668. package/utils/parseTable.js +527 -83
  669. package/utils/parseTable.mjs +523 -82
  670. package/utils/rootInstance.js +2 -4
  671. package/utils/samplesGenerator.js +21 -13
  672. package/utils/samplesGenerator.mjs +20 -11
  673. package/utils/staticRegister.js +1 -2
  674. package/validators/autocompleteValidator/autocompleteValidator.js +1 -2
  675. package/validators/dateValidator/dateValidator.js +1 -2
  676. package/validators/numericValidator/numericValidator.js +1 -2
  677. package/validators/timeValidator/timeValidator.js +1 -2
  678. package/3rdparty/walkontable/src/selection.js +0 -295
  679. package/3rdparty/walkontable/src/selection.mjs +0 -290
  680. package/plugins/contextMenu/predefinedItems.js +0 -76
  681. package/plugins/contextMenu/predefinedItems.mjs +0 -68
  682. package/plugins/copyPaste/clipboardData.js +0 -18
  683. package/plugins/copyPaste/clipboardData.mjs +0 -14
  684. package/plugins/copyPaste/focusableElement.js +0 -186
  685. package/plugins/copyPaste/focusableElement.mjs +0 -180
  686. package/plugins/copyPaste/pasteEvent.js +0 -14
  687. package/plugins/copyPaste/pasteEvent.mjs +0 -9
  688. package/selection/highlight/constants.js +0 -15
  689. package/selection/highlight/constants.mjs +0 -6
  690. package/selection/highlight/types/index.js +0 -35
  691. package/selection/highlight/types/index.mjs +0 -31
@@ -3,6 +3,7 @@
3
3
  exports.__esModule = true;
4
4
  exports.addClass = addClass;
5
5
  exports.addEvent = addEvent;
6
+ exports.appendElement = appendElement;
6
7
  exports.clearTextSelection = clearTextSelection;
7
8
  exports.closest = closest;
8
9
  exports.closestDown = closestDown;
@@ -36,23 +37,30 @@ exports.isChildOf = isChildOf;
36
37
  exports.isDetached = isDetached;
37
38
  exports.isInput = isInput;
38
39
  exports.isOutsideInput = isOutsideInput;
40
+ exports.isThisHotChild = isThisHotChild;
39
41
  exports.isVisible = isVisible;
42
+ exports.makeElementContentEditableAndSelectItsContent = makeElementContentEditableAndSelectItsContent;
40
43
  exports.matchesCSSRules = matchesCSSRules;
41
44
  exports.observeVisibilityChangeOnce = observeVisibilityChangeOnce;
42
45
  exports.offset = offset;
43
46
  exports.outerHeight = outerHeight;
44
47
  exports.outerWidth = outerWidth;
45
48
  exports.overlayContainsElement = overlayContainsElement;
49
+ exports.removeAttribute = removeAttribute;
46
50
  exports.removeClass = removeClass;
51
+ exports.removeContentEditableFromElementAndDeselect = removeContentEditableFromElementAndDeselect;
47
52
  exports.removeEvent = removeEvent;
48
53
  exports.removeTextNodes = removeTextNodes;
49
54
  exports.resetCssTransform = resetCssTransform;
55
+ exports.runWithSelectedContendEditableElement = runWithSelectedContendEditableElement;
50
56
  exports.selectElementIfAllowed = selectElementIfAllowed;
57
+ exports.setAttribute = setAttribute;
51
58
  exports.setCaretPosition = setCaretPosition;
52
59
  exports.setOverlayPosition = setOverlayPosition;
53
60
  require("core-js/modules/es.array.push.js");
54
61
  require("core-js/modules/es.error.cause.js");
55
62
  var _string = require("../string");
63
+ var _a11y = require("../a11y");
56
64
  /**
57
65
  * Get the parent of the specified node in the DOM tree.
58
66
  *
@@ -80,6 +88,18 @@ function getParent(element) {
80
88
  return parent;
81
89
  }
82
90
 
91
+ /**
92
+ * Check if the provided element is a child of the provided Handsontable container.
93
+ *
94
+ * @param {HTMLElement} element Element to be analyzed.
95
+ * @param {HTMLElement} thisHotContainer The Handsontable container.
96
+ * @returns {boolean}
97
+ */
98
+ function isThisHotChild(element, thisHotContainer) {
99
+ const closestHandsontableContainer = element.closest('.handsontable');
100
+ return !!closestHandsontableContainer && (closestHandsontableContainer.parentNode === thisHotContainer || closestHandsontableContainer === thisHotContainer);
101
+ }
102
+
83
103
  /**
84
104
  * Gets `frameElement` of the specified frame. Returns null if it is a top frame or if script has no access to read property.
85
105
  *
@@ -93,7 +113,7 @@ function getFrameElement(frame) {
93
113
  /**
94
114
  * Gets parent frame of the specified frame. Returns null if it is a top frame or if script has no access to read property.
95
115
  *
96
- * @param {Window} frame Frame from which should be get frameElement in safe way.
116
+ * @param {Window} frame Frame from which should get frameElement in a safe way.
97
117
  * @returns {Window|null}
98
118
  */
99
119
  function getParentWindow(frame) {
@@ -103,7 +123,7 @@ function getParentWindow(frame) {
103
123
  /**
104
124
  * Checks if script has access to read from parent frame of specified frame.
105
125
  *
106
- * @param {Window} frame Frame from which should be get frameElement in safe way.
126
+ * @param {Window} frame Frame from which should get frameElement in a safe way.
107
127
  * @returns {boolean}
108
128
  */
109
129
  function hasAccessToParentWindow(frame) {
@@ -238,7 +258,7 @@ function overlayContainsElement(overlayType, element, root) {
238
258
  }
239
259
 
240
260
  /**
241
- * @param {string} classNames The element "class" attribute string.
261
+ * @param {string[]} classNames The element "class" attribute string.
242
262
  * @returns {string[]}
243
263
  */
244
264
  function filterEmptyClassNames(classNames) {
@@ -248,6 +268,35 @@ function filterEmptyClassNames(classNames) {
248
268
  return classNames.filter(x => !!x);
249
269
  }
250
270
 
271
+ /**
272
+ * Filter out the RegExp entries from an array.
273
+ *
274
+ * @param {(string|RegExp)[]} list Array of either strings, Regexes or a mix of both.
275
+ * @param {boolean} [returnBoth] If `true`, both the array without regexes and an array of regexes will be returned.
276
+ * @returns {string[]|{regexFree: string[], regexes: RegExp[]}}
277
+ */
278
+ function filterRegexes(list, returnBoth) {
279
+ if (!list || !list.length) {
280
+ return returnBoth ? {
281
+ regexFree: [],
282
+ regexes: []
283
+ } : [];
284
+ }
285
+ const regexes = [];
286
+ const regexFree = [];
287
+ regexFree.push(...list.filter(entry => {
288
+ const isRegex = entry instanceof RegExp;
289
+ if (isRegex && returnBoth) {
290
+ regexes.push(entry);
291
+ }
292
+ return !isRegex;
293
+ }));
294
+ return returnBoth ? {
295
+ regexFree,
296
+ regexes
297
+ } : regexFree;
298
+ }
299
+
251
300
  /**
252
301
  * Checks if element has class name.
253
302
  *
@@ -282,16 +331,86 @@ function addClass(element, className) {
282
331
  * Remove class name from an element.
283
332
  *
284
333
  * @param {HTMLElement} element An element to process.
285
- * @param {string|Array} className Class name as string or array of strings.
334
+ * @param {string|Array<string|RegExp>} className Class name as string or array of strings.
286
335
  */
287
336
  function removeClass(element, className) {
288
337
  if (typeof className === 'string') {
289
338
  className = className.split(' ');
339
+ } else if (className instanceof RegExp) {
340
+ className = [className];
290
341
  }
291
- className = filterEmptyClassNames(className);
292
- if (className.length > 0) {
293
- element.classList.remove(...className);
342
+ let {
343
+ regexFree: stringClasses,
344
+ // eslint-disable-next-line prefer-const
345
+ regexes: regexClasses
346
+ } = filterRegexes(className, true);
347
+ stringClasses = filterEmptyClassNames(stringClasses);
348
+ if (stringClasses.length > 0) {
349
+ element.classList.remove(...stringClasses);
294
350
  }
351
+ regexClasses.forEach(regexClassName => {
352
+ element.classList.forEach(currentClassName => {
353
+ if (regexClassName.test(currentClassName)) {
354
+ element.classList.remove(currentClassName);
355
+ }
356
+ });
357
+ });
358
+ }
359
+
360
+ /**
361
+ * Set a single attribute or multiple attributes at once.
362
+ *
363
+ * @param {HTMLElement} domElement The HTML element to be modified.
364
+ * @param {Array[]|string} attributes If setting multiple attributes at once, `attributes` holds an array containing the
365
+ * attributes to be added. Each element of the array should be an array in a form of `[attributeName,
366
+ * attributeValue]`. If setting a single attribute, `attributes` holds the name of the attribute.
367
+ * @param {string|number|undefined} [attributeValue] If setting a single attribute, `attributeValue` holds the attribute
368
+ * value.
369
+ */
370
+ function setAttribute(domElement) {
371
+ let attributes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
372
+ let attributeValue = arguments.length > 2 ? arguments[2] : undefined;
373
+ if (!Array.isArray(attributes)) {
374
+ attributes = [[attributes, attributeValue]];
375
+ }
376
+ attributes.forEach(attributeInfo => {
377
+ if (Array.isArray(attributeInfo) && attributeInfo[0] !== '') {
378
+ domElement.setAttribute(...attributeInfo);
379
+ }
380
+ });
381
+ }
382
+
383
+ /**
384
+ * Remove a single attribute or multiple attributes from the provided element at once.
385
+ *
386
+ * @param {HTMLElement} domElement The HTML element to be processed.
387
+ * @param {Array<string|RegExp>|string} attributesToRemove If removing multiple attributes, `attributesToRemove`
388
+ * holds an array of attribute names to be removed from the provided element. If removing a single attribute, it
389
+ * holds the attribute name.
390
+ */
391
+ function removeAttribute(domElement) {
392
+ let attributesToRemove = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
393
+ if (typeof attributesToRemove === 'string') {
394
+ attributesToRemove = attributesToRemove.split(' ');
395
+ } else if (attributesToRemove instanceof RegExp) {
396
+ attributesToRemove = [attributesToRemove];
397
+ }
398
+ const {
399
+ regexFree: stringAttributes,
400
+ regexes: regexAttributes
401
+ } = filterRegexes(attributesToRemove, true);
402
+ stringAttributes.forEach(attributeNameToRemove => {
403
+ if (attributeNameToRemove !== '') {
404
+ domElement.removeAttribute(attributeNameToRemove);
405
+ }
406
+ });
407
+ regexAttributes.forEach(attributeRegex => {
408
+ domElement.getAttributeNames().forEach(attributeName => {
409
+ if (attributeRegex.test(attributeName)) {
410
+ domElement.removeAttribute(attributeName);
411
+ }
412
+ });
413
+ });
295
414
  }
296
415
 
297
416
  /**
@@ -309,7 +428,7 @@ function removeTextNodes(element) {
309
428
  }
310
429
 
311
430
  /**
312
- * Remove childs function
431
+ * Remove children function
313
432
  * WARNING - this doesn't unload events and data attached by jQuery
314
433
  * http://jsperf.com/jquery-html-vs-empty-vs-innerhtml/9
315
434
  * http://jsperf.com/jquery-html-vs-empty-vs-innerhtml/11 - no siginificant improvement with Chrome remove() method.
@@ -324,16 +443,15 @@ function empty(element) {
324
443
  element.removeChild(child);
325
444
  }
326
445
  }
327
- const HTML_CHARACTERS = /(<(.*)>|&(.*);)/;
446
+ const HTML_CHARACTERS = exports.HTML_CHARACTERS = /(<(.*)>|&(.*);)/;
328
447
 
329
448
  /**
330
- * Insert content into element trying avoid innerHTML method.
449
+ * Insert content into element trying to avoid innerHTML method.
331
450
  *
332
451
  * @param {HTMLElement} element An element to write into.
333
452
  * @param {string} content The text to write.
334
453
  * @param {boolean} [sanitizeContent=true] If `true`, the content will be sanitized before writing to the element.
335
454
  */
336
- exports.HTML_CHARACTERS = HTML_CHARACTERS;
337
455
  function fastInnerHTML(element, content) {
338
456
  let sanitizeContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
339
457
  if (HTML_CHARACTERS.test(content)) {
@@ -391,7 +509,7 @@ function isVisible(element) {
391
509
  } else {
392
510
  return false; // this is a node detached from document in IE8
393
511
  }
394
- } else if (next.style && next.style.display === 'none') {
512
+ } else if (getComputedStyle(next).display === 'none') {
395
513
  return false;
396
514
  }
397
515
  next = next.parentNode;
@@ -423,6 +541,11 @@ function offset(element) {
423
541
  if (elementToCheck === rootDocument.body) {
424
542
  break;
425
543
  }
544
+ // If the element is inside an SVG context, the `offsetParent` can be
545
+ // a <foreignObject> that does not have properties `offsetLeft` and `offsetTop` defined.
546
+ if (!('offsetLeft' in elementToCheck)) {
547
+ break;
548
+ }
426
549
  offsetLeft += elementToCheck.offsetLeft;
427
550
  offsetTop += elementToCheck.offsetTop;
428
551
  lastElem = elementToCheck;
@@ -952,4 +1075,93 @@ function observeVisibilityChangeOnce(elementToBeObserved, callback) {
952
1075
  root: elementToBeObserved.ownerDocument.body
953
1076
  });
954
1077
  visibilityObserver.observe(elementToBeObserved);
1078
+ }
1079
+
1080
+ /**
1081
+ * Add a `contenteditable` attribute, select the contents and optionally add the `invisibleSelection`
1082
+ * class to the provided element.
1083
+ *
1084
+ * @param {HTMLElement} element Element to be processed.
1085
+ * @param {boolean} [invisibleSelection=true] `true` if the class should be added to the element.
1086
+ * @param {boolean} [ariaHidden=true] `true` if the `aria-hidden` attribute should be added to the processed element.
1087
+ */
1088
+ function makeElementContentEditableAndSelectItsContent(element) {
1089
+ let invisibleSelection = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
1090
+ let ariaHidden = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
1091
+ const ownerDocument = element.ownerDocument;
1092
+ const range = ownerDocument.createRange();
1093
+ const sel = ownerDocument.defaultView.getSelection();
1094
+ setAttribute(element, 'contenteditable', true);
1095
+ if (ariaHidden) {
1096
+ setAttribute(element, ...(0, _a11y.A11Y_HIDDEN)());
1097
+ }
1098
+ if (invisibleSelection) {
1099
+ addClass(element, 'invisibleSelection');
1100
+ }
1101
+ range.selectNodeContents(element);
1102
+ sel.removeAllRanges();
1103
+ sel.addRange(range);
1104
+ }
1105
+
1106
+ /**
1107
+ * Remove the `contenteditable` attribute, deselect the contents and optionally remove the `invisibleSelection`
1108
+ * class from the provided element.
1109
+ *
1110
+ * @param {HTMLElement} selectedElement The element to be deselected.
1111
+ * @param {boolean} [removeInvisibleSelectionClass=true] `true` if the class should be removed from the element.
1112
+ */
1113
+ function removeContentEditableFromElementAndDeselect(selectedElement) {
1114
+ let removeInvisibleSelectionClass = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
1115
+ const sel = selectedElement.ownerDocument.defaultView.getSelection();
1116
+ if (selectedElement.hasAttribute('aria-hidden')) {
1117
+ selectedElement.removeAttribute('aria-hidden');
1118
+ }
1119
+ sel.removeAllRanges();
1120
+ if (removeInvisibleSelectionClass) {
1121
+ removeClass(selectedElement, 'invisibleSelection');
1122
+ }
1123
+ selectedElement.removeAttribute('contenteditable');
1124
+ }
1125
+
1126
+ /**
1127
+ * Run the provided callback while the provided element is selected and modified to have the `contenteditable`
1128
+ * attribute added. Optionally, the selection can be configured to be invisible.
1129
+ *
1130
+ * @param {HTMLElement} element Element to be selected.
1131
+ * @param {Function} callback Callback to be called.
1132
+ * @param {boolean} [invisibleSelection=true] `true` if the selection should be invisible.
1133
+ */
1134
+ function runWithSelectedContendEditableElement(element, callback) {
1135
+ let invisibleSelection = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
1136
+ makeElementContentEditableAndSelectItsContent(element, invisibleSelection);
1137
+ callback();
1138
+ removeContentEditableFromElementAndDeselect(element, invisibleSelection);
1139
+ }
1140
+
1141
+ /**
1142
+ * Creates a new DOM element and appends it to the parent element with the provided class name(s) and attributes.
1143
+ *
1144
+ * @param {HTMLElement} parentElement The parent element.
1145
+ * @param {object} properties The properties object.
1146
+ * @param {string} properties.tagName The type of the new element.
1147
+ * @param {string|string[]} properties.className Class name as string or array of strings.
1148
+ * @param {Array[]} properties.attributes An array containing the attributes to be added. Each element of the array
1149
+ * should be an array in a form of `[attributeName, attributeValue]`.
1150
+ * @returns {HTMLElement} The created div element.
1151
+ */
1152
+ function appendElement(parentElement, _ref) {
1153
+ let {
1154
+ tagName,
1155
+ className,
1156
+ attributes
1157
+ } = _ref;
1158
+ const element = parentElement.ownerDocument.createElement(tagName);
1159
+ if (className) {
1160
+ addClass(element, className);
1161
+ }
1162
+ if (attributes && attributes.length) {
1163
+ setAttribute(element, attributes);
1164
+ }
1165
+ parentElement.appendChild(element);
1166
+ return element;
955
1167
  }
@@ -1,6 +1,7 @@
1
1
  import "core-js/modules/es.array.push.js";
2
2
  import "core-js/modules/es.error.cause.js";
3
3
  import { sanitize } from "../string.mjs";
4
+ import { A11Y_HIDDEN } from "../a11y.mjs";
4
5
  /**
5
6
  * Get the parent of the specified node in the DOM tree.
6
7
  *
@@ -28,6 +29,18 @@ export function getParent(element) {
28
29
  return parent;
29
30
  }
30
31
 
32
+ /**
33
+ * Check if the provided element is a child of the provided Handsontable container.
34
+ *
35
+ * @param {HTMLElement} element Element to be analyzed.
36
+ * @param {HTMLElement} thisHotContainer The Handsontable container.
37
+ * @returns {boolean}
38
+ */
39
+ export function isThisHotChild(element, thisHotContainer) {
40
+ const closestHandsontableContainer = element.closest('.handsontable');
41
+ return !!closestHandsontableContainer && (closestHandsontableContainer.parentNode === thisHotContainer || closestHandsontableContainer === thisHotContainer);
42
+ }
43
+
31
44
  /**
32
45
  * Gets `frameElement` of the specified frame. Returns null if it is a top frame or if script has no access to read property.
33
46
  *
@@ -41,7 +54,7 @@ export function getFrameElement(frame) {
41
54
  /**
42
55
  * Gets parent frame of the specified frame. Returns null if it is a top frame or if script has no access to read property.
43
56
  *
44
- * @param {Window} frame Frame from which should be get frameElement in safe way.
57
+ * @param {Window} frame Frame from which should get frameElement in a safe way.
45
58
  * @returns {Window|null}
46
59
  */
47
60
  export function getParentWindow(frame) {
@@ -51,7 +64,7 @@ export function getParentWindow(frame) {
51
64
  /**
52
65
  * Checks if script has access to read from parent frame of specified frame.
53
66
  *
54
- * @param {Window} frame Frame from which should be get frameElement in safe way.
67
+ * @param {Window} frame Frame from which should get frameElement in a safe way.
55
68
  * @returns {boolean}
56
69
  */
57
70
  export function hasAccessToParentWindow(frame) {
@@ -186,7 +199,7 @@ export function overlayContainsElement(overlayType, element, root) {
186
199
  }
187
200
 
188
201
  /**
189
- * @param {string} classNames The element "class" attribute string.
202
+ * @param {string[]} classNames The element "class" attribute string.
190
203
  * @returns {string[]}
191
204
  */
192
205
  function filterEmptyClassNames(classNames) {
@@ -196,6 +209,35 @@ function filterEmptyClassNames(classNames) {
196
209
  return classNames.filter(x => !!x);
197
210
  }
198
211
 
212
+ /**
213
+ * Filter out the RegExp entries from an array.
214
+ *
215
+ * @param {(string|RegExp)[]} list Array of either strings, Regexes or a mix of both.
216
+ * @param {boolean} [returnBoth] If `true`, both the array without regexes and an array of regexes will be returned.
217
+ * @returns {string[]|{regexFree: string[], regexes: RegExp[]}}
218
+ */
219
+ function filterRegexes(list, returnBoth) {
220
+ if (!list || !list.length) {
221
+ return returnBoth ? {
222
+ regexFree: [],
223
+ regexes: []
224
+ } : [];
225
+ }
226
+ const regexes = [];
227
+ const regexFree = [];
228
+ regexFree.push(...list.filter(entry => {
229
+ const isRegex = entry instanceof RegExp;
230
+ if (isRegex && returnBoth) {
231
+ regexes.push(entry);
232
+ }
233
+ return !isRegex;
234
+ }));
235
+ return returnBoth ? {
236
+ regexFree,
237
+ regexes
238
+ } : regexFree;
239
+ }
240
+
199
241
  /**
200
242
  * Checks if element has class name.
201
243
  *
@@ -230,16 +272,86 @@ export function addClass(element, className) {
230
272
  * Remove class name from an element.
231
273
  *
232
274
  * @param {HTMLElement} element An element to process.
233
- * @param {string|Array} className Class name as string or array of strings.
275
+ * @param {string|Array<string|RegExp>} className Class name as string or array of strings.
234
276
  */
235
277
  export function removeClass(element, className) {
236
278
  if (typeof className === 'string') {
237
279
  className = className.split(' ');
280
+ } else if (className instanceof RegExp) {
281
+ className = [className];
238
282
  }
239
- className = filterEmptyClassNames(className);
240
- if (className.length > 0) {
241
- element.classList.remove(...className);
283
+ let {
284
+ regexFree: stringClasses,
285
+ // eslint-disable-next-line prefer-const
286
+ regexes: regexClasses
287
+ } = filterRegexes(className, true);
288
+ stringClasses = filterEmptyClassNames(stringClasses);
289
+ if (stringClasses.length > 0) {
290
+ element.classList.remove(...stringClasses);
242
291
  }
292
+ regexClasses.forEach(regexClassName => {
293
+ element.classList.forEach(currentClassName => {
294
+ if (regexClassName.test(currentClassName)) {
295
+ element.classList.remove(currentClassName);
296
+ }
297
+ });
298
+ });
299
+ }
300
+
301
+ /**
302
+ * Set a single attribute or multiple attributes at once.
303
+ *
304
+ * @param {HTMLElement} domElement The HTML element to be modified.
305
+ * @param {Array[]|string} attributes If setting multiple attributes at once, `attributes` holds an array containing the
306
+ * attributes to be added. Each element of the array should be an array in a form of `[attributeName,
307
+ * attributeValue]`. If setting a single attribute, `attributes` holds the name of the attribute.
308
+ * @param {string|number|undefined} [attributeValue] If setting a single attribute, `attributeValue` holds the attribute
309
+ * value.
310
+ */
311
+ export function setAttribute(domElement) {
312
+ let attributes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
313
+ let attributeValue = arguments.length > 2 ? arguments[2] : undefined;
314
+ if (!Array.isArray(attributes)) {
315
+ attributes = [[attributes, attributeValue]];
316
+ }
317
+ attributes.forEach(attributeInfo => {
318
+ if (Array.isArray(attributeInfo) && attributeInfo[0] !== '') {
319
+ domElement.setAttribute(...attributeInfo);
320
+ }
321
+ });
322
+ }
323
+
324
+ /**
325
+ * Remove a single attribute or multiple attributes from the provided element at once.
326
+ *
327
+ * @param {HTMLElement} domElement The HTML element to be processed.
328
+ * @param {Array<string|RegExp>|string} attributesToRemove If removing multiple attributes, `attributesToRemove`
329
+ * holds an array of attribute names to be removed from the provided element. If removing a single attribute, it
330
+ * holds the attribute name.
331
+ */
332
+ export function removeAttribute(domElement) {
333
+ let attributesToRemove = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
334
+ if (typeof attributesToRemove === 'string') {
335
+ attributesToRemove = attributesToRemove.split(' ');
336
+ } else if (attributesToRemove instanceof RegExp) {
337
+ attributesToRemove = [attributesToRemove];
338
+ }
339
+ const {
340
+ regexFree: stringAttributes,
341
+ regexes: regexAttributes
342
+ } = filterRegexes(attributesToRemove, true);
343
+ stringAttributes.forEach(attributeNameToRemove => {
344
+ if (attributeNameToRemove !== '') {
345
+ domElement.removeAttribute(attributeNameToRemove);
346
+ }
347
+ });
348
+ regexAttributes.forEach(attributeRegex => {
349
+ domElement.getAttributeNames().forEach(attributeName => {
350
+ if (attributeRegex.test(attributeName)) {
351
+ domElement.removeAttribute(attributeName);
352
+ }
353
+ });
354
+ });
243
355
  }
244
356
 
245
357
  /**
@@ -257,7 +369,7 @@ export function removeTextNodes(element) {
257
369
  }
258
370
 
259
371
  /**
260
- * Remove childs function
372
+ * Remove children function
261
373
  * WARNING - this doesn't unload events and data attached by jQuery
262
374
  * http://jsperf.com/jquery-html-vs-empty-vs-innerhtml/9
263
375
  * http://jsperf.com/jquery-html-vs-empty-vs-innerhtml/11 - no siginificant improvement with Chrome remove() method.
@@ -275,7 +387,7 @@ export function empty(element) {
275
387
  export const HTML_CHARACTERS = /(<(.*)>|&(.*);)/;
276
388
 
277
389
  /**
278
- * Insert content into element trying avoid innerHTML method.
390
+ * Insert content into element trying to avoid innerHTML method.
279
391
  *
280
392
  * @param {HTMLElement} element An element to write into.
281
393
  * @param {string} content The text to write.
@@ -338,7 +450,7 @@ export function isVisible(element) {
338
450
  } else {
339
451
  return false; // this is a node detached from document in IE8
340
452
  }
341
- } else if (next.style && next.style.display === 'none') {
453
+ } else if (getComputedStyle(next).display === 'none') {
342
454
  return false;
343
455
  }
344
456
  next = next.parentNode;
@@ -370,6 +482,11 @@ export function offset(element) {
370
482
  if (elementToCheck === rootDocument.body) {
371
483
  break;
372
484
  }
485
+ // If the element is inside an SVG context, the `offsetParent` can be
486
+ // a <foreignObject> that does not have properties `offsetLeft` and `offsetTop` defined.
487
+ if (!('offsetLeft' in elementToCheck)) {
488
+ break;
489
+ }
373
490
  offsetLeft += elementToCheck.offsetLeft;
374
491
  offsetTop += elementToCheck.offsetTop;
375
492
  lastElem = elementToCheck;
@@ -899,4 +1016,93 @@ export function observeVisibilityChangeOnce(elementToBeObserved, callback) {
899
1016
  root: elementToBeObserved.ownerDocument.body
900
1017
  });
901
1018
  visibilityObserver.observe(elementToBeObserved);
1019
+ }
1020
+
1021
+ /**
1022
+ * Add a `contenteditable` attribute, select the contents and optionally add the `invisibleSelection`
1023
+ * class to the provided element.
1024
+ *
1025
+ * @param {HTMLElement} element Element to be processed.
1026
+ * @param {boolean} [invisibleSelection=true] `true` if the class should be added to the element.
1027
+ * @param {boolean} [ariaHidden=true] `true` if the `aria-hidden` attribute should be added to the processed element.
1028
+ */
1029
+ export function makeElementContentEditableAndSelectItsContent(element) {
1030
+ let invisibleSelection = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
1031
+ let ariaHidden = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
1032
+ const ownerDocument = element.ownerDocument;
1033
+ const range = ownerDocument.createRange();
1034
+ const sel = ownerDocument.defaultView.getSelection();
1035
+ setAttribute(element, 'contenteditable', true);
1036
+ if (ariaHidden) {
1037
+ setAttribute(element, ...A11Y_HIDDEN());
1038
+ }
1039
+ if (invisibleSelection) {
1040
+ addClass(element, 'invisibleSelection');
1041
+ }
1042
+ range.selectNodeContents(element);
1043
+ sel.removeAllRanges();
1044
+ sel.addRange(range);
1045
+ }
1046
+
1047
+ /**
1048
+ * Remove the `contenteditable` attribute, deselect the contents and optionally remove the `invisibleSelection`
1049
+ * class from the provided element.
1050
+ *
1051
+ * @param {HTMLElement} selectedElement The element to be deselected.
1052
+ * @param {boolean} [removeInvisibleSelectionClass=true] `true` if the class should be removed from the element.
1053
+ */
1054
+ export function removeContentEditableFromElementAndDeselect(selectedElement) {
1055
+ let removeInvisibleSelectionClass = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
1056
+ const sel = selectedElement.ownerDocument.defaultView.getSelection();
1057
+ if (selectedElement.hasAttribute('aria-hidden')) {
1058
+ selectedElement.removeAttribute('aria-hidden');
1059
+ }
1060
+ sel.removeAllRanges();
1061
+ if (removeInvisibleSelectionClass) {
1062
+ removeClass(selectedElement, 'invisibleSelection');
1063
+ }
1064
+ selectedElement.removeAttribute('contenteditable');
1065
+ }
1066
+
1067
+ /**
1068
+ * Run the provided callback while the provided element is selected and modified to have the `contenteditable`
1069
+ * attribute added. Optionally, the selection can be configured to be invisible.
1070
+ *
1071
+ * @param {HTMLElement} element Element to be selected.
1072
+ * @param {Function} callback Callback to be called.
1073
+ * @param {boolean} [invisibleSelection=true] `true` if the selection should be invisible.
1074
+ */
1075
+ export function runWithSelectedContendEditableElement(element, callback) {
1076
+ let invisibleSelection = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
1077
+ makeElementContentEditableAndSelectItsContent(element, invisibleSelection);
1078
+ callback();
1079
+ removeContentEditableFromElementAndDeselect(element, invisibleSelection);
1080
+ }
1081
+
1082
+ /**
1083
+ * Creates a new DOM element and appends it to the parent element with the provided class name(s) and attributes.
1084
+ *
1085
+ * @param {HTMLElement} parentElement The parent element.
1086
+ * @param {object} properties The properties object.
1087
+ * @param {string} properties.tagName The type of the new element.
1088
+ * @param {string|string[]} properties.className Class name as string or array of strings.
1089
+ * @param {Array[]} properties.attributes An array containing the attributes to be added. Each element of the array
1090
+ * should be an array in a form of `[attributeName, attributeValue]`.
1091
+ * @returns {HTMLElement} The created div element.
1092
+ */
1093
+ export function appendElement(parentElement, _ref) {
1094
+ let {
1095
+ tagName,
1096
+ className,
1097
+ attributes
1098
+ } = _ref;
1099
+ const element = parentElement.ownerDocument.createElement(tagName);
1100
+ if (className) {
1101
+ addClass(element, className);
1102
+ }
1103
+ if (attributes && attributes.length) {
1104
+ setAttribute(element, attributes);
1105
+ }
1106
+ parentElement.appendChild(element);
1107
+ return element;
902
1108
  }
@@ -2,3 +2,4 @@ export function stopImmediatePropagation(event: Event): void;
2
2
  export function isImmediatePropagationStopped(event: Event): boolean;
3
3
  export function isRightClick(event: Event): boolean;
4
4
  export function isLeftClick(event: Event): boolean;
5
+ export function offsetRelativeTo(event: Event, untilElement: HTMLElement | undefined): { x: number, y: number };