jodit-pro 4.12.22 → 4.12.24

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 +7 -7
  3. package/es2015/jodit.js +337 -79
  4. package/es2015/jodit.min.js +7 -7
  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 +7 -7
  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 +12 -12
  96. package/es2021/jodit.js +337 -79
  97. package/es2021/jodit.min.js +9 -9
  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 +9 -9
  163. package/es2021.en/jodit.js +337 -79
  164. package/es2021.en/jodit.min.js +9 -9
  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 +366 -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/es2015/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.22
4
+ * Version: v4.12.24
5
5
  * Url: https://xdsoft.net/jodit/pro/
6
6
  * License(s): SEE LICENSE IN LICENSE.md
7
7
  */
@@ -1797,7 +1797,7 @@ __webpack_require__.r(__webpack_exports__);
1797
1797
  * ```
1798
1798
  * @packageDocumentation
1799
1799
  * @module constants
1800
- */ const APP_VERSION = "4.12.22";
1800
+ */ const APP_VERSION = "4.12.24";
1801
1801
  // prettier-ignore
1802
1802
  const ES = "es2015";
1803
1803
  const IS_ES_MODERN = true;
@@ -5648,6 +5648,16 @@ function normalizeCSS(s) {
5648
5648
  iframeDoc.open();
5649
5649
  iframeDoc.write(html);
5650
5650
  iframeDoc.close();
5651
+ // Word marks its auto-generated list markers (the literal
5652
+ // bullet/number, e.g. `1.` or `·`) with `mso-list:Ignore`.
5653
+ // They are display-only and must not be imported, otherwise
5654
+ // the marker text leaks into the content. Drop them before any
5655
+ // style normalization strips the `mso-list` hint. See #948
5656
+ _dom_dom_js__WEBPACK_IMPORTED_MODULE_1__.Dom.each(iframeDoc.body, (node)=>{
5657
+ if (_dom_dom_js__WEBPACK_IMPORTED_MODULE_1__.Dom.isElement(node) && /mso-list:\s*ignore/i.test(node.getAttribute('style') || '')) {
5658
+ _dom_dom_js__WEBPACK_IMPORTED_MODULE_1__.Dom.safeRemove(node);
5659
+ }
5660
+ });
5651
5661
  try {
5652
5662
  for(let i = 0; i < iframeDoc.styleSheets.length; i += 1){
5653
5663
  const rules = iframeDoc.styleSheets[i].cssRules;
@@ -5744,6 +5754,15 @@ function normalizeCSS(s) {
5744
5754
  _dom_dom_js__WEBPACK_IMPORTED_MODULE_1__.Dom.unwrap(node);
5745
5755
  break;
5746
5756
  default:
5757
+ // Word marks its auto-generated list markers
5758
+ // (the literal bullet/number, e.g. `1.` or `·`)
5759
+ // with `mso-list:Ignore`. They are display-only
5760
+ // and must not be imported, otherwise the marker
5761
+ // text leaks into the content. See #948
5762
+ if (/mso-list:\s*ignore/i.test(node.getAttribute('style') || '')) {
5763
+ marks.push(node);
5764
+ break;
5765
+ }
5747
5766
  (0,_array_to_array_js__WEBPACK_IMPORTED_MODULE_2__.toArray)(node.attributes).forEach((attr)=>{
5748
5767
  if ([
5749
5768
  'src',
@@ -5881,20 +5900,20 @@ function normalizeCSS(s) {
5881
5900
  return;
5882
5901
  }
5883
5902
  const removeEvents = (_a = options.removeEventAttributes) !== null && _a !== void 0 ? _a : options.removeOnError;
5884
- if (removeEvents) {
5885
- removeAllEventAttributes(box);
5886
- (0,_utils_index_js__WEBPACK_IMPORTED_MODULE_1__.$$)('*', box).forEach((elm)=>removeAllEventAttributes(elm));
5887
- } else if (options.removeOnError) {
5888
- sanitizeHTMLElement(box, options);
5889
- (0,_utils_index_js__WEBPACK_IMPORTED_MODULE_1__.$$)('[onerror]', box).forEach((elm)=>sanitizeHTMLElement(elm, options));
5890
- }
5891
- if (options.safeJavaScriptLink) {
5892
- sanitizeHTMLElement(box, options);
5893
- (0,_utils_index_js__WEBPACK_IMPORTED_MODULE_1__.$$)('a[href^="javascript"]', box).forEach((elm)=>sanitizeHTMLElement(elm, options));
5894
- }
5895
- if (options.safeLinksTarget) {
5896
- (0,_utils_index_js__WEBPACK_IMPORTED_MODULE_1__.$$)('a[target="_blank"]', box).forEach((elm)=>{
5897
- const rel = elm.getAttribute('rel') || '';
5903
+ // Single synchronous traversal of the subtree. Besides removing event
5904
+ // handlers and `javascript:` links, `sanitizeHTMLElement` neutralises
5905
+ // executable `iframe[srcdoc]`, `data:text/html` / SVG `data:` document
5906
+ // sources and dangerous schemes in every URL-bearing attribute.
5907
+ const process = (node)=>{
5908
+ if (!_dom_dom_js__WEBPACK_IMPORTED_MODULE_0__.Dom.isElement(node)) {
5909
+ return;
5910
+ }
5911
+ if (removeEvents) {
5912
+ removeAllEventAttributes(node);
5913
+ }
5914
+ sanitizeHTMLElement(node, options);
5915
+ if (options.safeLinksTarget && node.nodeName === 'A' && node.getAttribute('target') === '_blank') {
5916
+ const rel = node.getAttribute('rel') || '';
5898
5917
  const parts = rel.split(/\s+/).filter(Boolean);
5899
5918
  if (!parts.includes('noopener')) {
5900
5919
  parts.push('noopener');
@@ -5902,9 +5921,11 @@ function normalizeCSS(s) {
5902
5921
  if (!parts.includes('noreferrer')) {
5903
5922
  parts.push('noreferrer');
5904
5923
  }
5905
- (0,_utils_index_js__WEBPACK_IMPORTED_MODULE_1__.attr)(elm, 'rel', parts.join(' '));
5906
- });
5907
- }
5924
+ (0,_utils_index_js__WEBPACK_IMPORTED_MODULE_1__.attr)(node, 'rel', parts.join(' '));
5925
+ }
5926
+ };
5927
+ process(box);
5928
+ _dom_dom_js__WEBPACK_IMPORTED_MODULE_0__.Dom.each(box, process);
5908
5929
  }
5909
5930
  /**
5910
5931
  * Remove all on* event handler attributes from an element
@@ -5925,6 +5946,41 @@ function normalizeCSS(s) {
5925
5946
  }
5926
5947
  return effected;
5927
5948
  }
5949
+ /**
5950
+ * URL-bearing attributes (besides `href`) that can load or execute content.
5951
+ */ const URL_ATTRIBUTES = [
5952
+ 'src',
5953
+ 'data',
5954
+ 'action',
5955
+ 'formaction',
5956
+ 'poster',
5957
+ 'background',
5958
+ 'xlink:href'
5959
+ ];
5960
+ /**
5961
+ * Tags that load their URL as a *document* (scripts inside run). An SVG data
5962
+ * URL is only an XSS vector here — as an `<img>` source it renders inertly.
5963
+ */ const DOCUMENT_EMBED_TAGS = new Set([
5964
+ 'iframe',
5965
+ 'frame',
5966
+ 'object',
5967
+ 'embed'
5968
+ ]);
5969
+ /**
5970
+ * Detects executable / script-bearing URL schemes. The attribute value is
5971
+ * already HTML-entity-decoded by `getAttribute`, so only whitespace and
5972
+ * control characters (which browsers ignore inside a scheme) need stripping.
5973
+ */ function isDangerousUrl(value, tagName) {
5974
+ // eslint-disable-next-line no-control-regex
5975
+ const normalized = value.replace(/[\u0000-\u0020]+/g, '').toLowerCase();
5976
+ if (/^(?:javascript|vbscript|livescript|mocha):/.test(normalized)) {
5977
+ return true;
5978
+ }
5979
+ if (/^data:(?:text\/html|application\/xhtml)/.test(normalized)) {
5980
+ return true;
5981
+ }
5982
+ return /^data:image\/svg/.test(normalized) && DOCUMENT_EMBED_TAGS.has(tagName);
5983
+ }
5928
5984
  function sanitizeHTMLElement(elm, { safeJavaScriptLink, removeOnError } = {
5929
5985
  safeJavaScriptLink: true,
5930
5986
  removeOnError: true
@@ -5942,6 +5998,22 @@ function sanitizeHTMLElement(elm, { safeJavaScriptLink, removeOnError } = {
5942
5998
  (0,_utils_index_js__WEBPACK_IMPORTED_MODULE_1__.attr)(elm, 'href', location.protocol + '//' + href);
5943
5999
  effected = true;
5944
6000
  }
6001
+ if (safeJavaScriptLink) {
6002
+ // `srcdoc` runs its content as a full HTML document — drop it entirely.
6003
+ if (elm.hasAttribute('srcdoc')) {
6004
+ (0,_utils_index_js__WEBPACK_IMPORTED_MODULE_1__.attr)(elm, 'srcdoc', null);
6005
+ effected = true;
6006
+ }
6007
+ // Strip executable schemes from any other URL-bearing attribute.
6008
+ const tagName = elm.nodeName.toLowerCase();
6009
+ for (const name of URL_ATTRIBUTES){
6010
+ const value = elm.getAttribute(name);
6011
+ if (value && isDangerousUrl(value, tagName)) {
6012
+ (0,_utils_index_js__WEBPACK_IMPORTED_MODULE_1__.attr)(elm, name, null);
6013
+ effected = true;
6014
+ }
6015
+ }
6016
+ }
5945
6017
  return effected;
5946
6018
  }
5947
6019
 
@@ -5989,7 +6061,7 @@ const ALONE_TAGS = new Set([
5989
6061
  ]);
5990
6062
  /**
5991
6063
  * Extract plain text from HTML text
5992
- */ function stripTags(html, doc = document, exclude = null) {
6064
+ */ function stripTags(html, doc = document, exclude = null, blockBr = false) {
5993
6065
  const tmp = doc.createElement('div');
5994
6066
  if ((0,_checker_is_string_js__WEBPACK_IMPORTED_MODULE_1__.isString)(html)) {
5995
6067
  tmp.innerHTML = html;
@@ -6003,7 +6075,7 @@ const ALONE_TAGS = new Set([
6003
6075
  }
6004
6076
  if (exclude && _dom_dom_js__WEBPACK_IMPORTED_MODULE_0__.Dom.isTag(p, exclude)) {
6005
6077
  const tag = p.nodeName.toLowerCase();
6006
- const text = !_dom_dom_js__WEBPACK_IMPORTED_MODULE_0__.Dom.isTag(p, ALONE_TAGS) ? `%%%jodit-${tag}%%%${stripTags(p.innerHTML, doc, exclude)}%%%/jodit-${tag}%%%` : `%%%jodit-single-${tag}%%%`;
6078
+ const text = !_dom_dom_js__WEBPACK_IMPORTED_MODULE_0__.Dom.isTag(p, ALONE_TAGS) ? `%%%jodit-${tag}%%%${stripTags(p.innerHTML, doc, exclude, blockBr)}%%%/jodit-${tag}%%%` : `%%%jodit-single-${tag}%%%`;
6007
6079
  _dom_dom_js__WEBPACK_IMPORTED_MODULE_0__.Dom.before(p, doc.createTextNode(text));
6008
6080
  _dom_dom_js__WEBPACK_IMPORTED_MODULE_0__.Dom.safeRemove(p);
6009
6081
  return;
@@ -6020,7 +6092,11 @@ const ALONE_TAGS = new Set([
6020
6092
  return;
6021
6093
  }
6022
6094
  if (nx) {
6023
- pr.insertBefore(doc.createTextNode(' '), nx);
6095
+ // By default blocks are joined with a single space (single-line
6096
+ // plain text). When `blockBr` is set, separate them with a line
6097
+ // break instead, so paragraph structure survives — e.g. the
6098
+ // "Insert only Text" paste option. See #1232
6099
+ pr.insertBefore(doc.createTextNode(blockBr ? '%%%jodit-single-br%%%' : ' '), nx);
6024
6100
  }
6025
6101
  });
6026
6102
  return restoreTags((0,_string_trim_js__WEBPACK_IMPORTED_MODULE_2__.trim)(tmp.innerText));
@@ -7537,6 +7613,18 @@ const completeUrl = (url)=>{
7537
7613
 
7538
7614
 
7539
7615
 
7616
+ /**
7617
+ * Keys that must never be copied from a (potentially untrusted) config object —
7618
+ * assigning them during a recursive merge can reach and mutate
7619
+ * `Object.prototype` (prototype pollution, CWE-1321).
7620
+ */ const UNSAFE_PROTO_KEYS = [
7621
+ '__proto__',
7622
+ 'constructor',
7623
+ 'prototype'
7624
+ ];
7625
+ function isUnsafeProtoKey(key) {
7626
+ return UNSAFE_PROTO_KEYS.indexOf(key) !== -1;
7627
+ }
7540
7628
  /**
7541
7629
  * @example
7542
7630
  * ```js
@@ -7585,6 +7673,9 @@ const completeUrl = (url)=>{
7585
7673
  }
7586
7674
  const newOpt = {};
7587
7675
  Object.keys(options).forEach((key)=>{
7676
+ if (isUnsafeProtoKey(key)) {
7677
+ return;
7678
+ }
7588
7679
  const opt = options[key], protoKey = proto ? proto[key] : null;
7589
7680
  if ((0,_checker_is_plain_object_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(opt) && (0,_checker_is_plain_object_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(protoKey) && !(0,_extend_js__WEBPACK_IMPORTED_MODULE_5__.isAtom)(opt)) {
7590
7681
  newOpt[key] = ConfigProto(opt, protoKey, deep + 1);
@@ -7646,6 +7737,9 @@ function ConfigFlatten(obj) {
7646
7737
  * @see {@link ConfigProto} for the prototype-chain variant used at editor creation time
7647
7738
  */ function ConfigMerge(target, source) {
7648
7739
  Object.keys(source).forEach((key)=>{
7740
+ if (isUnsafeProtoKey(key)) {
7741
+ return;
7742
+ }
7649
7743
  const srcVal = source[key];
7650
7744
  const tgtVal = target[key];
7651
7745
  if ((0,_checker_is_plain_object_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(srcVal) && (0,_checker_is_plain_object_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(tgtVal) && !(0,_extend_js__WEBPACK_IMPORTED_MODULE_5__.isAtom)(srcVal)) {
@@ -7690,7 +7784,6 @@ function ConfigDeepFlatten(obj) {
7690
7784
  return url;
7691
7785
  }
7692
7786
  const parser = _constants_js__WEBPACK_IMPORTED_MODULE_0__.globalDocument.createElement('a');
7693
- const pattern1 = /(?:http?s?:\/\/)?(?:www\.)?(?:vimeo\.com)\/?(.+)/g;
7694
7787
  parser.href = url;
7695
7788
  if (!width) {
7696
7789
  width = 400;
@@ -7702,19 +7795,41 @@ function ConfigDeepFlatten(obj) {
7702
7795
  switch(parser.hostname){
7703
7796
  case 'www.vimeo.com':
7704
7797
  case 'vimeo.com':
7705
- return pattern1.test(url) ? url.replace(pattern1, '<iframe width="' + width + '" height="' + height + '" src="' + protocol + '//player.vimeo.com/video/$1" frameborder="0" allowfullscreen></iframe>') : url;
7798
+ {
7799
+ // The numeric video id can be preceded by `channels/<name>/` or
7800
+ // `groups/<name>/videos/` and followed by tracking params (e.g.
7801
+ // `?share=copy`). Unlisted videos keep a hash right after the id
7802
+ // (`vimeo.com/<id>/<hash>`). Extract the id (+ hash) from the path
7803
+ // so all of those forms produce a valid embed. See #1209
7804
+ const segments = parser.pathname.split('/').filter(Boolean);
7805
+ const idIndex = segments.findIndex((s)=>/^\d+$/.test(s));
7806
+ if (idIndex === -1) {
7807
+ return url;
7808
+ }
7809
+ let path = segments[idIndex];
7810
+ const hash = segments[idIndex + 1];
7811
+ if (hash && idIndex === 0) {
7812
+ path += '/' + hash;
7813
+ }
7814
+ return '<iframe width="' + width + '" height="' + height + '" src="' + protocol + '//player.vimeo.com/video/' + path + '" frameborder="0" allowfullscreen></iframe>';
7815
+ }
7706
7816
  case 'youtube.com':
7707
7817
  case 'www.youtube.com':
7818
+ case 'm.youtube.com':
7819
+ case 'music.youtube.com':
7708
7820
  case 'youtu.be':
7709
7821
  case 'www.youtu.be':
7710
7822
  {
7711
- const query = parser.search ? (0,_parse_query_js__WEBPACK_IMPORTED_MODULE_2__.parseQuery)(parser.search) : {
7712
- v: parser.pathname.substring(1)
7713
- };
7714
- if (/^embed\/.*/.test(query.v)) {
7715
- query.v = query.v.substring(6);
7716
- }
7717
- return query.v ? '<iframe width="' + width + '" height="' + height + '" src="' + protocol + '//www.youtube.com/embed/' + query.v + '" frameborder="0" allowfullscreen></iframe>' : url;
7823
+ const query = parser.search ? (0,_parse_query_js__WEBPACK_IMPORTED_MODULE_2__.parseQuery)(parser.search) : {};
7824
+ // `youtube.com/watch` keeps the video id in the `v` query
7825
+ // parameter, while the short `youtu.be/<id>` links and the
7826
+ // `/embed/`, `/shorts/`, `/live/` paths keep it in the pathname.
7827
+ // Modern share urls add tracking params (e.g. `?si=`, `?t=`), so
7828
+ // the pathname must still be used as a fallback when there is no
7829
+ // `v`. See #1209
7830
+ let v = query.v || parser.pathname.substring(1);
7831
+ v = v.replace(/^(watch|embed|shorts|live|v)\//, '').replace(/\/$/, '');
7832
+ return v ? '<iframe width="' + width + '" height="' + height + '" src="' + protocol + '//www.youtube.com/embed/' + v + '" frameborder="0" allowfullscreen></iframe>' : url;
7718
7833
  }
7719
7834
  }
7720
7835
  return url;
@@ -18126,6 +18241,23 @@ let Jodit = Jodit_1 = class Jodit extends _modules_index_js__WEBPACK_IMPORTED_MO
18126
18241
  }
18127
18242
  this.synchronizeValues();
18128
18243
  }
18244
+ }).on(this.ow, 'mouseup', (event)=>{
18245
+ if (this.o.readonly || this.__isSilentChange) {
18246
+ return;
18247
+ }
18248
+ // When a selection is started inside the editor and the
18249
+ // mouse button is released outside of it, the editable
18250
+ // area never receives the `mouseup` event, so the toolbar
18251
+ // state (active buttons) is not recalculated. Re-fire the
18252
+ // event manually for that case while the selection still
18253
+ // belongs to the editor. See #1251
18254
+ const target = event.target;
18255
+ const insideEditor = Boolean(target && (0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_3__.isNumber)(target.nodeType) && editor.contains(target));
18256
+ if (insideEditor || !this.s.isInsideArea) {
18257
+ return;
18258
+ }
18259
+ this.e.fire('changeSelection');
18260
+ this.synchronizeValues();
18129
18261
  });
18130
18262
  }
18131
18263
  fetch(url, options) {
@@ -29832,9 +29964,14 @@ _config_js__WEBPACK_IMPORTED_MODULE_2__.Config.prototype.uploader = {
29832
29964
  insertImageAsBase64URI: false,
29833
29965
  imagesExtensions: [
29834
29966
  'jpg',
29835
- 'png',
29836
29967
  'jpeg',
29837
- 'gif'
29968
+ 'png',
29969
+ 'gif',
29970
+ 'webp',
29971
+ 'bmp',
29972
+ 'svg',
29973
+ 'tiff',
29974
+ 'avif'
29838
29975
  ],
29839
29976
  headers: null,
29840
29977
  data: null,
@@ -33942,7 +34079,11 @@ function filterStyleProperties(style, allowed) {
33942
34079
  if (!jodit.o.cleanHTML.removeEmptyElements) {
33943
34080
  return false;
33944
34081
  }
33945
- return _core_dom_dom_js__WEBPACK_IMPORTED_MODULE_1__.Dom.isElement(node) && node.nodeName.match(_core_constants_js__WEBPACK_IMPORTED_MODULE_0__.IS_INLINE) != null && !_core_dom_dom_js__WEBPACK_IMPORTED_MODULE_1__.Dom.isTemporary(node) && (0,_core_helpers_string_trim_js__WEBPACK_IMPORTED_MODULE_2__.trimInv)(node.innerHTML).length === 0 && (current == null || !_core_dom_dom_js__WEBPACK_IMPORTED_MODULE_1__.Dom.isOrContains(node, current));
34082
+ // Never drop an empty inline element that currently holds the caret it is
34083
+ // a pending-format marker the user is about to type into (#1291). `current`
34084
+ // is captured before a click moves the caret, so also check the live caret.
34085
+ const liveCaret = jodit.s.isCollapsed() ? jodit.s.range.startContainer : null;
34086
+ return _core_dom_dom_js__WEBPACK_IMPORTED_MODULE_1__.Dom.isElement(node) && node.nodeName.match(_core_constants_js__WEBPACK_IMPORTED_MODULE_0__.IS_INLINE) != null && !_core_dom_dom_js__WEBPACK_IMPORTED_MODULE_1__.Dom.isTemporary(node) && (0,_core_helpers_string_trim_js__WEBPACK_IMPORTED_MODULE_2__.trimInv)(node.innerHTML).length === 0 && (current == null || !_core_dom_dom_js__WEBPACK_IMPORTED_MODULE_1__.Dom.isOrContains(node, current)) && (liveCaret == null || !_core_dom_dom_js__WEBPACK_IMPORTED_MODULE_1__.Dom.isOrContains(node, liveCaret));
33946
34087
  }
33947
34088
 
33948
34089
 
@@ -34264,8 +34405,9 @@ _config_js__WEBPACK_IMPORTED_MODULE_3__.Config.prototype.controls.brush = {
34264
34405
  const update = (key, value)=>{
34265
34406
  if (value && value !== (0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_1__.css)(editor.editor, key).toString()) {
34266
34407
  button.state.icon.fill = value;
34267
- return;
34408
+ return true;
34268
34409
  }
34410
+ return false;
34269
34411
  };
34270
34412
  if (color) {
34271
34413
  const mode = (0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_1__.dataBind)(button, 'color');
@@ -34275,8 +34417,16 @@ _config_js__WEBPACK_IMPORTED_MODULE_3__.Config.prototype.controls.brush = {
34275
34417
  const current = editor.s.current();
34276
34418
  if (current && !button.state.disabled) {
34277
34419
  const currentBpx = _core_dom_dom_js__WEBPACK_IMPORTED_MODULE_0__.Dom.closest(current, _core_dom_dom_js__WEBPACK_IMPORTED_MODULE_0__.Dom.isElement, editor.editor) || editor.editor;
34278
- update('color', (0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_1__.css)(currentBpx, 'color').toString());
34279
- update('background-color', (0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_1__.css)(currentBpx, 'background-color').toString());
34420
+ // The icon's fill mirrors the current text/background color so the
34421
+ // button reflects the formatting under the caret. Both calls run so
34422
+ // that a background color (the second call) wins over the text color
34423
+ // when both are set. Keep the computed fill instead of resetting it
34424
+ // below. See #195, #182
34425
+ const hasColor = update('color', (0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_1__.css)(currentBpx, 'color').toString());
34426
+ const hasBackground = update('background-color', (0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_1__.css)(currentBpx, 'background-color').toString());
34427
+ if (hasColor || hasBackground) {
34428
+ return;
34429
+ }
34280
34430
  }
34281
34431
  button.state.icon.fill = '';
34282
34432
  button.state.activated = false;
@@ -35075,11 +35225,33 @@ var DragState;
35075
35225
  */ class dragAndDropElement extends _core_plugin_index_js__WEBPACK_IMPORTED_MODULE_4__.Plugin {
35076
35226
  /** @override */ afterInit() {
35077
35227
  this.dragList = this.j.o.draggableTags ? (0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_3__.splitArray)(this.j.o.draggableTags).filter(Boolean).map((item)=>item.toLowerCase()) : [];
35228
+ // Allow another plugin (e.g. a drag handle/anchor) to start dragging
35229
+ // an element programmatically, regardless of the `draggableTags` list.
35230
+ this.j.e.on('startDragElement', this.onStartDragElement);
35078
35231
  if (!this.dragList.length) {
35079
35232
  return;
35080
35233
  }
35081
35234
  this.j.e.on('mousedown dragstart', this.onDragStart);
35082
35235
  }
35236
+ /**
35237
+ * Start dragging a specific element programmatically.
35238
+ *
35239
+ * Allows a separate UI element (for example a drag handle/anchor shown next
35240
+ * to a block) to initiate the drag without the user pressing directly on the
35241
+ * draggable element itself.
35242
+ *
35243
+ * @example
35244
+ * ```js
35245
+ * handle.addEventListener('mousedown', e => {
35246
+ * editor.e.fire('startDragElement', preBlock, e);
35247
+ * });
35248
+ * ```
35249
+ */ onStartDragElement(element, event) {
35250
+ if (this.isInDestruct || this.state > DragState.IDLE || !element) {
35251
+ return;
35252
+ }
35253
+ this.startDragging(element, event);
35254
+ }
35083
35255
  /**
35084
35256
  * Drag start handler
35085
35257
  */ onDragStart(event) {
@@ -35101,11 +35273,18 @@ var DragState;
35101
35273
  if (_core_dom_index_js__WEBPACK_IMPORTED_MODULE_1__.Dom.isTag(lastTarget.parentElement, 'a') && lastTarget.parentElement.firstChild === lastTarget && lastTarget.parentElement.lastChild === lastTarget) {
35102
35274
  lastTarget = lastTarget.parentElement;
35103
35275
  }
35276
+ this.startDragging(lastTarget, event);
35277
+ }
35278
+ /**
35279
+ * Prepare the ghost element and switch to the waiting state.
35280
+ * Shared by the native mousedown handler and the programmatic
35281
+ * `startDragElement` event handler.
35282
+ */ startDragging(target, event) {
35104
35283
  this.startX = event.clientX;
35105
35284
  this.startY = event.clientY;
35106
35285
  this.isCopyMode = (0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_3__.ctrlKey)(event); // we can move only element from editor
35107
- this.draggable = lastTarget.cloneNode(true);
35108
- (0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_3__.dataBind)(this.draggable, 'target', lastTarget);
35286
+ this.draggable = target.cloneNode(true);
35287
+ (0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_3__.dataBind)(this.draggable, 'target', target);
35109
35288
  this.state = DragState.WAIT_DRAGGING;
35110
35289
  this.addDragListeners();
35111
35290
  }
@@ -35175,6 +35354,18 @@ var DragState;
35175
35354
  }
35176
35355
  const { parentElement } = fragment;
35177
35356
  this.j.s.insertNode(fragment, true, false);
35357
+ // Dropping a non-editable block (e.g. a `<pre>` code sample) can leave an
35358
+ // invisible filler text node beside it. Remove it so the drop does not
35359
+ // introduce a stray empty line (which clean-html would otherwise strip
35360
+ // later, causing a flash).
35361
+ [
35362
+ fragment.previousSibling,
35363
+ fragment.nextSibling
35364
+ ].forEach((node)=>{
35365
+ if (_core_dom_index_js__WEBPACK_IMPORTED_MODULE_1__.Dom.isEmptyTextNode(node)) {
35366
+ _core_dom_index_js__WEBPACK_IMPORTED_MODULE_1__.Dom.safeRemove(node);
35367
+ }
35368
+ });
35178
35369
  if (parentElement && _core_dom_index_js__WEBPACK_IMPORTED_MODULE_1__.Dom.isEmpty(parentElement) && !_core_dom_index_js__WEBPACK_IMPORTED_MODULE_1__.Dom.isCell(parentElement)) {
35179
35370
  _core_dom_index_js__WEBPACK_IMPORTED_MODULE_1__.Dom.safeRemove(parentElement);
35180
35371
  }
@@ -35201,7 +35392,7 @@ var DragState;
35201
35392
  }
35202
35393
  /** @override */ beforeDestruct() {
35203
35394
  this.onDragEnd();
35204
- this.j.e.off('mousedown dragstart', this.onDragStart);
35395
+ this.j.e.off('mousedown dragstart', this.onDragStart).off('startDragElement', this.onStartDragElement);
35205
35396
  this.removeDragListeners();
35206
35397
  }
35207
35398
  constructor(){
@@ -35217,6 +35408,9 @@ var DragState;
35217
35408
  this.state = DragState.IDLE;
35218
35409
  }
35219
35410
  }
35411
+ __decorate([
35412
+ _core_decorators_index_js__WEBPACK_IMPORTED_MODULE_0__.autobind
35413
+ ], dragAndDropElement.prototype, "onStartDragElement", null);
35220
35414
  __decorate([
35221
35415
  _core_decorators_index_js__WEBPACK_IMPORTED_MODULE_0__.autobind
35222
35416
  ], dragAndDropElement.prototype, "onDragStart", null);
@@ -35703,12 +35897,17 @@ _core_global_js__WEBPACK_IMPORTED_MODULE_1__.pluginSystem.add('dtd', dtd);
35703
35897
  if (beforeEnter !== undefined) {
35704
35898
  return beforeEnter;
35705
35899
  }
35706
- if (!editor.s.isCollapsed()) {
35707
- editor.execCommand('Delete');
35708
- }
35709
- editor.s.focus();
35710
- this.onEnter(event);
35711
- editor.e.fire('afterEnter', event);
35900
+ // Delete-of-selection + new block must be a single history step,
35901
+ // otherwise pressing Enter over a selection needs two Ctrl+Z to undo
35902
+ // (the first only reverts to the intermediate empty state). #1292
35903
+ editor.history.snapshot.transaction(()=>{
35904
+ if (!editor.s.isCollapsed()) {
35905
+ editor.execCommand('Delete');
35906
+ }
35907
+ editor.s.focus();
35908
+ this.onEnter(event);
35909
+ editor.e.fire('afterEnter', event);
35910
+ });
35712
35911
  editor.synchronizeValues(); // fire change
35713
35912
  return false;
35714
35913
  }
@@ -36840,7 +37039,8 @@ _config_js__WEBPACK_IMPORTED_MODULE_0__.Config.prototype.commandToHotkeys = {
36840
37039
  'cmd+shift+7'
36841
37040
  ],
36842
37041
  insertUnorderedList: [
36843
- 'ctrl+shift+8, cmd+shift+8'
37042
+ 'ctrl+shift+8',
37043
+ 'cmd+shift+8'
36844
37044
  ],
36845
37045
  selectall: [
36846
37046
  'ctrl+a',
@@ -39238,14 +39438,31 @@ _config_js__WEBPACK_IMPORTED_MODULE_2__.Config.prototype.controls.indent = {
39238
39438
  };
39239
39439
  _config_js__WEBPACK_IMPORTED_MODULE_2__.Config.prototype.controls.outdent = {
39240
39440
  isDisabled: (editor)=>{
39441
+ var _a;
39241
39442
  const current = editor.s.current();
39242
- if (current) {
39243
- const currentBox = _core_dom_index_js__WEBPACK_IMPORTED_MODULE_0__.Dom.closest(current, _core_dom_index_js__WEBPACK_IMPORTED_MODULE_0__.Dom.isBlock, editor.editor);
39244
- if (currentBox) {
39245
- const arrow = (0,_helpers_js__WEBPACK_IMPORTED_MODULE_5__.getKey)(editor.o.direction, currentBox);
39246
- return !currentBox.style[arrow] || parseInt(currentBox.style[arrow], 10) <= 0;
39443
+ if (!current) {
39444
+ return true;
39445
+ }
39446
+ // A list item whose list is nested inside another list item can be
39447
+ // outdented (un-nested) by the `tab` plugin, even without an inline
39448
+ // indent margin. Keep the button enabled in that case. See #1247
39449
+ if ((_a = editor.o.tab) === null || _a === void 0 ? void 0 : _a.tabInsideLiInsertNewList) {
39450
+ const li = _core_dom_index_js__WEBPACK_IMPORTED_MODULE_0__.Dom.closest(current, 'li', editor.editor);
39451
+ if (li) {
39452
+ const list = _core_dom_index_js__WEBPACK_IMPORTED_MODULE_0__.Dom.closest(li, [
39453
+ 'ul',
39454
+ 'ol'
39455
+ ], editor.editor);
39456
+ if (list && _core_dom_index_js__WEBPACK_IMPORTED_MODULE_0__.Dom.closest(list, 'li', editor.editor)) {
39457
+ return false;
39458
+ }
39247
39459
  }
39248
39460
  }
39461
+ const currentBox = _core_dom_index_js__WEBPACK_IMPORTED_MODULE_0__.Dom.closest(current, _core_dom_index_js__WEBPACK_IMPORTED_MODULE_0__.Dom.isBlock, editor.editor);
39462
+ if (currentBox) {
39463
+ const arrow = (0,_helpers_js__WEBPACK_IMPORTED_MODULE_5__.getKey)(editor.o.direction, currentBox);
39464
+ return !currentBox.style[arrow] || parseInt(currentBox.style[arrow], 10) <= 0;
39465
+ }
39249
39466
  return true;
39250
39467
  },
39251
39468
  tooltip: 'Decrease Indent'
@@ -42100,7 +42317,7 @@ class pasteFromWord extends _core_plugin_index_js__WEBPACK_IMPORTED_MODULE_4__.P
42100
42317
  }
42101
42318
  case _core_constants_js__WEBPACK_IMPORTED_MODULE_0__.INSERT_ONLY_TEXT:
42102
42319
  {
42103
- html = (0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_3__.stripTags)((0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_3__.cleanFromWord)(html));
42320
+ html = (0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_3__.stripTags)((0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_3__.cleanFromWord)(html), this.j.ed, new Set(this.j.o.pasteExcludeStripTags), this.j.o.nl2brInPlainText);
42104
42321
  break;
42105
42322
  }
42106
42323
  }
@@ -42679,10 +42896,15 @@ _config_js__WEBPACK_IMPORTED_MODULE_1__.Config.prototype.controls.paste = {
42679
42896
  html = (0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_4__.cleanFromWord)(html);
42680
42897
  break;
42681
42898
  case _core_constants_js__WEBPACK_IMPORTED_MODULE_0__.INSERT_ONLY_TEXT:
42682
- html = (0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_4__.stripTags)(html, this.j.ed, new Set(this.j.o.pasteExcludeStripTags));
42899
+ html = (0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_4__.stripTags)(html, this.j.ed, new Set(this.j.o.pasteExcludeStripTags), this.j.o.nl2brInPlainText);
42683
42900
  break;
42684
42901
  case _core_constants_js__WEBPACK_IMPORTED_MODULE_0__.INSERT_AS_TEXT:
42685
42902
  html = (0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_4__.htmlspecialchars)(html);
42903
+ // Keep the source line breaks instead of letting the raw
42904
+ // newlines collapse into spaces when rendered. See #1093
42905
+ if (this.j.o.nl2brInPlainText) {
42906
+ html = (0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_4__.nl2br)(html);
42907
+ }
42686
42908
  break;
42687
42909
  default:
42688
42910
  {
@@ -45479,13 +45701,14 @@ _config_js__WEBPACK_IMPORTED_MODULE_0__.Config.prototype.select = {
45479
45701
  /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
45480
45702
 
45481
45703
  /* unused harmony export select */
45482
- /* harmony import */ var _core_decorators_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(65478);
45483
- /* harmony import */ var _core_dom_dom_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2748);
45484
- /* harmony import */ var _core_global_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(580);
45485
- /* harmony import */ var _core_helpers_string_camel_case_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(87058);
45486
- /* harmony import */ var _core_plugin_index_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(50911);
45487
- /* harmony import */ var _core_ui_index_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(67510);
45488
- /* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(67215);
45704
+ /* harmony import */ var _core_constants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(82758);
45705
+ /* harmony import */ var _core_decorators_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(65478);
45706
+ /* harmony import */ var _core_dom_dom_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(2748);
45707
+ /* harmony import */ var _core_global_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(580);
45708
+ /* harmony import */ var _core_helpers_string_camel_case_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(87058);
45709
+ /* harmony import */ var _core_plugin_index_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(50911);
45710
+ /* harmony import */ var _core_ui_index_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(67510);
45711
+ /* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(67215);
45489
45712
  /*!
45490
45713
  * Jodit Editor (https://xdsoft.net/jodit/)
45491
45714
  * Released under MIT see LICENSE.txt in the project root for license information.
@@ -45503,6 +45726,7 @@ _config_js__WEBPACK_IMPORTED_MODULE_0__.Config.prototype.select = {
45503
45726
 
45504
45727
 
45505
45728
 
45729
+
45506
45730
  /**
45507
45731
  * A utility plugin that allows you to subscribe to a click/mousedown/touchstart/mouseup on an element in DOM order
45508
45732
  *
@@ -45513,7 +45737,7 @@ _config_js__WEBPACK_IMPORTED_MODULE_0__.Config.prototype.select = {
45513
45737
  * console.log(img.src);
45514
45738
  * })
45515
45739
  * ```
45516
- */ class select extends _core_plugin_index_js__WEBPACK_IMPORTED_MODULE_4__.Plugin {
45740
+ */ class select extends _core_plugin_index_js__WEBPACK_IMPORTED_MODULE_5__.Plugin {
45517
45741
  afterInit(jodit) {
45518
45742
  this.proxyEventsList.forEach((eventName)=>{
45519
45743
  jodit.e.on(eventName + '.select', this.onStartSelection);
@@ -45528,7 +45752,7 @@ _config_js__WEBPACK_IMPORTED_MODULE_0__.Config.prototype.select = {
45528
45752
  const { j } = this;
45529
45753
  let result, target = e.target;
45530
45754
  while(result === undefined && target && target !== j.editor){
45531
- result = j.e.fire((0,_core_helpers_string_camel_case_js__WEBPACK_IMPORTED_MODULE_3__.camelCase)(e.type + '_' + target.nodeName.toLowerCase()), target, e);
45755
+ result = j.e.fire((0,_core_helpers_string_camel_case_js__WEBPACK_IMPORTED_MODULE_4__.camelCase)(e.type + '_' + target.nodeName.toLowerCase()), target, e);
45532
45756
  target = target.parentElement;
45533
45757
  }
45534
45758
  if (e.type === 'click' && result === undefined && target === j.editor) {
@@ -45539,10 +45763,10 @@ _config_js__WEBPACK_IMPORTED_MODULE_0__.Config.prototype.select = {
45539
45763
  * @event outsideClick(e) - when user clicked on the outside of editor
45540
45764
  */ onOutsideClick(e) {
45541
45765
  const node = e.target;
45542
- if (_core_dom_dom_js__WEBPACK_IMPORTED_MODULE_1__.Dom.up(node, (elm)=>elm === this.j.editor)) {
45766
+ if (_core_dom_dom_js__WEBPACK_IMPORTED_MODULE_2__.Dom.up(node, (elm)=>elm === this.j.editor)) {
45543
45767
  return;
45544
45768
  }
45545
- const box = _core_ui_index_js__WEBPACK_IMPORTED_MODULE_5__.UIElement.closestElement(node, _core_ui_index_js__WEBPACK_IMPORTED_MODULE_5__.Popup);
45769
+ const box = _core_ui_index_js__WEBPACK_IMPORTED_MODULE_6__.UIElement.closestElement(node, _core_ui_index_js__WEBPACK_IMPORTED_MODULE_6__.Popup);
45546
45770
  if (!box) {
45547
45771
  this.j.e.fire('outsideClick', e);
45548
45772
  }
@@ -45551,7 +45775,7 @@ _config_js__WEBPACK_IMPORTED_MODULE_0__.Config.prototype.select = {
45551
45775
  const { s } = this.j;
45552
45776
  if (!s.isCollapsed()) {
45553
45777
  const current = s.current();
45554
- if (current && _core_dom_dom_js__WEBPACK_IMPORTED_MODULE_1__.Dom.isOrContains(this.j.editor, current)) {
45778
+ if (current && _core_dom_dom_js__WEBPACK_IMPORTED_MODULE_2__.Dom.isOrContains(this.j.editor, current)) {
45555
45779
  this.onCopyNormalizeSelectionBound();
45556
45780
  }
45557
45781
  }
@@ -45570,14 +45794,14 @@ _config_js__WEBPACK_IMPORTED_MODULE_0__.Config.prototype.select = {
45570
45794
  */ onClickRightOfNestedListItem(e) {
45571
45795
  const { s } = this.j;
45572
45796
  const range = s.range;
45573
- if (!range.collapsed || range.startOffset !== 0 || !_core_dom_dom_js__WEBPACK_IMPORTED_MODULE_1__.Dom.isText(range.startContainer)) {
45797
+ if (!range.collapsed || range.startOffset !== 0 || !_core_dom_dom_js__WEBPACK_IMPORTED_MODULE_2__.Dom.isText(range.startContainer)) {
45574
45798
  return;
45575
45799
  }
45576
45800
  const text = range.startContainer;
45577
45801
  const li = text.parentNode;
45578
45802
  // The text must be the direct content of a list item that has a nested
45579
45803
  // list (the last level has no nested list and behaves correctly).
45580
- if (!_core_dom_dom_js__WEBPACK_IMPORTED_MODULE_1__.Dom.isTag(li, 'li') || !(li.querySelector('ul') || li.querySelector('ol'))) {
45804
+ if (!_core_dom_dom_js__WEBPACK_IMPORTED_MODULE_2__.Dom.isTag(li, 'li') || !(li.querySelector('ul') || li.querySelector('ol'))) {
45581
45805
  return;
45582
45806
  }
45583
45807
  const measure = this.j.ed.createRange();
@@ -45588,6 +45812,35 @@ _config_js__WEBPACK_IMPORTED_MODULE_0__.Config.prototype.select = {
45588
45812
  s.setCursorAfter(text);
45589
45813
  }
45590
45814
  }
45815
+ /**
45816
+ * Keep pending inline formatting after a click. Toggling Bold/Italic/etc. on
45817
+ * a collapsed cursor leaves empty marker elements with the caret inside; a
45818
+ * click puts the caret right before them (outside), so they get cleaned up
45819
+ * and the formatting is lost. Move the caret back into the innermost marker
45820
+ * so the next typed character keeps every pending format (#1291).
45821
+ */ onClickKeepPendingFormat() {
45822
+ var _a, _b;
45823
+ const { s } = this.j;
45824
+ const range = s.range;
45825
+ if (!range.collapsed || !_core_dom_dom_js__WEBPACK_IMPORTED_MODULE_2__.Dom.isText(range.startContainer)) {
45826
+ return;
45827
+ }
45828
+ const text = range.startContainer;
45829
+ // Caret must sit at the very end of the text, right before the markers.
45830
+ if (range.startOffset !== ((_b = (_a = text.nodeValue) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0)) {
45831
+ return;
45832
+ }
45833
+ const marker = text.nextSibling;
45834
+ if (!_core_dom_dom_js__WEBPACK_IMPORTED_MODULE_2__.Dom.isElement(marker) || !marker.nodeName.match(_core_constants_js__WEBPACK_IMPORTED_MODULE_0__.IS_INLINE) || !_core_dom_dom_js__WEBPACK_IMPORTED_MODULE_2__.Dom.isEmpty(marker)) {
45835
+ return;
45836
+ }
45837
+ let inner = marker;
45838
+ // Descend into the innermost empty formatting marker.
45839
+ while(_core_dom_dom_js__WEBPACK_IMPORTED_MODULE_2__.Dom.isElement(inner.firstElementChild) && inner.firstElementChild.nodeName.match(_core_constants_js__WEBPACK_IMPORTED_MODULE_0__.IS_INLINE)){
45840
+ inner = inner.firstElementChild;
45841
+ }
45842
+ s.setCursorIn(inner);
45843
+ }
45591
45844
  /**
45592
45845
  * Normalize selection after triple click
45593
45846
  */ onTripleClickNormalizeSelection(e) {
@@ -45596,8 +45849,8 @@ _config_js__WEBPACK_IMPORTED_MODULE_0__.Config.prototype.select = {
45596
45849
  }
45597
45850
  const { s } = this.j;
45598
45851
  const { startContainer, startOffset } = s.range;
45599
- if (startOffset === 0 && _core_dom_dom_js__WEBPACK_IMPORTED_MODULE_1__.Dom.isText(startContainer)) {
45600
- s.select(_core_dom_dom_js__WEBPACK_IMPORTED_MODULE_1__.Dom.closest(startContainer, _core_dom_dom_js__WEBPACK_IMPORTED_MODULE_1__.Dom.isBlock, this.j.editor) || startContainer, true);
45852
+ if (startOffset === 0 && _core_dom_dom_js__WEBPACK_IMPORTED_MODULE_2__.Dom.isText(startContainer)) {
45853
+ s.select(_core_dom_dom_js__WEBPACK_IMPORTED_MODULE_2__.Dom.closest(startContainer, _core_dom_dom_js__WEBPACK_IMPORTED_MODULE_2__.Dom.isBlock, this.j.editor) || startContainer, true);
45601
45854
  }
45602
45855
  }
45603
45856
  onCopyNormalizeSelectionBound(e) {
@@ -45605,7 +45858,7 @@ _config_js__WEBPACK_IMPORTED_MODULE_0__.Config.prototype.select = {
45605
45858
  if (!o.select.normalizeSelectionBeforeCutAndCopy || s.isCollapsed()) {
45606
45859
  return;
45607
45860
  }
45608
- if (e && (!e.isTrusted || !_core_dom_dom_js__WEBPACK_IMPORTED_MODULE_1__.Dom.isNode(e.target) || !_core_dom_dom_js__WEBPACK_IMPORTED_MODULE_1__.Dom.isOrContains(editor, e.target))) {
45861
+ if (e && (!e.isTrusted || !_core_dom_dom_js__WEBPACK_IMPORTED_MODULE_2__.Dom.isNode(e.target) || !_core_dom_dom_js__WEBPACK_IMPORTED_MODULE_2__.Dom.isOrContains(editor, e.target))) {
45609
45862
  return;
45610
45863
  }
45611
45864
  this.jodit.s.expandSelection();
@@ -45622,38 +45875,43 @@ _config_js__WEBPACK_IMPORTED_MODULE_0__.Config.prototype.select = {
45622
45875
  }
45623
45876
  }
45624
45877
  __decorate([
45625
- _core_decorators_index_js__WEBPACK_IMPORTED_MODULE_0__.autobind
45878
+ _core_decorators_index_js__WEBPACK_IMPORTED_MODULE_1__.autobind
45626
45879
  ], select.prototype, "onStartSelection", null);
45627
45880
  __decorate([
45628
- (0,_core_decorators_index_js__WEBPACK_IMPORTED_MODULE_0__.watch)('ow:click')
45881
+ (0,_core_decorators_index_js__WEBPACK_IMPORTED_MODULE_1__.watch)('ow:click')
45629
45882
  ], select.prototype, "onOutsideClick", null);
45630
45883
  __decorate([
45631
- (0,_core_decorators_index_js__WEBPACK_IMPORTED_MODULE_0__.watch)([
45884
+ (0,_core_decorators_index_js__WEBPACK_IMPORTED_MODULE_1__.watch)([
45632
45885
  ':beforeCommandCut'
45633
45886
  ])
45634
45887
  ], select.prototype, "beforeCommandCut", null);
45635
45888
  __decorate([
45636
- (0,_core_decorators_index_js__WEBPACK_IMPORTED_MODULE_0__.watch)([
45889
+ (0,_core_decorators_index_js__WEBPACK_IMPORTED_MODULE_1__.watch)([
45637
45890
  ':beforeCommandSelectall'
45638
45891
  ])
45639
45892
  ], select.prototype, "beforeCommandSelectAll", null);
45640
45893
  __decorate([
45641
- (0,_core_decorators_index_js__WEBPACK_IMPORTED_MODULE_0__.watch)([
45894
+ (0,_core_decorators_index_js__WEBPACK_IMPORTED_MODULE_1__.watch)([
45642
45895
  ':click'
45643
45896
  ])
45644
45897
  ], select.prototype, "onClickRightOfNestedListItem", null);
45645
45898
  __decorate([
45646
- (0,_core_decorators_index_js__WEBPACK_IMPORTED_MODULE_0__.watch)([
45899
+ (0,_core_decorators_index_js__WEBPACK_IMPORTED_MODULE_1__.watch)([
45900
+ ':click'
45901
+ ])
45902
+ ], select.prototype, "onClickKeepPendingFormat", null);
45903
+ __decorate([
45904
+ (0,_core_decorators_index_js__WEBPACK_IMPORTED_MODULE_1__.watch)([
45647
45905
  ':click'
45648
45906
  ])
45649
45907
  ], select.prototype, "onTripleClickNormalizeSelection", null);
45650
45908
  __decorate([
45651
- (0,_core_decorators_index_js__WEBPACK_IMPORTED_MODULE_0__.watch)([
45909
+ (0,_core_decorators_index_js__WEBPACK_IMPORTED_MODULE_1__.watch)([
45652
45910
  ':copy',
45653
45911
  ':cut'
45654
45912
  ])
45655
45913
  ], select.prototype, "onCopyNormalizeSelectionBound", null);
45656
- _core_global_js__WEBPACK_IMPORTED_MODULE_2__.pluginSystem.add('select', select);
45914
+ _core_global_js__WEBPACK_IMPORTED_MODULE_3__.pluginSystem.add('select', select);
45657
45915
 
45658
45916
 
45659
45917
  /***/ }),