jodit-pro 4.12.26 → 4.12.27

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 (299) hide show
  1. package/es2015/jodit.css +1 -1
  2. package/es2015/jodit.fat.min.js +9 -9
  3. package/es2015/jodit.js +190 -50
  4. package/es2015/jodit.min.js +9 -9
  5. package/es2015/plugins/ai-assistant-pro/ai-assistant-pro.css +1 -1
  6. package/es2015/plugins/ai-assistant-pro/ai-assistant-pro.js +1 -1
  7. package/es2015/plugins/ai-assistant-pro/ai-assistant-pro.min.js +1 -1
  8. package/es2015/plugins/autocomplete/autocomplete.js +1 -1
  9. package/es2015/plugins/autocomplete/autocomplete.min.js +1 -1
  10. package/es2015/plugins/backup/backup.css +1 -1
  11. package/es2015/plugins/backup/backup.js +1 -1
  12. package/es2015/plugins/backup/backup.min.js +1 -1
  13. package/es2015/plugins/button-generator/button-generator.css +1 -1
  14. package/es2015/plugins/button-generator/button-generator.js +1 -1
  15. package/es2015/plugins/button-generator/button-generator.min.js +1 -1
  16. package/es2015/plugins/change-case/change-case.js +1 -1
  17. package/es2015/plugins/change-case/change-case.min.js +1 -1
  18. package/es2015/plugins/color-picker/color-picker.css +1 -1
  19. package/es2015/plugins/color-picker/color-picker.js +1 -1
  20. package/es2015/plugins/color-picker/color-picker.min.js +1 -1
  21. package/es2015/plugins/emoji/emoji.css +1 -1
  22. package/es2015/plugins/emoji/emoji.js +1 -1
  23. package/es2015/plugins/emoji/emoji.min.js +1 -1
  24. package/es2015/plugins/export-docs/export-docs.js +1 -1
  25. package/es2015/plugins/export-docs/export-docs.min.js +1 -1
  26. package/es2015/plugins/finder/finder.css +1 -1
  27. package/es2015/plugins/finder/finder.js +1 -1
  28. package/es2015/plugins/finder/finder.min.js +1 -1
  29. package/es2015/plugins/google-maps/google-maps.css +1 -1
  30. package/es2015/plugins/google-maps/google-maps.js +1 -1
  31. package/es2015/plugins/google-maps/google-maps.min.js +1 -1
  32. package/es2015/plugins/google-search/google-search.js +1 -1
  33. package/es2015/plugins/google-search/google-search.min.js +1 -1
  34. package/es2015/plugins/highlight-signature/highlight-signature.js +1 -1
  35. package/es2015/plugins/highlight-signature/highlight-signature.min.js +1 -1
  36. package/es2015/plugins/iframe-editor/iframe-editor.css +1 -1
  37. package/es2015/plugins/iframe-editor/iframe-editor.js +1 -1
  38. package/es2015/plugins/iframe-editor/iframe-editor.min.js +1 -1
  39. package/es2015/plugins/keyboard/keyboard.css +1 -1
  40. package/es2015/plugins/keyboard/keyboard.js +1 -1
  41. package/es2015/plugins/keyboard/keyboard.min.js +1 -1
  42. package/es2015/plugins/mobile-view/mobile-view.js +1 -1
  43. package/es2015/plugins/mobile-view/mobile-view.min.js +1 -1
  44. package/es2015/plugins/page-break/page-break.js +1 -1
  45. package/es2015/plugins/page-break/page-break.min.js +1 -1
  46. package/es2015/plugins/paste-code/paste-code.css +1 -1
  47. package/es2015/plugins/paste-code/paste-code.js +1 -1
  48. package/es2015/plugins/paste-code/paste-code.min.js +1 -1
  49. package/es2015/plugins/paste-from-word/paste-from-word.js +1 -1
  50. package/es2015/plugins/paste-from-word/paste-from-word.min.js +1 -1
  51. package/es2015/plugins/show-blocks/show-blocks.js +1 -1
  52. package/es2015/plugins/show-blocks/show-blocks.min.js +1 -1
  53. package/es2015/plugins/style/style.css +1 -1
  54. package/es2015/plugins/style/style.js +1 -1
  55. package/es2015/plugins/style/style.min.js +1 -1
  56. package/es2015/plugins/templates/templates.css +1 -1
  57. package/es2015/plugins/templates/templates.js +1 -1
  58. package/es2015/plugins/templates/templates.min.js +1 -1
  59. package/es2015/plugins/todo-list/todo-list.css +1 -1
  60. package/es2015/plugins/todo-list/todo-list.js +1 -1
  61. package/es2015/plugins/todo-list/todo-list.min.js +1 -1
  62. package/es2015/plugins/translate/translate.css +1 -1
  63. package/es2015/plugins/translate/translate.js +1 -1
  64. package/es2015/plugins/translate/translate.min.js +1 -1
  65. package/es2015/plugins/tune-block/tune-block.css +1 -1
  66. package/es2015/plugins/tune-block/tune-block.js +1 -1
  67. package/es2015/plugins/tune-block/tune-block.min.js +1 -1
  68. package/es2018/jodit.fat.min.js +9 -9
  69. package/es2018/jodit.min.js +10 -10
  70. package/es2018/plugins/ai-assistant-pro/ai-assistant-pro.min.js +1 -1
  71. package/es2018/plugins/autocomplete/autocomplete.min.js +1 -1
  72. package/es2018/plugins/backup/backup.min.js +1 -1
  73. package/es2018/plugins/button-generator/button-generator.min.js +1 -1
  74. package/es2018/plugins/change-case/change-case.min.js +1 -1
  75. package/es2018/plugins/color-picker/color-picker.min.js +1 -1
  76. package/es2018/plugins/emoji/emoji.min.js +1 -1
  77. package/es2018/plugins/export-docs/export-docs.min.js +1 -1
  78. package/es2018/plugins/finder/finder.min.js +1 -1
  79. package/es2018/plugins/google-maps/google-maps.min.js +1 -1
  80. package/es2018/plugins/google-search/google-search.min.js +1 -1
  81. package/es2018/plugins/highlight-signature/highlight-signature.min.js +1 -1
  82. package/es2018/plugins/iframe-editor/iframe-editor.min.js +1 -1
  83. package/es2018/plugins/keyboard/keyboard.min.js +1 -1
  84. package/es2018/plugins/mobile-view/mobile-view.min.js +1 -1
  85. package/es2018/plugins/page-break/page-break.min.js +1 -1
  86. package/es2018/plugins/paste-code/paste-code.min.js +1 -1
  87. package/es2018/plugins/paste-from-word/paste-from-word.min.js +1 -1
  88. package/es2018/plugins/show-blocks/show-blocks.min.js +1 -1
  89. package/es2018/plugins/style/style.min.js +1 -1
  90. package/es2018/plugins/templates/templates.min.js +1 -1
  91. package/es2018/plugins/todo-list/todo-list.min.js +1 -1
  92. package/es2018/plugins/translate/translate.min.js +1 -1
  93. package/es2018/plugins/tune-block/tune-block.min.js +1 -1
  94. package/es2021/jodit.css +1 -1
  95. package/es2021/jodit.fat.min.js +11 -11
  96. package/es2021/jodit.js +189 -49
  97. package/es2021/jodit.min.js +13 -13
  98. package/es2021/plugins/ai-assistant-pro/ai-assistant-pro.css +1 -1
  99. package/es2021/plugins/ai-assistant-pro/ai-assistant-pro.js +1 -1
  100. package/es2021/plugins/ai-assistant-pro/ai-assistant-pro.min.js +1 -1
  101. package/es2021/plugins/autocomplete/autocomplete.js +1 -1
  102. package/es2021/plugins/autocomplete/autocomplete.min.js +1 -1
  103. package/es2021/plugins/backup/backup.css +1 -1
  104. package/es2021/plugins/backup/backup.js +1 -1
  105. package/es2021/plugins/backup/backup.min.js +1 -1
  106. package/es2021/plugins/button-generator/button-generator.css +1 -1
  107. package/es2021/plugins/button-generator/button-generator.js +1 -1
  108. package/es2021/plugins/button-generator/button-generator.min.js +1 -1
  109. package/es2021/plugins/change-case/change-case.js +1 -1
  110. package/es2021/plugins/change-case/change-case.min.js +1 -1
  111. package/es2021/plugins/color-picker/color-picker.css +1 -1
  112. package/es2021/plugins/color-picker/color-picker.js +1 -1
  113. package/es2021/plugins/color-picker/color-picker.min.js +1 -1
  114. package/es2021/plugins/emoji/emoji.css +1 -1
  115. package/es2021/plugins/emoji/emoji.js +1 -1
  116. package/es2021/plugins/emoji/emoji.min.js +1 -1
  117. package/es2021/plugins/export-docs/export-docs.js +1 -1
  118. package/es2021/plugins/export-docs/export-docs.min.js +1 -1
  119. package/es2021/plugins/finder/finder.css +1 -1
  120. package/es2021/plugins/finder/finder.js +1 -1
  121. package/es2021/plugins/finder/finder.min.js +1 -1
  122. package/es2021/plugins/google-maps/google-maps.css +1 -1
  123. package/es2021/plugins/google-maps/google-maps.js +1 -1
  124. package/es2021/plugins/google-maps/google-maps.min.js +1 -1
  125. package/es2021/plugins/google-search/google-search.js +1 -1
  126. package/es2021/plugins/google-search/google-search.min.js +1 -1
  127. package/es2021/plugins/highlight-signature/highlight-signature.js +1 -1
  128. package/es2021/plugins/highlight-signature/highlight-signature.min.js +1 -1
  129. package/es2021/plugins/iframe-editor/iframe-editor.css +1 -1
  130. package/es2021/plugins/iframe-editor/iframe-editor.js +1 -1
  131. package/es2021/plugins/iframe-editor/iframe-editor.min.js +1 -1
  132. package/es2021/plugins/keyboard/keyboard.css +1 -1
  133. package/es2021/plugins/keyboard/keyboard.js +1 -1
  134. package/es2021/plugins/keyboard/keyboard.min.js +1 -1
  135. package/es2021/plugins/mobile-view/mobile-view.js +1 -1
  136. package/es2021/plugins/mobile-view/mobile-view.min.js +1 -1
  137. package/es2021/plugins/page-break/page-break.js +1 -1
  138. package/es2021/plugins/page-break/page-break.min.js +1 -1
  139. package/es2021/plugins/paste-code/paste-code.css +1 -1
  140. package/es2021/plugins/paste-code/paste-code.js +1 -1
  141. package/es2021/plugins/paste-code/paste-code.min.js +1 -1
  142. package/es2021/plugins/paste-from-word/paste-from-word.js +1 -1
  143. package/es2021/plugins/paste-from-word/paste-from-word.min.js +1 -1
  144. package/es2021/plugins/show-blocks/show-blocks.js +1 -1
  145. package/es2021/plugins/show-blocks/show-blocks.min.js +1 -1
  146. package/es2021/plugins/style/style.css +1 -1
  147. package/es2021/plugins/style/style.js +1 -1
  148. package/es2021/plugins/style/style.min.js +1 -1
  149. package/es2021/plugins/templates/templates.css +1 -1
  150. package/es2021/plugins/templates/templates.js +1 -1
  151. package/es2021/plugins/templates/templates.min.js +1 -1
  152. package/es2021/plugins/todo-list/todo-list.css +1 -1
  153. package/es2021/plugins/todo-list/todo-list.js +1 -1
  154. package/es2021/plugins/todo-list/todo-list.min.js +1 -1
  155. package/es2021/plugins/translate/translate.css +1 -1
  156. package/es2021/plugins/translate/translate.js +1 -1
  157. package/es2021/plugins/translate/translate.min.js +1 -1
  158. package/es2021/plugins/tune-block/tune-block.css +1 -1
  159. package/es2021/plugins/tune-block/tune-block.js +1 -1
  160. package/es2021/plugins/tune-block/tune-block.min.js +1 -1
  161. package/es2021.en/jodit.css +1 -1
  162. package/es2021.en/jodit.fat.min.js +13 -13
  163. package/es2021.en/jodit.js +189 -49
  164. package/es2021.en/jodit.min.js +11 -11
  165. package/es2021.en/plugins/ai-assistant-pro/ai-assistant-pro.css +1 -1
  166. package/es2021.en/plugins/ai-assistant-pro/ai-assistant-pro.js +1 -1
  167. package/es2021.en/plugins/ai-assistant-pro/ai-assistant-pro.min.js +1 -1
  168. package/es2021.en/plugins/autocomplete/autocomplete.js +1 -1
  169. package/es2021.en/plugins/autocomplete/autocomplete.min.js +1 -1
  170. package/es2021.en/plugins/backup/backup.css +1 -1
  171. package/es2021.en/plugins/backup/backup.js +1 -1
  172. package/es2021.en/plugins/backup/backup.min.js +1 -1
  173. package/es2021.en/plugins/button-generator/button-generator.css +1 -1
  174. package/es2021.en/plugins/button-generator/button-generator.js +1 -1
  175. package/es2021.en/plugins/button-generator/button-generator.min.js +1 -1
  176. package/es2021.en/plugins/change-case/change-case.js +1 -1
  177. package/es2021.en/plugins/change-case/change-case.min.js +1 -1
  178. package/es2021.en/plugins/color-picker/color-picker.css +1 -1
  179. package/es2021.en/plugins/color-picker/color-picker.js +1 -1
  180. package/es2021.en/plugins/color-picker/color-picker.min.js +1 -1
  181. package/es2021.en/plugins/emoji/emoji.css +1 -1
  182. package/es2021.en/plugins/emoji/emoji.js +1 -1
  183. package/es2021.en/plugins/emoji/emoji.min.js +1 -1
  184. package/es2021.en/plugins/export-docs/export-docs.js +1 -1
  185. package/es2021.en/plugins/export-docs/export-docs.min.js +1 -1
  186. package/es2021.en/plugins/finder/finder.css +1 -1
  187. package/es2021.en/plugins/finder/finder.js +1 -1
  188. package/es2021.en/plugins/finder/finder.min.js +1 -1
  189. package/es2021.en/plugins/google-maps/google-maps.css +1 -1
  190. package/es2021.en/plugins/google-maps/google-maps.js +1 -1
  191. package/es2021.en/plugins/google-maps/google-maps.min.js +1 -1
  192. package/es2021.en/plugins/google-search/google-search.js +1 -1
  193. package/es2021.en/plugins/google-search/google-search.min.js +1 -1
  194. package/es2021.en/plugins/highlight-signature/highlight-signature.js +1 -1
  195. package/es2021.en/plugins/highlight-signature/highlight-signature.min.js +1 -1
  196. package/es2021.en/plugins/iframe-editor/iframe-editor.css +1 -1
  197. package/es2021.en/plugins/iframe-editor/iframe-editor.js +1 -1
  198. package/es2021.en/plugins/iframe-editor/iframe-editor.min.js +1 -1
  199. package/es2021.en/plugins/keyboard/keyboard.css +1 -1
  200. package/es2021.en/plugins/keyboard/keyboard.js +1 -1
  201. package/es2021.en/plugins/keyboard/keyboard.min.js +1 -1
  202. package/es2021.en/plugins/mobile-view/mobile-view.js +1 -1
  203. package/es2021.en/plugins/mobile-view/mobile-view.min.js +1 -1
  204. package/es2021.en/plugins/page-break/page-break.js +1 -1
  205. package/es2021.en/plugins/page-break/page-break.min.js +1 -1
  206. package/es2021.en/plugins/paste-code/paste-code.css +1 -1
  207. package/es2021.en/plugins/paste-code/paste-code.js +1 -1
  208. package/es2021.en/plugins/paste-code/paste-code.min.js +1 -1
  209. package/es2021.en/plugins/paste-from-word/paste-from-word.js +1 -1
  210. package/es2021.en/plugins/paste-from-word/paste-from-word.min.js +1 -1
  211. package/es2021.en/plugins/show-blocks/show-blocks.js +1 -1
  212. package/es2021.en/plugins/show-blocks/show-blocks.min.js +1 -1
  213. package/es2021.en/plugins/style/style.css +1 -1
  214. package/es2021.en/plugins/style/style.js +1 -1
  215. package/es2021.en/plugins/style/style.min.js +1 -1
  216. package/es2021.en/plugins/templates/templates.css +1 -1
  217. package/es2021.en/plugins/templates/templates.js +1 -1
  218. package/es2021.en/plugins/templates/templates.min.js +1 -1
  219. package/es2021.en/plugins/todo-list/todo-list.css +1 -1
  220. package/es2021.en/plugins/todo-list/todo-list.js +1 -1
  221. package/es2021.en/plugins/todo-list/todo-list.min.js +1 -1
  222. package/es2021.en/plugins/translate/translate.css +1 -1
  223. package/es2021.en/plugins/translate/translate.js +1 -1
  224. package/es2021.en/plugins/translate/translate.min.js +1 -1
  225. package/es2021.en/plugins/tune-block/tune-block.css +1 -1
  226. package/es2021.en/plugins/tune-block/tune-block.js +1 -1
  227. package/es2021.en/plugins/tune-block/tune-block.min.js +1 -1
  228. package/es5/jodit.css +2 -2
  229. package/es5/jodit.fat.min.js +2 -2
  230. package/es5/jodit.js +234 -85
  231. package/es5/jodit.min.css +2 -2
  232. package/es5/jodit.min.js +2 -2
  233. package/es5/plugins/ai-assistant-pro/ai-assistant-pro.css +1 -1
  234. package/es5/plugins/ai-assistant-pro/ai-assistant-pro.js +1 -1
  235. package/es5/plugins/ai-assistant-pro/ai-assistant-pro.min.js +1 -1
  236. package/es5/plugins/autocomplete/autocomplete.js +1 -1
  237. package/es5/plugins/autocomplete/autocomplete.min.js +1 -1
  238. package/es5/plugins/backup/backup.css +1 -1
  239. package/es5/plugins/backup/backup.js +1 -1
  240. package/es5/plugins/backup/backup.min.js +1 -1
  241. package/es5/plugins/button-generator/button-generator.css +1 -1
  242. package/es5/plugins/button-generator/button-generator.js +1 -1
  243. package/es5/plugins/button-generator/button-generator.min.js +1 -1
  244. package/es5/plugins/change-case/change-case.js +1 -1
  245. package/es5/plugins/change-case/change-case.min.js +1 -1
  246. package/es5/plugins/color-picker/color-picker.css +1 -1
  247. package/es5/plugins/color-picker/color-picker.js +1 -1
  248. package/es5/plugins/color-picker/color-picker.min.js +1 -1
  249. package/es5/plugins/emoji/emoji.css +1 -1
  250. package/es5/plugins/emoji/emoji.js +1 -1
  251. package/es5/plugins/emoji/emoji.min.js +1 -1
  252. package/es5/plugins/export-docs/export-docs.js +1 -1
  253. package/es5/plugins/export-docs/export-docs.min.js +1 -1
  254. package/es5/plugins/finder/finder.css +1 -1
  255. package/es5/plugins/finder/finder.js +1 -1
  256. package/es5/plugins/finder/finder.min.js +1 -1
  257. package/es5/plugins/google-maps/google-maps.css +1 -1
  258. package/es5/plugins/google-maps/google-maps.js +1 -1
  259. package/es5/plugins/google-maps/google-maps.min.js +1 -1
  260. package/es5/plugins/google-search/google-search.js +1 -1
  261. package/es5/plugins/google-search/google-search.min.js +1 -1
  262. package/es5/plugins/highlight-signature/highlight-signature.js +1 -1
  263. package/es5/plugins/highlight-signature/highlight-signature.min.js +1 -1
  264. package/es5/plugins/iframe-editor/iframe-editor.css +1 -1
  265. package/es5/plugins/iframe-editor/iframe-editor.js +1 -1
  266. package/es5/plugins/iframe-editor/iframe-editor.min.js +1 -1
  267. package/es5/plugins/keyboard/keyboard.css +1 -1
  268. package/es5/plugins/keyboard/keyboard.js +1 -1
  269. package/es5/plugins/keyboard/keyboard.min.js +1 -1
  270. package/es5/plugins/mobile-view/mobile-view.js +1 -1
  271. package/es5/plugins/mobile-view/mobile-view.min.js +1 -1
  272. package/es5/plugins/page-break/page-break.js +1 -1
  273. package/es5/plugins/page-break/page-break.min.js +1 -1
  274. package/es5/plugins/paste-code/paste-code.css +1 -1
  275. package/es5/plugins/paste-code/paste-code.js +1 -1
  276. package/es5/plugins/paste-code/paste-code.min.js +1 -1
  277. package/es5/plugins/paste-from-word/paste-from-word.js +1 -1
  278. package/es5/plugins/paste-from-word/paste-from-word.min.js +1 -1
  279. package/es5/plugins/show-blocks/show-blocks.js +1 -1
  280. package/es5/plugins/show-blocks/show-blocks.min.js +1 -1
  281. package/es5/plugins/style/style.css +1 -1
  282. package/es5/plugins/style/style.js +1 -1
  283. package/es5/plugins/style/style.min.js +1 -1
  284. package/es5/plugins/templates/templates.css +1 -1
  285. package/es5/plugins/templates/templates.js +1 -1
  286. package/es5/plugins/templates/templates.min.js +1 -1
  287. package/es5/plugins/todo-list/todo-list.css +1 -1
  288. package/es5/plugins/todo-list/todo-list.js +1 -1
  289. package/es5/plugins/todo-list/todo-list.min.js +1 -1
  290. package/es5/plugins/translate/translate.css +1 -1
  291. package/es5/plugins/translate/translate.js +1 -1
  292. package/es5/plugins/translate/translate.min.js +1 -1
  293. package/es5/plugins/tune-block/tune-block.css +1 -1
  294. package/es5/plugins/tune-block/tune-block.js +1 -1
  295. package/es5/plugins/tune-block/tune-block.min.js +1 -1
  296. package/es5/polyfills.fat.min.js +1 -1
  297. package/es5/polyfills.js +1 -1
  298. package/es5/polyfills.min.js +1 -1
  299. package/package.json +1 -1
package/es2021/jodit.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /*!
2
2
  * jodit-pro - PRO Version of Jodit Editor
3
3
  * Author: Chupurnov Valerii <chupurnov@gmail.com>
4
- * Version: v4.12.26
4
+ * Version: v4.12.27
5
5
  * Url: https://xdsoft.net/jodit/pro/
6
6
  * License(s): SEE LICENSE IN LICENSE.md
7
7
  */
@@ -1645,6 +1645,14 @@ class ViewComponent extends _component_js__WEBPACK_IMPORTED_MODULE_0__.Component
1645
1645
  * Attach component to View
1646
1646
  */ setParentView(jodit) {
1647
1647
  this.jodit = jodit;
1648
+ // Inherit the owner window from the parent view — for an editor
1649
+ // created with a custom `ownerWindow` (e.g. inside an iframe) the
1650
+ // component default (the global `window`) is wrong: outside-click
1651
+ // handlers of dropdowns/popups listened to the wrong window. See
1652
+ // https://github.com/xdan/jodit/issues/965
1653
+ if (jodit.ow) {
1654
+ this.ownerWindow = jodit.ow;
1655
+ }
1648
1656
  jodit.components.add(this);
1649
1657
  return this;
1650
1658
  }
@@ -1746,7 +1754,7 @@ __webpack_require__.r(__webpack_exports__);
1746
1754
  * ```
1747
1755
  * @packageDocumentation
1748
1756
  * @module constants
1749
- */ const APP_VERSION = "4.12.26";
1757
+ */ const APP_VERSION = "4.12.27";
1750
1758
  // prettier-ignore
1751
1759
  const ES = "es2021";
1752
1760
  const IS_ES_MODERN = true;
@@ -5030,9 +5038,15 @@ function isFastEqual(a, b) {
5030
5038
  */ /**
5031
5039
  * @module helpers/checker
5032
5040
  */ /**
5033
- * Detect if string is HTML from MS Word or Excel
5041
+ * Detect if string is HTML from MS Word, Excel or LibreOffice/OpenOffice
5034
5042
  */ function isHtmlFromWord(data) {
5035
- return data.search(/<meta.*?Microsoft Excel\s[\d].*?>/) !== -1 || data.search(/<meta.*?Microsoft Word\s[\d].*?>/) !== -1 || data.search(/style="[^"]*mso-/) !== -1 && data.search(/<font/) !== -1;
5043
+ return data.search(/<meta.*?Microsoft Excel\s[\d].*?>/) !== -1 || data.search(/<meta.*?Microsoft Word\s[\d].*?>/) !== -1 || // `<meta name=ProgId content=Word.Document>` attribute values are
5044
+ // unquoted in the raw Word clipboard fragment
5045
+ data.search(/<meta[^>]*?ProgId[^>]*?(Word|Excel)\./i) !== -1 || // LibreOffice/OpenOffice Writer & Calc
5046
+ data.search(/<meta[^>]*?(LibreOffice|OpenOffice)/i) !== -1 || // Office namespaces on the root element of the clipboard fragment
5047
+ data.search(/urn:schemas-microsoft-com:office:(word|excel)/) !== -1 || // `class=MsoNormal` and friends (unquoted/quoted)
5048
+ data.search(/<\w[^>]*\sclass=("|')?Mso/) !== -1 || // the raw Word clipboard uses SINGLE quotes: style='mso-…'
5049
+ data.search(/style='[^']*mso-/) !== -1 || data.search(/style="[^"]*mso-/) !== -1 && data.search(/<font/) !== -1;
5036
5050
  }
5037
5051
 
5038
5052
 
@@ -12045,8 +12059,9 @@ function toggleAttribute(jodit, value, elm, key, dry, mode) {
12045
12059
  /* harmony export */ });
12046
12060
  /* harmony import */ var _dom_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(22732);
12047
12061
  /* harmony import */ var _helpers_utils_attr_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(29960);
12048
- /* harmony import */ var _list_wrap_list_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(82515);
12049
- /* harmony import */ var _wrap_unwrapped_text_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(6980);
12062
+ /* harmony import */ var _helpers_utils_css_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(41180);
12063
+ /* harmony import */ var _list_wrap_list_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(82515);
12064
+ /* harmony import */ var _wrap_unwrapped_text_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(6980);
12050
12065
  /*!
12051
12066
  * Jodit Editor (https://xdsoft.net/jodit/)
12052
12067
  * Released under MIT see LICENSE.txt in the project root for license information.
@@ -12055,12 +12070,29 @@ function toggleAttribute(jodit, value, elm, key, dry, mode) {
12055
12070
 
12056
12071
 
12057
12072
 
12073
+
12058
12074
  /**
12059
12075
  * Replaces the parent tag with the applicable one, or wraps the text and also replaces the tag
12060
12076
  * @private
12061
12077
  */ function wrap(commitStyle, font, jodit) {
12062
12078
  const wrapper = findOrCreateWrapper(commitStyle, font, jodit);
12063
- return commitStyle.elementIsList ? (0,_list_wrap_list_js__WEBPACK_IMPORTED_MODULE_2__.wrapList)(commitStyle, wrapper, jodit) : _dom_index_js__WEBPACK_IMPORTED_MODULE_0__.Dom.replace(wrapper, commitStyle.element, jodit.createInside, true);
12079
+ if (commitStyle.elementIsList) {
12080
+ return (0,_list_wrap_list_js__WEBPACK_IMPORTED_MODULE_3__.wrapList)(commitStyle, wrapper, jodit);
12081
+ }
12082
+ const newWrapper = _dom_index_js__WEBPACK_IMPORTED_MODULE_0__.Dom.replace(wrapper, commitStyle.element, jodit.createInside, true);
12083
+ if (commitStyle.elementIsBlock) {
12084
+ // Inline font styles left over from pasted content visually override
12085
+ // the new block format — e.g. an h2 with `font-weight: normal;
12086
+ // font-size: 24px` does not look like a heading at all, so the
12087
+ // command seems to do nothing. See
12088
+ // https://github.com/xdan/jodit/issues/1063
12089
+ (0,_helpers_utils_css_js__WEBPACK_IMPORTED_MODULE_2__.css)(newWrapper, 'fontSize', null);
12090
+ (0,_helpers_utils_css_js__WEBPACK_IMPORTED_MODULE_2__.css)(newWrapper, 'fontWeight', null);
12091
+ if (!(0,_helpers_utils_attr_js__WEBPACK_IMPORTED_MODULE_1__.attr)(newWrapper, 'style')) {
12092
+ (0,_helpers_utils_attr_js__WEBPACK_IMPORTED_MODULE_1__.attr)(newWrapper, 'style', null);
12093
+ }
12094
+ }
12095
+ return newWrapper;
12064
12096
  }
12065
12097
  const WRAP_NODES = new Set([
12066
12098
  'td',
@@ -12081,7 +12113,7 @@ const WRAP_NODES = new Set([
12081
12113
  if (box) {
12082
12114
  return box;
12083
12115
  }
12084
- return (0,_wrap_unwrapped_text_js__WEBPACK_IMPORTED_MODULE_3__.wrapUnwrappedText)(commitStyle, font, jodit);
12116
+ return (0,_wrap_unwrapped_text_js__WEBPACK_IMPORTED_MODULE_4__.wrapUnwrappedText)(commitStyle, font, jodit);
12085
12117
  }
12086
12118
  (0,_helpers_utils_attr_js__WEBPACK_IMPORTED_MODULE_1__.attr)(font, 'size', null);
12087
12119
  return font;
@@ -15628,8 +15660,11 @@ class Popup extends _group_group_js__WEBPACK_IMPORTED_MODULE_7__.UIGroup {
15628
15660
  /**
15629
15661
  * Calculate static bound for point
15630
15662
  */ getKeepBound(getBound) {
15663
+ var _a;
15631
15664
  const oldBound = getBound();
15632
- const elmUnderCursor = this.od.elementFromPoint(oldBound.left, oldBound.top);
15665
+ // Inside Shadow DOM `document.elementFromPoint` returns the shadow
15666
+ // host, so the lookup must start from the shadow root
15667
+ const elmUnderCursor = ((_a = this.j.o.shadowRoot) !== null && _a !== void 0 ? _a : this.od).elementFromPoint(oldBound.left, oldBound.top);
15633
15668
  if (!elmUnderCursor) {
15634
15669
  return getBound;
15635
15670
  }
@@ -17387,6 +17422,17 @@ let Jodit = Jodit_1 = class Jodit extends _modules_index_js__WEBPACK_IMPORTED_MO
17387
17422
  const init = ()=>{
17388
17423
  if (opt.enableDragAndDropFileToEditor && opt.uploader && (opt.uploader.url || opt.uploader.insertImageAsBase64URI)) {
17389
17424
  this.uploader.bind(this.editor);
17425
+ } else if (!opt.enableDragAndDropFileToEditor) {
17426
+ // Without a bound uploader nobody cancels a file drop, and
17427
+ // Firefox inserts the dropped image natively — the option
17428
+ // must mean "do nothing". See
17429
+ // https://github.com/xdan/jodit/issues/1077
17430
+ this.e.on(editor, 'drop', (e)=>{
17431
+ var _a, _b;
17432
+ if ((_b = (_a = e.dataTransfer) === null || _a === void 0 ? void 0 : _a.files) === null || _b === void 0 ? void 0 : _b.length) {
17433
+ e.preventDefault();
17434
+ }
17435
+ });
17390
17436
  }
17391
17437
  // in initEditor - the editor could change
17392
17438
  if (!this.__elementToPlace.get(this.editor)) {
@@ -28512,13 +28558,35 @@ let ToolbarContent = class ToolbarContent extends _core_ui_button_index_js__WEBP
28512
28558
  return 'ToolbarContent';
28513
28559
  }
28514
28560
  /** @override */ update() {
28515
- const content = this.control.getContent(this.j, this);
28561
+ var _a, _b, _c;
28562
+ const { control } = this;
28563
+ const content = control.getContent(this.j, this);
28516
28564
  if ((0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_2__.isString)(content) || content.parentNode !== this.container) {
28517
28565
  _core_dom_index_js__WEBPACK_IMPORTED_MODULE_1__.Dom.detach(this.container);
28518
28566
  this.container.appendChild((0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_2__.isString)(content) ? this.j.create.fromHTML(content) : content);
28519
28567
  }
28568
+ // Content controls never went through the ToolbarButton status
28569
+ // calculation, so `isDisabled`/`isActive`/`update` declared on the
28570
+ // control were silently ignored (e.g. the FileBrowser Upload button
28571
+ // ignored the backend permissions). See
28572
+ // https://github.com/xdan/jodit/issues/1094
28573
+ this.state.disabled = Boolean((_a = control.isDisabled) === null || _a === void 0 ? void 0 : _a.call(control, this.j, this));
28574
+ this.state.activated = Boolean((_b = control.isActive) === null || _b === void 0 ? void 0 : _b.call(control, this.j, this));
28575
+ (_c = control.update) === null || _c === void 0 ? void 0 : _c.call(control, this.j, this);
28576
+ // The first update() runs before the state watchers are attached, so
28577
+ // apply the calculated state explicitly (the calls are idempotent)
28578
+ this.onChangeDisabled();
28579
+ this.onChangeActivated();
28520
28580
  super.update();
28521
28581
  }
28582
+ /**
28583
+ * The content is arbitrary HTML — propagate the disabled state to the
28584
+ * nested form controls (e.g. the file input of the Upload button),
28585
+ * otherwise they stay interactive.
28586
+ */ onChangeDisabled() {
28587
+ super.onChangeDisabled();
28588
+ this.container.querySelectorAll('input,button,select,textarea').forEach((elm)=>(0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_2__.attr)(elm, 'disabled', this.state.disabled || null));
28589
+ }
28522
28590
  /** @override */ createContainer() {
28523
28591
  return this.j.c.span(this.componentName);
28524
28592
  }
@@ -30132,8 +30200,11 @@ const ns = 'addnewline';
30132
30200
  }
30133
30201
  }
30134
30202
  __onMouseMove(e) {
30203
+ var _a;
30135
30204
  const editor = this.j;
30136
- let currentElement = editor.ed.elementFromPoint(e.clientX, e.clientY);
30205
+ // Inside Shadow DOM `document.elementFromPoint` returns the shadow
30206
+ // host, so the lookup must start from the shadow root
30207
+ let currentElement = ((_a = editor.o.shadowRoot) !== null && _a !== void 0 ? _a : editor.ed).elementFromPoint(e.clientX, e.clientY);
30137
30208
  if (!_modules_index_js__WEBPACK_IMPORTED_MODULE_3__.Dom.isHTMLElement(currentElement) || !_modules_index_js__WEBPACK_IMPORTED_MODULE_3__.Dom.isOrContains(editor.editor, currentElement)) {
30138
30209
  return;
30139
30210
  }
@@ -30332,7 +30403,13 @@ _core_ui_icon_js__WEBPACK_IMPORTED_MODULE_0__.Icon.set('enter', _enter_svg_js__W
30332
30403
  return new _ui_ui_ai_assistant_js__WEBPACK_IMPORTED_MODULE_6__.UiAiAssistant(jodit, {
30333
30404
  onInsertAfter (html) {
30334
30405
  jodit.s.focus();
30335
- jodit.s.setCursorAfter(jodit.s.current());
30406
+ // `current()` returns a node of the selection START, so with
30407
+ // several selected paragraphs the result landed after the
30408
+ // first one — collapse the range to the END of the selection
30409
+ // instead. See https://github.com/xdan/jodit/issues/1263
30410
+ const range = jodit.s.range;
30411
+ range.collapse(false);
30412
+ jodit.s.selectRange(range);
30336
30413
  jodit.s.insertHTML(html);
30337
30414
  __dialog.close();
30338
30415
  },
@@ -31102,13 +31179,26 @@ _core_global_js__WEBPACK_IMPORTED_MODULE_2__.pluginSystem.add('backspace', backs
31102
31179
  jodit.s.setCursorBefore(fakeNode);
31103
31180
  return true;
31104
31181
  }
31105
- if (sibling && (checkMoveListContent(jodit, mainClosestBox, sibling, backspace) || moveContentAndRemoveEmpty(jodit, mainClosestBox, sibling, backspace))) {
31182
+ if (sibling && (checkMoveListContent(jodit, mainClosestBox, sibling, backspace) || moveContentAndRemoveEmpty(jodit, mainClosestBox, resolveTableSibling(sibling, backspace), backspace))) {
31106
31183
  jodit.s.setCursorBefore(fakeNode);
31107
31184
  return true;
31108
31185
  }
31109
31186
  }
31110
31187
  return false;
31111
31188
  }
31189
+ /**
31190
+ * Content cannot be merged into the `<table>` element itself — it would land
31191
+ * between the table sections (after `</tbody>`), which is invalid HTML and
31192
+ * gets foster-parented out of the table on the next parse. Merge into the
31193
+ * edge cell instead. See https://github.com/xdan/jodit/issues/1064
31194
+ * @private
31195
+ */ function resolveTableSibling(sibling, backspace) {
31196
+ if (!_core_dom_dom_js__WEBPACK_IMPORTED_MODULE_1__.Dom.isTag(sibling, 'table')) {
31197
+ return sibling;
31198
+ }
31199
+ const cells = sibling.querySelectorAll('td,th');
31200
+ return cells.length ? cells[backspace ? cells.length - 1 : 0] : null;
31201
+ }
31112
31202
  function checkMoveListContent(jodit, mainClosestBox, sibling, backspace) {
31113
31203
  // Process UL/LI/OL cases
31114
31204
  const siblingIsList = _core_dom_dom_js__WEBPACK_IMPORTED_MODULE_1__.Dom.isTag(sibling, _core_constants_js__WEBPACK_IMPORTED_MODULE_0__.LIST_TAGS);
@@ -33282,26 +33372,35 @@ _core_ui_icon_js__WEBPACK_IMPORTED_MODULE_0__.Icon.set('copy', _icons_copy_svg_j
33282
33372
  group: 'color'
33283
33373
  });
33284
33374
  const callback = (command, second, third)=>{
33375
+ var _a;
33285
33376
  const colorHEX = (0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_1__.normalizeColor)(third);
33286
- switch(command){
33287
- case 'background':
33288
- editor.s.commitStyle({
33289
- attributes: {
33290
- style: {
33291
- backgroundColor: !colorHEX ? '' : colorHEX
33292
- }
33293
- }
33294
- });
33295
- break;
33296
- case 'forecolor':
33377
+ const value = !colorHEX ? '' : colorHEX;
33378
+ const style = command === 'background' ? {
33379
+ backgroundColor: value
33380
+ } : {
33381
+ color: value
33382
+ };
33383
+ // Cells selected with the `select-cells` plugin drop or collapse the
33384
+ // native range, so `commitStyle` would paint a pending caret format
33385
+ // outside the table instead of the selection the user sees. Apply the
33386
+ // style to the content of every selected cell instead. See #1250
33387
+ const selectedCells = editor.getInstance('Table', editor.o).getAllSelectedCells();
33388
+ if (selectedCells.length && editor.s.isCollapsed()) {
33389
+ selectedCells.forEach((cell)=>{
33390
+ editor.s.select(cell, true);
33297
33391
  editor.s.commitStyle({
33298
33392
  attributes: {
33299
- style: {
33300
- color: !colorHEX ? '' : colorHEX
33301
- }
33393
+ style
33302
33394
  }
33303
33395
  });
33304
- break;
33396
+ });
33397
+ (_a = editor.s.sel) === null || _a === void 0 ? void 0 : _a.removeAllRanges();
33398
+ } else {
33399
+ editor.s.commitStyle({
33400
+ attributes: {
33401
+ style
33402
+ }
33403
+ });
33305
33404
  }
33306
33405
  editor.synchronizeValues();
33307
33406
  return false;
@@ -38969,10 +39068,30 @@ const align = {
38969
39068
  this.j.async.setTimeout(()=>{
38970
39069
  const sel = this.j.s.sel;
38971
39070
  if (sel && !sel.isCollapsed) {
38972
- this.showPopup(()=>this.j.s.range.getBoundingClientRect(), 'selection');
39071
+ this.showPopup(()=>this.__selectionBound(), 'selection');
38973
39072
  }
38974
39073
  }, 1);
38975
39074
  }
39075
+ /**
39076
+ * The selection rect comes from the editor document — in iframe mode its
39077
+ * coordinates are iframe-local, while the popup lives in the host
39078
+ * document, so the iframe offset must be added. See
39079
+ * https://github.com/xdan/jodit/issues/1058
39080
+ */ __selectionBound() {
39081
+ const rect = this.j.s.range.getBoundingClientRect();
39082
+ let { left, top } = rect;
39083
+ if (this.j.iframe) {
39084
+ const offset = (0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_3__.position)(this.j.iframe, this.j, true);
39085
+ left += offset.left;
39086
+ top += offset.top;
39087
+ }
39088
+ return {
39089
+ left,
39090
+ top,
39091
+ width: rect.width,
39092
+ height: rect.height
39093
+ };
39094
+ }
38976
39095
  onSelectionStart() {
38977
39096
  this.snapRange = this.j.s.range.cloneRange();
38978
39097
  }
@@ -39004,7 +39123,7 @@ const align = {
39004
39123
  if (!node) {
39005
39124
  return;
39006
39125
  }
39007
- this.showPopup(()=>range.getBoundingClientRect(), type);
39126
+ this.showPopup(()=>this.__selectionBound(), type);
39008
39127
  }
39009
39128
  /**
39010
39129
  * In not collapsed selection - only one image
@@ -41309,6 +41428,7 @@ const psKey = 'pasteStorage';
41309
41428
  _config_js__WEBPACK_IMPORTED_MODULE_1__.Config.prototype.controls.paste = {
41310
41429
  tooltip: 'Paste from clipboard',
41311
41430
  async exec (editor, _, { control }) {
41431
+ var _a;
41312
41432
  if (control.name === psKey) {
41313
41433
  editor.execCommand('showPasteStorage');
41314
41434
  return;
@@ -41319,7 +41439,13 @@ _config_js__WEBPACK_IMPORTED_MODULE_1__.Config.prototype.controls.paste = {
41319
41439
  try {
41320
41440
  const items = await navigator.clipboard.read();
41321
41441
  if (items && items.length) {
41322
- const textBlob = await items[0].getType(_core_constants_js__WEBPACK_IMPORTED_MODULE_0__.TEXT_PLAIN);
41442
+ const item = items[0];
41443
+ // Prefer the HTML flavor so the button behaves like the
41444
+ // Ctrl+V shortcut (which receives text/html from the
41445
+ // native paste event). See
41446
+ // https://github.com/xdan/jodit/issues/1061
41447
+ const type = ((_a = item.types) === null || _a === void 0 ? void 0 : _a.includes(_core_constants_js__WEBPACK_IMPORTED_MODULE_0__.TEXT_HTML)) ? _core_constants_js__WEBPACK_IMPORTED_MODULE_0__.TEXT_HTML : _core_constants_js__WEBPACK_IMPORTED_MODULE_0__.TEXT_PLAIN;
41448
+ const textBlob = await item.getType(type);
41323
41449
  text = await new Response(textBlob).text();
41324
41450
  }
41325
41451
  error = false;
@@ -43932,20 +44058,30 @@ let UISearch = class UISearch extends _core_ui_index_js__WEBPACK_IMPORTED_MODULE
43932
44058
  return false;
43933
44059
  }).on(this.queryInput, 'input', ()=>{
43934
44060
  this.setMod('empty-query', !(0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_3__.trim)(this.queryInput.value).length);
43935
- }).on(this.queryInput, 'keydown', this.j.async.debounce(async (e)=>{
43936
- switch(e.key){
43937
- case _core_constants_js__WEBPACK_IMPORTED_MODULE_0__.KEY_ENTER:
44061
+ }).on(this.queryInput, 'keydown', (()=>{
44062
+ const debounced = this.j.async.debounce(async (e)=>{
44063
+ switch(e.key){
44064
+ case _core_constants_js__WEBPACK_IMPORTED_MODULE_0__.KEY_ENTER:
44065
+ if (await jodit.e.fire('searchNext')) {
44066
+ this.close();
44067
+ }
44068
+ break;
44069
+ default:
44070
+ jodit.e.fire(this, 'needUpdateCounters');
44071
+ break;
44072
+ }
44073
+ }, this.j.defaultTimeout);
44074
+ return (e)=>{
44075
+ // Must be canceled synchronously — inside the debounced
44076
+ // handler the browser has already submitted the parent
44077
+ // form. See https://github.com/xdan/jodit/issues/918
44078
+ if (e.key === _core_constants_js__WEBPACK_IMPORTED_MODULE_0__.KEY_ENTER) {
43938
44079
  e.preventDefault();
43939
44080
  e.stopImmediatePropagation();
43940
- if (await jodit.e.fire('searchNext')) {
43941
- this.close();
43942
- }
43943
- break;
43944
- default:
43945
- jodit.e.fire(this, 'needUpdateCounters');
43946
- break;
43947
- }
43948
- }, this.j.defaultTimeout));
44081
+ }
44082
+ debounced(e);
44083
+ };
44084
+ })());
43949
44085
  }
43950
44086
  };
43951
44087
  __decorate([
@@ -44092,14 +44228,16 @@ class selectCells extends _core_plugin_index_js__WEBPACK_IMPORTED_MODULE_5__.Plu
44092
44228
  /**
44093
44229
  * Mouse move inside the table
44094
44230
  */ __onMove(table, e) {
44095
- var _a;
44231
+ var _a, _b;
44096
44232
  if (this.j.o.readonly && !this.j.isLocked) {
44097
44233
  return;
44098
44234
  }
44099
44235
  if (this.j.isLockedNotBy(key)) {
44100
44236
  return;
44101
44237
  }
44102
- const node = this.j.ed.elementFromPoint(e.clientX, e.clientY);
44238
+ // Inside Shadow DOM `document.elementFromPoint` returns the shadow
44239
+ // host, so the lookup must start from the shadow root
44240
+ const node = ((_a = this.j.o.shadowRoot) !== null && _a !== void 0 ? _a : this.j.ed).elementFromPoint(e.clientX, e.clientY);
44103
44241
  if (!node) {
44104
44242
  return;
44105
44243
  }
@@ -44125,7 +44263,7 @@ class selectCells extends _core_plugin_index_js__WEBPACK_IMPORTED_MODULE_5__.Plu
44125
44263
  }
44126
44264
  const cellsCount = this.__tableModule.getAllSelectedCells().length;
44127
44265
  if (cellsCount > 1) {
44128
- (_a = this.j.s.sel) === null || _a === void 0 ? void 0 : _a.removeAllRanges();
44266
+ (_b = this.j.s.sel) === null || _b === void 0 ? void 0 : _b.removeAllRanges();
44129
44267
  }
44130
44268
  this.j.e.fire('hidePopup');
44131
44269
  e.stopPropagation();
@@ -44155,13 +44293,15 @@ class selectCells extends _core_plugin_index_js__WEBPACK_IMPORTED_MODULE_5__.Plu
44155
44293
  /**
44156
44294
  * Stop a selection process
44157
44295
  */ __onStopSelection(table, e) {
44158
- var _a, _b;
44296
+ var _a, _b, _c;
44159
44297
  if (!this.__selectedCell) {
44160
44298
  return;
44161
44299
  }
44162
44300
  this.__isSelectionMode = false;
44163
44301
  this.j.unlock();
44164
- const node = this.j.ed.elementFromPoint(e.clientX, e.clientY);
44302
+ // Inside Shadow DOM `document.elementFromPoint` returns the shadow
44303
+ // host, so the lookup must start from the shadow root
44304
+ const node = ((_a = this.j.o.shadowRoot) !== null && _a !== void 0 ? _a : this.j.ed).elementFromPoint(e.clientX, e.clientY);
44165
44305
  if (!node) {
44166
44306
  return;
44167
44307
  }
@@ -44180,7 +44320,7 @@ class selectCells extends _core_plugin_index_js__WEBPACK_IMPORTED_MODULE_5__.Plu
44180
44320
  cell,
44181
44321
  this.__selectedCell
44182
44322
  ]), box = this.__tableModule.formalMatrix(table);
44183
- const max = (_a = box[bound[1][0]]) === null || _a === void 0 ? void 0 : _a[bound[1][1]], min = (_b = box[bound[0][0]]) === null || _b === void 0 ? void 0 : _b[bound[0][1]];
44323
+ const max = (_b = box[bound[1][0]]) === null || _b === void 0 ? void 0 : _b[bound[1][1]], min = (_c = box[bound[0][0]]) === null || _c === void 0 ? void 0 : _c[bound[0][1]];
44184
44324
  // `getSelectedBound` keeps its `Infinity` sentinel when none of the
44185
44325
  // selected cells belong to this table's matrix — e.g. after a
44186
44326
  // drag-and-drop that moved/removed the cells, leaving a stale anchor and