jodit-pro 4.12.39 → 4.13.1

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 (351) hide show
  1. package/config.js +1 -0
  2. package/es2015/jodit.css +1 -1
  3. package/es2015/jodit.fat.min.css +1 -1
  4. package/es2015/jodit.fat.min.js +30 -30
  5. package/es2015/jodit.js +25 -7
  6. package/es2015/jodit.min.js +5 -5
  7. package/es2015/plugins/ai-assistant-pro/ai-assistant-pro.css +1 -1
  8. package/es2015/plugins/ai-assistant-pro/ai-assistant-pro.js +1 -1
  9. package/es2015/plugins/ai-assistant-pro/ai-assistant-pro.min.js +1 -1
  10. package/es2015/plugins/autocomplete/autocomplete.css +1 -1
  11. package/es2015/plugins/autocomplete/autocomplete.js +1 -1
  12. package/es2015/plugins/autocomplete/autocomplete.min.js +1 -1
  13. package/es2015/plugins/backup/backup.css +1 -1
  14. package/es2015/plugins/backup/backup.js +1 -1
  15. package/es2015/plugins/backup/backup.min.js +1 -1
  16. package/es2015/plugins/button-generator/button-generator.css +1 -1
  17. package/es2015/plugins/button-generator/button-generator.js +1 -1
  18. package/es2015/plugins/button-generator/button-generator.min.js +1 -1
  19. package/es2015/plugins/change-case/change-case.js +1 -1
  20. package/es2015/plugins/change-case/change-case.min.js +1 -1
  21. package/es2015/plugins/color-picker/color-picker.css +1 -1
  22. package/es2015/plugins/color-picker/color-picker.js +1 -1
  23. package/es2015/plugins/color-picker/color-picker.min.js +1 -1
  24. package/es2015/plugins/emoji/emoji.css +1 -1
  25. package/es2015/plugins/emoji/emoji.js +1 -1
  26. package/es2015/plugins/emoji/emoji.min.js +1 -1
  27. package/es2015/plugins/export-docs/export-docs.js +1 -1
  28. package/es2015/plugins/export-docs/export-docs.min.js +1 -1
  29. package/es2015/plugins/finder/finder.css +47 -4
  30. package/es2015/plugins/finder/finder.js +66 -5
  31. package/es2015/plugins/finder/finder.min.css +1 -1
  32. package/es2015/plugins/finder/finder.min.js +4 -4
  33. package/es2015/plugins/google-maps/google-maps.css +1 -1
  34. package/es2015/plugins/google-maps/google-maps.js +1 -1
  35. package/es2015/plugins/google-maps/google-maps.min.js +1 -1
  36. package/es2015/plugins/google-search/google-search.js +1 -1
  37. package/es2015/plugins/google-search/google-search.min.js +1 -1
  38. package/es2015/plugins/highlight-signature/highlight-signature.js +1 -1
  39. package/es2015/plugins/highlight-signature/highlight-signature.min.js +1 -1
  40. package/es2015/plugins/iframe-editor/iframe-editor.css +1 -1
  41. package/es2015/plugins/iframe-editor/iframe-editor.js +1 -1
  42. package/es2015/plugins/iframe-editor/iframe-editor.min.js +1 -1
  43. package/es2015/plugins/image-editor-pro/image-editor-pro.css +52 -0
  44. package/es2015/plugins/image-editor-pro/image-editor-pro.js +3969 -0
  45. package/es2015/plugins/image-editor-pro/image-editor-pro.min.css +1 -0
  46. package/es2015/plugins/image-editor-pro/image-editor-pro.min.js +8 -0
  47. package/es2015/plugins/keyboard/keyboard.css +1 -1
  48. package/es2015/plugins/keyboard/keyboard.js +1 -1
  49. package/es2015/plugins/keyboard/keyboard.min.js +1 -1
  50. package/es2015/plugins/mobile-view/mobile-view.js +1 -1
  51. package/es2015/plugins/mobile-view/mobile-view.min.js +1 -1
  52. package/es2015/plugins/page-break/page-break.js +1 -1
  53. package/es2015/plugins/page-break/page-break.min.js +1 -1
  54. package/es2015/plugins/paste-code/paste-code.css +1 -1
  55. package/es2015/plugins/paste-code/paste-code.js +1 -1
  56. package/es2015/plugins/paste-code/paste-code.min.js +1 -1
  57. package/es2015/plugins/paste-from-word/paste-from-word.js +1 -1
  58. package/es2015/plugins/paste-from-word/paste-from-word.min.js +1 -1
  59. package/es2015/plugins/show-blocks/show-blocks.js +1 -1
  60. package/es2015/plugins/show-blocks/show-blocks.min.js +1 -1
  61. package/es2015/plugins/style/style.css +1 -1
  62. package/es2015/plugins/style/style.js +1 -1
  63. package/es2015/plugins/style/style.min.js +1 -1
  64. package/es2015/plugins/templates/templates.css +1 -1
  65. package/es2015/plugins/templates/templates.js +1 -1
  66. package/es2015/plugins/templates/templates.min.js +1 -1
  67. package/es2015/plugins/todo-list/todo-list.css +1 -1
  68. package/es2015/plugins/todo-list/todo-list.js +1 -1
  69. package/es2015/plugins/todo-list/todo-list.min.js +1 -1
  70. package/es2015/plugins/translate/translate.css +1 -1
  71. package/es2015/plugins/translate/translate.js +1 -1
  72. package/es2015/plugins/translate/translate.min.js +1 -1
  73. package/es2015/plugins/tune-block/tune-block.css +1 -1
  74. package/es2015/plugins/tune-block/tune-block.js +1 -1
  75. package/es2015/plugins/tune-block/tune-block.min.js +1 -1
  76. package/es2018/jodit.fat.min.css +1 -1
  77. package/es2018/jodit.fat.min.js +31 -31
  78. package/es2018/jodit.min.js +5 -5
  79. package/es2018/plugins/ai-assistant-pro/ai-assistant-pro.min.js +1 -1
  80. package/es2018/plugins/autocomplete/autocomplete.min.js +1 -1
  81. package/es2018/plugins/backup/backup.min.js +1 -1
  82. package/es2018/plugins/button-generator/button-generator.min.js +1 -1
  83. package/es2018/plugins/change-case/change-case.min.js +1 -1
  84. package/es2018/plugins/color-picker/color-picker.min.js +1 -1
  85. package/es2018/plugins/emoji/emoji.min.js +1 -1
  86. package/es2018/plugins/export-docs/export-docs.min.js +1 -1
  87. package/es2018/plugins/finder/finder.min.css +1 -1
  88. package/es2018/plugins/finder/finder.min.js +4 -4
  89. package/es2018/plugins/google-maps/google-maps.min.js +1 -1
  90. package/es2018/plugins/google-search/google-search.min.js +1 -1
  91. package/es2018/plugins/highlight-signature/highlight-signature.min.js +1 -1
  92. package/es2018/plugins/iframe-editor/iframe-editor.min.js +1 -1
  93. package/es2018/plugins/image-editor-pro/image-editor-pro.min.css +1 -0
  94. package/es2018/plugins/image-editor-pro/image-editor-pro.min.js +8 -0
  95. package/es2018/plugins/keyboard/keyboard.min.js +1 -1
  96. package/es2018/plugins/mobile-view/mobile-view.min.js +1 -1
  97. package/es2018/plugins/page-break/page-break.min.js +1 -1
  98. package/es2018/plugins/paste-code/paste-code.min.js +1 -1
  99. package/es2018/plugins/paste-from-word/paste-from-word.min.js +1 -1
  100. package/es2018/plugins/show-blocks/show-blocks.min.js +1 -1
  101. package/es2018/plugins/style/style.min.js +1 -1
  102. package/es2018/plugins/templates/templates.min.js +1 -1
  103. package/es2018/plugins/todo-list/todo-list.min.js +1 -1
  104. package/es2018/plugins/translate/translate.min.js +1 -1
  105. package/es2018/plugins/tune-block/tune-block.min.js +1 -1
  106. package/es2021/jodit.css +1 -1
  107. package/es2021/jodit.fat.min.css +1 -1
  108. package/es2021/jodit.fat.min.js +823 -39
  109. package/es2021/jodit.js +25 -7
  110. package/es2021/jodit.min.js +6 -6
  111. package/es2021/plugins/ai-assistant-pro/ai-assistant-pro.css +1 -1
  112. package/es2021/plugins/ai-assistant-pro/ai-assistant-pro.js +1 -1
  113. package/es2021/plugins/ai-assistant-pro/ai-assistant-pro.min.js +1 -1
  114. package/es2021/plugins/autocomplete/autocomplete.css +1 -1
  115. package/es2021/plugins/autocomplete/autocomplete.js +1 -1
  116. package/es2021/plugins/autocomplete/autocomplete.min.js +1 -1
  117. package/es2021/plugins/backup/backup.css +1 -1
  118. package/es2021/plugins/backup/backup.js +1 -1
  119. package/es2021/plugins/backup/backup.min.js +1 -1
  120. package/es2021/plugins/button-generator/button-generator.css +1 -1
  121. package/es2021/plugins/button-generator/button-generator.js +1 -1
  122. package/es2021/plugins/button-generator/button-generator.min.js +1 -1
  123. package/es2021/plugins/change-case/change-case.js +1 -1
  124. package/es2021/plugins/change-case/change-case.min.js +1 -1
  125. package/es2021/plugins/color-picker/color-picker.css +1 -1
  126. package/es2021/plugins/color-picker/color-picker.js +1 -1
  127. package/es2021/plugins/color-picker/color-picker.min.js +1 -1
  128. package/es2021/plugins/emoji/emoji.css +1 -1
  129. package/es2021/plugins/emoji/emoji.js +1 -1
  130. package/es2021/plugins/emoji/emoji.min.js +1 -1
  131. package/es2021/plugins/export-docs/export-docs.js +1 -1
  132. package/es2021/plugins/export-docs/export-docs.min.js +1 -1
  133. package/es2021/plugins/finder/finder.css +47 -4
  134. package/es2021/plugins/finder/finder.js +66 -5
  135. package/es2021/plugins/finder/finder.min.css +1 -1
  136. package/es2021/plugins/finder/finder.min.js +12 -12
  137. package/es2021/plugins/google-maps/google-maps.css +1 -1
  138. package/es2021/plugins/google-maps/google-maps.js +1 -1
  139. package/es2021/plugins/google-maps/google-maps.min.js +1 -1
  140. package/es2021/plugins/google-search/google-search.js +1 -1
  141. package/es2021/plugins/google-search/google-search.min.js +1 -1
  142. package/es2021/plugins/highlight-signature/highlight-signature.js +1 -1
  143. package/es2021/plugins/highlight-signature/highlight-signature.min.js +1 -1
  144. package/es2021/plugins/iframe-editor/iframe-editor.css +1 -1
  145. package/es2021/plugins/iframe-editor/iframe-editor.js +1 -1
  146. package/es2021/plugins/iframe-editor/iframe-editor.min.js +1 -1
  147. package/es2021/plugins/image-editor-pro/image-editor-pro.css +52 -0
  148. package/es2021/plugins/image-editor-pro/image-editor-pro.js +3870 -0
  149. package/es2021/plugins/image-editor-pro/image-editor-pro.min.css +1 -0
  150. package/es2021/plugins/image-editor-pro/image-editor-pro.min.js +792 -0
  151. package/es2021/plugins/keyboard/keyboard.css +1 -1
  152. package/es2021/plugins/keyboard/keyboard.js +1 -1
  153. package/es2021/plugins/keyboard/keyboard.min.js +1 -1
  154. package/es2021/plugins/mobile-view/mobile-view.js +1 -1
  155. package/es2021/plugins/mobile-view/mobile-view.min.js +1 -1
  156. package/es2021/plugins/page-break/page-break.js +1 -1
  157. package/es2021/plugins/page-break/page-break.min.js +1 -1
  158. package/es2021/plugins/paste-code/paste-code.css +1 -1
  159. package/es2021/plugins/paste-code/paste-code.js +1 -1
  160. package/es2021/plugins/paste-code/paste-code.min.js +1 -1
  161. package/es2021/plugins/paste-from-word/paste-from-word.js +1 -1
  162. package/es2021/plugins/paste-from-word/paste-from-word.min.js +1 -1
  163. package/es2021/plugins/show-blocks/show-blocks.js +1 -1
  164. package/es2021/plugins/show-blocks/show-blocks.min.js +1 -1
  165. package/es2021/plugins/style/style.css +1 -1
  166. package/es2021/plugins/style/style.js +1 -1
  167. package/es2021/plugins/style/style.min.js +1 -1
  168. package/es2021/plugins/templates/templates.css +1 -1
  169. package/es2021/plugins/templates/templates.js +1 -1
  170. package/es2021/plugins/templates/templates.min.js +1 -1
  171. package/es2021/plugins/todo-list/todo-list.css +1 -1
  172. package/es2021/plugins/todo-list/todo-list.js +1 -1
  173. package/es2021/plugins/todo-list/todo-list.min.js +1 -1
  174. package/es2021/plugins/translate/translate.css +1 -1
  175. package/es2021/plugins/translate/translate.js +1 -1
  176. package/es2021/plugins/translate/translate.min.js +1 -1
  177. package/es2021/plugins/tune-block/tune-block.css +1 -1
  178. package/es2021/plugins/tune-block/tune-block.js +1 -1
  179. package/es2021/plugins/tune-block/tune-block.min.js +1 -1
  180. package/es2021.en/jodit.css +1 -1
  181. package/es2021.en/jodit.fat.min.css +1 -1
  182. package/es2021.en/jodit.fat.min.js +865 -81
  183. package/es2021.en/jodit.js +25 -7
  184. package/es2021.en/jodit.min.js +6 -6
  185. package/es2021.en/plugins/ai-assistant-pro/ai-assistant-pro.css +1 -1
  186. package/es2021.en/plugins/ai-assistant-pro/ai-assistant-pro.js +1 -1
  187. package/es2021.en/plugins/ai-assistant-pro/ai-assistant-pro.min.js +1 -1
  188. package/es2021.en/plugins/autocomplete/autocomplete.css +1 -1
  189. package/es2021.en/plugins/autocomplete/autocomplete.js +1 -1
  190. package/es2021.en/plugins/autocomplete/autocomplete.min.js +1 -1
  191. package/es2021.en/plugins/backup/backup.css +1 -1
  192. package/es2021.en/plugins/backup/backup.js +1 -1
  193. package/es2021.en/plugins/backup/backup.min.js +1 -1
  194. package/es2021.en/plugins/button-generator/button-generator.css +1 -1
  195. package/es2021.en/plugins/button-generator/button-generator.js +1 -1
  196. package/es2021.en/plugins/button-generator/button-generator.min.js +1 -1
  197. package/es2021.en/plugins/change-case/change-case.js +1 -1
  198. package/es2021.en/plugins/change-case/change-case.min.js +1 -1
  199. package/es2021.en/plugins/color-picker/color-picker.css +1 -1
  200. package/es2021.en/plugins/color-picker/color-picker.js +1 -1
  201. package/es2021.en/plugins/color-picker/color-picker.min.js +1 -1
  202. package/es2021.en/plugins/emoji/emoji.css +1 -1
  203. package/es2021.en/plugins/emoji/emoji.js +1 -1
  204. package/es2021.en/plugins/emoji/emoji.min.js +1 -1
  205. package/es2021.en/plugins/export-docs/export-docs.js +1 -1
  206. package/es2021.en/plugins/export-docs/export-docs.min.js +1 -1
  207. package/es2021.en/plugins/finder/finder.css +47 -4
  208. package/es2021.en/plugins/finder/finder.js +66 -5
  209. package/es2021.en/plugins/finder/finder.min.css +1 -1
  210. package/es2021.en/plugins/finder/finder.min.js +4 -4
  211. package/es2021.en/plugins/google-maps/google-maps.css +1 -1
  212. package/es2021.en/plugins/google-maps/google-maps.js +1 -1
  213. package/es2021.en/plugins/google-maps/google-maps.min.js +1 -1
  214. package/es2021.en/plugins/google-search/google-search.js +1 -1
  215. package/es2021.en/plugins/google-search/google-search.min.js +1 -1
  216. package/es2021.en/plugins/highlight-signature/highlight-signature.js +1 -1
  217. package/es2021.en/plugins/highlight-signature/highlight-signature.min.js +1 -1
  218. package/es2021.en/plugins/iframe-editor/iframe-editor.css +1 -1
  219. package/es2021.en/plugins/iframe-editor/iframe-editor.js +1 -1
  220. package/es2021.en/plugins/iframe-editor/iframe-editor.min.js +1 -1
  221. package/es2021.en/plugins/image-editor-pro/image-editor-pro.css +52 -0
  222. package/es2021.en/plugins/image-editor-pro/image-editor-pro.js +3870 -0
  223. package/es2021.en/plugins/image-editor-pro/image-editor-pro.min.css +1 -0
  224. package/es2021.en/plugins/image-editor-pro/image-editor-pro.min.js +792 -0
  225. package/es2021.en/plugins/keyboard/keyboard.css +1 -1
  226. package/es2021.en/plugins/keyboard/keyboard.js +1 -1
  227. package/es2021.en/plugins/keyboard/keyboard.min.js +1 -1
  228. package/es2021.en/plugins/mobile-view/mobile-view.js +1 -1
  229. package/es2021.en/plugins/mobile-view/mobile-view.min.js +1 -1
  230. package/es2021.en/plugins/page-break/page-break.js +1 -1
  231. package/es2021.en/plugins/page-break/page-break.min.js +1 -1
  232. package/es2021.en/plugins/paste-code/paste-code.css +1 -1
  233. package/es2021.en/plugins/paste-code/paste-code.js +1 -1
  234. package/es2021.en/plugins/paste-code/paste-code.min.js +1 -1
  235. package/es2021.en/plugins/paste-from-word/paste-from-word.js +1 -1
  236. package/es2021.en/plugins/paste-from-word/paste-from-word.min.js +1 -1
  237. package/es2021.en/plugins/show-blocks/show-blocks.js +1 -1
  238. package/es2021.en/plugins/show-blocks/show-blocks.min.js +1 -1
  239. package/es2021.en/plugins/style/style.css +1 -1
  240. package/es2021.en/plugins/style/style.js +1 -1
  241. package/es2021.en/plugins/style/style.min.js +1 -1
  242. package/es2021.en/plugins/templates/templates.css +1 -1
  243. package/es2021.en/plugins/templates/templates.js +1 -1
  244. package/es2021.en/plugins/templates/templates.min.js +1 -1
  245. package/es2021.en/plugins/todo-list/todo-list.css +1 -1
  246. package/es2021.en/plugins/todo-list/todo-list.js +1 -1
  247. package/es2021.en/plugins/todo-list/todo-list.min.js +1 -1
  248. package/es2021.en/plugins/translate/translate.css +1 -1
  249. package/es2021.en/plugins/translate/translate.js +1 -1
  250. package/es2021.en/plugins/translate/translate.min.js +1 -1
  251. package/es2021.en/plugins/tune-block/tune-block.css +1 -1
  252. package/es2021.en/plugins/tune-block/tune-block.js +1 -1
  253. package/es2021.en/plugins/tune-block/tune-block.min.js +1 -1
  254. package/es5/jodit.css +2 -2
  255. package/es5/jodit.fat.min.css +1 -1
  256. package/es5/jodit.fat.min.js +2 -2
  257. package/es5/jodit.js +22 -6
  258. package/es5/jodit.min.css +2 -2
  259. package/es5/jodit.min.js +2 -2
  260. package/es5/plugins/ai-assistant-pro/ai-assistant-pro.css +1 -1
  261. package/es5/plugins/ai-assistant-pro/ai-assistant-pro.js +1 -1
  262. package/es5/plugins/ai-assistant-pro/ai-assistant-pro.min.js +1 -1
  263. package/es5/plugins/autocomplete/autocomplete.css +1 -1
  264. package/es5/plugins/autocomplete/autocomplete.js +1 -1
  265. package/es5/plugins/autocomplete/autocomplete.min.js +1 -1
  266. package/es5/plugins/backup/backup.css +1 -1
  267. package/es5/plugins/backup/backup.js +1 -1
  268. package/es5/plugins/backup/backup.min.js +1 -1
  269. package/es5/plugins/button-generator/button-generator.css +1 -1
  270. package/es5/plugins/button-generator/button-generator.js +1 -1
  271. package/es5/plugins/button-generator/button-generator.min.js +1 -1
  272. package/es5/plugins/change-case/change-case.js +1 -1
  273. package/es5/plugins/change-case/change-case.min.js +1 -1
  274. package/es5/plugins/color-picker/color-picker.css +1 -1
  275. package/es5/plugins/color-picker/color-picker.js +1 -1
  276. package/es5/plugins/color-picker/color-picker.min.js +1 -1
  277. package/es5/plugins/emoji/emoji.css +1 -1
  278. package/es5/plugins/emoji/emoji.js +1 -1
  279. package/es5/plugins/emoji/emoji.min.js +1 -1
  280. package/es5/plugins/export-docs/export-docs.js +1 -1
  281. package/es5/plugins/export-docs/export-docs.min.js +1 -1
  282. package/es5/plugins/finder/finder.css +47 -4
  283. package/es5/plugins/finder/finder.js +114 -30
  284. package/es5/plugins/finder/finder.min.css +1 -1
  285. package/es5/plugins/finder/finder.min.js +2 -2
  286. package/es5/plugins/google-maps/google-maps.css +1 -1
  287. package/es5/plugins/google-maps/google-maps.js +1 -1
  288. package/es5/plugins/google-maps/google-maps.min.js +1 -1
  289. package/es5/plugins/google-search/google-search.js +1 -1
  290. package/es5/plugins/google-search/google-search.min.js +1 -1
  291. package/es5/plugins/highlight-signature/highlight-signature.js +1 -1
  292. package/es5/plugins/highlight-signature/highlight-signature.min.js +1 -1
  293. package/es5/plugins/iframe-editor/iframe-editor.css +1 -1
  294. package/es5/plugins/iframe-editor/iframe-editor.js +1 -1
  295. package/es5/plugins/iframe-editor/iframe-editor.min.js +1 -1
  296. package/es5/plugins/image-editor-pro/image-editor-pro.css +52 -0
  297. package/es5/plugins/image-editor-pro/image-editor-pro.js +5469 -0
  298. package/es5/plugins/image-editor-pro/image-editor-pro.min.css +1 -0
  299. package/es5/plugins/image-editor-pro/image-editor-pro.min.js +8 -0
  300. package/es5/plugins/keyboard/keyboard.css +1 -1
  301. package/es5/plugins/keyboard/keyboard.js +1 -1
  302. package/es5/plugins/keyboard/keyboard.min.js +1 -1
  303. package/es5/plugins/mobile-view/mobile-view.js +1 -1
  304. package/es5/plugins/mobile-view/mobile-view.min.js +1 -1
  305. package/es5/plugins/page-break/page-break.js +1 -1
  306. package/es5/plugins/page-break/page-break.min.js +1 -1
  307. package/es5/plugins/paste-code/paste-code.css +1 -1
  308. package/es5/plugins/paste-code/paste-code.js +1 -1
  309. package/es5/plugins/paste-code/paste-code.min.js +1 -1
  310. package/es5/plugins/paste-from-word/paste-from-word.js +1 -1
  311. package/es5/plugins/paste-from-word/paste-from-word.min.js +1 -1
  312. package/es5/plugins/show-blocks/show-blocks.js +1 -1
  313. package/es5/plugins/show-blocks/show-blocks.min.js +1 -1
  314. package/es5/plugins/style/style.css +1 -1
  315. package/es5/plugins/style/style.js +1 -1
  316. package/es5/plugins/style/style.min.js +1 -1
  317. package/es5/plugins/templates/templates.css +1 -1
  318. package/es5/plugins/templates/templates.js +1 -1
  319. package/es5/plugins/templates/templates.min.js +1 -1
  320. package/es5/plugins/todo-list/todo-list.css +1 -1
  321. package/es5/plugins/todo-list/todo-list.js +1 -1
  322. package/es5/plugins/todo-list/todo-list.min.js +1 -1
  323. package/es5/plugins/translate/translate.css +1 -1
  324. package/es5/plugins/translate/translate.js +1 -1
  325. package/es5/plugins/translate/translate.min.js +1 -1
  326. package/es5/plugins/tune-block/tune-block.css +1 -1
  327. package/es5/plugins/tune-block/tune-block.js +1 -1
  328. package/es5/plugins/tune-block/tune-block.min.js +1 -1
  329. package/es5/polyfills.fat.min.js +1 -1
  330. package/es5/polyfills.js +1 -1
  331. package/es5/polyfills.min.js +1 -1
  332. package/esm/config.d.ts +9 -0
  333. package/esm/plugins/all.js +1 -1
  334. package/esm/plugins/finder/browser.d.ts +10 -1
  335. package/esm/plugins/finder/browser.js +1 -1
  336. package/esm/plugins/finder/ui/lightboox/lightbox.js +2 -2
  337. package/esm/plugins/finder/ui/virtual-scroll/virtual-scroll.d.ts +11 -1
  338. package/esm/plugins/finder/ui/virtual-scroll/virtual-scroll.js +2 -2
  339. package/esm/plugins/image-editor-pro/adapter.d.ts +98 -0
  340. package/esm/plugins/image-editor-pro/adapter.js +1 -0
  341. package/esm/plugins/image-editor-pro/config.d.ts +17 -0
  342. package/esm/plugins/image-editor-pro/config.js +1 -0
  343. package/esm/plugins/image-editor-pro/image-editor-pro.d.ts +26 -0
  344. package/esm/plugins/image-editor-pro/image-editor-pro.js +1 -0
  345. package/package.json +2 -1
  346. package/types/config.d.ts +9 -0
  347. package/types/plugins/finder/browser.d.ts +10 -1
  348. package/types/plugins/finder/ui/virtual-scroll/virtual-scroll.d.ts +11 -1
  349. package/types/plugins/image-editor-pro/adapter.d.ts +98 -0
  350. package/types/plugins/image-editor-pro/config.d.ts +17 -0
  351. package/types/plugins/image-editor-pro/image-editor-pro.d.ts +26 -0
@@ -1 +1 @@
1
- var E=Object.defineProperty;var d=(m,e)=>E(m,"name",{value:e,configurable:!0});var u,o=function(m,e,t,s){var i=arguments.length,n=i<3?e:s===null?s=Object.getOwnPropertyDescriptor(e,t):s,h;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")n=Reflect.decorate(m,e,t,s);else for(var l=m.length-1;l>=0;l--)(h=m[l])&&(n=(i<3?h(n):i>3?h(e,t,n):h(e,t))||n);return i>3&&n&&Object.defineProperty(e,t,n),n};import"./ui/assets/icons/index.js";import{ContextMenuManager as M}from"./helpers/context-menu.js";import{parentPath as c}from"./helpers/helpers.js";import{HistoryManager as S}from"./helpers/history-manager.js";import{LoadingManager as F}from"./helpers/loading-manager.js";import{PersistentStore as _}from"./helpers/persistent-store.js";import{StateManager as C}from"./helpers/state-manager.js";import{UIBrowserHeader as I}from"./ui/header/header.js";import{UILightBox as B}from"./ui/lightboox/lightbox.js";import{UIBrowserPanel as O}from"./ui/panel/panel.js";import{UIProgress as L}from"./ui/progress/progress.js";import{Config as p}from"jodit/esm/config.js";import{IS_PROD as x,KEY_DELETE as D,KEY_DOWN as b,KEY_ENTER as k,KEY_LEFT as y,KEY_RIGHT as f,KEY_UP as U}from"jodit/esm/core/constants.js";import{autobind as g,cache as K,component as N,derive as z,watch as a}from"jodit/esm/core/decorators/index.js";import{ConfigProto as v,css as T,isAbortError as j,isString as P,isValidName as R}from"jodit/esm/core/helpers/index.js";import{Dlgs as H}from"jodit/esm/core/traits/dlgs.js";import{Dom as W,observable as G}from"jodit/esm/modules/index.js";import{Dialog as Y}from"jodit/esm/modules/dialog/index.js";import{makeDataProvider as A}from"jodit/esm/modules/file-browser/factories.js";import{openImageEditor as J}from"jodit/esm/modules/image-editor/image-editor.js";import{JoditPro as w}from"../../jodit-pro.js";import{license as V}from"../license/license.js";let r=(u=class extends Y{className(){return"FileBrowserPro"}lock(e="any"){return this.container.classList.add("jodit_disabled"),super.lock(e)}unlock(){return this.container.classList.remove("jodit_disabled"),super.unlock()}status(e,t=!(e instanceof Error)){j(e)||(!x&&!P(e)&&console.error(e),this.message.message(P(e)?e:e.message,t?"success":"error",this.options.howLongShowMsg))}get progressbar(){return new L(this,this.stateManager.state)}constructor(e){super(v(Object.assign(e||{},{resizable:!0,draggable:!0,toolbarButtons:e?.toolbarButtons||p.defaultOptions.filebrowser.buttons,buttons:w.atom(["filebrowser.settings","fullsize","dialog.close"])}),p.defaultOptions.filebrowser)),this.dataProvider=A(this,this.options),this.state=G({onSelectCallBack:null,theme:"default",showSideBar:!0,showFavorites:!0,showSettings:!1,showPreview:!1,withFolders:!0,foldersPosition:"bottom",info:"",metaInfo:null,currentPath:"",currentSource:"",currentBaseUrl:"",tree:[],activeElements:[],favorites:[],progress:0,lastSelectedIndex:0,elements:[],messages:[],sources:[],view:"tiles",tileSize:"default",sortBy:"name-asc",filterWord:"",onlyImages:!1}),this.persistent=new _(this,this.state),this.loadingManager=new F(this,this.state),this.stateManager=new C(this.state),this.historyManager=new S(this,this.state),this.contextMenuManager=new M(this),this.header=new I(this,this.options,this.stateManager),this.panel=new O(this,this.stateManager),this.files=this.panel,this.tree=this.panel,V.make(this),!this.persistent.theme&&this.options.theme&&(this.persistent.theme=this.options.theme),this.panel.append(this.progressbar),this.toolbar.setMod("mode","header"),this.setSize(Math.min(this.options.width,screen.width),Math.min(this.options.height,screen.height)).setHeader(this.header),this.onResizeWindow(),this.initUploader(),this.onChangeTheme(),this.fullFillOptions(),this.dataProvider.onProgress(t=>{t===0&&(t=30),this.state.progress=t}),this.e.on("beforeClose",this.removeGlobalListeners),this.e.fire("afterInit"),w.prototype.afterInitHook.call(this)}addDisclaimer(e){this.dialog.appendChild(e)}async open(e=this.o.defaultCallback,t){return this.state.onlyImages=!!t,this.prepareOpening(e),super.open(this.panel.container),this.e.fire("update.filebrowser")}onResizeWindow(){T(this.dialog,{maxWidth:screen.width,minHeight:Math.min(this.options.height,screen.height),minWidth:Math.min(this.options.width,screen.width)})}onChangePath(){const{currentPath:e,currentSource:t}=this.state;this.uploader.setPath(e),this.uploader.setSource(t)}onChangeTheme(){this.setMod("theme",this.state.theme),this.header.setMod("theme",this.state.theme),this.panel.setMod("theme",this.state.theme),this.options.theme=this.state.theme}onToggleSettings(){this.state.showSettings=!this.state.showSettings}prepareOpening(e){this.registerGlobalListeners(),e&&(this.state.onSelectCallBack=t=>{this.close(),e(t)}),this.persistent.syncWithState()}registerGlobalListeners(){this.e.on(this.ow,"keydown",this.onKeyPress)}onKeyPress(e){const{activeElement:t}=this.od;if(!this.state.activeElements.length||!t||!W.isOrContains(this.panel.items.container,t))return;const s=this.state.elements;switch(e.key){case k:return this.onChooseItems();case D:return this.onFileRemove();case f:case y:case b:case U:{const i=e.key===f||e.key===b,n=this.state.lastSelectedIndex;let h;if([f,y].includes(e.key))i?h=s[n+1]?n+1:0:h=s[n-1]?n-1:s.length-1;else{const{countInRow:l}=this.panel;h=Math.round(((n+1)/l+(i?1:-1))*l-1)}return s[h]&&this.stateManager.addActive(s[h],e.shiftKey),!1}}}removeGlobalListeners(){this.e.off(this.ow,"keydown",this.onKeyPress)}onFileRemove(){this.state.activeElements.length&&this.confirm("Are you sure?","Delete",e=>{e&&this.__itemsRemove(this.state.activeElements)}).bindDestruct(this)}__itemsRemove(e){if(!e.length)return Promise.resolve();const t=[];return e.forEach(s=>{var i;t.push(s.type==="folder"?this.__folderRemove(c(s.path),(i=s.name)!==null&&i!==void 0?i:"",s.sourceName):this.__removeFile(s.file||s.name||"",s.sourceName))}),this.state.activeElements.forEach(s=>{this.stateManager.isFavorite(s)&&this.stateManager.toggleFavorite(s)}),this.state.activeElements=[],Promise.allSettled(t).then(()=>Promise.allSettled([this.loadingManager.loadItems(),this.loadingManager.loadFolders()]))}__removeFile(e,t){return this.dataProvider.fileRemove(this.state.currentPath,e,t).then(s=>{this.status(s||this.i18n('File "%s" was deleted',e),!0)}).catch(this.status)}__folderRemove(e,t,s){return this.dataProvider.folderRemove(e,t,s).then(i=>{this.status(i||this.i18n('Folder "%s" was deleted',t),!0),this.state.currentPath===e&&(this.state.currentPath=c(e),this.state.currentSource=s)}).catch(this.status)}onFileEdit(){if(this.state.activeElements.length===1){const[e]=this.state.activeElements;J.call(this,e.fileURL,e.file||"",e.path,e.sourceName,void 0,this.status)}}onFolderRename(e){this.prompt("Enter new name","Rename",t=>{if(!R(t)||t===e.name)return this.status(this.i18n("Enter new name")),!1;this.dataProvider.folderRename(c(e.path),e.name,t,e.sourceName).then(s=>{this.state.activeElements=[],this.status(s,!0),this.state.currentPath=c(e.path)+"/"+t,this.state.currentSource=e.sourceName,this.historyManager.updateCurrent(),this.loadingManager.loadFolders()}).catch(this.status)},this.i18n("type name"),e.name).bindDestruct(this)}onFolderRemove(e){this.confirm("Are you sure?","Delete",t=>{t&&this.__itemsRemove([{type:"folder",name:e.name,path:e.path,sourceName:e.sourceName}])}).bindDestruct(this)}onFolderCreate(e){this.prompt("Enter Directory name","Create directory",t=>{const s=e.path||"/";this.dataProvider.createFolder(t,e.path||"/",e.sourceName).then(()=>{this.state.currentSource===e.sourceName&&this.state.currentPath===s?this.e.fire("update.filebrowser"):(this.state.currentSource=e.sourceName,this.state.currentPath=s),this.historyManager.updateCurrent()},this.status)},this.i18n("type name")).bindDestruct(this)}onFileRename(e){const t=e.file||e.name||"";this.state.activeElements.length===1&&t&&this.prompt("Enter new name","Rename",s=>{if(!R(s))return this.status(this.i18n("Enter new name")),!1;this.dataProvider.fileRename(this.state.currentPath,t,s,this.state.currentSource).then(i=>{this.state.activeElements=[],this.status(i,!0),this.loadingManager.loadItems()}).catch(this.status)},this.i18n("type name"),t).bindDestruct(this)}onChooseItems(){const e=this.stateManager.state.activeElements;if(e.length){if(e[0].type==="folder"){this.state.currentPath=this.state.currentPath+"/"+e[0].name,this.state.currentSource=e[0].sourceName,this.e.fire("afterOpenFolder.filebrowser");return}this.state.onSelectCallBack?this.stateManager.callSelectHandler():this.onOpenLightBox(e[0])}}onOpenLightBox(e){B.open(this,e,this.state.elements)}initUploader(){const e=this,t=v(e.o.uploader||{},p.defaultOptions.uploader),s=d(()=>this.loadingManager.loadItems(),"uploadHandler");e.uploader=e.getInstance("Uploader",t),e.uploader.bind(e.panel.container,s,e.status),e.e.on("bindUploader.filebrowser",i=>{e.uploader.bind(i,s,e.status)})}destruct(){this.removeGlobalListeners(),this.header.destruct(),this.panel.destruct(),super.destruct()}fullFillOptions(){["getLocalFileByUrl","crop","resize","create","fileMove","folderMove","fileRename","folderRename","fileRemove","folderRemove","folder","items","permissions"].forEach(t=>{this.options[t]!=null&&(this.options[t]=v(this.options[t],this.o.ajax))})}},d(u,"FileBrowserPro"),u);o([g],r.prototype,"status",null),o([K],r.prototype,"progressbar",null),o([a(":resize",{context:window})],r.prototype,"onResizeWindow",null),o([a(["state.currentPath","state.currentSource"])],r.prototype,"onChangePath",null),o([a("state.theme")],r.prototype,"onChangeTheme",null),o([a(":toggleSettings.filebrowser")],r.prototype,"onToggleSettings",null),o([g],r.prototype,"onKeyPress",null),o([g],r.prototype,"removeGlobalListeners",null),o([a(":fileRemove.filebrowser")],r.prototype,"onFileRemove",null),o([a(":edit.filebrowser")],r.prototype,"onFileEdit",null),o([a(":folderRename.filebrowser")],r.prototype,"onFolderRename",null),o([a(":folderRemove.filebrowser")],r.prototype,"onFolderRemove",null),o([a(":folderCreate.filebrowser")],r.prototype,"onFolderCreate",null),o([a(":fileRename.filebrowser")],r.prototype,"onFileRename",null),o([a(":select.filebrowser")],r.prototype,"onChooseItems",null),o([a(":openLightBox.filebrowser")],r.prototype,"onOpenLightBox",null),r=o([N,z(H)],r);Object.defineProperty(w.modules,"FileBrowserPro",{value:r,writable:!1,enumerable:!0,configurable:!0});export{r as FileBrowserPro};
1
+ var M=Object.defineProperty;var p=(m,e)=>M(m,"name",{value:e,configurable:!0});var u,i=function(m,e,t,s){var o=arguments.length,n=o<3?e:s===null?s=Object.getOwnPropertyDescriptor(e,t):s,h;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")n=Reflect.decorate(m,e,t,s);else for(var l=m.length-1;l>=0;l--)(h=m[l])&&(n=(o<3?h(n):o>3?h(e,t,n):h(e,t))||n);return o>3&&n&&Object.defineProperty(e,t,n),n};import"./ui/assets/icons/index.js";import{ContextMenuManager as S}from"./helpers/context-menu.js";import{parentPath as c}from"./helpers/helpers.js";import{HistoryManager as F}from"./helpers/history-manager.js";import{LoadingManager as _}from"./helpers/loading-manager.js";import{PersistentStore as C}from"./helpers/persistent-store.js";import{StateManager as I}from"./helpers/state-manager.js";import{UIBrowserHeader as B}from"./ui/header/header.js";import{UILightBox as O}from"./ui/lightboox/lightbox.js";import{UIBrowserPanel as L}from"./ui/panel/panel.js";import{UIProgress as x}from"./ui/progress/progress.js";import{Config as f}from"jodit/esm/config.js";import{IS_PROD as D,KEY_DELETE as k,KEY_DOWN as b,KEY_ENTER as H,KEY_LEFT as y,KEY_RIGHT as g,KEY_UP as U}from"jodit/esm/core/constants.js";import{autobind as d,cache as K,component as N,derive as z,watch as a}from"jodit/esm/core/decorators/index.js";import{ConfigProto as v,css as T,isAbortError as P,isString as E,isValidName as R}from"jodit/esm/core/helpers/index.js";import{Dlgs as j}from"jodit/esm/core/traits/dlgs.js";import{Dom as W,observable as G}from"jodit/esm/modules/index.js";import{Dialog as Y}from"jodit/esm/modules/dialog/index.js";import{makeDataProvider as A}from"jodit/esm/modules/file-browser/factories.js";import{openImageEditor as J}from"jodit/esm/modules/image-editor/image-editor.js";import{JoditPro as w}from"../../jodit-pro.js";import{license as V}from"../license/license.js";let r=(u=class extends Y{className(){return"FileBrowserPro"}lock(e="any"){return this.container.classList.add("jodit_disabled"),super.lock(e)}unlock(){return this.container.classList.remove("jodit_disabled"),super.unlock()}status(e,t=!(e instanceof Error)){P(e)||(!D&&!E(e)&&console.error(e),this.message.message(E(e)?e:e.message,t?"success":"error",this.options.howLongShowMsg))}errorHandler(e){P(e)||this.status(e instanceof Error?this.i18n(e.message):this.dataProvider.getMessage(e),!1)}get progressbar(){return new x(this,this.stateManager.state)}constructor(e){super(v(Object.assign(e||{},{resizable:!0,draggable:!0,toolbarButtons:e?.toolbarButtons||f.defaultOptions.filebrowser.buttons,buttons:w.atom(["filebrowser.settings","fullsize","dialog.close"])}),f.defaultOptions.filebrowser)),this.dataProvider=A(this,this.options),this.state=G({onSelectCallBack:null,theme:"default",showSideBar:!0,showFavorites:!0,showSettings:!1,showPreview:!1,withFolders:!0,foldersPosition:"bottom",info:"",metaInfo:null,currentPath:"",currentSource:"",currentBaseUrl:"",tree:[],activeElements:[],favorites:[],progress:0,lastSelectedIndex:0,elements:[],messages:[],sources:[],view:"tiles",tileSize:"default",sortBy:"name-asc",filterWord:"",onlyImages:!1}),this.persistent=new C(this,this.state),this.loadingManager=new _(this,this.state),this.stateManager=new I(this.state),this.historyManager=new F(this,this.state),this.contextMenuManager=new S(this),this.header=new B(this,this.options,this.stateManager),this.panel=new L(this,this.stateManager),this.files=this.panel,this.tree=this.panel,V.make(this),!this.persistent.theme&&this.options.theme&&(this.persistent.theme=this.options.theme),this.panel.append(this.progressbar),this.toolbar.setMod("mode","header"),this.setSize(Math.min(this.options.width,screen.width),Math.min(this.options.height,screen.height)).setHeader(this.header),this.onResizeWindow(),this.initUploader(),this.onChangeTheme(),this.fullFillOptions(),this.dataProvider.onProgress(t=>{t===0&&(t=30),this.state.progress=t}),this.e.on("beforeClose",this.removeGlobalListeners),this.e.fire("afterInit"),w.prototype.afterInitHook.call(this)}addDisclaimer(e){this.dialog.appendChild(e)}async open(e=this.o.defaultCallback,t){return this.state.onlyImages=!!t,this.prepareOpening(e),super.open(this.panel.container),this.e.fire("update.filebrowser")}onResizeWindow(){T(this.dialog,{maxWidth:screen.width,minHeight:Math.min(this.options.height,screen.height),minWidth:Math.min(this.options.width,screen.width)})}onChangePath(){const{currentPath:e,currentSource:t}=this.state;this.uploader.setPath(e),this.uploader.setSource(t)}onChangeTheme(){this.setMod("theme",this.state.theme),this.header.setMod("theme",this.state.theme),this.panel.setMod("theme",this.state.theme),this.options.theme=this.state.theme}onToggleSettings(){this.state.showSettings=!this.state.showSettings}prepareOpening(e){this.registerGlobalListeners(),e&&(this.state.onSelectCallBack=t=>{this.close(),e(t)}),this.persistent.syncWithState()}registerGlobalListeners(){this.e.on(this.ow,"keydown",this.onKeyPress)}onKeyPress(e){const{activeElement:t}=this.od;if(!this.state.activeElements.length||!t||!W.isOrContains(this.panel.items.container,t))return;const s=this.state.elements;switch(e.key){case H:return this.onChooseItems();case k:return this.onFileRemove();case g:case y:case b:case U:{const o=e.key===g||e.key===b,n=this.state.lastSelectedIndex;let h;if([g,y].includes(e.key))o?h=s[n+1]?n+1:0:h=s[n-1]?n-1:s.length-1;else{const{countInRow:l}=this.panel;h=Math.round(((n+1)/l+(o?1:-1))*l-1)}return s[h]&&this.stateManager.addActive(s[h],e.shiftKey),!1}}}removeGlobalListeners(){this.e.off(this.ow,"keydown",this.onKeyPress)}onFileRemove(){this.state.activeElements.length&&this.confirm("Are you sure?","Delete",e=>{e&&this.__itemsRemove(this.state.activeElements)}).bindDestruct(this)}__itemsRemove(e){if(!e.length)return Promise.resolve();const t=[];return e.forEach(s=>{var o;t.push(s.type==="folder"?this.__folderRemove(c(s.path),(o=s.name)!==null&&o!==void 0?o:"",s.sourceName):this.__removeFile(s.file||s.name||"",s.sourceName))}),this.state.activeElements.forEach(s=>{this.stateManager.isFavorite(s)&&this.stateManager.toggleFavorite(s)}),this.state.activeElements=[],Promise.allSettled(t).then(()=>Promise.allSettled([this.loadingManager.loadItems(),this.loadingManager.loadFolders()]))}__removeFile(e,t){return this.dataProvider.fileRemove(this.state.currentPath,e,t).then(s=>{this.status(s||this.i18n('File "%s" was deleted',e),!0)}).catch(this.status)}__folderRemove(e,t,s){return this.dataProvider.folderRemove(e,t,s).then(o=>{this.status(o||this.i18n('Folder "%s" was deleted',t),!0),this.state.currentPath===e&&(this.state.currentPath=c(e),this.state.currentSource=s)}).catch(this.status)}onFileEdit(){if(this.state.activeElements.length===1){const[e]=this.state.activeElements;J.call(this,e.fileURL,e.file||"",e.path,e.sourceName,void 0,this.status)}}onFolderRename(e){this.prompt("Enter new name","Rename",t=>{if(!R(t)||t===e.name)return this.status(this.i18n("Enter new name")),!1;this.dataProvider.folderRename(c(e.path),e.name,t,e.sourceName).then(s=>{this.state.activeElements=[],this.status(s,!0),this.state.currentPath=c(e.path)+"/"+t,this.state.currentSource=e.sourceName,this.historyManager.updateCurrent(),this.loadingManager.loadFolders()}).catch(this.status)},this.i18n("type name"),e.name).bindDestruct(this)}onFolderRemove(e){this.confirm("Are you sure?","Delete",t=>{t&&this.__itemsRemove([{type:"folder",name:e.name,path:e.path,sourceName:e.sourceName}])}).bindDestruct(this)}onFolderCreate(e){this.prompt("Enter Directory name","Create directory",t=>{const s=e.path||"/";this.dataProvider.createFolder(t,e.path||"/",e.sourceName).then(()=>{this.state.currentSource===e.sourceName&&this.state.currentPath===s?this.e.fire("update.filebrowser"):(this.state.currentSource=e.sourceName,this.state.currentPath=s),this.historyManager.updateCurrent()},this.status)},this.i18n("type name")).bindDestruct(this)}onFileRename(e){const t=e.file||e.name||"";this.state.activeElements.length===1&&t&&this.prompt("Enter new name","Rename",s=>{if(!R(s))return this.status(this.i18n("Enter new name")),!1;this.dataProvider.fileRename(this.state.currentPath,t,s,this.state.currentSource).then(o=>{this.state.activeElements=[],this.status(o,!0),this.loadingManager.loadItems()}).catch(this.status)},this.i18n("type name"),t).bindDestruct(this)}onChooseItems(){const e=this.stateManager.state.activeElements;if(e.length){if(e[0].type==="folder"){this.state.currentPath=this.state.currentPath+"/"+e[0].name,this.state.currentSource=e[0].sourceName,this.e.fire("afterOpenFolder.filebrowser");return}this.state.onSelectCallBack?this.stateManager.callSelectHandler():this.onOpenLightBox(e[0])}}onOpenLightBox(e){O.open(this,e,this.state.elements)}initUploader(){const e=this,t=v(e.o.uploader||{},f.defaultOptions.uploader),s=p(()=>this.loadingManager.loadItems(),"uploadHandler");e.uploader=e.getInstance("Uploader",t),e.uploader.bind(e.panel.container,s,e.errorHandler),e.e.on("bindUploader.filebrowser",o=>{e.uploader.bind(o,s,e.errorHandler)})}destruct(){this.removeGlobalListeners(),this.header.destruct(),this.panel.destruct(),super.destruct()}fullFillOptions(){["getLocalFileByUrl","crop","resize","create","fileMove","folderMove","fileRename","folderRename","fileRemove","folderRemove","folder","items","permissions"].forEach(t=>{this.options[t]!=null&&(this.options[t]=v(this.options[t],this.o.ajax))})}},p(u,"FileBrowserPro"),u);i([d],r.prototype,"status",null),i([d],r.prototype,"errorHandler",null),i([K],r.prototype,"progressbar",null),i([a(":resize",{context:window})],r.prototype,"onResizeWindow",null),i([a(["state.currentPath","state.currentSource"])],r.prototype,"onChangePath",null),i([a("state.theme")],r.prototype,"onChangeTheme",null),i([a(":toggleSettings.filebrowser")],r.prototype,"onToggleSettings",null),i([d],r.prototype,"onKeyPress",null),i([d],r.prototype,"removeGlobalListeners",null),i([a(":fileRemove.filebrowser")],r.prototype,"onFileRemove",null),i([a(":edit.filebrowser")],r.prototype,"onFileEdit",null),i([a(":folderRename.filebrowser")],r.prototype,"onFolderRename",null),i([a(":folderRemove.filebrowser")],r.prototype,"onFolderRemove",null),i([a(":folderCreate.filebrowser")],r.prototype,"onFolderCreate",null),i([a(":fileRename.filebrowser")],r.prototype,"onFileRename",null),i([a(":select.filebrowser")],r.prototype,"onChooseItems",null),i([a(":openLightBox.filebrowser")],r.prototype,"onOpenLightBox",null),r=i([N,z(j)],r);Object.defineProperty(w.modules,"FileBrowserPro",{value:r,writable:!1,enumerable:!0,configurable:!0});export{r as FileBrowserPro};
@@ -1,6 +1,6 @@
1
- var p=Object.defineProperty;var d=(l,e)=>p(l,"name",{value:e,configurable:!0});var r,a=function(l,e,t,i){var s=arguments.length,n=s<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,h;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")n=Reflect.decorate(l,e,t,i);else for(var c=l.length-1;c>=0;c--)(h=l[c])&&(n=(s<3?h(n):s>3?h(e,t,n):h(e,t))||n);return s>3&&n&&Object.defineProperty(e,t,n),n},m;import{KEY_LEFT as f,KEY_RIGHT as v,KEY_SPACE as w}from"jodit/esm/core/constants.js";import{autobind as x,component as C,watch as u}from"jodit/esm/core/decorators/index.js";import{css as g,loadImage as k}from"jodit/esm/core/helpers/index.js";import{assert as y}from"jodit/esm/core/helpers/utils/assert.js";import{Dialog as I,Dom as _,UIElement as b}from"jodit/esm/modules/index.js";let o=m=(r=class extends b{className(){return"UILightBox"}render(){return`<div>
1
+ var p=Object.defineProperty;var d=(l,e)=>p(l,"name",{value:e,configurable:!0});var r,a=function(l,e,t,i){var s=arguments.length,n=s<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,h;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")n=Reflect.decorate(l,e,t,i);else for(var c=l.length-1;c>=0;c--)(h=l[c])&&(n=(s<3?h(n):s>3?h(e,t,n):h(e,t))||n);return s>3&&n&&Object.defineProperty(e,t,n),n},m;import{KEY_LEFT as f,KEY_RIGHT as v,KEY_SPACE as w}from"jodit/esm/core/constants.js";import{autobind as x,component as y,watch as u}from"jodit/esm/core/decorators/index.js";import{css as g,loadImage as C}from"jodit/esm/core/helpers/index.js";import{assert as k}from"jodit/esm/core/helpers/utils/assert.js";import{Dialog as I,Dom as _,UIElement as b}from"jodit/esm/modules/index.js";let o=m=(r=class extends b{className(){return"UILightBox"}render(){return`<div>
2
2
  <div class='&__previous'>*angle-left*</div>
3
3
  <div class='&__preview'></div>
4
4
  <div class='&__loader'></div>
5
5
  <div class='&__next'>*angle-right*</div>
6
- </div>`}constructor(e,t,i){super(e),this.current=t,this.elements=i,this.dialog=new I;const{dialog:s}=this;s.setMod("theme",e.state.theme).toolbar.setMod("mode","header"),s.open(this),this.elements=this.elements.filter(n=>n.isImage),s.e.on(s,"afterClose",()=>{this.destruct()}),this.addGlobalListeners(),this.onChangeCurrent(),s.toolbar.build([{icon:"check",exec:d(()=>{e.stateManager.addActive(this.current,!1),e.e.fire("select.filebrowser"),s.close()},"exec")},"dialog.close"])}async onChangeCurrent(){const{current:e}=this;this.setMod("loading",!0);const t=this.getElm("preview");if(y(t!=null,"preview element does not exist"),_.detach(t),g(t,{backgroundImage:null}),e.isImage){const i=await k(e.fileURL,this.j);this.dialog.setPosition(),g(t,{width:Math.min(this.jodit.ow.innerWidth,i.naturalWidth),height:Math.min(this.jodit.ow.innerHeight-100,i.naturalHeight),backgroundImage:`url(${i.src})`})}else{const i=await this.makeIframe(e.fileURL);t.appendChild(i)}this.dialog.setSize(),this.dialog.setPosition(),this.setMod("loading",!1)}makeIframe(e){const t=this.j.c.element("iframe");return t.classList.add(this.getFullElName("office-iframe")),t.src=/\.pdf/.test(e)?e:this.j.o.previewOfficeURL+encodeURIComponent(e),t}onPreviousClick(){const{current:e}=this;let t=this.j.stateManager.getIndex(e,this.elements);t<=0?t=this.elements.length-1:t-=1,this.current=this.elements[t]}onNextClick(){const{current:e}=this;let t=this.j.stateManager.getIndex(e,this.elements);t>=this.elements.length-1?t=0:t+=1,this.current=this.elements[t]}static open(e,t,i){return new m(e,t,i)}addGlobalListeners(){this.j.e.on(this.j.od,"keydown",this.onKeyPress)}onKeyPress(e){if(e.key===f||e.key===v||e.key===w)return e.key===f?this.onPreviousClick():this.onNextClick(),!1}removeGlobalListeners(){this.j.e.off(this.j.od,"keydown",this.onKeyPress)}destruct(){return this.removeGlobalListeners(),this.dialog.destruct(),super.destruct()}},d(r,"UILightBox"),r);a([u("current")],o.prototype,"onChangeCurrent",null),a([u("previous:click")],o.prototype,"onPreviousClick",null),a([u("next:click")],o.prototype,"onNextClick",null),a([x],o.prototype,"onKeyPress",null),o=m=a([C],o);export{o as UILightBox};
6
+ </div>`}constructor(e,t,i){super(e),this.current=t,this.elements=i,this.dialog=new I;const{dialog:s}=this;s.setMod("theme",e.state.theme).toolbar.setMod("mode","header"),s.open(this),this.elements=this.elements.filter(n=>n.isImage),s.e.on(s,"afterClose",()=>{this.j.async.setTimeout(()=>this.destruct(),1)}),this.addGlobalListeners(),this.onChangeCurrent(),s.toolbar.build([{icon:"check",exec:d(()=>{e.stateManager.addActive(this.current,!1),e.e.fire("select.filebrowser"),s.close()},"exec")},"dialog.close"])}async onChangeCurrent(){const{current:e}=this;this.setMod("loading",!0);const t=this.getElm("preview");if(k(t!=null,"preview element does not exist"),_.detach(t),g(t,{backgroundImage:null}),e.isImage){const i=await C(e.fileURL,this.j);this.dialog.setPosition(),g(t,{width:Math.min(this.jodit.ow.innerWidth,i.naturalWidth),height:Math.min(this.jodit.ow.innerHeight-100,i.naturalHeight),backgroundImage:`url(${i.src})`})}else{const i=await this.makeIframe(e.fileURL);t.appendChild(i)}this.dialog.setSize(),this.dialog.setPosition(),this.setMod("loading",!1)}makeIframe(e){const t=this.j.c.element("iframe");return t.classList.add(this.getFullElName("office-iframe")),t.src=/\.pdf/.test(e)?e:this.j.o.previewOfficeURL+encodeURIComponent(e),t}onPreviousClick(){const{current:e}=this;let t=this.j.stateManager.getIndex(e,this.elements);t<=0?t=this.elements.length-1:t-=1,this.current=this.elements[t]}onNextClick(){const{current:e}=this;let t=this.j.stateManager.getIndex(e,this.elements);t>=this.elements.length-1?t=0:t+=1,this.current=this.elements[t]}static open(e,t,i){return new m(e,t,i)}addGlobalListeners(){this.j.e.on(this.j.od,"keydown",this.onKeyPress)}onKeyPress(e){if(e.key===f||e.key===v||e.key===w)return e.key===f?this.onPreviousClick():this.onNextClick(),!1}removeGlobalListeners(){this.j.e.off(this.j.od,"keydown",this.onKeyPress)}destruct(){return this.removeGlobalListeners(),this.dialog.destruct(),super.destruct()}},d(r,"UILightBox"),r);a([u("current")],o.prototype,"onChangeCurrent",null),a([u("previous:click")],o.prototype,"onPreviousClick",null),a([u("next:click")],o.prototype,"onNextClick",null),a([x],o.prototype,"onKeyPress",null),o=m=a([y],o);export{o as UILightBox};
@@ -3,7 +3,7 @@
3
3
  * See LICENSE.md in the project root for license information.
4
4
  * Copyright (c) 2013-2026 Valerii Chupurnov. All rights reserved. https://xdsoft.net/jodit/pro/
5
5
  */
6
- import type { IBound } from "jodit/esm/types/index";
6
+ import type { IBound, ModType } from "jodit/esm/types/index";
7
7
  import type { IFileBrowserItemElement } from "jodit/esm/types/file-browser";
8
8
  import { UIGroup } from "jodit/esm/core/ui/group/group";
9
9
  import type { StateManager } from "../../helpers/state-manager";
@@ -21,6 +21,16 @@ export declare class UIVirtualScroll extends UIGroup<IFileBrowserPro> implements
21
21
  protected render(): string;
22
22
  constructor(jodit: UIVirtualScroll['jodit'], stateManager: StateManager);
23
23
  private reconcile;
24
+ private skeletons;
25
+ /**
26
+ * Skeleton placeholders are driven purely by the `loading` mod (set on the
27
+ * panel and synced down to this group) — no imperative show/hide from
28
+ * outside. They reuse the real item class and carry the current `view`/`size`
29
+ * mods, so they adapt to the active tile mode.
30
+ */
31
+ afterSetMod(name: string, value: ModType): void;
32
+ private buildSkeletons;
33
+ private clearSkeletons;
24
34
  build(items: IFileBrowserItemElement[]): void;
25
35
  protected onScrollLoadChunk(): void;
26
36
  protected onDragOver(e: DragEvent): void;
@@ -1,5 +1,5 @@
1
- var m=Object.defineProperty;var p=(l,e)=>m(l,"name",{value:e,configurable:!0});var n,h=function(l,e,t,o){var r=arguments.length,s=r<3?e:o===null?o=Object.getOwnPropertyDescriptor(e,t):o,c;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(l,e,t,o);else for(var d=l.length-1;d>=0;d--)(c=l[d])&&(s=(r<3?c(s):r>3?c(e,t,s):c(e,t))||s);return r>3&&s&&Object.defineProperty(e,t,s),s},f;import{component as u,throttle as v,watch as a}from"jodit/esm/core/decorators/index.js";import{position as g}from"jodit/esm/core/helpers/size/position.js";import{UIGroup as I}from"jodit/esm/core/ui/group/group.js";import{FileBrowserItem as _}from"jodit/esm/modules/file-browser/builders/item.js";import{UIBrowserItem as y}from"../item/item.js";import{UISelectItems as M}from"../../../../traits/select-items/select-items.js";let i=f=(n=class extends I{className(){return"UIVirtualScroll"}render(){return`<div>
1
+ var m=Object.defineProperty;var u=(l,e)=>m(l,"name",{value:e,configurable:!0});var n,h=function(l,e,t,s){var i=arguments.length,o=i<3?e:s===null?s=Object.getOwnPropertyDescriptor(e,t):s,c;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(l,e,t,s);else for(var d=l.length-1;d>=0;d--)(c=l[d])&&(o=(i<3?c(o):i>3?c(e,t,o):c(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o},f;import{component as p,throttle as v,watch as a}from"jodit/esm/core/decorators/index.js";import{position as g}from"jodit/esm/core/helpers/size/position.js";import{UIGroup as _}from"jodit/esm/core/ui/group/group.js";import{FileBrowserItem as I}from"jodit/esm/modules/file-browser/builders/item.js";import{UIBrowserItem as S}from"../item/item.js";import{UISelectItems as w}from"../../../../traits/select-items/select-items.js";let r=f=(n=class extends _{className(){return"UIVirtualScroll"}render(){return`<div>
2
2
  <div class="&__empty-message">~There are no files~</div>
3
3
  <div class='&__loader'></div>
4
4
  <div class='&__drag-area'>~Drop image~</div>
5
- </div>`}constructor(e,t){super(e),this.stateManager=t,this.syncMod=!0,this.addItemsSelector()}reconcile(e){const t=this.elements.findIndex((o,r)=>!e[r]||o.item.uniqueHashKey!==_.create(e[r]).uniqueHashKey);if(t>-1){for(let o=t;o<this.elements.length;o+=1)this.elements[o].destruct();this.elements.length=t}return t}build(e){const t=this.reconcile(e);e.slice(t>-1?t:this.elements.length).forEach(o=>{const r=new y(this.jodit,o);Object.keys(this.mods).forEach(s=>{r.setMod(s,this.mods[s])}),this.append(r)}),this.setMod("empty",!this.elements.length)}onScrollLoadChunk(){!this.stateManager.isFavoriteItems&&this.container.scrollHeight-(this.container.scrollTop+this.container.offsetHeight)<this.j.o.pixelOffsetLoadNewChunk&&this.j.loadingManager.loadItemsChunk()}onDragOver(e){e.preventDefault(),this.setMod("dragover",!0)}onDragLeave(e){e.preventDefault(),this.setMod("dragover",!1)}addItemsSelector(){M.install(this)}static intersectRect(e,t){return!(t.left>e.left+e.width||t.left+t.width<e.left||t.top>e.top+e.height||t.top+t.height<e.top)}onSelectItems(e){const t=[];this.elements.forEach(o=>{const r=g(o.container);f.intersectRect(r,e)&&t.push(o.item)}),this.stateManager.state.activeElements=t}},p(n,"UIVirtualScroll"),n);h([a(":afterResize"),a(":resize"),a("container:scroll"),v()],i.prototype,"onScrollLoadChunk",null),h([a("container:dragover")],i.prototype,"onDragOver",null),h([a(["container:dragleave","container:drop"])],i.prototype,"onDragLeave",null),i=f=h([u],i);export{i as UIVirtualScroll};
5
+ </div>`}constructor(e,t){super(e),this.stateManager=t,this.syncMod=!0,this.skeletons=[],this.addItemsSelector()}reconcile(e){const t=this.elements.findIndex((s,i)=>!e[i]||s.item.uniqueHashKey!==I.create(e[i]).uniqueHashKey);if(t>-1){for(let s=t;s<this.elements.length;s+=1)this.elements[s].destruct();this.elements.length=t}return t}afterSetMod(e,t){super.afterSetMod(e,t),e==="loading"&&(t?this.buildSkeletons():this.clearSkeletons())}buildSkeletons(e=24){if(!this.skeletons.length)for(let t=0;t<e;t+=1){const s=this.j.create.fromHTML('<div class="jodit-ui-browser-item jodit-ui-browser-item_skeleton_true"><div class="jodit-ui-browser-item__image"></div><div class="jodit-ui-browser-item__info"></div></div>');["view","size"].forEach(i=>{const o=this.mods[i];o&&s.classList.add(`jodit-ui-browser-item_${i}_${o}`)}),this.container.appendChild(s),this.skeletons.push(s)}}clearSkeletons(){this.skeletons.forEach(e=>e.remove()),this.skeletons.length=0}build(e){const t=this.reconcile(e);e.slice(t>-1?t:this.elements.length).forEach(s=>{const i=new S(this.jodit,s);Object.keys(this.mods).forEach(o=>{i.setMod(o,this.mods[o])}),this.append(i)}),this.setMod("empty",!this.elements.length)}onScrollLoadChunk(){!this.stateManager.isFavoriteItems&&this.container.scrollHeight-(this.container.scrollTop+this.container.offsetHeight)<this.j.o.pixelOffsetLoadNewChunk&&this.j.loadingManager.loadItemsChunk()}onDragOver(e){e.preventDefault(),this.setMod("dragover",!0)}onDragLeave(e){e.preventDefault(),this.setMod("dragover",!1)}addItemsSelector(){w.install(this)}static intersectRect(e,t){return!(t.left>e.left+e.width||t.left+t.width<e.left||t.top>e.top+e.height||t.top+t.height<e.top)}onSelectItems(e){const t=[];this.elements.forEach(s=>{const i=g(s.container);f.intersectRect(i,e)&&t.push(s.item)}),this.stateManager.state.activeElements=t}},u(n,"UIVirtualScroll"),n);h([a(":afterResize"),a(":resize"),a("container:scroll"),v()],r.prototype,"onScrollLoadChunk",null),h([a("container:dragover")],r.prototype,"onDragOver",null),h([a(["container:dragleave","container:drop"])],r.prototype,"onDragLeave",null),r=f=h([p],r);export{r as UIVirtualScroll};
@@ -0,0 +1,98 @@
1
+ /*!
2
+ * Jodit Editor PRO (https://xdsoft.net/jodit/)
3
+ * See LICENSE.md in the project root for license information.
4
+ * Copyright (c) 2013-2026 Valerii Chupurnov. All rights reserved. https://xdsoft.net/jodit/pro/
5
+ */
6
+ import type { IFileBrowser } from "jodit/esm/types/index";
7
+ import { ViewComponent } from "jodit/esm/core/component/index";
8
+ /**
9
+ * The `save` callback the core `openImageEditor` passes to `open()`. It routes
10
+ * `(newname, box)` to the connector's resize/crop, then fires `success()` and
11
+ * (for in-content edits) an `onSuccess(newUrl)` that swaps the `<img>`.
12
+ *
13
+ * `action: 'saved'` (jodit ≥ 4.12.34) tells the core the file was already
14
+ * persisted by this editor: it skips the server resize/crop and only runs the
15
+ * success wiring with `newPath`.
16
+ */
17
+ interface ImageEditorSave {
18
+ (newname: string | void, box: {
19
+ action: 'resize' | 'crop' | 'saved';
20
+ box: {
21
+ w: number;
22
+ h: number;
23
+ };
24
+ newPath?: string;
25
+ }, success: () => void, failed: (error: Error) => void): void;
26
+ }
27
+ /**
28
+ * The view that instantiates the editor: a file browser (finder pencil / Image
29
+ * properties → Edit). `IFileBrowser` already combines `IViewWithToolbar`,
30
+ * `IDlgs` and `dataProvider`; using the named interface (not an ad-hoc `&`
31
+ * intersection) keeps `tsc` from over-instantiating the deep view types.
32
+ */
33
+ type HostView = IFileBrowser;
34
+ /**
35
+ * PRO replacement for Jodit's core image editor, backed by the standalone
36
+ * `@jodit/image-editor` package (crop, resize, rotate, flip, filters, finetune,
37
+ * text annotations).
38
+ *
39
+ * It is registered as `Jodit.modules.ImageEditor`, so **every** path that opens
40
+ * the image editor — the finder pencil, Image properties → Edit, a direct
41
+ * `getInstance('ImageEditor')` — instantiates it via `getInstance`'s module
42
+ * fallback (the event fires on the *file browser's* emitter, which is why an
43
+ * `jodit.e` listener never worked).
44
+ *
45
+ * `@jodit/image-editor` is bundled as a dependency (it is part of the PRO
46
+ * editor), so the class is imported directly.
47
+ *
48
+ * The core editor speaks a server "resize/crop the original file" language; this
49
+ * one produces a fully edited `Blob`. So on save it uploads the blob through the
50
+ * connector's `imageSave` action (overwriting the source file), then reports
51
+ * `action: 'saved'` to the core's save callback — which skips the server
52
+ * resize/crop and runs only the `success`/`onSuccess` machinery, reusing
53
+ * finder's refresh and image-properties' `<img>` swap without reimplementing
54
+ * either.
55
+ */
56
+ export declare class ProImageEditor extends ViewComponent<HostView> {
57
+ /** Marker for callers/tests. */
58
+ readonly isProImageEditor = true;
59
+ className(): string;
60
+ open(url: string, save: ImageEditorSave): Promise<void>;
61
+ /**
62
+ * Rebuilds the editor's top bar as a native Jodit toolbar in the dialog
63
+ * header — Save / Save as, dimensions, zoom, reset / undo / redo — driven by
64
+ * the `@jodit/image-editor` public API (`save()`, `saveAs()`, `update(...)`)
65
+ * and kept in sync by subscribing to the editor store. Returns a disposer.
66
+ */
67
+ private mountToolbar;
68
+ /**
69
+ * "Save as" — prompt for a new file name, then persist the edited blob under
70
+ * it (mirrors the core editor's Save-as UX and its `onSave(name, …)` call).
71
+ */
72
+ private saveAs;
73
+ /**
74
+ * Persists the edited blob. With `newName` it writes a new file ("Save as");
75
+ * without it, it overwrites the source ("Save"). Either way it then reuses
76
+ * the core's `save()` success/onSuccess wiring (finder refresh, in-content
77
+ * `<img>` swap) with a no-op resize of the resulting file.
78
+ */
79
+ private persist;
80
+ /**
81
+ * Uploads the edited blob through the connector's `imageSave` action and
82
+ * returns the saved file's new path (`''` for older connectors that don't
83
+ * report it).
84
+ */
85
+ private uploadEdited;
86
+ /**
87
+ * `ImageEditorActionBox.action: 'saved'` appeared in jodit 4.12.34 — an
88
+ * older core routes unknown actions into a server crop, which fails the
89
+ * save. Detected from the host view's version.
90
+ */
91
+ private coreSupportsSaved;
92
+ private connectorUrl;
93
+ private loadImage;
94
+ private loadViaConnector;
95
+ private blobSize;
96
+ private error;
97
+ }
98
+ export {};
@@ -0,0 +1 @@
1
+ var T=Object.defineProperty;var h=(P,n)=>T(P,"name",{value:n,configurable:!0});import{ICONS as $,ImageEditor as F,selectors as b}from"@jodit/image-editor";import{Config as O}from"jodit/esm/config.js";import{ViewComponent as B}from"jodit/esm/core/component/index.js";import{Button as v}from"jodit/esm/core/ui/button/button/button.js";import{Dialog as D}from"jodit/esm/modules/dialog/dialog.js";const j=class j extends B{constructor(){super(...arguments),this.isProImageEditor=!0}className(){return"ImageEditorPro"}async open(n,o){const t=this.j,s=O.defaultOptions.imageEditorPro,i=t.c.div("jodit-image-editor-pro");i.style.width="100%",i.style.height="100%";const r=new D({language:t.o.language});r.setSize(s.dialog.width,s.dialog.height),r.setContent(i),r.open();let e=null,c=null;const d=h(()=>{c?.(),c=null,e?.destroy(),e=null,r.close()},"cleanup");r.e.on("beforeClose",()=>{c?.(),c=null,e?.destroy(),e=null}),e=new F({container:i,state:{showToolbar:!1,status:"loading"},onSave:h(a=>{this.persist(e,n,void 0,a,o,d)},"onSave"),onSaveAs:h(a=>{this.saveAs(e,n,a,o,d)},"onSaveAs")}),c=this.mountToolbar(r,e);try{const a=await this.loadImage(n);await e.fromBlob(a)}catch(a){e?.update({status:"error",error:a instanceof Error?a.message:String(a)}),this.error(a)}}mountToolbar(n,o){const t=this.j,s=v(t,{icon:{name:"save"},text:t.i18n("Save")},"primary"),i=v(t,{icon:{name:"save"},name:"save-as",text:t.i18n("Save as")}),r=t.c.span("jodit-image-editor-pro__size"),e=v(t,$.minus),c=t.c.span("jodit-image-editor-pro__zoom"),d=v(t,$.plus),a=v(t,"update",t.i18n("Reset")),p=v(t,"undo",t.i18n("Undo")),f=v(t,"redo",t.i18n("Redo"));e.setState({tooltip:"Zoom out"}),d.setState({tooltip:"Zoom in"});let w=null;s.onAction(()=>{w=s,o.save()}),i.onAction(()=>{w=i,o.saveAs()}),e.onAction(()=>o.update({zoom:o.state.zoom/1.2})),d.onAction(()=>o.update({zoom:o.state.zoom*1.2})),a.onAction(()=>o.reset()),p.onAction(()=>o.update({history:{step:-1}})),f.onAction(()=>o.update({history:{step:1}}));const g=h((...l)=>{const u=t.c.div("jodit-image-editor-pro__group");return u.style.display="flex",u.style.alignItems="center",u.style.gap="4px",l.forEach(y=>u.appendChild(y)),u},"group"),m=t.c.div("jodit-image-editor-pro__toolbar");m.style.display="flex",m.style.alignItems="center",m.style.gap="12px",m.style.width="100%",r.style.opacity="0.75",c.style.minWidth="3.5em",c.style.textAlign="center",m.appendChild(g(s.container,i.container)),m.appendChild(g(r,e.container,c,d.container));const x=g(a.container,p.container,f.container);x.style.marginLeft="auto",m.appendChild(x),n.setHeader(m);const z="jodit-image-editor-pro__button_busy",_=h(l=>{const u=b.selectOutputSize(l),y=l.status==="exporting",C=y||l.status==="loading",S=l.busyVisible,A=y&&(S??!0);y||(w=null),s.setState({disabled:!l.source||C}),i.setState({disabled:!l.source||C}),s.container.classList.toggle(z,A&&w!==i),i.container.classList.toggle(z,A&&w===i),a.setState({disabled:!b.selectIsDirty(l)}),p.setState({disabled:!b.selectCanUndo(l)}),f.setState({disabled:!b.selectCanRedo(l)}),r.textContent=u?`${u.width} \xD7 ${u.height}`:"";const E=b.selectViewportFit(l),V=Math.round(E?E.scale*100:l.zoom*100);c.textContent=`${V}%`},"sync");_(o.state);const U=o.store.subscribe(_);return()=>{U(),[s,i,e,d,a,p,f].forEach(l=>l.destruct())}}saveAs(n,o,t,s,i){this.j.prompt("Enter new name","Save in new file",r=>{const e=(r||"").trim();if(!e)return this.j.alert("The name should not be empty"),!1;this.persist(n,o,e,t,s,i)})}async persist(n,o,t,s,i,r){n?.update({status:"exporting"});try{const{w:e,h:c}=await this.blobSize(s),d=await this.uploadEdited(o,s,t),a=h(()=>{r(),this.j.e.fire("update.filebrowser")},"done");i(t,this.coreSupportsSaved()?{action:"saved",box:{w:e,h:c},newPath:d||void 0}:{action:"resize",box:{w:e,h:c}},a,p=>{r(),this.error(p)})}catch(e){r(),this.error(e)}}async uploadEdited(n,o,t){var s,i;const{source:r,path:e,name:c}=await this.j.dataProvider.getPathByUrl(n),d=this.connectorUrl();if(!d)throw new Error("No connector configured for imageSave");const a=String(t||c||"image.png"),p=new FormData;p.append("action","imageSave"),p.append("source",String(r??"")),p.append("path",String(e??"")),p.append("name",a),p.append("files[0]",o,a);const f=d.includes("?")?"&":"?",g=await(await fetch(`${d}${f}action=imageSave`,{method:"POST",body:p,credentials:"include"})).json();if(!g.success)throw new Error(g.message||"Failed to save the edited image");return(i=(s=g.data)===null||s===void 0?void 0:s.newPath)!==null&&i!==void 0?i:""}coreSupportsSaved(){const n=this.j.getVersion?this.j.getVersion():"",[o=0,t=0,s=0]=n.split(".").map(i=>parseInt(i,10)||0);return o>4||o===4&&(t>12||t===12&&s>=34)}connectorUrl(){var n,o;const t=(n=this.j.o.ajax)===null||n===void 0?void 0:n.url,s=(o=this.j.o.uploader)===null||o===void 0?void 0:o.url;return typeof t=="string"&&t?t:typeof s=="string"&&s?s:""}async loadImage(n){const o=this.connectorUrl();if(o)try{return await this.loadViaConnector(o,n)}catch{}const t=n.includes("?")?"&":"?",s=await fetch(`${n}${t}_tst=${Date.now()}`,{credentials:"include"});if(!s.ok)throw new Error(`Failed to load image (${s.status})`);return s.blob()}async loadViaConnector(n,o){var t;const{source:s,path:i,name:r}=await this.j.dataProvider.getPathByUrl(o),e=new FormData;e.append("action","imageLoad"),e.append("source",String(s??"")),e.append("path",String(i??"")),e.append("name",String(r??""));const c=n.includes("?")?"&":"?",a=await(await fetch(`${n}${c}action=imageLoad`,{method:"POST",body:e,credentials:"include"})).json();if(!a.success||!(!((t=a.data)===null||t===void 0)&&t.content))throw new Error(a.message||"Failed to load the image");return(await fetch(a.data.content)).blob()}async blobSize(n){const o=await createImageBitmap(n),t={w:o.width,h:o.height};return o.close(),t}error(n){this.j.e.fire("errorMessage",n.message)}};h(j,"ProImageEditor");let I=j;export{I as ProImageEditor};
@@ -0,0 +1,17 @@
1
+ /*!
2
+ * Jodit Editor PRO (https://xdsoft.net/jodit/)
3
+ * See LICENSE.md in the project root for license information.
4
+ * Copyright (c) 2013-2026 Valerii Chupurnov. All rights reserved. https://xdsoft.net/jodit/pro/
5
+ */
6
+ declare module 'jodit/esm/config' {
7
+ interface Config {
8
+ imageEditorPro: {
9
+ /** Editor dialog size. */
10
+ dialog: {
11
+ width: number | string;
12
+ height: number | string;
13
+ };
14
+ };
15
+ }
16
+ }
17
+ export {};
@@ -0,0 +1 @@
1
+ import{Config as o}from"jodit/esm/config.js";o.prototype.imageEditorPro={dialog:{width:"90%",height:"90%"}};
@@ -0,0 +1,26 @@
1
+ /*!
2
+ * Jodit Editor PRO (https://xdsoft.net/jodit/)
3
+ * See LICENSE.md in the project root for license information.
4
+ * Copyright (c) 2013-2026 Valerii Chupurnov. All rights reserved. https://xdsoft.net/jodit/pro/
5
+ */
6
+ import type { IJodit } from "jodit/esm/types/index";
7
+ import "./config";
8
+ import { Plugin } from "jodit/esm/core/plugin/index";
9
+ /**
10
+ * Replaces Jodit's core image editor with the standalone `@jodit/image-editor`
11
+ * (crop, resize, rotate, flip, filters, finetune, text annotations).
12
+ *
13
+ * The replacement is done at the module registry level — `Jodit.modules.ImageEditor`
14
+ * — because the editor is instantiated via `getInstance('ImageEditor')` on the
15
+ * **file browser's** own event emitter (the finder pencil, Image properties →
16
+ * Edit), not on `jodit.e`. Overriding the module makes every entry point resolve
17
+ * to {@link ProImageEditor} through `getInstance`'s fallback.
18
+ */
19
+ export declare class imageEditorPro extends Plugin {
20
+ /** @override */
21
+ static requires: string[];
22
+ /** @override */
23
+ protected afterInit(_jodit: IJodit): void;
24
+ /** @override */
25
+ protected beforeDestruct(_jodit: IJodit): void;
26
+ }
@@ -0,0 +1 @@
1
+ var m=Object.defineProperty;var e=(d,r)=>m(d,"name",{value:r,configurable:!0});import"./config.js";import{ProImageEditor as s}from"./adapter.js";import{Plugin as p}from"jodit/esm/core/plugin/index.js";import{JoditPro as i}from"../../jodit-pro.js";const t=class t extends p{afterInit(r){i.modules.ImageEditor=s}beforeDestruct(r){}};e(t,"imageEditorPro");let o=t;o.requires=["license"],i.plugins.add("imageEditorPro",o);export{o as imageEditorPro};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jodit-pro",
3
- "version": "4.12.39",
3
+ "version": "4.13.1",
4
4
  "author": "Chupurnov Valerii <chupurnov@gmail.com>",
5
5
  "homepage": "https://xdsoft.net/jodit/pro/",
6
6
  "bugs": {
@@ -15,6 +15,7 @@
15
15
  "url": "git+https://github.com/jodit/jodit-pro.git"
16
16
  },
17
17
  "dependencies": {
18
+ "@jodit/image-editor": "^0.2.1",
18
19
  "a-color-picker": "^1.2.1",
19
20
  "marked": "^17.0.4",
20
21
  "jodit": "^4.0.1"
package/types/config.d.ts CHANGED
@@ -150,6 +150,15 @@ interface Config {
150
150
  schema: IDictionary<(jodit: IJodit, matches: RegExpMatchArray) => HTMLElement>;
151
151
  };
152
152
  }
153
+ interface Config {
154
+ imageEditorPro: {
155
+ /** Editor dialog size. */
156
+ dialog: {
157
+ width: number | string;
158
+ height: number | string;
159
+ };
160
+ };
161
+ }
153
162
  interface Config {
154
163
  keyboard: {
155
164
  keySize: number;
@@ -3,7 +3,7 @@
3
3
  * See LICENSE.md in the project root for license information.
4
4
  * Copyright (c) 2013-2026 Valerii Chupurnov. All rights reserved. https://xdsoft.net/jodit/pro/
5
5
  */
6
- import type { CanUndef, IFileBrowserCallBackData, IFileBrowserDataProvider, IFileBrowserItemWrapper, IProgressBar, IUIGroup } from "jodit/esm/types/index";
6
+ import type { CanUndef, IFileBrowserAnswer, IFileBrowserCallBackData, IFileBrowserDataProvider, IFileBrowserItemWrapper, IProgressBar, IUIGroup } from "jodit/esm/types/index";
7
7
  import "./ui/assets/icons/index";
8
8
  import { ContextMenuManager } from "./helpers/context-menu";
9
9
  import { LoadingManager } from "./helpers/loading-manager";
@@ -30,6 +30,15 @@ export declare class FileBrowserPro extends Dialog implements IFileBrowserPro {
30
30
  lock(name?: string): boolean;
31
31
  unlock(): boolean;
32
32
  status(message: string | Error, success?: boolean): void;
33
+ /**
34
+ * Upload error handler bound to the uploader. The uploader calls it with
35
+ * either an `Error` or the raw connector answer. `status` alone only
36
+ * understands string/Error, so a raw answer — whose text lives in
37
+ * `data.messages`, not `.message` — was silently dropped and the user saw
38
+ * no error. Mirror the core file-browser: pull the message out of the
39
+ * answer via the data provider and show it as an error.
40
+ */
41
+ errorHandler(resp: Error | IFileBrowserAnswer): void;
33
42
  private header;
34
43
  panel: UIBrowserPanel;
35
44
  files: IUIGroup;
@@ -3,7 +3,7 @@
3
3
  * See LICENSE.md in the project root for license information.
4
4
  * Copyright (c) 2013-2026 Valerii Chupurnov. All rights reserved. https://xdsoft.net/jodit/pro/
5
5
  */
6
- import type { IBound } from "jodit/esm/types/index";
6
+ import type { IBound, ModType } from "jodit/esm/types/index";
7
7
  import type { IFileBrowserItemElement } from "jodit/esm/types/file-browser";
8
8
  import { UIGroup } from "jodit/esm/core/ui/group/group";
9
9
  import type { StateManager } from "../../helpers/state-manager";
@@ -21,6 +21,16 @@ export declare class UIVirtualScroll extends UIGroup<IFileBrowserPro> implements
21
21
  protected render(): string;
22
22
  constructor(jodit: UIVirtualScroll['jodit'], stateManager: StateManager);
23
23
  private reconcile;
24
+ private skeletons;
25
+ /**
26
+ * Skeleton placeholders are driven purely by the `loading` mod (set on the
27
+ * panel and synced down to this group) — no imperative show/hide from
28
+ * outside. They reuse the real item class and carry the current `view`/`size`
29
+ * mods, so they adapt to the active tile mode.
30
+ */
31
+ afterSetMod(name: string, value: ModType): void;
32
+ private buildSkeletons;
33
+ private clearSkeletons;
24
34
  build(items: IFileBrowserItemElement[]): void;
25
35
  protected onScrollLoadChunk(): void;
26
36
  protected onDragOver(e: DragEvent): void;
@@ -0,0 +1,98 @@
1
+ /*!
2
+ * Jodit Editor PRO (https://xdsoft.net/jodit/)
3
+ * See LICENSE.md in the project root for license information.
4
+ * Copyright (c) 2013-2026 Valerii Chupurnov. All rights reserved. https://xdsoft.net/jodit/pro/
5
+ */
6
+ import type { IFileBrowser } from "jodit/esm/types/index";
7
+ import { ViewComponent } from "jodit/esm/core/component/index";
8
+ /**
9
+ * The `save` callback the core `openImageEditor` passes to `open()`. It routes
10
+ * `(newname, box)` to the connector's resize/crop, then fires `success()` and
11
+ * (for in-content edits) an `onSuccess(newUrl)` that swaps the `<img>`.
12
+ *
13
+ * `action: 'saved'` (jodit ≥ 4.12.34) tells the core the file was already
14
+ * persisted by this editor: it skips the server resize/crop and only runs the
15
+ * success wiring with `newPath`.
16
+ */
17
+ interface ImageEditorSave {
18
+ (newname: string | void, box: {
19
+ action: 'resize' | 'crop' | 'saved';
20
+ box: {
21
+ w: number;
22
+ h: number;
23
+ };
24
+ newPath?: string;
25
+ }, success: () => void, failed: (error: Error) => void): void;
26
+ }
27
+ /**
28
+ * The view that instantiates the editor: a file browser (finder pencil / Image
29
+ * properties → Edit). `IFileBrowser` already combines `IViewWithToolbar`,
30
+ * `IDlgs` and `dataProvider`; using the named interface (not an ad-hoc `&`
31
+ * intersection) keeps `tsc` from over-instantiating the deep view types.
32
+ */
33
+ type HostView = IFileBrowser;
34
+ /**
35
+ * PRO replacement for Jodit's core image editor, backed by the standalone
36
+ * `@jodit/image-editor` package (crop, resize, rotate, flip, filters, finetune,
37
+ * text annotations).
38
+ *
39
+ * It is registered as `Jodit.modules.ImageEditor`, so **every** path that opens
40
+ * the image editor — the finder pencil, Image properties → Edit, a direct
41
+ * `getInstance('ImageEditor')` — instantiates it via `getInstance`'s module
42
+ * fallback (the event fires on the *file browser's* emitter, which is why an
43
+ * `jodit.e` listener never worked).
44
+ *
45
+ * `@jodit/image-editor` is bundled as a dependency (it is part of the PRO
46
+ * editor), so the class is imported directly.
47
+ *
48
+ * The core editor speaks a server "resize/crop the original file" language; this
49
+ * one produces a fully edited `Blob`. So on save it uploads the blob through the
50
+ * connector's `imageSave` action (overwriting the source file), then reports
51
+ * `action: 'saved'` to the core's save callback — which skips the server
52
+ * resize/crop and runs only the `success`/`onSuccess` machinery, reusing
53
+ * finder's refresh and image-properties' `<img>` swap without reimplementing
54
+ * either.
55
+ */
56
+ export declare class ProImageEditor extends ViewComponent<HostView> {
57
+ /** Marker for callers/tests. */
58
+ readonly isProImageEditor = true;
59
+ className(): string;
60
+ open(url: string, save: ImageEditorSave): Promise<void>;
61
+ /**
62
+ * Rebuilds the editor's top bar as a native Jodit toolbar in the dialog
63
+ * header — Save / Save as, dimensions, zoom, reset / undo / redo — driven by
64
+ * the `@jodit/image-editor` public API (`save()`, `saveAs()`, `update(...)`)
65
+ * and kept in sync by subscribing to the editor store. Returns a disposer.
66
+ */
67
+ private mountToolbar;
68
+ /**
69
+ * "Save as" — prompt for a new file name, then persist the edited blob under
70
+ * it (mirrors the core editor's Save-as UX and its `onSave(name, …)` call).
71
+ */
72
+ private saveAs;
73
+ /**
74
+ * Persists the edited blob. With `newName` it writes a new file ("Save as");
75
+ * without it, it overwrites the source ("Save"). Either way it then reuses
76
+ * the core's `save()` success/onSuccess wiring (finder refresh, in-content
77
+ * `<img>` swap) with a no-op resize of the resulting file.
78
+ */
79
+ private persist;
80
+ /**
81
+ * Uploads the edited blob through the connector's `imageSave` action and
82
+ * returns the saved file's new path (`''` for older connectors that don't
83
+ * report it).
84
+ */
85
+ private uploadEdited;
86
+ /**
87
+ * `ImageEditorActionBox.action: 'saved'` appeared in jodit 4.12.34 — an
88
+ * older core routes unknown actions into a server crop, which fails the
89
+ * save. Detected from the host view's version.
90
+ */
91
+ private coreSupportsSaved;
92
+ private connectorUrl;
93
+ private loadImage;
94
+ private loadViaConnector;
95
+ private blobSize;
96
+ private error;
97
+ }
98
+ export {};
@@ -0,0 +1,17 @@
1
+ /*!
2
+ * Jodit Editor PRO (https://xdsoft.net/jodit/)
3
+ * See LICENSE.md in the project root for license information.
4
+ * Copyright (c) 2013-2026 Valerii Chupurnov. All rights reserved. https://xdsoft.net/jodit/pro/
5
+ */
6
+ declare module 'jodit/esm/config' {
7
+ interface Config {
8
+ imageEditorPro: {
9
+ /** Editor dialog size. */
10
+ dialog: {
11
+ width: number | string;
12
+ height: number | string;
13
+ };
14
+ };
15
+ }
16
+ }
17
+ export {};
@@ -0,0 +1,26 @@
1
+ /*!
2
+ * Jodit Editor PRO (https://xdsoft.net/jodit/)
3
+ * See LICENSE.md in the project root for license information.
4
+ * Copyright (c) 2013-2026 Valerii Chupurnov. All rights reserved. https://xdsoft.net/jodit/pro/
5
+ */
6
+ import type { IJodit } from "jodit/esm/types/index";
7
+ import "./config";
8
+ import { Plugin } from "jodit/esm/core/plugin/index";
9
+ /**
10
+ * Replaces Jodit's core image editor with the standalone `@jodit/image-editor`
11
+ * (crop, resize, rotate, flip, filters, finetune, text annotations).
12
+ *
13
+ * The replacement is done at the module registry level — `Jodit.modules.ImageEditor`
14
+ * — because the editor is instantiated via `getInstance('ImageEditor')` on the
15
+ * **file browser's** own event emitter (the finder pencil, Image properties →
16
+ * Edit), not on `jodit.e`. Overriding the module makes every entry point resolve
17
+ * to {@link ProImageEditor} through `getInstance`'s fallback.
18
+ */
19
+ export declare class imageEditorPro extends Plugin {
20
+ /** @override */
21
+ static requires: string[];
22
+ /** @override */
23
+ protected afterInit(_jodit: IJodit): void;
24
+ /** @override */
25
+ protected beforeDestruct(_jodit: IJodit): void;
26
+ }