jodit-pro 4.15.19 → 4.16.0

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 (317) hide show
  1. package/es2015/jodit.css +1 -1
  2. package/es2015/jodit.fat.min.js +12 -11
  3. package/es2015/jodit.js +255 -91
  4. package/es2015/jodit.min.js +11 -10
  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.css +1 -1
  9. package/es2015/plugins/autocomplete/autocomplete.js +1 -1
  10. package/es2015/plugins/autocomplete/autocomplete.min.js +1 -1
  11. package/es2015/plugins/backup/backup.css +1 -1
  12. package/es2015/plugins/backup/backup.js +1 -1
  13. package/es2015/plugins/backup/backup.min.js +1 -1
  14. package/es2015/plugins/button-generator/button-generator.css +1 -1
  15. package/es2015/plugins/button-generator/button-generator.js +1 -1
  16. package/es2015/plugins/button-generator/button-generator.min.js +1 -1
  17. package/es2015/plugins/change-case/change-case.js +1 -1
  18. package/es2015/plugins/change-case/change-case.min.js +1 -1
  19. package/es2015/plugins/color-picker/color-picker.css +1 -1
  20. package/es2015/plugins/color-picker/color-picker.js +1 -1
  21. package/es2015/plugins/color-picker/color-picker.min.js +1 -1
  22. package/es2015/plugins/emoji/emoji.css +1 -1
  23. package/es2015/plugins/emoji/emoji.js +1 -1
  24. package/es2015/plugins/emoji/emoji.min.js +1 -1
  25. package/es2015/plugins/export-docs/export-docs.js +1 -1
  26. package/es2015/plugins/export-docs/export-docs.min.js +1 -1
  27. package/es2015/plugins/finder/finder.css +1 -1
  28. package/es2015/plugins/finder/finder.js +4 -1
  29. package/es2015/plugins/finder/finder.min.js +2 -2
  30. package/es2015/plugins/google-maps/google-maps.css +1 -1
  31. package/es2015/plugins/google-maps/google-maps.js +1 -1
  32. package/es2015/plugins/google-maps/google-maps.min.js +1 -1
  33. package/es2015/plugins/google-search/google-search.js +1 -1
  34. package/es2015/plugins/google-search/google-search.min.js +1 -1
  35. package/es2015/plugins/highlight-signature/highlight-signature.js +1 -1
  36. package/es2015/plugins/highlight-signature/highlight-signature.min.js +1 -1
  37. package/es2015/plugins/iframe-editor/iframe-editor.css +1 -1
  38. package/es2015/plugins/iframe-editor/iframe-editor.js +1 -1
  39. package/es2015/plugins/iframe-editor/iframe-editor.min.js +1 -1
  40. package/es2015/plugins/image-editor-pro/image-editor-pro.css +1 -1
  41. package/es2015/plugins/image-editor-pro/image-editor-pro.js +1 -1
  42. package/es2015/plugins/image-editor-pro/image-editor-pro.min.js +1 -1
  43. package/es2015/plugins/keyboard/keyboard.css +1 -1
  44. package/es2015/plugins/keyboard/keyboard.js +1 -1
  45. package/es2015/plugins/keyboard/keyboard.min.js +1 -1
  46. package/es2015/plugins/mobile-view/mobile-view.js +1 -1
  47. package/es2015/plugins/mobile-view/mobile-view.min.js +1 -1
  48. package/es2015/plugins/page-break/page-break.js +1 -1
  49. package/es2015/plugins/page-break/page-break.min.js +1 -1
  50. package/es2015/plugins/paste-code/paste-code.css +1 -1
  51. package/es2015/plugins/paste-code/paste-code.js +1 -1
  52. package/es2015/plugins/paste-code/paste-code.min.js +1 -1
  53. package/es2015/plugins/paste-from-word/paste-from-word.js +1 -1
  54. package/es2015/plugins/paste-from-word/paste-from-word.min.js +1 -1
  55. package/es2015/plugins/show-blocks/show-blocks.js +1 -1
  56. package/es2015/plugins/show-blocks/show-blocks.min.js +1 -1
  57. package/es2015/plugins/style/style.css +1 -1
  58. package/es2015/plugins/style/style.js +1 -1
  59. package/es2015/plugins/style/style.min.js +1 -1
  60. package/es2015/plugins/templates/templates.css +1 -1
  61. package/es2015/plugins/templates/templates.js +1 -1
  62. package/es2015/plugins/templates/templates.min.js +1 -1
  63. package/es2015/plugins/todo-list/todo-list.css +1 -1
  64. package/es2015/plugins/todo-list/todo-list.js +1 -1
  65. package/es2015/plugins/todo-list/todo-list.min.js +1 -1
  66. package/es2015/plugins/translate/translate.css +1 -1
  67. package/es2015/plugins/translate/translate.js +1 -1
  68. package/es2015/plugins/translate/translate.min.js +1 -1
  69. package/es2015/plugins/tune-block/tune-block.css +1 -1
  70. package/es2015/plugins/tune-block/tune-block.js +1 -1
  71. package/es2015/plugins/tune-block/tune-block.min.js +1 -1
  72. package/es2018/jodit.fat.min.js +12 -11
  73. package/es2018/jodit.min.js +11 -10
  74. package/es2018/plugins/ai-assistant-pro/ai-assistant-pro.min.js +1 -1
  75. package/es2018/plugins/autocomplete/autocomplete.min.js +1 -1
  76. package/es2018/plugins/backup/backup.min.js +1 -1
  77. package/es2018/plugins/button-generator/button-generator.min.js +1 -1
  78. package/es2018/plugins/change-case/change-case.min.js +1 -1
  79. package/es2018/plugins/color-picker/color-picker.min.js +1 -1
  80. package/es2018/plugins/emoji/emoji.min.js +1 -1
  81. package/es2018/plugins/export-docs/export-docs.min.js +1 -1
  82. package/es2018/plugins/finder/finder.min.js +13 -13
  83. package/es2018/plugins/google-maps/google-maps.min.js +1 -1
  84. package/es2018/plugins/google-search/google-search.min.js +1 -1
  85. package/es2018/plugins/highlight-signature/highlight-signature.min.js +1 -1
  86. package/es2018/plugins/iframe-editor/iframe-editor.min.js +1 -1
  87. package/es2018/plugins/image-editor-pro/image-editor-pro.min.js +1 -1
  88. package/es2018/plugins/keyboard/keyboard.min.js +1 -1
  89. package/es2018/plugins/mobile-view/mobile-view.min.js +1 -1
  90. package/es2018/plugins/page-break/page-break.min.js +1 -1
  91. package/es2018/plugins/paste-code/paste-code.min.js +1 -1
  92. package/es2018/plugins/paste-from-word/paste-from-word.min.js +1 -1
  93. package/es2018/plugins/show-blocks/show-blocks.min.js +1 -1
  94. package/es2018/plugins/style/style.min.js +1 -1
  95. package/es2018/plugins/templates/templates.min.js +1 -1
  96. package/es2018/plugins/todo-list/todo-list.min.js +1 -1
  97. package/es2018/plugins/translate/translate.min.js +1 -1
  98. package/es2018/plugins/tune-block/tune-block.min.js +1 -1
  99. package/es2021/jodit.css +1 -1
  100. package/es2021/jodit.fat.min.js +16 -15
  101. package/es2021/jodit.js +255 -91
  102. package/es2021/jodit.min.js +16 -15
  103. package/es2021/plugins/ai-assistant-pro/ai-assistant-pro.css +1 -1
  104. package/es2021/plugins/ai-assistant-pro/ai-assistant-pro.js +1 -1
  105. package/es2021/plugins/ai-assistant-pro/ai-assistant-pro.min.js +1 -1
  106. package/es2021/plugins/autocomplete/autocomplete.css +1 -1
  107. package/es2021/plugins/autocomplete/autocomplete.js +1 -1
  108. package/es2021/plugins/autocomplete/autocomplete.min.js +1 -1
  109. package/es2021/plugins/backup/backup.css +1 -1
  110. package/es2021/plugins/backup/backup.js +1 -1
  111. package/es2021/plugins/backup/backup.min.js +1 -1
  112. package/es2021/plugins/button-generator/button-generator.css +1 -1
  113. package/es2021/plugins/button-generator/button-generator.js +1 -1
  114. package/es2021/plugins/button-generator/button-generator.min.js +1 -1
  115. package/es2021/plugins/change-case/change-case.js +1 -1
  116. package/es2021/plugins/change-case/change-case.min.js +1 -1
  117. package/es2021/plugins/color-picker/color-picker.css +1 -1
  118. package/es2021/plugins/color-picker/color-picker.js +1 -1
  119. package/es2021/plugins/color-picker/color-picker.min.js +1 -1
  120. package/es2021/plugins/emoji/emoji.css +1 -1
  121. package/es2021/plugins/emoji/emoji.js +1 -1
  122. package/es2021/plugins/emoji/emoji.min.js +1 -1
  123. package/es2021/plugins/export-docs/export-docs.js +1 -1
  124. package/es2021/plugins/export-docs/export-docs.min.js +1 -1
  125. package/es2021/plugins/finder/finder.css +1 -1
  126. package/es2021/plugins/finder/finder.js +4 -1
  127. package/es2021/plugins/finder/finder.min.js +2 -2
  128. package/es2021/plugins/google-maps/google-maps.css +1 -1
  129. package/es2021/plugins/google-maps/google-maps.js +1 -1
  130. package/es2021/plugins/google-maps/google-maps.min.js +1 -1
  131. package/es2021/plugins/google-search/google-search.js +1 -1
  132. package/es2021/plugins/google-search/google-search.min.js +1 -1
  133. package/es2021/plugins/highlight-signature/highlight-signature.js +1 -1
  134. package/es2021/plugins/highlight-signature/highlight-signature.min.js +1 -1
  135. package/es2021/plugins/iframe-editor/iframe-editor.css +1 -1
  136. package/es2021/plugins/iframe-editor/iframe-editor.js +1 -1
  137. package/es2021/plugins/iframe-editor/iframe-editor.min.js +1 -1
  138. package/es2021/plugins/image-editor-pro/image-editor-pro.css +1 -1
  139. package/es2021/plugins/image-editor-pro/image-editor-pro.js +1 -1
  140. package/es2021/plugins/image-editor-pro/image-editor-pro.min.js +1 -1
  141. package/es2021/plugins/keyboard/keyboard.css +1 -1
  142. package/es2021/plugins/keyboard/keyboard.js +1 -1
  143. package/es2021/plugins/keyboard/keyboard.min.js +1 -1
  144. package/es2021/plugins/mobile-view/mobile-view.js +1 -1
  145. package/es2021/plugins/mobile-view/mobile-view.min.js +1 -1
  146. package/es2021/plugins/page-break/page-break.js +1 -1
  147. package/es2021/plugins/page-break/page-break.min.js +1 -1
  148. package/es2021/plugins/paste-code/paste-code.css +1 -1
  149. package/es2021/plugins/paste-code/paste-code.js +1 -1
  150. package/es2021/plugins/paste-code/paste-code.min.js +1 -1
  151. package/es2021/plugins/paste-from-word/paste-from-word.js +1 -1
  152. package/es2021/plugins/paste-from-word/paste-from-word.min.js +1 -1
  153. package/es2021/plugins/show-blocks/show-blocks.js +1 -1
  154. package/es2021/plugins/show-blocks/show-blocks.min.js +1 -1
  155. package/es2021/plugins/style/style.css +1 -1
  156. package/es2021/plugins/style/style.js +1 -1
  157. package/es2021/plugins/style/style.min.js +1 -1
  158. package/es2021/plugins/templates/templates.css +1 -1
  159. package/es2021/plugins/templates/templates.js +1 -1
  160. package/es2021/plugins/templates/templates.min.js +1 -1
  161. package/es2021/plugins/todo-list/todo-list.css +1 -1
  162. package/es2021/plugins/todo-list/todo-list.js +1 -1
  163. package/es2021/plugins/todo-list/todo-list.min.js +1 -1
  164. package/es2021/plugins/translate/translate.css +1 -1
  165. package/es2021/plugins/translate/translate.js +1 -1
  166. package/es2021/plugins/translate/translate.min.js +1 -1
  167. package/es2021/plugins/tune-block/tune-block.css +1 -1
  168. package/es2021/plugins/tune-block/tune-block.js +1 -1
  169. package/es2021/plugins/tune-block/tune-block.min.js +1 -1
  170. package/es2021.en/jodit.css +1 -1
  171. package/es2021.en/jodit.fat.min.js +16 -15
  172. package/es2021.en/jodit.js +255 -91
  173. package/es2021.en/jodit.min.js +17 -16
  174. package/es2021.en/plugins/ai-assistant-pro/ai-assistant-pro.css +1 -1
  175. package/es2021.en/plugins/ai-assistant-pro/ai-assistant-pro.js +1 -1
  176. package/es2021.en/plugins/ai-assistant-pro/ai-assistant-pro.min.js +1 -1
  177. package/es2021.en/plugins/autocomplete/autocomplete.css +1 -1
  178. package/es2021.en/plugins/autocomplete/autocomplete.js +1 -1
  179. package/es2021.en/plugins/autocomplete/autocomplete.min.js +1 -1
  180. package/es2021.en/plugins/backup/backup.css +1 -1
  181. package/es2021.en/plugins/backup/backup.js +1 -1
  182. package/es2021.en/plugins/backup/backup.min.js +1 -1
  183. package/es2021.en/plugins/button-generator/button-generator.css +1 -1
  184. package/es2021.en/plugins/button-generator/button-generator.js +1 -1
  185. package/es2021.en/plugins/button-generator/button-generator.min.js +1 -1
  186. package/es2021.en/plugins/change-case/change-case.js +1 -1
  187. package/es2021.en/plugins/change-case/change-case.min.js +1 -1
  188. package/es2021.en/plugins/color-picker/color-picker.css +1 -1
  189. package/es2021.en/plugins/color-picker/color-picker.js +1 -1
  190. package/es2021.en/plugins/color-picker/color-picker.min.js +1 -1
  191. package/es2021.en/plugins/emoji/emoji.css +1 -1
  192. package/es2021.en/plugins/emoji/emoji.js +1 -1
  193. package/es2021.en/plugins/emoji/emoji.min.js +1 -1
  194. package/es2021.en/plugins/export-docs/export-docs.js +1 -1
  195. package/es2021.en/plugins/export-docs/export-docs.min.js +1 -1
  196. package/es2021.en/plugins/finder/finder.css +1 -1
  197. package/es2021.en/plugins/finder/finder.js +4 -1
  198. package/es2021.en/plugins/finder/finder.min.js +2 -2
  199. package/es2021.en/plugins/google-maps/google-maps.css +1 -1
  200. package/es2021.en/plugins/google-maps/google-maps.js +1 -1
  201. package/es2021.en/plugins/google-maps/google-maps.min.js +1 -1
  202. package/es2021.en/plugins/google-search/google-search.js +1 -1
  203. package/es2021.en/plugins/google-search/google-search.min.js +1 -1
  204. package/es2021.en/plugins/highlight-signature/highlight-signature.js +1 -1
  205. package/es2021.en/plugins/highlight-signature/highlight-signature.min.js +1 -1
  206. package/es2021.en/plugins/iframe-editor/iframe-editor.css +1 -1
  207. package/es2021.en/plugins/iframe-editor/iframe-editor.js +1 -1
  208. package/es2021.en/plugins/iframe-editor/iframe-editor.min.js +1 -1
  209. package/es2021.en/plugins/image-editor-pro/image-editor-pro.css +1 -1
  210. package/es2021.en/plugins/image-editor-pro/image-editor-pro.js +1 -1
  211. package/es2021.en/plugins/image-editor-pro/image-editor-pro.min.js +1 -1
  212. package/es2021.en/plugins/keyboard/keyboard.css +1 -1
  213. package/es2021.en/plugins/keyboard/keyboard.js +1 -1
  214. package/es2021.en/plugins/keyboard/keyboard.min.js +1 -1
  215. package/es2021.en/plugins/mobile-view/mobile-view.js +1 -1
  216. package/es2021.en/plugins/mobile-view/mobile-view.min.js +1 -1
  217. package/es2021.en/plugins/page-break/page-break.js +1 -1
  218. package/es2021.en/plugins/page-break/page-break.min.js +1 -1
  219. package/es2021.en/plugins/paste-code/paste-code.css +1 -1
  220. package/es2021.en/plugins/paste-code/paste-code.js +1 -1
  221. package/es2021.en/plugins/paste-code/paste-code.min.js +1 -1
  222. package/es2021.en/plugins/paste-from-word/paste-from-word.js +1 -1
  223. package/es2021.en/plugins/paste-from-word/paste-from-word.min.js +1 -1
  224. package/es2021.en/plugins/show-blocks/show-blocks.js +1 -1
  225. package/es2021.en/plugins/show-blocks/show-blocks.min.js +1 -1
  226. package/es2021.en/plugins/style/style.css +1 -1
  227. package/es2021.en/plugins/style/style.js +1 -1
  228. package/es2021.en/plugins/style/style.min.js +1 -1
  229. package/es2021.en/plugins/templates/templates.css +1 -1
  230. package/es2021.en/plugins/templates/templates.js +1 -1
  231. package/es2021.en/plugins/templates/templates.min.js +1 -1
  232. package/es2021.en/plugins/todo-list/todo-list.css +1 -1
  233. package/es2021.en/plugins/todo-list/todo-list.js +1 -1
  234. package/es2021.en/plugins/todo-list/todo-list.min.js +1 -1
  235. package/es2021.en/plugins/translate/translate.css +1 -1
  236. package/es2021.en/plugins/translate/translate.js +1 -1
  237. package/es2021.en/plugins/translate/translate.min.js +1 -1
  238. package/es2021.en/plugins/tune-block/tune-block.css +1 -1
  239. package/es2021.en/plugins/tune-block/tune-block.js +1 -1
  240. package/es2021.en/plugins/tune-block/tune-block.min.js +1 -1
  241. package/es5/jodit.css +2 -2
  242. package/es5/jodit.fat.min.js +2 -2
  243. package/es5/jodit.js +357 -99
  244. package/es5/jodit.min.css +2 -2
  245. package/es5/jodit.min.js +2 -2
  246. package/es5/plugins/ai-assistant-pro/ai-assistant-pro.css +1 -1
  247. package/es5/plugins/ai-assistant-pro/ai-assistant-pro.js +1 -1
  248. package/es5/plugins/ai-assistant-pro/ai-assistant-pro.min.js +1 -1
  249. package/es5/plugins/autocomplete/autocomplete.css +1 -1
  250. package/es5/plugins/autocomplete/autocomplete.js +1 -1
  251. package/es5/plugins/autocomplete/autocomplete.min.js +1 -1
  252. package/es5/plugins/backup/backup.css +1 -1
  253. package/es5/plugins/backup/backup.js +1 -1
  254. package/es5/plugins/backup/backup.min.js +1 -1
  255. package/es5/plugins/button-generator/button-generator.css +1 -1
  256. package/es5/plugins/button-generator/button-generator.js +1 -1
  257. package/es5/plugins/button-generator/button-generator.min.js +1 -1
  258. package/es5/plugins/change-case/change-case.js +1 -1
  259. package/es5/plugins/change-case/change-case.min.js +1 -1
  260. package/es5/plugins/color-picker/color-picker.css +1 -1
  261. package/es5/plugins/color-picker/color-picker.js +1 -1
  262. package/es5/plugins/color-picker/color-picker.min.js +1 -1
  263. package/es5/plugins/emoji/emoji.css +1 -1
  264. package/es5/plugins/emoji/emoji.js +1 -1
  265. package/es5/plugins/emoji/emoji.min.js +1 -1
  266. package/es5/plugins/export-docs/export-docs.js +1 -1
  267. package/es5/plugins/export-docs/export-docs.min.js +1 -1
  268. package/es5/plugins/finder/finder.css +1 -1
  269. package/es5/plugins/finder/finder.js +4 -1
  270. package/es5/plugins/finder/finder.min.js +2 -2
  271. package/es5/plugins/google-maps/google-maps.css +1 -1
  272. package/es5/plugins/google-maps/google-maps.js +1 -1
  273. package/es5/plugins/google-maps/google-maps.min.js +1 -1
  274. package/es5/plugins/google-search/google-search.js +1 -1
  275. package/es5/plugins/google-search/google-search.min.js +1 -1
  276. package/es5/plugins/highlight-signature/highlight-signature.js +1 -1
  277. package/es5/plugins/highlight-signature/highlight-signature.min.js +1 -1
  278. package/es5/plugins/iframe-editor/iframe-editor.css +1 -1
  279. package/es5/plugins/iframe-editor/iframe-editor.js +1 -1
  280. package/es5/plugins/iframe-editor/iframe-editor.min.js +1 -1
  281. package/es5/plugins/image-editor-pro/image-editor-pro.css +1 -1
  282. package/es5/plugins/image-editor-pro/image-editor-pro.js +1 -1
  283. package/es5/plugins/image-editor-pro/image-editor-pro.min.js +1 -1
  284. package/es5/plugins/keyboard/keyboard.css +1 -1
  285. package/es5/plugins/keyboard/keyboard.js +1 -1
  286. package/es5/plugins/keyboard/keyboard.min.js +1 -1
  287. package/es5/plugins/mobile-view/mobile-view.js +1 -1
  288. package/es5/plugins/mobile-view/mobile-view.min.js +1 -1
  289. package/es5/plugins/page-break/page-break.js +1 -1
  290. package/es5/plugins/page-break/page-break.min.js +1 -1
  291. package/es5/plugins/paste-code/paste-code.css +1 -1
  292. package/es5/plugins/paste-code/paste-code.js +1 -1
  293. package/es5/plugins/paste-code/paste-code.min.js +1 -1
  294. package/es5/plugins/paste-from-word/paste-from-word.js +1 -1
  295. package/es5/plugins/paste-from-word/paste-from-word.min.js +1 -1
  296. package/es5/plugins/show-blocks/show-blocks.js +1 -1
  297. package/es5/plugins/show-blocks/show-blocks.min.js +1 -1
  298. package/es5/plugins/style/style.css +1 -1
  299. package/es5/plugins/style/style.js +1 -1
  300. package/es5/plugins/style/style.min.js +1 -1
  301. package/es5/plugins/templates/templates.css +1 -1
  302. package/es5/plugins/templates/templates.js +1 -1
  303. package/es5/plugins/templates/templates.min.js +1 -1
  304. package/es5/plugins/todo-list/todo-list.css +1 -1
  305. package/es5/plugins/todo-list/todo-list.js +1 -1
  306. package/es5/plugins/todo-list/todo-list.min.js +1 -1
  307. package/es5/plugins/translate/translate.css +1 -1
  308. package/es5/plugins/translate/translate.js +1 -1
  309. package/es5/plugins/translate/translate.min.js +1 -1
  310. package/es5/plugins/tune-block/tune-block.css +1 -1
  311. package/es5/plugins/tune-block/tune-block.js +1 -1
  312. package/es5/plugins/tune-block/tune-block.min.js +1 -1
  313. package/es5/polyfills.fat.min.js +1 -1
  314. package/es5/polyfills.js +1 -1
  315. package/es5/polyfills.min.js +1 -1
  316. package/esm/plugins/finder/browser.js +1 -1
  317. 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.15.19
4
+ * Version: v4.16.0
5
5
  * Url: https://xdsoft.net/jodit/pro/
6
6
  * License(s): SEE LICENSE IN LICENSE.md
7
7
  */
@@ -725,6 +725,25 @@ let ConfigPrototype = {};
725
725
  /**
726
726
  * Default width (in pixels) applied to images inserted into the editor
727
727
  */ this.imageDefaultWidth = 300;
728
+ /**
729
+ * Alignment given to images inserted into the editor. `'normal'` leaves
730
+ * them unaligned
731
+ */ this.imageDefaultAlign = 'normal';
732
+ /**
733
+ * Class names to align images with, instead of an inline `float` or
734
+ * `margin`. Aligning an image removes every class listed here and adds the
735
+ * chosen alignment's, which can be several separated by spaces.
736
+ *
737
+ * ```javascript
738
+ * Jodit.make('#editor', {
739
+ * imageAlignClasses: {
740
+ * left: 'align-left',
741
+ * right: 'align-right',
742
+ * center: 'align-center'
743
+ * }
744
+ * });
745
+ * ```
746
+ */ this.imageAlignClasses = null;
728
747
  /**
729
748
  * Do not display these buttons that are on the list
730
749
  *
@@ -1724,7 +1743,7 @@ __webpack_require__.r(__webpack_exports__);
1724
1743
  * ```
1725
1744
  * @packageDocumentation
1726
1745
  * @module constants
1727
- */ const APP_VERSION = "4.15.19";
1746
+ */ const APP_VERSION = "4.16.0";
1728
1747
  // prettier-ignore
1729
1748
  const ES = "es2021";
1730
1749
  const IS_ES_MODERN = true;
@@ -6283,6 +6302,7 @@ __webpack_require__.r(__webpack_exports__);
6283
6302
  /* harmony export */ getContentWidth: function() { return /* reexport safe */ _size_index_js__WEBPACK_IMPORTED_MODULE_6__.getContentWidth; },
6284
6303
  /* harmony export */ getDataTransfer: function() { return /* reexport safe */ _utils_index_js__WEBPACK_IMPORTED_MODULE_8__.getDataTransfer; },
6285
6304
  /* harmony export */ getFixedPositionOffset: function() { return /* reexport safe */ _size_index_js__WEBPACK_IMPORTED_MODULE_6__.getFixedPositionOffset; },
6305
+ /* harmony export */ getHAlign: function() { return /* reexport safe */ _utils_index_js__WEBPACK_IMPORTED_MODULE_8__.getHAlign; },
6286
6306
  /* harmony export */ getPropertyDescriptor: function() { return /* reexport safe */ _utils_index_js__WEBPACK_IMPORTED_MODULE_8__.getPropertyDescriptor; },
6287
6307
  /* harmony export */ getScrollParent: function() { return /* reexport safe */ _size_index_js__WEBPACK_IMPORTED_MODULE_6__.getScrollParent; },
6288
6308
  /* harmony export */ getXPathByElement: function() { return /* reexport safe */ _utils_index_js__WEBPACK_IMPORTED_MODULE_8__.getXPathByElement; },
@@ -7373,6 +7393,7 @@ function trimChars(value, chars) {
7373
7393
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
7374
7394
  /* harmony export */ alignElement: function() { return /* binding */ alignElement; },
7375
7395
  /* harmony export */ clearAlign: function() { return /* binding */ clearAlign; },
7396
+ /* harmony export */ getHAlign: function() { return /* binding */ getHAlign; },
7376
7397
  /* harmony export */ hAlignElement: function() { return /* binding */ hAlignElement; }
7377
7398
  /* harmony export */ });
7378
7399
  /* harmony import */ var _dom_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(22732);
@@ -7385,9 +7406,26 @@ function trimChars(value, chars) {
7385
7406
  */
7386
7407
 
7387
7408
 
7409
+ const classNames = (value)=>(value !== null && value !== void 0 ? value : '').split(/\s+/).filter(Boolean);
7388
7410
  /**
7389
- * Align image
7390
- */ function hAlignElement(image, align) {
7411
+ * Align image, with `classes` (see `imageAlignClasses`) instead of inline
7412
+ * styles when they are given
7413
+ */ function hAlignElement(image, align, classes) {
7414
+ if (classes) {
7415
+ hAlignElement(image, 'normal');
7416
+ Object.values(classes).forEach((value)=>image.classList.remove(...classNames(value)));
7417
+ image.classList.add(...classNames(classes[align || 'normal']));
7418
+ [
7419
+ 'class',
7420
+ 'style'
7421
+ ].forEach((name)=>{
7422
+ var _a;
7423
+ if (!((_a = (0,_attr_js__WEBPACK_IMPORTED_MODULE_1__.attr)(image, name)) === null || _a === void 0 ? void 0 : _a.trim())) {
7424
+ (0,_attr_js__WEBPACK_IMPORTED_MODULE_1__.attr)(image, name, null);
7425
+ }
7426
+ });
7427
+ return;
7428
+ }
7391
7429
  if (align && align !== 'normal') {
7392
7430
  if (align !== 'center') {
7393
7431
  (0,_css_js__WEBPACK_IMPORTED_MODULE_2__.css)(image, 'float', align);
@@ -7410,6 +7448,31 @@ function trimChars(value, chars) {
7410
7448
  ;(0,_css_js__WEBPACK_IMPORTED_MODULE_2__.clearCenterAlign)(image);
7411
7449
  }
7412
7450
  }
7451
+ /**
7452
+ * The alignment `hAlignElement` has set on an element
7453
+ */ function getHAlign(elm, classes) {
7454
+ if (classes) {
7455
+ for (const align of [
7456
+ 'left',
7457
+ 'right',
7458
+ 'center',
7459
+ 'normal'
7460
+ ]){
7461
+ const names = classNames(classes[align]);
7462
+ if (names.length && names.every((name)=>elm.classList.contains(name))) {
7463
+ return align;
7464
+ }
7465
+ }
7466
+ }
7467
+ const float = (0,_css_js__WEBPACK_IMPORTED_MODULE_2__.cssInline)(elm, 'float').toLowerCase();
7468
+ if (float === 'left' || float === 'right') {
7469
+ return float;
7470
+ }
7471
+ if ((0,_css_js__WEBPACK_IMPORTED_MODULE_2__.css)(elm, 'display') === 'block' && (0,_css_js__WEBPACK_IMPORTED_MODULE_2__.cssInline)(elm, 'margin-left') === 'auto' && (0,_css_js__WEBPACK_IMPORTED_MODULE_2__.cssInline)(elm, 'margin-right') === 'auto') {
7472
+ return 'center';
7473
+ }
7474
+ return 'normal';
7475
+ }
7413
7476
  /**
7414
7477
  * Remove text-align style for all selected children
7415
7478
  */ function clearAlign(node) {
@@ -8562,6 +8625,7 @@ const getClassName = (obj)=>{
8562
8625
  /* harmony export */ get: function() { return /* reexport safe */ _get_js__WEBPACK_IMPORTED_MODULE_15__.get; },
8563
8626
  /* harmony export */ getClassName: function() { return /* reexport safe */ _get_class_name_js__WEBPACK_IMPORTED_MODULE_16__.getClassName; },
8564
8627
  /* harmony export */ getDataTransfer: function() { return /* reexport safe */ _utils_js__WEBPACK_IMPORTED_MODULE_27__.getDataTransfer; },
8628
+ /* harmony export */ getHAlign: function() { return /* reexport safe */ _align_js__WEBPACK_IMPORTED_MODULE_0__.getHAlign; },
8565
8629
  /* harmony export */ getPropertyDescriptor: function() { return /* reexport safe */ _utils_js__WEBPACK_IMPORTED_MODULE_27__.getPropertyDescriptor; },
8566
8630
  /* harmony export */ getXPathByElement: function() { return /* reexport safe */ _selector_js__WEBPACK_IMPORTED_MODULE_24__.getXPathByElement; },
8567
8631
  /* harmony export */ hAlignElement: function() { return /* reexport safe */ _align_js__WEBPACK_IMPORTED_MODULE_0__.hAlignElement; },
@@ -10417,10 +10481,11 @@ function findCorrectCurrentNode(node, range, rightMode, isCollapsed, checkChild,
10417
10481
  /* harmony import */ var _dom_dom_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(2748);
10418
10482
  /* harmony import */ var _helpers_index_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(21537);
10419
10483
  /* harmony import */ var _helpers_checker_index_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(27613);
10420
- /* harmony import */ var _helpers_utils_assert_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(38837);
10421
- /* harmony import */ var _helpers_move_the_node_along_the_edge_outward_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(43463);
10422
- /* harmony import */ var _style_commit_style_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(25639);
10423
- /* harmony import */ var _helpers_index_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(45124);
10484
+ /* harmony import */ var _helpers_utils_align_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(25726);
10485
+ /* harmony import */ var _helpers_utils_assert_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(38837);
10486
+ /* harmony import */ var _helpers_move_the_node_along_the_edge_outward_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(43463);
10487
+ /* harmony import */ var _style_commit_style_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(25639);
10488
+ /* harmony import */ var _helpers_index_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(45124);
10424
10489
  /*!
10425
10490
  * Jodit Editor (https://xdsoft.net/jodit/)
10426
10491
  * Released under MIT see LICENSE.txt in the project root for license information.
@@ -10442,6 +10507,7 @@ function findCorrectCurrentNode(node, range, rightMode, isCollapsed, checkChild,
10442
10507
 
10443
10508
 
10444
10509
 
10510
+
10445
10511
  class Selection {
10446
10512
  /**
10447
10513
  * Short alias for this.jodit
@@ -10879,7 +10945,7 @@ class Selection {
10879
10945
  return node;
10880
10946
  }
10881
10947
  if (!_dom_dom_js__WEBPACK_IMPORTED_MODULE_2__.Dom.isText(node)) {
10882
- const ret = (0,_helpers_index_js__WEBPACK_IMPORTED_MODULE_8__.findCorrectCurrentNode)(node, range, rightMode, sel.isCollapsed, checkChild, child);
10948
+ const ret = (0,_helpers_index_js__WEBPACK_IMPORTED_MODULE_9__.findCorrectCurrentNode)(node, range, rightMode, sel.isCollapsed, checkChild, child);
10883
10949
  node = ret.node;
10884
10950
  rightMode = ret.rightMode;
10885
10951
  }
@@ -11023,6 +11089,10 @@ class Selection {
11023
11089
  if (styles && typeof styles === 'object') {
11024
11090
  (0,_helpers_index_js__WEBPACK_IMPORTED_MODULE_3__.css)(image, styles);
11025
11091
  }
11092
+ const { imageDefaultAlign, imageAlignClasses } = this.j.o;
11093
+ if (imageDefaultAlign && imageDefaultAlign !== 'normal') {
11094
+ (0,_helpers_utils_align_js__WEBPACK_IMPORTED_MODULE_5__.hAlignElement)(image, imageDefaultAlign, imageAlignClasses);
11095
+ }
11026
11096
  const onload = ()=>{
11027
11097
  if (image.naturalHeight < image.offsetHeight || image.naturalWidth < image.offsetWidth) {
11028
11098
  (0,_helpers_index_js__WEBPACK_IMPORTED_MODULE_3__.css)(image, {
@@ -11147,7 +11217,7 @@ class Selection {
11147
11217
  const isSignificant = (elm)=>Boolean(elm && !_dom_dom_js__WEBPACK_IMPORTED_MODULE_2__.Dom.isTag(elm, 'br') && !_dom_dom_js__WEBPACK_IMPORTED_MODULE_2__.Dom.isEmptyTextNode(elm) && !_dom_dom_js__WEBPACK_IMPORTED_MODULE_2__.Dom.isTemporary(elm) && !(_dom_dom_js__WEBPACK_IMPORTED_MODULE_2__.Dom.isElement(elm) && this.j.e.fire('isInvisibleForCursor', elm) === true));
11148
11218
  // check right offset
11149
11219
  if (_dom_dom_js__WEBPACK_IMPORTED_MODULE_2__.Dom.isText(container)) {
11150
- if ((0,_helpers_index_js__WEBPACK_IMPORTED_MODULE_8__.cursorInTheEdgeOfString)(container, offset, start, end)) {
11220
+ if ((0,_helpers_index_js__WEBPACK_IMPORTED_MODULE_9__.cursorInTheEdgeOfString)(container, offset, start, end)) {
11151
11221
  return false;
11152
11222
  }
11153
11223
  } else {
@@ -11539,8 +11609,8 @@ class Selection {
11539
11609
  * }) // will remove `color:red` from `span`
11540
11610
  * ```
11541
11611
  */ commitStyle(options) {
11542
- ;(0,_helpers_utils_assert_js__WEBPACK_IMPORTED_MODULE_5__.assert)((0,_helpers_index_js__WEBPACK_IMPORTED_MODULE_3__.size)(options) > 0, 'Need to pass at least one option');
11543
- const styleElm = new _style_commit_style_js__WEBPACK_IMPORTED_MODULE_7__.CommitStyle(options);
11612
+ ;(0,_helpers_utils_assert_js__WEBPACK_IMPORTED_MODULE_6__.assert)((0,_helpers_index_js__WEBPACK_IMPORTED_MODULE_3__.size)(options) > 0, 'Need to pass at least one option');
11613
+ const styleElm = new _style_commit_style_js__WEBPACK_IMPORTED_MODULE_8__.CommitStyle(options);
11544
11614
  styleElm.apply(this.j);
11545
11615
  }
11546
11616
  /**
@@ -11590,7 +11660,7 @@ class Selection {
11590
11660
  }
11591
11661
  const fragment = leftRange.extractContents();
11592
11662
  const clearEmpties = (node)=>_dom_dom_js__WEBPACK_IMPORTED_MODULE_2__.Dom.each(node, (node)=>_dom_dom_js__WEBPACK_IMPORTED_MODULE_2__.Dom.isEmptyTextNode(node) && _dom_dom_js__WEBPACK_IMPORTED_MODULE_2__.Dom.safeRemove(node));
11593
- (0,_helpers_utils_assert_js__WEBPACK_IMPORTED_MODULE_5__.assert)(currentBox.parentNode, 'Splitting fails');
11663
+ (0,_helpers_utils_assert_js__WEBPACK_IMPORTED_MODULE_6__.assert)(currentBox.parentNode, 'Splitting fails');
11594
11664
  try {
11595
11665
  clearEmpties(fragment);
11596
11666
  clearEmpties(currentBox);
@@ -11643,7 +11713,7 @@ class Selection {
11643
11713
  const r = range.cloneRange();
11644
11714
  r.collapse(start);
11645
11715
  _dom_dom_js__WEBPACK_IMPORTED_MODULE_2__.Dom.safeInsertNode(r, fake);
11646
- (0,_helpers_move_the_node_along_the_edge_outward_js__WEBPACK_IMPORTED_MODULE_6__.moveTheNodeAlongTheEdgeOutward)(fake, start, this.j.editor);
11716
+ (0,_helpers_move_the_node_along_the_edge_outward_js__WEBPACK_IMPORTED_MODULE_7__.moveTheNodeAlongTheEdgeOutward)(fake, start, this.j.editor);
11647
11717
  return fake;
11648
11718
  };
11649
11719
  const leftFake = moveMaxEdgeFake(true);
@@ -13941,6 +14011,7 @@ let UIButton = class UIButton extends _element_js__WEBPACK_IMPORTED_MODULE_9__.U
13941
14011
  this.name = this.state.name;
13942
14012
  (0,_helpers_utils_attr_js__WEBPACK_IMPORTED_MODULE_8__.attr)(this.container, 'data-ref', this.state.name);
13943
14013
  (0,_helpers_utils_attr_js__WEBPACK_IMPORTED_MODULE_8__.attr)(this.container, 'ref', this.state.name);
14014
+ this.updateAriaLabel();
13944
14015
  }
13945
14016
  onChangeTooltip() {
13946
14017
  const i8nTooltip = this.state.tooltip ? this.jodit.i18n(this.state.tooltip) : null;
@@ -13952,9 +14023,12 @@ let UIButton = class UIButton extends _element_js__WEBPACK_IMPORTED_MODULE_9__.U
13952
14023
  }
13953
14024
  updateAriaLabel() {
13954
14025
  const hasText = this.state.text.trim().length > 0;
13955
- const i8nTooltip = this.state.tooltip ? this.jodit.i18n(this.state.tooltip) : null;
13956
- (0,_helpers_utils_attr_js__WEBPACK_IMPORTED_MODULE_8__.attr)(this.container, 'aria-label', i8nTooltip);
13957
- (0,_helpers_utils_attr_js__WEBPACK_IMPORTED_MODULE_8__.attr)(this.button, 'aria-label', !hasText ? i8nTooltip : null);
14026
+ // An icon-only button without a tooltip would have no accessible
14027
+ // name at all — fall back to its raw name (not translated: control
14028
+ // names are identifiers, not i18n keys).
14029
+ const label = this.state.tooltip ? this.jodit.i18n(this.state.tooltip) : !hasText && this.state.name ? this.state.name : null;
14030
+ (0,_helpers_utils_attr_js__WEBPACK_IMPORTED_MODULE_8__.attr)(this.container, 'aria-label', label);
14031
+ (0,_helpers_utils_attr_js__WEBPACK_IMPORTED_MODULE_8__.attr)(this.button, 'aria-label', !hasText ? label : null);
13958
14032
  }
13959
14033
  onChangeTabIndex() {
13960
14034
  ;(0,_helpers_utils_attr_js__WEBPACK_IMPORTED_MODULE_8__.attr)(this.container, 'tabindex', this.state.tabIndex);
@@ -14982,6 +15056,7 @@ let UIFileInput = class UIFileInput extends _input_input_js__WEBPACK_IMPORTED_MO
14982
15056
  return this.j.create.fromHTML(`<input
14983
15057
  type="file"
14984
15058
  accept="${options.onlyImages ? 'image/*' : '*'}"
15059
+ aria-label="${this.j.i18n(options.tooltip || 'Upload')}"
14985
15060
  tabindex="-1"
14986
15061
  dir="auto"
14987
15062
  multiple=""
@@ -15482,9 +15557,12 @@ let UIGroup = UIGroup_1 = class UIGroup extends _element_js__WEBPACK_IMPORTED_MO
15482
15557
  className() {
15483
15558
  return 'UIGroup';
15484
15559
  }
15485
- getRole() {
15560
+ /**
15561
+ * A generic container: `group` allows any children. Toolbar button groups
15562
+ * are lists of `listitem`s and get `role="list"` explicitly from `UIList`.
15563
+ */ getRole() {
15486
15564
  var _a;
15487
- return ((_a = this.options) === null || _a === void 0 ? void 0 : _a.role) || 'list';
15565
+ return ((_a = this.options) === null || _a === void 0 ? void 0 : _a.role) || 'group';
15488
15566
  }
15489
15567
  /**
15490
15568
  * All group children
@@ -15690,10 +15768,10 @@ let UIList = class UIList extends _group_js__WEBPACK_IMPORTED_MODULE_6__.UIGroup
15690
15768
  }
15691
15769
  /**
15692
15770
  * Make new group and append it in list of elements
15693
- */ makeGroup(role) {
15694
- return new _group_js__WEBPACK_IMPORTED_MODULE_6__.UIGroup(this.jodit, [], role ? {
15771
+ */ makeGroup(role = 'list') {
15772
+ return new _group_js__WEBPACK_IMPORTED_MODULE_6__.UIGroup(this.jodit, [], {
15695
15773
  role
15696
- } : undefined);
15774
+ });
15697
15775
  }
15698
15776
  /**
15699
15777
  * All buttons from list
@@ -24792,12 +24870,13 @@ ContextMenu = __decorate([
24792
24870
  /* harmony import */ var _core_global_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(580);
24793
24871
  /* harmony import */ var _core_helpers_array_index_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(76855);
24794
24872
  /* harmony import */ var _core_helpers_checker_index_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(27613);
24795
- /* harmony import */ var _core_helpers_utils_index_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(43555);
24796
- /* harmony import */ var _core_helpers_utils_assert_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(38837);
24797
- /* harmony import */ var _core_ui_index_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(67510);
24798
- /* harmony import */ var _core_view_view_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(35608);
24799
- /* harmony import */ var _core_view_view_with_toolbar_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(84075);
24800
- /* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(6441);
24873
+ /* harmony import */ var _core_helpers_html_strip_tags_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(91003);
24874
+ /* harmony import */ var _core_helpers_utils_index_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(43555);
24875
+ /* harmony import */ var _core_helpers_utils_assert_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(38837);
24876
+ /* harmony import */ var _core_ui_index_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(67510);
24877
+ /* harmony import */ var _core_view_view_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(35608);
24878
+ /* harmony import */ var _core_view_view_with_toolbar_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(84075);
24879
+ /* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(6441);
24801
24880
  /*!
24802
24881
  * Jodit Editor (https://xdsoft.net/jodit/)
24803
24882
  * Released under MIT see LICENSE.txt in the project root for license information.
@@ -24822,7 +24901,8 @@ var Dialog_1;
24822
24901
 
24823
24902
 
24824
24903
 
24825
- _config_js__WEBPACK_IMPORTED_MODULE_12__.Config.prototype.dialog = {
24904
+
24905
+ _config_js__WEBPACK_IMPORTED_MODULE_13__.Config.prototype.dialog = {
24826
24906
  namespace: '',
24827
24907
  extraButtons: [],
24828
24908
  /**
@@ -24838,7 +24918,7 @@ _config_js__WEBPACK_IMPORTED_MODULE_12__.Config.prototype.dialog = {
24838
24918
  toolbarButtonSize: 'middle',
24839
24919
  zIndex: 'inherit'
24840
24920
  };
24841
- _config_js__WEBPACK_IMPORTED_MODULE_12__.Config.prototype.controls.dialog = {
24921
+ _config_js__WEBPACK_IMPORTED_MODULE_13__.Config.prototype.controls.dialog = {
24842
24922
  close: {
24843
24923
  icon: 'cancel',
24844
24924
  exec: (dialog)=>{
@@ -24848,7 +24928,7 @@ _config_js__WEBPACK_IMPORTED_MODULE_12__.Config.prototype.controls.dialog = {
24848
24928
  };
24849
24929
  /**
24850
24930
  * Module to generate dialog windows
24851
- */ let Dialog = Dialog_1 = class Dialog extends _core_view_view_with_toolbar_js__WEBPACK_IMPORTED_MODULE_11__.ViewWithToolbar {
24931
+ */ let Dialog = Dialog_1 = class Dialog extends _core_view_view_with_toolbar_js__WEBPACK_IMPORTED_MODULE_12__.ViewWithToolbar {
24852
24932
  /** @override */ className() {
24853
24933
  return 'Dialog';
24854
24934
  }
@@ -24912,8 +24992,8 @@ _config_js__WEBPACK_IMPORTED_MODULE_12__.Config.prototype.controls.dialog = {
24912
24992
  this.draggable = true;
24913
24993
  this.startX = e.clientX;
24914
24994
  this.startY = e.clientY;
24915
- this.startPoint.x = (0,_core_helpers_utils_index_js__WEBPACK_IMPORTED_MODULE_7__.css)(this.dialog, 'left');
24916
- this.startPoint.y = (0,_core_helpers_utils_index_js__WEBPACK_IMPORTED_MODULE_7__.css)(this.dialog, 'top');
24995
+ this.startPoint.x = (0,_core_helpers_utils_index_js__WEBPACK_IMPORTED_MODULE_8__.css)(this.dialog, 'left');
24996
+ this.startPoint.y = (0,_core_helpers_utils_index_js__WEBPACK_IMPORTED_MODULE_8__.css)(this.dialog, 'top');
24917
24997
  this.setMaxZIndex();
24918
24998
  if (e.cancelable) {
24919
24999
  e.preventDefault();
@@ -25003,7 +25083,7 @@ _config_js__WEBPACK_IMPORTED_MODULE_12__.Config.prototype.controls.dialog = {
25003
25083
  if (h == null) {
25004
25084
  h = this.dialog.offsetHeight;
25005
25085
  }
25006
- ;(0,_core_helpers_utils_index_js__WEBPACK_IMPORTED_MODULE_7__.css)(this.dialog, {
25086
+ ;(0,_core_helpers_utils_index_js__WEBPACK_IMPORTED_MODULE_8__.css)(this.dialog, {
25007
25087
  width: w,
25008
25088
  height: h
25009
25089
  });
@@ -25037,7 +25117,7 @@ _config_js__WEBPACK_IMPORTED_MODULE_12__.Config.prototype.controls.dialog = {
25037
25117
  this.moved = Math.abs(x - left) > 100 || Math.abs(y - top) > 100;
25038
25118
  }
25039
25119
  // strings on purpose: `css()` would truncate fractional pixels
25040
- ;(0,_core_helpers_utils_index_js__WEBPACK_IMPORTED_MODULE_7__.css)(this.dialog, {
25120
+ ;(0,_core_helpers_utils_index_js__WEBPACK_IMPORTED_MODULE_8__.css)(this.dialog, {
25041
25121
  left: (x || left) + 'px',
25042
25122
  top: (y || top) + 'px'
25043
25123
  });
@@ -25057,6 +25137,12 @@ _config_js__WEBPACK_IMPORTED_MODULE_12__.Config.prototype.controls.dialog = {
25057
25137
  * ```
25058
25138
  */ setHeader(content) {
25059
25139
  this.setElements(this.dialogbox_header, content);
25140
+ // `role="dialog"` needs an accessible name; a text title is the
25141
+ // natural one (element titles are left to the caller).
25142
+ if ((0,_core_helpers_checker_index_js__WEBPACK_IMPORTED_MODULE_6__.isString)(content)) {
25143
+ const name = (0,_core_helpers_html_strip_tags_js__WEBPACK_IMPORTED_MODULE_7__.stripTags)(content, this.od).trim();
25144
+ (0,_core_helpers_utils_index_js__WEBPACK_IMPORTED_MODULE_8__.attr)(this.container, 'aria-label', name || null);
25145
+ }
25060
25146
  return this;
25061
25147
  }
25062
25148
  /**
@@ -25110,7 +25196,7 @@ _config_js__WEBPACK_IMPORTED_MODULE_12__.Config.prototype.controls.dialog = {
25110
25196
  /**
25111
25197
  * Get zIndex from dialog
25112
25198
  */ getZIndex() {
25113
- return parseInt((0,_core_helpers_utils_index_js__WEBPACK_IMPORTED_MODULE_7__.css)(this.container, 'zIndex'), 10) || 0;
25199
+ return parseInt((0,_core_helpers_utils_index_js__WEBPACK_IMPORTED_MODULE_8__.css)(this.container, 'zIndex'), 10) || 0;
25114
25200
  }
25115
25201
  /**
25116
25202
  * Get dialog instance with maximum z-index displaying it on top of all the dialog boxes
@@ -25133,7 +25219,7 @@ _config_js__WEBPACK_IMPORTED_MODULE_12__.Config.prototype.controls.dialog = {
25133
25219
  this.__openedSiblings().forEach((dialog)=>{
25134
25220
  maxZIndex = Math.max(dialog.getZIndex(), maxZIndex);
25135
25221
  });
25136
- (0,_core_helpers_utils_index_js__WEBPACK_IMPORTED_MODULE_7__.css)(this.container, 'zIndex', (maxZIndex + 1).toString());
25222
+ (0,_core_helpers_utils_index_js__WEBPACK_IMPORTED_MODULE_8__.css)(this.container, 'zIndex', (maxZIndex + 1).toString());
25137
25223
  }
25138
25224
  /**
25139
25225
  * Expands the dialog on full browser window
@@ -25183,7 +25269,7 @@ _config_js__WEBPACK_IMPORTED_MODULE_12__.Config.prototype.controls.dialog = {
25183
25269
  this.setPosition(this.offsetX, this.offsetY);
25184
25270
  this.setMaxZIndex();
25185
25271
  } else {
25186
- (0,_core_helpers_utils_index_js__WEBPACK_IMPORTED_MODULE_7__.css)(this.container, 'zIndex', null);
25272
+ (0,_core_helpers_utils_index_js__WEBPACK_IMPORTED_MODULE_8__.css)(this.container, 'zIndex', null);
25187
25273
  }
25188
25274
  if (this.o.fullsize) {
25189
25275
  this.toggleFullSize(true);
@@ -25310,7 +25396,7 @@ _config_js__WEBPACK_IMPORTED_MODULE_12__.Config.prototype.controls.dialog = {
25310
25396
  * True, if dialog was opened
25311
25397
  */ this.isOpened = false;
25312
25398
  const self1 = this;
25313
- self1.options = (0,_core_helpers_utils_index_js__WEBPACK_IMPORTED_MODULE_7__.ConfigProto)(options, (0,_core_helpers_utils_index_js__WEBPACK_IMPORTED_MODULE_7__.ConfigProto)(_config_js__WEBPACK_IMPORTED_MODULE_12__.Config.prototype.dialog, Dialog_1.defaultOptions));
25399
+ self1.options = (0,_core_helpers_utils_index_js__WEBPACK_IMPORTED_MODULE_8__.ConfigProto)(options, (0,_core_helpers_utils_index_js__WEBPACK_IMPORTED_MODULE_8__.ConfigProto)(_config_js__WEBPACK_IMPORTED_MODULE_13__.Config.prototype.dialog, Dialog_1.defaultOptions));
25314
25400
  // Attach event handlers passed via `options.events` to the dialog's own
25315
25401
  // emitter (as FileBrowser already does), so a consumer — e.g. a plugin
25316
25402
  // forwarding the editor's `events` config — can observe `afterOpen` /
@@ -25328,40 +25414,40 @@ _config_js__WEBPACK_IMPORTED_MODULE_12__.Config.prototype.controls.dialog = {
25328
25414
  </div>
25329
25415
  <div class="${n('content')}"></div>
25330
25416
  <div class="${n('footer')}"></div>
25331
- <div class="${n('resizer')}">${_core_ui_index_js__WEBPACK_IMPORTED_MODULE_9__.Icon.get('resize_handler')}</div>
25417
+ <div class="${n('resizer')}">${_core_ui_index_js__WEBPACK_IMPORTED_MODULE_10__.Icon.get('resize_handler')}</div>
25332
25418
  </div>
25333
25419
  </div>`);
25334
25420
  if (self1.options.direction === 'rtl') {
25335
- (0,_core_helpers_utils_index_js__WEBPACK_IMPORTED_MODULE_7__.css)(self1.container, 'direction', 'rtl');
25336
- (0,_core_helpers_utils_index_js__WEBPACK_IMPORTED_MODULE_7__.attr)(self1.container, 'dir', 'rtl');
25421
+ (0,_core_helpers_utils_index_js__WEBPACK_IMPORTED_MODULE_8__.css)(self1.container, 'direction', 'rtl');
25422
+ (0,_core_helpers_utils_index_js__WEBPACK_IMPORTED_MODULE_8__.attr)(self1.container, 'dir', 'rtl');
25337
25423
  }
25338
25424
  if (this.o.zIndex) {
25339
- (0,_core_helpers_utils_index_js__WEBPACK_IMPORTED_MODULE_7__.css)(this.container, 'zIndex', this.o.zIndex.toString());
25425
+ (0,_core_helpers_utils_index_js__WEBPACK_IMPORTED_MODULE_8__.css)(this.container, 'zIndex', this.o.zIndex.toString());
25340
25426
  }
25341
- ;(0,_core_helpers_utils_index_js__WEBPACK_IMPORTED_MODULE_7__.attr)(self1.container, 'role', 'dialog');
25427
+ ;(0,_core_helpers_utils_index_js__WEBPACK_IMPORTED_MODULE_8__.attr)(self1.container, 'role', 'dialog');
25342
25428
  Object.defineProperty(self1.container, 'component', {
25343
25429
  value: this
25344
25430
  });
25345
25431
  self1.setMod('theme', self1.o.theme || 'default').setMod('resizable', Boolean(self1.o.resizable));
25346
25432
  const dialog = self1.getElm('panel');
25347
- (0,_core_helpers_utils_assert_js__WEBPACK_IMPORTED_MODULE_8__.assert)(dialog != null, 'Panel element does not exist');
25433
+ (0,_core_helpers_utils_assert_js__WEBPACK_IMPORTED_MODULE_9__.assert)(dialog != null, 'Panel element does not exist');
25348
25434
  const resizer = self1.getElm('resizer');
25349
- (0,_core_helpers_utils_assert_js__WEBPACK_IMPORTED_MODULE_8__.assert)(resizer != null, 'Resizer element does not exist');
25435
+ (0,_core_helpers_utils_assert_js__WEBPACK_IMPORTED_MODULE_9__.assert)(resizer != null, 'Resizer element does not exist');
25350
25436
  const dialogbox_header = self1.getElm('header-title');
25351
- (0,_core_helpers_utils_assert_js__WEBPACK_IMPORTED_MODULE_8__.assert)(dialogbox_header != null, 'header-title element does not exist');
25437
+ (0,_core_helpers_utils_assert_js__WEBPACK_IMPORTED_MODULE_9__.assert)(dialogbox_header != null, 'header-title element does not exist');
25352
25438
  const dialogbox_content = self1.getElm('content');
25353
- (0,_core_helpers_utils_assert_js__WEBPACK_IMPORTED_MODULE_8__.assert)(dialogbox_content != null, 'Content element does not exist');
25439
+ (0,_core_helpers_utils_assert_js__WEBPACK_IMPORTED_MODULE_9__.assert)(dialogbox_content != null, 'Content element does not exist');
25354
25440
  const dialogbox_footer = self1.getElm('footer');
25355
- (0,_core_helpers_utils_assert_js__WEBPACK_IMPORTED_MODULE_8__.assert)(dialogbox_footer != null, 'Footer element does not exist');
25441
+ (0,_core_helpers_utils_assert_js__WEBPACK_IMPORTED_MODULE_9__.assert)(dialogbox_footer != null, 'Footer element does not exist');
25356
25442
  const dialogbox_toolbar = self1.getElm('header-toolbar');
25357
- (0,_core_helpers_utils_assert_js__WEBPACK_IMPORTED_MODULE_8__.assert)(dialogbox_toolbar != null, 'header-toolbar element does not exist');
25443
+ (0,_core_helpers_utils_assert_js__WEBPACK_IMPORTED_MODULE_9__.assert)(dialogbox_toolbar != null, 'header-toolbar element does not exist');
25358
25444
  this.dialog = dialog;
25359
25445
  this.resizer = resizer;
25360
25446
  this.dialogbox_header = dialogbox_header;
25361
25447
  this.dialogbox_content = dialogbox_content;
25362
25448
  this.dialogbox_footer = dialogbox_footer;
25363
25449
  this.dialogbox_toolbar = dialogbox_toolbar;
25364
- (0,_core_helpers_utils_index_js__WEBPACK_IMPORTED_MODULE_7__.css)(self1.dialog, {
25450
+ (0,_core_helpers_utils_index_js__WEBPACK_IMPORTED_MODULE_8__.css)(self1.dialog, {
25365
25451
  maxWidth: self1.options.maxWidth,
25366
25452
  minHeight: self1.options.minHeight,
25367
25453
  minWidth: self1.options.minWidth
@@ -25374,7 +25460,7 @@ _config_js__WEBPACK_IMPORTED_MODULE_12__.Config.prototype.controls.dialog = {
25374
25460
  this.e.on(self1.container, 'close_dialog', self1.close).on(this.ow, 'keydown', this.__onEsc).on(this.ow, 'resize', this.__onResize);
25375
25461
  if (this.o.closeOnClickOverlay) {
25376
25462
  const overlay = self1.getElm('overlay');
25377
- (0,_core_helpers_utils_assert_js__WEBPACK_IMPORTED_MODULE_8__.assert)(overlay != null, 'Overlay element does not exist');
25463
+ (0,_core_helpers_utils_assert_js__WEBPACK_IMPORTED_MODULE_9__.assert)(overlay != null, 'Overlay element does not exist');
25378
25464
  this.e.on(overlay, 'click', self1.close);
25379
25465
  }
25380
25466
  }
@@ -25384,7 +25470,7 @@ _config_js__WEBPACK_IMPORTED_MODULE_12__.Config.prototype.controls.dialog = {
25384
25470
  * whole `destination` (usually `document.body`) for every z-index update.
25385
25471
  */ Dialog.__opened = new Set();
25386
25472
  Dialog.defaultOptions = {
25387
- ..._core_view_view_js__WEBPACK_IMPORTED_MODULE_10__.View.defaultOptions,
25473
+ ..._core_view_view_js__WEBPACK_IMPORTED_MODULE_11__.View.defaultOptions,
25388
25474
  closeOnClickOverlay: false,
25389
25475
  closeOnEsc: true
25390
25476
  };
@@ -30499,6 +30585,13 @@ let ToolbarContent = class ToolbarContent extends _core_ui_button_index_js__WEBP
30499
30585
  /** @override */ className() {
30500
30586
  return 'ToolbarContent';
30501
30587
  }
30588
+ /** A toolbar item like `ToolbarButton`: the parent group is a `list`. */ getRole() {
30589
+ return 'listitem';
30590
+ }
30591
+ /**
30592
+ * Arbitrary content is not a toggle button — `aria-pressed` is not
30593
+ * allowed on a `listitem`.
30594
+ */ onChangeActivated() {}
30502
30595
  /** @override */ update() {
30503
30596
  var _a, _b, _c;
30504
30597
  const { control } = this;
@@ -30541,7 +30634,6 @@ let ToolbarContent = class ToolbarContent extends _core_ui_button_index_js__WEBP
30541
30634
  this.control = control;
30542
30635
  this.target = target;
30543
30636
  this.container.classList.add(`${this.componentName}_${this.clearName(control.name)}`);
30544
- (0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_2__.attr)(this.container, 'role', 'content');
30545
30637
  }
30546
30638
  };
30547
30639
  ToolbarContent = __decorate([
@@ -37785,14 +37877,28 @@ _core_global_js__WEBPACK_IMPORTED_MODULE_1__.pluginSystem.add('file', file);
37785
37877
  */ _config_js__WEBPACK_IMPORTED_MODULE_2__.Config.prototype.saveSelectionOnBlur = true;
37786
37878
  function focus(editor) {
37787
37879
  if (editor.o.saveSelectionOnBlur) {
37880
+ // A click that brings focus back places the caret itself, and Chrome
37881
+ // has already placed it when focus fires, so restoring would move it
37882
+ // back to the old selection. The saved markers are dropped instead.
37883
+ let focusByPointer = false;
37788
37884
  editor.e.on('blur', ()=>{
37885
+ // A press that never brought the focus back must not decide
37886
+ // what the next focus does
37887
+ focusByPointer = false;
37789
37888
  if (editor.isEditorMode()) {
37790
37889
  editor.s.save(true);
37791
37890
  }
37891
+ }).on('mousedown touchstart', ()=>{
37892
+ focusByPointer = !editor.editorIsActive;
37792
37893
  }).on('focus', ()=>{
37793
37894
  if (editor.isEditorMode()) {
37794
- editor.s.restore();
37895
+ if (focusByPointer) {
37896
+ editor.s.removeMarkers();
37897
+ } else {
37898
+ editor.s.restore();
37899
+ }
37795
37900
  }
37901
+ focusByPointer = false;
37796
37902
  });
37797
37903
  }
37798
37904
  const focus = ()=>{
@@ -38819,11 +38925,12 @@ _config_js__WEBPACK_IMPORTED_MODULE_0__.Config.prototype.imageProcessor = {
38819
38925
  /* unused harmony export imageProcessor */
38820
38926
  /* harmony import */ var _core_constants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(82758);
38821
38927
  /* harmony import */ var _core_decorators_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(65478);
38822
- /* harmony import */ var _core_global_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(580);
38823
- /* harmony import */ var _core_helpers_index_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(21537);
38824
- /* harmony import */ var _core_plugin_index_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(50911);
38825
- /* harmony import */ var _modules_uploader_helpers_data_uri_to_blob_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(74569);
38826
- /* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(85745);
38928
+ /* harmony import */ var _core_dom_dom_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(2748);
38929
+ /* harmony import */ var _core_global_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(580);
38930
+ /* harmony import */ var _core_helpers_index_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(21537);
38931
+ /* harmony import */ var _core_plugin_index_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(50911);
38932
+ /* harmony import */ var _modules_uploader_helpers_data_uri_to_blob_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(74569);
38933
+ /* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(85745);
38827
38934
  /*!
38828
38935
  * Jodit Editor (https://xdsoft.net/jodit/)
38829
38936
  * Released under MIT see LICENSE.txt in the project root for license information.
@@ -38841,11 +38948,12 @@ _config_js__WEBPACK_IMPORTED_MODULE_0__.Config.prototype.imageProcessor = {
38841
38948
 
38842
38949
 
38843
38950
 
38951
+
38844
38952
  const JODIT_IMAGE_PROCESSOR_BINDED = '__jodit_imageprocessor_binded';
38845
38953
  const JODIT_IMAGE_BLOB_ID = JODIT_IMAGE_PROCESSOR_BINDED + 'blob-id';
38846
38954
  /**
38847
38955
  * Change editor's size after load all images
38848
- */ class imageProcessor extends _core_plugin_index_js__WEBPACK_IMPORTED_MODULE_4__.Plugin {
38956
+ */ class imageProcessor extends _core_plugin_index_js__WEBPACK_IMPORTED_MODULE_5__.Plugin {
38849
38957
  afterInit(jodit) {}
38850
38958
  beforeDestruct(jodit) {
38851
38959
  const buffer = (0,_core_decorators_index_js__WEBPACK_IMPORTED_MODULE_1__.cached)(jodit, 'buffer');
@@ -38883,9 +38991,9 @@ const JODIT_IMAGE_BLOB_ID = JODIT_IMAGE_PROCESSOR_BINDED + 'blob-id';
38883
38991
  if (!editor.editor) {
38884
38992
  return;
38885
38993
  }
38886
- ;(0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_3__.$$)('img', editor.editor).forEach((elm)=>{
38887
- if (!(0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_3__.dataBind)(elm, JODIT_IMAGE_PROCESSOR_BINDED)) {
38888
- (0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_3__.dataBind)(elm, JODIT_IMAGE_PROCESSOR_BINDED, true);
38994
+ ;(0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_4__.$$)('img', editor.editor).forEach((elm)=>{
38995
+ if (!(0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_4__.dataBind)(elm, JODIT_IMAGE_PROCESSOR_BINDED)) {
38996
+ (0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_4__.dataBind)(elm, JODIT_IMAGE_PROCESSOR_BINDED, true);
38889
38997
  if (!elm.complete) {
38890
38998
  editor.e.on(elm, 'load', function ElementOnLoad() {
38891
38999
  var _a;
@@ -38897,6 +39005,7 @@ const JODIT_IMAGE_BLOB_ID = JODIT_IMAGE_PROCESSOR_BINDED + 'blob-id';
38897
39005
  replaceDataURIToBlobUUID(editor, elm);
38898
39006
  }
38899
39007
  editor.e.on(elm, 'mousedown touchstart', ()=>{
39008
+ removeCaretText(elm);
38900
39009
  editor.s.select(elm);
38901
39010
  });
38902
39011
  }
@@ -38917,6 +39026,24 @@ __decorate([
38917
39026
  ]),
38918
39027
  (0,_core_decorators_index_js__WEBPACK_IMPORTED_MODULE_1__.debounce)()
38919
39028
  ], imageProcessor.prototype, "afterChange", null);
39029
+ /**
39030
+ * Remove the invisible-space text beside an image, which only held a caret.
39031
+ * Selecting the image replaces the caret, and with the text still after a
39032
+ * block image, Safari highlights the rest of the image's line. See #1512
39033
+ */ function removeCaretText(elm) {
39034
+ var _a;
39035
+ for (const side of [
39036
+ 'previousSibling',
39037
+ 'nextSibling'
39038
+ ]){
39039
+ let node = elm[side];
39040
+ while(_core_dom_dom_js__WEBPACK_IMPORTED_MODULE_2__.Dom.isText(node) && !((_a = node.nodeValue) === null || _a === void 0 ? void 0 : _a.replace((0,_core_constants_js__WEBPACK_IMPORTED_MODULE_0__.INVISIBLE_SPACE_REG_EXP)(), ''))){
39041
+ const next = node[side];
39042
+ _core_dom_dom_js__WEBPACK_IMPORTED_MODULE_2__.Dom.safeRemove(node);
39043
+ node = next;
39044
+ }
39045
+ }
39046
+ }
38920
39047
  function replaceDataURIToBlobUUID(editor, elm) {
38921
39048
  if (!editor.o.imageProcessor.replaceDataURIToBlobIdInView) {
38922
39049
  return;
@@ -38927,7 +39054,7 @@ function replaceDataURIToBlobUUID(editor, elm) {
38927
39054
  const dataUri = elm.src;
38928
39055
  let blob;
38929
39056
  try {
38930
- blob = (0,_modules_uploader_helpers_data_uri_to_blob_js__WEBPACK_IMPORTED_MODULE_5__.dataURItoBlob)(dataUri);
39057
+ blob = (0,_modules_uploader_helpers_data_uri_to_blob_js__WEBPACK_IMPORTED_MODULE_6__.dataURItoBlob)(dataUri);
38931
39058
  } catch (_a) {
38932
39059
  // A data URI the browser accepts but we cannot decode is not worth
38933
39060
  // breaking the editor over — keep the image as it is
@@ -38940,7 +39067,7 @@ function replaceDataURIToBlobUUID(editor, elm) {
38940
39067
  list[elm.src] = dataUri;
38941
39068
  editor.buffer.set(JODIT_IMAGE_BLOB_ID, list);
38942
39069
  }
38943
- _core_global_js__WEBPACK_IMPORTED_MODULE_2__.pluginSystem.add('imageProcessor', imageProcessor);
39070
+ _core_global_js__WEBPACK_IMPORTED_MODULE_3__.pluginSystem.add('imageProcessor', imageProcessor);
38944
39071
 
38945
39072
 
38946
39073
  /***/ }),
@@ -39239,7 +39366,7 @@ _core_global_js__WEBPACK_IMPORTED_MODULE_2__.pluginSystem.add('imageProperties',
39239
39366
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
39240
39367
  /* harmony export */ readAlign: function() { return /* binding */ readAlign; }
39241
39368
  /* harmony export */ });
39242
- /* harmony import */ var _core_helpers_utils_css_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(41180);
39369
+ /* harmony import */ var _core_helpers_utils_align_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25726);
39243
39370
  /*!
39244
39371
  * Jodit Editor (https://xdsoft.net/jodit/)
39245
39372
  * Released under MIT see LICENSE.txt in the project root for license information.
@@ -39247,20 +39374,9 @@ _core_global_js__WEBPACK_IMPORTED_MODULE_2__.pluginSystem.add('imageProperties',
39247
39374
  */
39248
39375
  /**
39249
39376
  * @private
39250
- */ function readAlign(image, values) {
39251
- // Align
39252
- if ((0,_core_helpers_utils_css_js__WEBPACK_IMPORTED_MODULE_0__.cssInline)(image, 'float') && [
39253
- 'left',
39254
- 'right'
39255
- ].indexOf((0,_core_helpers_utils_css_js__WEBPACK_IMPORTED_MODULE_0__.cssInline)(image, 'float').toLowerCase()) !== -1) {
39256
- values.align = (0,_core_helpers_utils_css_js__WEBPACK_IMPORTED_MODULE_0__.css)(image, 'float');
39257
- } else {
39258
- if ((0,_core_helpers_utils_css_js__WEBPACK_IMPORTED_MODULE_0__.css)(image, 'display') === 'block' && (0,_core_helpers_utils_css_js__WEBPACK_IMPORTED_MODULE_0__.cssInline)(image, 'margin-left') === 'auto' && (0,_core_helpers_utils_css_js__WEBPACK_IMPORTED_MODULE_0__.cssInline)(image, 'margin-right') === 'auto') {
39259
- values.align = 'center';
39260
- } else {
39261
- values.align = '';
39262
- }
39263
- }
39377
+ */ function readAlign(image, values, classes) {
39378
+ const align = (0,_core_helpers_utils_align_js__WEBPACK_IMPORTED_MODULE_0__.getHAlign)(image, classes);
39379
+ values.align = align === 'normal' ? '' : align;
39264
39380
  }
39265
39381
 
39266
39382
 
@@ -39293,7 +39409,7 @@ _core_global_js__WEBPACK_IMPORTED_MODULE_2__.pluginSystem.add('imageProperties',
39293
39409
  * @private
39294
39410
  */ async function readValuesFromImage(j, state) {
39295
39411
  const { sourceImage: image, values } = state;
39296
- (0,_align_js__WEBPACK_IMPORTED_MODULE_2__.readAlign)(image, values);
39412
+ (0,_align_js__WEBPACK_IMPORTED_MODULE_2__.readAlign)(image, values, j.o.imageAlignClasses);
39297
39413
  // Border radius
39298
39414
  values.borderRadius = parseInt((0,_core_helpers_utils_css_js__WEBPACK_IMPORTED_MODULE_1__.cssInline)(image, 'border-radius') || '0', 10) || 0;
39299
39415
  // Id
@@ -40326,7 +40442,7 @@ UIImagePositionTab = __decorate([
40326
40442
  (0,_core_helpers_utils_index_js__WEBPACK_IMPORTED_MODULE_1__.attr)(image, 'id', id || null);
40327
40443
  }
40328
40444
  if (opt.image.editAlign) {
40329
- (0,_core_helpers_utils_index_js__WEBPACK_IMPORTED_MODULE_1__.hAlignElement)(image, align);
40445
+ (0,_core_helpers_utils_index_js__WEBPACK_IMPORTED_MODULE_1__.hAlignElement)(image, align, j.o.imageAlignClasses);
40330
40446
  }
40331
40447
  }
40332
40448
 
@@ -40391,10 +40507,12 @@ UIImagePositionTab = __decorate([
40391
40507
  marginBottom,
40392
40508
  marginLeft
40393
40509
  ];
40510
+ // Compared with the inline value, which is what `readMargins` showed, so a
40511
+ // margin from a stylesheet is not overwritten when the field is unchanged
40394
40512
  const applyMargin = (key, value)=>{
40395
- const oldValue = (0,_core_helpers_utils_css_js__WEBPACK_IMPORTED_MODULE_0__.css)(image, key);
40513
+ const oldValue = (0,_utils_utils_js__WEBPACK_IMPORTED_MODULE_1__.normalSizeToString)((0,_core_helpers_utils_css_js__WEBPACK_IMPORTED_MODULE_0__.cssInline)(image, key) || 0);
40396
40514
  const v = (0,_utils_utils_js__WEBPACK_IMPORTED_MODULE_1__.normalSizeToString)(value);
40397
- if (oldValue.toString() !== v.toString()) {
40515
+ if (oldValue !== v) {
40398
40516
  (0,_core_helpers_utils_css_js__WEBPACK_IMPORTED_MODULE_0__.css)(image, key, v);
40399
40517
  }
40400
40518
  };
@@ -41062,6 +41180,10 @@ const cmd = (control)=>control.args && (0,_core_helpers_checker_index_js__WEBPAC
41062
41180
 
41063
41181
 
41064
41182
 
41183
+ // Images align with `imageAlignClasses`; the wrappers of iframes and media
41184
+ // keep inline styles
41185
+ const alignClasses = (editor, elm)=>_core_dom_index_js__WEBPACK_IMPORTED_MODULE_0__.Dom.isTag(elm, 'img') ? editor.o.imageAlignClasses : null;
41186
+ const currentAlign = (editor, elm)=>elm ? (0,_core_helpers_utils_align_js__WEBPACK_IMPORTED_MODULE_2__.getHAlign)(elm, alignClasses(editor, elm)) : 'normal';
41065
41187
  const align = {
41066
41188
  name: 'left',
41067
41189
  childTemplate: (_, __, value)=>value,
@@ -41071,6 +41193,16 @@ const align = {
41071
41193
  'Center',
41072
41194
  'Normal'
41073
41195
  ],
41196
+ update: (editor, button)=>{
41197
+ const current = currentAlign(editor, button.target);
41198
+ button.state.icon.name = current === 'normal' ? 'left' : current;
41199
+ },
41200
+ isActive: (editor, button)=>currentAlign(editor, button.target) !== 'normal',
41201
+ isChildActive: (editor, button)=>{
41202
+ var _a;
41203
+ const [value] = (_a = button.control.args) !== null && _a !== void 0 ? _a : [];
41204
+ return (0,_core_helpers_checker_is_string_js__WEBPACK_IMPORTED_MODULE_1__.isString)(value) && currentAlign(editor, button.target) === value.toLowerCase();
41205
+ },
41074
41206
  exec: (editor, elm, { control })=>{
41075
41207
  if (!_core_dom_index_js__WEBPACK_IMPORTED_MODULE_0__.Dom.isTag(elm, new Set([
41076
41208
  'img',
@@ -41083,7 +41215,7 @@ const align = {
41083
41215
  if (!command) {
41084
41216
  return false;
41085
41217
  }
41086
- ;(0,_core_helpers_utils_align_js__WEBPACK_IMPORTED_MODULE_2__.hAlignElement)(elm, command);
41218
+ ;(0,_core_helpers_utils_align_js__WEBPACK_IMPORTED_MODULE_2__.hAlignElement)(elm, command, alignClasses(editor, elm));
41087
41219
  if (_core_dom_index_js__WEBPACK_IMPORTED_MODULE_0__.Dom.isTag(elm, new Set([
41088
41220
  'jodit',
41089
41221
  'jodit-media'
@@ -41123,6 +41255,14 @@ const align = {
41123
41255
  'Normal'
41124
41256
  ],
41125
41257
  tooltip: 'Vertical align',
41258
+ // `vertical-align` only moves an image in the line, not a floated or block one
41259
+ isDisabled: (editor, button)=>{
41260
+ const image = button.target;
41261
+ return Boolean(image && ([
41262
+ 'left',
41263
+ 'right'
41264
+ ].includes((0,_core_helpers_utils_css_js__WEBPACK_IMPORTED_MODULE_3__.css)(image, 'float')) || (0,_core_helpers_utils_css_js__WEBPACK_IMPORTED_MODULE_3__.css)(image, 'display') === 'block'));
41265
+ },
41126
41266
  exec: (editor, image, { control })=>{
41127
41267
  if (!_core_dom_index_js__WEBPACK_IMPORTED_MODULE_0__.Dom.isTag(image, 'img')) {
41128
41268
  return;
@@ -47691,19 +47831,26 @@ class AceEditor extends _sourceEditor_js__WEBPACK_IMPORTED_MODULE_3__.SourceEdit
47691
47831
  onResize();
47692
47832
  this.onReady();
47693
47833
  };
47834
+ let loading = false;
47694
47835
  const initAceEditor = ()=>{
47695
47836
  if (editor.isInDestruct || editor.getRealMode() !== _core_constants_js__WEBPACK_IMPORTED_MODULE_0__.MODE_SOURCE && editor.getMode() !== _core_constants_js__WEBPACK_IMPORTED_MODULE_0__.MODE_SPLIT) {
47696
47837
  return;
47697
47838
  }
47839
+ // ACE (~400 KiB from the CDN) is only needed once the source view
47840
+ // is actually shown — a page that stays in WYSIWYG must not
47841
+ // download it.
47842
+ if (!this.aceExists()) {
47843
+ if (!loading) {
47844
+ loading = true;
47845
+ (0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_2__.loadNext)(editor, editor.o.sourceEditorCDNUrlsJS).then(initAceEditor).catch(()=>null);
47846
+ }
47847
+ return;
47848
+ }
47698
47849
  this.fromWYSIWYG();
47699
47850
  tryInitAceEditor();
47700
47851
  };
47701
47852
  editor.e.on('afterSetMode', initAceEditor);
47702
47853
  initAceEditor();
47703
- // global add ace editor in browser
47704
- if (!this.aceExists()) {
47705
- (0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_2__.loadNext)(editor, editor.o.sourceEditorCDNUrlsJS).then(initAceEditor).catch(()=>null);
47706
- }
47707
47854
  }
47708
47855
  destruct() {
47709
47856
  var _a, _b;
@@ -48233,7 +48380,24 @@ function createSourceEditor(type, editor, container, toWYSIWYG, fromWYSIWYG) {
48233
48380
  return false;
48234
48381
  };
48235
48382
  if (!addEventListener()) {
48236
- (0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_4__.loadNext)(editor, editor.o.beautifyHTMLCDNUrlsJS).then(addEventListener, ()=>null);
48383
+ // js-beautify is only needed once the source view is shown —
48384
+ // do not download it for a page that stays in WYSIWYG.
48385
+ let loading = false;
48386
+ const loadBeautify = ()=>{
48387
+ if (loading || editor.getMode() !== _core_constants_js__WEBPACK_IMPORTED_MODULE_0__.MODE_SOURCE && editor.getMode() !== _core_constants_js__WEBPACK_IMPORTED_MODULE_0__.MODE_SPLIT) {
48388
+ return;
48389
+ }
48390
+ loading = true;
48391
+ (0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_4__.loadNext)(editor, editor.o.beautifyHTMLCDNUrlsJS).then(()=>{
48392
+ // The source view was filled before the
48393
+ // beautifier arrived — format it now.
48394
+ if (addEventListener()) {
48395
+ this.syncValueFromWYSIWYG(true);
48396
+ }
48397
+ }, ()=>null);
48398
+ };
48399
+ editor.e.on('afterSetMode.source', loadBeautify);
48400
+ loadBeautify();
48237
48401
  }
48238
48402
  }
48239
48403
  this.syncValueFromWYSIWYG(true);